X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fapp.cpp;h=a3fb39c443ccfed4841e52a3749dd866803633ab;hb=4c3c01b90796b1ac068f95cfc7227914cd5c3b33;hp=e0be7b030887345ad9d7366381359b59dcfd7f49;hpb=8ef042c40521681cea99944097c4f90a5ac6cf74;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/app.cpp b/synfig-studio/trunk/src/gtkmm/app.cpp index e0be7b0..a3fb39c 100644 --- a/synfig-studio/trunk/src/gtkmm/app.cpp +++ b/synfig-studio/trunk/src/gtkmm/app.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #ifdef HAVE_SYS_ERRNO_H #include @@ -268,7 +269,7 @@ namespace studio { bool really_delete_widget(Gtk::Widget *widget) { - synfig::info("really delete %x", (unsigned int)widget); + // synfig::info("really delete %p", (void*)widget); delete widget; return false; } @@ -279,7 +280,7 @@ really_delete_widget(Gtk::Widget *widget) void delete_widget(Gtk::Widget *widget) { - synfig::info("delete %x", (unsigned int)widget); + // synfig::info("delete %p", (void*)widget); Glib::signal_timeout().connect(sigc::bind(sigc::ptr_fun(&really_delete_widget), widget), 50); } @@ -384,157 +385,6 @@ public: /* === P R O C E D U R E S ================================================= */ -typedef unsigned char U8; -typedef unsigned short U16; -typedef unsigned long U32; - -typedef union { - struct { - U32 serial; - U32 checksum; - } element; - U8 raw[8]; -} V_KeyUnwound; - -static inline U32 hash_U32(U32 i) -{ - i=i*1664525+1013904223; - i=i*1664525+1013904223; - i=i*1664525+1013904223; - return i; -} - -#ifdef BIG_ENDIAN -static const int endian_fix_table[8] = { 3, 2, 1, 0, 7, 6, 5, 4 } ; -#define endian_fix(x) (endian_fix_table[x]) -#else -#define endian_fix(x) (x) -#endif - -int v_unwind_key(V_KeyUnwound* unwound, const char* key) -{ - int i; - unwound->element.serial=0; - unwound->element.checksum=0; - - for(i=0;i<16;i++) - { - U8 data; - - switch(key[i]) - { - case '0': data=0; break; - case '1': data=1; break; - case '2': data=2; break; - case '3': data=3; break; - case '4': data=4; break; - case '5': data=5; break; - case '6': data=6; break; - case '7': data=7; break; - case '8': data=8; break; - case '9': data=9; break; - case 'a': case 'A': data=10; break; - case 'b': case 'B': data=11; break; - case 'c': case 'C': data=12; break; - case 'd': case 'D': data=13; break; - case 'e': case 'E': data=14; break; - case 'f': case 'F': data=15; break; - default: return 0; break; - } - int bit=i*2; - unwound->element.checksum|=(((U32)data&3)<element.serial|=(((U32)(data>>2)&3)<>24); - } - } - - unwound_key.element.serial^=appid_mask_a; - unwound_key.element.checksum^=appid_mask_b; - - *serial=unwound_key.element.serial; - - return unwound_key.element.checksum==hash_U32(unwound_key.element.serial); -} - - -#ifdef _WIN32 -# ifdef LICENSE_KEY_REQUIRED -int check_license(String basedir) -# else -int check_license(String /*basedir*/) -# endif -#else -int check_license(String /*basedir*/) -#endif -{ -#ifdef LICENSE_KEY_REQUIRED - String key; - String license_file; - -#ifndef _WIN32 - license_file="/usr/local/etc/.synfiglicense"; -#else - license_file=basedir+"\\etc\\.synfiglicense"; -#endif - - try { - key=Glib::file_get_contents(license_file); - } catch (Glib::FileError) { } - U32 serial(0); - if(!v_key_check(key.c_str(),&serial,0xdeadbeef)) - { - while(!v_key_check(key.c_str(),&serial,0xdeadbeef)) - { - key.clear(); - - if(!App::dialog_entry( - _("Synfig Studio Authentication"), - _("Please enter your license key below. You will not\nbe able to use this software without a valid license key."), - key - )) - throw String("No License"); - } - - FILE* file=fopen(license_file.c_str(),"w"); - if(file) - { - fprintf(file,"%s",key.c_str()); - fclose(file); - } - else - synfig::error("Unable to save license key!"); - } - synfig::info("License Authenticated -- Serial #%05d",serial); - return serial; -#else - return 1; -#endif -} - /* void studio::UIManager::insert_action_group (const Glib::RefPtr& action_group, int pos) @@ -562,30 +412,24 @@ studio::add_action_group_to_top(Glib::RefPtr ui_manager, Glib { ui_manager->insert_action_group(group,0); return; - DEBUGPOINT(); std::list > prev_groups(ui_manager->get_action_groups()); std::list >::reverse_iterator iter; - DEBUGPOINT(); for(iter=prev_groups.rbegin();iter!=prev_groups.rend();++iter) { - DEBUGPOINT(); if(*iter && (*iter)->get_name()!="menus") { synfig::info("Removing action group "+(*iter)->get_name()); ui_manager->remove_action_group(*iter); } } - DEBUGPOINT(); ui_manager->insert_action_group(group,0); - DEBUGPOINT(); for(;!prev_groups.empty();prev_groups.pop_front()) { if(prev_groups.front() && prev_groups.front()!=group && prev_groups.front()->get_name()!="menus") ui_manager->insert_action_group(prev_groups.front(),1); } - DEBUGPOINT(); } */ class Preferences : public synfigapp::Settings @@ -718,18 +562,18 @@ init_ui_manager() Glib::RefPtr 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; @@ -748,6 +592,7 @@ init_ui_manager() DEFINE_ACTION2("keyframe-properties", Gtk::StockID("gtk-properties"), _("Keyframe Properties")); DEFINE_ACTION("about", Gtk::StockID("synfig-about")); + DEFINE_ACTION("new", Gtk::Stock::NEW); DEFINE_ACTION("open", Gtk::Stock::OPEN); DEFINE_ACTION("save", Gtk::Stock::SAVE); DEFINE_ACTION("save-as", Gtk::Stock::SAVE_AS); @@ -764,6 +609,7 @@ init_ui_manager() DEFINE_ACTION("options", _("Options")); DEFINE_ACTION("close", _("Close View")); DEFINE_ACTION("close-document", _("Close Document")); + DEFINE_ACTION("quit", Gtk::Stock::QUIT); DEFINE_ACTION("undo", Gtk::StockID("gtk-undo")); @@ -866,6 +712,8 @@ init_ui_manager() " " " " " " +" " +" " " " " " " " @@ -884,6 +732,7 @@ init_ui_manager() " " " " " " +" " " " " " " " @@ -1118,9 +967,6 @@ App::App(int *argc, char ***argv): { app_base_path_=etl::dirname(etl::dirname((*argv)[0])); - int serial_; - serial_=check_license(app_base_path_); - ui_interface_=new GlobalUIInterface(); @@ -1146,31 +992,17 @@ App::App(int *argc, char ***argv): ipc=new IPC(); - try + if(!SYNFIG_CHECK_VERSION()) { - if(!SYNFIG_CHECK_VERSION()) - { cerr<<"FATAL: Synfig Version Mismatch"<(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; } @@ -1195,82 +1027,82 @@ App::App(int *argc, char ***argv): 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); @@ -1299,28 +1131,28 @@ App::App(int *argc, char ***argv): // 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); @@ -1329,11 +1161,11 @@ App::App(int *argc, char ***argv): 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 ) { @@ -1357,17 +1189,21 @@ App::App(int *argc, char ***argv): 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(); } + catch(String x) + { + get_ui_interface()->error(_("Unknown exception caught when constructing App.\nThis software may be unstable.") + String("\n\n") + x); + } catch(...) { get_ui_interface()->error(_("Unknown exception caught when constructing App.\nThis software may be unstable.")); @@ -1603,10 +1439,10 @@ App::quit() 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; } @@ -1674,7 +1510,7 @@ App::quit() Gtk::Main::quit(); auto_recover->normal_shutdown(); - get_ui_interface()->task("Quit Request sent"); + get_ui_interface()->task(_("Quit Request sent")); } void @@ -1700,8 +1536,10 @@ static OPENFILENAME ofn={}; #endif bool -App::dialog_open_file(const std::string &title, std::string &filename) +App::dialog_open_file(const std::string &title, std::string &filename, std::string preference) { + info("App::dialog_open_file('%s', '%s', '%s')", title.c_str(), filename.c_str(), preference.c_str()); + #ifdef USE_WIN32_FILE_DIALOGS static TCHAR szFilter[] = TEXT ("All Files (*.*)\0*.*\0\0") ; @@ -1746,26 +1584,36 @@ App::dialog_open_file(const std::string &title, std::string &filename) #else synfig::String prev_path; - if(!_preferences.get_value("curr_path",prev_path)) - prev_path="."; + + if(!_preferences.get_value(preference, prev_path)) + prev_path = "."; + prev_path = absolute_path(prev_path); - Gtk::FileChooserDialog *dialog=new Gtk::FileChooserDialog(title,Gtk::FILE_CHOOSER_ACTION_OPEN); + Gtk::FileChooserDialog *dialog = new Gtk::FileChooserDialog(title, Gtk::FILE_CHOOSER_ACTION_OPEN); + dialog->set_current_folder(prev_path); dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog->add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); - if(!filename.empty()) - if (is_absolute_path(filename)) - dialog->set_filename(filename); - else - dialog->set_filename(prev_path + ETL_DIRECTORY_SEPARATOR + filename); - if(dialog->run()==GTK_RESPONSE_ACCEPT) { - filename=dialog->get_filename(); + + if (filename.empty()) + dialog->set_filename(prev_path); + else if (is_absolute_path(filename)) + dialog->set_filename(filename); + else + dialog->set_filename(prev_path + ETL_DIRECTORY_SEPARATOR + filename); + + if(dialog->run() == GTK_RESPONSE_ACCEPT) { + filename = dialog->get_filename(); + info("Saving preference %s = '%s' in App::dialog_open_file()", preference.c_str(), dirname(filename).c_str()); + _preferences.set_value(preference, dirname(filename)); delete dialog; return true; } + delete dialog; return false; + /* GtkWidget *ok; @@ -1800,7 +1648,7 @@ App::dialog_open_file(const std::string &title, std::string &filename) if(val==1) { filename=gtk_file_selection_get_filename(GTK_FILE_SELECTION(fileselection)); - _preferences.set_value("curr_path",dirname(filename)); + _preferences.set_value(preference,dirname(filename)); } else { @@ -1814,8 +1662,10 @@ App::dialog_open_file(const std::string &title, std::string &filename) } bool -App::dialog_save_file(const std::string &title, std::string &filename) +App::dialog_save_file(const std::string &title, std::string &filename, std::string preference) { + info("App::dialog_save_file('%s', '%s', '%s')", title.c_str(), filename.c_str(), preference.c_str()); + #if USE_WIN32_FILE_DIALOGS static TCHAR szFilter[] = TEXT ("All Files (*.*)\0*.*\0\0") ; @@ -1854,27 +1704,34 @@ App::dialog_save_file(const std::string &title, std::string &filename) if(GetSaveFileName(&ofn)) { filename=szFilename; - _preferences.set_value("curr_path",dirname(filename)); + _preferences.set_value(preference,dirname(filename)); return true; } return false; #else synfig::String prev_path; - if(!_preferences.get_value("curr_path",prev_path)) + + if(!_preferences.get_value(preference, prev_path)) prev_path="."; + prev_path = absolute_path(prev_path); - Gtk::FileChooserDialog *dialog=new Gtk::FileChooserDialog(title,Gtk::FILE_CHOOSER_ACTION_SAVE); + Gtk::FileChooserDialog *dialog = new Gtk::FileChooserDialog(title, Gtk::FILE_CHOOSER_ACTION_SAVE); + dialog->set_current_folder(prev_path); dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); - if(!filename.empty()) + + if (filename.empty()) + dialog->set_filename(prev_path); + else { std::string full_path; if (is_absolute_path(filename)) full_path = filename; else full_path = prev_path + ETL_DIRECTORY_SEPARATOR + filename; + // select the file if it exists dialog->set_filename(full_path); @@ -1883,15 +1740,17 @@ App::dialog_save_file(const std::string &title, std::string &filename) 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(); + + if(dialog->run() == GTK_RESPONSE_ACCEPT) { + filename = dialog->get_filename(); + info("Saving preference %s = '%s' in App::dialog_save_file()", preference.c_str(), dirname(filename).c_str()); + _preferences.set_value(preference, dirname(filename)); delete dialog; - _preferences.set_value("curr_path",dirname(filename)); return true; } + delete dialog; return false; -// return dialog_open_file(title, filename); #endif } @@ -1953,8 +1812,8 @@ App::dialog_yes_no_cancel(const std::string &title, const std::string &message) 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(); } @@ -2047,8 +1906,6 @@ App::open_as(std::string filename,std::string as) return false; } - _preferences.set_value("curr_path",dirname(as)); - return true; } @@ -2085,7 +1942,7 @@ App::dialog_open() { string filename="*.sif"; - while(dialog_open_file("Open", filename)) + while(dialog_open_file("Open", filename, ANIMATION_DIR_PREFERENCE)) { // If the filename still has wildcards, then we should // continue looking for the file we want @@ -2149,7 +2006,7 @@ App::set_selected_canvas_view(etl::loose_handle canvas_view) } etl::loose_handle -App::get_instance(Canvas::Handle canvas) +App::get_instance(etl::handle canvas) { if(!canvas) return 0; canvas=canvas->get_root();