void file_chooser::on_single_file_toggled () { std::string name (get_current_name ()); smatch m; if (regex_match (name, m, filename_re)) { if (!single_file_.get_active ()) return; set_current_name (m.str (1) + m.str (5)); } else { if (single_file_.get_active ()) return; fs::path path (get_current_name ()); fs::path stem (path.stem ()); fs::path ext (path.extension ()); path = stem; path = path.native () + default_pattern_; path.replace_extension (ext); set_current_name (path.string ()); } }
void ChooseFileWindow::on_change_filename() { string filename = (string) get_current_name(); if (!(ends_with(filename, ".obj") || ends_with(filename, ".OBJ"))) { set_current_name(filename + ".obj"); } }
void file_chooser::on_file_type_changed () { Glib::RefPtr< Gtk::TreeSelection > s (file_type_.get_selection ()); if (!s) return; Gtk::TreeModel::iterator it (s->get_selected ()); if (!it) return; Gtk::TreeModel::Row r (*it); extension_list l (r[column->exts]); if (l.empty ()) { expander_.set_label (_("File Type")); } else { expander_.set_label ((format (_("File type: %1%")) % r.get_value (column->text)).str ()); if (!count (l.begin (), l.end (), get_current_extension ())) set_current_extension (l.front ()); } if (!single_image_mode_) { single_file_.set_sensitive (supports_multi_image (get_current_name ())); if (!supports_multi_image (get_current_name ())) { if (!regex_match (get_current_name (), filename_re)) { fs::path path (get_current_name ()); fs::path stem (path.stem ()); fs::path ext (path.extension ()); path = stem; path = path.native () + default_pattern_; path.replace_extension (ext); set_current_name (path.string ()); } } single_file_.set_active (requests_single_file (get_current_name ())); } }
void file_chooser::set_current_extension (const std::string& extension) { if (extension == get_current_extension ()) return; set_current_name (fs::path (get_current_name ()) .replace_extension (extension).string ()); }
void file_chooser::set_current_name (const std::string& name) { if (name == get_current_name ()) return; impl_.set_current_name (name); set_filename (get_filename ()); }
void file_chooser::watch_() { // As long as the user cannot notice any discrepancy between the // file name, format and single file toggle, any value of t will // be just fine. A value of 100 ms appears to be good enough. struct timespec t = { 0, 100000000 /* ns */ }; while (!cancel_watch_ && 0 == nanosleep (&t, 0)) { std::string name (get_current_name ()); if (name == cached_name_) continue; cached_name_ = name; { lock_guard< mutex > lock (name_change_mutex_); name_change_queue_.push (cached_name_); } gui_name_change_dispatch_.emit (); } }
void file_chooser::on_response (int response_id) { if (Gtk::RESPONSE_ACCEPT != response_id) return; if (get_current_extension ().empty ()) set_current_extension (default_extension_); std::string fmt; { // check whether extension is known std::string ext (get_current_extension ()); bool found = false; Gtk::TreeModel::Children children (file_type_.get_model ()->children ()); for (Gtk::TreeModel::Children::const_iterator it = children.begin (); !found && children.end () != it; ++it) { Gtk::TreeModel::Row r = *it; extension_list l = r[column->exts]; found = count (l.begin (), l.end (), ext); if (found) fmt = r[column->text]; } if (!found) { Gtk::MessageDialog tbd (*this, _("Unsupported file format."), use_markup, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, modal); tbd.set_secondary_text ((format (_("The '%1%' file extension is not associated with" " a supported file format. Please select a file" " format or use one of the known file extensions.")) % ext).str ()); if (dynamic_cast< Gtk::Window * > (this)) get_group ()->add_window (tbd); tbd.run (); signal_response ().emission_stop (); response (Gtk::RESPONSE_CANCEL); return; } } if (!single_image_mode_ && requests_single_file (get_current_name ())) { // check whether single file is okay if (!supports_multi_image (get_current_name ())) { Gtk::MessageDialog tbd (*this, (format (_("The %1% format does not support multiple" " images in a single file.")) % fmt).str (), use_markup, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, modal); tbd.set_secondary_text ((format (_("Please save to PDF or TIFF if you want a single" " file. If you prefer the %1% image format, use" " a filename such as 'Untitled-%%3i%2%'.")) % fmt % get_current_extension ()).str ()); if (dynamic_cast< Gtk::Window * > (this)) get_group ()->add_window (tbd); tbd.run (); signal_response ().emission_stop (); response (Gtk::RESPONSE_CANCEL); return; } } if (!do_overwrite_confirmation_) return; format message; format details; if (requests_single_file (get_current_name ())) { if (!fs::exists (std::string (get_filename ()))) return; message = format (_("The name \"%1%\" already exists.\n" "OK to overwrite this name using the new settings?")); details = format (_("The file already exists in \"%1%\"." " Replacing it will overwrite its contents.")); } else { // FIXME Add meaningful checking // if (no_possible_matches ) return; message = format (_("Files matching \"%1%\" may already exist." " Do you want to replace them?")); //details = format (_("These files already exist in \"%1%\"." // " Replacing them may overwrite their contents.")); // FIXME show list of matching files in an expander with details } message % get_current_name (); if (0 < details.size ()) details % get_current_folder (); Gtk::MessageDialog tbd (*this, message.str (), use_markup, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE, modal); if (0 < details.size ()) tbd.set_secondary_text (details.str ()); tbd.add_button (Gtk::Stock::NO , Gtk::RESPONSE_CANCEL); tbd.add_button (Gtk::Stock::YES, Gtk::RESPONSE_ACCEPT); tbd.set_default_response (Gtk::RESPONSE_ACCEPT); if (dynamic_cast< Gtk::Window * > (this)) get_group ()->add_window (tbd); if (Gtk::RESPONSE_ACCEPT != tbd.run ()) { signal_response ().emission_stop (); response (Gtk::RESPONSE_CANCEL); } }
std::string file_chooser::get_current_extension () const { return fs::path (get_current_name ()).extension ().string (); }