16 #include <QKeySequence>
29 QSet<ecvModalShortcut*> Siblings;
43 QMap<QKeySequence, Shortcuts> Data;
59 : QObject(parent), m_silence(false) {
65 const QKeySequence& keySequence)
const {
67 QMap<QKeySequence, Shortcuts>::iterator iter =
68 g_keys.Data.find(keySequence);
69 if (iter == g_keys.Data.end()) {
73 for (
auto& sibling : iter->Siblings) {
74 if (sibling && sibling->isEnabled()) {
84 const QKeySequence& keySequence, QAction* action, QWidget* parent) {
85 if (keySequence.isEmpty()) {
87 "[ecvKeySequences] Attempted to register empty key sequence");
95 auto& keyData = g_keys.Data[keySequence];
96 keyData.Siblings.insert(shortcut);
99 shortcut->setEnabled(
false);
110 shortcut->setEnabled(
true);
113 QString(
"[ecvKeySequences] Registered modal shortcut: %1 (ID: %2)")
114 .arg(keySequence.toString())
115 .arg(shortcut->objectName().isEmpty()
117 : shortcut->objectName()));
129 QMap<QKeySequence, Shortcuts>::iterator iter =
131 if (iter == g_keys.Data.end()) {
136 bool hasActiveSibling =
false;
137 for (
auto& sibling : iter->Siblings) {
138 if (sibling != target && sibling && sibling->
isEnabled()) {
139 hasActiveSibling =
true;
146 if (!hasActiveSibling) {
153 iter->mruShortcut = target;
156 QString(
"[ecvKeySequences] Reordered shortcut: %1 (MRU set)")
162 QMap<QKeySequence, Shortcuts>::iterator iter =
163 g_keys.Data.find(keySequence);
164 if (iter == g_keys.Data.end()) {
166 QString(
"[ecvKeySequences] No shortcuts registered for: %1")
167 .arg(keySequence.toString()));
172 .arg(keySequence.toString()));
173 for (
auto& sibling : iter->Siblings) {
176 .arg(sibling->objectName().isEmpty()
178 : sibling->objectName())
179 .arg(sibling->isEnabled()
192 auto* shortcut = qobject_cast<ecvModalShortcut*>(this->sender());
197 QMap<QKeySequence, Shortcuts>::iterator iter =
198 g_keys.Data.find(shortcut->keySequence());
199 if (iter == g_keys.Data.end()) {
204 iter->mruShortcut = shortcut;
207 iter->mruShortcut = shortcut;
211 int disabledCount = 0;
212 for (
auto& sibling : iter->Siblings) {
213 if (sibling != shortcut && sibling->isEnabled()) {
214 sibling->setEnabled(
false);
220 if (disabledCount > 0) {
222 QString(
"[ecvKeySequences] Disabled %1 sibling(s) for %2")
224 .arg(shortcut->keySequence().toString()));
234 auto* shortcut = qobject_cast<ecvModalShortcut*>(this->sender());
240 QMap<QKeySequence, Shortcuts>::iterator iter =
241 g_keys.Data.find(shortcut->keySequence());
242 if (iter == g_keys.Data.end()) {
249 if (iter->mruShortcut && iter->mruShortcut != shortcut) {
251 QWidget* parentWidget =
252 qobject_cast<QWidget*>(iter->mruShortcut->parent());
253 if (parentWidget && parentWidget->isEnabled() &&
254 parentWidget->isVisible()) {
255 iter->mruShortcut->setEnabled(
true);
257 QString(
"[ecvKeySequences] Enabled next sibling (MRU): %1")
258 .arg(shortcut->keySequence().toString()));
262 for (
auto& sibling : iter->Siblings) {
263 if (sibling != shortcut && sibling) {
264 QWidget* siblingParent =
265 qobject_cast<QWidget*>(sibling->parent());
266 if (siblingParent && siblingParent->isEnabled() &&
267 siblingParent->isVisible()) {
268 sibling->setEnabled(
true);
272 .arg(shortcut->keySequence()
281 for (
auto& sibling : iter->Siblings) {
282 if (sibling != shortcut && sibling) {
283 QWidget* siblingParent =
284 qobject_cast<QWidget*>(sibling->parent());
285 if (siblingParent && siblingParent->isEnabled() &&
286 siblingParent->isVisible()) {
287 sibling->setEnabled(
true);
289 QString(
"[ecvKeySequences] Enabled next sibling: "
291 .arg(shortcut->keySequence().toString()));
301 auto* shortcut = qobject_cast<ecvModalShortcut*>(this->sender());
306 QMap<QKeySequence, Shortcuts>::iterator iter =
307 g_keys.Data.find(shortcut->keySequence());
308 if (iter == g_keys.Data.end()) {
313 iter->Siblings.remove(shortcut);
314 QObject::disconnect(shortcut);
317 QString(
"[ecvKeySequences] Unregistered modal shortcut: %1")
318 .arg(shortcut->keySequence().toString()));
321 if (iter->Siblings.empty()) {
322 g_keys.Data.erase(iter);
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
static bool Print(const char *format,...)
Prints out a formatted message in console.
static bool PrintVerbose(const char *format,...)
Prints out a verbose formatted message in console.
Manage key sequences used for shortcuts.
virtual void enableNextSibling()
virtual void disableSiblings()
void reorder(ecvModalShortcut *target)
virtual void removeModalShortcut()
bool m_silence
Set true in slot implementations to avoid signal/slot recursion.
ecvModalShortcut * active(const QKeySequence &keySequence) const
ecvModalShortcut * addModalShortcut(const QKeySequence &keySequence, QAction *action, QWidget *parent)
static ecvKeySequences & instance()
void dumpShortcuts(const QKeySequence &keySequence) const
ecvKeySequences(QObject *parent)
Manage an action and/or widget's responsivity to a shortcut.
QKeySequence keySequence() const