X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Ftheme_manager.cc;h=8374c5d1b9e57d5e3eb24ae11e0524e6e629b82a;hb=7598520fa6d3635449637c3377de3eb0f72278db;hp=b87a916d7b282b5ebeb05209b20e69e6267f94fa;hpb=700edbdf39917ca77529b2c490e5e1eb6e0c32e3;p=ardour.git diff --git a/gtk2_ardour/theme_manager.cc b/gtk2_ardour/theme_manager.cc index b87a916d7b..8374c5d1b9 100644 --- a/gtk2_ardour/theme_manager.cc +++ b/gtk2_ardour/theme_manager.cc @@ -18,12 +18,12 @@ */ #include -#include -#include #include #include "fix_carbon.h" +#include "pbd/gstdio_compat.h" + #include #include @@ -45,8 +45,7 @@ #include "ardour_dialog.h" #include "theme_manager.h" #include "rgb_macros.h" -#include "ardour_ui.h" -#include "global_signals.h" +#include "ui_config.h" #include "utils.h" #include "i18n.h" @@ -57,14 +56,8 @@ using namespace PBD; using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; -namespace ARDOUR_UI_UTILS { - sigc::signal ColorsChanged; - sigc::signal ColorChanged; -} - ThemeManager::ThemeManager() - : ArdourWindow (_("Theme Manager")) - , dark_button (_("Dark Theme")) + : dark_button (_("Dark Theme")) , light_button (_("Light Theme")) , reset_button (_("Restore Defaults")) , flat_buttons (_("Draw \"flat\" buttons")) @@ -76,50 +69,23 @@ ThemeManager::ThemeManager() , timeline_item_gradient_depth (0, 1.0, 0.05) , timeline_item_gradient_depth_label (_("Timeline item gradient depth")) , all_dialogs (_("All floating windows are dialogs")) + , transients_follow_front (_("Transient windows follow front window.")) , icon_set_label (_("Icon Set")) , palette_viewport (*palette_scroller.get_hadjustment(), *palette_scroller.get_vadjustment()) , palette_group (0) , palette_window (0) { - set_title (_("Theme Manager")); - - /* Basic color list */ - - basic_color_list = TreeStore::create (basic_color_columns); - basic_color_display.set_model (basic_color_list); - basic_color_display.append_column (_("Object"), basic_color_columns.name); - - Gtkmm2ext::CellRendererColorSelector* color_renderer = manage (new Gtkmm2ext::CellRendererColorSelector); - TreeViewColumn* color_column = manage (new TreeViewColumn (_("Color"), *color_renderer)); - color_column->add_attribute (color_renderer->property_color(), basic_color_columns.gdkcolor); - - basic_color_display.append_column (*color_column); - - basic_color_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); - basic_color_display.get_column (0)->set_expand (true); - basic_color_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); - basic_color_display.get_column (1)->set_expand (false); - basic_color_display.set_reorderable (false); - basic_color_display.get_selection()->set_mode (SELECTION_NONE); - basic_color_display.set_headers_visible (true); - - basic_color_display.signal_button_press_event().connect (sigc::mem_fun (*this, &ThemeManager::basic_color_button_press_event), false); - - scroller.add (basic_color_display); - scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC); - /* Now the alias list */ - + alias_list = TreeStore::create (alias_columns); alias_display.set_model (alias_list); - alias_display.append_column (_("Object"), basic_color_columns.name); + alias_display.append_column (_("Object"), alias_columns.name); - color_renderer = manage (new Gtkmm2ext::CellRendererColorSelector); - color_column = manage (new TreeViewColumn (_("Color"), *color_renderer)); + Gtkmm2ext::CellRendererColorSelector* color_renderer = manage (new Gtkmm2ext::CellRendererColorSelector); + TreeViewColumn* color_column = manage (new TreeViewColumn (_("Color"), *color_renderer)); color_column->add_attribute (color_renderer->property_color(), alias_columns.color); - alias_display.append_column (*color_column); - + alias_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); alias_display.get_column (0)->set_expand (true); alias_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); @@ -133,24 +99,26 @@ ThemeManager::ThemeManager() alias_scroller.add (alias_display); /* various buttons */ - + RadioButton::Group group = dark_button.get_group(); light_button.set_group(group); theme_selection_hbox.set_homogeneous(false); theme_selection_hbox.pack_start (dark_button); theme_selection_hbox.pack_start (light_button); - Gtk::VBox* vbox = Gtk::manage (new Gtk::VBox ()); - vbox->set_homogeneous (false); - vbox->pack_start (theme_selection_hbox, PACK_SHRINK); - vbox->pack_start (reset_button, PACK_SHRINK); + set_homogeneous (false); +#if 0 // disable light/dark theme choice. until the 'light theme gets some attention. + pack_start (theme_selection_hbox, PACK_SHRINK); +#endif + pack_start (reset_button, PACK_SHRINK); #ifndef __APPLE__ - vbox->pack_start (all_dialogs, PACK_SHRINK); + pack_start (all_dialogs, PACK_SHRINK); + pack_start (transients_follow_front, PACK_SHRINK); #endif - vbox->pack_start (flat_buttons, PACK_SHRINK); - vbox->pack_start (blink_rec_button, PACK_SHRINK); - vbox->pack_start (region_color_button, PACK_SHRINK); - vbox->pack_start (show_clipping_button, PACK_SHRINK); + pack_start (flat_buttons, PACK_SHRINK); + pack_start (blink_rec_button, PACK_SHRINK); + pack_start (region_color_button, PACK_SHRINK); + pack_start (show_clipping_button, PACK_SHRINK); Gtk::HBox* hbox; @@ -158,53 +126,50 @@ ThemeManager::ThemeManager() if (icon_sets.size() > 1) { Gtkmm2ext::set_popdown_strings (icon_set_dropdown, icon_sets); - icon_set_dropdown.set_active_text (ARDOUR_UI::config()->get_icon_set()); + icon_set_dropdown.set_active_text (UIConfiguration::instance().get_icon_set()); hbox = Gtk::manage (new Gtk::HBox()); hbox->set_spacing (6); hbox->pack_start (icon_set_label, false, false); hbox->pack_start (icon_set_dropdown, true, true); - vbox->pack_start (*hbox, PACK_SHRINK); + pack_start (*hbox, PACK_SHRINK); } - + hbox = Gtk::manage (new Gtk::HBox()); hbox->set_spacing (6); hbox->pack_start (waveform_gradient_depth, true, true); hbox->pack_start (waveform_gradient_depth_label, false, false); - vbox->pack_start (*hbox, PACK_SHRINK); + pack_start (*hbox, PACK_SHRINK); hbox = Gtk::manage (new Gtk::HBox()); hbox->set_spacing (6); hbox->pack_start (timeline_item_gradient_depth, true, true); hbox->pack_start (timeline_item_gradient_depth_label, false, false); - vbox->pack_start (*hbox, PACK_SHRINK); + pack_start (*hbox, PACK_SHRINK); palette_group = initialize_palette_canvas (*palette_viewport.canvas()); palette_viewport.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_canvas_allocated), palette_group, palette_viewport.canvas(), sigc::mem_fun (*this, &ThemeManager::palette_event))); palette_scroller.add (palette_viewport); - + + modifier_scroller.add (modifier_vbox); + notebook.append_page (alias_scroller, _("Items")); notebook.append_page (palette_scroller, _("Palette")); - notebook.append_page (scroller, _("Colors")); - - vbox->pack_start (notebook); + notebook.append_page (modifier_scroller, _("Transparency")); - vbox->show_all (); + pack_start (notebook); - add (*vbox); + show_all (); waveform_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED); timeline_item_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED); - + color_dialog.get_colorsel()->set_has_opacity_control (true); color_dialog.get_colorsel()->set_has_palette (true); - - flat_buttons.set_active (ARDOUR_UI::config()->get_flat_buttons()); - blink_rec_button.set_active (ARDOUR_UI::config()->get_blink_rec_arm()); - region_color_button.set_active (ARDOUR_UI::config()->get_color_regions_using_track_color()); - show_clipping_button.set_active (ARDOUR_UI::config()->get_show_waveform_clipping()); + + set_ui_to_state(); color_dialog.get_ok_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_ACCEPT)); color_dialog.get_cancel_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_CANCEL)); @@ -218,119 +183,91 @@ ThemeManager::ThemeManager() waveform_gradient_depth.signal_value_changed().connect (sigc::mem_fun (*this, &ThemeManager::on_waveform_gradient_depth_change)); timeline_item_gradient_depth.signal_value_changed().connect (sigc::mem_fun (*this, &ThemeManager::on_timeline_item_gradient_depth_change)); all_dialogs.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_all_dialogs_toggled)); + transients_follow_front.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_transients_follow_front_toggled)); icon_set_dropdown.signal_changed().connect (sigc::mem_fun (*this, &ThemeManager::on_icon_set_changed)); - Gtkmm2ext::UI::instance()->set_tip (all_dialogs, + Gtkmm2ext::UI::instance()->set_tip (all_dialogs, string_compose (_("Mark all floating windows to be type \"Dialog\" rather than using \"Utility\" for some.\n" "This may help with some window managers. This requires a restart of %1 to take effect"), PROGRAM_NAME)); + Gtkmm2ext::UI::instance()->set_tip (transients_follow_front, + string_compose (_("Make transient windows follow the front window when toggling between the editor and mixer.\n" + "This requires a restart of %1 to take effect"), PROGRAM_NAME)); set_size_request (-1, 400); - setup_basic_color_display (); /* no need to call setup_palette() here, it will be done when its size is allocated */ setup_aliases (); + setup_modifiers (); - /* Trigger setting up the GTK color scheme and loading the RC file */ - ARDOUR_UI::config()->color_theme_changed (); + UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ThemeManager::colors_changed)); } ThemeManager::~ThemeManager() { } -int -ThemeManager::save (string /*path*/) +void +ThemeManager::setup_modifiers () { - return 0; -} + UIConfiguration* uic (&UIConfiguration::instance()); + UIConfiguration::Modifiers& modifiers (uic->modifiers); + Gtk::HBox* mod_hbox; + Gtk::Label* mod_label; + Gtk::HScale* mod_scale; -bool -ThemeManager::basic_color_button_press_event (GdkEventButton* ev) -{ - TreeIter iter; - TreeModel::Path path; - TreeViewColumn* column; - int cellx; - int celly; + Gtkmm2ext::container_clear (modifier_vbox); - if (!basic_color_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { - return false; - } + for (UIConfiguration::Modifiers::const_iterator m = modifiers.begin(); m != modifiers.end(); ++m) { + mod_hbox = manage (new HBox); - switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) { - case 0: - /* allow normal processing to occur */ - return false; + mod_scale = manage (new HScale (0.0, 1.0, 0.01)); + mod_scale->set_draw_value (false); + mod_scale->set_value (m->second.a()); + mod_scale->set_update_policy (Gtk::UPDATE_DISCONTINUOUS); + mod_scale->signal_value_changed().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::modifier_edited), mod_scale, m->first)); - case 1: /* color */ - if ((iter = basic_color_list->get_iter (path))) { + mod_label = manage (new Label (m->first)); + mod_label->set_alignment (1.0, 0.5); + mod_label->set_size_request (150, -1); /* 150 pixels should be enough for anyone */ - ColorVariable* var = (*iter)[basic_color_columns.pVar]; - if (!var) { - /* parent row, do nothing */ - return false; - } + mod_hbox->pack_start (*mod_label, false, true, 12); + mod_hbox->pack_start (*mod_scale, true, true); - Gdk::Color color; - double r, g, b, a; - - ArdourCanvas::color_to_rgba (var->get(), r, g, b, a); - color.set_rgb_p (r, g, b); - color_dialog.get_colorsel()->set_previous_color (color); - color_dialog.get_colorsel()->set_current_color (color); - color_dialog.get_colorsel()->set_previous_alpha ((guint16) (a * 65535.0)); - color_dialog.get_colorsel()->set_current_alpha ((guint16) (a * 65535.0)); - - ColorVariable* ccvar = (*iter)[basic_color_columns.pVar]; - - color_dialog_connection.disconnect (); - color_dialog_connection = color_dialog.signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::basic_color_response), ccvar)); - color_dialog.present (); - } + modifier_vbox.pack_start (*mod_hbox, false, false); } - return true; + modifier_vbox.show_all (); + } void -ThemeManager::basic_color_response (int result, ColorVariable* color_variable) +ThemeManager::modifier_edited (Gtk::Range* range, string name) { - Gdk::Color color; - double a; - - color_dialog_connection.disconnect (); - - switch (result) { - case RESPONSE_CANCEL: - break; - case RESPONSE_ACCEPT: - case RESPONSE_OK: - color = color_dialog.get_colorsel()->get_current_color(); - a = color_dialog.get_colorsel()->get_current_alpha() / 65535.0; + using namespace ArdourCanvas; - color_variable->set (ArdourCanvas::rgba_to_color (color.get_red_p(), - color.get_green_p(), - color.get_blue_p(), - a)); - setup_basic_color_display (); - setup_palette (); - setup_aliases (); - ColorsChanged(); //EMIT SIGNAL - break; - - default: - break; - - } - - color_dialog.hide (); + double alpha = range->get_value(); + SVAModifier svam (SVAModifier::Assign, -1.0, -1.0, alpha); + UIConfiguration::instance().set_modifier (name, svam); +} + +void +ThemeManager::colors_changed () +{ + setup_palette (); + setup_aliases (); + setup_modifiers (); +} + +int +ThemeManager::save (string /*path*/) +{ + return 0; } void ThemeManager::on_flat_buttons_toggled () { - ARDOUR_UI::config()->set_flat_buttons (flat_buttons.get_active()); - ARDOUR_UI::config()->set_dirty (); + UIConfiguration::instance().set_flat_buttons (flat_buttons.get_active()); ArdourButton::set_flat_buttons (flat_buttons.get_active()); /* force a redraw */ gtk_rc_reset_styles (gtk_settings_get_default()); @@ -339,30 +276,34 @@ ThemeManager::on_flat_buttons_toggled () void ThemeManager::on_blink_rec_arm_toggled () { - ARDOUR_UI::config()->set_blink_rec_arm (blink_rec_button.get_active()); - ARDOUR_UI::config()->set_dirty (); - ARDOUR::Config->ParameterChanged("blink-rec-arm"); + UIConfiguration::instance().set_blink_rec_arm (blink_rec_button.get_active()); + UIConfiguration::instance().ParameterChanged("blink-rec-arm"); } void ThemeManager::on_region_color_toggled () { - ARDOUR_UI::config()->set_color_regions_using_track_color (region_color_button.get_active()); - ARDOUR_UI::config()->set_dirty (); + UIConfiguration::instance().set_color_regions_using_track_color (region_color_button.get_active()); } void ThemeManager::on_show_clip_toggled () { - ARDOUR_UI::config()->set_show_waveform_clipping (show_clipping_button.get_active()); - ARDOUR_UI::config()->set_dirty (); + UIConfiguration::instance().set_show_waveform_clipping (show_clipping_button.get_active()); + // "show-waveform-clipping" was a session config key + ArdourCanvas::WaveView::set_global_show_waveform_clipping (UIConfiguration::instance().get_show_waveform_clipping()); } void ThemeManager::on_all_dialogs_toggled () { - ARDOUR_UI::config()->set_all_floating_windows_are_dialogs (all_dialogs.get_active()); - ARDOUR_UI::config()->set_dirty (); + UIConfiguration::instance().set_all_floating_windows_are_dialogs (all_dialogs.get_active()); +} + +void +ThemeManager::on_transients_follow_front_toggled () +{ + UIConfiguration::instance().set_transients_follow_front (transients_follow_front.get_active()); } void @@ -370,8 +311,7 @@ ThemeManager::on_waveform_gradient_depth_change () { double v = waveform_gradient_depth.get_value(); - ARDOUR_UI::config()->set_waveform_gradient_depth (v); - ARDOUR_UI::config()->set_dirty (); + UIConfiguration::instance().set_waveform_gradient_depth (v); ArdourCanvas::WaveView::set_global_gradient_depth (v); } @@ -380,15 +320,14 @@ ThemeManager::on_timeline_item_gradient_depth_change () { double v = timeline_item_gradient_depth.get_value(); - ARDOUR_UI::config()->set_timeline_item_gradient_depth (v); - ARDOUR_UI::config()->set_dirty (); + UIConfiguration::instance().set_timeline_item_gradient_depth (v); } void ThemeManager::on_icon_set_changed () { string new_set = icon_set_dropdown.get_active_text(); - ARDOUR_UI::config()->set_icon_set (new_set); + UIConfiguration::instance().set_icon_set (new_set); } void @@ -396,9 +335,9 @@ ThemeManager::on_dark_theme_button_toggled() { if (!dark_button.get_active()) return; - UIConfiguration* uic (ARDOUR_UI::config()); - - uic->set_ui_rc_file("ui_dark.rc"); + UIConfiguration* uic (&UIConfiguration::instance()); + + uic->set_color_file("dark"); } void @@ -406,90 +345,81 @@ ThemeManager::on_light_theme_button_toggled() { if (!light_button.get_active()) return; - UIConfiguration* uic (ARDOUR_UI::config()); - - uic->set_ui_rc_file("ui_light.rc"); + UIConfiguration* uic (&UIConfiguration::instance()); + + uic->set_color_file("light"); } void -ThemeManager::setup_basic_color_display () +ThemeManager::set_ui_to_state() { - int r, g, b, a; - - basic_color_list->clear(); - - for (std::map *>::iterator i = ARDOUR_UI::config()->configurable_colors.begin(); i != ARDOUR_UI::config()->configurable_colors.end(); i++) { - - - ColorVariable* var = i->second; + /* there is no way these values can change individually + * by themselves (w/o user-interaction) + * hence a common combined update function suffices + */ + + if (UIConfiguration::instance().get_color_file() == "light") { + light_button.set_active(true); + } else { + dark_button.set_active(true); + } - TreeModel::Children rows = basic_color_list->children(); - TreeModel::Row row; - string::size_type colon; + /* there is no need to block signal handlers, here, + * all elements check if the value has changed and ignore NOOPs + */ + all_dialogs.set_active (UIConfiguration::instance().get_all_floating_windows_are_dialogs()); + transients_follow_front.set_active (UIConfiguration::instance().get_transients_follow_front()); + flat_buttons.set_active (UIConfiguration::instance().get_flat_buttons()); + blink_rec_button.set_active (UIConfiguration::instance().get_blink_rec_arm()); + region_color_button.set_active (UIConfiguration::instance().get_color_regions_using_track_color()); + show_clipping_button.set_active (UIConfiguration::instance().get_show_waveform_clipping()); + waveform_gradient_depth.set_value(UIConfiguration::instance().get_waveform_gradient_depth()); + timeline_item_gradient_depth.set_value(UIConfiguration::instance().get_timeline_item_gradient_depth()); +} - if ((colon = var->name().find (':')) != string::npos) { +void +ThemeManager::reset_canvas_colors() +{ + string cfile; + string basename; - /* this is supposed to be a child node, so find the - * parent - */ + basename = "my-"; + basename += UIConfiguration::instance().get_color_file(); + basename += ".colors"; - string parent = var->name().substr (0, colon); - TreeModel::iterator ri; + if (find_file (ardour_config_search_path(), basename, cfile)) { + string backup = cfile + string (X_(".old")); + g_rename (cfile.c_str(), backup.c_str()); + /* don't really care if it fails */ + } - for (ri = rows.begin(); ri != rows.end(); ++ri) { - string s = (*ri)[basic_color_columns.name]; - if (s == parent) { - break; - } - } + UIConfiguration::instance().load_defaults(); + UIConfiguration::instance().save_state (); + set_ui_to_state(); +} - if (ri == rows.end()) { - /* not found, add the parent as new top level row */ - row = *(basic_color_list->append()); - row[basic_color_columns.name] = parent; - row[basic_color_columns.pVar] = 0; - - /* now add the child as a child of this one */ +ArdourCanvas::Container* +ThemeManager::initialize_palette_canvas (ArdourCanvas::Canvas& canvas) +{ + using namespace ArdourCanvas; - row = *(basic_color_list->insert (row->children().end())); - row[basic_color_columns.name] = var->name().substr (colon+1); - } else { - row = *(basic_color_list->insert ((*ri)->children().end())); - row[basic_color_columns.name] = var->name().substr (colon+1); - } + /* hide background */ + canvas.set_background_color (rgba_to_color (0.0, 0.0, 1.0, 0.0)); - } else { - /* add as a child */ - row = *(basic_color_list->append()); - row[basic_color_columns.name] = var->name(); - } + /* bi-directional scroll group */ - Gdk::Color col; - uint32_t rgba = var->get(); - UINT_TO_RGBA (rgba, &r, &g, &b, &a); - col.set_rgb_p (r / 255.0, g / 255.0, b / 255.0); + ScrollGroup* scroll_group = new ScrollGroup (canvas.root(), ScrollGroup::ScrollSensitivity (ScrollGroup::ScrollsVertically|ScrollGroup::ScrollsHorizontally)); + canvas.add_scroller (*scroll_group); - row[basic_color_columns.pVar] = var; - row[basic_color_columns.rgba] = rgba; - row[basic_color_columns.gdkcolor] = col; - } + /* new container to hold everything */ - UIConfiguration* uic (ARDOUR_UI::config()); - - flat_buttons.set_active (uic->get_flat_buttons()); - blink_rec_button.set_active (uic->get_blink_rec_arm()); - waveform_gradient_depth.set_value (uic->get_waveform_gradient_depth()); - timeline_item_gradient_depth.set_value (uic->get_timeline_item_gradient_depth()); - all_dialogs.set_active (uic->get_all_floating_windows_are_dialogs()); + return new ArdourCanvas::Container (scroll_group); } void -ThemeManager::reset_canvas_colors() +ThemeManager::palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot event_handler) { - ARDOUR_UI::config()->load_defaults(); - setup_basic_color_display (); - ARDOUR_UI::config()->set_dirty (); - ARDOUR_UI::config()->save_state (); + build_palette_canvas (*canvas, *group, event_handler); } struct NamedColor { @@ -512,29 +442,6 @@ struct SortByHue { } }; -ArdourCanvas::Container* -ThemeManager::initialize_palette_canvas (ArdourCanvas::Canvas& canvas) -{ - using namespace ArdourCanvas; - - /* hide background */ - canvas.set_background_color (rgba_to_color (0.0, 0.0, 1.0, 0.0)); - - /* bi-directional scroll group */ - - ScrollGroup* scroll_group = new ScrollGroup (canvas.root(), ScrollGroup::ScrollSensitivity (ScrollGroup::ScrollsVertically|ScrollGroup::ScrollsHorizontally)); - canvas.add_scroller (*scroll_group); - - /* new container to hold everything */ - - return new ArdourCanvas::Container (scroll_group); -} - -void -ThemeManager::palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot event_handler) -{ - build_palette_canvas (*canvas, *group, event_handler); -} void ThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas::Container& group, sigc::slot event_handler) @@ -543,14 +450,14 @@ ThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas:: /* we want the colors sorted by hue, with their name */ - UIConfiguration::RelativeColors& relatives (ARDOUR_UI::instance()->config()->relative_colors); + UIConfiguration::Colors& colors (UIConfiguration::instance().colors); vector nc; - for (UIConfiguration::RelativeColors::const_iterator x = relatives.begin(); x != relatives.end(); ++x) { - nc.push_back (NamedColor (x->first, x->second.get())); + for (UIConfiguration::Colors::const_iterator x = colors.begin(); x != colors.end(); ++x) { + nc.push_back (NamedColor (x->first, HSV (x->second))); } SortByHue sorter; sort (nc.begin(), nc.end(), sorter); - + const uint32_t color_limit = nc.size(); const double box_size = 20.0; const double width = canvas.width(); @@ -559,19 +466,19 @@ ThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas:: uint32_t color_num = 0; /* clear existing rects and delete them */ - + group.clear (true); - + for (uint32_t y = 0; y < height - box_size && color_num < color_limit; y += box_size) { for (uint32_t x = 0; x < width - box_size && color_num < color_limit; x += box_size) { ArdourCanvas::Rectangle* r = new ArdourCanvas::Rectangle (&group, ArdourCanvas::Rect (x, y, x + box_size, y + box_size)); string name = nc[color_num++].name; - UIConfiguration::RelativeColors::iterator c = relatives.find (name); + UIConfiguration::Colors::iterator c = colors.find (name); - if (c != relatives.end()) { - Color color = c->second.get().color (); + if (c != colors.end()) { + Color color = c->second; r->set_fill_color (color); r->set_outline_color (rgba_to_color (0.0, 0.0, 0.0, 1.0)); r->set_tooltip (name); @@ -584,15 +491,15 @@ ThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas:: void ThemeManager::palette_size_request (Gtk::Requisition* req) { - uint32_t ncolors = ARDOUR_UI::instance()->config()->relative_colors.size(); + uint32_t ncolors = UIConfiguration::instance().colors.size(); const int box_size = 20; - double c = sqrt (ncolors); + double c = sqrt ((double)ncolors); req->width = (int) floor (c * box_size); req->height = (int) floor (c * box_size); /* add overflow row if necessary */ - + if (fmod (ncolors, c) != 0.0) { req->height += box_size; } @@ -622,7 +529,7 @@ ThemeManager::edit_palette_color (std::string name) { using namespace ArdourCanvas; double r,g, b, a; - UIConfiguration* uic (ARDOUR_UI::instance()->config()); + UIConfiguration* uic (&UIConfiguration::instance()); ArdourCanvas::Color c = uic->color (name); Gdk::Color gdkcolor; @@ -645,9 +552,8 @@ ThemeManager::palette_color_response (int result, std::string name) using namespace ArdourCanvas; color_dialog_connection.disconnect (); - - UIConfiguration* uic (ARDOUR_UI::instance()->config()); - UIConfiguration::RelativeHSV rhsv ("", HSV()); + + UIConfiguration* uic (&UIConfiguration::instance()); Gdk::Color gdkcolor; double r,g, b, a; @@ -660,15 +566,9 @@ ThemeManager::palette_color_response (int result, std::string name) g = gdkcolor.get_green_p(); b = gdkcolor.get_blue_p(); - rhsv = uic->color_as_relative_hsv (rgba_to_color (r, g, b, a)); - uic->reset_relative (name, rhsv); - - /* rebuild */ - - setup_palette (); - ColorsChanged(); //EMIT SIGNAL + uic->set_color (name, rgba_to_color (r, g, b, a)); break; - + default: break; } @@ -681,7 +581,7 @@ ThemeManager::alias_palette_event (GdkEvent* ev, string new_alias, string target { switch (ev->type) { case GDK_BUTTON_RELEASE: - ARDOUR_UI::instance()->config()->set_alias (target_name, new_alias); + UIConfiguration::instance().set_alias (target_name, new_alias); return true; break; default: @@ -693,18 +593,20 @@ ThemeManager::alias_palette_event (GdkEvent* ev, string new_alias, string target void ThemeManager::alias_palette_response (int response, std::string target_name, std::string old_alias) { - palette_response_connection.disconnect (); - switch (response) { case GTK_RESPONSE_OK: case GTK_RESPONSE_ACCEPT: /* rebuild alias list with new color: inefficient but simple */ - setup_aliases (); break; - default: + + case GTK_RESPONSE_REJECT: /* revert choice */ - ARDOUR_UI::instance()->config()->set_alias (target_name, old_alias); + UIConfiguration::instance().set_alias (target_name, old_alias); + break; + + default: + /* do nothing */ break; } @@ -714,30 +616,29 @@ ThemeManager::alias_palette_response (int response, std::string target_name, std void ThemeManager::choose_color_from_palette (string const & name) { - UIConfiguration* uic (ARDOUR_UI::config()); + UIConfiguration* uic (&UIConfiguration::instance()); UIConfiguration::ColorAliases::iterator i = uic->color_aliases.find (name); if (i == uic->color_aliases.end()) { return; } - if (!palette_window) { - palette_window = new ArdourDialog (_("Color Palette")); - palette_window->add_button (Stock::CANCEL, RESPONSE_CANCEL); - palette_window->add_button (Stock::OK, RESPONSE_OK); + delete palette_window; - ArdourCanvas::GtkCanvas* canvas = new ArdourCanvas::GtkCanvas (); - ArdourCanvas::Container* group = initialize_palette_canvas (*canvas); - - canvas->signal_size_request().connect (sigc::mem_fun (*this, &ThemeManager::palette_size_request)); - canvas->signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_canvas_allocated), group, canvas, - sigc::bind (sigc::mem_fun (*this, &ThemeManager::alias_palette_event), name))); + palette_window = new ArdourDialog (_("Color Palette")); + palette_window->add_button (Stock::CANCEL, RESPONSE_REJECT); /* using CANCEL causes confusion if dialog is closed via CloseAllDialogs */ + palette_window->add_button (Stock::OK, RESPONSE_OK); - palette_window->get_vbox()->pack_start (*canvas); - palette_window->show_all (); - } + ArdourCanvas::GtkCanvas* canvas = new ArdourCanvas::GtkCanvas (); + ArdourCanvas::Container* group = initialize_palette_canvas (*canvas); + + canvas->signal_size_request().connect (sigc::mem_fun (*this, &ThemeManager::palette_size_request)); + canvas->signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_canvas_allocated), group, canvas, + sigc::bind (sigc::mem_fun (*this, &ThemeManager::alias_palette_event), name))); + + palette_window->get_vbox()->pack_start (*canvas); + palette_window->show_all (); - palette_response_connection.disconnect (); palette_response_connection = palette_window->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::alias_palette_response), name, i->second)); palette_window->set_position (WIN_POS_MOUSE); @@ -748,29 +649,65 @@ void ThemeManager::setup_aliases () { using namespace ArdourCanvas; - - UIConfiguration* uic (ARDOUR_UI::instance()->config()); + + UIConfiguration* uic (&UIConfiguration::instance()); UIConfiguration::ColorAliases& aliases (uic->color_aliases); alias_list->clear (); for (UIConfiguration::ColorAliases::iterator i = aliases.begin(); i != aliases.end(); ++i) { + TreeModel::Children rows = alias_list->children(); TreeModel::Row row; + string::size_type colon; - row = *(alias_list->append()); - row[alias_columns.name] = i->first; - row[alias_columns.alias] = i->second; + if ((colon = i->first.find (':')) != string::npos) { + + /* this is supposed to be a child node, so find the + * parent + */ - Color c = uic->color (i->second); + string parent = i->first.substr (0, colon); + TreeModel::iterator ri; + + for (ri = rows.begin(); ri != rows.end(); ++ri) { + string s = (*ri)[alias_columns.name]; + if (s == parent) { + break; + } + } + + if (ri == rows.end()) { + /* not found, add the parent as new top level row */ + row = *(alias_list->append()); + row[alias_columns.name] = parent; + row[alias_columns.alias] = ""; - /* Gdk colors don't support alpha */ + /* now add the child as a child of this one */ + row = *(alias_list->insert (row->children().end())); + row[alias_columns.name] = i->first.substr (colon+1); + } else { + row = *(alias_list->insert ((*ri)->children().end())); + row[alias_columns.name] = i->first.substr (colon+1); + } + + } else { + /* add as a child */ + row = *(alias_list->append()); + row[alias_columns.name] = i->first; + row[alias_columns.key] = i->first; + } + + row[alias_columns.key] = i->first; + row[alias_columns.alias] = i->second; + + Gdk::Color col; double r, g, b, a; + Color c (uic->color (i->second)); color_to_rgba (c, r, g, b, a); - Gdk::Color gcolor; - gcolor.set_rgb_p (r, g, b); + col.set_rgb_p (r, g, b); - row[alias_columns.color] = gcolor; + row[alias_columns.color] = col; } } @@ -788,7 +725,7 @@ ThemeManager::alias_button_press_event (GdkEventButton* ev) } guint32 colnum = GPOINTER_TO_UINT (column->get_data (X_("colnum"))); - + switch (colnum) { case 0: /* allow normal processing to occur */ @@ -796,8 +733,10 @@ ThemeManager::alias_button_press_event (GdkEventButton* ev) case 1: /* color */ if ((iter = alias_list->get_iter (path))) { - string target_color_name = (*iter)[alias_columns.name]; - choose_color_from_palette (target_color_name); + string target_color_alias = (*iter)[alias_columns.key]; + if (!target_color_alias.empty()) { + choose_color_from_palette (target_color_alias); + } } break; }