summaryrefslogtreecommitdiff
path: root/gtk2_ardour/ui_config.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-12-08 18:19:11 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-12-08 22:02:38 -0500
commit9ac551abab0fd80d3e61cb084d2e70c4ecc78310 (patch)
tree5b6bfc2b7d7cb3f765577d5161ee178b4adce8ae /gtk2_ardour/ui_config.cc
parent624a86c39d0a22439c797d88c6defe28e55ab806 (diff)
another metric ton of color work
Diffstat (limited to 'gtk2_ardour/ui_config.cc')
-rw-r--r--gtk2_ardour/ui_config.cc225
1 files changed, 139 insertions, 86 deletions
diff --git a/gtk2_ardour/ui_config.cc b/gtk2_ardour/ui_config.cc
index ece4d7ac50..e39336491f 100644
--- a/gtk2_ardour/ui_config.cc
+++ b/gtk2_ardour/ui_config.cc
@@ -64,22 +64,10 @@ UIConfiguration::UIConfiguration ()
#undef UI_CONFIG_VARIABLE
#undef CANVAS_FONT_VARIABLE
- /* initialize all the base colors using default
- colors for now. these will be reset when/if
- we load the UI config file.
- */
-
-#undef CANVAS_BASE_COLOR
-#define CANVAS_BASE_COLOR(var,name,val) var (name,quantized (val)),
-#include "base_colors.h"
-#undef CANVAS_BASE_COLOR
-
_dirty (false),
+ base_modified (false),
aliases_modified (false),
- derived_modified (false),
- _saved_state_node (""),
- _saved_state_version (-1)
-
+ derived_modified (false)
{
_instance = this;
@@ -88,7 +76,7 @@ UIConfiguration::UIConfiguration ()
*/
#undef CANVAS_BASE_COLOR
-#define CANVAS_BASE_COLOR(var,name,color) base_colors.insert (make_pair (name,&var));
+#define CANVAS_BASE_COLOR(var,name,color) base_colors.insert (make_pair (name,color));
#include "base_colors.h"
#undef CANVAS_BASE_COLOR
@@ -110,7 +98,7 @@ UIConfiguration::UIConfiguration ()
/* force GTK theme setting, so that loading an RC file will work */
- reset_gtk_theme ();
+ load_color_theme ();
}
UIConfiguration::~UIConfiguration ()
@@ -120,8 +108,6 @@ UIConfiguration::~UIConfiguration ()
void
UIConfiguration::colors_changed ()
{
- _dirty = true;
-
reset_gtk_theme ();
/* In theory, one of these ought to work:
@@ -142,7 +128,12 @@ UIConfiguration::parameter_changed (string param)
_dirty = true;
if (param == "ui-rc-file") {
- load_rc_file (get_ui_rc_file(), true);
+ load_rc_file (true);
+ } else if (param == "color-file") {
+ load_color_theme ();
+ } else if (param == "base-color") { /* one of many */
+ base_modified = true;
+ ARDOUR_UI_UTILS::ColorsChanged (); /* EMIT SIGNAL */
}
save_state ();
@@ -179,16 +170,16 @@ UIConfiguration::color_as_relative_hsv (Color c)
double shortest_distance = DBL_MAX;
string closest_name;
- map<string,ColorVariable<Color>*>::iterator f;
+ BaseColors::iterator f;
std::map<std::string,HSV> palette;
for (f = base_colors.begin(); f != base_colors.end(); ++f) {
/* Do not include any specialized base colors in the palette
- we use to do comparisons
+ we use to do comparisons (e.g. meter colors)
*/
if (f->first.find ("color") == 0) {
- palette.insert (make_pair (f->first, HSV (f->second->get())));
+ palette.insert (make_pair (f->first, HSV (f->second)));
}
}
@@ -287,7 +278,6 @@ UIConfiguration::load_defaults ()
_dirty = false;
- ARDOUR_UI_UTILS::ColorsChanged ();
} else {
warning << string_compose (_("Could not find default UI configuration file %1"), default_ui_config_file_name) << endmsg;
}
@@ -296,6 +286,76 @@ UIConfiguration::load_defaults ()
}
int
+UIConfiguration::load_color_theme ()
+{
+ std::string cfile;
+ string basename = color_file.get();
+
+ basename += ".colors";
+
+ if (find_file (ardour_config_search_path(), basename, cfile)) {
+ XMLTree tree;
+
+ info << string_compose (_("Loading color file %1"), cfile) << endmsg;
+
+ if (!tree.read (cfile.c_str())) {
+ error << string_compose(_("cannot read color file \"%1\""), cfile) << endmsg;
+ return -1;
+ }
+
+ if (set_state (*tree.root(), Stateful::loading_state_version)) {
+ error << string_compose(_("color file \"%1\" not loaded successfully."), cfile) << endmsg;
+ return -1;
+ }
+
+ ARDOUR_UI_UTILS::ColorsChanged ();
+ } else {
+ warning << string_compose (_("Color file %1 not found"), basename) << endmsg;
+ }
+
+ return 0;
+}
+
+int
+UIConfiguration::store_color_theme (string const& path)
+{
+ XMLNode* root;
+ LocaleGuard lg (X_("POSIX"));
+
+ root = new XMLNode("Ardour");
+
+ XMLNode* parent = new XMLNode (X_("RelativeColors"));
+ for (RelativeColors::const_iterator i = relative_colors.begin(); i != relative_colors.end(); ++i) {
+ XMLNode* node = new XMLNode (X_("RelativeColor"));
+ node->add_property (X_("name"), i->first);
+ node->add_property (X_("base"), i->second.base_color);
+ node->add_property (X_("modifier"), i->second.modifier.to_string());
+ parent->add_child_nocopy (*node);
+ }
+ root->add_child_nocopy (*parent);
+
+
+ parent = new XMLNode (X_("ColorAliases"));
+ for (ColorAliases::const_iterator i = color_aliases.begin(); i != color_aliases.end(); ++i) {
+ XMLNode* node = new XMLNode (X_("ColorAlias"));
+ node->add_property (X_("name"), i->first);
+ node->add_property (X_("alias"), i->second);
+ parent->add_child_nocopy (*node);
+ }
+ root->add_child_nocopy (*parent);
+
+ XMLTree tree;
+
+ tree.set_root (root);
+ if (!tree.write (path.c_str())){
+ error << string_compose (_("Color file %1 not saved"), path) << endmsg;
+ return -1;
+ }
+
+ return 0;
+}
+
+int
UIConfiguration::load_state ()
{
bool found = false;
@@ -317,8 +377,6 @@ UIConfiguration::load_state ()
error << string_compose(_("default ui configuration file \"%1\" not loaded successfully."), rcfile) << endmsg;
return -1;
}
-
- /* make a copy */
}
if (find_file (ardour_config_search_path(), ui_config_file_name, rcfile)) {
@@ -344,32 +402,42 @@ UIConfiguration::load_state ()
error << _("could not find any ui configuration file, canvas will look broken.") << endmsg;
}
- ARDOUR_UI_UTILS::ColorsChanged ();
-
return 0;
}
int
UIConfiguration::save_state()
{
- XMLTree tree;
- if (!dirty()) {
- return 0;
- }
-
- std::string rcfile(user_config_directory());
- rcfile = Glib::build_filename (rcfile, ui_config_file_name);
+ if (_dirty) {
+ std::string rcfile = Glib::build_filename (user_config_directory(), ui_config_file_name);
+
+ XMLTree tree;
- if (rcfile.length()) {
tree.set_root (&get_state());
+
if (!tree.write (rcfile.c_str())){
error << string_compose (_("Config file %1 not saved"), rcfile) << endmsg;
return -1;
}
+
+ _dirty = false;
}
- _dirty = false;
+ if (base_modified || aliases_modified || derived_modified) {
+ std::string colorfile = Glib::build_filename (user_config_directory(), (color_file.get() + ".colors"));
+
+ cerr << "Save colors to " << colorfile << endl;
+ if (store_color_theme (colorfile)) {
+ error << string_compose (_("Color file %1 not saved"), color_file.get()) << endmsg;
+ return -1;
+ }
+
+ base_modified = false;
+ aliases_modified = false;
+ derived_modified = false;
+ }
+
return 0;
}
@@ -385,26 +453,6 @@ UIConfiguration::get_state ()
root->add_child_nocopy (get_variables ("UI"));
root->add_child_nocopy (get_variables ("Canvas"));
- XMLNode* parent = new XMLNode (X_("RelativeColors"));
- for (RelativeColors::const_iterator i = relative_colors.begin(); i != relative_colors.end(); ++i) {
- XMLNode* node = new XMLNode (X_("RelativeColor"));
- node->add_property (X_("name"), i->first);
- node->add_property (X_("base"), i->second.base_color);
- node->add_property (X_("modifier"), i->second.modifier.to_string());
- parent->add_child_nocopy (*node);
- }
- root->add_child_nocopy (*parent);
-
-
- parent = new XMLNode (X_("ColorAliases"));
- for (ColorAliases::const_iterator i = color_aliases.begin(); i != color_aliases.end(); ++i) {
- XMLNode* node = new XMLNode (X_("ColorAlias"));
- node->add_property (X_("name"), i->first);
- node->add_property (X_("alias"), i->second);
- parent->add_child_nocopy (*node);
- }
- root->add_child_nocopy (*parent);
-
if (_extra_xml) {
root->add_child_copy (*_extra_xml);
}
@@ -435,6 +483,8 @@ UIConfiguration::get_variables (std::string which_node)
int
UIConfiguration::set_state (const XMLNode& root, int /*version*/)
{
+ /* this can load a generic UI configuration file or a colors file */
+
if (root.name() != "Ardour") {
return -1;
}
@@ -455,6 +505,13 @@ UIConfiguration::set_state (const XMLNode& root, int /*version*/)
}
}
+ XMLNode* base = find_named_node (root, X_("BaseColors"));
+
+ if (base) {
+ load_base_colors (*base);
+ }
+
+
XMLNode* relative = find_named_node (root, X_("RelativeColors"));
if (relative) {
@@ -472,6 +529,12 @@ UIConfiguration::set_state (const XMLNode& root, int /*version*/)
}
void
+UIConfiguration::load_base_colors (XMLNode const &)
+{
+
+}
+
+void
UIConfiguration::load_color_aliases (XMLNode const & node)
{
XMLNodeList const nlist = node.children();
@@ -531,35 +594,15 @@ UIConfiguration::set_variables (const XMLNode& node)
#include "canvas_vars.h"
#undef UI_CONFIG_VARIABLE
#undef CANVAS_FONT_VARIABLE
-
- /* Reset base colors */
-
-#undef CANVAS_BASE_COLOR
-#define CANVAS_BASE_COLOR(var,name,val) var.set_from_node (node); /* we don't care about ParameterChanged here */
-#include "base_colors.h"
-#undef CANVAS_BASE_COLOR
-
-}
-
-void
-UIConfiguration::set_dirty ()
-{
- _dirty = true;
-}
-
-bool
-UIConfiguration::dirty () const
-{
- return _dirty || aliases_modified || derived_modified;
}
ArdourCanvas::Color
UIConfiguration::base_color_by_name (const std::string& name) const
{
- map<std::string,ColorVariable<Color>* >::const_iterator i = base_colors.find (name);
+ BaseColors::const_iterator i = base_colors.find (name);
if (i != base_colors.end()) {
- return i->second->get();
+ return i->second;
}
cerr << string_compose (_("Base Color %1 not found"), name) << endl;
@@ -620,7 +663,20 @@ UIConfiguration::quantized (Color c) const
}
void
-UIConfiguration::reset_relative (const string& name, const RelativeHSV& rhsv)
+UIConfiguration::set_base (string const& name, ArdourCanvas::Color color)
+{
+ BaseColors::iterator i = base_colors.find (name);
+ if (i == base_colors.end()) {
+ return;
+ }
+ i->second = color;
+ base_modified = true;
+
+ ARDOUR_UI_UTILS::ColorsChanged (); /* EMIT SIGNAL */
+}
+
+void
+UIConfiguration::set_relative (const string& name, const RelativeHSV& rhsv)
{
RelativeColors::iterator i = relative_colors.find (name);
@@ -632,8 +688,6 @@ UIConfiguration::reset_relative (const string& name, const RelativeHSV& rhsv)
derived_modified = true;
ARDOUR_UI_UTILS::ColorsChanged (); /* EMIT SIGNAL */
-
- save_state ();
}
void
@@ -648,18 +702,17 @@ UIConfiguration::set_alias (string const & name, string const & alias)
aliases_modified = true;
ARDOUR_UI_UTILS::ColorsChanged (); /* EMIT SIGNAL */
-
- save_state ();
}
void
-UIConfiguration::load_rc_file (const string& filename, bool themechange)
+UIConfiguration::load_rc_file (bool themechange)
{
+ string basename = ui_rc_file.get();
std::string rc_file_path;
- if (!find_file (ardour_config_search_path(), filename, rc_file_path)) {
+ if (!find_file (ardour_config_search_path(), basename, 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)
+ basename, ardour_config_search_path().to_string(), PROGRAM_NAME)
<< endmsg;
return;
}