Add "View > Duplicate View" to create multiple views of the same document

This commit is contained in:
David Capello 2015-04-06 12:22:20 -03:00
parent b38f116da9
commit 7448db3959
9 changed files with 93 additions and 1 deletions

View File

@ -569,6 +569,8 @@
<item command="SaveMask" text="&amp;Save to MSK file" />
</menu>
<menu text="&amp;View">
<item command="DuplicateView" text="Duplicate &amp;View" />
<separator />
<item command="ShowPixelGrid" text="Show &amp;Pixel Grid" />
<item command="ShowGrid" text="Show &amp;Grid" />
<item command="SnapToGrid" text="&amp;Snap to Grid" />
@ -628,6 +630,7 @@
<menu id="document_tab_popup">
<item command="CloseFile" text="&amp;Close" />
<item command="DuplicateView" text="Duplicate &amp;View" />
<separator />
<item command="OpenWithApp" text="&amp;Open with OS" />
<item command="OpenInFolder" text="Open in &amp;Folder" />

View File

@ -146,6 +146,7 @@ add_library(app-lib
commands/cmd_developer_console.cpp
commands/cmd_duplicate_layer.cpp
commands/cmd_duplicate_sprite.cpp
commands/cmd_duplicate_view.cpp
commands/cmd_exit.cpp
commands/cmd_export_sprite_sheet.cpp
commands/cmd_eyedropper.cpp

View File

@ -0,0 +1,58 @@
// Aseprite
// Copyright (C) 2001-2015 David Capello
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "app/commands/command.h"
#include "app/app.h"
#include "app/ui/main_window.h"
#include "app/ui/workspace.h"
#include <cstdio>
namespace app {
// using namespace ui;
class DuplicateViewCommand : public Command {
public:
DuplicateViewCommand();
Command* clone() const override { return new DuplicateViewCommand(*this); }
protected:
bool onEnabled(Context* context) override;
void onExecute(Context* context) override;
};
DuplicateViewCommand::DuplicateViewCommand()
: Command("DuplicateView",
"Duplicate View",
CmdUIOnlyFlag)
{
}
bool DuplicateViewCommand::onEnabled(Context* context)
{
Workspace* workspace = App::instance()->getMainWindow()->getWorkspace();
WorkspaceView* view = workspace->activeView();
return (view != nullptr);
}
void DuplicateViewCommand::onExecute(Context* context)
{
App::instance()->getMainWindow()->getWorkspace()->duplicateActiveView();
}
Command* CommandFactory::createDuplicateViewCommand()
{
return new DuplicateViewCommand;
}
} // namespace app

View File

@ -31,6 +31,7 @@ FOR_EACH_COMMAND(Despeckle)
FOR_EACH_COMMAND(DeveloperConsole)
FOR_EACH_COMMAND(DuplicateLayer)
FOR_EACH_COMMAND(DuplicateSprite)
FOR_EACH_COMMAND(DuplicateView)
FOR_EACH_COMMAND(Exit)
FOR_EACH_COMMAND(ExportSpriteSheet)
FOR_EACH_COMMAND(Eyedropper)

View File

@ -110,6 +110,7 @@ void DevConsoleView::onWorkspaceViewSelected()
void DevConsoleView::onClonedFrom(WorkspaceView* from)
{
// Do nothing
}
bool DevConsoleView::onCloseView(Workspace* workspace)

View File

@ -231,6 +231,17 @@ void DocumentView::onClonedFrom(WorkspaceView* from)
bool DocumentView::onCloseView(Workspace* workspace)
{
// If there is another view for this document, just close the view.
for (auto view : *workspace) {
DocumentView* docView = dynamic_cast<DocumentView*>(view);
if (docView && docView != this &&
docView->getDocument() == getDocument()) {
workspace->removeView(this);
delete this;
return true;
}
}
UIContext* ctx = UIContext::instance();
bool save_it;
bool try_again = true;

View File

@ -69,7 +69,7 @@ TabIcon HomeView::getTabIcon()
WorkspaceView* HomeView::cloneWorkspaceView()
{
return NULL; // This view cannot be cloned
return nullptr; // This view cannot be cloned
}
void HomeView::onClonedFrom(WorkspaceView* from)

View File

@ -116,6 +116,22 @@ void Workspace::selectPreviousTab()
m_activePanel->tabs()->selectPreviousTab();
}
void Workspace::duplicateActiveView()
{
WorkspaceView* view = activeView();
if (!view)
return;
WorkspaceView* clone = view->cloneWorkspaceView();
if (!clone)
return;
WorkspacePanel* panel = getViewPanel(view);
addViewToPanel(panel, clone, false, -1);
clone->onClonedFrom(view);
setActiveView(clone);
}
void Workspace::onPaint(PaintEvent& ev)
{
ev.getGraphics()->fillRect(getBgColor(), getClientBounds());

View File

@ -43,6 +43,7 @@ namespace app {
void setMainPanelAsActive();
void selectNextTab();
void selectPreviousTab();
void duplicateActiveView();
// Set the preview of what could happen if we drop the given
// "view" at the "pos"?