X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Ftheme_manager.cc;h=d89ca812f81067f248660e83e047d18c91414ab6;hb=a2da4bc42b1983d934cee6ea061b6288b6525bd6;hp=e98c170e1099787b9e449f696f0693fd858fb865;hpb=9316ec6d4427fe9f757e79437f374d7aeceb5578;p=ardour.git diff --git a/gtk2_ardour/theme_manager.cc b/gtk2_ardour/theme_manager.cc index e98c170e10..d89ca812f8 100644 --- a/gtk2_ardour/theme_manager.cc +++ b/gtk2_ardour/theme_manager.cc @@ -26,7 +26,10 @@ #include #include +#include + #include +#include #include "theme_manager.h" #include "rgb_macros.h" @@ -39,23 +42,9 @@ using namespace Gtk; using namespace PBD; using namespace ARDOUR; -/* the global color map */ - -ColorMap color_map; - -/* lookup table of color IDs as strings */ - -#undef COLORID -#define COLORID(s) #s, -static const char *color_id_strs[] = { - #include "colors.h" -}; -#undef COLORID - -/* global color change signals */ sigc::signal ColorsChanged; -sigc::signal ColorChanged; +sigc::signal ColorChanged; ThemeManager::ThemeManager() : ArdourDialog ("ThemeManager"), @@ -96,83 +85,17 @@ ThemeManager::ThemeManager() color_dialog.get_ok_button()->signal_clicked().connect (bind (mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_ACCEPT)); color_dialog.get_cancel_button()->signal_clicked().connect (bind (mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_CANCEL)); - dark_button.signal_clicked().connect (bind (mem_fun (*this, &ThemeManager::load_rc), 1)); - light_button.signal_clicked().connect (bind (mem_fun (*this, &ThemeManager::load_rc), 2)); + dark_button.signal_toggled().connect (mem_fun (*this, &ThemeManager::on_dark_theme_button_toggled)); + light_button.signal_toggled().connect (mem_fun (*this, &ThemeManager::on_light_theme_button_toggled)); set_size_request (-1, 400); + setup_theme (); } ThemeManager::~ThemeManager() { } -int -ThemeManager::load (string path) -{ - ifstream in (path.c_str()); - - if (!in) { - error << string_compose (_("cannot open color definition file %1: %2"), path, strerror(errno)) << endmsg; - return -1; - } - - cerr << "Loading color definition file " << path << endl; - - while (in) { - string name; - double r, g, b, a; - - in >> name; if (!in) break; - in >> r; if (!in) break; - in >> g; if (!in) break; - in >> b; if (!in) break; - in >> a; if (!in) break; - - for (uint32_t i = 0; i < sizeof (color_id_strs)/sizeof(color_id_strs[0]); ++i) { - if (name == color_id_strs[i]) { - - /* set color map */ - - int ir,ig,ib,ia; - int rgba; - - ir = (int) floor (r * 255.0); - ig = (int) floor (g * 255.0); - ib = (int) floor (b * 255.0); - ia = (int) floor (a * 255.0); - rgba = RGBA_TO_UINT (ir, ig, ib, ia); - - color_map[(ColorID)i] = rgba; - - /* set up list entry */ - - Gdk::Color col; - col.set_rgb_p (r,g,b); - - TreeModel::Row row = *(color_list->append()); - - /* all the color names are prefixed by 'c' to avoid - naming collisions when used as enums. trim - this leading character from the displayed - value. - */ - - row[columns.name] = name.substr (1); - row[columns.color] = ""; - row[columns.id] = (ColorID) i; - row[columns.gdkcolor] = col; - row[columns.rgba] = rgba; - - break; - } - } - } - - ColorsChanged(); /* emit signal */ - - return 0; -} - int ThemeManager::save (string path) { @@ -187,6 +110,8 @@ ThemeManager::button_press_event (GdkEventButton* ev) 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; @@ -200,11 +125,17 @@ ThemeManager::button_press_event (GdkEventButton* ev) case 1: /* color */ if ((iter = color_list->get_iter (path))) { - ColorID edit_color_id = (*iter)[columns.id]; int r,g, b, a; - uint32_t rgba; + 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) { @@ -217,14 +148,17 @@ ThemeManager::button_press_event (GdkEventButton* ev) 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); - + rgba = RGBA_TO_UINT(r,g,b,a>>8); + //cerr << (*iter)[columns.name] << " == " << hex << rgba << endl; + //cerr << "a = " << a << endl; (*iter)[columns.rgba] = rgba; (*iter)[columns.gdkcolor] = color; - color_map[edit_color_id] = rgba; + ccvar = (*iter)[columns.pVar]; + ccvar->set(rgba); - ColorChanged (edit_color_id, rgba); + //ColorChanged (rgba); + ColorsChanged();//EMIT SIGNAL break; default: @@ -243,37 +177,83 @@ ThemeManager::button_press_event (GdkEventButton* ev) return false; } - void -ThemeManager::load_rc(int which) +load_rc_file (const string& filename, bool themechange) { - - if (which == 1) { - Config->set_ui_rc_file("ardour2_ui_dark.rc"); - cerr << "dark theme selected" << endl; - - } else { - Config->set_ui_rc_file("ardour2_ui_light.rc"); - cerr << "light theme selected" << endl; + sys::path rc_file_path; + + SearchPath spath (ardour_search_path()); + spath += user_config_directory(); + spath += system_config_search_path(); + + if(!find_file_in_search_path (spath, filename, rc_file_path)) + { + warning << string_compose(_("Unable to find UI style file %1 in search path %2. Ardour will look strange"), + filename, spath.get_string()) + << endmsg; + return; } - ThemeChanged(find_config_file(Config->get_ui_rc_file())); //EMIT SIGNAL - - cerr << "load_rc() called " << find_config_file(Config->get_ui_rc_file()) << endl; + info << "Loading ui configuration file " << rc_file_path.to_string() << endmsg; + + Gtkmm2ext::UI::instance()->load_rcfile (rc_file_path.to_string(), themechange); } void -ThemeManager::setup_theme_buttons () +ThemeManager::on_dark_theme_button_toggled() { + if (!dark_button.get_active()) return; + + ARDOUR_UI::config()->ui_rc_file.set("ardour2_ui_dark.rc"); + load_rc_file (ARDOUR_UI::config()->ui_rc_file.get(), true); +} + +void +ThemeManager::on_light_theme_button_toggled() +{ + if (!light_button.get_active()) return; + + ARDOUR_UI::config()->ui_rc_file.set("ardour2_ui_light.rc"); + load_rc_file (ARDOUR_UI::config()->ui_rc_file.get(), true); +} + +void +ThemeManager::setup_theme () +{ + int r, g, b, a; + for (std::vector *>::iterator i = ARDOUR_UI::config()->canvas_colors.begin(); i != ARDOUR_UI::config()->canvas_colors.end(); i++) { + + TreeModel::Row row = *(color_list->append()); + + Gdk::Color col; + uint32_t rgba = (*i)->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.name] = (*i)->name(); + row[columns.color] = ""; + row[columns.pVar] = *i; + row[columns.rgba] = rgba; + row[columns.gdkcolor] = col; - if (getenv ("ARDOUR2_UI_RC")) { - return; } - if (Config->get_ui_rc_file() == "ardour2_ui_dark.rc") { + ColorsChanged.emit(); + + bool env_defined = false; + string rcfile = Glib::getenv("ARDOUR2_UI_RC", env_defined); + + if(!env_defined) { + rcfile = ARDOUR_UI::config()->ui_rc_file.get(); + } + + if (rcfile == "ardour2_ui_dark.rc") { dark_button.set_active(); - } else if (Config->get_ui_rc_file() == "ardour2_ui_light.rc") { + } else if (rcfile == "ardour2_ui_light.rc") { light_button.set_active(); } + + load_rc_file(rcfile, false); }