From cd4b6e85a810b94b638d32710741ed1f07ce0a31 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 7 Dec 2022 21:27:46 -0700 Subject: [PATCH] pick route colors from the color palette (with random variation) #9115 --- gtk2_ardour/axis_view.cc | 2 +- gtk2_ardour/utils.cc | 20 +++++++++++++++++++- gtk2_ardour/utils.h | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/axis_view.cc b/gtk2_ardour/axis_view.cc index b13a0d8891..b87e911536 100644 --- a/gtk2_ardour/axis_view.cc +++ b/gtk2_ardour/axis_view.cc @@ -65,7 +65,7 @@ AxisView::~AxisView() Gdk::Color AxisView::unique_random_color() { - return ::unique_random_color (used_colors); + return ::unique_random_color (used_colors, true); } string diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 3f07bd3b39..7e69da7815 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -680,10 +680,28 @@ ARDOUR_UI_UTILS::escape_underscores (string const & s) } Gdk::Color -ARDOUR_UI_UTILS::unique_random_color (list& used_colors) +ARDOUR_UI_UTILS::unique_random_color (list& used_colors, bool from_palette) { Gdk::Color newcolor; + if (from_palette) { + + string cp = UIConfiguration::instance().get_stripable_color_palette (); + Gdk::ArrayHandle_Color gc = ColorSelection::palette_from_string (cp); + std::vector c (gc); + int n = random () % c.size(); + Gtkmm2ext::HSV hsv (Gtkmm2ext::gdk_color_to_rgba (c[n])); + + do { + newcolor.set_hsv (hsv.h, hsv.s, hsv.v); + hsv = random() % 1000 > 500 ? hsv.darker ((random() % 500) / 1000.0) : hsv.lighter ((random() % 500 / 1000.0)); + } while (find (used_colors.begin(), used_colors.end(), newcolor) != used_colors.end()); + + used_colors.push_back (newcolor); + + return newcolor; + } + while (1) { double h, s, v; diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index 49d6eb6845..aa5a705eea 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -98,7 +98,7 @@ void resize_window_to_proportion_of_monitor (Gtk::Window*, int, int); std::string escape_underscores (std::string const &); -Gdk::Color unique_random_color (std::list &); +Gdk::Color unique_random_color (std::list &, bool from_palette = false); std::string rate_as_string (float r); std::string samples_as_time_string (ARDOUR::samplecnt_t s, float r, bool show_samples = false);