diff options
author | Nicolas Werner <nicolas.werner@hotmail.de> | 2022-11-09 04:58:19 +0100 |
---|---|---|
committer | Nicolas Werner <nicolas.werner@hotmail.de> | 2022-11-09 04:59:06 +0100 |
commit | 485babba14485801f9835a27a2062d19ec126cc4 (patch) | |
tree | e6f450c8a4b2f579e96c0436c48d12c4515ab4f7 /src/CommandCompleter.cpp | |
parent | 0cc1c6eddc272dcf21f6e3379b07c07a383e5083 (diff) |
Implement a completer for commands
fixes #429
Diffstat (limited to 'src/CommandCompleter.cpp')
-rw-r--r-- | src/CommandCompleter.cpp | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/src/CommandCompleter.cpp b/src/CommandCompleter.cpp new file mode 100644 index 00000000..96dfeace --- /dev/null +++ b/src/CommandCompleter.cpp @@ -0,0 +1,222 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// SPDX-FileCopyrightText: 2022 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "CommandCompleter.h" + +#include "CompletionModelRoles.h" + +CommandCompleter::CommandCompleter(QObject *parent) + : QAbstractListModel(parent) +{ +} + +QHash<int, QByteArray> +CommandCompleter::roleNames() const +{ + return { + {CompletionModel::CompletionRole, "completionRole"}, + {CompletionModel::SearchRole, "searchRole"}, + {CompletionModel::SearchRole2, "searchRole2"}, + {Roles::Name, "name"}, + {Roles::Description, "description"}, + }; +} + +QVariant +CommandCompleter::data(const QModelIndex &index, int role) const +{ + if (hasIndex(index.row(), index.column(), index.parent())) { + switch (role) { + case CompletionModel::CompletionRole: + // append space where applicable in a completion + switch (index.row()) { + case Me: + return QString("/me "); + case React: + return QString("/react "); + case Join: + return QString("/join "); + case Knock: + return QString("/knock "); + case Part: + return QString("/part "); + case Leave: + return QString("/leave "); + case Invite: + return QString("/invite @"); + case Kick: + return QString("/kick @"); + case Ban: + return QString("/ban @"); + case Unban: + return QString("/unban @"); + case Redact: + return QString("/redact "); + case Roomnick: + return QString("/roomnick "); + case Shrug: + return QString("/shrug"); + case Fliptable: + return QString("/fliptable"); + case Unfliptable: + return QString("/unfliptable"); + case Sovietflip: + return QString("/sovietflip"); + case ClearTimeline: + return QString("/clear-timeline"); + case ResetState: + return QString("/reset-state"); + case RotateMegolmSession: + return QString("/rotate-megolm-session"); + case Md: + return QString("/md "); + case Plain: + return QString("/plain "); + case Rainbow: + return QString("/rainbow "); + case RainbowMe: + return QString("/rainbowme "); + case Notice: + return QString("/notice "); + case RainbowNotice: + return QString("/rainbownotice "); + case Goto: + return QString("/goto "); + case ConvertToDm: + return QString("/converttodm"); + case ConvertToRoom: + return QString("/converttoroom"); + default: + return {}; + } + case CompletionModel::SearchRole: + case Qt::DisplayRole: + case Roles::Name: + switch (index.row()) { + case Me: + return tr("/me <message>"); + case React: + return tr("/react <text>"); + case Join: + return tr("/join (!roomid|#alias) [reason]"); + case Knock: + return tr("/knock (!roomid|#alias) [reason]"); + case Part: + return tr("/part [reason]"); + case Leave: + return tr("/leave [reason]"); + case Invite: + return tr("/invite @userid [reason]"); + case Kick: + return tr("/kick @userid [reason]"); + case Ban: + return tr("/ban @userid [reason]"); + case Unban: + return tr("/unban @userid [reason]"); + case Redact: + return tr("/redact ($eventid|@userid)"); + case Roomnick: + return tr("/roomnick <displayname>"); + case Shrug: + return tr("/shrug [message]"); + case Fliptable: + return tr("/fliptable"); + case Unfliptable: + return tr("/unfliptable"); + case Sovietflip: + return tr("/sovietflip"); + case ClearTimeline: + return tr("/clear-timeline"); + case ResetState: + return tr("/reset-state"); + case RotateMegolmSession: + return tr("/rotate-megolm-session"); + case Md: + return tr("/md [message]"); + case Plain: + return tr("/plain [message]"); + case Rainbow: + return tr("/rainbow [message]"); + case RainbowMe: + return tr("/rainbowme [message]"); + case Notice: + return tr("/notice [message]"); + case RainbowNotice: + return tr("/rainbownotice [message]"); + case Goto: + return tr("/goto ($eventid|message index|matrix:r/room/e/event)"); + case ConvertToDm: + return tr("/converttodm"); + case ConvertToRoom: + return tr("/converttoroom"); + default: + return {}; + } + case CompletionModel::SearchRole2: + case Roles::Description: + switch (index.row()) { + case Me: + return tr("Send a message expressing an action."); + case React: + return tr("Send <text> as a reaction when you’re replying to a message."); + case Join: + return tr("Join a room. Reason is optional."); + case Knock: + return tr("Ask to join a room. Reason is optional."); + case Part: + return tr("Leave a room. Reason is optional."); + case Leave: + return tr("Leave a room. Reason is optional."); + case Invite: + return tr("Invite a user into the current room. Reason is optional."); + case Kick: + return tr("Kick a user from the current room. Reason is optional."); + case Ban: + return tr("Ban a user from the current room. Reason is optional."); + case Unban: + return tr("Unban a user in the current room. Reason is optional."); + case Redact: + return tr("Redact an event or all locally cached messages of a user."); + case Roomnick: + return tr("Change your displayname in this room."); + case Shrug: + return tr("¯\\_(ツ)_/¯ with an optional message."); + case Fliptable: + return tr("(╯°□°)╯︵ ┻━┻"); + case Unfliptable: + return tr("┯━┯╭( º _ º╭)"); + case Sovietflip: + return tr("ノ┬─┬ノ ︵ ( \\o°o)\\"); + case ClearTimeline: + return tr("Clear the currently cached messages in this room."); + case ResetState: + return tr("Refetch the state in this room."); + case RotateMegolmSession: + return tr("Rotate the current symmetric encryption key."); + case Md: + return tr("Send a markdown formatted message (ignoring the global setting)."); + case Plain: + return tr("Send an unformatted message (ignoring the global setting)."); + case Rainbow: + return tr("Send a message in rainbow colors."); + case RainbowMe: + return tr("Send /me in rainbow colors."); + case Notice: + return tr("Send a bot message."); + case RainbowNotice: + return tr("Send a bot message in rainbow colors."); + case Goto: + return tr("Go to this event or link."); + case ConvertToDm: + return tr("Convert this room to a direct chat."); + case ConvertToRoom: + return tr("Convert this direct chat into a room."); + default: + return {}; + } + } + } + return {}; +} |