1 /* === S Y N F I G ========================================================= */
2 /*! \file dockmanager.cpp
3 ** \brief Template File
5 ** $Id: dockmanager.cpp,v 1.2 2005/01/12 07:03:42 darco Exp $
8 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
10 ** This software and associated documentation
11 ** are CONFIDENTIAL and PROPRIETARY property of
12 ** the above-mentioned copyright holder.
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.
20 /* ========================================================================= */
22 /* === H E A D E R S ======================================================= */
31 #include "dockmanager.h"
34 #include "dockdialog.h"
35 #include <synfigapp/settings.h>
36 #include <synfigapp/main.h>
37 #include <gdkmm/general.h>
41 /* === U S I N G =========================================================== */
45 using namespace synfig;
46 using namespace studio;
48 /* === M A C R O S ========================================================= */
50 /* === P R O C E D U R E S ================================================= */
52 class studio::DockSettings : public synfigapp::Settings
54 DockManager* dock_manager;
57 DockSettings(DockManager* dock_manager):dock_manager(dock_manager)
59 synfigapp::Main::settings().add_domain(this,"dock");
62 virtual ~DockSettings()
64 synfigapp::Main::settings().remove_domain("dock");
66 #define SCALE_FACTOR (1280)
67 virtual bool get_value(const synfig::String& key_, synfig::String& value)const
69 int screen_w(Gdk::screen_width());
70 int screen_h(Gdk::screen_height());
72 if(key_.size()>6 && String(key_.begin(),key_.begin()+6)=="dialog")try
74 synfig::String key(key_.begin()+7,key_.end());
75 int separator=key.find_first_of('.');
76 int id(atoi(synfig::String(key.begin(),key.begin()+separator).c_str()));
77 key=synfig::String(key.begin()+separator+1,key.end());
79 DockDialog& dock_dialog(dock_manager->find_dock_dialog(id));
81 if(key=="contents_size")
83 dock_dialog.rebuild_sizes();
84 vector<int>::const_iterator iter(dock_dialog.get_dock_book_sizes().begin());
85 vector<int>::const_iterator end(dock_dialog.get_dock_book_sizes().end());
87 for(;iter!=end;++iter)
88 value+=strprintf("%d ",(*iter)*SCALE_FACTOR/screen_h);
93 int x,y; dock_dialog.get_position(x,y);
94 value=strprintf("%d %d",x*SCALE_FACTOR/screen_w,y*SCALE_FACTOR/screen_h);
99 int x,y; dock_dialog.get_size(x,y);
100 value=strprintf("%d %d",x*SCALE_FACTOR/screen_w,y*SCALE_FACTOR/screen_h);
105 value=dock_dialog.get_contents();
108 if(key=="comp_selector")
110 value=dock_dialog.get_composition_selector()?"1":"0";
113 }catch (...) { return false; }
114 return synfigapp::Settings::get_value(key_,value);
117 virtual bool set_value(const synfig::String& key_,const synfig::String& value)
119 int screen_w(Gdk::screen_width());
120 int screen_h(Gdk::screen_height());
122 if(key_.size()>6 && String(key_.begin(),key_.begin()+6)=="dialog")
124 synfig::String key(key_.begin()+7,key_.end());
125 int separator=key.find_first_of('.');
126 int id(atoi(synfig::String(key.begin(),key.begin()+separator).c_str()));
127 key=synfig::String(key.begin()+separator+1,key.end());
129 DockDialog& dock_dialog(dock_manager->find_dock_dialog(id));
131 if(key=="contents_size")
137 String value_(value);
138 while(value_.size() && (signed)value_.size()>n && n>=0){
139 value_=String(value_.begin()+n,value_.end());
141 if(!strscanf(value_,"%d",&size))
143 size=size*screen_h/SCALE_FACTOR;
144 data.push_back(size);
147 if((unsigned)n!=String::npos)
151 dock_dialog.set_dock_book_sizes(data);
155 synfig::error("Exception caught!!!");
163 if(!strscanf(value,"%d %d",&x, &y))
165 x=x*screen_w/SCALE_FACTOR;
166 y=y*screen_h/SCALE_FACTOR;
167 dock_dialog.move(x,y);
173 if(!strscanf(value,"%d %d",&x, &y))
175 x=x*screen_w/SCALE_FACTOR;
176 y=y*screen_h/SCALE_FACTOR;
177 dock_dialog.set_default_size(x,y);
178 dock_dialog.resize(x,y);
183 dock_dialog.set_contents(value);
186 if(key=="comp_selector")
188 if(value.empty() || value[0]=='0')
189 dock_dialog.set_composition_selector(false);
191 dock_dialog.set_composition_selector(true);
195 return synfigapp::Settings::set_value(key_,value);
198 virtual KeyList get_key_list()const
200 synfigapp::Settings::KeyList ret(synfigapp::Settings::get_key_list());
202 std::list<DockDialog*>::const_iterator iter;
203 for(iter=dock_manager->dock_dialog_list_.begin();iter!=dock_manager->dock_dialog_list_.end();++iter)
205 ret.push_back(strprintf("dialog.%d.contents",(*iter)->get_id()));
206 ret.push_back(strprintf("dialog.%d.comp_selector",(*iter)->get_id()));
207 ret.push_back(strprintf("dialog.%d.pos",(*iter)->get_id()));
208 ret.push_back(strprintf("dialog.%d.size",(*iter)->get_id()));
209 ret.push_back(strprintf("dialog.%d.contents_size",(*iter)->get_id()));
215 /* === M E T H O D S ======================================================= */
217 DockManager::DockManager():
218 dock_settings(new DockSettings(this))
222 DockManager::~DockManager()
224 while(!dock_dialog_list_.empty())
226 dock_dialog_list_.back()->close();
228 while(!dockable_list_.empty())
230 Dockable* dockable(dockable_list_.back());
231 synfig::info("DockManager::~DockManager(): Deleting dockable \"%s\"",dockable->get_name().c_str());
232 dockable_list_.pop_back();
238 DockManager::register_dockable(Dockable& x)
240 dockable_list_.push_back(&x);
241 synfig::info("DockManager::register_dockable(): Registered dockable \"%s\"",dockable_list_.back()->get_name().c_str());
242 signal_dockable_registered()(&x);
246 DockManager::unregister_dockable(Dockable& x)
248 std::list<Dockable*>::iterator iter;
249 for(iter=dockable_list_.begin();iter!=dockable_list_.end();++iter)
254 dockable_list_.erase(iter);
255 synfig::info("DockManager::unregister_dockable(): \"%s\" has been Unregistered",x.get_name().c_str());
263 DockManager::find_dockable(const synfig::String& x)
265 std::list<Dockable*>::iterator iter;
266 for(iter=dockable_list_.begin();iter!=dockable_list_.end();++iter)
267 if((*iter)->get_name()==x)
270 throw std::runtime_error("DockManager::find_dockable(): not found");
274 DockManager::present(synfig::String x)
278 find_dockable(x).present();
286 DockManager::find_dock_dialog(int id)
288 std::list<DockDialog*>::iterator iter;
289 for(iter=dock_dialog_list_.begin();iter!=dock_dialog_list_.end();++iter)
290 if((*iter)->get_id()==id)
293 DockDialog* dock_dialog(new DockDialog());
294 dock_dialog->set_id(id);
300 DockManager::find_dock_dialog(int id)const
302 std::list<DockDialog*>::const_iterator iter;
303 for(iter=dock_dialog_list_.begin();iter!=dock_dialog_list_.end();++iter)
304 if((*iter)->get_id()==id)
307 throw std::runtime_error("DockManager::find_dock_dialog(int id)const: not found");