LibrePCB Developers Documentation
editorcommand.h
Go to the documentation of this file.
1 /*
2  * LibrePCB - Professional EDA for everyone!
3  * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4  * https://librepcb.org/
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef LIBREPCB_EDITOR_EDITORCOMMAND_H
21 #define LIBREPCB_EDITOR_EDITORCOMMAND_H
22 
23 /*******************************************************************************
24  * Includes
25  ******************************************************************************/
26 #include <QtCore>
27 #include <QtWidgets>
28 
29 /*******************************************************************************
30  * Namespace / Forward Declarations
31  ******************************************************************************/
32 namespace librepcb {
33 namespace editor {
34 
35 /*******************************************************************************
36  * Class EditorCommand
37  ******************************************************************************/
38 
42 class EditorCommand final : public QObject {
43  Q_OBJECT
44 
45 public:
46  // Types
47  enum class Flag {
48  OpensPopup = (1 << 0),
49  AboutRole = (1 << 4),
50  AboutQtRole = (1 << 5),
51  PreferencesRole = (1 << 6),
52  QuitRole = (1 << 7),
53  };
54  Q_DECLARE_FLAGS(Flags, Flag)
55 
56  enum class ActionFlag {
57  NoShortcuts = (1 << 0),
58  WidgetShortcut = (1 << 1),
59  ApplicationShortcut = (1 << 2),
60  QueuedConnection = (1 << 3),
61  ReactOnToggle = (1 << 4),
62  };
63  Q_DECLARE_FLAGS(ActionFlags, ActionFlag)
64 
65  // Constructors / Destructor
66  EditorCommand() = delete;
67  EditorCommand(const EditorCommand& other) = delete;
68  EditorCommand(const QString& identifier, const char* text,
69  const char* description, const QString& iconFp, Flags flags,
70  const QList<QKeySequence>& defaultKeySequences,
71  QObject* parent = nullptr) noexcept;
72  ~EditorCommand() noexcept;
73 
74  // Getters
75  const QString& getIdentifier() const noexcept { return mIdentifier; }
76  const QString& getText() const noexcept { return mText; }
77  QString getDisplayText() const noexcept { return unescapeAmpersand(mText); }
78  QString getDisplayTextNoTr() const noexcept {
80  }
81  const QString& getDescription() const noexcept { return mDescription; }
82  const QIcon& getIcon() const noexcept { return mIcon; }
83  const Flags& getFlags() const noexcept { return mFlags; }
84  const QList<QKeySequence> getDefaultKeySequences() const noexcept {
85  return mDefaultKeySequences;
86  }
87  const QList<QKeySequence>& getKeySequences() const noexcept {
88  return mKeySequences;
89  }
90 
91  // Setters
92  void setKeySequences(const QList<QKeySequence>& sequences) noexcept;
93 
94  // General Methods
95  void updateTranslations() noexcept;
96  QAction* createAction(QObject* parent,
97  ActionFlags flags = ActionFlags()) const noexcept;
98  template <typename TContext, typename TSlot>
99  QAction* createAction(QObject* parent, const TContext* context, TSlot slot,
100  ActionFlags flags = ActionFlags()) const noexcept {
101  QAction* action = createAction(parent, flags);
102  Qt::ConnectionType conType = flags.testFlag(ActionFlag::QueuedConnection)
103  ? Qt::QueuedConnection
104  : Qt::AutoConnection;
105  if (flags.testFlag(ActionFlag::ReactOnToggle)) {
106  QObject::connect(action, &QAction::toggled, context, slot, conType);
107  } else {
108  QObject::connect(action, &QAction::triggered, context, slot, conType);
109  }
110  return action;
111  }
112 
113  // Operator Overloadings
114  EditorCommand& operator=(const EditorCommand& rhs) = delete;
115 
116 signals:
117  void shortcutsChanged(const QList<QKeySequence>& sequences);
118 
119 private: // Methods
120  QAction* setupAction(QAction* action, ActionFlags flags) const noexcept;
121  bool eventFilter(QObject* obj, QEvent* event) noexcept override;
122  static QString unescapeAmpersand(QString text) noexcept;
123 
124 private: // Data
125  QString mIdentifier;
126  const char* mTextNoTr;
127  QString mText;
128  const char* mDescriptionNoTr;
129  QString mDescription;
130  QIcon mIcon;
131  Flags mFlags;
132  QList<QKeySequence> mDefaultKeySequences;
133  QList<QKeySequence> mKeySequences;
134 };
135 
136 } // namespace editor
137 } // namespace librepcb
138 
139 Q_DECLARE_OPERATORS_FOR_FLAGS(librepcb::editor::EditorCommand::Flags)
140 Q_DECLARE_OPERATORS_FOR_FLAGS(librepcb::editor::EditorCommand::ActionFlags)
141 
142 /*******************************************************************************
143  * End of File
144  ******************************************************************************/
145 
146 #endif
void updateTranslations() noexcept
Definition: editorcommand.cpp:102
React on toggled() instead of triggered().
QString getDisplayTextNoTr() const noexcept
Definition: editorcommand.h:78
const QList< QKeySequence > getDefaultKeySequences() const noexcept
Definition: editorcommand.h:84
QList< QKeySequence > mDefaultKeySequences
Definition: editorcommand.h:132
QString getDisplayText() const noexcept
Definition: editorcommand.h:77
ActionFlag
Definition: editorcommand.h:56
Definition: occmodel.cpp:77
QString mText
Definition: editorcommand.h:127
QString mIdentifier
Definition: editorcommand.h:125
void setKeySequences(const QList< QKeySequence > &sequences) noexcept
Definition: editorcommand.cpp:90
QAction * createAction(QObject *parent, const TContext *context, TSlot slot, ActionFlags flags=ActionFlags()) const noexcept
Definition: editorcommand.h:99
QAction * createAction(QObject *parent, ActionFlags flags=ActionFlags()) const noexcept
Definition: editorcommand.cpp:109
const QString & getIdentifier() const noexcept
Definition: editorcommand.h:75
const char * mTextNoTr
Definition: editorcommand.h:126
bool eventFilter(QObject *obj, QEvent *event) noexcept override
Definition: editorcommand.cpp:160
QString mDescription
Definition: editorcommand.h:129
const QIcon & getIcon() const noexcept
Definition: editorcommand.h:82
Command for editors, e.g. to be added to a QMenu.
Definition: editorcommand.h:42
~EditorCommand() noexcept
Definition: editorcommand.cpp:83
QList< QKeySequence > mKeySequences
Definition: editorcommand.h:133
QIcon mIcon
Definition: editorcommand.h:130
static QString unescapeAmpersand(QString text) noexcept
Definition: editorcommand.cpp:210
const Flags & getFlags() const noexcept
Definition: editorcommand.h:83
const QString & getDescription() const noexcept
Definition: editorcommand.h:81
QAction * setupAction(QAction *action, ActionFlags flags) const noexcept
Definition: editorcommand.cpp:118
const char * mDescriptionNoTr
Definition: editorcommand.h:128
EditorCommand & operator=(const EditorCommand &rhs)=delete
Flags mFlags
Definition: editorcommand.h:131
const QList< QKeySequence > & getKeySequences() const noexcept
Definition: editorcommand.h:87
void shortcutsChanged(const QList< QKeySequence > &sequences)
const QString & getText() const noexcept
Definition: editorcommand.h:76
Flag
Definition: editorcommand.h:47