X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Ftheme_manager.cc;h=aa9088519aaa9f950e952aa391d64d678e9f0b55;hb=a2c0b10d8a6cf4ab5a0fdcdfe157c35c0ed9a709;hp=3514d918bd051e360a07743eefe69de04ff9a754;hpb=37b1f5017e904005fae6b815b1519b3fa595d8d3;p=ardour.git diff --git a/gtk2_ardour/theme_manager.cc b/gtk2_ardour/theme_manager.cc index 3514d918bd..aa9088519a 100644 --- a/gtk2_ardour/theme_manager.cc +++ b/gtk2_ardour/theme_manager.cc @@ -18,47 +18,40 @@ */ #include -#include -#include #include #include "fix_carbon.h" -#include +#include "pbd/gstdio_compat.h" + #include #include "gtkmm2ext/gtk_ui.h" -#include "gtkmm2ext/cell_renderer_color_selector.h" +#include "gtkmm2ext/utils.h" -#include "pbd/file_utils.h" #include "pbd/compose.h" -#include "ardour/filesystem_paths.h" +#include "ardour/profile.h" #include "canvas/wave_view.h" #include "ardour_button.h" +#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" +#include "pbd/i18n.h" using namespace std; using namespace Gtk; using namespace PBD; using namespace ARDOUR; - -sigc::signal ColorsChanged; -sigc::signal ColorChanged; +using namespace ARDOUR_UI_UTILS; ThemeManager::ThemeManager() - : ArdourWindow (_("Theme Manager")) - , dark_button (_("Dark Theme")) - , light_button (_("Light Theme")) - , reset_button (_("Restore Defaults")) - , flat_buttons (_("Draw \"flat\" buttons")) + : flat_buttons (_("Draw \"flat\" buttons")) + , blink_rec_button (_("Blink Rec-Arm buttons")) , region_color_button (_("Color regions using their track's color")) , show_clipping_button (_("Show waveform clipping")) , waveform_gradient_depth (0, 1.0, 0.05) @@ -66,393 +59,174 @@ 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.")) + , floating_monitor_section (_("Float detached monitor-section window")) + , icon_set_label (_("Icon Set")) { - set_title (_("Theme Manager")); - - color_list = TreeStore::create (columns); - color_display.set_model (color_list); - color_display.append_column (_("Object"), 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(), columns.gdkcolor); - - color_display.append_column (*color_column); - - color_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); - color_display.get_column (0)->set_expand (true); - color_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); - color_display.get_column (1)->set_expand (false); - color_display.set_reorderable (false); - color_display.get_selection()->set_mode (SELECTION_NONE); - color_display.set_headers_visible (true); - - scroller.add (color_display); - scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC); - - 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); + Gtk::HBox* hbox; + + /* various buttons */ + + set_homogeneous (false); + + #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 (region_color_button, PACK_SHRINK); - vbox->pack_start (show_clipping_button, PACK_SHRINK); + if (!Profile->get_mixbus()) { + pack_start (floating_monitor_section, 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); + + vector icon_sets = ::get_icon_sets (); + + if (icon_sets.size() > 1) { + Gtkmm2ext::set_popdown_strings (icon_set_dropdown, icon_sets); + icon_set_dropdown.set_active_text (UIConfiguration::instance().get_icon_set()); + + hbox = Gtk::manage (new Gtk::HBox()); + hbox->set_spacing (6); + Gtk::Alignment* align = Gtk::manage (new Gtk::Alignment); + align->set (0, 0.5); + align->add (icon_set_dropdown); + hbox->pack_start (icon_set_label, false, false); + hbox->pack_start (*align, true, true); + pack_start (*hbox, PACK_SHRINK); + } - Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox()); + 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); + pack_start (*hbox, PACK_SHRINK); - vbox->pack_start (*hbox, PACK_SHRINK); - vbox->pack_start (scroller); - - vbox->show_all (); - - add (*vbox); + show_all (); waveform_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED); timeline_item_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED); - - color_display.signal_button_press_event().connect (sigc::mem_fun (*this, &ThemeManager::button_press_event), false); - color_dialog.get_colorsel()->set_has_opacity_control (true); - color_dialog.get_colorsel()->set_has_palette (true); + set_ui_to_state(); - flat_buttons.set_active (ARDOUR_UI::config()->get_flat_buttons()); - 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()); - - 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)); - dark_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_dark_theme_button_toggled)); - light_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_light_theme_button_toggled)); - reset_button.signal_clicked().connect (sigc::mem_fun (*this, &ThemeManager::reset_canvas_colors)); flat_buttons.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_flat_buttons_toggled)); + blink_rec_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_blink_rec_arm_toggled)); region_color_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_region_color_toggled)); show_clipping_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_show_clip_toggled)); 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)); + floating_monitor_section.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_floating_monitor_section_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)); + Gtkmm2ext::UI::instance()->set_tip (floating_monitor_section, + string_compose (_("When detaching the monitoring section, mark it as \"Utility\" window to stay in front.\n" + "This requires a restart of %1 to take effect"), PROGRAM_NAME)); - set_size_request (-1, 400); - setup_theme (); -} - -ThemeManager::~ThemeManager() -{ -} - -int -ThemeManager::save (string /*path*/) -{ - return 0; } -bool -ThemeManager::button_press_event (GdkEventButton* ev) -{ - TreeIter iter; - TreeModel::Path path; - TreeViewColumn* column; - int cellx; - int celly; - - UIConfigVariable *ccvar; - - if (!color_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { - return false; - } - - switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) { - case 0: - /* allow normal processing to occur */ - return false; - - case 1: /* color */ - if ((iter = color_list->get_iter (path))) { - - UIConfigVariable* var = (*iter)[columns.pVar]; - if (!var) { - /* parent row, do nothing */ - return false; - } - - int r,g, b, a; - uint32_t rgba = (*iter)[columns.rgba]; - Gdk::Color color; - - UINT_TO_RGBA (rgba, &r, &g, &b, &a); - color.set_rgb_p (r / 255.0, g / 255.0, b / 255.0); - color_dialog.get_colorsel()->set_previous_color (color); - color_dialog.get_colorsel()->set_current_color (color); - color_dialog.get_colorsel()->set_previous_alpha (a * 256); - color_dialog.get_colorsel()->set_current_alpha (a * 256); - - ResponseType result = (ResponseType) color_dialog.run(); - - switch (result) { - case RESPONSE_CANCEL: - break; - case RESPONSE_ACCEPT: - color = color_dialog.get_colorsel()->get_current_color(); - a = color_dialog.get_colorsel()->get_current_alpha(); - r = (int) floor (color.get_red_p() * 255.0); - g = (int) floor (color.get_green_p() * 255.0); - b = (int) floor (color.get_blue_p() * 255.0); - - rgba = RGBA_TO_UINT(r,g,b,a>>8); - (*iter)[columns.rgba] = rgba; - (*iter)[columns.gdkcolor] = color; - - ccvar = (*iter)[columns.pVar]; - ccvar->set(rgba); - /* mark dirty ... */ - ARDOUR_UI::config()->set_dirty (); - /* but save it immediately */ - ARDOUR_UI::config()->save_state (); - - ColorsChanged(); //EMIT SIGNAL - break; - - default: - break; - - } - - color_dialog.hide (); - } - return true; - - default: - break; - } - - return false; -} - -void -load_rc_file (const string& filename, bool themechange) -{ - std::string rc_file_path; - - if (!find_file_in_search_path (ardour_config_search_path(), filename, rc_file_path)) { - warning << string_compose (_("Unable to find UI style file %1 in search path %2. %3 will look strange"), - filename, ardour_config_search_path().to_string(), PROGRAM_NAME) - << endmsg; - return; - } - - info << "Loading ui configuration file " << rc_file_path << endmsg; - - Gtkmm2ext::UI::instance()->load_rcfile (rc_file_path, themechange); -} - -/* hmm, this is a problem. the profile doesn't - exist when the theme manager is constructed - and toggles buttons during "normal" GTK setup. - - a better solution will be to make all Profile - methods static or something. - - XXX FIX ME -*/ - -#define HACK_PROFILE_IS_SAE() (getenv("ARDOUR_SAE")!=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()); } +void +ThemeManager::on_blink_rec_arm_toggled () +{ + 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_waveform_gradient_depth_change () +ThemeManager::on_transients_follow_front_toggled () { - double v = waveform_gradient_depth.get_value(); - - ARDOUR_UI::config()->set_waveform_gradient_depth (v); - ARDOUR_UI::config()->set_dirty (); - ArdourCanvas::WaveView::set_global_gradient_depth (v); + UIConfiguration::instance().set_transients_follow_front (transients_follow_front.get_active()); } void -ThemeManager::on_timeline_item_gradient_depth_change () +ThemeManager::on_floating_monitor_section_toggled () { - 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_floating_monitor_section (floating_monitor_section.get_active()); } void -ThemeManager::on_dark_theme_button_toggled() +ThemeManager::on_waveform_gradient_depth_change () { - if (!dark_button.get_active()) return; - - if (HACK_PROFILE_IS_SAE()){ - ARDOUR_UI::config()->set_ui_rc_file("ardour3_ui_dark_sae.rc"); - } else { - ARDOUR_UI::config()->set_ui_rc_file("ardour3_ui_dark.rc"); - } - ARDOUR_UI::config()->set_dirty (); + double v = waveform_gradient_depth.get_value(); - load_rc_file (ARDOUR_UI::config()->get_ui_rc_file(), true); + UIConfiguration::instance().set_waveform_gradient_depth (v); + ArdourCanvas::WaveView::set_global_gradient_depth (v); } void -ThemeManager::on_light_theme_button_toggled() +ThemeManager::on_timeline_item_gradient_depth_change () { - if (!light_button.get_active()) return; - - if (HACK_PROFILE_IS_SAE()){ - ARDOUR_UI::config()->set_ui_rc_file("ardour3_ui_light_sae.rc"); - } else { - ARDOUR_UI::config()->set_ui_rc_file("ardour3_ui_light.rc"); - } + double v = timeline_item_gradient_depth.get_value(); - load_rc_file (ARDOUR_UI::config()->get_ui_rc_file(), true); + UIConfiguration::instance().set_timeline_item_gradient_depth (v); } void -ThemeManager::setup_theme () +ThemeManager::on_icon_set_changed () { - int r, g, b, a; - - color_list->clear(); - - for (std::map *>::iterator i = ARDOUR_UI::config()->canvas_colors.begin(); i != ARDOUR_UI::config()->canvas_colors.end(); i++) { - - - UIConfigVariable* var = i->second; - - TreeModel::Children rows = color_list->children(); - TreeModel::Row row; - string::size_type colon; - - if ((colon = var->name().find (':')) != string::npos) { - - /* this is supposed to be a child node, so find the - * parent - */ - - string parent = var->name().substr (0, colon); - TreeModel::iterator ri; - - for (ri = rows.begin(); ri != rows.end(); ++ri) { - string s = (*ri)[columns.name]; - if (s == parent) { - break; - } - } - - if (ri == rows.end()) { - /* not found, add the parent as new top level row */ - row = *(color_list->append()); - row[columns.name] = parent; - row[columns.pVar] = 0; - - /* now add the child as a child of this one */ - - row = *(color_list->insert (row->children().end())); - row[columns.name] = var->name().substr (colon+1); - } else { - row = *(color_list->insert ((*ri)->children().end())); - row[columns.name] = var->name().substr (colon+1); - } - - } else { - /* add as a child */ - row = *(color_list->append()); - row[columns.name] = var->name(); - } - - Gdk::Color col; - uint32_t rgba = var->get(); - UINT_TO_RGBA (rgba, &r, &g, &b, &a); - //cerr << (*i)->name() << " == " << hex << rgba << ": " << hex << r << " " << hex << g << " " << hex << b << endl; - col.set_rgb_p (r / 255.0, g / 255.0, b / 255.0); - - row[columns.pVar] = var; - row[columns.rgba] = rgba; - row[columns.gdkcolor] = col; - } - - ColorsChanged.emit(); - - bool env_defined = false; - string rcfile = Glib::getenv("ARDOUR3_UI_RC", env_defined); - - if(!env_defined) { - rcfile = ARDOUR_UI::config()->get_ui_rc_file(); - } - - if (rcfile == "ardour3_ui_dark.rc" || rcfile == "ardour3_ui_dark_sae.rc") { - dark_button.set_active(); - } else if (rcfile == "ardour3_ui_light.rc" || rcfile == "ardour3_ui_light_sae.rc") { - light_button.set_active(); - } - - flat_buttons.set_active (ARDOUR_UI::config()->get_flat_buttons()); - waveform_gradient_depth.set_value (ARDOUR_UI::config()->get_waveform_gradient_depth()); - timeline_item_gradient_depth.set_value (ARDOUR_UI::config()->get_timeline_item_gradient_depth()); - all_dialogs.set_active (ARDOUR_UI::config()->get_all_floating_windows_are_dialogs()); - - load_rc_file(rcfile, false); + string new_set = icon_set_dropdown.get_active_text(); + UIConfiguration::instance().set_icon_set (new_set); } void -ThemeManager::reset_canvas_colors() +ThemeManager::set_ui_to_state() { - ARDOUR_UI::config()->load_defaults(); - setup_theme (); - /* mark dirty ... */ - ARDOUR_UI::config()->set_dirty (); - /* but save it immediately */ - ARDOUR_UI::config()->save_state (); + /* 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()); + floating_monitor_section.set_active (UIConfiguration::instance().get_floating_monitor_section()); + 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()); }