diff --git a/src/app/ui/main_window.cpp b/src/app/ui/main_window.cpp index 1d70c359d6..d242ee55dc 100644 --- a/src/app/ui/main_window.cpp +++ b/src/app/ui/main_window.cpp @@ -430,6 +430,34 @@ void MainWindow::onContextMenuTab(Tabs* tabs, TabView* tabView) view->onTabPopup(m_workspace); } +void MainWindow::onTabsContainerDoubleClicked(Tabs* tabs) +{ + WorkspacePanel* mainPanel = m_workspace->mainPanel(); + WorkspaceView* oldActiveView = mainPanel->activeView(); + app::Document* oldDoc = static_cast(UIContext::instance()->activeDocument()); + + Command* command = CommandsModule::instance()->getCommandByName(CommandId::NewFile); + UIContext::instance()->executeCommand(command); + + app::Document* newDoc = static_cast(UIContext::instance()->activeDocument()); + if (newDoc != oldDoc) { + WorkspacePanel* doubleClickedPanel = + static_cast(tabs)->panel(); + + // TODO move this code to workspace? + // Put the new sprite in the double-clicked tabs control + if (doubleClickedPanel != mainPanel) { + WorkspaceView* newView = m_workspace->activeView(); + m_workspace->removeView(newView); + m_workspace->addViewToPanel(doubleClickedPanel, newView, false, -1); + + // Re-activate the old view in the main panel + mainPanel->setActiveView(oldActiveView); + doubleClickedPanel->setActiveView(newView); + } + } +} + void MainWindow::onMouseOverTab(Tabs* tabs, TabView* tabView) { // Note: tabView can be NULL diff --git a/src/app/ui/main_window.h b/src/app/ui/main_window.h index 53838e0564..ebbf424d42 100644 --- a/src/app/ui/main_window.h +++ b/src/app/ui/main_window.h @@ -89,6 +89,7 @@ namespace app { void onCloseTab(Tabs* tabs, TabView* tabView) override; void onCloneTab(Tabs* tabs, TabView* tabView, int pos) override; void onContextMenuTab(Tabs* tabs, TabView* tabView) override; + void onTabsContainerDoubleClicked(Tabs* tabs) override; void onMouseOverTab(Tabs* tabs, TabView* tabView) override; DropViewPreviewResult onFloatingTab(Tabs* tabs, TabView* tabView, const gfx::Point& pos) override; void onDockingTab(Tabs* tabs, TabView* tabView) override; diff --git a/src/app/ui/tabs.cpp b/src/app/ui/tabs.cpp index 65feb7b810..72e4fa5edc 100644 --- a/src/app/ui/tabs.cpp +++ b/src/app/ui/tabs.cpp @@ -440,6 +440,13 @@ bool Tabs::onProcessMessage(Message* msg) updateMouseCursor(); return true; + case kDoubleClickMessage: + // When we double-click outside tabs (!m_hot), we trigger the + // double-click in tabs container to show the "New Sprite" dialog. + if (!m_hot && m_delegate) + m_delegate->onTabsContainerDoubleClicked(this); + return true; + } return Widget::onProcessMessage(msg); diff --git a/src/app/ui/tabs.h b/src/app/ui/tabs.h index 95c107378f..a3f2883b42 100644 --- a/src/app/ui/tabs.h +++ b/src/app/ui/tabs.h @@ -89,6 +89,9 @@ namespace app { // When the right-click is pressed in the tab. virtual void onContextMenuTab(Tabs* tabs, TabView* tabView) = 0; + // When the tab bar background is double-clicked. + virtual void onTabsContainerDoubleClicked(Tabs* tabs) = 0; + // Called when the mouse is over a tab (the data can be null if the // mouse just leave all tabs) virtual void onMouseOverTab(Tabs* tabs, TabView* tabView) = 0; diff --git a/src/app/ui/workspace.h b/src/app/ui/workspace.h index 8db8bffb3d..dbf5128be5 100644 --- a/src/app/ui/workspace.h +++ b/src/app/ui/workspace.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2001-2016 David Capello +// Copyright (C) 2001-2017 David Capello // // This program is distributed under the terms of // the End-User License Agreement for Aseprite. @@ -71,6 +71,8 @@ namespace app { bool onClear(Context* ctx) override; void onCancel(Context* ctx) override; + WorkspacePanel* mainPanel() { return &m_mainPanel; } + obs::signal ActiveViewChanged; protected: