HAL
gui_plugin_manager.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Ruhr University Bochum, Chair for Embedded Security. All Rights reserved.
4 // Copyright (c) 2019 Marc Fyrbiak, Sebastian Wallat, Max Hoffmann ("ORIGINAL AUTHORS"). All rights reserved.
5 // Copyright (c) 2021 Max Planck Institute for Security and Privacy. All Rights reserved.
6 // Copyright (c) 2021 Jörn Langheinrich, Julian Speith, Nils Albartus, René Walendy, Simon Klix ("ORIGINAL AUTHORS"). All Rights reserved.
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in all
16 // copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 // SOFTWARE.
25 
26 #pragma once
27 #include <QObject>
28 #include <QMap>
29 #include <QLabel>
30 #include <QIcon>
31 #include <QStringList>
32 #include <QDateTime>
33 #include <QFileInfo>
34 #include <QVariant>
35 #include <QAbstractTableModel>
36 #include <QTableView>
37 #include <QItemDelegate>
38 #include <QMenu>
39 
40 #include "gui/gui_utils/netlist.h"
44 
45 class QSettings;
46 class QPushButton;
47 
48 namespace hal {
49  class GuiExtensionInterface;
50 
52  {
53  public:
54  friend class GuiPluginTable;
68  bool mFileFound;
69 
70  public:
71  GuiPluginEntry(const QFileInfo& info);
72  GuiPluginEntry(const QSettings* settings);
73  QVariant data(int icol) const;
74  QString name() const { return mName; }
75  void persist(QSettings* settings) const;
76  bool requestLoad() const { return mLoadState == UserLoad; }
77  bool isLoaded() const { return mLoadState == AutoLoad || mLoadState == UserLoad; }
78  bool isPlugin() const { return mLoadState != NotAPlugin; }
79  void updateFromLoaded(const BasePluginInterface* bpif, bool isUser, const QDateTime& modified = QDateTime());
80  bool isFileFound() const { return mFileFound; }
81  void setFileFound(bool fnd) { mFileFound = fnd; }
83  };
84 
85  class GuiPluginManager;
86 
88  {
89  Q_OBJECT
90  friend class GuiPluginManager;
91  QIcon mIconLoad;
92  QIcon mIconUnload;
93  QIcon mIconEnableGuiContribution;
94  QIcon mIconDisableGuiContribution;
95  QIcon mIconCliOptions;
96  QPoint mMousePos;
97  QModelIndex mMouseIndex;
98  QPushButton* mTemplateButton[3];
99  enum State {Normal, Hover, Pressed};
100  Q_SIGNALS:
102  public:
103  GuiPluginDelegate(QObject* parent = nullptr);
105  void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
106  bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) override;
107  QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
108  void updateQss(GuiPluginManager* gpm);
109  };
110 
111  class SupportedFileFormats : public QMap<QString,QString>
112  {
114  public:
116  QString toFileDialog(bool addHalFormat) const;
117  };
118 
120  {
121  Q_OBJECT
122  QList<GuiPluginEntry*> mEntries;
123  QList<GuiPluginEntry*> mAvoid;
124  QMap<QString,int> mLookup;
125  QSettings* mSettings;
126  bool mWaitForRefresh;
127  GuiPluginManager* mPluginMgr;
128 
129  void changeState(const QString& pluginName, GuiPluginEntry::LoadState state);
130  void populateTable(bool refresh);
131  void clearMemory();
132  Q_SIGNALS:
134  void showCliOptions(QString pluginName, QString cliOptions);
135  public Q_SLOTS:
136  void handleButtonPressed(const QModelIndex& buttonIndex);
137  void handlePluginLoaded(const QString& pluginName, const QString& path);
138  void handlePluginUnloaded(const QString& pluginName, const QString& path);
139  void handleRefresh();
140  public:
142  ~GuiPluginTable();
143 
144  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
145  int columnCount(const QModelIndex &parent = QModelIndex()) const override;
146  QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
147  QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
148  BasePluginInterface* load(const QString& pluginName, const QString& path) const;
149  QStringList neededBy(const QString& pluginName);
150  void persist();
151  bool isLoaded(const QModelIndex& index) const;
153  void setGuiExtensionState(const QString& pluginName, GuiPluginEntry::GuiExtensionState state);
154  bool hasCliExtension(const QModelIndex& index) const;
155  bool isHalGui(const QModelIndex& index) const;
156  void loadFeature(FacExtensionInterface::Feature ft, const QString& extension=QString());
158  GuiPluginEntry* at(int irow) const;
159  int addExternalPlugin(const QString& path);
160  void removeEntry(int irow);
161  };
162 
163  class GuiPluginView : public QTableView
164  {
165  Q_OBJECT
166  public:
168  };
169 
170  class GuiPluginManager : public QWidget
171  {
172  Q_OBJECT
186 
187  GuiPluginView* mGuiPluginView;
188  GuiPluginTable* mGuiPluginTable;
189  GuiPluginDelegate* mGuiPluginDelegate;
190  QString mLoadIconPath;
191  QString mLoadIconStyle;
192  QString mUnloadIconPath;
193  QString mUnloadIconStyle;
194  QString mCliIconPath;
195  QString mCliIconStyle;
196  QString mGuiIconEnabledPath;
197  QString mGuiIconDisabledPath;
198  QString mGuiIconEnabledStyle;
199  QString mGuiIconDisabledStyle;
200  QColor mDefaultTextColor;
201  QColor mHilightTextColor;
202  QColor mHilightBackgroundColor;
203  QLabel* mIconLegend[4];
204  Q_SIGNALS:
206  private Q_SLOTS:
207  void handleToggleGuiContribution(const QString& pluginName);
208  void handleShowCliOptions(const QString& pluginName, const QString& cliOptions);
209  public Q_SLOTS:
210  void handleButtonCancel();
212  public:
213  GuiPluginManager(QWidget* parent = nullptr);
225  static void addPluginSubmenus(QMenu* contextMenu, Netlist* netlist,
226  const std::vector<u32>& modules,
227  const std::vector<u32>& gates,
228  const std::vector<u32>& nets);
229  void repolish();
230 
231  QString loadIconPath() const;
232  QString loadIconStyle() const;
233  QString unloadIconPath() const;
234  QString unloadIconStyle() const;
235  QString cliIconPath() const;
236  QString cliIconStyle() const;
237  QString guiIconEnabledPath() const;
241  QColor defaultTextColor() const;
242  QColor hilightTextColor() const;
244 
245  void setLoadIconPath(const QString& s);
246  void setLoadIconStyle(const QString& s);
247  void setUnloadIconPath(const QString& s);
248  void setUnloadIconStyle(const QString& s);
249  void setCliIconPath(const QString& s);
250  void setCliIconStyle(const QString& s);
251  void setGuiIconEnabledPath(const QString& s);
252  void setGuiIconDisabledPath(const QString& s);
253  void setGuiIconEnabledStyle(const QString& s);
254  void setGuiIconDisabledStyle(const QString& s);
255  void setDefaultTextColor(QColor& c);
256  void setHilightTextColor(QColor& c);
258 
259  void addPluginActions(QMenu* menu) const;
260  };
261 }
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
GuiPluginDelegate(QObject *parent=nullptr)
void buttonPressed(QModelIndex index)
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
void updateQss(GuiPluginManager *gpm)
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
GuiPluginEntry(const QFileInfo &info)
LoadState
@ AutoLoad
@ NotAPlugin
@ UserLoad
@ NotLoaded
void persist(QSettings *settings) const
QStringList mFeatureArguments
QDateTime mFileModified
bool isFileFound() const
QString mCliOptions
QString name() const
QStringList mDependencies
QString mExternalPath
bool isLoaded() const
QString mName
void setFileFound(bool fnd)
bool mFileFound
bool isPlugin() const
FacExtensionInterface::Feature mFeature
QString mDescription
QVariant data(int icol) const
GuiExtensionState enforceGuiExtensionState(GuiExtensionInterface *geif) const
enum hal::GuiPluginEntry::LoadState mLoadState
enum hal::GuiPluginEntry::GuiExtensionState mGuiExtensionState
QString mVersion
void updateFromLoaded(const BasePluginInterface *bpif, bool isUser, const QDateTime &modified=QDateTime())
QString mFilePath
GuiExtensionState
@ Enabled
@ Disabled
@ NotAnExtension
@ Unknown
bool mUserInterface
bool requestLoad() const
void setLoadIconStyle(const QString &s)
void setGuiIconEnabledPath(const QString &s)
void addPluginActions(QMenu *menu) const
void setDefaultTextColor(QColor &c)
GuiPluginManager(QWidget *parent=nullptr)
void setHilightTextColor(QColor &c)
void setUnloadIconPath(const QString &s)
void setHilightBackgroundColor(QColor &c)
static void addPluginSubmenus(QMenu *contextMenu, Netlist *netlist, const std::vector< u32 > &modules, const std::vector< u32 > &gates, const std::vector< u32 > &nets)
void setGuiIconDisabledPath(const QString &s)
static QMap< QString, GuiExtensionInterface * > getGuiExtensions()
void setCliIconPath(const QString &s)
void setLoadIconPath(const QString &s)
void setGuiIconEnabledStyle(const QString &s)
void setCliIconStyle(const QString &s)
void setGuiIconDisabledStyle(const QString &s)
void setUnloadIconStyle(const QString &s)
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
SupportedFileFormats listFacFeature(FacExtensionInterface::Feature ft) const
bool isHalGui(const QModelIndex &index) const
bool isLoaded(const QModelIndex &index) const
BasePluginInterface * load(const QString &pluginName, const QString &path) const
int rowCount(const QModelIndex &parent=QModelIndex()) const override
int columnCount(const QModelIndex &parent=QModelIndex()) const override
GuiPluginEntry::GuiExtensionState guiExtensionState(const QModelIndex &index) const
GuiPluginTable(GuiPluginManager *parent=nullptr)
int addExternalPlugin(const QString &path)
void setGuiExtensionState(const QString &pluginName, GuiPluginEntry::GuiExtensionState state)
GuiPluginEntry * at(int irow) const
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
void handleButtonPressed(const QModelIndex &buttonIndex)
void handlePluginLoaded(const QString &pluginName, const QString &path)
void handlePluginUnloaded(const QString &pluginName, const QString &path)
void showCliOptions(QString pluginName, QString cliOptions)
void toggleEnableGuiContribution(QString pluginName)
void loadFeature(FacExtensionInterface::Feature ft, const QString &extension=QString())
bool hasCliExtension(const QModelIndex &index) const
QStringList neededBy(const QString &pluginName)
void removeEntry(int irow)
GuiPluginView(QWidget *parent=nullptr)
SupportedFileFormats(FacExtensionInterface::Feature ft)
QString toFileDialog(bool addHalFormat) const
option(PL_GUI "PL_GUI" ON) if(PL_GUI OR BUILD_ALL_PLUGINS) cmake_minimum_required(VERSION 3.1.0) if(APPLE AND CMAKE_HOST_APPLE AND NOT Qt5_DIR) set(Qt5_DIR "/usr/local/opt/qt@5/lib/cmake") endif(APPLE AND CMAKE_HOST_APPLE AND NOT Qt5_DIR) find_package(Qt5 COMPONENTS Core REQUIRED) find_package(Qt5 COMPONENTS Widgets REQUIRED) if(Qt5Widgets_FOUND) message(VERBOSE "Qt5Widgets_INCLUDE_DIRS
Definition: CMakeLists.txt:1
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const override
Q_OBJECTQ_OBJECT
Q_PROPERTY(...)
Q_SIGNALSQ_SIGNALS
Q_SLOTSQ_SLOTS
virtual bool event(QEvent *e)
QObject * parent() const const
DisplayRole
Orientation