X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fgroupactionmanager.cpp;fp=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fgroupactionmanager.cpp;h=ab2727cb4f2cbe3ef1c7ee4070d9935098ba38de;hb=3a3c4bca3a17137bec5d7960560934b91ef4146e;hp=0000000000000000000000000000000000000000;hpb=41257b650db1defb40ac20072ffeef70d5985f5e;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/groupactionmanager.cpp b/synfig-studio/trunk/src/gtkmm/groupactionmanager.cpp new file mode 100644 index 0000000..ab2727c --- /dev/null +++ b/synfig-studio/trunk/src/gtkmm/groupactionmanager.cpp @@ -0,0 +1,272 @@ +/* === S I N F G =========================================================== */ +/*! \file template.cpp +** \brief Template File +** +** $Id: groupactionmanager.cpp,v 1.1.1.1 2005/01/07 03:34:36 darco Exp $ +** +** \legal +** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** +** This software and associated documentation +** are CONFIDENTIAL and PROPRIETARY property of +** the above-mentioned copyright holder. +** +** You may not copy, print, publish, or in any +** other way distribute this software without +** a prior written agreement with +** the copyright holder. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "groupactionmanager.h" +#include "layergrouptree.h" +#include +#include "instance.h" +#include + +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace sinfg; +using namespace studio; + +static const guint no_prev_popup((guint)-1); + +/* === M A C R O S ========================================================= */ + +//#define ONE_ACTION_GROUP 1 + +/* === G L O B A L S ======================================================= */ + +/* === P R O C E D U R E S ================================================= */ + +/* === M E T H O D S ======================================================= */ + +GroupActionManager::GroupActionManager(): + action_group_(Gtk::ActionGroup::create()), + popup_id_(no_prev_popup), + queued(false) +{ +} + +GroupActionManager::~GroupActionManager() +{ +} + +void +GroupActionManager::set_ui_manager(const Glib::RefPtr &x) +{ + clear(); + +#ifdef ONE_ACTION_GROUP + if(ui_manager_) get_ui_manager()->remove_action_group(action_group_); + ui_manager_=x; + if(ui_manager_) get_ui_manager()->insert_action_group(action_group_); +#else + ui_manager_=x; +#endif +} + +void +GroupActionManager::set_group_tree(LayerGroupTree* x) +{ + selection_changed_connection.disconnect(); + group_tree_=x; + if(group_tree_) + { + selection_changed_connection=group_tree_->get_selection()->signal_changed().connect( + sigc::mem_fun(*this,&GroupActionManager::queue_refresh) + ); + } +} + +void +GroupActionManager::set_canvas_interface(const etl::handle &x) +{ + canvas_interface_=x; +} + +void +GroupActionManager::clear() +{ + if(ui_manager_) + { + // Clear out old stuff + if(popup_id_!=no_prev_popup) + { + get_ui_manager()->remove_ui(popup_id_); + popup_id_=no_prev_popup; + action_group_->set_sensitive(false); +#ifdef ONE_ACTION_GROUP + while(!action_group_->get_actions().empty())action_group_->remove(*action_group_->get_actions().begin()); + action_group_->set_sensitive(true); +#else + get_ui_manager()->remove_action_group(action_group_); + action_group_=Gtk::ActionGroup::create(); +#endif + } + } +} + +void +GroupActionManager::queue_refresh() +{ + if(queued) + return; + + //queue_refresh_connection.disconnect(); + queue_refresh_connection=Glib::signal_idle().connect( + sigc::bind_return( + sigc::mem_fun(*this,&GroupActionManager::refresh), + false + ) + ); + + queued=true; +} + +void +GroupActionManager::refresh() +{ + DEBUGPOINT(); + if(queued) + { + queued=false; + //queue_refresh_connection.disconnect(); + } + + + clear(); + + // Make sure we are ready + if(!ui_manager_ || !group_tree_ || !canvas_interface_) + { + sinfg::error("GroupActionManager::refresh(): Not ready!"); + return; + } + + if(group_tree_->get_selection()->count_selected_rows()==0) + return; + + String ui_info; + + { + { + action_group_->add( + Gtk::Action::create( + "action-group_add", + Gtk::Stock::ADD, + _("Add a New Group"), + _("Add a New Group") + ), + sigc::mem_fun( + *this, + &GroupActionManager::on_action_add + ) + ); + } + + +// bool multiple_selected(group_tree_->get_selection()->count_selected_rows()>1); + LayerGroupTree::LayerList selected_layers(group_tree_->get_selected_layers()); + std::list selected_groups(group_tree_->get_selected_groups()); + + sinfg::info("selected_layers.size()=%d",selected_layers.size()); + sinfg::info("selected_groups.size()=%d",selected_groups.size()); + + { + bool canvas_set(false); + sinfgapp::Action::ParamList param_list; + param_list.add("time",get_canvas_interface()->get_time()); + param_list.add("canvas_interface",get_canvas_interface()); + + { + LayerGroupTree::LayerList::iterator iter; + + for(iter=selected_layers.begin();iter!=selected_layers.end();++iter) + { + if(!canvas_set) + { + param_list.add("canvas",Canvas::Handle(Layer::Handle(*iter)->get_canvas())); + canvas_set=true; + } + param_list.add("layer",Layer::Handle(*iter)); + } + } + + { + std::list::iterator iter; + + for(iter=selected_groups.begin();iter!=selected_groups.end();++iter) + { + param_list.add("group",(sinfg::String)*iter); + } + } + + if(!canvas_set) + { + param_list.add("canvas",Canvas::Handle(get_canvas_interface()->get_canvas())); + canvas_set=true; + } + + handle::cast_static(get_canvas_interface()->get_instance())-> + add_actions_to_group(action_group_, ui_info, param_list, sinfgapp::Action::CATEGORY_GROUP); + } + } + + if(true) + { + ui_info=""+ui_info+""; + popup_id_=get_ui_manager()->add_ui_from_string(ui_info); + } + else + { + get_ui_manager()->ensure_update(); + } + +#ifdef ONE_ACTION_GROUP +#else + get_ui_manager()->insert_action_group(action_group_); +#endif +} + +void +GroupActionManager::on_action_add() +{ + LayerGroupTreeStore::Model model; + + String group_name; + + Gtk::TreeIter selected_iter; + + if(group_tree_->get_selection()->count_selected_rows()) + { + selected_iter=( + group_tree_->get_model()->get_iter( + (*group_tree_->get_selection()->get_selected_rows().begin()) + ) + ); + if(selected_iter && selected_iter->parent()) + group_name=(Glib::ustring)(*selected_iter->parent())[model.group_name]+'.'; + } + + group_name+=_("UnnamedGroup"); + + Gtk::TreePath path(group_tree_->get_model()->on_group_added(group_name)); + + group_tree_->expand_to_path(path); + group_tree_->set_cursor(path,true); +}