my log
[synfig.git] / synfig-studio / trunk / src / gtkmm / dock_canvases.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file dialog_history.cpp
3 **      \brief Template File
4 **
5 **      $Id: dock_canvases.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 "dock_canvases.h"
32 #include "app.h"
33 #include "canvasview.h"
34 #endif
35
36 /* === U S I N G =========================================================== */
37
38 using namespace std;
39 using namespace etl;
40 using namespace synfig;
41 using namespace studio;
42
43 /* === M A C R O S ========================================================= */
44
45 /* === G L O B A L S ======================================================= */
46
47 /* === P R O C E D U R E S ================================================= */
48
49 /* === M E T H O D S ======================================================= */
50
51 Dock_Canvases::Dock_Canvases():
52         Dockable("canvases",_("Canvas Browser"),Gtk::StockID("synfig-canvas"))
53 {
54
55         App::signal_instance_created().connect(sigc::mem_fun(*this,&studio::Dock_Canvases::new_instance));
56         App::signal_instance_deleted().connect(sigc::mem_fun(*this,&studio::Dock_Canvases::delete_instance));
57         App::signal_instance_selected().connect(sigc::mem_fun(*this,&studio::Dock_Canvases::set_selected_instance_signal));
58
59         
60         add(*create_canvas_tree());
61
62 /*
63         add_button(
64                 Gtk::StockID("synfig-canvas_new"),
65                 _("Insert a new canvas")
66         )->signal_clicked().connect(
67                 sigc::mem_fun(
68                         *this,
69                         &Dock_Canvases::menu_new_canvas
70                 )
71         );
72
73         add_button(
74                 Gtk::StockID("gtk-delete"),
75                 _("Remove selected canvas")
76         )->signal_clicked().connect(
77                 sigc::mem_fun(
78                         *this,
79                         &Dock_Canvases::menu_delete
80                 )
81         );
82
83         add_button(
84                 Gtk::StockID("synfig-rename"),
85                 _("Rename selected canvas")
86         )->signal_clicked().connect(
87                 sigc::mem_fun(
88                         *this,
89                         &Dock_Canvases::menu_rename
90                 )
91         );
92         */
93 }
94
95 Dock_Canvases::~Dock_Canvases()
96 {
97 }
98
99 Gtk::Widget*
100 Dock_Canvases::create_canvas_tree()
101 {
102         studio::Instance::CanvasTreeModel canvas_tree_model;
103         canvas_tree=manage(new class Gtk::TreeView());
104         {
105                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column("ID") );
106 //              Gtk::CellRendererPixbuf* icon_cellrenderer = Gtk::manage( new Gtk::CellRendererPixbuf() );
107
108                 //column->pack_start(*icon_cellrenderer,false);
109                 column->pack_start(canvas_tree_model.icon, false); //false = don't expand.
110                 column->pack_start(canvas_tree_model.label);
111
112 //#ifdef NDEBUG
113 //              column->add_attribute(icon_cellrenderer->property_pixbuf(), canvas_tree_model.icon);
114 //#endif
115                 
116                 canvas_tree->append_column(*column);
117         }
118         canvas_tree->set_rules_hint();
119         canvas_tree->signal_row_activated().connect(sigc::mem_fun(*this,&Dock_Canvases::on_row_activate));
120         //canvas_tree->signal_event().connect(sigc::mem_fun(*this,&Dock_Canvases::on_tree_event));
121         canvas_tree->add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
122         canvas_tree->add_events(Gdk::BUTTON1_MOTION_MASK);
123         canvas_tree->show();
124         canvas_tree->set_headers_visible(false);
125         
126         Gtk::ScrolledWindow *scrolledwindow = manage(new class Gtk::ScrolledWindow());
127         scrolledwindow->set_flags(Gtk::CAN_FOCUS);
128         scrolledwindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
129         scrolledwindow->add(*canvas_tree);
130         scrolledwindow->set_shadow_type(Gtk::SHADOW_ETCHED_IN);
131         scrolledwindow->show_all();
132
133         return scrolledwindow;
134 }
135
136 etl::loose_handle<studio::CanvasView>
137 Dock_Canvases::get_selected_canvas_view()
138 {
139         return get_selected_instance()->find_canvas_view(get_selected_canvas());
140 }
141
142 etl::loose_handle<synfig::Canvas>
143 Dock_Canvases::get_selected_canvas()
144 {
145         Glib::RefPtr<Gtk::TreeSelection> selection=canvas_tree->get_selection();
146
147         if(!selection || !selection->get_selected())
148                 return 0;
149
150         studio::Instance::CanvasTreeModel canvas_tree_model;
151
152         return static_cast<etl::handle<synfig::Canvas> >((*selection->get_selected())[canvas_tree_model.canvas]);
153 }
154
155
156
157 void
158 Dock_Canvases::set_selected_instance_signal(etl::handle<studio::Instance> x)
159 {
160         set_selected_instance(x);
161 }
162
163 void
164 Dock_Canvases::set_selected_instance_(etl::handle<studio::Instance> instance)
165 {
166         if(studio::App::shutdown_in_progress)
167                 return;
168
169         selected_instance=instance;
170         if(instance)
171         {
172                 canvas_tree->set_model(instance->canvas_tree_store());
173                 canvas_tree->show();
174         }
175         else
176         {
177                 canvas_tree->set_model(Glib::RefPtr< Gtk::TreeModel >());
178                 canvas_tree->hide();
179         }
180 }
181
182 void
183 Dock_Canvases::set_selected_instance(etl::loose_handle<studio::Instance> x)
184 {
185         if(studio::App::shutdown_in_progress)
186                 return;
187
188         // if it's already selected, don't select it again
189         if (x==selected_instance)
190                 return;
191
192         set_selected_instance_(x);      
193 }
194
195 void
196 Dock_Canvases::new_instance(etl::handle<studio::Instance> instance)
197 {
198         if(studio::App::shutdown_in_progress)
199                 return;
200         
201         assert(instance);
202         
203         etl::loose_handle<studio::Instance> loose_instance(instance);
204         
205         instance->synfigapp::Instance::signal_filename_changed().connect(sigc::mem_fun(*this,&Dock_Canvases::refresh_instances));
206         instance->synfigapp::Instance::signal_filename_changed().connect(
207                 sigc::bind<etl::loose_handle<studio::Instance> >(
208                         sigc::mem_fun(*this,&Dock_Canvases::set_selected_instance),
209                         loose_instance
210                 )
211         );
212         
213         present();
214         
215 }
216
217 void
218 Dock_Canvases::delete_instance(etl::handle<studio::Instance> instance)
219 {
220         if(studio::App::shutdown_in_progress)
221                 return;
222
223         refresh_instances();
224
225         if(selected_instance==instance)
226         {
227                 set_selected_instance(0);
228         }
229 }
230
231 void
232 Dock_Canvases::refresh_instances()
233 {
234         if(studio::App::shutdown_in_progress)
235                 return;
236 }
237
238 void
239 Dock_Canvases::on_row_activate(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn *)
240 {
241         assert(get_selected_instance());
242         studio::Instance::CanvasTreeModel canvas_tree_model;
243         const Gtk::TreeRow row = *(get_selected_instance()->canvas_tree_store()->get_iter(path));
244         if(row[canvas_tree_model.is_canvas])
245                 get_selected_instance()->focus(row[canvas_tree_model.canvas]);
246         else
247                 studio::App::dialog_not_implemented();
248 }