summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-06-12 14:33:18 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-06-12 14:54:01 -0400
commit0852d05643fcedd5eaeb0217c4afa9c95218ef17 (patch)
tree8ca2529b97125eee8b1e72417f536de29de79e6f
parentb3b246b7243895fd08a01d184c182fa561f2900e (diff)
remove RouteGroupDialog::do_run() and replace its use with code that doesn't rely on a recursive run loop
-rw-r--r--gtk2_ardour/add_route_dialog.cc38
-rw-r--r--gtk2_ardour/add_route_dialog.h3
-rw-r--r--gtk2_ardour/group_tabs.cc4
-rw-r--r--gtk2_ardour/route_group_dialog.cc50
-rw-r--r--gtk2_ardour/route_group_dialog.h2
-rw-r--r--gtk2_ardour/route_group_menu.cc22
-rw-r--r--gtk2_ardour/route_group_menu.h5
7 files changed, 76 insertions, 48 deletions
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc
index aecff1c845..5619e97b8d 100644
--- a/gtk2_ardour/add_route_dialog.cc
+++ b/gtk2_ardour/add_route_dialog.cc
@@ -30,6 +30,7 @@
#include "pbd/convert.h"
#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/doi.h"
#include "ardour/plugin_manager.h"
#include "ardour/profile.h"
@@ -585,19 +586,34 @@ AddRouteDialog::group_changed ()
{
if (_session && route_group_combo.get_active_text () == _("New Group...")) {
RouteGroup* g = new RouteGroup (*_session, "");
- RouteGroupDialog d (g, true);
-
- if (d.do_run ()) {
- delete g;
- route_group_combo.set_active (2);
- } else {
- if (_session) {
- _session->add_route_group (g);
- }
- add_route_group (g);
- route_group_combo.set_active (3);
+ RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+ d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &AddRouteDialog::new_group_dialog_finished), d));
+ d->present();
+ }
+}
+
+void
+AddRouteDialog::new_group_dialog_finished (int r, RouteGroupDialog* d)
+{
+ if (r == RESPONSE_OK) {
+
+ if (!d->name_check()) {
+ return;
+ }
+
+ if (_session) {
+ _session->add_route_group (d->group());
}
+
+ add_route_group (d->group());
+ route_group_combo.set_active (3);
+ } else {
+ delete d->group ();
+ route_group_combo.set_active (2);
}
+
+ delete_when_idle (d);
}
AddRouteDialog::InsertAt
diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h
index f10fc11292..6856220295 100644
--- a/gtk2_ardour/add_route_dialog.h
+++ b/gtk2_ardour/add_route_dialog.h
@@ -42,6 +42,7 @@
#include "instrument_selector.h"
class Editor;
+class RouteGroupDialog;
class AddRouteDialog : public ArdourDialog
{
@@ -107,7 +108,7 @@ class AddRouteDialog : public ArdourDialog
void maybe_update_name_template_entry ();
void reset_template_option_visibility ();
-
+ void new_group_dialog_finished (int, RouteGroupDialog*);
void on_show ();
struct ChannelSetup {
diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc
index 057f551636..cf2a605089 100644
--- a/gtk2_ardour/group_tabs.cc
+++ b/gtk2_ardour/group_tabs.cc
@@ -603,6 +603,10 @@ GroupTabs::new_group_dialog_finished (int r, RouteGroupDialog* d, RouteList cons
{
if (r == RESPONSE_OK) {
+ if (!d->name_check()) {
+ return;
+ }
+
_session->add_route_group (d->group());
if (rl) {
diff --git a/gtk2_ardour/route_group_dialog.cc b/gtk2_ardour/route_group_dialog.cc
index 51db0adcb1..b1a75794ce 100644
--- a/gtk2_ardour/route_group_dialog.cc
+++ b/gtk2_ardour/route_group_dialog.cc
@@ -126,12 +126,12 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, bool creating_new)
_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_color.signal_color_set().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_gain.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _relative.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _mute.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _solo.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _rec_enable.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _select.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- _route_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _relative.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _mute.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _solo.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _rec_enable.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _select.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+ _route_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_share_color.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
_share_monitoring.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
@@ -178,35 +178,27 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, bool creating_new)
show_all_children ();
}
-/** @return true if the route group edit was cancelled, otherwise false */
bool
-RouteGroupDialog::do_run ()
+RouteGroupDialog::name_check () const
{
- while (1) {
- int const r = run ();
+ if (unique_name (_name.get_text())) {
+ /* not cancelled and the name is ok, so all is well */
+ return true;
+ }
- if (r != Gtk::RESPONSE_OK) {
- return true;
- }
+ _group->set_name (_initial_name);
- if (unique_name (_name.get_text())) {
- /* not cancelled and the name is ok, so all is well */
- return false;
- }
+ MessageDialog msg (
+ _("The group name is not unique. Please use a different name."),
+ false,
+ Gtk::MESSAGE_ERROR,
+ Gtk::BUTTONS_OK,
+ true
+ );
- _group->set_name (_initial_name);
- MessageDialog msg (
- _("The group name is not unique. Please use a different name."),
- false,
- Gtk::MESSAGE_ERROR,
- Gtk::BUTTONS_OK,
- true
- );
-
- msg.run ();
- }
+ msg.set_position (WIN_POS_MOUSE);
+ msg.run ();
- abort(); /* NOTREACHED */
return false;
}
diff --git a/gtk2_ardour/route_group_dialog.h b/gtk2_ardour/route_group_dialog.h
index e43ccba79f..5489cd2653 100644
--- a/gtk2_ardour/route_group_dialog.h
+++ b/gtk2_ardour/route_group_dialog.h
@@ -32,8 +32,8 @@ class RouteGroupDialog : public ArdourDialog
public:
RouteGroupDialog (ARDOUR::RouteGroup *, bool);
- bool do_run ();
ARDOUR::RouteGroup* group() const { return _group; }
+ bool name_check () const;
private:
ARDOUR::RouteGroup* _group;
diff --git a/gtk2_ardour/route_group_menu.cc b/gtk2_ardour/route_group_menu.cc
index f4c7611ae7..4793588cee 100644
--- a/gtk2_ardour/route_group_menu.cc
+++ b/gtk2_ardour/route_group_menu.cc
@@ -19,12 +19,16 @@
#include <gtkmm/menu.h>
#include <gtkmm/stock.h>
+
#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/doi.h"
+
#include "ardour/session.h"
#include "ardour/route_group.h"
#include "ardour/route.h"
#include "route_group_menu.h"
#include "route_group_dialog.h"
+
#include "i18n.h"
using namespace Gtk;
@@ -158,14 +162,22 @@ RouteGroupMenu::new_group ()
}
RouteGroup* g = new RouteGroup (*_session, "");
- RouteGroupDialog d (g, true);
+ RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+ d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::new_group_dialog_finished), d));
+}
- if (d.do_run ()) {
- delete g;
+void
+RouteGroupMenu::new_group_dialog_finished (int r, RouteGroupDialog* d)
+{
+ if (r == RESPONSE_OK) {
+ _session->add_route_group (d->group());
+ set_group (d->group());
} else {
- _session->add_route_group (g);
- set_group (g);
+ delete d->group ();
}
+
+ delete_when_idle (d);
}
Gtk::Menu *
diff --git a/gtk2_ardour/route_group_menu.h b/gtk2_ardour/route_group_menu.h
index 5d711ff66f..51f222af2f 100644
--- a/gtk2_ardour/route_group_menu.h
+++ b/gtk2_ardour/route_group_menu.h
@@ -23,6 +23,8 @@
#include "ardour/route_group.h"
#include "ardour/session_handle.h"
+class RouteGroupDialog;
+
class RouteGroupMenu : public ARDOUR::SessionHandlePtr
{
public:
@@ -37,8 +39,9 @@ public:
void add_item (ARDOUR::RouteGroup *, std::set<ARDOUR::RouteGroup*> const &, Gtk::RadioMenuItem::Group*);
void new_group ();
void set_group (ARDOUR::RouteGroup *);
-
+ void new_group_dialog_finished (int, RouteGroupDialog*);
Gtk::Menu* _menu;
+
PBD::PropertyList* _default_properties;
bool _inhibit_group_selected;
ARDOUR::WeakRouteList _subject;