X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fgtkmm%2Fstate_normal.cpp;h=7eea7026dd109ce36e24d905df20c124a6df099a;hb=a5a93271c52a9b4b5eebb8f324d7a2c68f8732be;hp=e9667cc82d2468cc15405cac4f11f98ac18355f2;hpb=a18c0930ba463fdec054b46c6dad17a5ddb48605;p=synfig.git diff --git a/synfig-studio/src/gtkmm/state_normal.cpp b/synfig-studio/src/gtkmm/state_normal.cpp index e9667cc..7eea702 100644 --- a/synfig-studio/src/gtkmm/state_normal.cpp +++ b/synfig-studio/src/gtkmm/state_normal.cpp @@ -115,30 +115,22 @@ class studio::StateNormal_Context : public sigc::trackable synfigapp::Settings& settings; - sigc::connection keypress_connect; - sigc::connection keyrelease_connect; - etl::handle duck_dragger_; Gtk::Table options_table; - Gtk::CheckButton checkbutton_rotate; - Gtk::CheckButton checkbutton_scale; - Gtk::CheckButton checkbutton_constrain; - public: - bool get_rotate_flag()const { return checkbutton_rotate.get_active(); } - void set_rotate_flag(bool x) { checkbutton_rotate.set_active(x); refresh_rotate_flag(); } - void refresh_rotate_flag() { if(duck_dragger_)duck_dragger_->rotate=get_rotate_flag(); } + bool get_rotate_flag()const { if(duck_dragger_) return duck_dragger_->rotate; else return false; } + void set_rotate_flag(bool x) { if(duck_dragger_ && x!=duck_dragger_->rotate) duck_dragger_->rotate=x; } + + bool get_scale_flag()const { if(duck_dragger_) return duck_dragger_->scale; else return false; } + void set_scale_flag(bool x) { if(duck_dragger_ && x!=duck_dragger_->scale) duck_dragger_->scale=x; } - bool get_scale_flag()const { return checkbutton_scale.get_active(); } - void set_scale_flag(bool x) { checkbutton_scale.set_active(x); refresh_scale_flag(); } - void refresh_scale_flag() { if(duck_dragger_)duck_dragger_->scale=get_scale_flag(); } + bool get_constrain_flag()const { if(duck_dragger_) return duck_dragger_->constrain; else return false; } + void set_constrain_flag(bool x) { if(duck_dragger_ && x!=duck_dragger_->constrain) duck_dragger_->constrain=x; } - bool get_constrain_flag()const { return checkbutton_constrain.get_active(); } - void set_constrain_flag(bool x) { checkbutton_constrain.set_active(x); refresh_constrain_flag(); } - void refresh_constrain_flag() { if(duck_dragger_)duck_dragger_->constrain=get_constrain_flag(); } + void refresh_cursor(); StateNormal_Context(CanvasView* canvas_view); @@ -152,9 +144,6 @@ public: void load_settings(); void save_settings(); - bool key_pressed(GdkEventKey *event); - bool key_released(GdkEventKey *event); - Smach::event_result event_stop_handler(const Smach::event& x); Smach::event_result event_refresh_handler(const Smach::event& x); Smach::event_result event_refresh_ducks_handler(const Smach::event& x); @@ -162,6 +151,7 @@ public: Smach::event_result event_redo_handler(const Smach::event& x); Smach::event_result event_mouse_button_down_handler(const Smach::event& x); Smach::event_result event_multiple_ducks_clicked_handler(const Smach::event& x); + Smach::event_result event_mouse_motion_handler(const Smach::event& x); Smach::event_result event_refresh_tool_options(const Smach::event& x); void refresh_tool_options(); Smach::event_result event_layer_click(const Smach::event& x); @@ -182,6 +172,8 @@ StateNormal::StateNormal(): insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DOWN,&StateNormal_Context::event_mouse_button_down_handler)); insert(event_def(EVENT_WORKAREA_MULTIPLE_DUCKS_CLICKED,&StateNormal_Context::event_multiple_ducks_clicked_handler)); insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateNormal_Context::event_refresh_tool_options)); + insert(event_def(EVENT_WORKAREA_MOUSE_MOTION, &StateNormal_Context::event_mouse_motion_handler)); + insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DRAG, &StateNormal_Context::event_mouse_motion_handler)); insert(event_def(EVENT_WORKAREA_LAYER_CLICKED,&StateNormal_Context::event_layer_click)); } @@ -190,6 +182,46 @@ StateNormal::~StateNormal() { } +void StateNormal_Context::refresh_cursor() +{ + // Check the current state and return when applicable + synfig::String sname; + sname=get_canvas_view()->get_smach().get_state_name(); + if (sname=="smooth_move"||sname=="zoom"||sname=="width" || + sname=="text"||sname=="stroke"||sname=="star"||sname=="sketch"|| + sname=="scale"||sname=="zoom"||sname=="rotate"||sname=="rectangle"|| + sname=="polygon"||sname=="gradient"||sname=="fill"||sname=="draw"|| + sname=="circle") + return; + + // Change the cursor based on key flags + if(get_rotate_flag() && !get_scale_flag()) + { + get_work_area()->set_cursor(Gdk::EXCHANGE); + return; + } + if(!get_rotate_flag() && get_scale_flag()) + { + get_work_area()->set_cursor(Gdk::SIZING); + return; + } + if(get_rotate_flag() && get_scale_flag()) + { + get_work_area()->set_cursor(Gdk::CROSSHAIR); + return; + } + // If we are in BLine state and there is not key pressed return to + // the bline cursor. + if (sname=="bline") + { + get_work_area()->set_cursor(Gdk::CROSSHAIR); + return; + } + // Default cursor for Transform tool + get_work_area()->set_cursor(Gdk::ARROW); + +} + void StateNormal_Context::load_settings() { @@ -223,23 +255,15 @@ StateNormal_Context::save_settings() StateNormal_Context::StateNormal_Context(CanvasView* canvas_view): canvas_view_(canvas_view), settings(synfigapp::Main::get_selected_input_device()->settings()), - duck_dragger_(new DuckDrag_Combo()), - checkbutton_rotate(_("Rotate (Ctrl)")), - checkbutton_scale(_("Scale (Alt)")), - checkbutton_constrain(_("Constrain (Shift)")) + duck_dragger_(new DuckDrag_Combo()) { duck_dragger_->canvas_view_=get_canvas_view(); // Set up the tool options dialog options_table.attach(*manage(new Gtk::Label(_("Transform Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_rotate, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_scale, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_constrain, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - - checkbutton_rotate.signal_toggled().connect(sigc::mem_fun(*this,&StateNormal_Context::refresh_rotate_flag)); - checkbutton_scale.signal_toggled().connect(sigc::mem_fun(*this,&StateNormal_Context::refresh_scale_flag)); - checkbutton_constrain.signal_toggled().connect(sigc::mem_fun(*this,&StateNormal_Context::refresh_constrain_flag)); - + options_table.attach(*manage(new Gtk::Label(_("Ctrl to rotate"), Gtk::ALIGN_LEFT)), 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(*manage(new Gtk::Label(_("Alt to scale"), Gtk::ALIGN_LEFT)), 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(*manage(new Gtk::Label(_("Shift to constrain"), Gtk::ALIGN_LEFT)), 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); options_table.show_all(); refresh_tool_options(); @@ -249,9 +273,6 @@ StateNormal_Context::StateNormal_Context(CanvasView* canvas_view): get_work_area()->set_allow_layer_clicks(true); get_work_area()->set_duck_dragger(duck_dragger_); - keypress_connect=get_work_area()->signal_key_press_event().connect(sigc::mem_fun(*this,&StateNormal_Context::key_pressed),false); - keyrelease_connect=get_work_area()->signal_key_release_event().connect(sigc::mem_fun(*this,&StateNormal_Context::key_released),false); - //these will segfault // get_work_area()->set_cursor(Gdk::CROSSHAIR); // get_work_area()->reset_cursor(); @@ -259,53 +280,6 @@ StateNormal_Context::StateNormal_Context(CanvasView* canvas_view): App::toolbox->refresh(); load_settings(); - refresh_scale_flag(); -} - -bool -StateNormal_Context::key_pressed(GdkEventKey *event) -{ - switch(event->keyval) - { - case GDK_Control_L: - case GDK_Control_R: - set_rotate_flag(true); - break; - case GDK_Alt_L: - case GDK_Alt_R: - set_scale_flag(true); - break; - case GDK_Shift_L: - case GDK_Shift_R: - set_constrain_flag(true); - break; - default: - break; - } - return false; //Pass on the event to other handlers, just in case -} - -bool -StateNormal_Context::key_released(GdkEventKey *event) -{ - switch(event->keyval) - { - case GDK_Control_L: - case GDK_Control_R: - set_rotate_flag(false); - break; - case GDK_Alt_L: - case GDK_Alt_R: - set_scale_flag(false); - break; - case GDK_Shift_L: - case GDK_Shift_R: - set_constrain_flag(false); - break; - default: - break; - } - return false; //Pass on the event to other handlers } void @@ -326,9 +300,6 @@ StateNormal_Context::~StateNormal_Context() get_work_area()->clear_duck_dragger(); get_work_area()->reset_cursor(); - keypress_connect.disconnect(); - keyrelease_connect.disconnect(); - App::dialog_tool_options->clear(); App::toolbox->refresh(); @@ -602,6 +573,20 @@ StateNormal_Context::event_mouse_button_down_handler(const Smach::event& x) } Smach::event_result +StateNormal_Context::event_mouse_motion_handler(const Smach::event& x) +{ + // synfig::info("STATE NORMAL: Received mouse button down Event"); + + const EventMouse& event(*reinterpret_cast(&x)); + + set_rotate_flag(event.modifier&GDK_CONTROL_MASK); + set_scale_flag(event.modifier&GDK_MOD1_MASK); + set_constrain_flag(event.modifier&GDK_SHIFT_MASK); + + return Smach::RESULT_OK; +} + +Smach::event_result StateNormal_Context::event_layer_click(const Smach::event& x) { const EventLayerClick& event(*reinterpret_cast(&x));