Now right-clicking a tab shows a popup-menu with useful options for the document.

+ Added OpenInFolder and OpenWithApp commands.
+ Added Launcher::openFolder.
+ Added document_tab_popup_menu.
This commit is contained in:
David Capello 2011-06-25 14:28:50 -03:00
parent e281fc4a41
commit ff481003c8
10 changed files with 220 additions and 11 deletions

View File

@ -330,7 +330,14 @@
<item command="About" text="&amp;About" />
</menu>
</menu>
<menu id="document_tab_popup">
<item command="CloseFile" text="&amp;Close" />
<separator />
<item command="OpenInFolder" text="Open In &amp;Folder" />
<item command="OpenWithApp" text="Open With Associated &amp;Application" />
</menu>
<menu id="layer_popup">
<item command="LayerProperties" text="&amp;Properties..." />
<separator />

View File

@ -139,6 +139,8 @@ add_library(aseprite-library
commands/cmd_new_layer.cpp
commands/cmd_new_layer_set.cpp
commands/cmd_open_file.cpp
commands/cmd_open_in_folder.cpp
commands/cmd_open_with_app.cpp
commands/cmd_options.cpp
commands/cmd_palette_editor.cpp
commands/cmd_paste.cpp

View File

@ -491,17 +491,29 @@ int app_get_color_to_clear_layer(Layer* layer)
void AppTabsDelegate::clickTab(Tabs* tabs, void* data, int button)
{
Document* document = (Document*)data;
Document* document = reinterpret_cast<Document*>(data);
// put as current sprite
set_document_in_more_reliable_editor(document);
// middle-button: close the sprite
if (data && (button & 4)) {
Command* close_file_cmd =
CommandsModule::instance()->getCommandByName(CommandId::CloseFile);
if (document) {
Context* context = UIContext::instance();
context->updateFlags();
UIContext::instance()->executeCommand(close_file_cmd, NULL);
// right-button: popup-menu
if (button & 2) {
Menu* popup_menu = get_document_tab_popup_menu();
if (popup_menu != NULL) {
popup_menu->showPopup(jmouse_x(0), jmouse_y(0));
}
}
// middle-button: close the sprite
else if (button & 4) {
Command* close_file_cmd =
CommandsModule::instance()->getCommandByName(CommandId::CloseFile);
context->executeCommand(close_file_cmd, NULL);
}
}
}

View File

@ -0,0 +1,63 @@
/* ASE - Allegro Sprite Editor
* Copyright (C) 2001-2011 David Capello
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include "base/compiler_specific.h"
#include "commands/command.h"
#include "document.h"
#include "document_wrappers.h"
#include "context.h"
#include "launcher.h"
class OpenInFolderCommand : public Command
{
public:
OpenInFolderCommand();
Command* clone() { return new OpenInFolderCommand(*this); }
protected:
bool onEnabled(Context* context) OVERRIDE;
void onExecute(Context* context) OVERRIDE;
};
OpenInFolderCommand::OpenInFolderCommand()
: Command("OpenInFolder",
"Open In Folder",
CmdUIOnlyFlag)
{
}
bool OpenInFolderCommand::onEnabled(Context* context)
{
const ActiveDocumentReader document(context);
return document && document->isAssociatedToFile();
}
void OpenInFolderCommand::onExecute(Context* context)
{
Launcher::openFolder(context->getActiveDocument()->getFilename());
}
//////////////////////////////////////////////////////////////////////
// CommandFactory
Command* CommandFactory::createOpenInFolderCommand()
{
return new OpenInFolderCommand;
}

View File

@ -0,0 +1,63 @@
/* ASE - Allegro Sprite Editor
* Copyright (C) 2001-2011 David Capello
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include "base/compiler_specific.h"
#include "commands/command.h"
#include "document.h"
#include "document_wrappers.h"
#include "context.h"
#include "launcher.h"
class OpenWithAppCommand : public Command
{
public:
OpenWithAppCommand();
Command* clone() { return new OpenWithAppCommand(*this); }
protected:
bool onEnabled(Context* context) OVERRIDE;
void onExecute(Context* context) OVERRIDE;
};
OpenWithAppCommand::OpenWithAppCommand()
: Command("OpenWithApp",
"Open With Associated Application",
CmdUIOnlyFlag)
{
}
bool OpenWithAppCommand::onEnabled(Context* context)
{
const ActiveDocumentReader document(context);
return document && document->isAssociatedToFile();
}
void OpenWithAppCommand::onExecute(Context* context)
{
Launcher::openFile(context->getActiveDocument()->getFilename());
}
//////////////////////////////////////////////////////////////////////
// CommandFactory
Command* CommandFactory::createOpenWithAppCommand()
{
return new OpenWithAppCommand;
}

View File

@ -71,6 +71,8 @@ FOR_EACH_COMMAND(NewFrame)
FOR_EACH_COMMAND(NewLayer)
FOR_EACH_COMMAND(NewLayerSet)
FOR_EACH_COMMAND(OpenFile)
FOR_EACH_COMMAND(OpenInFolder)
FOR_EACH_COMMAND(OpenWithApp)
FOR_EACH_COMMAND(Options)
FOR_EACH_COMMAND(PaletteEditor)
FOR_EACH_COMMAND(Paste)

View File

@ -18,12 +18,47 @@
#include "config.h"
#include "base/exception.h"
#include "gui/alert.h"
#include "launcher.h"
#if defined ALLEGRO_WINDOWS
#define BITMAP WINDOWS_BITMAP
#include <windows.h>
#define BITMAP WINDOWS_BITMAP
#include <windows.h>
static void win32_shell_execute(const char* verb, const char* file, const char* params)
{
SHELLEXECUTEINFO sh;
ZeroMemory((LPVOID)&sh, sizeof(sh));
sh.cbSize = sizeof(sh);
sh.fMask = SEE_MASK_DEFAULT;
sh.lpVerb = verb;
sh.lpFile = file;
sh.lpParameters = params;
sh.nShow = SW_SHOWNORMAL;
if (!ShellExecuteEx(&sh)) {
int ret = GetLastError();
if (ret != 0) {
DWORD flags =
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS;
LPSTR msgbuf;
if (FormatMessageA(flags, NULL, ret,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPSTR>(&msgbuf),
0, NULL)) {
Alert::show("Problem<<Cannot open:<<%s<<%s||&Close", file, msgbuf);
LocalFree(msgbuf);
ret = 0;
}
}
}
}
#endif
void Launcher::openUrl(const std::string& url)
@ -37,8 +72,8 @@ void Launcher::openFile(const std::string& file)
#if defined ALLEGRO_WINDOWS
ShellExecute(NULL, "open", file.c_str(), NULL, NULL, SW_SHOWNORMAL);
ret = 0; // TODO Use ShellExecuteEx to know the return value
win32_shell_execute("open", file.c_str(), NULL);
ret = 0;
#elif defined ALLEGRO_MACOSX
@ -53,3 +88,20 @@ void Launcher::openFile(const std::string& file)
if (ret != 0)
Alert::show("Problem<<Cannot open:<<%s||&Close", file.c_str());
}
void Launcher::openFolder(const std::string& file)
{
#if defined ALLEGRO_WINDOWS
win32_shell_execute(NULL, "explorer", ("/e,/select,\"" + file + "\"").c_str());
#elif defined ALLEGRO_MACOSX
Alert::show("Problem<<This command is not supported on Mac OS X||&Close");
#else // Linux
Alert::show("Problem<<This command is not supported on Linux||&Close");
#endif
}

View File

@ -26,6 +26,7 @@ class Launcher
public:
static void openUrl(const std::string& url);
static void openFile(const std::string& file);
static void openFolder(const std::string& file);
};
#endif

View File

@ -42,6 +42,7 @@
static Menu* root_menu;
static MenuItem* recent_list_menuitem;
static Menu* document_tab_popup_menu;
static Menu* layer_popup_menu;
static Menu* frame_popup_menu;
static Menu* cel_popup_menu;
@ -56,6 +57,7 @@ static void apply_shortcut_to_menuitems_with_command(Menu* menu, Command* comman
int init_module_rootmenu()
{
root_menu = NULL;
document_tab_popup_menu = NULL;
layer_popup_menu = NULL;
frame_popup_menu = NULL;
cel_popup_menu = NULL;
@ -68,6 +70,7 @@ int init_module_rootmenu()
void exit_module_rootmenu()
{
delete root_menu;
delete document_tab_popup_menu;
delete layer_popup_menu;
delete frame_popup_menu;
delete cel_popup_menu;
@ -77,6 +80,7 @@ void exit_module_rootmenu()
Menu* get_root_menu() { return root_menu; }
MenuItem* get_recent_list_menuitem() { return recent_list_menuitem; }
Menu* get_document_tab_popup_menu() { return document_tab_popup_menu; }
Menu* get_layer_popup_menu() { return layer_popup_menu; }
Menu* get_frame_popup_menu() { return frame_popup_menu; }
Menu* get_cel_popup_menu() { return cel_popup_menu; }
@ -93,6 +97,7 @@ static int load_root_menu()
// create a new empty-menu
root_menu = NULL;
recent_list_menuitem = NULL;
document_tab_popup_menu = NULL;
layer_popup_menu = NULL;
frame_popup_menu = NULL;
cel_popup_menu = NULL;
@ -115,6 +120,7 @@ static int load_root_menu()
PRINTF("Main menu loaded.\n");
document_tab_popup_menu = load_menu_by_id(handle, "document_tab_popup");
layer_popup_menu = load_menu_by_id(handle, "layer_popup");
frame_popup_menu = load_menu_by_id(handle, "frame_popup");
cel_popup_menu = load_menu_by_id(handle, "cel_popup");

View File

@ -38,6 +38,7 @@ void exit_module_rootmenu();
Menu* get_root_menu();
MenuItem* get_recent_list_menuitem();
Menu* get_document_tab_popup_menu();
Menu* get_layer_popup_menu();
Menu* get_frame_popup_menu();
Menu* get_cel_popup_menu();