diff --git a/synfig-studio/src/gui/docks/dock_layers.cpp b/synfig-studio/src/gui/docks/dock_layers.cpp index fbe89f9..9c502b2 100644 --- a/synfig-studio/src/gui/docks/dock_layers.cpp +++ b/synfig-studio/src/gui/docks/dock_layers.cpp @@ -131,6 +131,10 @@ Dock_Layers::Dock_Layers(): + layer_ui_info + ""; App::ui_manager()->add_ui_from_string(ui_info); + ui_info = "" + + layer_ui_info + + ""; + App::ui_manager()->add_ui_from_string(ui_info); } catch(Glib::MarkupError& x) { @@ -144,11 +148,18 @@ Dock_Layers::Dock_Layers(): action_group_layer_ops->add(layer_action_manager->get_action_select_all_child_layers()); action_group_layer_ops->add( Gtk::Action::create("toolbar-layer", _("Layer Ops")) ); + + action_new_layer = Gtk::Action::create("popup-layer-new", Gtk::StockID("gtk-add"), _("New Layer"), _("New Layer")); + action_new_layer->signal_activate().connect(sigc::mem_fun(*this, &Dock_Layers::popup_add_layer_menu)); + + action_group_layer_ops->add( action_new_layer ); App::ui_manager()->insert_action_group(action_group_layer_ops); Glib::ustring ui_info = "" " " + " " + " " " " " " " " @@ -198,6 +209,13 @@ Dock_Layers::init_canvas_view_vfunc(etl::loose_handle canvas_view) sigc::bind(sigc::mem_fun(*canvas_view->canvas_interface(), &synfigapp::CanvasInterface::change_value), false) ) ); + layer_tree->signal_no_layer_user_click().connect([=](GdkEventButton *ev){ + if (ev->button == 3 && action_new_layer->is_sensitive()) { + popup_add_layer_menu(); + return true; + } + return false; + }); // (a) should be before (b), (b) should be before (c) canvas_view->set_ext_widget(get_name()+"_cmp",layer_tree); // (a) @@ -232,6 +250,7 @@ Dock_Layers::changed_canvas_view_vfunc(etl::loose_handle canvas_view add(*tree_view); tree_view->show(); action_group_new_layers->set_sensitive(true); + action_new_layer->set_sensitive(true); if(layer_action_manager) { layer_action_manager->set_layer_tree(dynamic_cast(canvas_view->get_ext_widget(get_name()+"_cmp"))); @@ -242,6 +261,7 @@ Dock_Layers::changed_canvas_view_vfunc(etl::loose_handle canvas_view else { action_group_new_layers->set_sensitive(false); + action_new_layer->set_sensitive(false); if(layer_action_manager) { layer_action_manager->clear(); @@ -260,3 +280,12 @@ Dock_Layers::add_layer(synfig::String id) canvas_view->add_layer(id); } } + +void Dock_Layers::popup_add_layer_menu() +{ + if (!action_new_layer->is_sensitive()) + return; + Gtk::Menu* menu = dynamic_cast(App::ui_manager()->get_widget("/popup-layer-new")); + if (menu) + menu->popup(0, gtk_get_current_event_time()); +} diff --git a/synfig-studio/src/gui/docks/dock_layers.h b/synfig-studio/src/gui/docks/dock_layers.h index 0f00f92..6e7c21c 100644 --- a/synfig-studio/src/gui/docks/dock_layers.h +++ b/synfig-studio/src/gui/docks/dock_layers.h @@ -51,6 +51,8 @@ class Dock_Layers : public Dock_CanvasSpecific Glib::RefPtr action_group_new_layers; Glib::RefPtr action_group_layer_ops; + Glib::RefPtr action_new_layer; + Gtk::HScale *layer_amount_hscale; LayerActionManager* layer_action_manager; @@ -62,8 +64,7 @@ protected: private: void add_layer(synfig::String id); - void increase_amount(); - void decrease_amount(); + void popup_add_layer_menu(); public: diff --git a/synfig-studio/src/gui/trees/layertree.cpp b/synfig-studio/src/gui/trees/layertree.cpp index 271e70a..15bbe5d 100644 --- a/synfig-studio/src/gui/trees/layertree.cpp +++ b/synfig-studio/src/gui/trees/layertree.cpp @@ -903,7 +903,8 @@ LayerTree::on_layer_tree_event(GdkEvent *event) column, //TreeViewColumn*& cell_x,cell_y //int&cell_x,int&cell_y ) - ) break; + ) + return signal_no_layer_user_click()(reinterpret_cast(event)); const Gtk::TreeRow row = *(get_layer_tree_view().get_model()->get_iter(path)); #ifdef TIMETRACK_IN_PARAMS_PANEL diff --git a/synfig-studio/src/gui/trees/layertree.h b/synfig-studio/src/gui/trees/layertree.h index a560408..c18db5d 100644 --- a/synfig-studio/src/gui/trees/layertree.h +++ b/synfig-studio/src/gui/trees/layertree.h @@ -138,6 +138,7 @@ private: sigc::signal signal_edited_value_; sigc::signal signal_layer_user_click_; + sigc::signal signal_no_layer_user_click_; sigc::signal signal_param_user_click_; @@ -255,6 +256,8 @@ public: sigc::signal& signal_layer_user_click() { return signal_layer_user_click_; } + sigc::signal& signal_no_layer_user_click() { return signal_no_layer_user_click_; } + sigc::signal& signal_param_user_click() { return signal_param_user_click_; } sigc::signal >,int>& signal_waypoint_clicked_layertree() { return signal_waypoint_clicked_layertree_; }