HAL  v4.5.0-124-g47ab54673
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
python_editor.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 
28 #include "gui/action/action.h"
33 
36 
37 #include <QEvent>
38 #include <QFileSystemWatcher>
39 #include <QMap>
40 #include <QMessageBox>
41 #include <QPushButton>
42 #include <QtCore/QFileInfo>
43 #include <filesystem>
44 
45 class QVBoxLayout;
46 class QTabWidget;
47 
48 namespace hal
49 {
50  class CodeEditor;
51  class Searchbar;
52  class Splitter;
53  class Toolbar;
54 
55  class PythonCodeEditor;
56 
57  class SettingsItemCheckbox;
58  class SettingsItemKeybind;
59  class SettingsItemSpinbox;
60 
65  {
69  struct PythonEditorControlEntry {
70  int tabInx;
71  bool active;
72  std::string restore;
73  std::string filename;
74  };
75 
76  QString mSaveDir;
77 
78  void restoreTabs(const std::filesystem::path& loaddir, const std::string& jsonfile);
79 
80  static bool write_control_file(const std::filesystem::path& savedir, const std::vector<PythonEditorControlEntry>& tabinfo);
81  public:
83 
84  std::string serialize(Netlist* netlist, const std::filesystem::path& savedir, bool isAutosave);
85 
86  void deserialize(Netlist* netlist, const std::filesystem::path& loaddir);
87 
89 
90  std::string serialize_control(const std::filesystem::path& savedir = std::filesystem::path(), bool isAutosave = false);
91 
93  static std::string sControlFileName;
94 
95  };
96 
105  {
106  Q_OBJECT
123 
124  public:
125  explicit PythonEditor(QWidget* parent = nullptr);
126  ~PythonEditor();
127 
132 
138  virtual void setupToolbar(Toolbar* Toolbar) override;
139 
145  virtual QList<QShortcut*> createShortcuts() override;
146 
152  virtual void handleStdout(const QString& output) override;
153 
159  virtual void handleError(const QString& output) override;
160 
164  virtual void clear() override;
165 
170  void handleActionOpenFile();
171 
176  void handleActionSaveFile();
177 
181  void handleActionSaveFileAs();
182 
186  void handleActionRun();
187 
191  void handleActionNewTab();
192 
197  void handleActionTabMenu();
198 
202  void handleActionCloseTab();
203 
209 
215 
221 
227 
231  void handleActionShowFile();
232 
239  void tabLoadFile(u32 index, QString fileName);
240 
241  //added so that the speciallogcontentmanager has access to all the code editors
248 
258  bool saveFile(bool isAutosave, QueryFilenamePolicy queryPolicy, int index = -1);
259 
265  void saveAllTabs(const QString& genericPath, bool isAutosave);
266 
270  void saveControl();
271 
277  QString unnamedFilename(int index) const;
278 
285 
291  void discardTab(int index);
292 
306  bool confirmDiscardForRange(int start, int end, int exclude = -1);
307 
313  void setToolbarButtonsEnabled(bool enable);
314 
315  // =====================================================================
316  // Q_PROPERTY functions
317  // =====================================================================
318 
322 
328  QString disabledIconStyle() const;
329 
335  QString openIconPath() const;
336 
342  QString openIconStyle() const;
343 
349  QString saveIconPath() const;
350 
356  QString saveIconStyle() const;
357 
363  QString saveAsIconPath() const;
364 
370  QString saveAsIconStyle() const;
371 
377  QString runIconPath() const;
378 
384  QString runIconStyle() const;
385 
391  QString newFileIconPath() const;
392 
398  QString newFileIconStyle() const;
399 
406 
413 
419  QString searchIconPath() const;
420 
426  QString searchIconStyle() const;
427 
434 
440  void setDisabledIconStyle(const QString& style);
441 
447  void setOpenIconPath(const QString& path);
448 
454  void setOpenIconStyle(const QString& style);
455 
461  void setSaveIconPath(const QString& path);
462 
468  void setSaveIconStyle(const QString& style);
469 
475  void setSaveAsIconPath(const QString& path);
476 
482  void setSaveAsIconStyle(const QString& style);
483 
489  void setRunIconPath(const QString& path);
490 
496  void setRunIconStyle(const QString& style);
497 
503  void setNewFileIconPath(const QString& path);
504 
510  void setNewFileIconStyle(const QString& style);
511 
517  void setToggleMinimapIconPath(const QString& path);
518 
525 
531  void setSearchIconPath(const QString& path);
532 
538  void setSearchIconStyle(const QString& style);
539 
546 
556  bool handleDeserializationFromHalFile(const std::filesystem::path& path, Netlist* netlist, rapidjson::Document& document);
557 
559 
560  Q_SIGNALS:
561  void forwardStdout(const QString& output);
562  void forwardError(const QString& output);
563 
564  public Q_SLOTS:
568  void toggleSearchbar();
569 
570  void handleThreadFinished();
571 
577  void handleTabCloseRequested(int index);
578 
583 
587  void handleKeyPressed();
588 
592  void handleTextChanged();
593 
597  void handleSearchbarTextEdited(const QString& text, SearchOptions opts);
598 
604  void handleCurrentTabChanged(int index);
605 
611  PythonCodeEditor* getPythonEditor(int tabIndex);
612 
621  void handleTabFileChanged(QString path);
622 
632 
638 
645  void handleFileOpened(QString fileName);
646 
652  void handleFileAboutToClose(const QString& fileName);
653 
657  void updateSearchIcon();
658 
659  protected:
668  bool eventFilter(QObject* obj, QEvent* event) override;
669 
670  private:
678  QMessageBox::StandardButton askSaveTab(const int tab_index) const;
679 
680  // ============ FUNCTIONS FOR SNAPSHOT HANDLING ============
681 
688  QPair<QString, QString> readSnapshotFile(QFileInfo snapshot_file_path) const;
689 
698  QPair<QMap<QString, QString>, QVector<QString>> loadAllSnapshots();
699 
708  bool writeSnapshotFile(QFileInfo snapshot_file_path, QString original_file_path, QString content) const;
709 
717  QString getSnapshotDirectory(const bool create_if_non_existent = true);
718 
724  void updateSnapshots();
725 
732  void clearAllSnapshots(bool remove_dir = false);
733 
742  bool decideLoadSnapshot(const QMap<QString, QString>& saved_snapshots, const QFileInfo original_path) const;
743 
750  void setSnapshotContent(const int idx, const QString snapshot_content);
751 
760  bool askLoadSnapshot(const QString original_path, const QString original_content, const QString snapshot_content) const;
761 
769  bool askDeleteSnapshots(const QPair<QMap<QString, QString>, QVector<QString>>& snapshots) const;
770 
776  void removeSnapshotFile(PythonCodeEditor* editor) const;
777 
785  QString getDefaultPath() const;
786 
787  QVBoxLayout* mLayout;
788  Toolbar* mToolbar;
789  Splitter* mSplitter;
790 
791  Searchbar* mSearchbar;
792 
793  Action* mActionOpenFile;
794  Action* mActionRun;
795  Action* mActionSave;
796  Action* mActionSaveAs;
797  Action* mActionToggleMinimap;
798  Action* mActionNewFile;
799 
800  QString mDisabledIconStyle;
801 
802  QString mOpenIconStyle;
803  QString mOpenIconPath;
804 
805  QString mSaveIconStyle;
806  QString mSaveIconPath;
807 
808  QString mSaveAsIconStyle;
809  QString mSaveAsIconPath;
810 
811  QString mRunIconStyle;
812  QString mRunIconPath;
813 
814  QString mNewFileIconStyle;
815  QString mNewFileIconPath;
816 
817  QString mToggleMinimapIconStyle;
818  QString mToggleMinimapIconPath;
819 
820  QString mSearchIconPath;
821  QString mSearchIconStyle;
822  QString mSearchActiveIconStyle;
823 
824  QTabWidget* mTabWidget;
825  int mTabRightclicked = -1;
826 
827  QFileSystemWatcher* mFileWatcher;
828  QMap<QString, PythonCodeEditor*> mPathEditorMap;
829 
830  FileModifiedBar* mFileModifiedBar;
831 
832  int mNewFileCounter;
833 
834  long mLastClickTime;
835 
836  PythonSerializer mSerializer;
837  QString mDefaultPath;
838  QString mGenericPath;
839 
844  QMap<PythonCodeEditor*, QString> mTabToSnapshotPath;
845 
846  SettingsItemSpinbox* mSettingFontSize;
847 
848  SettingsItemCheckbox* mSettingLineNumbers;
849  SettingsItemCheckbox* mSettingHighlight;
850  SettingsItemCheckbox* mSettingLineWrap;
851  SettingsItemCheckbox* mSettingMinimap;
852 
853  SettingsItemKeybind* mSettingOpenFile;
854  SettingsItemKeybind* mSettingSaveFile;
855  SettingsItemKeybind* mSettingSaveFileAs;
856  SettingsItemKeybind* mSettingRunFile;
857  SettingsItemKeybind* mSettingCreateFile;
858 
859  QList<u32> mBlockedContextIds;
860  };
861 } // namespace hal
Provides an interface for triggerable functionality that can be inserted into widgets and also connec...
Definition: action.h:42
Abstract class for Widgets within HAL's ContentArea.
A dialog in form of a bar to let the user decide how to handle file changes outside of HAL.
Code editor to write python code.
Interface for handling python outputs.
Main widget that combines all neccessary functionality to develop in python (for hal).
virtual void clear() override
void handleBaseFileModifiedIgnore()
void setToggleMinimapIconStyle(const QString &style)
void handleCurrentTabChanged(int index)
void tabLoadFile(u32 index, QString fileName)
bool handleDeserializationFromHalFile(const std::filesystem::path &path, Netlist *netlist, rapidjson::Document &document)
QString toggleMinimapIconPath() const
void handleSearchbarTextEdited(const QString &text, SearchOptions opts)
QTextDocument::FindFlags getFindFlags()
void setSearchActiveIconStyle(const QString &style)
void handleActionCloseOtherTabs()
void handleTabCloseRequested(int index)
void handleTabFileChanged(QString path)
void setRunIconStyle(const QString &style)
void setRunIconPath(const QString &path)
bool confirmDiscardForRange(int start, int end, int exclude=-1)
void discardTab(int index)
virtual QList< QShortcut * > createShortcuts() override
QString disabledIconStyle() const
QString openIconStyle() const
void setSaveAsIconPath(const QString &path)
void forwardError(const QString &output)
void forwardStdout(const QString &output)
PythonCodeEditor * getPythonEditor(int tabIndex)
void setDisabledIconStyle(const QString &style)
QString runIconPath() const
void setSaveIconStyle(const QString &style)
QString newFileIconPath() const
QString toggleMinimapIconStyle() const
void setSaveAsIconStyle(const QString &style)
QTabWidget * getTabWidget()
QString searchIconPath() const
void handleFileOpened(QString fileName)
void handleActionCloseRightTabs()
PythonEditor(QWidget *parent=nullptr)
QString saveAsIconStyle() const
void handleBaseFileModifiedReload()
QString openIconPath() const
virtual void setupToolbar(Toolbar *Toolbar) override
void setSearchIconPath(const QString &path)
void handleFileAboutToClose(const QString &fileName)
void setSaveIconPath(const QString &path)
QString searchIconStyle() const
QString searchActiveIconStyle() const
QString newFileIconStyle() const
QString saveIconPath() const
void setToggleMinimapIconPath(const QString &path)
virtual void handleError(const QString &output) override
bool eventFilter(QObject *obj, QEvent *event) override
void handleActionCloseAllTabs()
QString saveAsIconPath() const
void setSearchIconStyle(const QString &style)
void setNewFileIconStyle(const QString &style)
virtual void handleStdout(const QString &output) override
bool saveFile(bool isAutosave, QueryFilenamePolicy queryPolicy, int index=-1)
void setOpenIconStyle(const QString &style)
void setToolbarButtonsEnabled(bool enable)
QString saveIconStyle() const
void saveAllTabs(const QString &genericPath, bool isAutosave)
void handleActionCloseLeftTabs()
QString autosaveFilename(int index)
QString unnamedFilename(int index) const
QString runIconStyle() const
void setOpenIconPath(const QString &path)
void handleActionToggleMinimap()
void setNewFileIconPath(const QString &path)
std::string serialize(Netlist *netlist, const std::filesystem::path &savedir, bool isAutosave)
static std::string sControlFileName
Definition: python_editor.h:93
QString getDirectory() const
void deserialize(Netlist *netlist, const std::filesystem::path &loaddir)
std::string serialize_control(const std::filesystem::path &savedir=std::filesystem::path(), bool isAutosave=false)
static QString sPythonRelDir
Definition: python_editor.h:92
A QFrame with a QLineEdit that can be used to input a substring to search for.
Definition: searchbar.h:48
A SettingsItem representing a Checkbox.
A SettingsItem to modify keybinds.
A SettingsItem that represents a spinbox.
A QSplitter that can be checked if it is unused or not.
Definition: splitter.h:39
Toolbar for all ContentFrames and ContentWidgets.
Definition: toolbar.h:39
uint32_t u32
Definition: defines.h:41
Definition: defines.h:45
Q_OBJECTQ_OBJECT
Q_PROPERTY(...)
Q_SIGNALSQ_SIGNALS
Q_SLOTSQ_SLOTS
QObject * parent() const const
typedef FindFlags
virtual bool event(QEvent *event) override
QStyle * style() const const