grab stable branch
[synfig.git] / synfig-studio / tags / stable / src / gtkmm / metadatatreestore.cpp
1 /* === S I N F G =========================================================== */
2 /*!     \file metadatatreestore.cpp
3 **      \brief Template File
4 **
5 **      $Id: metadatatreestore.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 "metadatatreestore.h"
32 #include <sinfgapp/canvasinterface.h>
33
34 #endif
35
36 /* === U S I N G =========================================================== */
37
38 using namespace std;
39 using namespace etl;
40 using namespace sinfg;
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 static MetaDataTreeStore::Model& ModelHack()
52 {
53         static MetaDataTreeStore::Model* model(0);
54         if(!model)model=new MetaDataTreeStore::Model;
55         return *model;
56 }
57
58 MetaDataTreeStore::MetaDataTreeStore(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_):
59         Gtk::TreeStore  (ModelHack()),
60         canvas_interface_               (canvas_interface_)
61 {
62         // Connect the signal
63         get_canvas()->signal_meta_data_changed().connect(sigc::mem_fun(*this,&MetaDataTreeStore::meta_data_changed));
64         
65         rebuild();
66 }
67
68 MetaDataTreeStore::~MetaDataTreeStore()
69 {
70         sinfg::info("MetaDataTreeStore::~MetaDataTreeStore(): Deleted");
71
72 }
73
74 Glib::RefPtr<MetaDataTreeStore>
75 MetaDataTreeStore::create(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_)
76 {
77         return Glib::RefPtr<MetaDataTreeStore>(new MetaDataTreeStore(canvas_interface_));
78 }
79
80 void
81 MetaDataTreeStore::meta_data_changed(sinfg::String key)
82 {
83         rebuild();
84 }
85
86 void
87 MetaDataTreeStore::rebuild()
88 {
89         clear();
90         
91         std::list<String> keys(get_canvas()->get_meta_data_keys());
92         
93         for(;!keys.empty();keys.pop_front())
94         {
95                 Gtk::TreeRow row(*append());
96                 row[model.key]=keys.front();
97         }
98 }
99
100 void
101 MetaDataTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int column, Glib::ValueBase& value)const
102 {
103         if(column>=get_n_columns_vfunc())
104         {
105                 g_warning("KeyframeTreeStore::set_value_impl: Bad column (%d)",column);
106                 return;
107         }
108
109         if(column==model.data.index())
110         {
111                 sinfg::String key((Glib::ustring)(*iter)[model.key]);
112                 g_value_init(value.gobj(),G_TYPE_STRING);
113                 g_value_set_string(value.gobj(),get_canvas()->get_meta_data(key).c_str());
114                 return;
115         }
116         else
117                 Gtk::TreeStore::get_value_vfunc(iter,column,value);
118 }
119
120 void
121 MetaDataTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, const Glib::ValueBase& value)
122 {
123         if(column>=get_n_columns_vfunc())
124         {
125                 g_warning("KeyframeTreeStore::set_value_impl: Bad column (%d)",column);
126                 return;
127         }
128
129         if(!g_value_type_compatible(G_VALUE_TYPE(value.gobj()),get_column_type_vfunc(column)))
130         {
131                 g_warning("KeyframeTreeStore::set_value_impl: Bad value type");
132                 return;
133         }
134
135         if(column==model.data.index())
136         {
137                 Glib::Value<Glib::ustring> x;
138                 g_value_init(x.gobj(),model.data.type());
139                 g_value_copy(value.gobj(),x.gobj());
140                 
141                 sinfg::String key((Glib::ustring)(*iter)[model.key]);
142                 sinfg::String new_data(x.get());
143                 
144                 get_canvas_interface()->set_meta_data(key,new_data);
145         }
146         else
147                 Gtk::TreeStore::set_value_impl(iter,column, value);
148 }