X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fapp.cpp;h=472842355e31be27ea845769ade0169299dd5914;hb=08018af6e266db18b45b0c6d0054be2e1fbfab7d;hp=1e4c3a12794ec6c4723bf04f2f6085c601cde091;hpb=92d8be5960e2fea6cd33c621ef895f4babd45a8e;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/app.cpp b/synfig-studio/trunk/src/gtkmm/app.cpp index 1e4c3a1..4728423 100644 --- a/synfig-studio/trunk/src/gtkmm/app.cpp +++ b/synfig-studio/trunk/src/gtkmm/app.cpp @@ -54,6 +54,7 @@ #include #include #include +#include #include @@ -88,6 +89,8 @@ #include "state_rectangle.h" #include "state_smoothmove.h" #include "state_scale.h" +#include "state_star.h" +#include "state_text.h" #include "state_width.h" #include "state_rotate.h" #include "state_zoom.h" @@ -271,7 +274,11 @@ bool studio::App::use_colorspace_gamma=true; bool studio::App::single_threaded=false; #endif bool studio::App::restrict_radius_ducks=false; -String studio::App::browser_command("firefox"); +#ifdef USE_OPEN_FOR_URLS +String studio::App::browser_command("open"); // MacOS only +#else +String studio::App::browser_command("xdg-open"); // Linux XDG standard +#endif static int max_recent_files_=25; int studio::App::get_max_recent_files() { return max_recent_files_; } @@ -663,6 +670,8 @@ init_ui_manager() DEFINE_ACTION("copy", Gtk::StockID("gtk-copy")); DEFINE_ACTION("paste", Gtk::StockID("gtk-paste")); DEFINE_ACTION("select-all-ducks", _("Select All Ducks")); + DEFINE_ACTION("unselect-all-ducks", _("Unselect All Ducks")); + DEFINE_ACTION("select-all-layers", _("Select All Layers")); DEFINE_ACTION("unselect-all-layers", _("Unselect All Layers")); DEFINE_ACTION("properties", _("Properties")); @@ -791,8 +800,10 @@ init_ui_manager() " " " " " " -" " +" " " " +" " +" " " " " " " " @@ -931,7 +942,9 @@ init_ui_manager() } ACCEL("//select-all-ducks","a"); - ACCEL("//unselect-all-layers","d"); + ACCEL("//unselect-all-ducks","d"); + ACCEL("//select-all-layers","a"); + ACCEL("//unselect-all-layers","d"); ACCEL("//render","F9"); ACCEL("//preview","F11"); ACCEL("//properties","F8"); @@ -995,23 +1008,25 @@ init_ui_manager() ACCEL("//state-normal", "a"); ACCEL("//state-smooth_move", "v"); - ACCEL("//state-scale", "d"); - ACCEL("//state-rotate", "s"); + ACCEL("//state-scale", "s"); + ACCEL("//state-rotate", "t"); + ACCEL("//state-mirror", "m"); - ACCEL("//state-bline", "b"); ACCEL("//state-circle", "c"); ACCEL("//state-rectangle", "r"); + ACCEL("//state-star", "q"); ACCEL("//state-gradient", "g"); + ACCEL("//state-polygon", "p"); - ACCEL("//state-eyedrop", "e"); + ACCEL("//state-bline", "b"); + ACCEL("//state-text", "x"); ACCEL("//state-fill", "f"); + ACCEL("//state-eyedrop", "e"); ACCEL("//state-zoom", "z"); - ACCEL("//state-polygon", "p"); - ACCEL("//state-draw", "w"); + ACCEL("//state-draw", "d"); ACCEL("//state-sketch", "k"); - ACCEL("//state-width", "t"); - ACCEL("//state-mirror", "m"); + ACCEL("//state-width", "w"); ACCEL("//canvas-zoom-fit","z"); @@ -1070,7 +1085,6 @@ App::App(int *argc, char ***argv): Glib::set_application_name(_("Synfig Studio")); Splash splash_screen; - splash_screen.set_can_self_destruct(false); splash_screen.show(); shutdown_in_progress=false; @@ -1178,19 +1192,22 @@ App::App(int *argc, char ***argv): studio_init_cb.task(_("Init ModMirror...")); module_list_.push_back(new ModMirror()); module_list_.back()->start(); /* row 2 */ - state_manager->add_state(&state_bline); state_manager->add_state(&state_circle); state_manager->add_state(&state_rectangle); + state_manager->add_state(&state_star); state_manager->add_state(&state_gradient); if(!getenv("SYNFIG_DISABLE_POLYGON")) state_manager->add_state(&state_polygon); // Enabled - for working without ducks /* row 3 */ - if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); // Enabled for now. Let's see whether they're good enough yet. - if(!getenv("SYNFIG_DISABLE_SKETCH" )) state_manager->add_state(&state_sketch); + state_manager->add_state(&state_bline); + state_manager->add_state(&state_text); state_manager->add_state(&state_fill); state_manager->add_state(&state_eyedrop); state_manager->add_state(&state_zoom); + if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); // Enabled for now. Let's see whether they're good enough yet. + if(!getenv("SYNFIG_DISABLE_SKETCH" )) state_manager->add_state(&state_sketch); + // Disabled by default - it doesn't work properly? if(getenv("SYNFIG_ENABLE_WIDTH" )) state_manager->add_state(&state_width); @@ -1775,7 +1792,7 @@ static OPENFILENAME ofn={}; bool 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()); + // 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") ; @@ -1842,7 +1859,7 @@ App::dialog_open_file(const std::string &title, std::string &filename, std::stri 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()); + // 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; @@ -1901,7 +1918,7 @@ App::dialog_open_file(const std::string &title, std::string &filename, std::stri bool 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()); + // 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") ; @@ -1964,7 +1981,8 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri { file_type_enum = manage(new Widget_Enum()); file_type_enum->set_param_desc(ParamDesc().set_hint("enum") - .add_enum_value(synfig::RELEASE_VERSION_0_61_08, "0.61.08", strprintf("0.61.08 (%s)", _("current"))) + .add_enum_value(synfig::RELEASE_VERSION_0_61_09, "0.61.09", strprintf("0.61.09 (%s)", _("current"))) + .add_enum_value(synfig::RELEASE_VERSION_0_61_08, "0.61.08", "0.61.08") .add_enum_value(synfig::RELEASE_VERSION_0_61_07, "0.61.07", "0.61.07") .add_enum_value(synfig::RELEASE_VERSION_0_61_06, "0.61.06", strprintf("0.61.06 %s", _("and older")))); file_type_enum->set_value(RELEASE_VERSION_END-1); // default to the most recent version @@ -2000,7 +2018,7 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri if (preference == ANIMATION_DIR_PREFERENCE) set_file_version(synfig::ReleaseVersion(file_type_enum->get_value())); filename = dialog->get_filename(); - info("Saving preference %s = '%s' in App::dialog_save_file()", preference.c_str(), dirname(filename).c_str()); + // 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; return true; @@ -2079,24 +2097,75 @@ try_open_url(const std::string &url) { #ifdef WIN32 return ShellExecute(GetDesktopWindow(), "open", url.c_str(), NULL, NULL, SW_SHOW); -#else // WIN32 - gchar* argv[3] = {strdup(App::browser_command.c_str()), strdup(url.c_str()), NULL}; - - GError* gerror = NULL; - gboolean retval; - retval = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &gerror); - free(argv[0]); - free(argv[1]); - - if (!retval) - { - error(_("Could not execute specified web browser: %s"), gerror->message); - g_error_free(gerror); - return false; - } +#else // !WIN32 + std::vector command_line; + std::vector browsers; + browsers.reserve(23); + + // Browser wrapper scripts +#ifdef USE_OPEN_FOR_URLS + browsers.push_back("open"); // Apple MacOS X wrapper, on Linux it opens a virtual console +#endif + browsers.push_back("xdg-open"); // XDG wrapper + browsers.push_back("sensible-browser"); // Debian wrapper + browsers.push_back("gnome-open"); // GNOME wrapper + browsers.push_back("kfmclient"); // KDE wrapper + browsers.push_back("exo-open"); // XFCE wrapper + + // Alternatives system + browsers.push_back("gnome-www-browser"); // Debian GNOME alternative + browsers.push_back("x-www-browser"); // Debian GUI alternative + + // Individual browsers + browsers.push_back("firefox"); + browsers.push_back("epiphany-browser"); + browsers.push_back("epiphany"); + browsers.push_back("konqueror"); + browsers.push_back("iceweasel"); + browsers.push_back("mozilla"); + browsers.push_back("netscape"); + browsers.push_back("icecat"); + browsers.push_back("galeon"); + browsers.push_back("midori"); + browsers.push_back("safari"); + browsers.push_back("opera"); + browsers.push_back("amaya"); + browsers.push_back("netsurf"); + browsers.push_back("dillo"); + + // Try the user-specified browser first + command_line.push_back(App::browser_command); + if( command_line[0] == "kfmclient" ) command_line.push_back("openURL"); + command_line.push_back(url); + + try { Glib::spawn_async(".", command_line, Glib::SPAWN_SEARCH_PATH); return true; } + catch( Glib::SpawnError& exception ){ + + while ( !browsers.empty() ) + { + // Skip the browser if we already tried it + if( browsers[0] == App::browser_command ) + continue; + + // Construct the command line + command_line.clear(); + command_line.push_back(browsers[0]); + if( command_line[0] == "kfmclient" ) command_line.push_back("openURL"); + command_line.push_back(url); + + // Remove the browser from the list + browsers.erase(browsers.begin()); + + // Try to spawn the browser + try { Glib::spawn_async(".", command_line, Glib::SPAWN_SEARCH_PATH); } + // Failed, move on to the next one + catch(Glib::SpawnError& exception){ continue; } + return true; // No exception means we succeeded! + } + } - return true; -#endif // WIN32 + return false; +#endif // !WIN32 } void @@ -2114,7 +2183,13 @@ App::dialog_help() void App::open_url(const std::string &url) { - try_open_url(url); + if(!try_open_url(url)) + { + Gtk::MessageDialog dialog(_("No browser was found. Please load this website manually:"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true); + dialog.set_secondary_text(url); + dialog.set_title(_("No browser found")); + dialog.run(); + } } bool @@ -2123,8 +2198,8 @@ App::dialog_entry(const std::string &title, const std::string &message,std::stri Gtk::Dialog dialog( title, // Title true, // Modal - true // use_separator - ); + true); // use_separator + Gtk::Label label(message); label.show(); dialog.get_vbox()->pack_start(label); @@ -2133,11 +2208,13 @@ App::dialog_entry(const std::string &title, const std::string &message,std::stri entry.set_text(text); entry.show(); entry.set_activates_default(true); + dialog.get_vbox()->pack_start(entry); dialog.add_button(Gtk::StockID("gtk-ok"),Gtk::RESPONSE_OK); dialog.add_button(Gtk::StockID("gtk-cancel"),Gtk::RESPONSE_CANCEL); dialog.set_default_response(Gtk::RESPONSE_OK); + entry.signal_activate().connect(sigc::bind(sigc::mem_fun(dialog,&Gtk::Dialog::response),Gtk::RESPONSE_OK)); dialog.show(); @@ -2149,8 +2226,39 @@ App::dialog_entry(const std::string &title, const std::string &message,std::stri return true; } +bool +App::dialog_paragraph(const std::string &title, const std::string &message,std::string &text) +{ + Gtk::Dialog dialog( + title, // Title + true, // Modal + true); // use_separator + + Gtk::Label label(message); + label.show(); + dialog.get_vbox()->pack_start(label); + + Glib::RefPtr text_buffer(Gtk::TextBuffer::create()); + text_buffer->set_text(text); + Gtk::TextView text_view(text_buffer); + text_view.show(); + + dialog.get_vbox()->pack_start(text_view); + + dialog.add_button(Gtk::StockID("gtk-ok"),Gtk::RESPONSE_OK); + dialog.add_button(Gtk::StockID("gtk-cancel"),Gtk::RESPONSE_CANCEL); + dialog.set_default_response(Gtk::RESPONSE_OK); + + //text_entry.signal_activate().connect(sigc::bind(sigc::mem_fun(dialog,&Gtk::Dialog::response),Gtk::RESPONSE_OK)); + dialog.show(); + if(dialog.run()!=Gtk::RESPONSE_OK) + return false; + text=text_buffer->get_text(); + + return true; +} bool App::open(std::string filename) @@ -2167,7 +2275,10 @@ App::open_as(std::string filename,std::string as) #ifdef WIN32 char long_name[1024]; if(GetLongPathName(as.c_str(),long_name,sizeof(long_name))); - as=long_name; + // when called from autorecover.cpp, filename doesn't exist, and so long_name is empty + // don't use it if that's the case + if (long_name[0] != '\0') + as=long_name; #endif try @@ -2186,7 +2297,8 @@ App::open_as(std::string filename,std::string as) if(!canvas) throw (String)strprintf(_("Unable to open file \"%s\""),filename.c_str()); - add_recent_file(as); + if (as.find(DEFAULT_FILENAME_PREFIX) != 0) + add_recent_file(as); handle instance(Instance::create(canvas));