Skip to content

Commit

Permalink
refactor: [shortcut] Refactor the shortcut settings view
Browse files Browse the repository at this point in the history
as title

Log: code refactor
  • Loading branch information
Kakueeen committed Aug 21, 2024
1 parent fd5597f commit 4ad3ac2
Show file tree
Hide file tree
Showing 20 changed files with 856 additions and 417 deletions.
6 changes: 4 additions & 2 deletions src/plugins/binarytools/configure/binarytoolsmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,8 @@ void BinaryToolsManager::updateToolMenu(const BinaryTools &tools)

for (const auto &tool : iter.value()) {
auto act = new QAction(QIcon::fromTheme(tool.icon), tool.name, mGroup);
auto cmd = ActionManager::instance()->registerAction(act, tool.id);
auto actId = QString("BinaryTools.Tool.%1").arg(tool.id);
auto cmd = ActionManager::instance()->registerAction(act, actId);
mGroup->addAction(cmd);

connect(act, &QAction::triggered, this, std::bind(&BinaryToolsManager::executeTool, this, tool.id));
Expand Down Expand Up @@ -578,7 +579,8 @@ void BinaryToolsManager::addToToolBar(const ToolInfo &tool)
act->setIcon(QIcon::fromTheme(tool.icon));
connect(act, &QAction::triggered, this, std::bind(&BinaryToolsManager::executeTool, this, tool.id));

auto cmd = ActionManager::instance()->registerAction(act, tool.id);
auto actId = QString("BinaryTools.Tool.%1").arg(tool.id);
auto cmd = ActionManager::instance()->registerAction(act, actId);
return cmd;
};

Expand Down
3 changes: 2 additions & 1 deletion src/plugins/debugger/interface/menumanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@ void MenuManager::initialize(WindowService *windowService)
QKeySequence key, const QString &iconName = {}) -> Command * {
action->setIcon(QIcon::fromTheme(iconName));
auto cmd = ActionManager::instance()->registerAction(action, id);
cmd->setDefaultKeySequence(key);
cmd->setDescription(description);
if (!key.isEmpty())
cmd->setDefaultKeySequence(key);
return cmd;
};

Expand Down
6 changes: 3 additions & 3 deletions src/plugins/git/utils/gitmenumanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,17 +149,17 @@ void GitMenuManager::createFileSubMenu()
{
auto mCurFile = ActionManager::instance()->actionContainer(M_GIT_FILE);
auto fileLogAct = new QAction(this);
auto cmd = registerShortcut(fileLogAct, A_GIT_LOG_FILE, tr("Git Log"), QKeySequence(Qt::ALT | Qt::SHIFT | Qt::Key_L));
auto cmd = registerShortcut(fileLogAct, A_GIT_LOG_FILE, tr("Git Log"), QKeySequence("Alt+G,Alt+L"));
mCurFile->addAction(cmd);
connect(fileLogAct, &QAction::triggered, this, std::bind(&GitMenuManager::actionHandler, this, cmd, GitLog));

auto fileBlameAct = new QAction(this);
cmd = registerShortcut(fileBlameAct, A_GIT_BLAME_FILE, tr("Git Blame"), QKeySequence(Qt::ALT | Qt::SHIFT | Qt::Key_B));
cmd = registerShortcut(fileBlameAct, A_GIT_BLAME_FILE, tr("Git Blame"), QKeySequence("Alt+G,Alt+B"));
mCurFile->addAction(cmd);
connect(fileBlameAct, &QAction::triggered, this, std::bind(&GitMenuManager::actionHandler, this, cmd, GitBlame));

auto fileDiffAct = new QAction(this);
cmd = registerShortcut(fileDiffAct, A_GIT_DIFF_FILE, tr("Git Diff"), QKeySequence(Qt::ALT | Qt::SHIFT | Qt::Key_D));
cmd = registerShortcut(fileDiffAct, A_GIT_DIFF_FILE, tr("Git Diff"), QKeySequence("Alt+G,Alt+D"));
mCurFile->addAction(cmd);
connect(fileDiffAct, &QAction::triggered, this, std::bind(&GitMenuManager::actionHandler, this, cmd, GitDiff));
}
Expand Down
44 changes: 10 additions & 34 deletions src/plugins/option/optioncore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,19 @@ project(optioncore)

