my log
[synfig.git] / synfig-studio / trunk / src / gtkmm / keyframetree.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file keyframetree.cpp
3 **      \brief Template File
4 **
5 **      $Id: keyframetree.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 "keyframetree.h"
32 #include "cellrenderer_time.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 KeyframeTree::KeyframeTree()
54 {
55         const KeyframeTreeStore::Model model;
56         
57         {
58                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Time")) );
59
60                 cell_renderer_time = Gtk::manage( new CellRenderer_Time() );
61                 column->pack_start(*cell_renderer_time,true);
62                 column->add_attribute(cell_renderer_time->property_time(), model.time);
63                 
64                 cell_renderer_time->signal_edited().connect(sigc::mem_fun(*this,&studio::KeyframeTree::on_edited_time));
65
66                 column->set_reorderable();
67                 column->set_resizable();
68                 column->set_clickable();
69                 //column->set_sort_column_id(COLUMNID_TIME);
70                 column->set_sort_column_id(model.time);
71
72                 append_column(*column);
73                 //column->clicked();
74         }
75         {
76                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Length")) );
77
78                 cell_renderer_time_delta = Gtk::manage( new CellRenderer_Time() );
79                 column->pack_start(*cell_renderer_time_delta,true);
80                 column->add_attribute(cell_renderer_time_delta->property_time(), model.time_delta);
81                 
82                 cell_renderer_time_delta->signal_edited().connect(sigc::mem_fun(*this,&studio::KeyframeTree::on_edited_time_delta));
83
84                 column->set_reorderable();
85                 column->set_resizable();
86
87                 column->set_sort_column_id(model.time_delta);
88
89                 column->set_clickable(false);
90
91                 append_column(*column);
92                 //column->clicked();
93         }
94         {
95                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Jump")) );
96
97                 Gtk::CellRendererText* cell_renderer_jump=Gtk::manage(new Gtk::CellRendererText());
98                 column->pack_start(*cell_renderer_jump,true);
99                 
100                 cell_renderer_jump->property_text()="(JMP)";
101                 cell_renderer_jump->property_foreground()="#003a7f";
102                 
103                 column->set_reorderable();
104                 column->set_resizable();
105                 
106                 column->set_sort_column_id(COLUMNID_JUMP);
107
108                 column->set_clickable(false);
109
110                 append_column(*column);
111                 //column->clicked();
112         }
113         //append_column_editable(_("Description"),model.description);
114         {
115                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Description")) );
116                 
117                 cell_renderer_description=Gtk::manage(new Gtk::CellRendererText());
118                 column->pack_start(*cell_renderer_description,true);
119                 column->add_attribute(cell_renderer_description->property_text(), model.description);
120                 cell_renderer_description->signal_edited().connect(sigc::mem_fun(*this,&studio::KeyframeTree::on_edited_description));
121
122                 column->set_reorderable();
123                 column->set_resizable();
124                 column->set_clickable();
125                 //column->set_sort_column_id(COLUMNID_DESCRIPTION);
126                 column->set_sort_column_id(model.description);
127
128                 append_column(*column);
129         }
130
131         set_enable_search(true);
132         set_search_column(model.description);
133
134         // This makes things easier to read.
135         set_rules_hint();
136                 
137         // Make us more sensitive to several events
138         add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
139 }
140
141 KeyframeTree::~KeyframeTree()
142 {
143         synfig::info("KeyframeTree::~KeyframeTree(): deleted");
144 }
145
146 void
147 KeyframeTree::on_rend_desc_changed()
148 {
149         cell_renderer_time->property_fps().set_value(keyframe_tree_store_->canvas_interface()->get_canvas()->rend_desc().get_frame_rate());
150         queue_draw();
151 }
152
153 void
154 KeyframeTree::set_model(Glib::RefPtr<KeyframeTreeStore> keyframe_tree_store)
155 {
156         keyframe_tree_store_=keyframe_tree_store;
157         KeyframeTreeStore::Model model;
158         
159         if(true)
160         {
161                 Glib::RefPtr<Gtk::TreeModelSort> sorted_store(Gtk::TreeModelSort::create(keyframe_tree_store_));
162                 sorted_store->set_default_sort_func(sigc::ptr_fun(&studio::KeyframeTreeStore::time_sorter));
163                 sorted_store->set_sort_func(model.time.index(),sigc::ptr_fun(&studio::KeyframeTreeStore::time_sorter));
164                 sorted_store->set_sort_column_id(model.time.index(), Gtk::SORT_ASCENDING);
165                 Gtk::TreeView::set_model(sorted_store);
166         }
167         else
168                 Gtk::TreeView::set_model(keyframe_tree_store);
169         
170         keyframe_tree_store_->canvas_interface()->signal_rend_desc_changed().connect(
171                 sigc::mem_fun(
172                         *this,
173                         &studio::KeyframeTree::on_rend_desc_changed
174                 )
175         );
176         cell_renderer_time->property_fps().set_value(keyframe_tree_store_->canvas_interface()->get_canvas()->rend_desc().get_frame_rate());
177         cell_renderer_time_delta->property_fps().set_value(keyframe_tree_store_->canvas_interface()->get_canvas()->rend_desc().get_frame_rate());
178 }
179
180 void
181 KeyframeTree::set_editable(bool x)
182 {
183         editable_=x;
184         
185         if(editable_)
186         {
187                 cell_renderer_time->property_editable()=true;
188                 cell_renderer_time_delta->property_editable()=true;
189                 cell_renderer_description->property_editable()=true;
190         }
191         else
192         {
193                 cell_renderer_time->property_editable()=false;
194                 cell_renderer_time_delta->property_editable()=false;
195                 cell_renderer_description->property_editable()=false;
196         }
197 }
198
199 void
200 KeyframeTree::on_edited_time(const Glib::ustring&path_string,synfig::Time time)
201 {
202         Gtk::TreePath path(path_string);
203         
204         const Gtk::TreeRow row(*(get_model()->get_iter(path)));
205         
206         synfig::Keyframe keyframe(row[model.keyframe]);
207         if(time!=keyframe.get_time())
208         {
209                 row[model.time]=time;
210                 //keyframe.set_time(time);
211                 //signal_edited_time()(keyframe,time);
212                 //signal_edited()(keyframe);
213         }
214 }
215
216 void
217 KeyframeTree::on_edited_time_delta(const Glib::ustring&path_string,synfig::Time time)
218 {
219         Gtk::TreePath path(path_string);
220         
221         const Gtk::TreeRow row(*(get_model()->get_iter(path)));
222         
223         if(row)row[model.time_delta]=time;
224 }
225
226 void
227 KeyframeTree::on_edited_description(const Glib::ustring&path_string,const Glib::ustring &desc)
228 {
229         Gtk::TreePath path(path_string);
230         
231         const Gtk::TreeRow row = *(get_model()->get_iter(path));
232         
233         const synfig::String description(desc);
234         synfig::Keyframe keyframe(row[model.keyframe]);
235         if(description!=keyframe.get_description())
236         {
237                 row[model.description]=desc;
238                 keyframe.set_description(description);
239                 signal_edited_description()(keyframe,description);
240                 signal_edited()(keyframe);
241         }
242 }
243
244 bool
245 KeyframeTree::on_event(GdkEvent *event)
246 {
247     switch(event->type)
248     {
249         case GDK_BUTTON_PRESS:
250                 {
251                         Gtk::TreeModel::Path path;
252                         Gtk::TreeViewColumn *column;
253                         int cell_x, cell_y;
254                         int wx(round_to_int(event->button.x)),wy(round_to_int(event->button.y));
255                         //tree_to_widget_coords (,, wx, wy);
256                         if(!get_path_at_pos(
257                                 wx,wy,  // x, y
258                                 path, // TreeModel::Path&
259                                 column, //TreeViewColumn*&
260                                 cell_x,cell_y //int&cell_x,int&cell_y
261                                 )
262                         ) break;
263                         const Gtk::TreeRow row = *(get_model()->get_iter(path));
264                         
265                         signal_user_click()(event->button.button,row,(ColumnID)column->get_sort_column_id());
266                         if((ColumnID)column->get_sort_column_id()==COLUMNID_JUMP)
267                         {
268                                 keyframe_tree_store_->canvas_interface()->set_time(row[model.time]);
269                         }
270                 }
271                 break;
272         case GDK_2BUTTON_PRESS:
273                 {
274                         Gtk::TreeModel::Path path;
275                         Gtk::TreeViewColumn *column;
276                         int cell_x, cell_y;
277                         if(!get_path_at_pos(
278                                 int(event->button.x),int(event->button.y),      // x, y
279                                 path, // TreeModel::Path&
280                                 column, //TreeViewColumn*&
281                                 cell_x,cell_y //int&cell_x,int&cell_y
282                                 )
283                         ) break;
284                         const Gtk::TreeRow row = *(get_model()->get_iter(path));
285                         
286                         {
287                                 keyframe_tree_store_->canvas_interface()->set_time(row[model.time]);
288                                 return true;
289                         }
290                 }
291                 break;
292                 
293         case GDK_BUTTON_RELEASE:
294                 break;
295         default:
296                 break;
297         }
298         return false;
299 }