X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftags%2Fstable%2Fsrc%2Fgtkmm%2Fdockmanager.cpp;h=8a5198ca22c6f684b2e8e553ff05cc35062163d0;hb=47fce282611fbba1044921d22ca887f9b53ad91a;hp=503aba2dc5d8af0fd49ea8352656ffc8bd2585fb;hpb=7c6d5426922cb3cda793f688dcd4d534b02765c8;p=synfig.git diff --git a/synfig-studio/tags/stable/src/gtkmm/dockmanager.cpp b/synfig-studio/tags/stable/src/gtkmm/dockmanager.cpp index 503aba2..8a5198c 100644 --- a/synfig-studio/tags/stable/src/gtkmm/dockmanager.cpp +++ b/synfig-studio/tags/stable/src/gtkmm/dockmanager.cpp @@ -1,20 +1,22 @@ -/* === S I N F G =========================================================== */ +/* === S Y N F I G ========================================================= */ /*! \file dockmanager.cpp ** \brief Template File ** -** $Id: dockmanager.cpp,v 1.2 2005/01/12 07:03:42 darco Exp $ +** $Id$ ** ** \legal -** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. ** \endlegal */ /* ========================================================================= */ @@ -32,52 +34,54 @@ #include #include "dockable.h" #include "dockdialog.h" -#include -#include +#include +#include #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ using namespace std; using namespace etl; -using namespace sinfg; +using namespace synfig; using namespace studio; /* === M A C R O S ========================================================= */ /* === P R O C E D U R E S ================================================= */ -class studio::DockSettings : public sinfgapp::Settings +class studio::DockSettings : public synfigapp::Settings { DockManager* dock_manager; - + public: DockSettings(DockManager* dock_manager):dock_manager(dock_manager) { - sinfgapp::Main::settings().add_domain(this,"dock"); + synfigapp::Main::settings().add_domain(this,"dock"); } - + virtual ~DockSettings() { - sinfgapp::Main::settings().remove_domain("dock"); + synfigapp::Main::settings().remove_domain("dock"); } #define SCALE_FACTOR (1280) - virtual bool get_value(const sinfg::String& key_, sinfg::String& value)const + virtual bool get_value(const synfig::String& key_, synfig::String& value)const { int screen_w(Gdk::screen_width()); int screen_h(Gdk::screen_height()); - + if(key_.size()>6 && String(key_.begin(),key_.begin()+6)=="dialog")try { - sinfg::String key(key_.begin()+7,key_.end()); - int separator=key.find_first_of('.'); - int id(atoi(sinfg::String(key.begin(),key.begin()+separator).c_str())); - key=sinfg::String(key.begin()+separator+1,key.end()); - + synfig::String key(key_.begin()+7,key_.end()); + synfig::String::size_type separator=key.find_first_of('.'); + int id(atoi(synfig::String(key.begin(),key.begin()+separator).c_str())); + key=synfig::String(key.begin()+separator+1,key.end()); + DockDialog& dock_dialog(dock_manager->find_dock_dialog(id)); - + if(key=="contents_size") { dock_dialog.rebuild_sizes(); @@ -111,48 +115,56 @@ public: return true; } }catch (...) { return false; } - return sinfgapp::Settings::get_value(key_,value); + return synfigapp::Settings::get_value(key_,value); } - virtual bool set_value(const sinfg::String& key_,const sinfg::String& value) + virtual bool set_value(const synfig::String& key_,const synfig::String& value) { int screen_w(Gdk::screen_width()); int screen_h(Gdk::screen_height()); if(key_.size()>6 && String(key_.begin(),key_.begin()+6)=="dialog") { - sinfg::String key(key_.begin()+7,key_.end()); - int separator=key.find_first_of('.'); - int id(atoi(sinfg::String(key.begin(),key.begin()+separator).c_str())); - key=sinfg::String(key.begin()+separator+1,key.end()); - + synfig::String key(key_.begin()+7,key_.end()); + synfig::String::size_type separator=key.find_first_of('.'); + int id(atoi(synfig::String(key.begin(),key.begin()+separator).c_str())); + key=synfig::String(key.begin()+separator+1,key.end()); + DockDialog& dock_dialog(dock_manager->find_dock_dialog(id)); if(key=="contents_size") { try { - + int width, height; + Gtk::IconSize::lookup(Gtk::IconSize(4),width,height); vector data; - int n=0; + String::size_type n=0; String value_(value); - while(value_.size() && (signed)value_.size()>n && n>=0){ + while(value_.size() && value_.size()>n){ value_=String(value_.begin()+n,value_.end()); int size; if(!strscanf(value_,"%d",&size)) break; + if (size > SCALE_FACTOR) size = SCALE_FACTOR - 150; + if (size < 0) size = 0; size=size*screen_h/SCALE_FACTOR; + + // prevent errors like this, by allowing space for at least the dockable's icon: + // ** CRITICAL **: clearlooks_style_draw_box_gap: assertion `height >= -1' failed + if (size < height + 9) size = height + 9; + data.push_back(size); n=value_.find(" "); - if((unsigned)n!=String::npos) - n++; - + if(n==String::npos) + break; + n++; } dock_dialog.set_dock_book_sizes(data); } catch(...) { - sinfg::error("Exception caught!!!"); + synfig::error("Exception caught!!!"); return false; } return true; @@ -162,8 +174,14 @@ public: int x,y; if(!strscanf(value,"%d %d",&x, &y)) return false; + if (x > SCALE_FACTOR) x = SCALE_FACTOR - 150; if (x < 0) x = 0; + if (y > SCALE_FACTOR) y = SCALE_FACTOR - 150; if (y < 0) y = 0; x=x*screen_w/SCALE_FACTOR; y=y*screen_h/SCALE_FACTOR; + if(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET")) + x += atoi(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET")); + if(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET")) + y += atoi(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET")); dock_dialog.move(x,y); return true; } @@ -172,6 +190,8 @@ public: int x,y; if(!strscanf(value,"%d %d",&x, &y)) return false; + if (x > SCALE_FACTOR) x = 150; if (x < 0) x = 0; + if (y > SCALE_FACTOR) y = 150; if (y < 0) y = 0; x=x*screen_w/SCALE_FACTOR; y=y*screen_h/SCALE_FACTOR; dock_dialog.set_default_size(x,y); @@ -192,12 +212,12 @@ public: return true; } } - return sinfgapp::Settings::set_value(key_,value); + return synfigapp::Settings::set_value(key_,value); } - + virtual KeyList get_key_list()const { - sinfgapp::Settings::KeyList ret(sinfgapp::Settings::get_key_list()); + synfigapp::Settings::KeyList ret(synfigapp::Settings::get_key_list()); std::list::const_iterator iter; for(iter=dock_manager->dock_dialog_list_.begin();iter!=dock_manager->dock_dialog_list_.end();++iter) @@ -228,8 +248,8 @@ DockManager::~DockManager() while(!dockable_list_.empty()) { Dockable* dockable(dockable_list_.back()); - sinfg::info("DockManager::~DockManager(): Deleting dockable \"%s\"",dockable->get_name().c_str()); - dockable_list_.pop_back(); + // synfig::info("DockManager::~DockManager(): Deleting dockable \"%s\"",dockable->get_name().c_str()); + dockable_list_.pop_back(); delete dockable; } } @@ -238,7 +258,7 @@ void DockManager::register_dockable(Dockable& x) { dockable_list_.push_back(&x); - sinfg::info("DockManager::register_dockable(): Registered dockable \"%s\"",dockable_list_.back()->get_name().c_str()); + // synfig::info("DockManager::register_dockable(): Registered dockable \"%s\"",dockable_list_.back()->get_name().c_str()); signal_dockable_registered()(&x); } @@ -252,7 +272,7 @@ DockManager::unregister_dockable(Dockable& x) { x.detach(); dockable_list_.erase(iter); - sinfg::info("DockManager::unregister_dockable(): \"%s\" has been Unregistered",x.get_name().c_str()); + synfig::info("DockManager::unregister_dockable(): \"%s\" has been Unregistered",x.get_name().c_str()); return true; } } @@ -260,18 +280,18 @@ DockManager::unregister_dockable(Dockable& x) } Dockable& -DockManager::find_dockable(const sinfg::String& x) +DockManager::find_dockable(const synfig::String& x) { std::list::iterator iter; for(iter=dockable_list_.begin();iter!=dockable_list_.end();++iter) if((*iter)->get_name()==x) return **iter; - + throw std::runtime_error("DockManager::find_dockable(): not found"); } void -DockManager::present(sinfg::String x) +DockManager::present(synfig::String x) { try { @@ -303,6 +323,6 @@ DockManager::find_dock_dialog(int id)const for(iter=dock_dialog_list_.begin();iter!=dock_dialog_list_.end();++iter) if((*iter)->get_id()==id) return **iter; - + throw std::runtime_error("DockManager::find_dock_dialog(int id)const: not found"); }