find_package(Qt5 COMPONENTS Xml REQUIRED)

set(CXX_CPP

mainframe/shortcutsettingwidget.cpp
mainframe/persistentsettings.cpp
mainframe/optionsdialog.cpp
mainframe/optiondefaultkeeper.cpp
mainframe/profilesettingwidget.cpp

mainframe/optionprofilesettinggenerator.cpp
mainframe/optionshortcutsettinggenerator.cpp
mainframe/navigationdelegate.cpp
mainframe/shortcutedit.cpp
optioncore.cpp
optioncore.json
)

set(CXX_H

mainframe/shortcutsettingwidget.h
mainframe/persistentsettings.h
mainframe/optionsdialog.h
mainframe/optiondefaultkeeper.h
mainframe/profilesettingwidget.h

mainframe/optionprofilesettinggenerator.h
mainframe/optionshortcutsettinggenerator.h
mainframe/navigationdelegate.h
mainframe/shortcutedit.h
optioncore.h
)
FILE(GLOB_RECURSE PROJECT_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/*/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/*/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/*.json"
)

add_library(${PROJECT_NAME}
SHARED
${CXX_CPP}
${CXX_H}
${PROJECT_SOURCES}
optioncore.qrc
)
)

target_link_libraries(${PROJECT_NAME}
framework
Expand All @@ -50,6 +26,6 @@ target_link_libraries(${PROJECT_NAME}
${QtUseModules}
${PkgUserModules}
Qt5::Xml
)
)

install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${PLUGIN_INSTALL_PATH})

This file was deleted.

This file was deleted.

150 changes: 150 additions & 0 deletions src/plugins/option/optioncore/mainframe/shortcutdialog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#include "shortcutdialog.h"

#include <DLineEdit>
#include <DLabel>

#include <QVBoxLayout>
#include <QKeyEvent>

DWIDGET_USE_NAMESPACE

ShortcutDialog::ShortcutDialog(QWidget *parent)
: DDialog(parent)
{
initUI();
}

void ShortcutDialog::initUI()
{
setIcon(QIcon::fromTheme("ide"));
setWindowTitle(tr("Add Shortcut"));
setWordWrapMessage(true);
setMessage(tr("Press desired key combination to add shortcut"));

keyEdit = new DLineEdit(this);
keyEdit->installEventFilter(this);
keyEdit->lineEdit()->installEventFilter(this);
connect(keyEdit, &DLineEdit::textChanged, this, &ShortcutDialog::keyValueChanged);

msgLabel = new DLabel(this);
msgLabel->setVisible(false);
msgLabel->setWordWrap(true);
msgLabel->setAlignment(Qt::AlignCenter);
msgLabel->setForegroundRole(QPalette::Highlight);
auto f = msgLabel->font();
f.setUnderline(true);
msgLabel->setFont(f);

QWidget *contentWidget = new QWidget(this);
QVBoxLayout *vLayout = new QVBoxLayout(contentWidget);
vLayout->setContentsMargins(0, 0, 0, 0);
vLayout->addWidget(keyEdit);
vLayout->addWidget(msgLabel);

addContent(contentWidget);
addButton(tr("Cancel", "button"));
addButton(tr("Ok", "button"), true, DDialog::ButtonRecommend);
setFocusProxy(keyEdit);
}

void ShortcutDialog::keyValueChanged()
{
if (keyEdit->text().isEmpty())
resetState();

if (!checkHandler)
return;

int count = checkHandler(shortcutKey);
if (count > 0) {
QString msg = count == 1 ? tr("1 same shortcut command exist")
: tr("%1 same shortcut commands exist").arg(count);
msgLabel->setText(msg);
}
msgLabel->setVisible(count != 0);
}

void ShortcutDialog::resetState()
{
keyNum = 0;
shortcutKey = QKeySequence();
keyEdit->clear();
keyArray.fill(0);
}

int ShortcutDialog::translateModifiers(Qt::KeyboardModifiers state, const QString &text)
{
int result = 0;
if ((state & Qt::ShiftModifier)
&& (text.isEmpty()
|| !text.at(0).isPrint()
|| text.at(0).isLetterOrNumber()
|| text.at(0).isSpace()))
result |= Qt::SHIFT;
if (state & Qt::ControlModifier)
result |= Qt::CTRL;
if (state & Qt::MetaModifier)
result |= Qt::META;
if (state & Qt::AltModifier)
result |= Qt::ALT;
return result;
}

QKeySequence ShortcutDialog::keySequece() const
{
return shortcutKey;
}

void ShortcutDialog::setConflictCheckHandler(ConflictCheckHandler handler)
{
checkHandler = handler;
}

bool ShortcutDialog::eventFilter(QObject *watched, QEvent *event)
{
if (keyEdit && watched != keyEdit && watched != keyEdit->lineEdit())
return DDialog::eventFilter(watched, event);

if (keyEdit && event->type() == QEvent::KeyPress) {
auto k = static_cast<QKeyEvent *>(event);
int nextKey = k->key();
if (keyNum > 3)
resetState();

if (nextKey == Qt::Key_Control
|| nextKey == Qt::Key_Shift
|| nextKey == Qt::Key_Meta
|| nextKey == Qt::Key_Alt) {
return false;
}

nextKey |= translateModifiers(k->modifiers(), k->text());
switch (keyNum) {
case 0:
keyArray[0] = nextKey;
break;
case 1:
keyArray[1] = nextKey;
break;
case 2:
keyArray[2] = nextKey;
break;
case 3:
keyArray[3] = nextKey;
break;
default:
break;
}
keyNum++;
k->accept();
shortcutKey = QKeySequence(keyArray[0], keyArray[1], keyArray[2], keyArray[3]);
keyEdit->setText(shortcutKey.toString(QKeySequence::NativeText));
return true;
}

return DDialog::eventFilter(watched, event);
}
38 changes: 38 additions & 0 deletions src/plugins/option/optioncore/mainframe/shortcutdialog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#include <DDialog>

DWIDGET_BEGIN_NAMESPACE
class DLineEdit;
class DLabel;
DWIDGET_END_NAMESPACE

class ShortcutItem;
class ShortcutDialog : public DTK_WIDGET_NAMESPACE::DDialog
{
Q_OBJECT
public:
explicit ShortcutDialog(QWidget *parent = nullptr);

QKeySequence keySequece() const;
using ConflictCheckHandler = std::function<int(const QKeySequence &)>;
void setConflictCheckHandler(ConflictCheckHandler handler);

protected:
bool eventFilter(QObject *watched, QEvent *event) override;

private:
void initUI();
void keyValueChanged();
void resetState();
int translateModifiers(Qt::KeyboardModifiers state, const QString &text);

DTK_WIDGET_NAMESPACE::DLineEdit *keyEdit { nullptr };
DTK_WIDGET_NAMESPACE::DLabel *msgLabel { nullptr };
ConflictCheckHandler checkHandler { nullptr };
QKeySequence shortcutKey;
std::array<int, 4> keyArray { 0 };
int keyNum { 0 };
};
19 changes: 0 additions & 19 deletions src/plugins/option/optioncore/mainframe/shortcutedit.cpp

This file was deleted.

34 changes: 0 additions & 34 deletions src/plugins/option/optioncore/mainframe/shortcutedit.h

This file was deleted.

Loading

0 comments on commit 4ad3ac2

Please sign in to comment.