more tweaks to HTML output when printing key bindings
This commit is contained in:
parent
6753efb780
commit
37156d6761
@ -609,23 +609,30 @@ Bindings::replace (KeyboardKey kb, Operation op, string const & action_name, boo
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_registered(op, action_name)) {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
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)) {
|
if (is_registered (op, action_name)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeybindingMap& kbm = get_keymap (op);
|
KeybindingMap& kbm = get_keymap (op);
|
||||||
|
if (group) {
|
||||||
KeybindingMap::value_type new_pair (kb, ActionInfo (action_name));
|
KeybindingMap::value_type new_pair = make_pair (kb, ActionInfo (action_name, group->value()));
|
||||||
kbm.insert (new_pair).first;
|
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) {
|
if (can_save) {
|
||||||
Keyboard::keybindings_changed ();
|
Keyboard::keybindings_changed ();
|
||||||
@ -695,7 +702,7 @@ Bindings::activate (MouseButton bb, Operation op)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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);
|
MouseButtonBindingMap& bbm = get_mousemap(op);
|
||||||
|
|
||||||
@ -813,76 +820,98 @@ Bindings::save_as_html (ostream& ostr) const
|
|||||||
|
|
||||||
if (!press_bindings.empty()) {
|
if (!press_bindings.empty()) {
|
||||||
|
|
||||||
ostr << "<div><h1 class=\"binding-set-name\">\n";
|
ostr << "<div class=\"binding-set\">\n";
|
||||||
|
ostr << "<h1>";
|
||||||
ostr << name();
|
ostr << name();
|
||||||
ostr << "</h1><table><tr><th>Shortcut</th><th>Operation</th></tr>\n";
|
ostr << "</h1>\n\n";
|
||||||
|
|
||||||
int row_count = 0;
|
/* first pass: separate by group */
|
||||||
|
|
||||||
|
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) {
|
for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
|
||||||
if (k->first.name().empty()) {
|
if (k->first.name().empty()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
RefPtr<Action> action;
|
string group_name;
|
||||||
|
if (!k->second.group_name.empty()) {
|
||||||
if (k->second.action) {
|
group_name = k->second.group_name;
|
||||||
action = k->second.action;
|
|
||||||
} else {
|
} else {
|
||||||
if (_action_map) {
|
group_name = X_("nogroup");
|
||||||
action = _action_map->find_action (k->second.action_name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!action) {
|
GroupMap::iterator gm = group_map.find (group_name);
|
||||||
continue;
|
if (gm == group_map.end()) {
|
||||||
}
|
std::vector<KeybindingMap::const_iterator> li;
|
||||||
|
li.push_back (k);
|
||||||
string key_name = k->first.native_short_name ();
|
group_map.insert (make_pair (group_name,li));
|
||||||
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 (row_count % 2) {
|
|
||||||
ostr << "<tr><td class=\"key-name-odd\">";
|
|
||||||
} else {
|
} else {
|
||||||
ostr << "<tr><td class=\"key-name-even\">";
|
gm->second.push_back (k);
|
||||||
}
|
}
|
||||||
ostr << key_name;
|
|
||||||
if (row_count % 2) {
|
|
||||||
ostr << "</td><td class=\"key-action-odd\">";
|
|
||||||
} else {
|
|
||||||
ostr << "</td><td class=\"key-action-even\">";
|
|
||||||
}
|
|
||||||
ostr << action->get_label();
|
|
||||||
ostr << "</td></tr>\n";
|
|
||||||
row_count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ostr << "</table></div>\n";
|
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) {
|
||||||
|
|
||||||
|
if ((*k)->first.name().empty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 << "</div>\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
ostr << "</div>\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -922,11 +951,13 @@ Bindings::load_operation (XMLNode const& node)
|
|||||||
XMLProperty const * ap;
|
XMLProperty const * ap;
|
||||||
XMLProperty const * kp;
|
XMLProperty const * kp;
|
||||||
XMLProperty const * bp;
|
XMLProperty const * bp;
|
||||||
|
XMLProperty const * gp;
|
||||||
XMLNode const * child = *p;
|
XMLNode const * child = *p;
|
||||||
|
|
||||||
ap = child->property ("action");
|
ap = child->property ("action");
|
||||||
kp = child->property ("key");
|
kp = child->property ("key");
|
||||||
bp = child->property ("button");
|
bp = child->property ("button");
|
||||||
|
gp = child->property ("group");
|
||||||
|
|
||||||
if (!ap || (!kp && !bp)) {
|
if (!ap || (!kp && !bp)) {
|
||||||
continue;
|
continue;
|
||||||
@ -937,13 +968,13 @@ Bindings::load_operation (XMLNode const& node)
|
|||||||
if (!KeyboardKey::make_key (kp->value(), k)) {
|
if (!KeyboardKey::make_key (kp->value(), k)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
add (k, op, ap->value());
|
add (k, op, ap->value(), gp);
|
||||||
} else {
|
} else {
|
||||||
MouseButton b;
|
MouseButton b;
|
||||||
if (!MouseButton::make_button (bp->value(), b)) {
|
if (!MouseButton::make_button (bp->value(), b)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
add (b, op, ap->value());
|
add (b, op, ap->value(), gp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "gtkmm2ext/visibility.h"
|
#include "gtkmm2ext/visibility.h"
|
||||||
|
|
||||||
class XMLNode;
|
class XMLNode;
|
||||||
|
class XMLProperty;
|
||||||
|
|
||||||
namespace Gtkmm2ext {
|
namespace Gtkmm2ext {
|
||||||
|
|
||||||
@ -146,8 +147,10 @@ class LIBGTKMM2EXT_API Bindings {
|
|||||||
|
|
||||||
struct ActionInfo {
|
struct ActionInfo {
|
||||||
ActionInfo (std::string const& name) : action_name (name) {}
|
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 action_name;
|
||||||
|
std::string group_name; /* may be empty */
|
||||||
Glib::RefPtr<Gtk::Action> action;
|
Glib::RefPtr<Gtk::Action> action;
|
||||||
};
|
};
|
||||||
typedef std::map<KeyboardKey,ActionInfo> KeybindingMap;
|
typedef std::map<KeyboardKey,ActionInfo> KeybindingMap;
|
||||||
@ -164,13 +167,13 @@ class LIBGTKMM2EXT_API Bindings {
|
|||||||
bool empty_keys () const;
|
bool empty_keys () const;
|
||||||
bool empty_mouse () 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 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 remove (Operation, std::string const& action_name, bool can_save = false);
|
||||||
|
|
||||||
bool activate (KeyboardKey, Operation);
|
bool activate (KeyboardKey, Operation);
|
||||||
|
|
||||||
void add (MouseButton, Operation, std::string const&);
|
void add (MouseButton, Operation, std::string const&, XMLProperty const*);
|
||||||
void remove (MouseButton, Operation);
|
void remove (MouseButton, Operation);
|
||||||
bool activate (MouseButton, Operation);
|
bool activate (MouseButton, Operation);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user