diff --git a/src/lay/lay/CustomizeMenuConfigPage.ui b/src/lay/lay/CustomizeMenuConfigPage.ui
index 67995fb53..78ee4529d 100644
--- a/src/lay/lay/CustomizeMenuConfigPage.ui
+++ b/src/lay/lay/CustomizeMenuConfigPage.ui
@@ -82,26 +82,13 @@
-
- -
-
-
- Qt::Vertical
-
-
- QSizePolicy::Fixed
-
-
-
- 20
- 10
-
-
-
-
-
- Examples:
+ Delete text for
+"no key bound".
+
+Key examples:
- "Ctrl+A"
- "Shift+F2"
- "M"
diff --git a/src/lay/lay/layMainConfigPages.cc b/src/lay/lay/layMainConfigPages.cc
index 25e2bbd4a..67a85bacd 100644
--- a/src/lay/lay/layMainConfigPages.cc
+++ b/src/lay/lay/layMainConfigPages.cc
@@ -326,76 +326,6 @@ MainConfigPage5::commit (lay::PluginRoot *root)
// ------------------------------------------------------------
// The "key bindings" config page
-std::vector >
-unpack_key_binding (const std::string &packed)
-{
- tl::Extractor ex (packed.c_str ());
-
- std::vector > key_bindings;
-
- while (! ex.at_end ()) {
- ex.test(";");
- key_bindings.push_back (std::make_pair (std::string (), std::string ()));
- ex.read_word_or_quoted (key_bindings.back ().first);
- ex.test(":");
- ex.read_word_or_quoted (key_bindings.back ().second);
- }
-
- return key_bindings;
-}
-
-std::string
-pack_key_binding (const std::vector > &unpacked)
-{
- std::string packed;
-
- for (std::vector >::const_iterator p = unpacked.begin (); p != unpacked.end (); ++p) {
- if (! packed.empty ()) {
- packed += ";";
- }
- packed += tl::to_word_or_quoted_string (p->first);
- packed += ":";
- packed += tl::to_word_or_quoted_string (p->second);
- }
-
- return packed;
-}
-
-std::vector >
-unpack_menu_items_hidden (const std::string &packed)
-{
- tl::Extractor ex (packed.c_str ());
-
- std::vector > hidden;
-
- while (! ex.at_end ()) {
- ex.test(";");
- hidden.push_back (std::make_pair (std::string (), false));
- ex.read_word_or_quoted (hidden.back ().first);
- ex.test(":");
- ex.read (hidden.back ().second);
- }
-
- return hidden;
-}
-
-std::string
-pack_menu_items_hidden (const std::vector > &unpacked)
-{
- std::string packed;
-
- for (std::vector >::const_iterator p = unpacked.begin (); p != unpacked.end (); ++p) {
- if (! packed.empty ()) {
- packed += ";";
- }
- packed += tl::to_word_or_quoted_string (p->first);
- packed += ":";
- packed += tl::to_string (p->second);
- }
-
- return packed;
-}
-
CustomizeMenuConfigPage::CustomizeMenuConfigPage (QWidget *parent)
: lay::ConfigPage (parent), m_enable_event (true)
{
@@ -407,6 +337,7 @@ CustomizeMenuConfigPage::CustomizeMenuConfigPage (QWidget *parent)
mp_ui->binding_le->setEnabled (false);
mp_ui->binding_le->set_clear_button_enabled (true);
+ connect (mp_ui->binding_le, SIGNAL (clear_pressed ()), this, SLOT (text_cleared ()));
connect (mp_ui->binding_le, SIGNAL (textChanged (QString)), this, SLOT (text_changed ()));
mp_ui->filter->set_clear_button_enabled (true);
@@ -433,7 +364,7 @@ static void get_shortcuts (const lay::AbstractMenu &menu, const std::string &roo
}
get_shortcuts (menu, *i, bindings, with_defaults);
} else if (! menu.is_separator (*i)) {
- bindings.insert (std::make_pair (*i, with_defaults ? menu.action (*i).get_default_shortcut () : menu.action (*i).get_shortcut ()));
+ bindings.insert (std::make_pair (*i, with_defaults ? menu.action (*i).get_default_shortcut () : menu.action (*i).get_effective_shortcut ()));
}
}
}
@@ -483,7 +414,8 @@ CustomizeMenuConfigPage::apply (const std::vector::iterator kb = m_current_bindings.begin (); kb != m_current_bindings.end (); ++kb) {
std::map::iterator bb = b.find (kb->first);
if (bb != b.end ()) {
- kb->second = bb->second;
+ lay::Action a = lay::MainWindow::instance ()->menu ()->action (kb->first);
+ kb->second = a.get_effective_shortcut_for (bb->second);
} else {
kb->second.clear ();
}
@@ -517,13 +449,9 @@ CustomizeMenuConfigPage::apply (const std::vectorfirst];
std::map::const_iterator db = default_bindings.find (cb->first);
- bool is_default = false;
std::string sc = cb->second;
- if (sc.empty () && db != default_bindings.end ()) {
- sc = db->second;
- is_default = true;
- }
+ bool is_default = (db != default_bindings.end () && db->second == sc);
const std::string &path = cb->first;
@@ -599,7 +527,16 @@ CustomizeMenuConfigPage::commit (lay::PluginRoot *root)
for (std::vector >::iterator kb = key_bindings.begin (); kb != key_bindings.end (); ++kb) {
std::map::iterator cb = m_current_bindings.find (kb->first);
if (cb != m_current_bindings.end ()) {
- kb->second = cb->second;
+ lay::Action a = lay::MainWindow::instance ()->menu ()->action (kb->first);
+ if (cb->second != a.get_default_shortcut ()) {
+ if (cb->second.empty ()) {
+ kb->second = lay::Action::no_shortcut ();
+ } else {
+ kb->second = cb->second;
+ }
+ } else {
+ kb->second.clear ();
+ }
m_current_bindings.erase (cb);
}
}
@@ -631,6 +568,21 @@ CustomizeMenuConfigPage::commit (lay::PluginRoot *root)
root->config_set (cfg_menu_items_hidden, packed_hidden_flags);
}
+void
+CustomizeMenuConfigPage::text_cleared ()
+{
+ QTreeWidgetItem *item = mp_ui->bindings_list->currentItem ();
+ if (! item) {
+ return;
+ }
+
+ std::string path = tl::to_string (item->data (0, Qt::UserRole).toString ());
+ lay::Action a = lay::MainWindow::instance ()->menu ()->action (path);
+
+ // "clear" reverts to default
+ mp_ui->binding_le->setText (tl::to_qstring (a.get_default_shortcut ()));
+}
+
void
CustomizeMenuConfigPage::text_changed ()
{
@@ -673,17 +625,18 @@ CustomizeMenuConfigPage::update_list_item (QTreeWidgetItem *item)
std::string path = tl::to_string (item->data (0, Qt::UserRole).toString ());
std::string shortcut = tl::to_string (mp_ui->binding_le->text ().simplified ());
+ // normalize string
+ shortcut = tl::to_string (QKeySequence (tl::to_qstring (shortcut)).toString ());
m_current_bindings[path] = shortcut;
bool is_default = false;
- std::string eff_shortcut = shortcut;
- if (shortcut.empty ()) {
- lay::Action a = lay::MainWindow::instance ()->menu ()->action (path);
- eff_shortcut = a.get_default_shortcut ();
- is_default = true;
- }
- item->setData (2, Qt::DisplayRole, tl::to_qstring (eff_shortcut));
+ lay::Action a = lay::MainWindow::instance ()->menu ()->action (path);
+ std::string def_shortcut = a.get_default_shortcut ();
+
+ is_default = (def_shortcut == shortcut);
+
+ item->setData (2, Qt::DisplayRole, tl::to_qstring (shortcut));
item->setData (2, Qt::ForegroundRole, palette ().color (is_default ? QPalette::Disabled : QPalette::Normal, QPalette::Text));
// Set the aliases too
@@ -696,7 +649,7 @@ CustomizeMenuConfigPage::update_list_item (QTreeWidgetItem *item)
m_current_bindings[*p] = shortcut;
std::map::const_iterator i = m_item_for_path.find (*p);
if (i != m_item_for_path.end ()) {
- i->second->setData (2, Qt::DisplayRole, tl::to_qstring (eff_shortcut));
+ i->second->setData (2, Qt::DisplayRole, tl::to_qstring (shortcut));
i->second->setData (2, Qt::ForegroundRole, palette ().color (is_default ? QPalette::Disabled : QPalette::Normal, QPalette::Text));
}
}
diff --git a/src/lay/lay/layMainConfigPages.h b/src/lay/lay/layMainConfigPages.h
index 64212860a..4c93ad8ce 100644
--- a/src/lay/lay/layMainConfigPages.h
+++ b/src/lay/lay/layMainConfigPages.h
@@ -48,27 +48,6 @@ class QAction;
namespace lay
{
-/**
- * @brief A utility function to convert the packed key binding in the cfg_key_bindings string to a vector
- */
-std::vector > unpack_key_binding (const std::string &packed);
-
-/**
- * @brief A utility function to convert the key binding (as path/shortcut pair vector) to a packed string for cfg_key_bindings
- */
-std::string pack_key_binding (const std::vector > &unpacked);
-
-/**
- * @brief A utility function to convert the packed hidden flags in the cfg_menu_items_hidden string to a vector
- */
-std::vector > unpack_menu_items_hidden (const std::string &packed);
-
-/**
- * @brief A utility function to convert the hidde flags (as path/bool pair vector) to a packed string for cfg_menu_items_hidden
- */
-std::string pack_menu_items_hidden (const std::vector > &unpacked);
-
-
class ColorButton;
class MainConfigPage
@@ -199,6 +178,7 @@ private slots:
void current_changed (QTreeWidgetItem *current, QTreeWidgetItem *previous);
void item_changed (QTreeWidgetItem *, int);
void text_changed ();
+ void text_cleared ();
void filter_changed ();
void reset_clicked ();
diff --git a/src/laybasic/laybasic/gsiDeclLayMenu.cc b/src/laybasic/laybasic/gsiDeclLayMenu.cc
index 680843b7f..dfd043d82 100644
--- a/src/laybasic/laybasic/gsiDeclLayMenu.cc
+++ b/src/laybasic/laybasic/gsiDeclLayMenu.cc
@@ -28,7 +28,65 @@
namespace gsi
{
+static std::string pack_key_binding (const std::map &kb)
+{
+ std::vector > v;
+ v.insert (v.end (), kb.begin (), kb.end ());
+ return lay::pack_key_binding (v);
+}
+
+static std::map unpack_key_binding (const std::string &s)
+{
+ std::vector > v = lay::unpack_key_binding (s);
+ std::map kb;
+ kb.insert (v.begin (), v.end ());
+ return kb;
+}
+
+static std::string pack_menu_items_hidden (const std::map &kb)
+{
+ std::vector > v;
+ v.insert (v.end (), kb.begin (), kb.end ());
+ return lay::pack_menu_items_hidden (v);
+}
+
+static std::map unpack_menu_items_hidden (const std::string &s)
+{
+ std::vector > v = lay::unpack_menu_items_hidden (s);
+ std::map kb;
+ kb.insert (v.begin (), v.end ());
+ return kb;
+}
+
Class decl_AbstractMenu ("lay", "AbstractMenu",
+ method ("pack_key_binding", &pack_key_binding, gsi::arg ("path_to_keys"),
+ "@brief Serializes a key binding definition into a single string\n"
+ "The serialized format is used by the 'key-bindings' config key. "
+ "This method will take an array of path/key definitions (including the \\Action#NoKeyBound option) "
+ "and convert it to a single string suitable for assigning to the config key.\n"
+ "\n"
+ "This method has been introduced in version 0.26."
+ ) +
+ method ("unpack_key_binding", &unpack_key_binding, gsi::arg ("s"),
+ "@brief Deserializes a key binding definition\n"
+ "This method is the reverse of \\pack_key_binding.\n"
+ "\n"
+ "This method has been introduced in version 0.26."
+ ) +
+ method ("pack_menu_items_hidden", &pack_menu_items_hidden, gsi::arg ("path_to_visibility"),
+ "@brief Serializes a menu item visibility definition into a single string\n"
+ "The serialized format is used by the 'menu-items-hidden' config key. "
+ "This method will take an array of path/visibility flag definitions "
+ "and convert it to a single string suitable for assigning to the config key.\n"
+ "\n"
+ "This method has been introduced in version 0.26."
+ ) +
+ method ("unpack_menu_items_hidden", &unpack_menu_items_hidden, gsi::arg ("s"),
+ "@brief Deserializes a menu item visibility definition\n"
+ "This method is the reverse of \\pack_menu_items_hidden.\n"
+ "\n"
+ "This method has been introduced in version 0.26."
+ ) +
method ("action", &lay::AbstractMenu::action,
"@brief Get the reference to a Action object associated with the given path\n"
"@args path\n"
@@ -157,8 +215,16 @@ Class decl_ActionBase ("lay", "ActionBase",
method ("shortcut=", (void (lay::Action::*)(const std::string &)) &lay::Action::set_shortcut,
"@brief Sets the keyboard shortcut\n"
"@args shortcut\n"
+ "If the shortcut string is empty, the default shortcut will be used. If the string "
+ "is equal to \\Action#NoKeyBound, no keyboard shortcut will be assigned.\n"
"\n"
- "@param shortcut The keyboard shortcut (i.e. \"Ctrl+C\")\n"
+ "@param shortcut The keyboard shortcut in Qt notation (i.e. \"Ctrl+C\")\n"
+ "\n"
+ "The NoKeyBound option has been added in version 0.26."
+ ) +
+ constant ("NoKeyBound", &lay::Action::no_shortcut,
+ "@brief Gets a shortcut value indicating that no shortcut shall be assigned\n"
+ "This method has been introduced in version 0.26."
) +
method ("shortcut", &lay::Action::get_shortcut,
"@brief Gets the keyboard shortcut\n"
diff --git a/src/laybasic/laybasic/layAbstractMenu.cc b/src/laybasic/laybasic/layAbstractMenu.cc
index de2ea1159..bd6acbb20 100644
--- a/src/laybasic/laybasic/layAbstractMenu.cc
+++ b/src/laybasic/laybasic/layAbstractMenu.cc
@@ -65,6 +65,79 @@ static const bool s_can_move_menu = true;
#endif
+// ---------------------------------------------------------------
+// Serialization of key bindings and hidden menu state
+
+std::vector >
+unpack_key_binding (const std::string &packed)
+{
+ tl::Extractor ex (packed.c_str ());
+
+ std::vector > key_bindings;
+
+ while (! ex.at_end ()) {
+ ex.test(";");
+ key_bindings.push_back (std::make_pair (std::string (), std::string ()));
+ ex.read_word_or_quoted (key_bindings.back ().first);
+ ex.test(":");
+ ex.read_word_or_quoted (key_bindings.back ().second);
+ }
+
+ return key_bindings;
+}
+
+std::string
+pack_key_binding (const std::vector > &unpacked)
+{
+ std::string packed;
+
+ for (std::vector >::const_iterator p = unpacked.begin (); p != unpacked.end (); ++p) {
+ if (! packed.empty ()) {
+ packed += ";";
+ }
+ packed += tl::to_word_or_quoted_string (p->first);
+ packed += ":";
+ packed += tl::to_word_or_quoted_string (p->second);
+ }
+
+ return packed;
+}
+
+std::vector >
+unpack_menu_items_hidden (const std::string &packed)
+{
+ tl::Extractor ex (packed.c_str ());
+
+ std::vector > hidden;
+
+ while (! ex.at_end ()) {
+ ex.test(";");
+ hidden.push_back (std::make_pair (std::string (), false));
+ ex.read_word_or_quoted (hidden.back ().first);
+ ex.test(":");
+ ex.read (hidden.back ().second);
+ }
+
+ return hidden;
+}
+
+std::string
+pack_menu_items_hidden (const std::vector > &unpacked)
+{
+ std::string packed;
+
+ for (std::vector >::const_iterator p = unpacked.begin (); p != unpacked.end (); ++p) {
+ if (! packed.empty ()) {
+ packed += ";";
+ }
+ packed += tl::to_word_or_quoted_string (p->first);
+ packed += ":";
+ packed += tl::to_string (p->second);
+ }
+
+ return packed;
+}
+
// ---------------------------------------------------------------
// Helper function to parse a title with potential shortcut and
// icon specification
@@ -279,7 +352,8 @@ ActionHandle::ActionHandle (QWidget *parent)
m_ref_count (0),
m_owned (true),
m_visible (true),
- m_hidden (false)
+ m_hidden (false),
+ m_no_key_sequence (false)
{
if (! sp_actionHandles) {
sp_actionHandles = new std::set ();
@@ -296,7 +370,8 @@ ActionHandle::ActionHandle (QAction *action, bool owned)
m_ref_count (0),
m_owned (owned),
m_visible (true),
- m_hidden (false)
+ m_hidden (false),
+ m_no_key_sequence (false)
{
if (! sp_actionHandles) {
sp_actionHandles = new std::set ();
@@ -313,7 +388,8 @@ ActionHandle::ActionHandle (QMenu *menu, bool owned)
m_ref_count (0),
m_owned (owned),
m_visible (true),
- m_hidden (false)
+ m_hidden (false),
+ m_no_key_sequence (false)
{
if (! sp_actionHandles) {
sp_actionHandles = new std::set ();
@@ -390,7 +466,7 @@ ActionHandle::set_visible (bool v)
m_visible = v;
if (mp_action) {
mp_action->setVisible (is_effective_visible ());
- mp_action->setShortcut (get_effective_shortcut ());
+ mp_action->setShortcut (get_key_sequence ());
}
}
}
@@ -402,7 +478,7 @@ ActionHandle::set_hidden (bool h)
m_hidden = h;
if (mp_action) {
mp_action->setVisible (is_effective_visible ());
- mp_action->setShortcut (get_effective_shortcut ());
+ mp_action->setShortcut (get_key_sequence ());
}
}
}
@@ -426,49 +502,69 @@ ActionHandle::is_effective_visible () const
}
void
-ActionHandle::set_default_shortcut (const QKeySequence &sc)
+ActionHandle::set_default_shortcut (const std::string &sc)
{
if (m_default_shortcut != sc) {
m_default_shortcut = sc;
+ m_default_key_sequence = QKeySequence (tl::to_qstring (sc));
if (mp_action) {
- mp_action->setShortcut (get_effective_shortcut ());
+ mp_action->setShortcut (get_key_sequence ());
}
}
}
void
-ActionHandle::set_shortcut (const QKeySequence &sc)
+ActionHandle::set_shortcut (const std::string &sc)
{
if (m_shortcut != sc) {
m_shortcut = sc;
+ m_no_key_sequence = (sc == Action::no_shortcut ());
+ m_key_sequence = m_no_key_sequence ? QKeySequence () : QKeySequence (tl::to_qstring (m_shortcut));
if (mp_action) {
- mp_action->setShortcut (get_effective_shortcut ());
+ mp_action->setShortcut (get_key_sequence ());
}
}
}
-const QKeySequence &
+std::string
ActionHandle::get_default_shortcut () const
{
- return m_default_shortcut;
+ return tl::to_string (m_default_key_sequence.toString ());
}
-const QKeySequence &
+std::string
ActionHandle::get_shortcut () const
{
- return m_shortcut;
+ return m_no_key_sequence ? Action::no_shortcut () : tl::to_string (m_key_sequence.toString ());
}
QKeySequence
-ActionHandle::get_effective_shortcut () const
+ActionHandle::get_key_sequence () const
{
if (m_hidden) {
// A hidden menu item does not have a key sequence too.
return QKeySequence ();
- } else if (m_shortcut.isEmpty ()) {
- return m_default_shortcut;
+ } else if (m_no_key_sequence) {
+ return QKeySequence ();
+ } else if (m_key_sequence.isEmpty ()) {
+ return m_default_key_sequence;
} else {
- return m_shortcut;
+ return m_key_sequence;
+ }
+}
+
+QKeySequence
+ActionHandle::get_key_sequence_for (const std::string &sc) const
+{
+ if (m_hidden) {
+ // A hidden menu item does not have a key sequence too.
+ return QKeySequence ();
+ } else if (sc.empty ()) {
+ return m_default_key_sequence;
+ } else if (sc == Action::no_shortcut ()) {
+ return QKeySequence ();
+ } else {
+ return QKeySequence::fromString (tl::to_qstring (sc));
}
}
@@ -485,6 +581,13 @@ Action::Action ()
}
}
+const std::string &
+Action::no_shortcut ()
+{
+ static const std::string no_shortcut ("none");
+ return no_shortcut;
+}
+
Action::Action (const std::string &title)
{
mp_handle = AbstractMenu::create_action (title);
@@ -587,7 +690,7 @@ Action::get_title () const
}
void
-Action::set_shortcut (const QKeySequence &s)
+Action::set_shortcut (const std::string &s)
{
if (mp_handle) {
mp_handle->set_shortcut (s);
@@ -595,30 +698,28 @@ Action::set_shortcut (const QKeySequence &s)
}
void
-Action::set_default_shortcut (const QKeySequence &s)
+Action::set_default_shortcut (const std::string &s)
{
if (mp_handle) {
mp_handle->set_default_shortcut (s);
}
}
-void
-Action::set_shortcut (const std::string &s)
-{
- set_shortcut (QKeySequence (tl::to_qstring (s)));
-}
-
-void
-Action::set_default_shortcut (const std::string &s)
-{
- set_default_shortcut (QKeySequence (tl::to_qstring (s)));
-}
-
std::string
Action::get_effective_shortcut () const
{
if (mp_handle) {
- return tl::to_string (mp_handle->get_effective_shortcut ().toString ());
+ return tl::to_string (mp_handle->get_key_sequence ().toString ());
+ } else {
+ return std::string ();
+ }
+}
+
+std::string
+Action::get_effective_shortcut_for (const std::string &sc) const
+{
+ if (mp_handle) {
+ return tl::to_string (mp_handle->get_key_sequence_for (sc).toString ());
} else {
return std::string ();
}
@@ -628,7 +729,7 @@ std::string
Action::get_shortcut () const
{
if (mp_handle) {
- return tl::to_string (mp_handle->get_shortcut ().toString ());
+ return mp_handle->get_shortcut ();
} else {
return std::string ();
}
@@ -638,7 +739,7 @@ std::string
Action::get_default_shortcut () const
{
if (mp_handle) {
- return tl::to_string (mp_handle->get_default_shortcut ().toString ());
+ return mp_handle->get_default_shortcut ();
} else {
return std::string ();
}
@@ -930,7 +1031,7 @@ AbstractMenu::create_action (const std::string &s)
}
if (! shortcut.empty ()) {
- ah->set_default_shortcut (QKeySequence (tl::to_qstring (shortcut)));
+ ah->set_default_shortcut (shortcut);
}
return ah;
diff --git a/src/laybasic/laybasic/layAbstractMenu.h b/src/laybasic/laybasic/layAbstractMenu.h
index def7dcd8a..5aad5f41a 100644
--- a/src/laybasic/laybasic/layAbstractMenu.h
+++ b/src/laybasic/laybasic/layAbstractMenu.h
@@ -55,6 +55,26 @@ class Action;
class AbstractMenu;
class PluginRoot;
+/**
+ * @brief A utility function to convert the packed key binding in the cfg_key_bindings string to a vector
+ */
+LAYBASIC_PUBLIC std::vector > unpack_key_binding (const std::string &packed);
+
+/**
+ * @brief A utility function to convert the key binding (as path/shortcut pair vector) to a packed string for cfg_key_bindings
+ */
+LAYBASIC_PUBLIC std::string pack_key_binding (const std::vector > &unpacked);
+
+/**
+ * @brief A utility function to convert the packed hidden flags in the cfg_menu_items_hidden string to a vector
+ */
+LAYBASIC_PUBLIC std::vector > unpack_menu_items_hidden (const std::string &packed);
+
+/**
+ * @brief A utility function to convert the hidde flags (as path/bool pair vector) to a packed string for cfg_menu_items_hidden
+ */
+LAYBASIC_PUBLIC std::string pack_menu_items_hidden (const std::vector > &unpacked);
+
/**
* @brief A helper class that does reference counting for the QAction object
*/
@@ -79,11 +99,12 @@ public:
bool is_hidden () const;
bool is_effective_visible () const;
- void set_default_shortcut (const QKeySequence &sc);
- void set_shortcut (const QKeySequence &sc);
- const QKeySequence &get_default_shortcut () const;
- const QKeySequence &get_shortcut () const;
- QKeySequence get_effective_shortcut () const;
+ void set_default_shortcut (const std::string &sc);
+ void set_shortcut (const std::string &sc);
+ std::string get_default_shortcut () const;
+ std::string get_shortcut() const;
+ QKeySequence get_key_sequence () const;
+ QKeySequence get_key_sequence_for (const std::string &sc) const;
protected slots:
void destroyed (QObject *obj);
@@ -95,8 +116,11 @@ private:
bool m_owned;
bool m_visible;
bool m_hidden;
- QKeySequence m_default_shortcut;
- QKeySequence m_shortcut;
+ std::string m_default_shortcut;
+ QKeySequence m_default_key_sequence;
+ std::string m_shortcut;
+ QKeySequence m_key_sequence;
+ bool m_no_key_sequence;
// no copying
ActionHandle (const ActionHandle &);
@@ -173,14 +197,14 @@ public:
std::string get_title () const;
/**
- * @brief Sets the keyboard shortcut (as a QKeySequence object)
- * If no shortcut is set, the default shortcut will be taken.
+ * @brief Gets the shortcut string for "no shortcut present"
*/
- void set_shortcut (const QKeySequence &s);
+ static const std::string &no_shortcut ();
/**
* @brief Sets the keyboard shortcut
- * If no shortcut is set, the default shortcut will be taken.
+ * If no shortcut is set (empty string), the default shortcut will be taken.
+ * If the shortcut string is "no_shortcut()", no shortcut will be assigned to the item.
*/
void set_shortcut (const std::string &s);
@@ -191,12 +215,6 @@ public:
*/
std::string get_shortcut () const;
- /**
- * @brief Sets the default keyboard shortcut (as a QKeySequence object)
- * This shortcut is used when no specific shortcut is set.
- */
- void set_default_shortcut (const QKeySequence &s);
-
/**
* @brief Sets the default keyboard shortcut
* This shortcut is used when no specific shortcut is set.
@@ -215,6 +233,11 @@ public:
*/
std::string get_effective_shortcut () const;
+ /**
+ * @brief Gets the effective shortcut for a given key sequence string
+ */
+ std::string get_effective_shortcut_for (const std::string &sc) const;
+
/**
* @brief "is_checkable" attribute
*/
diff --git a/src/laybasic/laybasic/layWidgets.cc b/src/laybasic/laybasic/layWidgets.cc
index 0a37d34e7..781a77671 100644
--- a/src/laybasic/laybasic/layWidgets.cc
+++ b/src/laybasic/laybasic/layWidgets.cc
@@ -1100,6 +1100,7 @@ void DecoratedLineEdit::mouseReleaseEvent (QMouseEvent *event)
if (c == mp_clear_label) {
clear ();
+ emit clear_pressed (); // might modify the text
emit textEdited (text ());
}
diff --git a/src/laybasic/laybasic/layWidgets.h b/src/laybasic/laybasic/layWidgets.h
index cde82c8eb..a18cb3337 100644
--- a/src/laybasic/laybasic/layWidgets.h
+++ b/src/laybasic/laybasic/layWidgets.h
@@ -439,6 +439,7 @@ signals:
void esc_pressed ();
void tab_pressed ();
void backtab_pressed ();
+ void clear_pressed ();
protected:
void mousePressEvent (QMouseEvent *event);
diff --git a/testdata/ruby/layMenuTest.rb b/testdata/ruby/layMenuTest.rb
index a59356a0f..22a0be329 100644
--- a/testdata/ruby/layMenuTest.rb
+++ b/testdata/ruby/layMenuTest.rb
@@ -59,6 +59,12 @@ class LAYMenuTest_TestClass < TestBase
assert_equal(b.shortcut, "")
assert_equal(b.effective_shortcut, "X")
+ a.shortcut = RBA::Action::NoKeyBound
+ assert_equal(a.default_shortcut, "X")
+ assert_equal(a.shortcut, "none")
+ assert_equal(a.effective_shortcut, "")
+ a.shortcut = ""
+
assert_equal(a.is_visible?, true)
a.hidden = false
@@ -319,6 +325,26 @@ RESULT
end
+ def test_3
+
+ map = RBA::AbstractMenu::unpack_key_binding("'path.a':X;'path.b':''")
+ assert_equal(map["path.a"], "X")
+ assert_equal(map["path.b"], "")
+ assert_equal(map["path.c"], nil)
+
+ map2 = RBA::AbstractMenu::unpack_key_binding(RBA::AbstractMenu::pack_key_binding(map))
+ assert_equal(map == map2, true)
+
+ map = RBA::AbstractMenu::unpack_menu_items_hidden("'path.a':true;'path.b':false")
+ assert_equal(map["path.a"], true)
+ assert_equal(map["path.b"], false)
+ assert_equal(map["path.c"], nil)
+
+ map2 = RBA::AbstractMenu::unpack_menu_items_hidden(RBA::AbstractMenu::pack_menu_items_hidden(map))
+ assert_equal(map == map2, true)
+
+ end
+
end
load("test_epilogue.rb")