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_; }