**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
#include <gtkmm/filechooser.h>
#include <gtkmm/filechooserdialog.h>
+#include "general.h"
+
#endif
/* === U S I N G =========================================================== */
std::list< etl::handle< studio::Module > > module_list_;
bool studio::App::use_colorspace_gamma=true;
+bool studio::App::single_threaded=false;
static int max_recent_files_=25;
int studio::App::get_max_recent_files() { return max_recent_files_; }
static synfig::String app_base_path_;
namespace studio {
+
+bool
+really_delete_widget(Gtk::Widget *widget)
+{
+ synfig::info("really delete %p", (void*)widget);
+ delete widget;
+ return false;
+}
+
+// nasty workaround - when we've finished with a popup menu, we want to delete it
+// attaching to the signal_hide() signal gets us here before the action on the menu has run,
+// so schedule the real delete to happen in 50ms, giving the action a chance to run
+void
+delete_widget(Gtk::Widget *widget)
+{
+ synfig::info("delete %p", (void*)widget);
+ Glib::signal_timeout().connect(sigc::bind(sigc::ptr_fun(&really_delete_widget), widget), 50);
+}
+
}; // END of namespace studio
studio::StateManager* state_manager;
value=strprintf("%s",Distance::system_name(App::distance_system).c_str());
return true;
}
+ if(key=="single_threaded")
+ {
+ value=strprintf("%i",(int)App::single_threaded);
+ return true;
+ }
if(key=="auto_recover_backup_interval")
{
value=strprintf("%i",App::auto_recover->get_timeout());
App::distance_system=Distance::ident_system(value);;
return true;
}
+ if(key=="single_threaded")
+ {
+ int i(atoi(value.c_str()));
+ App::single_threaded=i;
+ return true;
+ }
return synfigapp::Settings::set_value(key,value);
}
ret.push_back("distance_system");
ret.push_back("file_history.size");
ret.push_back("use_colorspace_gamma");
+ ret.push_back("single_threaded");
ret.push_back("auto_recover_backup_interval");
return ret;
}
Glib::RefPtr<Gtk::ActionGroup> actions_action_group = Gtk::ActionGroup::create();
- menus_action_group->add( Gtk::Action::create("menu-file", "_File") );
- menus_action_group->add( Gtk::Action::create("menu-edit", "_Edit") );
- menus_action_group->add( Gtk::Action::create("menu-view", "_View") );
- menus_action_group->add( Gtk::Action::create("menu-canvas", "_Canvas") );
- menus_action_group->add( Gtk::Action::create("menu-layer", "_Layer") );
- menus_action_group->add( Gtk::Action::create("menu-duck-mask", "Show/Hide Ducks") );
- menus_action_group->add( Gtk::Action::create("menu-preview-quality", "Preview Quality") );
- menus_action_group->add( Gtk::Action::create("menu-layer-new", "New Layer") );
- menus_action_group->add( Gtk::Action::create("menu-keyframe", "Keyframe") );
- menus_action_group->add( Gtk::Action::create("menu-group", "Group") );
- menus_action_group->add( Gtk::Action::create("menu-state", "State") );
- menus_action_group->add( Gtk::Action::create("menu-toolbox", "Toolbox") );
+ menus_action_group->add( Gtk::Action::create("menu-file", _("_File")) );
+ menus_action_group->add( Gtk::Action::create("menu-edit", _("_Edit")) );
+ menus_action_group->add( Gtk::Action::create("menu-view", _("_View")) );
+ menus_action_group->add( Gtk::Action::create("menu-canvas", _("_Canvas")) );
+ menus_action_group->add( Gtk::Action::create("menu-layer", _("_Layer")) );
+ menus_action_group->add( Gtk::Action::create("menu-duck-mask", _("Show/Hide Ducks")) );
+ menus_action_group->add( Gtk::Action::create("menu-preview-quality", _("Preview Quality")) );
+ menus_action_group->add( Gtk::Action::create("menu-layer-new", _("New Layer")) );
+ menus_action_group->add( Gtk::Action::create("menu-keyframe", _("Keyframe")) );
+ menus_action_group->add( Gtk::Action::create("menu-group", _("Group")) );
+ menus_action_group->add( Gtk::Action::create("menu-state", _("State")) );
+ menus_action_group->add( Gtk::Action::create("menu-toolbox", _("Toolbox")) );
// Add the synfigapp actions...
synfigapp::Action::Book::iterator iter;
DEFINE_ACTION("dialog-flipbook", _("Preview Dialog"));
DEFINE_ACTION("sound", _("Sound File"));
DEFINE_ACTION("options", _("Options"));
- DEFINE_ACTION("close", _("Close"));
+ DEFINE_ACTION("close", _("Close View"));
+ DEFINE_ACTION("close-document", _("Close Document"));
DEFINE_ACTION("undo", Gtk::StockID("gtk-undo"));
DEFINE_ACTION("quality-09", _("Use Quality Level 9"));
DEFINE_ACTION("quality-10", _("Use Quality Level 10"));
DEFINE_ACTION("play", _("Play"));
- DEFINE_ACTION("pause", _("Pause"));
+ // DEFINE_ACTION("pause", _("Pause"));
DEFINE_ACTION("stop", _("Stop"));
DEFINE_ACTION("toggle-grid-show", _("Toggle Grid Show"));
DEFINE_ACTION("toggle-grid-snap", _("Toggle Grid Snap"));
" <separator name='bleh04'/>"
" <menuitem action='options' />"
" <menuitem action='close' />"
+" <menuitem action='close-document' />"
" </menu>"
" <menu action='menu-edit'>"
" <menuitem action='undo'/>"
" </menu>"
" <separator name='bleh08'/>"
" <menuitem action='play'/>"
-" <menuitem action='pause'/>"
+//" <menuitem action='pause'/>"
" <menuitem action='stop'/>"
" <menuitem action='dialog-flipbook'/>"
" <separator name='bleh09'/>"
ACCEL2(Gtk::AccelKey('>',Gdk::CONTROL_MASK,"<Actions>//seek-next-second"));
ACCEL2(Gtk::AccelKey('<',Gdk::CONTROL_MASK,"<Actions>//seek-prev-second"));
ACCEL2(Gtk::AccelKey('o',Gdk::CONTROL_MASK,"<Actions>//toggle-onion-skin"));
+ ACCEL("<Actions>//play", "<Control>p");
ACCEL("<Actions>//seek-begin","Home");
ACCEL("<Actions>//seek-end","End");
App::App(int *argc, char ***argv):
Gtk::Main(argc,argv),
- IconControler(etl::dirname((*argv)[0]))
+ IconController(etl::dirname((*argv)[0]))
{
app_base_path_=etl::dirname(etl::dirname((*argv)[0]));
gdk_rgb_init();
- Glib::thread_init();
+ // don't call thread_init() if threads are already initialized
+ // on some machines bonobo_init() initialized threads before we get here
+ if (!g_thread_supported())
+ Glib::thread_init();
distance_system=Distance::SYSTEM_UNITS;
try { synfigapp_main=etl::smart_ptr<synfigapp::Main>(new synfigapp::Main(etl::dirname((*argv)[0]),&synfig_init_cb)); }
catch(...)
{
- get_ui_interface()->error("Failed to initialize synfig!");
+ get_ui_interface()->error(_("Failed to initialize synfig!"));
throw;
}
try
{
- studio_init_cb.task("Init UI Manager...");
+ studio_init_cb.task(_("Init UI Manager..."));
App::ui_manager_=studio::UIManager::create();
init_ui_manager();
- studio_init_cb.task("Init Dock Manager...");
+ studio_init_cb.task(_("Init Dock Manager..."));
dock_manager=new studio::DockManager();
- studio_init_cb.task("Init State Manager...");
+ studio_init_cb.task(_("Init State Manager..."));
state_manager=new StateManager();
- studio_init_cb.task("Init Toolbox...");
+ studio_init_cb.task(_("Init Toolbox..."));
toolbox=new studio::Toolbox();
- studio_init_cb.task("Init Tool Options...");
+ studio_init_cb.task(_("Init Tool Options..."));
dialog_tool_options=new studio::Dialog_ToolOptions();
dock_manager->register_dockable(*dialog_tool_options);
- studio_init_cb.task("Init History...");
+ studio_init_cb.task(_("Init History..."));
dock_history=new studio::Dock_History();
dock_manager->register_dockable(*dock_history);
- studio_init_cb.task("Init Canvases...");
+ studio_init_cb.task(_("Init Canvases..."));
dock_canvases=new studio::Dock_Canvases();
dock_manager->register_dockable(*dock_canvases);
- studio_init_cb.task("Init Keyframes...");
+ studio_init_cb.task(_("Init Keyframes..."));
dock_keyframes=new studio::Dock_Keyframes();
dock_manager->register_dockable(*dock_keyframes);
- studio_init_cb.task("Init Layers...");
+ studio_init_cb.task(_("Init Layers..."));
dock_layers=new studio::Dock_Layers();
dock_manager->register_dockable(*dock_layers);
- studio_init_cb.task("Init Params...");
+ studio_init_cb.task(_("Init Params..."));
dock_params=new studio::Dock_Params();
dock_manager->register_dockable(*dock_params);
- studio_init_cb.task("Init MetaData...");
+ studio_init_cb.task(_("Init MetaData..."));
dock_meta_data=new studio::Dock_MetaData();
dock_manager->register_dockable(*dock_meta_data);
- studio_init_cb.task("Init Children...");
+ studio_init_cb.task(_("Init Children..."));
dock_children=new studio::Dock_Children();
dock_manager->register_dockable(*dock_children);
- studio_init_cb.task("Init Info...");
+ studio_init_cb.task(_("Init Info..."));
dock_info = new studio::Dock_Info();
dock_manager->register_dockable(*dock_info);
- studio_init_cb.task("Init Navigator...");
+ studio_init_cb.task(_("Init Navigator..."));
dock_navigator = new studio::Dock_Navigator();
dock_manager->register_dockable(*dock_navigator);
- studio_init_cb.task("Init Timetrack...");
+ studio_init_cb.task(_("Init Timetrack..."));
dock_timetrack = new studio::Dock_Timetrack();
dock_manager->register_dockable(*dock_timetrack);
- studio_init_cb.task("Init Curve Editor...");
+ studio_init_cb.task(_("Init Curve Editor..."));
dock_curves = new studio::Dock_Curves();
dock_manager->register_dockable(*dock_curves);
- studio_init_cb.task("Init Layer Groups...");
+ studio_init_cb.task(_("Init Layer Groups..."));
dock_layer_groups = new studio::Dock_LayerGroups();
dock_manager->register_dockable(*dock_layer_groups);
- studio_init_cb.task("Init Color Dialog...");
+ studio_init_cb.task(_("Init Color Dialog..."));
dialog_color=new studio::Dialog_Color();
- studio_init_cb.task("Init Gradient Dialog...");
+ studio_init_cb.task(_("Init Gradient Dialog..."));
dialog_gradient=new studio::Dialog_Gradient();
- studio_init_cb.task("Init DeviceTracker...");
+ studio_init_cb.task(_("Init DeviceTracker..."));
device_tracker=new studio::DeviceTracker();
- studio_init_cb.task("Init Tools...");
+ studio_init_cb.task(_("Init Tools..."));
state_manager->add_state(&state_normal);
state_manager->add_state(&state_smooth_move);
state_manager->add_state(&state_scale);
// Disabled by default - it doesn't work properly?
if(getenv("SYNFIG_ENABLE_WIDTH" )) state_manager->add_state(&state_width);
- studio_init_cb.task("Init ModPalette...");
+ studio_init_cb.task(_("Init ModPalette..."));
module_list_.push_back(new ModPalette()); module_list_.back()->start();
- studio_init_cb.task("Init ModMirror...");
+ studio_init_cb.task(_("Init ModMirror..."));
module_list_.push_back(new ModMirror()); module_list_.back()->start();
- studio_init_cb.task("Init Setup Dialog...");
+ studio_init_cb.task(_("Init Setup Dialog..."));
dialog_setup=new studio::Dialog_Setup();
- studio_init_cb.task("Init Input Dialog...");
+ studio_init_cb.task(_("Init Input Dialog..."));
dialog_input=new Gtk::InputDialog();
dialog_input->get_close_button()->signal_clicked().connect( sigc::mem_fun( *dialog_input, &Gtk::InputDialog::hide ) );
dialog_input->get_save_button()->signal_clicked().connect( sigc::ptr_fun(studio::App::dialog_not_implemented) );
- studio_init_cb.task("Init auto recovery...");
+ studio_init_cb.task(_("Init auto recovery..."));
auto_recover=new AutoRecover();
studio_init_cb.amount_complete(9250,10000);
- studio_init_cb.task("Loading Settings...");
+ studio_init_cb.task(_("Loading Settings..."));
load_settings();
- studio_init_cb.task("Checking auto-recover...");
+ studio_init_cb.task(_("Checking auto-recover..."));
studio_init_cb.amount_complete(9900,10000);
about_window.hide();
if(
get_ui_interface()->yes_no(
- "Auto Recovery",
- "Synfig Studio seems to have crashed\n"
+ _("Auto Recovery"),
+ _("Synfig Studio seems to have crashed\n"
"before you could save all your files.\n"
"Would you like to re-open those files\n"
- "and recover your unsaved changes?"
+ "and recover your unsaved changes?")
)==synfigapp::UIInterface::RESPONSE_YES
)
{
for(;*argc>=1;(*argc)--)
if((*argv)[*argc] && (*argv)[*argc][0]!='-')
{
- studio_init_cb.task("Loading files...");
+ studio_init_cb.task(_("Loading files..."));
about_window.hide();
open((*argv)[*argc]);
about_window.show();
}
- studio_init_cb.task("Done.");
+ studio_init_cb.task(_("Done."));
studio_init_cb.amount_complete(10000,10000);
toolbox->present();
if(basename(filename)[0]=='.')
return;
- // If we aren't an absolute path, turn outselves into one
+ // If we aren't an absolute path, turn ourselves into one
if(!is_absolute_path(filename))
filename=absolute_path(filename);
//if(!synfigapp::Main::settings().load_from_file(filename))
{
gamma.set_gamma(1.0/2.2);
- synfigapp::Main::settings().set_value("dock.dialog.1.comp_selector","1");
- synfigapp::Main::settings().set_value("dock.dialog.1.contents","navigator - info pal_edit pal_browse - tool_options history canvases - layers groups");
- synfigapp::Main::settings().set_value("dock.dialog.1.contents_size","225 167 207");
- synfigapp::Main::settings().set_value("dock.dialog.1.pos","1057 32");
- synfigapp::Main::settings().set_value("dock.dialog.1.size","208 1174");
- synfigapp::Main::settings().set_value("dock.dialog.2.comp_selector","0");
- synfigapp::Main::settings().set_value("dock.dialog.2.contents","params children keyframes | timetrack curves meta_data");
- synfigapp::Main::settings().set_value("dock.dialog.2.contents_size","263");
- synfigapp::Main::settings().set_value("dock.dialog.2.pos","0 973");
- synfigapp::Main::settings().set_value("dock.dialog.2.size","1045 235");
- synfigapp::Main::settings().set_value("pref.distance_system","pt");
- synfigapp::Main::settings().set_value("pref.use_colorspace_gamma","1");
- synfigapp::Main::settings().set_value("window.toolbox.pos","4 4");
+ reset_initial_window_configuration();
}
}
setlocale(LC_NUMERIC,old_locale);
}
}
+void
+App::reset_initial_window_configuration()
+{
+ synfigapp::Main::settings().set_value("dock.dialog.1.comp_selector","1");
+ synfigapp::Main::settings().set_value("dock.dialog.1.contents","navigator - info pal_edit pal_browse - tool_options history canvases - layers groups");
+ synfigapp::Main::settings().set_value("dock.dialog.1.contents_size","225 167 207");
+ synfigapp::Main::settings().set_value("dock.dialog.1.pos","1057 32");
+ synfigapp::Main::settings().set_value("dock.dialog.1.size","208 1174");
+ synfigapp::Main::settings().set_value("dock.dialog.2.comp_selector","0");
+ synfigapp::Main::settings().set_value("dock.dialog.2.contents","params children keyframes | timetrack curves meta_data");
+ synfigapp::Main::settings().set_value("dock.dialog.2.contents_size","263");
+ synfigapp::Main::settings().set_value("dock.dialog.2.pos","0 973");
+ synfigapp::Main::settings().set_value("dock.dialog.2.size","1045 235");
+ synfigapp::Main::settings().set_value("pref.distance_system","pt");
+ synfigapp::Main::settings().set_value("pref.use_colorspace_gamma","1");
+ synfigapp::Main::settings().set_value("pref.single_threaded","0");
+ synfigapp::Main::settings().set_value("window.toolbox.pos","4 4");
+}
+
bool
App::shutdown_request(GdkEventAny*)
{
if(shutdown_in_progress)return;
- get_ui_interface()->task("Quit Request");
+ get_ui_interface()->task(_("Quit Request"));
if(Busy::count)
{
- dialog_error_blocking("Cannot quit!","Tasks are currently running.\nPlease cancel the current tasks and try again");
+ dialog_error_blocking(_("Cannot quit!"),_("Tasks are currently running.\nPlease cancel the current tasks and try again"));
return;
}
Gtk::Main::quit();
auto_recover->normal_shutdown();
- get_ui_interface()->task("Quit Request sent");
+ get_ui_interface()->task(_("Quit Request sent"));
}
void
dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
dialog->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
if(!filename.empty())
+ {
+ std::string full_path;
if (is_absolute_path(filename))
- dialog->set_filename(filename);
+ full_path = filename;
else
- dialog->set_filename(prev_path + ETL_DIRECTORY_SEPARATOR + filename);
+ full_path = prev_path + ETL_DIRECTORY_SEPARATOR + filename;
+ // select the file if it exists
+ dialog->set_filename(full_path);
+
+ // if the file doesn't exist, put its name into the filename box
+ struct stat s;
+ if(stat(full_path.c_str(),&s) == -1 && errno == ENOENT)
+ dialog->set_current_name(basename(filename));
+ }
if(dialog->run()==GTK_RESPONSE_ACCEPT) {
filename=dialog->get_filename();
delete dialog;
void
App::dialog_not_implemented()
{
- Gtk::MessageDialog dialog("Feature not available", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true);
- dialog.set_secondary_text("Sorry, this feature has not yet been implemented.");
+ Gtk::MessageDialog dialog(_("Feature not available"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true);
+ dialog.set_secondary_text(_("Sorry, this feature has not yet been implemented."));
dialog.run();
}
App::new_instance()
{
handle<synfig::Canvas> canvas=synfig::Canvas::create();
- canvas->set_name(strprintf("Untitled%d",Instance::get_count()));
+ canvas->set_name(strprintf("%s%d", DEFAULT_FILENAME_PREFIX, Instance::get_count()+1));
- String file_name(strprintf("untitled%d.sif",Instance::get_count()));
+ String file_name(strprintf("%s%d.sifz", DEFAULT_FILENAME_PREFIX, Instance::get_count()+1));
canvas->rend_desc().set_frame_rate(24.0);
canvas->rend_desc().set_time_start(0.0);
canvas->rend_desc().set_flags(RendDesc::PX_ASPECT|RendDesc::IM_SPAN);
canvas->set_file_name(file_name);
- Instance::create(canvas)->find_canvas_view(canvas)->canvas_properties.present();
+ handle<Instance> instance = Instance::create(canvas);
+
+ if (!getenv("SYNFIG_DISABLE_NEW_CANVAS_EDIT_PROPERTIES"))
+ instance->find_canvas_view(canvas)->canvas_properties.present();
}
void
}
etl::loose_handle<Instance>
-App::get_instance(Canvas::Handle canvas)
+App::get_instance(etl::handle<synfig::Canvas> canvas)
{
if(!canvas) return 0;
canvas=canvas->get_root();