diff --git a/editor/src/messages/frontend/frontend_message.rs b/editor/src/messages/frontend/frontend_message.rs index be74152c5..91fd30862 100644 --- a/editor/src/messages/frontend/frontend_message.rs +++ b/editor/src/messages/frontend/frontend_message.rs @@ -1,5 +1,6 @@ use super::utility_types::{DocumentDetails, MouseCursorIcon, OpenDocument}; use crate::messages::app_window::app_window_message_handler::AppWindowPlatform; +use crate::messages::input_mapper::utility_types::misc::ActionShortcut; use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::node_graph::utility_types::{ BoxSelection, ContextMenuInformation, FrontendClickTargets, FrontendGraphInput, FrontendGraphOutput, FrontendNode, FrontendNodeType, NodeGraphErrorDiagnostic, Transform, @@ -58,6 +59,12 @@ pub enum FrontendMessage { #[serde(rename = "nodeTypes")] node_types: Vec, }, + SendShortcutF11 { + shortcut: Option, + }, + SendShortcutAltClick { + shortcut: Option, + }, // Trigger prefix: cause a browser API to do something TriggerAboutGraphiteLocalizedCommitDate { diff --git a/editor/src/messages/input_mapper/utility_types/misc.rs b/editor/src/messages/input_mapper/utility_types/misc.rs index 75343e0a7..1f8be1056 100644 --- a/editor/src/messages/input_mapper/utility_types/misc.rs +++ b/editor/src/messages/input_mapper/utility_types/misc.rs @@ -136,16 +136,11 @@ pub enum ActionShortcut { impl ActionShortcut { pub fn realize_shortcut(&mut self, action_input_mapping: &impl Fn(&MessageDiscriminant) -> Option) { - match self { - Self::Action(action) => { - if let Some(keys) = action_input_mapping(action) { - *self = Self::Shortcut(keys.into()); - } else { - *self = Self::Shortcut(KeysGroup::default().into()); - } - } - Self::Shortcut(shortcut) => { - warn!("Calling `.to_keys()` on a `ActionShortcut::Shortcut` is a mistake/bug. Shortcut is: {shortcut:?}."); + if let Self::Action(action) = self { + if let Some(keys) = action_input_mapping(action) { + *self = Self::Shortcut(keys.into()); + } else { + *self = Self::Shortcut(KeysGroup::default().into()); } } } diff --git a/editor/src/messages/layout/layout_message_handler.rs b/editor/src/messages/layout/layout_message_handler.rs index f9bf381d1..fbdce64dd 100644 --- a/editor/src/messages/layout/layout_message_handler.rs +++ b/editor/src/messages/layout/layout_message_handler.rs @@ -13,7 +13,7 @@ pub struct LayoutMessageContext<'a> { #[derive(Debug, Clone, Default, ExtractField)] pub struct LayoutMessageHandler { - layouts: [Layout; LayoutTarget::LayoutTargetLength as usize], + layouts: [Layout; LayoutTarget::_LayoutTargetLength as usize], } #[message_handler_data] @@ -518,7 +518,8 @@ impl LayoutMessageHandler { LayoutTarget::WelcomeScreenButtons => FrontendMessage::UpdateWelcomeScreenButtonsLayout { diff }, LayoutTarget::WorkingColors => FrontendMessage::UpdateWorkingColorsLayout { diff }, - LayoutTarget::LayoutTargetLength => panic!("`LayoutTargetLength` is not a valid Layout Target and is used for array indexing"), + // KEEP THIS ENUM LAST + LayoutTarget::_LayoutTargetLength => panic!("`_LayoutTargetLength` is not a valid `LayoutTarget` and is used for array indexing"), }; responses.add(message); diff --git a/editor/src/messages/layout/utility_types/layout_widget.rs b/editor/src/messages/layout/utility_types/layout_widget.rs index 907aaff43..5f640aa4a 100644 --- a/editor/src/messages/layout/utility_types/layout_widget.rs +++ b/editor/src/messages/layout/utility_types/layout_widget.rs @@ -56,7 +56,7 @@ pub enum LayoutTarget { // KEEP THIS ENUM LAST // This is a marker that is used to define an array that is used to hold widgets - LayoutTargetLength, + _LayoutTargetLength, } /// For use by structs that define a UI widget layout by implementing the layout() function belonging to this trait. diff --git a/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs b/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs index ca3b9f3c3..d537042f6 100644 --- a/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs +++ b/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs @@ -689,7 +689,7 @@ impl LayoutHolder for MenuBarMessageHandler { .on_commit(|_| DebugMessage::ToggleTraceLogs.into()), MenuListEntry::new("Print Messages: Off") .label("Print Messages: Off") - .icon(message_logging_verbosity_off.then_some({ + .icon(if message_logging_verbosity_off { #[cfg(not(target_os = "macos"))] { "SmallDot".to_string() @@ -698,12 +698,12 @@ impl LayoutHolder for MenuBarMessageHandler { { "CheckboxChecked".to_string() } - }).unwrap_or_default()) + } else { Default::default() }) .tooltip_shortcut(action_shortcut!(DebugMessageDiscriminant::MessageOff)) .on_commit(|_| DebugMessage::MessageOff.into()), MenuListEntry::new("Print Messages: Only Names") .label("Print Messages: Only Names") - .icon(message_logging_verbosity_names.then_some({ + .icon(if message_logging_verbosity_names { #[cfg(not(target_os = "macos"))] { "SmallDot".to_string() @@ -712,12 +712,12 @@ impl LayoutHolder for MenuBarMessageHandler { { "CheckboxChecked".to_string() } - }).unwrap_or_default()) + } else { Default::default() }) .tooltip_shortcut(action_shortcut!(DebugMessageDiscriminant::MessageNames)) .on_commit(|_| DebugMessage::MessageNames.into()), MenuListEntry::new("Print Messages: Full Contents") .label("Print Messages: Full Contents") - .icon(message_logging_verbosity_contents.then_some({ + .icon(if message_logging_verbosity_contents { #[cfg(not(target_os = "macos"))] { "SmallDot".to_string() @@ -726,7 +726,7 @@ impl LayoutHolder for MenuBarMessageHandler { { "CheckboxChecked".to_string() } - }).unwrap_or_default()) + } else { Default::default() }) .tooltip_shortcut(action_shortcut!(DebugMessageDiscriminant::MessageContents)) .on_commit(|_| DebugMessage::MessageContents.into()), ], diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 7ba591bb0..982646233 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -7,7 +7,8 @@ use crate::messages::animation::TimingInformation; use crate::messages::debug::utility_types::MessageLoggingVerbosity; use crate::messages::dialog::simple_dialogs; use crate::messages::frontend::utility_types::{DocumentDetails, OpenDocument}; -use crate::messages::input_mapper::utility_types::macros::action_shortcut; +use crate::messages::input_mapper::utility_types::input_keyboard::Key; +use crate::messages::input_mapper::utility_types::macros::{action_shortcut, action_shortcut_manual}; use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::DocumentMessageContext; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; @@ -154,6 +155,17 @@ impl MessageHandler> for Portfolio node_types: document_node_definitions::collect_node_types(), }); + // Send shortcuts for widgets created in the frontend which need shortcut tooltips + responses.add(FrontendMessage::SendShortcutF11 { + shortcut: action_shortcut_manual!(Key::F11), + }); + responses.add(FrontendMessage::SendShortcutAltClick { + shortcut: action_shortcut_manual!(Key::Alt, Key::MouseLeft), + }); + + // Before loading any documents, initially prepare the welcome screen buttons layout + responses.add(PortfolioMessage::RequestWelcomeScreenButtonsLayout); + // Tell frontend to finish loading persistent documents responses.add(FrontendMessage::TriggerLoadRestAutoSaveDocuments); @@ -1117,7 +1129,14 @@ impl MessageHandler> for Portfolio }) }) .collect::>(); + + let no_open_documents = open_documents.is_empty(); + responses.add(FrontendMessage::UpdateOpenDocumentsList { open_documents }); + + if no_open_documents { + responses.add(PortfolioMessage::RequestWelcomeScreenButtonsLayout); + } } PortfolioMessage::UpdateVelloPreference => { let active = if cfg!(target_family = "wasm") { false } else { preferences.use_vello }; diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index 21b2b2210..0dfa3adb2 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -533,8 +533,8 @@ impl HintData { for shortcut in &hint.key_groups { widgets.push(ShortcutLabel::new(Some(ActionShortcut::Shortcut(shortcut.clone()))).widget_instance()); } - if let Some(mouse_movement) = &hint.mouse { - let mouse_movement = LabeledShortcut(vec![LabeledKeyOrMouseMotion::MouseMotion(mouse_movement.clone())]); + if let Some(mouse_movement) = hint.mouse { + let mouse_movement = LabeledShortcut(vec![LabeledKeyOrMouseMotion::MouseMotion(mouse_movement)]); let shortcut = ActionShortcut::Shortcut(mouse_movement); widgets.push(ShortcutLabel::new(Some(shortcut)).widget_instance()); } diff --git a/frontend/src/components/panels/Layers.svelte b/frontend/src/components/panels/Layers.svelte index 9ed0e2067..732df7cb4 100644 --- a/frontend/src/components/panels/Layers.svelte +++ b/frontend/src/components/panels/Layers.svelte @@ -1,7 +1,6 @@