diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 7239dced3c..f0f7fb6da3 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -470,6 +470,7 @@ ARDOUR_UI::ask_about_saving_session (const string & what) prompt_label.set_text (prompt); prompt_label.set_name (X_("PrompterLabel")); prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP); + dhbox.set_homogeneous (false); dhbox.pack_start (*dimage, true, false, 5); dhbox.pack_start (prompt_label, true, false, 5); window.get_vbox()->pack_start (dhbox); @@ -1532,6 +1533,7 @@ ARDOUR_UI::snapshot_session () prompter.set_name ("Prompter"); prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); prompter.set_prompt (_("Name of New Snapshot")); prompter.set_initial_text (now); @@ -1681,7 +1683,8 @@ ARDOUR_UI::save_template () prompter.set_prompt (_("Name for mix template:")); prompter.set_initial_text(session->name() + _("-template")); prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); - + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); + switch (prompter.run()) { case RESPONSE_ACCEPT: prompter.get_result (name); diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index 42ad1656fa..aae3b8a505 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -835,6 +835,7 @@ AudioTimeAxisView::rename_current_playlist () prompter.set_prompt (_("Name for playlist")); prompter.set_initial_text (pl->name()); prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); switch (prompter.run ()) { case Gtk::RESPONSE_ACCEPT: @@ -869,6 +870,7 @@ AudioTimeAxisView::use_copy_playlist (bool prompt) prompter.set_prompt (_("Name for Playlist")); prompter.set_initial_text (name); prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); prompter.show_all (); switch (prompter.run ()) { @@ -908,6 +910,7 @@ AudioTimeAxisView::use_new_playlist (bool prompt) prompter.set_prompt (_("Name for Playlist")); prompter.set_initial_text (name); prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); switch (prompter.run ()) { case Gtk::RESPONSE_ACCEPT: diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index cafe1cec0c..df64b9ed43 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -34,6 +34,7 @@ #include "gui_thread.h" #include "simplerect.h" #include "actions.h" +#include "prompter.h" #include "i18n.h" @@ -807,10 +808,10 @@ Editor::marker_menu_rename () if (!loc) return; - Dialog dialog; - Entry entry; - HBox dhbox; - Label dlabel (_("New Name:")); + ArdourPrompter dialog (true); + string txt; + + dialog.set_prompt (_("New Name:")); if (loc->is_mark()) { dialog.set_title (_("ardour: rename mark")); @@ -821,20 +822,12 @@ Editor::marker_menu_rename () dialog.set_name ("MarkRenameWindow"); dialog.set_size_request (250, -1); dialog.set_position (Gtk::WIN_POS_MOUSE); - dialog.set_modal (true); - dhbox.pack_start (dlabel, true, false, 10); - dhbox.pack_start (entry, true, false, 10); - dialog.get_vbox()->pack_start (dhbox, true, false, 10); - dialog.add_button (Stock::CANCEL, RESPONSE_CANCEL); dialog.add_button (_("Rename"), RESPONSE_ACCEPT); - dialog.set_default_response (RESPONSE_ACCEPT); + dialog.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); + dialog.set_initial_text (loc->name()); - entry.set_text (loc->name()); - entry.set_name ("MarkerNameDisplay"); - - dialog.show_all (); - entry.grab_focus (); + dialog.show (); switch (dialog.run ()) { case RESPONSE_ACCEPT: @@ -846,7 +839,8 @@ Editor::marker_menu_rename () begin_reversible_command ( _("rename marker") ); session->add_undo( session->locations()->get_memento() ); - loc->set_name (entry.get_text()); + dialog.get_result(txt); + loc->set_name (txt); session->add_redo_no_execute( session->locations()->get_memento() ); commit_reversible_command (); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index ab3560448c..8eb97f2165 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -4607,6 +4607,7 @@ Editor::mouse_rename_region (ArdourCanvas::Item* item, GdkEvent* event) prompter.set_prompt (_("Name for region:")); prompter.set_initial_text (clicked_regionview->region.name()); prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); prompter.show_all (); switch (prompter.run ()) { case Gtk::RESPONSE_ACCEPT: diff --git a/gtk2_ardour/editor_selection_list.cc b/gtk2_ardour/editor_selection_list.cc index 9ede3f906a..be4c52d621 100644 --- a/gtk2_ardour/editor_selection_list.cc +++ b/gtk2_ardour/editor_selection_list.cc @@ -109,6 +109,7 @@ Editor::name_selection () p.set_prompt (_("Name for Chunk:")); p.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); + p.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); p.change_labels (_("Create Chunk"), _("Forget it")); p.show_all (); diff --git a/gtk2_ardour/meter_bridge_strip.cc b/gtk2_ardour/meter_bridge_strip.cc index d6422add40..50562a68d0 100644 --- a/gtk2_ardour/meter_bridge_strip.cc +++ b/gtk2_ardour/meter_bridge_strip.cc @@ -221,6 +221,7 @@ MeterBridgeStrip::label_button_press_release (GdkEventButton *ev) prompter.set_prompt (_("New Name for Meter:")); prompter.set_initial_text (label.get_text()); prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); prompter.show_all(); switch (prompter.run ()) { diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index 52c0350181..1f28d6a9f4 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -64,7 +64,7 @@ PluginSelector::PluginSelector (PluginManager *mgr) amodel = Gtk::ListStore::create(acols); added_list.set_model (amodel); - added_list.append_column (_("Plugins to be Applied to Channel"), acols.text); + added_list.append_column (_("Plugins to be Connected to Insert"), acols.text); added_list.set_headers_visible (true); added_list.set_reorderable (false); @@ -114,7 +114,7 @@ PluginSelector::PluginSelector (PluginManager *mgr) table->attach(ascroller, 0, 7, 7, 9); add_button (Stock::CANCEL, RESPONSE_CANCEL); - add_button (Stock::APPLY, RESPONSE_APPLY); + add_button (Stock::CONNECT, RESPONSE_APPLY); set_default_response (RESPONSE_APPLY); get_vbox()->pack_start (*table); diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 423b0c0b82..00b5ad2dc7 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -862,6 +862,7 @@ PlugUIBase::save_plugin_setting () ArdourPrompter prompter (true); prompter.set_prompt(_("Name of New Preset:")); prompter.add_button (Gtk::Stock::ADD, Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); prompter.show_all(); diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index 2ded0b10fb..87b31d8c03 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -746,6 +746,7 @@ RedirectBox::rename_redirect (Redirect* redirect) name_prompter.set_prompt (_("rename redirect")); name_prompter.set_initial_text (redirect->name()); name_prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + name_prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); name_prompter.show_all (); switch (name_prompter.run ()) { diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index b46574a0cc..af32215c51 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -727,9 +727,10 @@ RouteUI::route_rename () { ArdourPrompter name_prompter (true); string result; - name_prompter.set_prompt (_("new name: ")); + name_prompter.set_prompt (_("New Name: ")); name_prompter.set_initial_text (_route.name()); name_prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + name_prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); name_prompter.show_all (); switch (name_prompter.run ()) { diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 10f1530612..149b7f66ca 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -236,6 +236,7 @@ SoundFileBox::add_field_clicked () prompter.set_prompt (_("Name for Field")); prompter.add_button (Gtk::Stock::ADD, Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); switch (prompter.run ()) { case Gtk::RESPONSE_ACCEPT: diff --git a/gtk2_ardour/visual_time_axis.cc b/gtk2_ardour/visual_time_axis.cc index cf2582bd15..b6c96c55ab 100644 --- a/gtk2_ardour/visual_time_axis.cc +++ b/gtk2_ardour/visual_time_axis.cc @@ -323,6 +323,7 @@ VisualTimeAxis::start_time_axis_rename() name_prompter.set_prompt (_("new name: ")) ; name_prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + name_prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); name_prompter.show_all() ; switch (name_prompter.run ()) { diff --git a/libs/gtkmm2ext/gtkmm2ext/prompter.h b/libs/gtkmm2ext/gtkmm2ext/prompter.h index 795d982295..9847e73661 100644 --- a/libs/gtkmm2ext/gtkmm2ext/prompter.h +++ b/libs/gtkmm2ext/gtkmm2ext/prompter.h @@ -54,13 +54,14 @@ class Prompter : public Gtk::Dialog void change_labels (std::string ok, std::string cancel); void get_result (std::string &str, bool strip=true); + bool maybe_allow_response (GdkEventKey* ); protected: Gtk::Entry& the_entry() { return entry; } private: Gtk::Entry entry; - Gtk::VBox entryBox; + Gtk::HBox entryBox; Gtk::Label entryLabel; void init (); diff --git a/libs/gtkmm2ext/prompter.cc b/libs/gtkmm2ext/prompter.cc index 508e509868..c3a04f19a8 100644 --- a/libs/gtkmm2ext/prompter.cc +++ b/libs/gtkmm2ext/prompter.cc @@ -48,14 +48,15 @@ Prompter::init () set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG); set_position (Gtk::WIN_POS_MOUSE); set_name ("Prompter"); - - set_default_response (Gtk::RESPONSE_ACCEPT); add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); /* Alas a generic 'affirmative' button seems a bit useless sometimes. You will have to add your own. + After adding, use : + set_response_sensitive (Gtk::RESPONSE_ACCEPT, false) + to prevent the RESPONSE_ACCEPT button from permitting blank strings. */ entryLabel.set_line_wrap (true); @@ -69,7 +70,7 @@ Prompter::init () get_vbox()->pack_start (entryBox); show_all_children(); - + entry.signal_key_release_event().connect (mem_fun (*this, &Prompter::maybe_allow_response)); entry.signal_activate().connect (bind (mem_fun (*this, &Prompter::response), Gtk::RESPONSE_ACCEPT)); } @@ -88,3 +89,23 @@ Prompter::get_result (string &str, bool strip) strip_whitespace_edges (str); } } + +bool +Prompter::maybe_allow_response (GdkEventKey* ev) +{ + /* + This is set up so that entering text in the entry + field makes the RESPONSE_ACCEPT button active. + Of course if you haven't added a RESPONSE_ACCEPT + button, nothing will happen at all. + */ + + if (entry.get_text() != "") { + set_response_sensitive (Gtk::RESPONSE_ACCEPT, true); + set_default_response (Gtk::RESPONSE_ACCEPT); + } else { + set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); + } + return true; +} +