From a1e061fa148a4e41902b4199546ef799e7d7aa52 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Fri, 4 Nov 2022 15:03:22 -0700 Subject: [PATCH] Add suffix widget non-rounding; add disabled state to many widgets --- .../export_dialog_message_handler.rs | 1 + .../utility_types/widgets/assist_widgets.rs | 2 + .../utility_types/widgets/button_widgets.rs | 7 ++- .../utility_types/widgets/input_widgets.rs | 2 + .../utility_types/widgets/label_widgets.rs | 4 ++ .../document/document_message_handler.rs | 1 + .../properties_panel/utility_functions.rs | 10 ++++ .../tool/tool_messages/gradient_tool.rs | 1 + .../tool/tool_messages/select_tool.rs | 1 + editor/src/messages/tool/utility_types.rs | 3 +- frontend/src/App.vue | 5 ++ .../src/components/widgets/WidgetLayout.vue | 8 +-- frontend/src/components/widgets/WidgetRow.vue | 60 +++++++++++++++---- .../widgets/assists/PivotAssist.vue | 46 ++++++++------ .../components/widgets/buttons/IconButton.vue | 36 +++++++---- .../widgets/buttons/PopoverButton.vue | 8 ++- .../components/widgets/buttons/TextButton.vue | 3 +- .../components/widgets/inputs/ColorInput.vue | 13 +++- .../widgets/inputs/DropdownInput.vue | 3 +- .../components/widgets/inputs/FieldInput.vue | 3 +- .../components/widgets/inputs/FontInput.vue | 5 +- .../components/widgets/inputs/NumberInput.vue | 2 + .../components/widgets/inputs/RadioInput.vue | 25 +++++++- .../components/widgets/inputs/TextInput.vue | 2 + .../components/widgets/labels/IconLabel.vue | 7 ++- .../components/widgets/labels/TextLabel.vue | 7 ++- frontend/src/io-managers/panic.ts | 4 +- frontend/src/wasm-communication/messages.ts | 12 ++++ 28 files changed, 218 insertions(+), 63 deletions(-) diff --git a/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs b/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs index e5019cbd..8650fdbe 100644 --- a/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs +++ b/editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs @@ -85,6 +85,7 @@ impl PropertyHolder for ExportDialogMessageHandler { WidgetHolder::new(Widget::RadioInput(RadioInput { selected_index: self.file_type as u32, entries, + ..Default::default() })), ]; diff --git a/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs b/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs index 30a38cfd..9da6279f 100644 --- a/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs @@ -9,6 +9,8 @@ use serde::{Deserialize, Serialize}; pub struct PivotAssist { pub position: PivotPosition, + pub disabled: bool, + // Callbacks #[serde(skip)] #[derivative(Debug = "ignore", PartialEq = "ignore")] diff --git a/editor/src/messages/layout/utility_types/widgets/button_widgets.rs b/editor/src/messages/layout/utility_types/widgets/button_widgets.rs index 5322f774..86933a9e 100644 --- a/editor/src/messages/layout/utility_types/widgets/button_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/button_widgets.rs @@ -11,6 +11,8 @@ pub struct IconButton { pub size: u32, // TODO: Convert to an `IconSize` enum + pub disabled: bool, + pub active: bool, pub tooltip: String, @@ -29,9 +31,12 @@ pub struct IconButton { pub struct PopoverButton { pub icon: Option, - // Body + pub disabled: bool, + + // Placeholder popover content heading pub header: String, + // Placeholder popover content paragraph pub text: String, pub tooltip: String, diff --git a/editor/src/messages/layout/utility_types/widgets/input_widgets.rs b/editor/src/messages/layout/utility_types/widgets/input_widgets.rs index 24f1a627..b348ea8b 100644 --- a/editor/src/messages/layout/utility_types/widgets/input_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/input_widgets.rs @@ -238,6 +238,8 @@ pub struct OptionalInput { pub struct RadioInput { pub entries: Vec, + pub disabled: bool, + // This uses `u32` instead of `usize` since it will be serialized as a normal JS number (replace this with `usize` after switching to a Rust-based GUI) #[serde(rename = "selectedIndex")] pub selected_index: u32, diff --git a/editor/src/messages/layout/utility_types/widgets/label_widgets.rs b/editor/src/messages/layout/utility_types/widgets/label_widgets.rs index da08fa9b..1424196e 100644 --- a/editor/src/messages/layout/utility_types/widgets/label_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/label_widgets.rs @@ -5,6 +5,8 @@ use serde::{Deserialize, Serialize}; pub struct IconLabel { pub icon: String, + pub disabled: bool, + pub tooltip: String, } @@ -32,6 +34,8 @@ pub enum SeparatorType { #[derive(Clone, Serialize, Deserialize, Derivative, Debug, PartialEq, Eq, Default)] pub struct TextLabel { + pub disabled: bool, + pub bold: bool, pub italic: bool, diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 7fbcd5b4..2130b37d 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1564,6 +1564,7 @@ impl DocumentMessageHandler { ..RadioEntryData::default() }, ], + ..Default::default() })), WidgetHolder::new(Widget::PopoverButton(PopoverButton { header: "View Mode".into(), diff --git a/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs b/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs index 1f8cca79..50600e00 100644 --- a/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs +++ b/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs @@ -44,6 +44,7 @@ pub fn register_artboard_layer_properties(layer: &Layer, responses: &mut VecDequ WidgetHolder::new(Widget::IconLabel(IconLabel { icon: "NodeArtboard".into(), tooltip: "Artboard".into(), + ..Default::default() })), WidgetHolder::new(Widget::Separator(Separator { separator_type: SeparatorType::Related, @@ -226,22 +227,27 @@ pub fn register_artwork_layer_properties(layer: &Layer, responses: &mut VecDeque LayerDataType::Folder(_) => WidgetHolder::new(Widget::IconLabel(IconLabel { icon: "NodeFolder".into(), tooltip: "Folder".into(), + ..Default::default() })), LayerDataType::Shape(_) => WidgetHolder::new(Widget::IconLabel(IconLabel { icon: "NodeShape".into(), tooltip: "Shape".into(), + ..Default::default() })), LayerDataType::Text(_) => WidgetHolder::new(Widget::IconLabel(IconLabel { icon: "NodeText".into(), tooltip: "Text".into(), + ..Default::default() })), LayerDataType::Image(_) => WidgetHolder::new(Widget::IconLabel(IconLabel { icon: "NodeImage".into(), tooltip: "Image".into(), + ..Default::default() })), LayerDataType::Imaginate(_) => WidgetHolder::new(Widget::IconLabel(IconLabel { icon: "NodeImaginate".into(), tooltip: "Imaginate".into(), + ..Default::default() })), }, WidgetHolder::new(Widget::Separator(Separator { @@ -338,6 +344,7 @@ fn node_section_transform(layer: &Layer, persistent_data: &PersistentData) -> La WidgetHolder::new(Widget::PivotAssist(PivotAssist { position: layer.pivot.into(), on_update: WidgetCallback::new(|pivot_assist: &PivotAssist| PropertiesPanelMessage::SetPivot { new_position: pivot_assist.position }.into()), + ..Default::default() })), WidgetHolder::new(Widget::Separator(Separator { separator_type: SeparatorType::Unrelated, @@ -1152,6 +1159,7 @@ fn node_gradient_type(gradient: &Gradient) -> LayoutGroup { ..RadioEntryData::default() }, ], + ..Default::default() })), ], } @@ -1371,6 +1379,7 @@ fn node_section_stroke(stroke: &Stroke) -> LayoutGroup { ..RadioEntryData::default() }, ], + ..Default::default() })), ], }, @@ -1418,6 +1427,7 @@ fn node_section_stroke(stroke: &Stroke) -> LayoutGroup { ..RadioEntryData::default() }, ], + ..Default::default() })), ], }, diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index e3476ef8..2f4e7afa 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -129,6 +129,7 @@ impl PropertyHolder for GradientTool { ..RadioEntryData::default() }, ], + ..Default::default() }))], }])) } diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 60b88140..c8a27dc6 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -259,6 +259,7 @@ impl PropertyHolder for SelectTool { WidgetHolder::new(Widget::PivotAssist(PivotAssist { position: self.tool_data.pivot.to_pivot_position(), on_update: WidgetCallback::new(|pivot_assist: &PivotAssist| SelectToolMessage::SetPivot { position: pivot_assist.position }.into()), + ..Default::default() })), ], }])) diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index 179e9cfa..896b0ff4 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -183,9 +183,10 @@ impl PropertyHolder for ToolData { WidgetHolder::new(Widget::IconButton(IconButton { icon: icon_name, size: 32, + disabled: false, + active: self.active_tool_type == tool_type, tooltip: tooltip.clone(), tooltip_shortcut, - active: self.active_tool_type == tool_type, on_update: WidgetCallback::new(move |_| { if !tooltip.contains("Coming Soon") { ToolMessage::ActivateTool { tool_type }.into() diff --git a/frontend/src/App.vue b/frontend/src/App.vue index a4a4ae1f..d550bd53 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -99,6 +99,11 @@ img { display: block; } +.sharp-right-corners.sharp-right-corners.sharp-right-corners.sharp-right-corners { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + .layout-row, .layout-col { .scrollable-x, diff --git a/frontend/src/components/widgets/WidgetLayout.vue b/frontend/src/components/widgets/WidgetLayout.vue index 1ec5a576..5610548a 100644 --- a/frontend/src/components/widgets/WidgetLayout.vue +++ b/frontend/src/components/widgets/WidgetLayout.vue @@ -2,7 +2,7 @@ @@ -28,7 +28,7 @@ export default defineComponent({ layout: { type: Object as PropType, required: true }, }, methods: { - LayoutGroupType(layoutRow: LayoutGroup): unknown { + layoutGroupType(layoutRow: LayoutGroup): unknown { if (isWidgetColumn(layoutRow)) return WidgetRow; if (isWidgetRow(layoutRow)) return WidgetRow; if (isWidgetSection(layoutRow)) return WidgetSection; @@ -36,10 +36,6 @@ export default defineComponent({ throw new Error("Layout row type does not exist"); }, }, - data: () => ({ - isWidgetRow, - isWidgetSection, - }), components: { WidgetRow, WidgetSection, diff --git a/frontend/src/components/widgets/WidgetRow.vue b/frontend/src/components/widgets/WidgetRow.vue index 0c1ea1d6..292219d2 100644 --- a/frontend/src/components/widgets/WidgetRow.vue +++ b/frontend/src/components/widgets/WidgetRow.vue @@ -3,17 +3,30 @@