HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
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 
55  {
56  public:
57  friend class GuiPluginTable;
71  bool mFileFound;
72 
73  public:
74  GuiPluginEntry(const QFileInfo& info);
75  GuiPluginEntry(const QSettings* settings);
76  QVariant data(int icol) const;
77  QString name() const { return mName; }
78  void persist(QSettings* settings) const;
79  bool requestLoad() const { return mLoadState == UserLoad; }
80  bool isLoaded() const { return mLoadState == AutoLoad || mLoadState == UserLoad; }
81  bool isPlugin() const { return mLoadState != NotAPlugin; }
82  void updateFromLoaded(const BasePluginInterface* bpif, bool isUser, const QDateTime& modified = QDateTime());
83  bool isFileFound() const { return mFileFound; }
84  void setFileFound(bool fnd) { mFileFound = fnd; }
86  };
87 
91  class GuiPluginManager;
92 
97  {
98  Q_OBJECT
99  friend class GuiPluginManager;
100  QIcon mIconLoad;
101  QIcon mIconUnload;
102  QIcon mIconEnableGuiContribution;
103  QIcon mIconDisableGuiContribution;
104  QIcon mIconCliOptions;
105  QPoint mMousePos;
106  QModelIndex mMouseIndex;
107  QPushButton* mTemplateButton[3];
108  enum State {Normal, Hover, Pressed};
109  Q_SIGNALS:
111  public:
112  GuiPluginDelegate(QObject* parent = nullptr);
114  void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
115  bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) override;
116  QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
117  void updateQss(GuiPluginManager* gpm);
118  };
119 
123  class SupportedFileFormats : public QMap<QString,QString>
124  {
126  public:
128  QString toFileDialog(bool addHalFormat) const;
129  };
130 
135  {
136  Q_OBJECT
137  QList<GuiPluginEntry*> mEntries;
138  QList<GuiPluginEntry*> mAvoid;
139  QMap<QString,int> mLookup;
140  QSettings* mSettings;
141  bool mWaitForRefresh;
142  GuiPluginManager* mPluginMgr;
143 
144  void changeState(const QString& pluginName, GuiPluginEntry::LoadState state);
145  void populateTable(bool refresh);
146  void clearMemory();
147  Q_SIGNALS:
149  void showCliOptions(QString pluginName, QString cliOptions);
150  public Q_SLOTS:
151  void handleButtonPressed(const QModelIndex& buttonIndex);
152  void handlePluginLoaded(const QString& pluginName, const QString& path);
153  void handlePluginUnloaded(const QString& pluginName, const QString& path);
154  void handleRefresh();
155  public:
157  ~GuiPluginTable();
158 
159  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
160  int columnCount(const QModelIndex &parent = QModelIndex()) const override;
161  QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
162  QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
163  BasePluginInterface* load(const QString& pluginName, const QString& path) const;
164  QStringList neededBy(const QString& pluginName);
165  void persist();
166  bool isLoaded(const QModelIndex& index) const;
168  void setGuiExtensionState(const QString& pluginName, GuiPluginEntry::GuiExtensionState state);
169  bool hasCliExtension(const QModelIndex& index) const;
170  bool isHalGui(const QModelIndex& index) const;
171  void loadFeature(FacExtensionInterface::Feature ft, const QString& extension=QString());
173  GuiPluginEntry* at(int irow) const;
174  int addExternalPlugin(const QString& path);
175  void removeEntry(int irow);
176  };
177 
181  class GuiPluginView : public QTableView
182  {
183  Q_OBJECT
184  public:
185  GuiPluginView(QWidget* parent = nullptr);
186  };
187 
191  class GuiPluginManager : public QWidget
192  {
193  Q_OBJECT
207 
208  GuiPluginView* mGuiPluginView;
209  GuiPluginTable* mGuiPluginTable;
210  GuiPluginDelegate* mGuiPluginDelegate;
211  QString mLoadIconPath;
212  QString mLoadIconStyle;
213  QString mUnloadIconPath;
214  QString mUnloadIconStyle;
215  QString mCliIconPath;
216  QString mCliIconStyle;
217  QString mGuiIconEnabledPath;
218  QString mGuiIconDisabledPath;
219  QString mGuiIconEnabledStyle;
220  QString mGuiIconDisabledStyle;
221  QColor mDefaultTextColor;
222  QColor mHilightTextColor;
223  QColor mHilightBackgroundColor;
224  QLabel* mIconLegend[4];
225  Q_SIGNALS:
227  private Q_SLOTS:
228  void handleToggleGuiContribution(const QString& pluginName);
229  void handleShowCliOptions(const QString& pluginName, const QString& cliOptions);
230  public Q_SLOTS:
231  void handleButtonCancel();
233  public:
234  GuiPluginManager(QWidget* parent = nullptr);
246  static void addPluginSubmenus(QMenu* contextMenu, Netlist* netlist,
247  const std::vector<u32>& modules,
248  const std::vector<u32>& gates,
249  const std::vector<u32>& nets);
250  void repolish();
251 
252  QString loadIconPath() const;
253  QString loadIconStyle() const;
254  QString unloadIconPath() const;
255  QString unloadIconStyle() const;
256  QString cliIconPath() const;
257  QString cliIconStyle() const;
258  QString guiIconEnabledPath() const;
262  QColor defaultTextColor() const;
263  QColor hilightTextColor() const;
265 
266  void setLoadIconPath(const QString& s);
267  void setLoadIconStyle(const QString& s);
268  void setUnloadIconPath(const QString& s);
269  void setUnloadIconStyle(const QString& s);
270  void setCliIconPath(const QString& s);
271  void setCliIconStyle(const QString& s);
272  void setGuiIconEnabledPath(const QString& s);
273  void setGuiIconDisabledPath(const QString& s);
274  void setGuiIconEnabledStyle(const QString& s);
275  void setGuiIconDisabledStyle(const QString& s);
276  void setDefaultTextColor(QColor& c);
277  void setHilightTextColor(QColor& c);
279 
280  void addPluginActions(QMenu* menu) const;
281  };
282 }
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)
QString guiIconEnabledPath() const
GuiPluginManager(QWidget *parent=nullptr)
void setHilightTextColor(QColor &c)
void setUnloadIconPath(const QString &s)
QString unloadIconStyle() const
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)
QColor hilightBackgroundColor() const
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)
QString guiIconEnabledStyle() const
QString guiIconDisabledPath() const
QString unloadIconPath() const
void setGuiIconDisabledStyle(const QString &s)
void setUnloadIconStyle(const QString &s)
QString guiIconDisabledStyle() const
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
Definition: defines.h:45
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