Implement config checking (#1859)
* Add error handling functions to ConfigHandler Refurbished functions setValue and value which were previously unused. These functions now set/get a setting with error handling. Currently recognizes only errors recognizable by QSettings. * Make use of value and setValue in ConfigHandler Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add checker for unrecognized general options Extraneous config options in [General] will be reported as errors. Added some placeholder functions to be implemented in future commits. * Introduce keysFromGroup function Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Check shortcut names for duplicates Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix notification spam Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Implement shortcut conflict checking Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix reading of fallbacks on error If there is a config error, some values would not be loaded correctly. Using the newly implemented function ConfigHandler::contains instead of QSettings::contains solves this issue. These changes reveal u bug that causes a crash on startup. Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix crashes introduced in previous commit Because ConfigHandler is a dependency of most other classes, calling functions from those classes inside ConfigHandler caused infinite recursions in some cases. Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add config file watcher Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add missing config options Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix bug in shortcut conflict detection Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add error resolved notification Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add GUI error message overlay Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add indicator in config window Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Use ConfigHandler::fileChanged in ConfigWindow Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix watcher sometimes not firing Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Improve config file watching performance Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add new way to handle config This is only a fundamental implementation. Future commits will replace everything with this new paradigm. Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix getButtons and related functions Also refactored related code to use QList instead of QVector because QSettings does not work well with QVector. Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Make good use of the new way * Implement proper checking for basic types Everything is covered, apart from KeySequence. * Move fallback path to ExistingDir value handler Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Use consistent naming scheme in ConfigHandler Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Implement config getters/setters via macro Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Surround text with tr and clang-format Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix colors being saved obfuscated Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add ValueHandler::represenation Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Move ValueHandler to separate files Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * confighandler.cpp: rename macro CUSTOM to OPTION Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix bug with shortcut conflict checker Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Update docs and fix setAllTheButtons Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Handle filenamePattern properly Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix failing build due to wrong function name Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix QSet error due to Qt version mismatch Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Replace QSharedPointer::get with data for older Qt versions Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix failing build on MacOS and ubuntu 18.04 Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add column headers to recognizedGeneralOptions map Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix ubuntu 18.04 error Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix false positive when shortcuts empty Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix wrong shortcut group prefix Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Implement proper shortcut checking Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add shortcut map in ConfigHandler Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Move ConfigShortcuts functions to ShortcutsWidget Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix minor bugs Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add fallback scheme: Pictures, HOME, TMP Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add config --check CLI option Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add config error log to GUI Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Rename ValueHandler::description to expected * Convert Qt's #AARRGGBB to #RRGGBBAA and vice versa Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Remove obsolete `saveAfterCopyPath` Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix errors in example config Also added an additional ; in front of actual comments to differentiate them from commented options. Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Allow special value 'picker' in userColors Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Allow only name, #RRGGBB, and #RRGGBBAA color formats Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com>
This commit is contained in:
@@ -2,9 +2,9 @@
|
||||
// SPDX-FileCopyrightText: 2020 Yurii Puchkov at Namecheap & Contributors
|
||||
|
||||
#include "shortcutswidget.h"
|
||||
#include "capturetool.h"
|
||||
#include "setshortcutwidget.h"
|
||||
#include "src/core/qguiappcurrentscreen.h"
|
||||
#include "src/utils/configshortcuts.h"
|
||||
#include <QHeaderView>
|
||||
#include <QIcon>
|
||||
#include <QKeyEvent>
|
||||
@@ -37,13 +37,12 @@ ShortcutsWidget::ShortcutsWidget(QWidget* parent)
|
||||
m_layout = new QVBoxLayout(this);
|
||||
m_layout->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
||||
|
||||
m_shortcuts = ConfigShortcuts().captureShortcutsDefault(
|
||||
CaptureToolButton::getIterableButtonTypes());
|
||||
initShortcuts();
|
||||
initInfoTable();
|
||||
show();
|
||||
}
|
||||
|
||||
const QVector<QStringList>& ShortcutsWidget::shortcuts()
|
||||
const QList<QStringList>& ShortcutsWidget::shortcuts()
|
||||
{
|
||||
return m_shortcuts;
|
||||
}
|
||||
@@ -158,6 +157,71 @@ void ShortcutsWidget::slotShortcutCellClicked(int row, int col)
|
||||
}
|
||||
}
|
||||
|
||||
void ShortcutsWidget::initShortcuts()
|
||||
{
|
||||
auto buttons = CaptureToolButton::getIterableButtonTypes();
|
||||
|
||||
// get shortcuts names from capture buttons
|
||||
for (const CaptureToolButton::ButtonType& t : buttons) {
|
||||
CaptureToolButton* b = new CaptureToolButton(t, nullptr);
|
||||
QString shortcutName = QVariant::fromValue(t).toString();
|
||||
if (shortcutName != "TYPE_IMAGEUPLOADER") {
|
||||
appendShortcut(shortcutName, b->tool()->description());
|
||||
}
|
||||
delete b;
|
||||
}
|
||||
|
||||
// additional tools that don't have their own buttons
|
||||
appendShortcut("TYPE_TOGGLE_PANEL", "Toggle side panel");
|
||||
appendShortcut("TYPE_RESIZE_LEFT", "Resize selection left 1px");
|
||||
appendShortcut("TYPE_RESIZE_RIGHT", "Resize selection right 1px");
|
||||
appendShortcut("TYPE_RESIZE_UP", "Resize selection up 1px");
|
||||
appendShortcut("TYPE_RESIZE_DOWN", "Resize selection down 1px");
|
||||
appendShortcut("TYPE_SELECT_ALL", "Select entire screen");
|
||||
appendShortcut("TYPE_MOVE_LEFT", "Move selection left 1px");
|
||||
appendShortcut("TYPE_MOVE_RIGHT", "Move selection right 1px");
|
||||
appendShortcut("TYPE_MOVE_UP", "Move selection up 1px");
|
||||
appendShortcut("TYPE_MOVE_DOWN", "Move selection down 1px");
|
||||
appendShortcut("TYPE_COMMIT_CURRENT_TOOL", "Commit text in text area");
|
||||
appendShortcut("TYPE_DELETE_CURRENT_TOOL", "Delete current tool");
|
||||
|
||||
// non-editable shortcuts have an empty shortcut name
|
||||
|
||||
m_shortcuts << (QStringList() << "" << QObject::tr("Quit capture")
|
||||
<< QKeySequence(Qt::Key_Escape).toString());
|
||||
|
||||
// Global hotkeys
|
||||
#if defined(Q_OS_MACOS)
|
||||
m_shortcuts << (QStringList()
|
||||
<< "" << QObject::tr("Screenshot history") << "⇧⌘⌥H");
|
||||
m_shortcuts << (QStringList()
|
||||
<< "" << QObject::tr("Capture screen") << "⇧⌘⌥4");
|
||||
#elif defined(Q_OS_WIN)
|
||||
m_shortcuts << (QStringList() << "" << QObject::tr("Screenshot history")
|
||||
<< "Shift+Print Screen");
|
||||
m_shortcuts << (QStringList()
|
||||
<< "" << QObject::tr("Capture screen") << "Print Screen");
|
||||
#else
|
||||
// TODO - Linux doesn't support global shortcuts for (XServer and Wayland),
|
||||
// possibly it will be solved in the QHotKey library later. So it is
|
||||
// disabled for now.
|
||||
#endif
|
||||
m_shortcuts << (QStringList()
|
||||
<< "" << QObject::tr("Show color picker") << "Right Click");
|
||||
m_shortcuts << (QStringList()
|
||||
<< "" << QObject::tr("Change the tool's thickness")
|
||||
<< "Mouse Wheel");
|
||||
}
|
||||
|
||||
void ShortcutsWidget::appendShortcut(const QString& shortcutName,
|
||||
const QString& description)
|
||||
{
|
||||
m_shortcuts << (QStringList()
|
||||
<< shortcutName
|
||||
<< QObject::tr(description.toStdString().c_str())
|
||||
<< ConfigHandler().shortcut(shortcutName));
|
||||
}
|
||||
|
||||
#if defined(Q_OS_MACOS)
|
||||
const QString& ShortcutsWidget::nativeOSHotKeyText(const QString& text)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user