summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/ShortcutRegistry.cpp92
-rw-r--r--src/ui/ShortcutRegistry.h27
2 files changed, 70 insertions, 49 deletions
diff --git a/src/ui/ShortcutRegistry.cpp b/src/ui/ShortcutRegistry.cpp
index a9a47e3f..5c32b8cb 100644
--- a/src/ui/ShortcutRegistry.cpp
+++ b/src/ui/ShortcutRegistry.cpp
@@ -1,13 +1,27 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
#include "ShortcutRegistry.h"
ShortcutRegistry *ShortcutRegistry::s_instance = nullptr;
EditableShortcut::EditableShortcut(QObject *parent)
- : QObject{parent}
+ : QObject{parent}
+{
+ ShortcutRegistry::instance()->registerShortcut(this);
+}
+
+EditableShortcut::EditableShortcut(const QString &name, const QString &description, QObject *parent)
+ : QObject{parent}
+ , m_name{name}
+ , m_description{description}
{
+ ShortcutRegistry::instance()->registerShortcut(this);
}
-const QStringList EditableShortcut::shortcuts() const
+const QStringList
+EditableShortcut::shortcuts() const
{
QStringList dest;
dest.resize(m_shortcuts.size());
@@ -17,7 +31,8 @@ const QStringList EditableShortcut::shortcuts() const
return dest;
}
-void EditableShortcut::setName(const QString &name)
+void
+EditableShortcut::setName(const QString &name)
{
if (name == m_name)
return;
@@ -25,7 +40,8 @@ void EditableShortcut::setName(const QString &name)
emit nameChanged();
}
-void EditableShortcut::setDescription(const QString &description)
+void
+EditableShortcut::setDescription(const QString &description)
{
if (description == m_description)
return;
@@ -33,12 +49,14 @@ void EditableShortcut::setDescription(const QString &description)
emit descriptionChanged();
}
-void EditableShortcut::setShortcut(const QString &shortcut)
+void
+EditableShortcut::setShortcut(const QString &shortcut)
{
setShortcuts({shortcut});
}
-void EditableShortcut::setShortcuts(const QStringList &shortcuts)
+void
+EditableShortcut::setShortcuts(const QStringList &shortcuts)
{
QList<QKeySequence> temp;
temp.resize(shortcuts.size());
@@ -52,12 +70,13 @@ void EditableShortcut::setShortcuts(const QStringList &shortcuts)
emit shortcutsChanged();
}
-EditableShortcut::EditableShortcut(const QString &name, const QString &description, QObject *parent)
- : QObject{parent}
- , m_name{name}
- , m_description{description}
+ShortcutRegistry::ShortcutRegistry(QObject *parent)
+ : QAbstractListModel{parent}
{
- ShortcutRegistry::instance()->registerShortcut(this);
+ if (s_instance)
+ m_shortcuts = s_instance->m_shortcuts;
+
+ s_instance = this;
}
ShortcutRegistry *
@@ -66,7 +85,8 @@ ShortcutRegistry::instance()
return s_instance;
}
-ShortcutRegistry *ShortcutRegistry::create(QQmlEngine *qmlEngine, QJSEngine *)
+ShortcutRegistry *
+ShortcutRegistry::create(QQmlEngine *qmlEngine, QJSEngine *)
{
// The instance has to exist before it is used. We cannot replace it.
Q_ASSERT(s_instance);
@@ -85,20 +105,20 @@ ShortcutRegistry *ShortcutRegistry::create(QQmlEngine *qmlEngine, QJSEngine *)
return s_instance;
}
-QHash<int, QByteArray> ShortcutRegistry::roleNames() const
+QHash<int, QByteArray>
+ShortcutRegistry::roleNames() const
{
- return {{Roles::Name, "name"},
- {Roles::Description, "description"},
- {Roles::Shortcut, "shortcut"}};
+ return {
+ {Roles::Name, "name"}, {Roles::Description, "description"}, {Roles::Shortcut, "shortcut"}};
}
-QVariant ShortcutRegistry::data(const QModelIndex &index, int role) const
+QVariant
+ShortcutRegistry::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() >= m_shortcuts.size() || index.row() < 0)
return {};
- switch (role)
- {
+ switch (role) {
case Roles::Name:
return m_shortcuts[index.row()]->name();
case Roles::Description:
@@ -110,31 +130,29 @@ QVariant ShortcutRegistry::data(const QModelIndex &index, int role) const
}
}
-bool ShortcutRegistry::setData(const QModelIndex &index, const QVariant &value, int role)
+void
+ShortcutRegistry::changeShortcut(const QString &name, const QString &newShortcut)
{
- if (!index.isValid() || index.row() >= m_shortcuts.size() || index.row() < 0)
- return false;
-
- switch (role)
- {
- case Roles::Shortcut:
- if (auto shortcut = QKeySequence(value.toString()); !shortcut.isEmpty()) {
- m_shortcuts[index.row()]->setShortcut(shortcut.toString());
- return true;
- } else
- return false;
- default:
- return false;
+ for (int i = 0; i < m_shortcuts.size(); ++i) {
+ if (m_shortcuts[i]->name() == name) {
+ qDebug() << "new:" << newShortcut;
+ m_shortcuts[i]->setShortcut(newShortcut);
+ emit dataChanged(index(i), index(i), {Roles::Shortcut});
+ return;
+ }
}
}
-ShortcutRegistry::ShortcutRegistry(QObject *parent)
- : QAbstractListModel{parent}
+QString
+ShortcutRegistry::keycodeToChar(int keycode) const
{
- s_instance = this;
+ return QString((char)keycode);
}
-void ShortcutRegistry::registerShortcut(EditableShortcut *action)
+void
+ShortcutRegistry::registerShortcut(EditableShortcut *action)
{
+ beginInsertRows({}, m_shortcuts.size(), m_shortcuts.size());
m_shortcuts.push_back(action);
+ endInsertRows();
}
diff --git a/src/ui/ShortcutRegistry.h b/src/ui/ShortcutRegistry.h
index c075b50c..c2fe6265 100644
--- a/src/ui/ShortcutRegistry.h
+++ b/src/ui/ShortcutRegistry.h
@@ -1,7 +1,11 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
#pragma once
#include <QAbstractListModel>
-#include <QAction>
+#include <QKeySequence>
#include <QQmlEngine>
class EditableShortcut : public QObject
@@ -10,15 +14,15 @@ class EditableShortcut : public QObject
QML_ELEMENT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged FINAL)
- Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY descriptionChanged FINAL)
+ Q_PROPERTY(
+ QString description READ description WRITE setDescription NOTIFY descriptionChanged FINAL)
Q_PROPERTY(QString shortcut READ shortcut WRITE setShortcut NOTIFY shortcutsChanged FINAL)
- Q_PROPERTY(QStringList shortcuts READ shortcuts WRITE setShortcuts NOTIFY shortcutsChanged FINAL)
+ Q_PROPERTY(
+ QStringList shortcuts READ shortcuts WRITE setShortcuts NOTIFY shortcutsChanged FINAL)
public:
EditableShortcut(QObject *parent = nullptr);
EditableShortcut(const QString &name, const QString &description, QObject *parent = nullptr);
- EditableShortcut(const QString &name, const QString &description, const QString &text, QObject *parent = nullptr);
- EditableShortcut(const QString &name, const QString &description, const QIcon &icon, const QString &text, QObject *parent = nullptr);
const QString &name() const { return m_name; }
const QString &description() const { return m_description; }
@@ -58,20 +62,19 @@ public:
Shortcut,
};
+ explicit ShortcutRegistry(QObject *parent = nullptr);
+
static ShortcutRegistry *instance();
static ShortcutRegistry *create(QQmlEngine *qmlEngine, QJSEngine *);
QHash<int, QByteArray> roleNames() const override;
- int rowCount(const QModelIndex & = QModelIndex()) const override
- {
- return m_shortcuts.size();
- }
+ int rowCount(const QModelIndex & = QModelIndex()) const override { return m_shortcuts.size(); }
QVariant data(const QModelIndex &index, int role) const override;
- bool setData(const QModelIndex &index, const QVariant &value, int role) override;
-private:
- explicit ShortcutRegistry(QObject *parent = nullptr);
+ Q_INVOKABLE void changeShortcut(const QString &name, const QString &newShortcut);
+ Q_INVOKABLE QString keycodeToChar(int keycode) const;
+private:
void registerShortcut(EditableShortcut *action);
static ShortcutRegistry *s_instance;