Use non-modal color dialog for Trigger UI

This commit is contained in:
Robin Gareus
2025-08-29 03:54:31 +02:00
parent 699fc983ae
commit d5170b0025
3 changed files with 24 additions and 28 deletions

View File

@@ -236,7 +236,7 @@ SlotPropertyTable::SlotPropertyTable ()
_load_button.signal_clicked.connect (sigc::bind((sigc::mem_fun (*this, (&TriggerUI::choose_sample))), false));
_color_button.set_name("FollowAction");
_color_button.signal_clicked.connect (sigc::mem_fun (*this, (&TriggerUI::choose_color)));
_color_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, (&TriggerUI::choose_color)), dynamic_cast<Gtk::Window*> (get_toplevel())));
_follow_size_group = Gtk::SizeGroup::create (Gtk::SIZE_GROUP_VERTICAL);
_follow_size_group->add_widget(_name_frame);

View File

@@ -49,6 +49,7 @@
#include "keyboard.h"
#include "public_editor.h"
#include "region_view.h"
#include "stripable_colorpicker.h"
#include "trigger_jump_dialog.h"
#include "ui_config.h"
@@ -143,34 +144,17 @@ TriggerUI::trigger_swap (uint32_t n)
}
void
TriggerUI::choose_color ()
TriggerUI::choose_color (Gtk::Window* parent)
{
// TODO use StripableColorDialog and see note there regarding eyedropper..
if (!_color_dialog) {
_color_dialog = new Gtk::ColorSelectionDialog;
_color_dialog = new StripableColorDialog;
color_connection.disconnect ();
}
_color_dialog->get_color_selection()->set_has_opacity_control (false);
_color_dialog->get_color_selection()->set_has_palette (true);
_color_dialog->get_ok_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (_color_dialog, &Gtk::Dialog::response), Gtk::RESPONSE_ACCEPT));
_color_dialog->get_cancel_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (_color_dialog, &Gtk::Dialog::response), Gtk::RESPONSE_CANCEL));
tref.box()->DropReferences.connect (trigger_connections,invalidator (*this), [this]() { _color_dialog->reset (); color_connection.disconnect (); }, gui_context());
color_connection = _color_dialog->ColorChanged.connect ([this](uint32_t color) { if (trigger ()) { trigger()->set_color(color); }});
Gdk::Color c = Gtkmm2ext::gdk_color_from_rgba(trigger()->color());
_color_dialog->get_color_selection()->set_previous_color (c);
_color_dialog->get_color_selection()->set_current_color (c);
switch (_color_dialog->run()) {
case Gtk::RESPONSE_ACCEPT: {
c = _color_dialog->get_color_selection()->get_current_color();
color_t ct = Gtkmm2ext::gdk_color_to_rgba(c);
trigger()->set_color(ct);
} break;
default:
break;
}
_color_dialog->hide ();
_color_dialog->popup (_("Set Trigger Color"), trigger()->color(), parent);
}
void
@@ -406,7 +390,7 @@ TriggerUI::context_menu ()
items.push_back (MenuElem (_("Load..."), sigc::bind(sigc::mem_fun (*this, (&TriggerUI::choose_sample)), true)));
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Color..."), sigc::mem_fun (*this, &TriggerUI::choose_color)));
items.push_back (MenuElem (_("Color..."), sigc::bind (sigc::mem_fun (*this, &TriggerUI::choose_color), (Gtk::Window*)NULL)));
items.push_back (MenuElem (_("Clear"), sigc::mem_fun (*this, &TriggerUI::clear_trigger)));
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("MIDI Learn"), sigc::mem_fun (*this, &TriggerUI::trigger_midi_learn)));
@@ -805,5 +789,16 @@ TriggerUI::set_trigger (ARDOUR::TriggerReference tr)
tref.box()->TriggerSwapped.connect (trigger_swap_connection, invalidator (*this), std::bind (&TriggerUI::trigger_swap, this, _1), gui_context ());
if (_color_dialog) {
if (trigger()) {
Gdk::Color c = Gtkmm2ext::gdk_color_from_rgba(trigger()->color());
_color_dialog->get_color_selection()->set_previous_color (c);
_color_dialog->get_color_selection()->set_current_color (c);
} else {
color_connection.disconnect ();
_color_dialog->reset ();
}
}
on_trigger_set(); //derived classes can do initialization here
}

View File

@@ -18,7 +18,6 @@
#pragma once
#include "ytkmm/colorselection.h"
#include "ytkmm/entry.h"
#include "gtkmm2ext/actions.h"
@@ -35,6 +34,7 @@ namespace Gtk
}
class TriggerJumpDialog;
class StripableColorDialog;
class TriggerUI : virtual public sigc::trackable
{
@@ -67,7 +67,7 @@ public:
ARDOUR::TriggerPtr trigger() const;
ARDOUR::TriggerBox& triggerbox() const { return trigger()->box(); }
void choose_color ();
void choose_color (Gtk::Window*);
void choose_sample (bool allow_multiple_select);
void sample_chosen (int r);
@@ -121,12 +121,13 @@ protected:
Gtk::Menu* _context_menu;
bool _ignore_menu_action;
Gtk::ColorSelectionDialog* _color_dialog;
StripableColorDialog* _color_dialog;
void trigger_swap (uint32_t);
PBD::ScopedConnection trigger_swap_connection;
ARDOUR::TriggerReference tref;
sigc::connection color_connection;
PBD::ScopedConnectionList trigger_connections;
};