mirror of https://github.com/KLayout/klayout.git
321 lines
9.1 KiB
C++
321 lines
9.1 KiB
C++
|
|
/*
|
|
|
|
KLayout Layout Viewer
|
|
Copyright (C) 2006-2017 Matthias Koefferlein
|
|
|
|
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 2 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, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
#ifndef HDR_layMacroEditorDialog
|
|
#define HDR_layMacroEditorDialog
|
|
|
|
#include "layCommon.h"
|
|
|
|
#include "ui_MacroEditorDialog.h"
|
|
#include "layMacroEditorPage.h"
|
|
#include "tlDeferredExecution.h"
|
|
#include "tlTimer.h"
|
|
#include "tlFileSystemWatcher.h"
|
|
#include "tlDeferredExecution.h"
|
|
#include "layMacro.h"
|
|
#include "gsiInterpreter.h"
|
|
#include "tlScriptError.h"
|
|
|
|
#include <QDialog>
|
|
#include <QTextCharFormat>
|
|
#include <QPixmap>
|
|
|
|
#include <set>
|
|
#include <map>
|
|
|
|
class QDialog;
|
|
class QTreeWidgetItem;
|
|
|
|
namespace lay
|
|
{
|
|
|
|
class Macro;
|
|
class MacroCollection;
|
|
class MacroEditorTree;
|
|
class BrowserPanel;
|
|
|
|
class MacroEditorDialog
|
|
: public QDialog, public gsi::Console, private Ui::MacroEditorDialog, public gsi::ExecutionHandler
|
|
{
|
|
Q_OBJECT
|
|
|
|
struct EditTrace
|
|
{
|
|
EditTrace ()
|
|
: path (), line (0), pos (0)
|
|
{
|
|
// .. nothing yet ..
|
|
}
|
|
|
|
std::string path;
|
|
int line, pos;
|
|
};
|
|
|
|
public:
|
|
/**
|
|
* @brief Constructor
|
|
*/
|
|
MacroEditorDialog (QWidget *parent, lay::MacroCollection *root);
|
|
|
|
/**
|
|
* @brief Destructor
|
|
*/
|
|
~MacroEditorDialog ();
|
|
|
|
/**
|
|
* @brief Gets the singleton instance of the macro editor
|
|
*/
|
|
static MacroEditorDialog *instance ();
|
|
|
|
/**
|
|
* @brief Reimplementation of gsi::Console:
|
|
*/
|
|
void write_str (const char *text, output_stream os);
|
|
|
|
/**
|
|
* @brief Reimplementation of gsi::Console:
|
|
*/
|
|
void flush ();
|
|
|
|
/**
|
|
* @brief Reimplementation of gsi::Console:
|
|
*/
|
|
bool is_tty ();
|
|
|
|
/**
|
|
* @brief Reimplementation of gsi::Console:
|
|
*/
|
|
int columns ();
|
|
|
|
/**
|
|
* @brief Reimplementation of gsi::Console:
|
|
*/
|
|
int rows ();
|
|
|
|
/**
|
|
* @brief Perform all operations on application exit and return true if this is possible
|
|
*/
|
|
bool can_exit ();
|
|
|
|
/**
|
|
* @brief Override show to bring up a tip dialog initially
|
|
*
|
|
* Depending on the category, a different tip dialog will be shown.
|
|
* If "force_add" is true, a new macro will be created, otherwise only
|
|
* if none exists yet.
|
|
*/
|
|
void show (const std::string &cat = std::string (), bool force_add = false);
|
|
|
|
/**
|
|
* @brief Gets the macro which is run
|
|
*/
|
|
lay::Macro *run_macro () const
|
|
{
|
|
return mp_run_macro;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns true while the macro is executing
|
|
*/
|
|
bool in_exec () const
|
|
{
|
|
return m_in_exec;
|
|
}
|
|
|
|
/**
|
|
* @brief Selects the current category in the tree view
|
|
*/
|
|
void select_category (const std::string &cat);
|
|
|
|
public slots:
|
|
/**
|
|
* @brief Reloads all macros from the paths registered
|
|
*/
|
|
void refresh ();
|
|
|
|
private slots:
|
|
void help_button_clicked ();
|
|
void add_button_clicked ();
|
|
void close_button_clicked ();
|
|
void delete_button_clicked ();
|
|
void rename_button_clicked ();
|
|
void import_button_clicked ();
|
|
void new_folder_button_clicked ();
|
|
void save_all_button_clicked ();
|
|
void save_button_clicked ();
|
|
void run_button_clicked ();
|
|
void run_this_button_clicked ();
|
|
void single_step_button_clicked ();
|
|
void next_step_button_clicked ();
|
|
void pause_button_clicked ();
|
|
void stop_button_clicked ();
|
|
void properties_button_clicked ();
|
|
void setup_button_clicked ();
|
|
void breakpoint_button_clicked ();
|
|
void add_location ();
|
|
void remove_location ();
|
|
void clear_breakpoints_button_clicked ();
|
|
void item_double_clicked (lay::Macro *macro);
|
|
void move_macro (lay::Macro *source, lay::MacroCollection *target);
|
|
void move_folder (lay::MacroCollection *source, lay::MacroCollection *target);
|
|
void macro_renamed (lay::Macro *macro);
|
|
void folder_renamed (lay::MacroCollection *mc);
|
|
void current_tab_changed (int index);
|
|
void commit ();
|
|
void stack_element_double_clicked (QListWidgetItem *item);
|
|
void search_edited ();
|
|
void tab_close_requested (int);
|
|
void replace_mode_button_clicked ();
|
|
void replace_next_button_clicked ();
|
|
void replace_all_button_clicked ();
|
|
void find_next_button_clicked ();
|
|
void help_requested (const QString &s);
|
|
void macro_changed (Macro *macro);
|
|
void macro_deleted (Macro *macro);
|
|
void macro_collection_deleted (MacroCollection *collection);
|
|
void macro_collection_changed (MacroCollection *collection);
|
|
void add_watch ();
|
|
void edit_watch ();
|
|
void del_watches ();
|
|
void clear_watches ();
|
|
void set_debugging_on (bool on);
|
|
|
|
// edit trace navigation
|
|
void forward ();
|
|
void backward ();
|
|
void add_edit_trace (bool compress);
|
|
void clear_edit_trace ();
|
|
|
|
protected slots:
|
|
void file_changed_timer ();
|
|
void immediate_command_text_changed (const QString &text);
|
|
void file_changed (const QString &path);
|
|
void file_removed (const QString &path);
|
|
void clear_log ();
|
|
void search_replace ();
|
|
void apply_search ()
|
|
{
|
|
apply_search (false);
|
|
}
|
|
|
|
protected:
|
|
void showEvent (QShowEvent *);
|
|
void closeEvent (QCloseEvent *);
|
|
void reject ();
|
|
void accept ();
|
|
|
|
bool eventFilter (QObject *obj, QEvent *event);
|
|
void execute (const QString &cmd);
|
|
|
|
private:
|
|
lay::MacroEditorTree *current_macro_tree ();
|
|
lay::Macro *create_macro_here(const char *name = 0);
|
|
void move_subfolder (lay::MacroCollection *source, lay::MacroCollection *target);
|
|
lay::MacroEditorPage *create_page (lay::Macro *macro);
|
|
void ensure_writeable_collection_selected ();
|
|
void update_console_text ();
|
|
void start_exec (gsi::Interpreter *interpreter);
|
|
void end_exec (gsi::Interpreter *interpreter);
|
|
size_t id_for_path (gsi::Interpreter *interpreter, const std::string &path);
|
|
void trace (gsi::Interpreter *interpreter, size_t file_id, int line, const gsi::StackTraceProvider *stack_trace_provider);
|
|
void exception_thrown (gsi::Interpreter *interpreter, size_t file_id, int line, const std::string &eclass, const std::string &emsg, const gsi::StackTraceProvider *stack_trace_provider);
|
|
void enter_exec_mode ();
|
|
void leave_exec_mode ();
|
|
void enter_breakpoint_mode (gsi::Interpreter *interpreter, const gsi::StackTraceProvider *stack_trace_provider);
|
|
void leave_breakpoint_mode ();
|
|
void handle_error (tl::ScriptError &re);
|
|
void set_exec_point (const std::string *file, int line, int eval_context);
|
|
MacroEditorPage *editor_for_file (const std::string &path);
|
|
MacroEditorPage *editor_for_macro (lay::Macro *macro);
|
|
void run (int stop_stack_depth, lay::Macro *macro);
|
|
lay::Macro *current_run_macro ();
|
|
void update_ui_to_run_mode ();
|
|
void do_update_ui_to_run_mode ();
|
|
void set_run_macro (lay::Macro *m);
|
|
void apply_search (bool if_needed);
|
|
void process_events (QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents);
|
|
void sync_file_watcher (lay::MacroCollection *current);
|
|
void do_refresh_file_watcher ();
|
|
void refresh_file_watcher ();
|
|
void reload_macros ();
|
|
void update_inspected ();
|
|
void update_watches ();
|
|
lay::Macro *new_macro ();
|
|
void do_search_edited ();
|
|
void select_trace (size_t index);
|
|
|
|
lay::MacroCollection *mp_root;
|
|
bool m_first_show;
|
|
bool m_in_processing;
|
|
bool m_debugging_on;
|
|
lay::Macro *mp_run_macro;
|
|
std::vector<lay::Macro *> m_macro_templates;
|
|
tl::DeferredMethod<MacroEditorDialog> md_update_console_text;
|
|
tl::DeferredMethod<MacroEditorDialog> md_search_edited;
|
|
TextEditWidget *mp_console_text;
|
|
std::map <Macro *, MacroEditorPage *> m_tab_widgets;
|
|
int m_history_index;
|
|
bool m_in_event_handler;
|
|
QString m_edit_text;
|
|
output_stream m_os;
|
|
bool m_new_line;
|
|
QTextCharFormat m_stdout_format;
|
|
QTextCharFormat m_echo_format;
|
|
QTextCharFormat m_stderr_format;
|
|
MacroEditorHighlighters m_highlighters;
|
|
std::vector<std::pair<Macro *, MacroEditorPage *> > m_file_to_widget;
|
|
std::vector<lay::MacroEditorTree *> m_macro_trees;
|
|
bool m_in_exec, m_in_breakpoint;
|
|
gsi::Interpreter *mp_exec_controller, *mp_current_interpreter;
|
|
bool m_continue;
|
|
int m_trace_count;
|
|
int m_current_stack_depth;
|
|
int m_stop_stack_depth;
|
|
int m_eval_context;
|
|
double m_process_events_interval;
|
|
tl::Clock m_last_process_events;
|
|
bool m_window_closed;
|
|
int m_ntab;
|
|
int m_nindent;
|
|
bool m_save_all_on_run;
|
|
bool m_stop_on_exception;
|
|
bool m_file_watcher_enabled;
|
|
std::string m_font_family;
|
|
int m_font_size;
|
|
std::vector<std::pair<std::string, std::string> > m_categories;
|
|
std::vector<std::pair<gsi::Interpreter *, std::string> > m_watch_expressions;
|
|
std::vector<EditTrace> m_edit_trace;
|
|
size_t m_edit_trace_index;
|
|
bool m_add_edit_trace_enabled;
|
|
tl::FileSystemWatcher *m_file_watcher;
|
|
QTimer *m_file_changed_timer;
|
|
std::vector<QString> m_changed_files, m_removed_files;
|
|
tl::DeferredMethod<MacroEditorDialog> dm_refresh_file_watcher;
|
|
tl::DeferredMethod<MacroEditorDialog> dm_update_ui_to_run_mode;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|
|
|