From e462a2e9e6c29d48dfc4cfe3c1ba55e1e728e32f Mon Sep 17 00:00:00 2001 From: dooglus Date: Sat, 23 Feb 2008 01:25:55 +0000 Subject: [PATCH] Checked in a patch from Gerald Young (Yoyobuae) to save and restore the state (with canvases are open, and their position and size) for each of the recent files. git-svn-id: http://svn.voria.com/code@1802 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-studio/trunk/src/gtkmm/app.cpp | 166 ++++++++++++++++++++++++++++- synfig-studio/trunk/src/gtkmm/app.h | 4 +- synfig-studio/trunk/src/gtkmm/instance.cpp | 5 +- 3 files changed, 170 insertions(+), 5 deletions(-) diff --git a/synfig-studio/trunk/src/gtkmm/app.cpp b/synfig-studio/trunk/src/gtkmm/app.cpp index 762e46a..69aa237 100644 --- a/synfig-studio/trunk/src/gtkmm/app.cpp +++ b/synfig-studio/trunk/src/gtkmm/app.cpp @@ -51,6 +51,8 @@ #include +#include + #include #include @@ -203,6 +205,8 @@ App::signal_instance_deleted() { return signal_instance_deleted_; } static std::list recent_files; const std::list& App::get_recent_files() { return recent_files; } +static std::list recent_files_window_size; + int App::Busy::count; bool App::shutdown_in_progress; @@ -1331,8 +1335,109 @@ App::get_config_file(const synfig::String& file) return Glib::build_filename(get_user_app_directory(),file); } +#define SCALE_FACTOR (1280) +//! set the \a instance's canvas(es) position and size to be those specified in the first entry of recent_files_window_size void -App::add_recent_file(const std::string &file_name) +App::set_recent_file_window_size(etl::handle instance) +{ + int screen_w(Gdk::screen_width()); + int screen_h(Gdk::screen_height()); + + const std::string &canvas_window_size = *recent_files_window_size.begin(); + + if(canvas_window_size.empty()) + return; + + synfig::String::size_type current=0; + + while(current != synfig::String::npos) + { + // find end of first field (canvas) or return + synfig::String::size_type separator = canvas_window_size.find_first_of(' ', current); + if(separator == synfig::String::npos) return; + + // find the canvas + synfig::Canvas::Handle canvas; + try { + canvas = instance->get_canvas()->find_canvas(String(canvas_window_size, current, separator-current)); + } + catch(Exception::IDNotFound) { + // can't find the canvas; skip to the next canvas or return + separator = canvas_window_size.find_first_of('\t', current); + if(separator == synfig::String::npos) return; + current = separator+1; + continue; + } + + CanvasView::Handle canvasview = instance->find_canvas_view(canvas); + canvasview->present(); + + // check that we have the tab character the ends this canvas' data or return + current = separator+1; + separator = canvas_window_size.find_first_of('\t', current); + if(separator == synfig::String::npos) return; + + int x,y,w,h; + if(!strscanf(String(canvas_window_size, current, separator-current),"%d %d %d %d",&x, &y, &w, &h)) + { + current = separator+1; + continue; + } + + 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")); + canvasview->move(x,y); + + if (w > SCALE_FACTOR) w = 150; if (w < 0) w = 0; + if (h > SCALE_FACTOR) h = 150; if (h < 0) h = 0; + w=w*screen_w/SCALE_FACTOR; + h=h*screen_h/SCALE_FACTOR; + canvasview->set_default_size(w,h); + canvasview->set_size_request(w,h); + + current = separator+1; + } +} + +void +App::add_recent_file(const etl::handle instance) +{ + int screen_w(Gdk::screen_width()); + int screen_h(Gdk::screen_height()); + + std::string canvas_window_size; + + const Instance::CanvasViewList& cview_list = instance->canvas_view_list(); + Instance::CanvasViewList::const_iterator iter; + + for(iter=cview_list.begin();iter!=cview_list.end();iter++) + { + if( !((*iter)->is_visible()) ) + continue; + + etl::handle canvas = (*iter)->get_canvas(); + int x_pos, y_pos, x_size, y_size; + (*iter)->get_position(x_pos,y_pos); + (*iter)->get_size(x_size,y_size); + + canvas_window_size += strprintf("%s %d %d %d %d\t", + canvas->get_relative_id(canvas->get_root()).c_str(), + x_pos*SCALE_FACTOR/screen_w, y_pos*SCALE_FACTOR/screen_h, + x_size*SCALE_FACTOR/screen_w, y_size*SCALE_FACTOR/screen_h); + } + + add_recent_file(absolute_path(instance->get_file_name()), canvas_window_size); +} +#undef SCALE_FACTOR + +void +App::add_recent_file(const std::string &file_name, const std::string &window_size) { std::string filename(file_name); @@ -1349,23 +1454,35 @@ App::add_recent_file(const std::string &file_name) if(!is_absolute_path(filename)) filename=absolute_path(filename); + std::string old_window_size; + list::iterator iter; + list::iterator iter_wsize; // Check to see if the file is already on the list. // If it is, then remove it from the list - for(iter=recent_files.begin();iter!=recent_files.end();iter++) + for(iter=recent_files.begin(), iter_wsize=recent_files_window_size.begin();iter!=recent_files.end();iter++, iter_wsize++) if(*iter==filename) { recent_files.erase(iter); + old_window_size = *iter_wsize; + recent_files_window_size.erase(iter_wsize); break; } // Push the filename to the front of the list recent_files.push_front(filename); + if(window_size.empty()) + recent_files_window_size.push_front(old_window_size); + else + recent_files_window_size.push_front(window_size); // Clean out the files at the end of the list. while(recent_files.size()>(unsigned)get_max_recent_files()) + { recent_files.pop_back(); + recent_files_window_size.pop_back(); + } signal_recent_files_changed_(); @@ -1415,7 +1532,23 @@ App::save_settings() for(iter=recent_files.rbegin();iter!=recent_files.rend();iter++) file<<*iter<::reverse_iterator iter; + + for(iter=recent_files_window_size.rbegin();iter!=recent_files_window_size.rend();iter++) + file<<*iter<is_updated() && App::dialog_yes_no(_("CVS Update"), _("There appears to be a newer version of this file available on the CVS repository.\nWould you like to update now? (It would probably be a good idea)"))) diff --git a/synfig-studio/trunk/src/gtkmm/app.h b/synfig-studio/trunk/src/gtkmm/app.h index dd823dd..f3d7338 100644 --- a/synfig-studio/trunk/src/gtkmm/app.h +++ b/synfig-studio/trunk/src/gtkmm/app.h @@ -253,6 +253,7 @@ public: */ private: + static void add_recent_file(const std::string &filename, const std::string &window_size = std::string()); /* -- ** -- P U B L I C M E T H O D S ----------------------------------------- @@ -273,7 +274,8 @@ public: static Glib::RefPtr& ui_manager() { return ui_manager_; } - static void add_recent_file(const std::string &filename); + static void set_recent_file_window_size(etl::handle instance); + static void add_recent_file(const etl::handle instance); static synfig::String get_base_path(); static void save_settings(); diff --git a/synfig-studio/trunk/src/gtkmm/instance.cpp b/synfig-studio/trunk/src/gtkmm/instance.cpp index 597eaec..7cfba5c 100644 --- a/synfig-studio/trunk/src/gtkmm/instance.cpp +++ b/synfig-studio/trunk/src/gtkmm/instance.cpp @@ -199,7 +199,7 @@ studio::Instance::save_as(const synfig::String &file_name) list >::iterator iter; for(iter=canvas_view_list().begin();iter!=canvas_view_list().end();iter++) (*iter)->render_settings.set_entry_filename(); - App::add_recent_file(file_name); + App::add_recent_file(etl::handle(this)); return true; } return false; @@ -224,7 +224,10 @@ studio::Instance::save() } if (synfigapp::Instance::save()) + { + App::add_recent_file(etl::handle(this)); return STATUS_OK; + } App::dialog_error_blocking("Save - Error","Unable to save to '" + get_file_name() + "'"); return STATUS_ERROR; -- 2.7.4