my log
[synfig.git] / synfig-studio / trunk / src / gtkmm / layergrouptree.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file layergrouptree.cpp
3 **      \brief Template File
4 **
5 **      $Id: layergrouptree.cpp,v 1.1.1.1 2005/01/07 03:34:36 darco Exp $
6 **
7 **      \legal
8 **      Copyright (c) 2002 Robert B. Quattlebaum Jr.
9 **
10 **      This software and associated documentation
11 **      are CONFIDENTIAL and PROPRIETARY property of
12 **      the above-mentioned copyright holder.
13 **
14 **      You may not copy, print, publish, or in any
15 **      other way distribute this software without
16 **      a prior written agreement with
17 **      the copyright holder.
18 **      \endlegal
19 */
20 /* ========================================================================= */
21
22 /* === H E A D E R S ======================================================= */
23
24 #ifdef USING_PCH
25 #       include "pch.h"
26 #else
27 #ifdef HAVE_CONFIG_H
28 #       include <config.h>
29 #endif
30
31 #include <synfig/layer.h>
32 #include "layergrouptree.h"
33 #include <gtkmm/treemodelsort.h>
34 #include <ETL/misc>
35
36 #endif
37
38 /* === U S I N G =========================================================== */
39
40 using namespace std;
41 using namespace etl;
42 using namespace synfig;
43 using namespace studio;
44
45 /* === M A C R O S ========================================================= */
46
47 /* === G L O B A L S ======================================================= */
48
49 /* === P R O C E D U R E S ================================================= */
50
51 /* === M E T H O D S ======================================================= */
52
53 LayerGroupTree::LayerGroupTree()
54 {
55         const LayerGroupTreeStore::Model model;
56
57         
58         {       // --- O N / O F F ----------------------------------------------------
59                 int index;
60                 index=append_column_editable(_(" "),model.active);
61                 //Gtk::TreeView::Column* column = get_column(index-1);
62         }
63         {       // --- I C O N --------------------------------------------------------
64                 int index;
65                 index=append_column(_(" "),model.icon);
66                 Gtk::TreeView::Column* column = get_column(index-1);
67                 set_expander_column(*column);
68         }
69         {       // --- N A M E --------------------------------------------------------
70                 int index;
71                 index=append_column_editable(_("Name"),model.label);
72                 label_column = get_column(index-1);
73
74                 //column->set_sort_column_id(layer_model.index);
75
76                 //set_expander_column(*column);
77                 //column->set_reorderable();
78                 //column->set_resizable();
79                 //column->set_clickable(false);
80                 
81                 //Gtk::CellRendererPixbuf* icon_cellrenderer = Gtk::manage( new Gtk::CellRendererPixbuf() );
82                 //column->pack_start(*icon_cellrenderer,false);
83                 //column->add_attribute(icon_cellrenderer->property_pixbuf(), layer_model.icon);
84         }
85
86         set_enable_search(true);
87         set_search_column(model.label);
88         set_search_equal_func(sigc::ptr_fun(&studio::LayerGroupTreeStore::search_func));
89
90         // This makes things easier to read.
91         set_rules_hint();
92                 
93         // Make us more sensitive to several events
94         add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::BUTTON1_MOTION_MASK | Gdk::BUTTON2_MOTION_MASK|Gdk::POINTER_MOTION_MASK);
95
96         set_reorderable(true);
97
98         get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
99
100         //set_flags(get_flags()|Gtk::RECEIVES_DEFAULT|Gtk::HAS_GRAB);
101
102         //std::list<Gtk::TargetEntry> listTargets;
103         //listTargets.push_back( Gtk::TargetEntry("LAYER") );
104         //listTargets.push_back( Gtk::TargetEntry("GROUP") );
105         //drag_dest_set(listTargets);
106 }
107
108 LayerGroupTree::~LayerGroupTree()
109 {
110         synfig::info("LayerGroupTree::~LayerGroupTree(): deleted");
111 }
112
113 void
114 LayerGroupTree::set_model(Glib::RefPtr<LayerGroupTreeStore> layer_group_tree_store)
115 {
116         layer_group_tree_store_=layer_group_tree_store;
117         LayerGroupTreeStore::Model model;
118         
119 #if 0
120         {
121                 Glib::RefPtr<Gtk::TreeModelSort> sorted_store(Gtk::TreeModelSort::create(layer_group_tree_store_));
122                 sorted_store->set_default_sort_func(sigc::ptr_fun(&studio::LayerGroupTreeStore::time_sorter));
123                 sorted_store->set_sort_func(model.time.index(),sigc::ptr_fun(&studio::LayerGroupTreeStore::time_sorter));
124                 sorted_store->set_sort_column_id(model.time.index(), Gtk::SORT_ASCENDING);
125                 Gtk::TreeView::set_model(sorted_store);
126         }
127 #else
128                 Gtk::TreeView::set_model(layer_group_tree_store);
129 #endif
130 }
131
132 void
133 LayerGroupTree::set_editable(bool x)
134 {
135         editable_=x;
136 /*      
137         if(editable_)
138         {
139                 cell_renderer_time->property_editable()=true;
140                 cell_renderer_time_delta->property_editable()=true;
141                 cell_renderer_description->property_editable()=true;
142         }
143         else
144         {
145                 cell_renderer_time->property_editable()=false;
146                 cell_renderer_time_delta->property_editable()=false;
147                 cell_renderer_description->property_editable()=false;
148         }
149 */
150 }
151 /*
152 void
153 LayerGroupTree::on_edited_time(const Glib::ustring&path_string,synfig::Time time)
154 {
155         Gtk::TreePath path(path_string);
156         
157         const Gtk::TreeRow row(*(get_model()->get_iter(path)));
158         
159         synfig::Keyframe keyframe(row[model.keyframe]);
160         if(time!=keyframe.get_time())
161         {
162                 row[model.time]=time;
163                 //keyframe.set_time(time);
164                 //signal_edited_time()(keyframe,time);
165                 //signal_edited()(keyframe);
166         }
167 }
168
169 void
170 LayerGroupTree::on_edited_time_delta(const Glib::ustring&path_string,synfig::Time time)
171 {
172         Gtk::TreePath path(path_string);
173         
174         const Gtk::TreeRow row(*(get_model()->get_iter(path)));
175         
176         if(row)row[model.time_delta]=time;
177 }
178
179 void
180 LayerGroupTree::on_edited_description(const Glib::ustring&path_string,const Glib::ustring &desc)
181 {
182         Gtk::TreePath path(path_string);
183         
184         const Gtk::TreeRow row = *(get_model()->get_iter(path));
185         
186         const synfig::String description(desc);
187         synfig::Keyframe keyframe(row[model.keyframe]);
188         if(description!=keyframe.get_description())
189         {
190                 row[model.description]=desc;
191                 keyframe.set_description(description);
192                 signal_edited_description()(keyframe,description);
193                 signal_edited()(keyframe);
194         }
195 }
196 */
197
198 bool
199 LayerGroupTree::on_event(GdkEvent *event)
200 {
201     switch(event->type)
202     {
203         case GDK_BUTTON_PRESS:
204                 {
205                         Gtk::TreeModel::Path path;
206                         Gtk::TreeViewColumn *column;
207                         int cell_x, cell_y;
208                         int wx(round_to_int(event->button.x)),wy(round_to_int(event->button.y));
209                         //tree_to_widget_coords (,, wx, wy);
210                         if(!get_path_at_pos(
211                                 wx,wy,  // x, y
212                                 path, // TreeModel::Path&
213                                 column, //TreeViewColumn*&
214                                 cell_x,cell_y //int&cell_x,int&cell_y
215                                 )
216                         ) break;
217                         const Gtk::TreeRow row = *(get_model()->get_iter(path));
218
219                         if(row[model.is_layer] && event->button.button==3)
220                         {
221                                 signal_popup_layer_menu()((Layer::Handle)row[model.layer]);
222                                 return true;
223                         }
224                         
225                         /*signal_user_click()(event->button.button,row,(ColumnID)column->get_sort_column_id());
226                         if((ColumnID)column->get_sort_column_id()==COLUMNID_JUMP)
227                         {
228                                 layer_group_tree_store_->canvas_interface()->set_time(row[model.time]);
229                         }*/
230                 }
231                 break;
232         case GDK_2BUTTON_PRESS:
233                 {
234                         Gtk::TreeModel::Path path;
235                         Gtk::TreeViewColumn *column;
236                         int cell_x, cell_y;
237                         if(!get_path_at_pos(
238                                 int(event->button.x),int(event->button.y),      // x, y
239                                 path, // TreeModel::Path&
240                                 column, //TreeViewColumn*&
241                                 cell_x,cell_y //int&cell_x,int&cell_y
242                                 )
243                         ) break;
244                         const Gtk::TreeRow row = *(get_model()->get_iter(path));
245                         
246                         LayerList layer_list(row[model.all_layers]);
247                         if(!layer_list.empty())
248                         {
249                                 if(!(event->button.state&GDK_CONTROL_MASK))
250                                 {
251                                         layer_group_tree_store_->canvas_interface()->get_selection_manager()->clear_selected_layers();
252                                 }
253                                 layer_group_tree_store_->canvas_interface()->get_selection_manager()->set_selected_layers(layer_list);
254                                 return true;
255                         }
256                 }
257                 break;
258         case GDK_BUTTON_RELEASE:
259                 break;
260         default:
261                 break;
262         }
263         return Gtk::TreeView::on_event(event);
264         //return false;
265 }
266
267 static inline void __group_grabber(const Gtk::TreeModel::iterator& iter, std::list<synfig::String>* ret)
268 {
269         const LayerGroupTreeStore::Model model;
270         if((bool)(*iter)[model.is_group])
271                 ret->push_back((Glib::ustring)(*iter)[model.group_name]);
272 }
273
274 std::list<synfig::String>
275 LayerGroupTree::get_selected_groups()const
276 {
277         Glib::RefPtr<Gtk::TreeSelection> selection=const_cast<LayerGroupTree&>(*this).get_selection();
278
279         if(!selection)
280                 return std::list<synfig::String>();
281
282         std::list<synfig::String> ret;
283
284         selection->selected_foreach_iter(
285                 sigc::bind(
286                         sigc::ptr_fun(
287                                 &__group_grabber
288                         ),
289                         &ret
290                 )
291         );
292
293         return ret;
294 }
295
296 static inline void __layer_grabber(const Gtk::TreeModel::iterator& iter, LayerGroupTree::LayerList* ret)
297 {
298         const LayerGroupTreeStore::Model model;
299         if((bool)(*iter)[model.is_layer])
300                 ret->push_back((Layer::Handle)(*iter)[model.layer]);
301 }
302
303 LayerGroupTree::LayerList
304 LayerGroupTree::get_selected_layers()const
305 {
306         Glib::RefPtr<Gtk::TreeSelection> selection=const_cast<LayerGroupTree&>(*this).get_selection();
307
308         if(!selection)
309                 return LayerList();
310
311         LayerList ret;
312
313         selection->selected_foreach_iter(
314                 sigc::bind(
315                         sigc::ptr_fun(
316                                 &__layer_grabber
317                         ),
318                         &ret
319                 )
320         );
321
322         return ret;
323 }
324
325 void
326 LayerGroupTree::set_cursor(const Gtk::TreeModel::Path& path, bool start_editing)
327 {
328         Gtk::TreeView::set_cursor(path, *label_column, start_editing);
329 }