Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
bae9c0e4eThis file is pinned to the selected release. Download the original to open it in your design tool.
/*
* LibrePCB - Professional EDA for everyone!
* Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
* https://librepcb.org/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LIBREPCB_EDITOR_EDITORCOMMAND_H
#define LIBREPCB_EDITOR_EDITORCOMMAND_H
/*******************************************************************************
* Includes
******************************************************************************/
#include <QtCore>
#include <QtWidgets>
/*******************************************************************************
* Namespace / Forward Declarations
******************************************************************************/
namespace librepcb {
namespace editor {
/*******************************************************************************
* Class EditorCommand
******************************************************************************/
/**
* @brief Command for editors, e.g. to be added to a QMenu
*/
class EditorCommand final : public QObject {
Q_OBJECT
public:
// Types
enum class Flag {
OpensPopup = (1 << 0),
AboutRole = (1 << 4),
AboutQtRole = (1 << 5),
PreferencesRole = (1 << 6),
QuitRole = (1 << 7),
};
Q_DECLARE_FLAGS(Flags, Flag)
enum class ActionFlag {
NoShortcuts = (1 << 0), ///< Create an action without shortcuts.
WidgetShortcut = (1 << 1), ///< Restrict the shortcut to its widget.
ApplicationShortcut = (1 << 2), ///< Make the shortcut application global.
QueuedConnection = (1 << 3), ///< Create a queued signal/slot connection.
ReactOnToggle = (1 << 4), ///< React on toggled() instead of triggered().
};
Q_DECLARE_FLAGS(ActionFlags, ActionFlag)
// Constructors / Destructor
EditorCommand() = delete;
EditorCommand(const EditorCommand& other) = delete;
EditorCommand(const QString& identifier, const char* text,
const char* description, const char* iconFp, Flags flags,
const QList<QKeySequence>& defaultKeySequences,
QObject* parent = nullptr) noexcept;
~EditorCommand() noexcept override;
// Getters
const QString& getIdentifier() const noexcept { return mIdentifier; }
const QString& getText() const noexcept { return mText; }
QString getDisplayText() const noexcept { return unescapeAmpersand(mText); }
QString getDisplayTextNoTr() const noexcept {
return unescapeAmpersand(mTextNoTr);
}
const QString& getDescription() const noexcept { return mDescription; }
const QIcon& getIcon() const noexcept { return mIcon; }
const Flags& getFlags() const noexcept { return mFlags; }
const QList<QKeySequence> getDefaultKeySequences() const noexcept {
return mDefaultKeySequences;
}
const QList<QKeySequence>& getKeySequences() const noexcept {
return mKeySequences;
}
// Setters
void setKeySequences(const QList<QKeySequence>& sequences) noexcept;
// General Methods
void updateIcon() noexcept;
void updateTranslations() noexcept;
QAction* createAction(QObject* parent,
ActionFlags flags = ActionFlags()) const noexcept;
template <typename TContext, typename TSlot>
QAction* createAction(QObject* parent, const TContext* context, TSlot slot,
ActionFlags flags = ActionFlags()) const noexcept {
QAction* action = createAction(parent, flags);
Qt::ConnectionType conType = flags.testFlag(ActionFlag::QueuedConnection)
? Qt::QueuedConnection
: Qt::AutoConnection;
if (flags.testFlag(ActionFlag::ReactOnToggle)) {
QObject::connect(action, &QAction::toggled, context, slot, conType);
} else {
QObject::connect(action, &QAction::triggered, context, slot, conType);
}
return action;
}
// Operator Overloadings
EditorCommand& operator=(const EditorCommand& rhs) = delete;
signals:
void shortcutsChanged(const QList<QKeySequence>& sequences);
private: // Methods
QAction* setupAction(QAction* action, ActionFlags flags) const noexcept;
bool eventFilter(QObject* obj, QEvent* event) noexcept override;
static QString unescapeAmpersand(QString text) noexcept;
private: // Data
QString mIdentifier;
const char* mTextNoTr;
QString mText;
const char* mDescriptionNoTr;
QString mDescription;
const char* mIconFp;
QIcon mIcon;
Flags mFlags;
QList<QKeySequence> mDefaultKeySequences;
QList<QKeySequence> mKeySequences;
};
} // namespace editor
} // namespace librepcb
Q_DECLARE_OPERATORS_FOR_FLAGS(librepcb::editor::EditorCommand::Flags)
Q_DECLARE_OPERATORS_FOR_FLAGS(librepcb::editor::EditorCommand::ActionFlags)
/*******************************************************************************
* End of File
******************************************************************************/
#endif