From b86eea780f44741fa3057c95f324af6f22ec020e Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 8 Jan 2024 16:28:24 -0300 Subject: [PATCH] Add View > Workspace Layout option to switch the layout w/keys --- data/gui.xml | 2 + data/strings/en.ini | 2 + src/app/CMakeLists.txt | 1 + src/app/commands/commands_list.h | 3 +- src/app/commands/toggle_workspace_layout.cpp | 47 ++++++++++++++++++++ src/app/ui/layout_selector.cpp | 27 +++++++++-- src/app/ui/layout_selector.h | 7 ++- src/app/ui/main_window.h | 3 +- 8 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 src/app/commands/toggle_workspace_layout.cpp diff --git a/data/gui.xml b/data/gui.xml index 90cd94b7f..2c0ca8e32 100644 --- a/data/gui.xml +++ b/data/gui.xml @@ -175,6 +175,7 @@ + @@ -1002,6 +1003,7 @@ + diff --git a/data/strings/en.ini b/data/strings/en.ini index f038eb233..4fb41626e 100644 --- a/data/strings/en.ini +++ b/data/strings/en.ini @@ -488,6 +488,7 @@ TilesetDuplicate = Duplicate Tileset Undo = Undo UndoHistory = Undo History UnlinkCel = Unlink Cel +ToggleWorkspaceLayout = Toggle Workspace Layout Zoom = Zoom Zoom_In = Zoom In Zoom_Out = Zoom Out @@ -1163,6 +1164,7 @@ select_load_from_file = &Load from MSK file select_save_to_file = &Save to MSK file view = &View view_duplicate_view = Duplicate &View +view_workspace_layout = Workspace &Layout view_show_extras = &Extras view_show = &Show view_show_layer_edges = &Layer Edges diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index c66106a30..4abc15e0a 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -520,6 +520,7 @@ target_sources(app-lib PRIVATE commands/tileset_mode.cpp commands/toggle_other_layers_opacity.cpp commands/toggle_play_option.cpp + commands/toggle_workspace_layout.cpp console.cpp context.cpp context_flags.cpp diff --git a/src/app/commands/commands_list.h b/src/app/commands/commands_list.h index 4177aec0b..5a32f7495 100644 --- a/src/app/commands/commands_list.h +++ b/src/app/commands/commands_list.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2023 Igara Studio S.A. +// Copyright (C) 2018-2024 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -174,6 +174,7 @@ FOR_EACH_COMMAND(TogglePreview) FOR_EACH_COMMAND(ToggleRewindOnStop) FOR_EACH_COMMAND(ToggleTilesMode) FOR_EACH_COMMAND(ToggleTimelineThumbnails) +FOR_EACH_COMMAND(ToggleWorkspaceLayout) FOR_EACH_COMMAND(Undo) FOR_EACH_COMMAND(UndoHistory) FOR_EACH_COMMAND(UnlinkCel) diff --git a/src/app/commands/toggle_workspace_layout.cpp b/src/app/commands/toggle_workspace_layout.cpp new file mode 100644 index 000000000..37bf194ab --- /dev/null +++ b/src/app/commands/toggle_workspace_layout.cpp @@ -0,0 +1,47 @@ +// Aseprite +// Copyright (c) 2024 Igara Studio S.A. +// +// This program is distributed under the terms of +// the End-User License Agreement for Aseprite. + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "app/app.h" +#include "app/commands/command.h" +#include "app/ui/layout_selector.h" +#include "app/ui/main_window.h" + +namespace app { + +class ToggleWorkspaceLayoutCommand : public Command { +public: + ToggleWorkspaceLayoutCommand(); + +protected: + bool onChecked(Context* ctx) override; + void onExecute(Context* ctx) override; +}; + +ToggleWorkspaceLayoutCommand::ToggleWorkspaceLayoutCommand() + : Command(CommandId::ToggleWorkspaceLayout(), CmdUIOnlyFlag) +{ +} + +bool ToggleWorkspaceLayoutCommand::onChecked(Context* ctx) +{ + return App::instance()->mainWindow()->layoutSelector()->isSelectorVisible(); +} + +void ToggleWorkspaceLayoutCommand::onExecute(Context* ctx) +{ + App::instance()->mainWindow()->layoutSelector()->switchSelectorFromCommand(); +} + +Command* CommandFactory::createToggleWorkspaceLayoutCommand() +{ + return new ToggleWorkspaceLayoutCommand(); +} + +} // namespace app diff --git a/src/app/ui/layout_selector.cpp b/src/app/ui/layout_selector.cpp index 9678a52d5..a5f9b84c4 100644 --- a/src/app/ui/layout_selector.cpp +++ b/src/app/ui/layout_selector.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2021-2022 Igara Studio S.A. +// Copyright (C) 2021-2024 Igara Studio S.A. // // This program is distributed under the terms of // the End-User License Agreement for Aseprite. @@ -26,7 +26,7 @@ #include "new_layout.xml.h" -#define ANI_TICKS 5 +#define ANI_TICKS 2 namespace app { @@ -292,10 +292,20 @@ void LayoutSelector::onAnimationFrame() void LayoutSelector::onAnimationStop(int animation) { switch (animation) { - case ANI_EXPANDING: m_comboBox.setSizeHint(m_endSize); break; + case ANI_EXPANDING: + m_comboBox.setSizeHint(m_endSize); + if (m_switchComboBoxAfterAni) { + m_switchComboBoxAfterAni = false; + m_comboBox.openListBox(); + } + break; case ANI_COLLAPSING: m_comboBox.setVisible(false); m_comboBox.setSizeHint(m_endSize); + if (m_switchComboBoxAfterAni) { + m_switchComboBoxAfterAni = false; + m_comboBox.closeListBox(); + } break; } @@ -338,6 +348,17 @@ void LayoutSelector::switchSelector() startAnimation((expand ? ANI_EXPANDING : ANI_COLLAPSING), ANI_TICKS); } +void LayoutSelector::switchSelectorFromCommand() +{ + m_switchComboBoxAfterAni = true; + switchSelector(); +} + +bool LayoutSelector::isSelectorVisible() const +{ + return (m_comboBox.isVisible()); +} + void LayoutSelector::setupTooltips(TooltipManager* tooltipManager) { tooltipManager->addTooltipFor(&m_button, Strings::main_window_layout(), TOP); diff --git a/src/app/ui/layout_selector.h b/src/app/ui/layout_selector.h index 6d91af9cb..0d06ed8fa 100644 --- a/src/app/ui/layout_selector.h +++ b/src/app/ui/layout_selector.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2021-2022 Igara Studio S.A. +// Copyright (C) 2021-2024 Igara Studio S.A. // // This program is distributed under the terms of // the End-User License Agreement for Aseprite. @@ -48,6 +48,9 @@ public: ~LayoutSelector(); void addLayout(const LayoutPtr& layout); + void switchSelector(); + void switchSelectorFromCommand(); + bool isSelectorVisible() const; // Dockable impl int dockableAt() const override { return ui::TOP | ui::BOTTOM; } @@ -56,13 +59,13 @@ private: void setupTooltips(ui::TooltipManager* tooltipManager); void onAnimationFrame() override; void onAnimationStop(int animation) override; - void switchSelector(); LayoutComboBox m_comboBox; IconButton m_button; gfx::Size m_startSize; gfx::Size m_endSize; Layouts m_layouts; + bool m_switchComboBoxAfterAni = false; }; } // namespace app diff --git a/src/app/ui/main_window.h b/src/app/ui/main_window.h index 8d6f391b9..67ddfe4fb 100644 --- a/src/app/ui/main_window.h +++ b/src/app/ui/main_window.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2023 Igara Studio S.A. +// Copyright (C) 2018-2024 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -59,6 +59,7 @@ public: // TODO refactor: remove the get prefix from these functions MainMenuBar* getMenuBar() { return m_menuBar.get(); } + LayoutSelector* layoutSelector() { return m_layoutSelector.get(); } ContextBar* getContextBar() { return m_contextBar.get(); } StatusBar* statusBar() { return m_statusBar.get(); } WorkspaceTabs* getTabsBar() { return m_tabsBar.get(); }