#pragma once #include #include #include #include #include #include #include #include #include #include class SeerEditorWidgetSourceArea : public QPlainTextEdit { Q_OBJECT public: SeerEditorWidgetSourceArea (QWidget* parent = 0); void enableLineNumberArea (bool flag); bool lineNumberAreaEnabled () const; void enableBreakPointArea (bool flag); bool breakPointAreaEnabled () const; void enableMiniMapArea (bool flag); bool miniMapAreaEnabled () const; void lineNumberAreaPaintEvent (QPaintEvent* event); int lineNumberAreaWidth (); void breakPointAreaPaintEvent (QPaintEvent* event); int breakPointAreaWidth (); void miniMapAreaPaintEvent (QPaintEvent* event); int miniMapAreaWidth (); bool isOpen () const; void open (const QString& fullname, const QString& file); const QString& fullname () const; const QString& file () const; void close (); void setCurrentLine (int lineno); void scrollToLine (int lineno); void clearCurrentLines (); void addCurrentLine (int lineno); void clearBreakpoints (); void addBreakpoint (int number, int lineno, bool enabled); bool hasBreakpointNumber (int number) const; bool hasBreakpointLine (int lineno) const; const QVector& breakpointNumbers () const; const QVector& breakpointLines () const; const QVector& breakpointEnableds () const; int breakpointLineToNumber (int lineno) const; bool breakpointLineEnabled (int lineno) const; void showContextMenu (QMouseEvent* event); void showContextMenu (QContextMenuEvent* event); void showContextMenu (const QPoint& pos, const QPoint& globalPos); void setQuickBreakpoint (QMouseEvent* event); void clearExpression (); signals: void insertBreakpoint (QString breakpoint); void deleteBreakpoints (QString breakpoints); void enableBreakpoints (QString breakpoints); void disableBreakpoints (QString breakpoints); void runToLine (QString fullname, int lineno); void addVariableExpression (QString expression); void refreshVariableValues (); void evaluateVariableExpression (int expressionid, QString expression); void addMemoryVisualize (QString expression); void showSearchBar (bool flag); public slots: void handleText (const QString& text); protected: void resizeEvent (QResizeEvent* event); void contextMenuEvent (QContextMenuEvent* event); void keyPressEvent (QKeyEvent* event); void mouseReleaseEvent (QMouseEvent* event); bool event (QEvent* event); private slots: void highlightCurrentLines (); void highlightCurrentLine (); void unhighlightCurrentLine (); void updateMarginAreasWidth (int newBlockCount); void updateLineNumberArea (const QRect& rect, int dy); void updateBreakPointArea (const QRect& rect, int dy); void updateMiniMapArea (const QRect& rect, int dy); private: QString _fullname; QString _file; bool _enableLineNumberArea; bool _enableBreakPointArea; bool _enableMiniMapArea; QVector _breakpointsNumbers; QVector _breakpointsLineNumbers; QVector _breakpointsEnableds; QVector _currentLineCursors; QTextCursor _selectedExpressionCursor; int _selectedExpressionId; QString _selectedExpressionName; QString _selectedExpressionValue; bool _ctrlKeyPressed; QWidget* _lineNumberArea; QWidget* _breakPointArea; QWidget* _miniMapArea; QPixmap* _miniMapPixmap; }; class SeerEditorWidgetLineNumberArea : public QWidget { public: SeerEditorWidgetLineNumberArea (SeerEditorWidgetSourceArea* editorWidget); QSize sizeHint () const override; protected: void paintEvent (QPaintEvent* event) override; void mouseDoubleClickEvent (QMouseEvent* event) override; void mouseMoveEvent (QMouseEvent* event) override; void mousePressEvent (QMouseEvent* event) override; void mouseReleaseEvent (QMouseEvent* event) override; private: SeerEditorWidgetSourceArea* _editorWidget; }; class SeerEditorWidgetBreakPointArea : public QWidget { public: SeerEditorWidgetBreakPointArea (SeerEditorWidgetSourceArea* editorWidget); QSize sizeHint () const override; protected: void paintEvent (QPaintEvent* event) override; void mouseDoubleClickEvent (QMouseEvent* event) override; void mouseMoveEvent (QMouseEvent* event) override; void mousePressEvent (QMouseEvent* event) override; void mouseReleaseEvent (QMouseEvent* event) override; private: SeerEditorWidgetSourceArea* _editorWidget; }; class SeerEditorWidgetMiniMapArea : public QWidget { public: SeerEditorWidgetMiniMapArea (SeerEditorWidgetSourceArea* editorWidget); QSize sizeHint () const override; protected: void paintEvent (QPaintEvent* event) override; void mouseDoubleClickEvent (QMouseEvent* event) override; void mouseMoveEvent (QMouseEvent* event) override; void mousePressEvent (QMouseEvent* event) override; void mouseReleaseEvent (QMouseEvent* event) override; private: SeerEditorWidgetSourceArea* _editorWidget; }; #include "ui_SeerEditorWidget.h" class SeerEditorWidget : public QWidget, protected Ui::SeerEditorWidgetForm { Q_OBJECT public: explicit SeerEditorWidget (QWidget* parent = 0); ~SeerEditorWidget (); SeerEditorWidgetSourceArea* sourceArea (); void handleLineNumberLineEdit (); void handleSearchTextLineEdit (); void handleSearchDownToolButton (); void handleSearchUpToolButton (); void handleCloseToolButton (); public slots: void showSearchBar (bool flag); };