summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-06-22 18:56:17 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-06-23 08:37:24 -0400
commit37156d6761f73c7a662f4111cf71f22f50b7a836 (patch)
tree647f3049a710994c7a5077c4c0cb7d83059db0ce /libs/gtkmm2ext
parent6753efb7809534f7ad67512ab8ca715a481676f5 (diff)
more tweaks to HTML output when printing key bindings
Diffstat (limited to 'libs/gtkmm2ext')
-rw-r--r--libs/gtkmm2ext/bindings.cc153
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/bindings.h7
2 files changed, 97 insertions, 63 deletions
diff --git a/libs/gtkmm2ext/bindings.cc b/libs/gtkmm2ext/bindings.cc
index a0a0fa1005..617fc3a100 100644
--- a/libs/gtkmm2ext/bindings.cc
+++ b/libs/gtkmm2ext/bindings.cc
@@ -609,23 +609,30 @@ Bindings::replace (KeyboardKey kb, Operation op, string const & action_name, boo
}
if (is_registered(op, action_name)) {
- remove(op, action_name, can_save);
+ remove (op, action_name, can_save);
}
- add (kb, op, action_name, can_save);
+
+ /* XXX need a way to get the old group name */
+ add (kb, op, action_name, 0, can_save);
+
return true;
}
bool
-Bindings::add (KeyboardKey kb, Operation op, string const& action_name, bool can_save)
+Bindings::add (KeyboardKey kb, Operation op, string const& action_name, XMLProperty const* group, bool can_save)
{
if (is_registered (op, action_name)) {
return false;
}
KeybindingMap& kbm = get_keymap (op);
-
- KeybindingMap::value_type new_pair (kb, ActionInfo (action_name));
- kbm.insert (new_pair).first;
+ if (group) {
+ KeybindingMap::value_type new_pair = make_pair (kb, ActionInfo (action_name, group->value()));
+ kbm.insert (new_pair).first;
+ } else {
+ KeybindingMap::value_type new_pair = make_pair (kb, ActionInfo (action_name));
+ kbm.insert (new_pair).first;
+ }
if (can_save) {
Keyboard::keybindings_changed ();
@@ -695,7 +702,7 @@ Bindings::activate (MouseButton bb, Operation op)
}
void
-Bindings::add (MouseButton bb, Operation op, string const& action_name)
+Bindings::add (MouseButton bb, Operation op, string const& action_name, XMLProperty const* /*group*/)
{
MouseButtonBindingMap& bbm = get_mousemap(op);
@@ -813,76 +820,98 @@ Bindings::save_as_html (ostream& ostr) const
if (!press_bindings.empty()) {
- ostr << "<div><h1 class=\"binding-set-name\">\n";
+ ostr << "<div class=\"binding-set\">\n";
+ ostr << "<h1>";
ostr << name();
- ostr << "</h1><table><tr><th>Shortcut</th><th>Operation</th></tr>\n";
+ ostr << "</h1>\n\n";
+
+ /* first pass: separate by group */
- int row_count = 0;
+ typedef std::map<std::string, std::vector<KeybindingMap::const_iterator> > GroupMap;
+ GroupMap group_map;
for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
if (k->first.name().empty()) {
continue;
}
- RefPtr<Action> action;
-
- if (k->second.action) {
- action = k->second.action;
+ string group_name;
+ if (!k->second.group_name.empty()) {
+ group_name = k->second.group_name;
} else {
- if (_action_map) {
- action = _action_map->find_action (k->second.action_name);
- }
+ group_name = X_("nogroup");
}
- if (!action) {
- continue;
+ GroupMap::iterator gm = group_map.find (group_name);
+ if (gm == group_map.end()) {
+ std::vector<KeybindingMap::const_iterator> li;
+ li.push_back (k);
+ group_map.insert (make_pair (group_name,li));
+ } else {
+ gm->second.push_back (k);
}
+ }
+
+ for (GroupMap::const_iterator gm = group_map.begin(); gm != group_map.end(); ++gm) {
+
+ ostr << "<div class=\"group\">\n";
+ ostr << "<div class=\"group-name\">" << gm->first << "</div>\n";
+
+ for (vector<KeybindingMap::const_iterator>::const_iterator k = gm->second.begin(); k != gm->second.end(); ++k) {
- string key_name = k->first.native_short_name ();
- replace_all (key_name, X_("KP_"), X_("Numpad "));
-
- string::size_type pos;
-
- char const *targets[] = { X_("Separator"), X_("Add"), X_("Subtract"), X_("Decimal"), X_("Divide"),
- X_("grave"), X_("comma"), X_("period"), X_("asterisk"), X_("backslash"),
- X_("apostrophe"), X_("minus"), X_("plus"), X_("slash"), X_("semicolon"),
- X_("colon"), X_("equal"), X_("bracketleft"), X_("bracketright"),
- X_("ampersand"), X_("numbersign"), X_("parenleft"), X_("parenright"),
- X_("quoteright"), X_("quoteleft"), X_("exclam"), X_("quotedbl"),
- 0
- };
-
- char const *replacements[] = { X_("-"), X_("+"), X_("-"), X_("."), X_("/"),
- X_("`"), X_(","), X_("."), X_("*"), X_("\\"),
- X_("'"), X_("-"), X_("+"), X_("/"), X_(";"),
- X_(":"), X_("="), X_("{"), X_("{"),
- X_("&"), X_("#"), X_("("), X_(")"),
- X_("`"), X_("'"), X_("!"), X_("\""),
- };
-
- for (size_t n = 0; targets[n]; ++n) {
- if ((pos = key_name.find (targets[n])) != string::npos) {
- key_name.replace (pos, strlen (targets[n]), replacements[n]);
+ if ((*k)->first.name().empty()) {
+ continue;
}
- }
- if (row_count % 2) {
- ostr << "<tr><td class=\"key-name-odd\">";
- } else {
- ostr << "<tr><td class=\"key-name-even\">";
- }
- ostr << key_name;
- if (row_count % 2) {
- ostr << "</td><td class=\"key-action-odd\">";
- } else {
- ostr << "</td><td class=\"key-action-even\">";
+ RefPtr<Action> action;
+
+ if ((*k)->second.action) {
+ action = (*k)->second.action;
+ } else {
+ if (_action_map) {
+ action = _action_map->find_action ((*k)->second.action_name);
+ }
+ }
+
+ if (!action) {
+ continue;
+ }
+
+ string key_name = (*k)->first.native_short_name ();
+ replace_all (key_name, X_("KP_"), X_("Numpad "));
+
+ string::size_type pos;
+
+ char const *targets[] = { X_("Separator"), X_("Add"), X_("Subtract"), X_("Decimal"), X_("Divide"),
+ X_("grave"), X_("comma"), X_("period"), X_("asterisk"), X_("backslash"),
+ X_("apostrophe"), X_("minus"), X_("plus"), X_("slash"), X_("semicolon"),
+ X_("colon"), X_("equal"), X_("bracketleft"), X_("bracketright"),
+ X_("ampersand"), X_("numbersign"), X_("parenleft"), X_("parenright"),
+ X_("quoteright"), X_("quoteleft"), X_("exclam"), X_("quotedbl"),
+ 0
+ };
+
+ char const *replacements[] = { X_("-"), X_("+"), X_("-"), X_("."), X_("/"),
+ X_("`"), X_(","), X_("."), X_("*"), X_("\\"),
+ X_("'"), X_("-"), X_("+"), X_("/"), X_(";"),
+ X_(":"), X_("="), X_("{"), X_("{"),
+ X_("&"), X_("#"), X_("("), X_(")"),
+ X_("`"), X_("'"), X_("!"), X_("\""),
+ };
+
+ for (size_t n = 0; targets[n]; ++n) {
+ if ((pos = key_name.find (targets[n])) != string::npos) {
+ key_name.replace (pos, strlen (targets[n]), replacements[n]);
+ }
+ }
+
+ ostr << "<div class=\"key\">" << key_name << "</div>";
+ ostr << "<div class=\"action\">" << action->get_label() << "</div>\n";
}
- ostr << action->get_label();
- ostr << "</td></tr>\n";
- row_count++;
+ ostr << "</div>\n\n";
}
- ostr << "</table></div>\n";
+ ostr << "</div>\n";
}
}
@@ -922,11 +951,13 @@ Bindings::load_operation (XMLNode const& node)
XMLProperty const * ap;
XMLProperty const * kp;
XMLProperty const * bp;
+ XMLProperty const * gp;
XMLNode const * child = *p;
ap = child->property ("action");
kp = child->property ("key");
bp = child->property ("button");
+ gp = child->property ("group");
if (!ap || (!kp && !bp)) {
continue;
@@ -937,13 +968,13 @@ Bindings::load_operation (XMLNode const& node)
if (!KeyboardKey::make_key (kp->value(), k)) {
continue;
}
- add (k, op, ap->value());
+ add (k, op, ap->value(), gp);
} else {
MouseButton b;
if (!MouseButton::make_button (bp->value(), b)) {
continue;
}
- add (b, op, ap->value());
+ add (b, op, ap->value(), gp);
}
}
}
diff --git a/libs/gtkmm2ext/gtkmm2ext/bindings.h b/libs/gtkmm2ext/gtkmm2ext/bindings.h
index 49b8c6d905..d216e04752 100644
--- a/libs/gtkmm2ext/gtkmm2ext/bindings.h
+++ b/libs/gtkmm2ext/gtkmm2ext/bindings.h
@@ -17,6 +17,7 @@
#include "gtkmm2ext/visibility.h"
class XMLNode;
+class XMLProperty;
namespace Gtkmm2ext {
@@ -146,8 +147,10 @@ class LIBGTKMM2EXT_API Bindings {
struct ActionInfo {
ActionInfo (std::string const& name) : action_name (name) {}
+ ActionInfo (std::string const& name, std::string const& grp) : action_name (name), group_name (grp) {}
std::string action_name;
+ std::string group_name; /* may be empty */
Glib::RefPtr<Gtk::Action> action;
};
typedef std::map<KeyboardKey,ActionInfo> KeybindingMap;
@@ -164,13 +167,13 @@ class LIBGTKMM2EXT_API Bindings {
bool empty_keys () const;
bool empty_mouse () const;
- bool add (KeyboardKey, Operation, std::string const&, bool can_save = false);
+ bool add (KeyboardKey, Operation, std::string const&, XMLProperty const*, bool can_save = false);
bool replace (KeyboardKey, Operation, std::string const& action_name, bool can_save = true);
bool remove (Operation, std::string const& action_name, bool can_save = false);
bool activate (KeyboardKey, Operation);
- void add (MouseButton, Operation, std::string const&);
+ void add (MouseButton, Operation, std::string const&, XMLProperty const*);
void remove (MouseButton, Operation);
bool activate (MouseButton, Operation);