mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-18 11:42:47 +00:00
Add customizable quicktools keyboard shortcuts to the editor (feature requested by Paul Pridham).
This commit is contained in:
parent
3a8711e6a6
commit
20b535bd9c
@ -148,6 +148,15 @@
|
|||||||
<key tool="blur" shortcut="R" />
|
<key tool="blur" shortcut="R" />
|
||||||
<key tool="jumble" shortcut="R" />
|
<key tool="jumble" shortcut="R" />
|
||||||
</tools>
|
</tools>
|
||||||
|
|
||||||
|
<!-- Editor Quicktools: these are modifiers to select quickly a
|
||||||
|
tool without changing the current one -->
|
||||||
|
<quicktools>
|
||||||
|
<key tool="eyedropper" shortcut="Alt" />
|
||||||
|
<key tool="move" shortcut="Ctrl" />
|
||||||
|
<key tool="hand" shortcut="Space" />
|
||||||
|
</quicktools>
|
||||||
|
|
||||||
</keyboard>
|
</keyboard>
|
||||||
|
|
||||||
<menus>
|
<menus>
|
||||||
|
@ -225,7 +225,6 @@ static void proc_one_word(JAccel accel, char* word)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ascii || scancode)
|
|
||||||
jaccel_add_key(accel, shifts, ascii, scancode);
|
jaccel_add_key(accel, shifts, ascii, scancode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -467,17 +466,21 @@ bool jaccel_check(JAccel accel, int shifts, int ascii, int scancode)
|
|||||||
|
|
||||||
JI_LIST_FOR_EACH(accel->key_list, link) {
|
JI_LIST_FOR_EACH(accel->key_list, link) {
|
||||||
key = (KeyCombo *)link->data;
|
key = (KeyCombo *)link->data;
|
||||||
|
|
||||||
#ifdef REPORT_KEYS
|
#ifdef REPORT_KEYS
|
||||||
keycombo_get_string(key, buf);
|
keycombo_get_string(key, buf);
|
||||||
printf("%3d==%3d %3d==%3d %s==%s ",
|
printf("%3d==%3d %3d==%3d %s==%s ",
|
||||||
key->scancode, scancode, key->ascii, ascii, buf, buf2);
|
key->scancode, scancode, key->ascii, ascii, buf, buf2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (((key->scancode && key->scancode == scancode)
|
if (((key->scancode && key->scancode == scancode)
|
||||||
|| (key->ascii && key->ascii == ascii))
|
|| (key->ascii && key->ascii == ascii))
|
||||||
&& (key->shifts == (shifts & (KB_SHIFT_FLAG | KB_CTRL_FLAG)))) {
|
&& (key->shifts == (shifts & (KB_SHIFT_FLAG | KB_CTRL_FLAG | KB_ALT_FLAG)))) {
|
||||||
|
|
||||||
#ifdef REPORT_KEYS
|
#ifdef REPORT_KEYS
|
||||||
printf("true\n");
|
printf("true\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#ifdef REPORT_KEYS
|
#ifdef REPORT_KEYS
|
||||||
@ -487,3 +490,25 @@ bool jaccel_check(JAccel accel, int shifts, int ascii, int scancode)
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool jaccel_check_from_key(JAccel accel)
|
||||||
|
{
|
||||||
|
int shifts = 0;
|
||||||
|
|
||||||
|
if (key[KEY_LSHIFT]) shifts |= KB_SHIFT_FLAG;
|
||||||
|
if (key[KEY_RSHIFT]) shifts |= KB_SHIFT_FLAG;
|
||||||
|
if (key[KEY_LCONTROL]) shifts |= KB_CTRL_FLAG;
|
||||||
|
if (key[KEY_RCONTROL]) shifts |= KB_CTRL_FLAG;
|
||||||
|
if (key[KEY_ALT]) shifts |= KB_ALT_FLAG;
|
||||||
|
|
||||||
|
JLink link;
|
||||||
|
JI_LIST_FOR_EACH(accel->key_list, link) {
|
||||||
|
KeyCombo* keyCombo = (KeyCombo*)link->data;
|
||||||
|
|
||||||
|
if ((keyCombo->scancode == 0 || key[keyCombo->scancode]) &&
|
||||||
|
(keyCombo->shifts == (shifts & (KB_SHIFT_FLAG | KB_CTRL_FLAG | KB_ALT_FLAG)))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -20,5 +20,6 @@ bool jaccel_is_empty(JAccel accel);
|
|||||||
void jaccel_to_string(JAccel accel, char *buf);
|
void jaccel_to_string(JAccel accel, char *buf);
|
||||||
|
|
||||||
bool jaccel_check(JAccel accel, int shifts, int ascii, int scancode);
|
bool jaccel_check(JAccel accel, int shifts, int ascii, int scancode);
|
||||||
|
bool jaccel_check_from_key(JAccel accel);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -90,7 +90,8 @@ static GfxMode lastWorkingGfxMode;
|
|||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
enum ShortcutType { Shortcut_ExecuteCommand,
|
enum ShortcutType { Shortcut_ExecuteCommand,
|
||||||
Shortcut_ChangeTool };
|
Shortcut_ChangeTool,
|
||||||
|
Shortcut_EditorQuicktool };
|
||||||
|
|
||||||
struct Shortcut
|
struct Shortcut
|
||||||
{
|
{
|
||||||
@ -106,12 +107,14 @@ struct Shortcut
|
|||||||
~Shortcut();
|
~Shortcut();
|
||||||
|
|
||||||
void add_shortcut(const char* shortcut_string);
|
void add_shortcut(const char* shortcut_string);
|
||||||
bool is_key_pressed(JMessage msg);
|
bool is_pressed(JMessage msg);
|
||||||
|
bool is_pressed_from_key_array();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static Shortcut* get_keyboard_shortcut_for_command(const char* command_name, Params* params);
|
static Shortcut* get_keyboard_shortcut_for_command(const char* command_name, Params* params);
|
||||||
static Shortcut* get_keyboard_shortcut_for_tool(Tool* tool);
|
static Shortcut* get_keyboard_shortcut_for_tool(Tool* tool);
|
||||||
|
static Shortcut* get_keyboard_shortcut_for_quicktool(Tool* tool);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -929,6 +932,21 @@ JAccel add_keyboard_shortcut_to_change_tool(const char* shortcut_string, Tool* t
|
|||||||
return shortcut->accel;
|
return shortcut->accel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JAccel add_keyboard_shortcut_to_quicktool(const char* shortcut_string, Tool* tool)
|
||||||
|
{
|
||||||
|
Shortcut* shortcut = get_keyboard_shortcut_for_quicktool(tool);
|
||||||
|
|
||||||
|
if (!shortcut) {
|
||||||
|
shortcut = new Shortcut(Shortcut_EditorQuicktool);
|
||||||
|
shortcut->tool = tool;
|
||||||
|
|
||||||
|
shortcuts->push_back(shortcut);
|
||||||
|
}
|
||||||
|
|
||||||
|
shortcut->add_shortcut(shortcut_string);
|
||||||
|
return shortcut->accel;
|
||||||
|
}
|
||||||
|
|
||||||
Command* get_command_from_key_message(JMessage msg)
|
Command* get_command_from_key_message(JMessage msg)
|
||||||
{
|
{
|
||||||
for (std::vector<Shortcut*>::iterator
|
for (std::vector<Shortcut*>::iterator
|
||||||
@ -938,7 +956,7 @@ Command* get_command_from_key_message(JMessage msg)
|
|||||||
if (shortcut->type == Shortcut_ExecuteCommand &&
|
if (shortcut->type == Shortcut_ExecuteCommand &&
|
||||||
// TODO why?
|
// TODO why?
|
||||||
// shortcut->argument.empty() &&
|
// shortcut->argument.empty() &&
|
||||||
shortcut->is_key_pressed(msg)) {
|
shortcut->is_pressed(msg)) {
|
||||||
return shortcut->command;
|
return shortcut->command;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -963,6 +981,23 @@ JAccel get_accel_to_change_tool(Tool* tool)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tool* get_selected_quicktool()
|
||||||
|
{
|
||||||
|
ToolBox* toolbox = App::instance()->getToolBox();
|
||||||
|
|
||||||
|
// Iterate over all tools
|
||||||
|
for (ToolIterator it = toolbox->begin(); it != toolbox->end(); ++it) {
|
||||||
|
Shortcut* shortcut = get_keyboard_shortcut_for_quicktool(*it);
|
||||||
|
|
||||||
|
// Collect all tools with the pressed keyboard-shortcut
|
||||||
|
if (shortcut && shortcut->is_pressed_from_key_array()) {
|
||||||
|
return *it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
Shortcut::Shortcut(ShortcutType type)
|
Shortcut::Shortcut(ShortcutType type)
|
||||||
{
|
{
|
||||||
this->type = type;
|
this->type = type;
|
||||||
@ -985,7 +1020,7 @@ void Shortcut::add_shortcut(const char* shortcut_string)
|
|||||||
jaccel_add_keys_from_string(this->accel, buf);
|
jaccel_add_keys_from_string(this->accel, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Shortcut::is_key_pressed(JMessage msg)
|
bool Shortcut::is_pressed(JMessage msg)
|
||||||
{
|
{
|
||||||
if (accel) {
|
if (accel) {
|
||||||
return jaccel_check(accel,
|
return jaccel_check(accel,
|
||||||
@ -996,6 +1031,14 @@ bool Shortcut::is_key_pressed(JMessage msg)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Shortcut::is_pressed_from_key_array()
|
||||||
|
{
|
||||||
|
if (accel) {
|
||||||
|
return jaccel_check_from_key(accel);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static Shortcut* get_keyboard_shortcut_for_command(const char* command_name, Params* params)
|
static Shortcut* get_keyboard_shortcut_for_command(const char* command_name, Params* params)
|
||||||
{
|
{
|
||||||
Command* command = CommandsModule::instance()->get_command_by_name(command_name);
|
Command* command = CommandsModule::instance()->get_command_by_name(command_name);
|
||||||
@ -1032,6 +1075,21 @@ static Shortcut* get_keyboard_shortcut_for_tool(Tool* tool)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Shortcut* get_keyboard_shortcut_for_quicktool(Tool* tool)
|
||||||
|
{
|
||||||
|
for (std::vector<Shortcut*>::iterator
|
||||||
|
it = shortcuts->begin(); it != shortcuts->end(); ++it) {
|
||||||
|
Shortcut* shortcut = *it;
|
||||||
|
|
||||||
|
if (shortcut->type == Shortcut_EditorQuicktool &&
|
||||||
|
shortcut->tool == tool) {
|
||||||
|
return shortcut;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a routine to be called each 100 milliseconds to monitor
|
* Adds a routine to be called each 100 milliseconds to monitor
|
||||||
* whatever you want. It's mainly used to monitor the progress of a
|
* whatever you want. It's mainly used to monitor the progress of a
|
||||||
@ -1120,7 +1178,7 @@ static bool manager_msg_proc(JWidget widget, JMessage msg)
|
|||||||
it = shortcuts->begin(); it != shortcuts->end(); ++it) {
|
it = shortcuts->begin(); it != shortcuts->end(); ++it) {
|
||||||
Shortcut* shortcut = *it;
|
Shortcut* shortcut = *it;
|
||||||
|
|
||||||
if (shortcut->is_key_pressed(msg)) {
|
if (shortcut->is_pressed(msg)) {
|
||||||
switch (shortcut->type) {
|
switch (shortcut->type) {
|
||||||
|
|
||||||
case Shortcut_ChangeTool: {
|
case Shortcut_ChangeTool: {
|
||||||
@ -1134,7 +1192,7 @@ static bool manager_msg_proc(JWidget widget, JMessage msg)
|
|||||||
Shortcut* shortcut = get_keyboard_shortcut_for_tool(*it);
|
Shortcut* shortcut = get_keyboard_shortcut_for_tool(*it);
|
||||||
|
|
||||||
// Collect all tools with the pressed keyboard-shortcut
|
// Collect all tools with the pressed keyboard-shortcut
|
||||||
if (shortcut && shortcut->is_key_pressed(msg))
|
if (shortcut && shortcut->is_pressed(msg))
|
||||||
possibles.push_back(*it);
|
possibles.push_back(*it);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1197,6 +1255,12 @@ static bool manager_msg_proc(JWidget widget, JMessage msg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case Shortcut_EditorQuicktool: {
|
||||||
|
// Do nothing, it is used in the editor through the
|
||||||
|
// get_selected_quicktool() function.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -105,10 +105,12 @@ CheckBox* check_button_new(const char* text, int b1, int b2, int b3, int b4);
|
|||||||
|
|
||||||
JAccel add_keyboard_shortcut_to_execute_command(const char* shortcut, const char* command_name, Params* params);
|
JAccel add_keyboard_shortcut_to_execute_command(const char* shortcut, const char* command_name, Params* params);
|
||||||
JAccel add_keyboard_shortcut_to_change_tool(const char* shortcut, Tool* tool);
|
JAccel add_keyboard_shortcut_to_change_tool(const char* shortcut, Tool* tool);
|
||||||
|
JAccel add_keyboard_shortcut_to_quicktool(const char* shortcut, Tool* tool);
|
||||||
|
|
||||||
Command* get_command_from_key_message(JMessage msg);
|
Command* get_command_from_key_message(JMessage msg);
|
||||||
JAccel get_accel_to_execute_command(const char* command, Params* params = NULL);
|
JAccel get_accel_to_execute_command(const char* command, Params* params = NULL);
|
||||||
JAccel get_accel_to_change_tool(Tool* tool);
|
JAccel get_accel_to_change_tool(Tool* tool);
|
||||||
|
Tool* get_selected_quicktool();
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// Monitors
|
// Monitors
|
||||||
|
@ -113,6 +113,8 @@ static int load_root_menu()
|
|||||||
throw ase_exception("Error loading main menu from file:\n%s\nReinstall the application.",
|
throw ase_exception("Error loading main menu from file:\n%s\nReinstall the application.",
|
||||||
static_cast<const char*>(path));
|
static_cast<const char*>(path));
|
||||||
|
|
||||||
|
PRINTF("Main menu loaded.\n");
|
||||||
|
|
||||||
layer_popup_menu = load_menu_by_id(handle, "layer_popup");
|
layer_popup_menu = load_menu_by_id(handle, "layer_popup");
|
||||||
frame_popup_menu = load_menu_by_id(handle, "frame_popup");
|
frame_popup_menu = load_menu_by_id(handle, "frame_popup");
|
||||||
cel_popup_menu = load_menu_by_id(handle, "cel_popup");
|
cel_popup_menu = load_menu_by_id(handle, "cel_popup");
|
||||||
@ -190,7 +192,6 @@ static int load_root_menu()
|
|||||||
if (tool_id && tool_key) {
|
if (tool_id && tool_key) {
|
||||||
Tool* tool = App::instance()->getToolBox()->getToolById(tool_id);
|
Tool* tool = App::instance()->getToolBox()->getToolById(tool_id);
|
||||||
if (tool) {
|
if (tool) {
|
||||||
/* add the keyboard shortcut to the tool */
|
|
||||||
PRINTF(" - Shortcut for tool `%s': <%s>\n", tool_id, tool_key);
|
PRINTF(" - Shortcut for tool `%s': <%s>\n", tool_id, tool_key);
|
||||||
add_keyboard_shortcut_to_change_tool(tool_key, tool);
|
add_keyboard_shortcut_to_change_tool(tool_key, tool);
|
||||||
}
|
}
|
||||||
@ -199,6 +200,33 @@ static int load_root_menu()
|
|||||||
xmlKey = xmlKey->NextSiblingElement();
|
xmlKey = xmlKey->NextSiblingElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**************************************************/
|
||||||
|
/* load keyboard shortcuts for quicktools */
|
||||||
|
/**************************************************/
|
||||||
|
|
||||||
|
PRINTF(" - Loading tools keyboard shortcuts from \"%s\"...\n", path);
|
||||||
|
|
||||||
|
// <gui><keyboard><quicktools><key>
|
||||||
|
xmlKey = handle
|
||||||
|
.FirstChild("gui")
|
||||||
|
.FirstChild("keyboard")
|
||||||
|
.FirstChild("quicktools")
|
||||||
|
.FirstChild("key").ToElement();
|
||||||
|
while (xmlKey) {
|
||||||
|
const char* tool_id = xmlKey->Attribute("tool");
|
||||||
|
const char* tool_key = xmlKey->Attribute("shortcut");
|
||||||
|
|
||||||
|
if (tool_id && tool_key) {
|
||||||
|
Tool* tool = App::instance()->getToolBox()->getToolById(tool_id);
|
||||||
|
if (tool) {
|
||||||
|
PRINTF(" - Shortcut for quicktool `%s': <%s>\n", tool_id, tool_key);
|
||||||
|
add_keyboard_shortcut_to_quicktool(tool_key, tool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlKey = xmlKey->NextSiblingElement();
|
||||||
|
}
|
||||||
|
|
||||||
// Sets the "menu" of the "menu-bar" to the new "root-menu"
|
// Sets the "menu" of the "menu-bar" to the new "root-menu"
|
||||||
if (app_get_menubar()) {
|
if (app_get_menubar()) {
|
||||||
jmenubar_set_menu(app_get_menubar(), root_menu);
|
jmenubar_set_menu(app_get_menubar(), root_menu);
|
||||||
|
@ -89,9 +89,9 @@ class Editor : public Widget
|
|||||||
// True if the cursor is inside the mask/selection
|
// True if the cursor is inside the mask/selection
|
||||||
bool m_insideSelection : 1;
|
bool m_insideSelection : 1;
|
||||||
|
|
||||||
bool m_alt_pressed : 1;
|
// Current selected quicktool (this genererally should be NULL if
|
||||||
bool m_ctrl_pressed : 1;
|
// the user is not pressing any keyboard key).
|
||||||
bool m_space_pressed : 1;
|
Tool* m_quicktool;
|
||||||
|
|
||||||
/* offset for the sprite */
|
/* offset for the sprite */
|
||||||
int m_offset_x;
|
int m_offset_x;
|
||||||
@ -166,6 +166,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
void editor_update_statusbar_for_pixel_movement();
|
void editor_update_statusbar_for_pixel_movement();
|
||||||
|
void editor_update_quicktool();
|
||||||
|
|
||||||
void editor_draw_cursor(int x, int y, bool refresh = true);
|
void editor_draw_cursor(int x, int y, bool refresh = true);
|
||||||
void editor_move_cursor(int x, int y, bool refresh = true);
|
void editor_move_cursor(int x, int y, bool refresh = true);
|
||||||
|
@ -92,9 +92,8 @@ Editor::Editor()
|
|||||||
|
|
||||||
m_cursor_candraw = false;
|
m_cursor_candraw = false;
|
||||||
m_insideSelection = false;
|
m_insideSelection = false;
|
||||||
m_alt_pressed = false;
|
|
||||||
m_ctrl_pressed = false;
|
m_quicktool = NULL;
|
||||||
m_space_pressed = false;
|
|
||||||
|
|
||||||
m_offset_x = 0;
|
m_offset_x = 0;
|
||||||
m_offset_y = 0;
|
m_offset_y = 0;
|
||||||
@ -687,10 +686,12 @@ void Editor::dropPixels()
|
|||||||
|
|
||||||
Tool* Editor::getCurrentEditorTool()
|
Tool* Editor::getCurrentEditorTool()
|
||||||
{
|
{
|
||||||
|
if (m_quicktool)
|
||||||
|
return m_quicktool;
|
||||||
|
else {
|
||||||
UIContext* context = UIContext::instance();
|
UIContext* context = UIContext::instance();
|
||||||
Tool* current_tool = context->getSettings()->getCurrentTool();
|
return context->getSettings()->getCurrentTool();
|
||||||
|
}
|
||||||
return current_tool;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::screen_to_editor(int xin, int yin, int *xout, int *yout)
|
void Editor::screen_to_editor(int xin, int yin, int *xout, int *yout)
|
||||||
@ -747,9 +748,11 @@ void Editor::editor_update_statusbar_for_standby()
|
|||||||
int x, y;
|
int x, y;
|
||||||
screen_to_editor(jmouse_x(0), jmouse_y(0), &x, &y);
|
screen_to_editor(jmouse_x(0), jmouse_y(0), &x, &y);
|
||||||
|
|
||||||
|
if (!m_sprite) {
|
||||||
|
app_get_statusbar()->clearText();
|
||||||
|
}
|
||||||
// For eye-dropper
|
// For eye-dropper
|
||||||
if (m_alt_pressed ||
|
else if (current_tool->getInk(0)->isEyedropper()) {
|
||||||
current_tool->getInk(0)->isEyedropper()) {
|
|
||||||
int imgtype = m_sprite->getImgType();
|
int imgtype = m_sprite->getImgType();
|
||||||
ase_uint32 pixel = m_sprite->getPixel(x, y);
|
ase_uint32 pixel = m_sprite->getPixel(x, y);
|
||||||
Color color = Color::fromImage(imgtype, pixel);
|
Color color = Color::fromImage(imgtype, pixel);
|
||||||
@ -767,11 +770,13 @@ void Editor::editor_update_statusbar_for_standby()
|
|||||||
}
|
}
|
||||||
// For other tools
|
// For other tools
|
||||||
else {
|
else {
|
||||||
|
Mask* mask = m_sprite->getMask();
|
||||||
|
|
||||||
app_get_statusbar()->setStatusText
|
app_get_statusbar()->setStatusText
|
||||||
(0, "Pos %d %d, Size %d %d, Frame %d",
|
(0, "Pos %d %d, Size %d %d, Frame %d",
|
||||||
x, y,
|
x, y,
|
||||||
((m_sprite->getMask()->bitmap)? m_sprite->getMask()->w: m_sprite->getWidth()),
|
((mask && mask->bitmap)? mask->w: m_sprite->getWidth()),
|
||||||
((m_sprite->getMask()->bitmap)? m_sprite->getMask()->h: m_sprite->getHeight()),
|
((mask && mask->bitmap)? mask->h: m_sprite->getHeight()),
|
||||||
m_sprite->getCurrentFrame()+1);
|
m_sprite->getCurrentFrame()+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -787,6 +792,18 @@ void Editor::editor_update_statusbar_for_pixel_movement()
|
|||||||
bounds.x, bounds.y, bounds.w, bounds.h);
|
bounds.x, bounds.y, bounds.w, bounds.h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Editor::editor_update_quicktool()
|
||||||
|
{
|
||||||
|
Tool* old_quicktool = m_quicktool;
|
||||||
|
|
||||||
|
m_quicktool = get_selected_quicktool();
|
||||||
|
|
||||||
|
// If the tool has changed, we must to update the status bar because
|
||||||
|
// the new tool can display something different in the status bar (e.g. Eyedropper)
|
||||||
|
if (old_quicktool != m_quicktool)
|
||||||
|
editor_update_statusbar_for_standby();
|
||||||
|
}
|
||||||
|
|
||||||
void Editor::editor_refresh_region()
|
void Editor::editor_refresh_region()
|
||||||
{
|
{
|
||||||
if (this->update_region) {
|
if (this->update_region) {
|
||||||
@ -981,19 +998,11 @@ bool Editor::onProcessMessage(JMessage msg)
|
|||||||
// 'cursor_candraw' field to avoid a heavy if-condition in the
|
// 'cursor_candraw' field to avoid a heavy if-condition in the
|
||||||
// 'editor_setcursor' routine
|
// 'editor_setcursor' routine
|
||||||
editor_update_candraw();
|
editor_update_candraw();
|
||||||
|
editor_update_quicktool();
|
||||||
if (msg->any.shifts & KB_ALT_FLAG) m_alt_pressed = true;
|
|
||||||
if (msg->any.shifts & KB_CTRL_FLAG) m_ctrl_pressed = true;
|
|
||||||
if (key[KEY_SPACE]) m_space_pressed = true;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JM_MOUSELEAVE:
|
case JM_MOUSELEAVE:
|
||||||
hide_drawing_cursor();
|
hide_drawing_cursor();
|
||||||
|
|
||||||
if (m_alt_pressed) m_alt_pressed = false;
|
|
||||||
if (m_ctrl_pressed) m_ctrl_pressed = false;
|
|
||||||
if (m_space_pressed) m_space_pressed = false;
|
|
||||||
|
|
||||||
app_get_statusbar()->clearText();
|
app_get_statusbar()->clearText();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1036,7 +1045,6 @@ bool Editor::onProcessMessage(JMessage msg)
|
|||||||
|
|
||||||
// Start scroll loop
|
// Start scroll loop
|
||||||
if (msg->mouse.middle ||
|
if (msg->mouse.middle ||
|
||||||
m_space_pressed ||
|
|
||||||
current_tool->getInk(msg->mouse.right ? 1: 0)->isScrollMovement()) {
|
current_tool->getInk(msg->mouse.right ? 1: 0)->isScrollMovement()) {
|
||||||
m_state = EDITOR_STATE_SCROLLING;
|
m_state = EDITOR_STATE_SCROLLING;
|
||||||
|
|
||||||
@ -1064,9 +1072,7 @@ bool Editor::onProcessMessage(JMessage msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Move frames position
|
// Move frames position
|
||||||
if ((m_ctrl_pressed &&
|
if (current_tool->getInk(msg->mouse.right ? 1: 0)->isCelMovement()) {
|
||||||
!current_tool->getInk(msg->mouse.right ? 1: 0)->isSelection()) ||
|
|
||||||
current_tool->getInk(msg->mouse.right ? 1: 0)->isCelMovement()) {
|
|
||||||
if ((m_sprite->getCurrentLayer()) &&
|
if ((m_sprite->getCurrentLayer()) &&
|
||||||
(m_sprite->getCurrentLayer()->getType() == GFXOBJ_LAYER_IMAGE)) {
|
(m_sprite->getCurrentLayer()->getType() == GFXOBJ_LAYER_IMAGE)) {
|
||||||
// TODO you can move the `Background' with tiled mode
|
// TODO you can move the `Background' with tiled mode
|
||||||
@ -1106,7 +1112,7 @@ bool Editor::onProcessMessage(JMessage msg)
|
|||||||
delete tmpImage;
|
delete tmpImage;
|
||||||
|
|
||||||
// If the CTRL key is pressed start dragging a copy of the selection
|
// If the CTRL key is pressed start dragging a copy of the selection
|
||||||
if (m_ctrl_pressed)
|
if (key[KEY_LCONTROL] || key[KEY_RCONTROL]) // TODO configurable
|
||||||
m_pixelsMovement->copyMask();
|
m_pixelsMovement->copyMask();
|
||||||
else
|
else
|
||||||
m_pixelsMovement->cutMask();
|
m_pixelsMovement->cutMask();
|
||||||
@ -1124,8 +1130,7 @@ bool Editor::onProcessMessage(JMessage msg)
|
|||||||
captureMouse();
|
captureMouse();
|
||||||
}
|
}
|
||||||
// Call the eyedropper command
|
// Call the eyedropper command
|
||||||
else if (m_alt_pressed ||
|
else if (current_tool->getInk(msg->mouse.right ? 1: 0)->isEyedropper()) {
|
||||||
current_tool->getInk(msg->mouse.right ? 1: 0)->isEyedropper()) {
|
|
||||||
Command* eyedropper_cmd =
|
Command* eyedropper_cmd =
|
||||||
CommandsModule::instance()->get_command_by_name(CommandId::eyedropper);
|
CommandsModule::instance()->get_command_by_name(CommandId::eyedropper);
|
||||||
|
|
||||||
@ -1332,30 +1337,18 @@ bool Editor::onProcessMessage(JMessage msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this->hasMouse()) {
|
if (this->hasMouse()) {
|
||||||
switch (msg->key.scancode) {
|
editor_update_quicktool();
|
||||||
|
|
||||||
// Eye-dropper is activated with ALT key
|
if (msg->key.scancode == KEY_LCONTROL || // TODO configurable
|
||||||
case KEY_ALT:
|
msg->key.scancode == KEY_RCONTROL) {
|
||||||
m_alt_pressed = true;
|
|
||||||
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case KEY_LCONTROL:
|
|
||||||
case KEY_RCONTROL:
|
|
||||||
// If the user press the CTRL key when he is dragging pixels (but not pressing the mouse buttons)...
|
// If the user press the CTRL key when he is dragging pixels (but not pressing the mouse buttons)...
|
||||||
if (!m_ctrl_pressed && !jmouse_b(0) && m_pixelsMovement) {
|
if (!jmouse_b(0) && m_pixelsMovement) {
|
||||||
// Drop pixels (sure the user will press the mouse button to start dragging a copy)
|
// Drop pixels (sure the user will press the mouse button to start dragging a copy)
|
||||||
dropPixels();
|
dropPixels();
|
||||||
}
|
}
|
||||||
m_ctrl_pressed = true;
|
|
||||||
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case KEY_SPACE:
|
|
||||||
m_space_pressed = true;
|
|
||||||
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// When we are drawing, we "eat" all pressed keys
|
// When we are drawing, we "eat" all pressed keys
|
||||||
@ -1365,37 +1358,14 @@ bool Editor::onProcessMessage(JMessage msg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case JM_KEYRELEASED:
|
case JM_KEYRELEASED:
|
||||||
switch (msg->key.scancode) {
|
editor_update_quicktool();
|
||||||
|
|
||||||
// Eye-dropper is deactivated with ALT key
|
|
||||||
case KEY_ALT:
|
|
||||||
if (m_alt_pressed) {
|
|
||||||
m_alt_pressed = false;
|
|
||||||
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_LCONTROL:
|
case JM_FOCUSLEAVE:
|
||||||
case KEY_RCONTROL:
|
// As we use keys like Space-bar as modifier, we can clear the
|
||||||
if (m_ctrl_pressed) {
|
// keyboard buffer when we lost the focus.
|
||||||
m_ctrl_pressed = false;
|
|
||||||
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case KEY_SPACE:
|
|
||||||
if (m_space_pressed) {
|
|
||||||
// We have to clear all the KEY_SPACE in buffer
|
|
||||||
clear_keybuf();
|
clear_keybuf();
|
||||||
|
|
||||||
m_space_pressed = false;
|
|
||||||
editor_setcursor(jmouse_x(0), jmouse_y(0));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JM_WHEEL:
|
case JM_WHEEL:
|
||||||
@ -1627,23 +1597,6 @@ void Editor::editor_setcursor(int x, int y)
|
|||||||
jmouse_set_cursor(JI_CURSOR_FORBIDDEN);
|
jmouse_set_cursor(JI_CURSOR_FORBIDDEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Eyedropper
|
|
||||||
else if (m_alt_pressed) {
|
|
||||||
hide_drawing_cursor();
|
|
||||||
jmouse_set_cursor(JI_CURSOR_EYEDROPPER);
|
|
||||||
}
|
|
||||||
// Move layer
|
|
||||||
else if (m_ctrl_pressed &&
|
|
||||||
(!current_tool ||
|
|
||||||
!current_tool->getInk(0)->isSelection())) {
|
|
||||||
hide_drawing_cursor();
|
|
||||||
jmouse_set_cursor(JI_CURSOR_MOVE);
|
|
||||||
}
|
|
||||||
// Scroll
|
|
||||||
else if (m_space_pressed) {
|
|
||||||
hide_drawing_cursor();
|
|
||||||
jmouse_set_cursor(JI_CURSOR_SCROLL);
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
if (current_tool) {
|
if (current_tool) {
|
||||||
// If the current tool change selection (e.g. rectangular marquee, etc.)
|
// If the current tool change selection (e.g. rectangular marquee, etc.)
|
||||||
@ -1654,7 +1607,8 @@ void Editor::editor_setcursor(int x, int y)
|
|||||||
// Move pixels
|
// Move pixels
|
||||||
if (m_sprite->getMask()->contains_point(x, y)) {
|
if (m_sprite->getMask()->contains_point(x, y)) {
|
||||||
hide_drawing_cursor();
|
hide_drawing_cursor();
|
||||||
if (m_ctrl_pressed)
|
if (key[KEY_LCONTROL] ||
|
||||||
|
key[KEY_RCONTROL]) // TODO configurable keys
|
||||||
jmouse_set_cursor(JI_CURSOR_NORMAL_ADD);
|
jmouse_set_cursor(JI_CURSOR_NORMAL_ADD);
|
||||||
else
|
else
|
||||||
jmouse_set_cursor(JI_CURSOR_MOVE);
|
jmouse_set_cursor(JI_CURSOR_MOVE);
|
||||||
@ -1676,6 +1630,11 @@ void Editor::editor_setcursor(int x, int y)
|
|||||||
jmouse_set_cursor(JI_CURSOR_SCROLL);
|
jmouse_set_cursor(JI_CURSOR_SCROLL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (current_tool->getInk(0)->isCelMovement()) {
|
||||||
|
hide_drawing_cursor();
|
||||||
|
jmouse_set_cursor(JI_CURSOR_MOVE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_insideSelection) {
|
if (m_insideSelection) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user