From 004a49b0c7051a4d0f8972b0aff0ef8fa9cab03d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 21 Mar 2006 21:08:24 +0000 Subject: [PATCH] Gtkmm2ext::Choice now inherits from Gtk::Dialog; embed/import rate mismatch dialog no longer hangs in recursive Main::run() call git-svn-id: svn://localhost/trunk/ardour2@414 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour.menus | 3 +- gtk2_ardour/editor_actions.cc | 4 +-- gtk2_ardour/editor_ops.cc | 29 ++++++++++--------- gtk2_ardour/redirect_box.cc | 12 +++----- gtk2_ardour/route_ui.cc | 9 +++--- gtk2_ardour/visual_time_axis.cc | 20 ++++++------- libs/gtkmm2ext/choice.cc | 48 +++++++++---------------------- libs/gtkmm2ext/gtkmm2ext/choice.h | 24 +++------------- 8 files changed, 52 insertions(+), 97 deletions(-) diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus index 3f4b347bc2..6176032d12 100644 --- a/gtk2_ardour/ardour.menus +++ b/gtk2_ardour/ardour.menus @@ -308,7 +308,6 @@ - - + diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 97daccfde0..d0a5c90144 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -340,9 +340,7 @@ Editor::register_actions () ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFilesystem"), _("By Source Filesystem"), bind (mem_fun(*this, &Editor::reset_region_list_sort_type), BySourceFileFS)); - act = ActionManager::register_action (rl_actions, X_("rlEmbedAudio"), _("Embed audio (link)"), mem_fun(*this, &Editor::embed_audio)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (rl_actions, X_("rlImportAudio"), _("Embed audio (link)"), bind (mem_fun(*this, &Editor::import_audio), false)); + act = ActionManager::register_action (rl_actions, X_("addExternalAudio"), _("Embed audio (link)"), mem_fun(*this, &Editor::embed_audio)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::register_toggle_action (editor_actions, X_("ToggleWaveformVisibility"), _("Show Waveforms"), mem_fun (*this, &Editor::toggle_waveform_visibility)); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index cb9f19c5ed..f5baecb373 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -199,10 +199,9 @@ Do you really want to destroy %1 ?"), Gtkmm2ext::Choice prompter (prompt, choices); - prompter.chosen.connect (ptr_fun (Main::quit)); - prompter.show_all (); - - Main::run (); + if (prompter.run () != RESPONSE_ACCEPT) { + return; + } if (prompter.get_choice() != 0) { return; @@ -2128,10 +2127,16 @@ Editor::reject_because_rate_differs (const string & path, SoundFileInfo& finfo, string_compose (_("%1\nThis audiofile's sample rate doesn't match the session sample rate!"), path), choices); - rate_choice.chosen.connect (ptr_fun (Main::quit)); - rate_choice.show_all (); + int response = rate_choice.run(); - Main::run (); + switch (response) { + case RESPONSE_ACCEPT: + break; + default: + /* stop all that might come after this */ + return -2; + break; + } switch (rate_choice.get_choice()) { case 0: /* do it anyway */ @@ -3546,13 +3551,11 @@ Editor::remove_last_capture () choices.push_back (_("No, do nothing.")); Gtkmm2ext::Choice prompter (prompt, choices); - prompter.chosen.connect (ptr_fun (Main::quit)); - prompter.show_all (); - - Main::run (); - if (prompter.get_choice() == 0) { - session->remove_last_capture (); + if (prompter.run () == RESPONSE_ACCEPT) { + if (prompter.get_choice() == 0) { + session->remove_last_capture (); + } } } else { diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index 15442bbaeb..e95596fbf9 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -900,17 +900,13 @@ RedirectBox::clear_redirects() Gtkmm2ext::Choice prompter (prompt, choices); - prompter.chosen.connect(sigc::ptr_fun(Gtk::Main::quit)); - prompter.show_all (); - - Gtk::Main::run (); - - if (prompter.get_choice() == 0) { - _route.clear_redirects (this); + if (prompter.run () == RESPONSE_ACCEPT) { + if (prompter.get_choice() == 0) { + _route.clear_redirects (this); + } } } - void RedirectBox::edit_redirect (Redirect* redirect) { diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index e974b88a97..bf286e36f0 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -703,13 +703,12 @@ RouteUI::remove_this_route () Choice prompter (prompt, choices); - prompter.chosen.connect(sigc::ptr_fun(Gtk::Main::quit)); prompter.show_all (); - Gtk::Main::run (); - - if (prompter.get_choice() == 0) { - Glib::signal_idle().connect (bind (sigc::ptr_fun (&RouteUI::idle_remove_this_route), this)); + if (prompter.run () == RESPONSE_ACCEPT) { + if (prompter.get_choice() == 0) { + Glib::signal_idle().connect (bind (sigc::ptr_fun (&RouteUI::idle_remove_this_route), this)); + } } } diff --git a/gtk2_ardour/visual_time_axis.cc b/gtk2_ardour/visual_time_axis.cc index 2b9a55bb5c..23af21aaca 100644 --- a/gtk2_ardour/visual_time_axis.cc +++ b/gtk2_ardour/visual_time_axis.cc @@ -279,18 +279,14 @@ VisualTimeAxis::remove_this_time_axis(void* src) Gtkmm2ext::Choice prompter (prompt, choices); - prompter.chosen.connect(sigc::ptr_fun(Gtk::Main::quit)); - prompter.show_all (); - - Gtk::Main::run (); - - if (prompter.get_choice() == 0) - { - /* - defer to idle loop, otherwise we'll delete this object - while we're still inside this function ... - */ - Glib::signal_idle().connect(bind(sigc::ptr_fun(&VisualTimeAxis::idle_remove_this_time_axis), this, src)); + if (prompter.run () == RESPONSE_ACCEPT) { + if (prompter.get_choice() == 0) { + /* + defer to idle loop, otherwise we'll delete this object + while we're still inside this function ... + */ + Glib::signal_idle().connect(bind(sigc::ptr_fun(&VisualTimeAxis::idle_remove_this_time_axis), this, src)); + } } } diff --git a/libs/gtkmm2ext/choice.cc b/libs/gtkmm2ext/choice.cc index 195716ada9..d1de376312 100644 --- a/libs/gtkmm2ext/choice.cc +++ b/libs/gtkmm2ext/choice.cc @@ -18,6 +18,7 @@ $Id$ */ +#include #include using namespace std; @@ -25,39 +26,27 @@ using namespace Gtkmm2ext; using namespace sigc; using namespace Gtk; -Choice::Choice (string prompt, - vector choices) - : Gtk::Window (WINDOW_TOPLEVEL), - prompt_label (prompt) +Choice::Choice (string prompt, vector choices) { int n; vector::iterator i; set_position (Gtk::WIN_POS_CENTER); set_name ("ChoiceWindow"); - add (packer); - - packer.set_spacing (10); - packer.set_border_width (10); - packer.pack_start (prompt_label); - packer.pack_start (button_packer); - prompt_label.set_name ("ChoicePrompt"); + + Label* label = manage (new Label (prompt)); + label->show (); + + get_vbox()->pack_start (*label); for (n = 0, i = choices.begin(); i != choices.end(); ++i, ++n) { - Button *button = manage (new Gtk::Button (*i)); - button->set_name ("ChoiceButton"); - button_packer.set_spacing (5); - button_packer.set_homogeneous (true); - button_packer.pack_start (*button, false, true); + Button* button; - button->signal_clicked().connect (bind (mem_fun (*this, &Choice::_choice_made), n)); - buttons.push_back (button); + button = add_button (*i, RESPONSE_ACCEPT); + button->signal_button_release_event().connect (bind (mem_fun (*this, &Choice::choice_made), n), false); } - signal_delete_event().connect(mem_fun(*this, &Choice::closed)); - - packer.show_all (); which_choice = -1; } @@ -72,21 +61,12 @@ Choice::~Choice () { } -void -Choice::_choice_made (int nbutton) +bool +Choice::choice_made (GdkEventButton* ev, int nbutton) { which_choice = nbutton; - choice_made (which_choice); - chosen (); -} - -gint -Choice::closed (GdkEventAny *ev) -{ - which_choice = -1; - choice_made (which_choice); - chosen (); - return TRUE; + response (RESPONSE_ACCEPT); + return true; } int diff --git a/libs/gtkmm2ext/gtkmm2ext/choice.h b/libs/gtkmm2ext/gtkmm2ext/choice.h index 4b8baede52..8dfa5043fa 100644 --- a/libs/gtkmm2ext/gtkmm2ext/choice.h +++ b/libs/gtkmm2ext/gtkmm2ext/choice.h @@ -1,42 +1,26 @@ #ifndef __pbd_gtkmm_choice_h__ #define __pbd_gtkmm_choice_h__ -#include +#include +#include #include namespace Gtkmm2ext { -class Choice : public Gtk::Window +class Choice : public Gtk::Dialog { public: Choice (std::string prompt, std::vector choices); virtual ~Choice (); - /* This signal will be raised when a choice - is made or the choice window is deleted. - If the choice was to cancel, or the window - was deleted, then the argument will be -1. - Otherwise, it will be choice selected - of those presented, starting at zero. - */ - - sigc::signal choice_made; - sigc::signal chosen; - int get_choice (); protected: void on_realize (); private: - Gtk::VBox packer; - Gtk::Label prompt_label; - Gtk::HBox button_packer; - std::vector buttons; int which_choice; - - void _choice_made (int nbutton); - gint closed (GdkEventAny *); + bool choice_made (GdkEventButton* ev, int nbutton); }; } /* namespace */