From 47ee1857cd17e45d67505637a497c75980ac7244 Mon Sep 17 00:00:00 2001 From: eelke Date: Sun, 8 Apr 2018 09:07:43 +0200 Subject: [PATCH] Added a gutter and currentline highlighting to the SQL editor. Currently gutter only shows linenumbers. Code is mostly from http://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html There is a little bit included in this commit from a first try to make toobars adept to the current tab. Code #2 --- docs/Design.odt | Bin 0 -> 10899 bytes pglab/CodeEditor.cpp | 112 +++++++++++++++++++++++++++++++++++++++++ pglab/CodeEditor.h | 31 ++++++++++++ pglab/EditorGutter.cpp | 19 +++++++ pglab/EditorGutter.h | 28 +++++++++++ pglab/Module.cpp | 8 +++ pglab/Module.h | 15 ++++++ pglab/PglPage.cpp | 6 +++ pglab/PglPage.h | 24 +++++++++ pglab/QueryTab.cpp | 2 +- pglab/QueryTab.h | 3 +- pglab/QueryTab.ui | 9 +++- pglab/pglab.pro | 12 ++++- pgsql/SqlGenerator.h | 15 ++++++ pgsql/pgsql.pro | 3 +- 15 files changed, 281 insertions(+), 6 deletions(-) create mode 100644 docs/Design.odt create mode 100644 pglab/CodeEditor.cpp create mode 100644 pglab/CodeEditor.h create mode 100644 pglab/EditorGutter.cpp create mode 100644 pglab/EditorGutter.h create mode 100644 pglab/Module.cpp create mode 100644 pglab/Module.h create mode 100644 pglab/PglPage.cpp create mode 100644 pglab/PglPage.h create mode 100644 pgsql/SqlGenerator.h diff --git a/docs/Design.odt b/docs/Design.odt new file mode 100644 index 0000000000000000000000000000000000000000..840acbf1164b56f21c3ba9e4290feeb235f7f390 GIT binary patch literal 10899 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 +#include +// +// Adapted from codeeditor example +// http://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html +// +// Used term gutter as I want to expand it to do other things to like error +// position marking. +// + +CodeEditor::CodeEditor(QWidget *parent) + : QPlainTextEdit(parent) + , gutterArea(new EditorGutter(this)) +{ + connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateGutterAreaWidth(int))); + connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateGutterArea(QRect,int))); + connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); + + updateGutterAreaWidth(0); + highlightCurrentLine(); +} + +int CodeEditor::gutterAreaWidth() +{ + int digits = 1; + int max = qMax(1, blockCount()); + while (max >= 10) { + max /= 10; + ++digits; + } + + int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits; + + return space; +} + +void CodeEditor::updateGutterAreaWidth(int /* newBlockCount */) +{ + setViewportMargins(gutterAreaWidth(), 0, 0, 0); +} + +void CodeEditor::updateGutterArea(const QRect &rect, int dy) +{ + if (dy) + gutterArea->scroll(0, dy); + else + gutterArea->update(0, rect.y(), gutterArea->width(), rect.height()); + + if (rect.contains(viewport()->rect())) + updateGutterAreaWidth(0); +} + +void CodeEditor::resizeEvent(QResizeEvent *e) +{ + QPlainTextEdit::resizeEvent(e); + + QRect cr = contentsRect(); + gutterArea->setGeometry(QRect(cr.left(), cr.top(), gutterAreaWidth(), cr.height())); +} + +void CodeEditor::highlightCurrentLine() +{ + QList extraSelections; + + if (!isReadOnly()) { + QTextEdit::ExtraSelection selection; + + QColor lineColor = QColor(Qt::yellow).lighter(160); + + selection.format.setBackground(lineColor); + selection.format.setProperty(QTextFormat::FullWidthSelection, true); + selection.cursor = textCursor(); + selection.cursor.clearSelection(); + extraSelections.append(selection); + } + + setExtraSelections(extraSelections); +} + +void CodeEditor::gutterAreaPaintEvent(QPaintEvent *event) +{ + QPainter painter(gutterArea); + painter.fillRect(event->rect(), Qt::lightGray); + + QTextBlock block = firstVisibleBlock(); + int blockNumber = block.blockNumber(); + int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top(); + int bottom = top + (int) blockBoundingRect(block).height(); + + // We will now loop through all visible lines and paint the line numbers in the + // extra area for each line. Notice that in a plain text edit each line will + // consist of one QTextBlock; though, if line wrapping is enabled, a line may span + // several rows in the text edit's viewport. + // + // We get the top and bottom y-coordinate of the first text block, and adjust these + // values by the height of the current text block in each iteration in the loop. + while (block.isValid() && top <= event->rect().bottom()) { + if (block.isVisible() && bottom >= event->rect().top()) { + QString number = QString::number(blockNumber + 1); + painter.setPen(Qt::black); + painter.drawText(0, top, gutterArea->width(), fontMetrics().height(), + Qt::AlignRight, number); + } + + block = block.next(); + top = bottom; + bottom = top + (int) blockBoundingRect(block).height(); + ++blockNumber; + } +} diff --git a/pglab/CodeEditor.h b/pglab/CodeEditor.h new file mode 100644 index 0000000..f2a86d4 --- /dev/null +++ b/pglab/CodeEditor.h @@ -0,0 +1,31 @@ +#ifndef CODEEDITOR_H +#define CODEEDITOR_H + +#include + +class CodeEditor : public QPlainTextEdit +{ + Q_OBJECT +public: + explicit CodeEditor(QWidget *parent = nullptr); + + void gutterAreaPaintEvent(QPaintEvent *event); + int gutterAreaWidth(); + +protected: + void resizeEvent(QResizeEvent *event) override; + +signals: + +public slots: + +private slots: + void updateGutterAreaWidth(int newBlockCount); + void highlightCurrentLine(); + void updateGutterArea(const QRect &, int); + +private: + QWidget *gutterArea; +}; + +#endif // CODEEDITOR_H diff --git a/pglab/EditorGutter.cpp b/pglab/EditorGutter.cpp new file mode 100644 index 0000000..7b98180 --- /dev/null +++ b/pglab/EditorGutter.cpp @@ -0,0 +1,19 @@ +#include "EditorGutter.h" +#include "CodeEditor.h" + +EditorGutter::EditorGutter(CodeEditor *editor) + : QWidget(editor) + , codeEditor(editor) +{ + +} + +QSize EditorGutter::sizeHint() const +{ + return QSize(codeEditor->gutterAreaWidth(), 0); +} + +void EditorGutter::paintEvent(QPaintEvent *event) +{ + codeEditor->gutterAreaPaintEvent(event); +} diff --git a/pglab/EditorGutter.h b/pglab/EditorGutter.h new file mode 100644 index 0000000..2050a37 --- /dev/null +++ b/pglab/EditorGutter.h @@ -0,0 +1,28 @@ +#ifndef EDITORGUTTER_H +#define EDITORGUTTER_H + +#include +//#include + +class CodeEditor; + +class EditorGutter : public QWidget +{ + Q_OBJECT +public: + explicit EditorGutter(CodeEditor *editor); + + QSize sizeHint() const override; + +protected: + + void paintEvent(QPaintEvent *event) override; + +private: + CodeEditor *codeEditor; +signals: + +public slots: +}; + +#endif // EDITORGUTTER_H diff --git a/pglab/Module.cpp b/pglab/Module.cpp new file mode 100644 index 0000000..66ff01e --- /dev/null +++ b/pglab/Module.cpp @@ -0,0 +1,8 @@ +#include "Module.h" + +using namespace Leon; + +Module::Module() +{ + +} diff --git a/pglab/Module.h b/pglab/Module.h new file mode 100644 index 0000000..62065c7 --- /dev/null +++ b/pglab/Module.h @@ -0,0 +1,15 @@ +#ifndef MODULE_H +#define MODULE_H + +namespace Leon { + +class Module +{ +public: + Module(); + +}; + +} + +#endif // MODULE_H diff --git a/pglab/PglPage.cpp b/pglab/PglPage.cpp new file mode 100644 index 0000000..a42347d --- /dev/null +++ b/pglab/PglPage.cpp @@ -0,0 +1,6 @@ +#include "PglPage.h" + +//PglPage::PglPage() +//{ + +//} diff --git a/pglab/PglPage.h b/pglab/PglPage.h new file mode 100644 index 0000000..8e7438d --- /dev/null +++ b/pglab/PglPage.h @@ -0,0 +1,24 @@ +#ifndef PGLPAGE_H +#define PGLPAGE_H + +#include + +/// Provides a pluggable system for toolbar buttons and menu actions +/// +/// We will need several kind of actions +/// - create actions, these will create a new document or load from file , always available in menu +/// - save actions available when on tab +/// - edit actions +/// - custom menu? +/// +/// Can we use same groupings for toolbars and menu's +/// How about additional toolbars? +/// +class PglPage: public QWidget{ +public: + using QWidget::QWidget; + + +}; + +#endif // PGLPAGE_H diff --git a/pglab/QueryTab.cpp b/pglab/QueryTab.cpp index 3ec0828..1e1c378 100644 --- a/pglab/QueryTab.cpp +++ b/pglab/QueryTab.cpp @@ -22,7 +22,7 @@ #include "GlobalIoService.h" QueryTab::QueryTab(MainWindow *win, QWidget *parent) : - QWidget(parent), + PglPage(parent), ui(new Ui::QueryTab), m_win(win), m_dbConnection(*getGlobalAsioIoService()) diff --git a/pglab/QueryTab.h b/pglab/QueryTab.h index 73175d2..89bf7ff 100644 --- a/pglab/QueryTab.h +++ b/pglab/QueryTab.h @@ -8,6 +8,7 @@ #include "tuplesresultwidget.h" #include +#include "PglPage.h" #include namespace Ui { @@ -27,7 +28,7 @@ class OpenDatabase; class QueryParamListController; class PgDatabaseCatalog; -class QueryTab : public QWidget { +class QueryTab : public PglPage { Q_OBJECT public: QueryTab(MainWindow *win, QWidget *parent = nullptr); diff --git a/pglab/QueryTab.ui b/pglab/QueryTab.ui index ccac5ac..7d5ef68 100644 --- a/pglab/QueryTab.ui +++ b/pglab/QueryTab.ui @@ -23,7 +23,7 @@ Qt::Horizontal - + QFrame::StyledPanel @@ -213,6 +213,13 @@ + + + CodeEditor + QPlainTextEdit +
CodeEditor.h
+
+
diff --git a/pglab/pglab.pro b/pglab/pglab.pro index 8ff3b7d..1fac959 100644 --- a/pglab/pglab.pro +++ b/pglab/pglab.pro @@ -69,7 +69,11 @@ SOURCES += main.cpp\ IndexModel.cpp \ CrudTab.cpp \ CrudModel.cpp \ - PgLabItemDelegate.cpp + PgLabItemDelegate.cpp \ + Module.cpp \ + PglPage.cpp \ + EditorGutter.cpp \ + CodeEditor.cpp HEADERS += \ QueryResultModel.h \ @@ -110,7 +114,11 @@ HEADERS += \ IndexModel.h \ CrudTab.h \ CrudModel.h \ - PgLabItemDelegate.h + PgLabItemDelegate.h \ + Module.h \ + PglPage.h \ + EditorGutter.h \ + CodeEditor.h FORMS += mainwindow.ui \ ConnectionManagerWindow.ui \ diff --git a/pgsql/SqlGenerator.h b/pgsql/SqlGenerator.h new file mode 100644 index 0000000..f876ece --- /dev/null +++ b/pgsql/SqlGenerator.h @@ -0,0 +1,15 @@ +#ifndef SQLGENERATOR_H +#define SQLGENERATOR_H + +#include "Pgsql_Params.h" + +//namespace Pgsql { + +//template +//class AndCondition { +// AndCondition& add(const std::string &expr,) +//}; + +} // end of namespace Pgsql + +#endif // SQLGENERATOR_H diff --git a/pgsql/pgsql.pro b/pgsql/pgsql.pro index df08956..da88da9 100644 --- a/pgsql/pgsql.pro +++ b/pgsql/pgsql.pro @@ -51,7 +51,8 @@ HEADERS += Pgsql_Connection.h \ Pgsql_declare.h \ Pgsql_Col.h \ ArrayParser.h \ - Pgsql_oids.h + Pgsql_oids.h \ + SqlGenerator.h #FORMS +=