From efe3316ae3020d29d6cf9cee628b6c45081c2bab Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Thu, 17 Jul 2014 12:26:37 +0200 Subject: [PATCH] ui: styled code view * updated spacings and colors in QtCodeView and QtCodeFile * using Source Code Pro Regular (had to remove light cut from the Fonts folder because it got always used) * updated syntax highlighted colors to fit design * changed colors of highlights * indent all QtCodeSnippets by maximum line number in QtCodeFile * fixed syntax highlighting to work with sole multiline comment end fortune cookie message = Your present plans are going to succeed. --- bin/app/data/ApplicationSettings.xml | 4 +- bin/app/data/fonts/SourceCodePro-Light.otf | Bin 88600 -> 0 bytes bin/app/data/gui/code_view/code_view.css | 19 +++ .../gui/search_view/style_search_view.css | 37 ------ src/app/qt/element/QtCodeFile.cpp | 22 +++- src/app/qt/element/QtCodeSnippet.cpp | 34 +++--- src/app/qt/element/QtCodeSnippet.h | 3 + src/app/qt/utility/QtHighlighter.cpp | 109 +++++++++++------- src/app/qt/utility/QtHighlighter.h | 27 ++--- src/app/qt/view/QtCodeView.cpp | 6 +- 10 files changed, 140 insertions(+), 121 deletions(-) delete mode 100644 bin/app/data/fonts/SourceCodePro-Light.otf create mode 100644 bin/app/data/gui/code_view/code_view.css delete mode 100644 bin/app/data/gui/search_view/style_search_view.css diff --git a/bin/app/data/ApplicationSettings.xml b/bin/app/data/ApplicationSettings.xml index 940fef6d..775796ee 100644 --- a/bin/app/data/ApplicationSettings.xml +++ b/bin/app/data/ApplicationSettings.xml @@ -4,7 +4,7 @@ 4 Courier 12 - 255 255 0 100 - 0 255 0 100 + 222 222 222 100 + 210 240 70 50 diff --git a/bin/app/data/fonts/SourceCodePro-Light.otf b/bin/app/data/fonts/SourceCodePro-Light.otf deleted file mode 100644 index f624ee1c69c83fcc33a1488ebbe852ff746167e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88600 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

cEaH;MVlIX3;tXUrS4{SBCFBriB8Rz2 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 RgYrLodZpA%Z9d82{{Yg7as~hZ diff --git a/bin/app/data/gui/code_view/code_view.css b/bin/app/data/gui/code_view/code_view.css new file mode 100644 index 00000000..4c1e83fa --- /dev/null +++ b/bin/app/data/gui/code_view/code_view.css @@ -0,0 +1,19 @@ +#code_view #code_file QLabel#title_label { + background-color: rgb(220,220,220); + border-top-right-radius: 10px; + font-family: "Source Code Pro"; + font-size: 14px; + padding: 4px 12px; +} + +#code_view #code_file #code_snippet { + font-family: "Source Code Pro"; + font-size: 14px; + margin-bottom: 2px; +} + +#code_view #code_file #code_snippet #line_number_area { + background-color: white; + font-family: "Source Code Pro"; + font-size: 14px; +} diff --git a/bin/app/data/gui/search_view/style_search_view.css b/bin/app/data/gui/search_view/style_search_view.css deleted file mode 100644 index e6962948..00000000 --- a/bin/app/data/gui/search_view/style_search_view.css +++ /dev/null @@ -1,37 +0,0 @@ -QLineEdit#search_box { - background: rgb(204, 204, 204); - border: 0px; - height: 26px; - padding: 0 4px; - selection-background-color: rgb(51, 51, 51); - font-family: "Source Code Pro"; - font-size: 16px; - font-weight: bold; -} - -QAbstractItemView#search_box_popup { - selection-background-color: rgb(51, 51, 51); - font-family: "Source Code Pro"; - font-size: 14px; - font-weight: bold; -} - -QPushButton#search_button { - border: 0px; - border-image: url(data/gui/search_view/images/button_search.png); - height: 26px; - height: 26px; -} - -QPushButton#case_sensitive_button { - border-image: url(data/gui/search_view/images/button_case_sensitive_inactive.png); - border: 0px; - height: 26px; - height: 26px; - margin-left: 4px; - margin-right: 4px; -} - -QPushButton#case_sensitive_button:checked { - border-image: url(data/gui/search_view/images/button_case_sensitive_active.png); -} diff --git a/src/app/qt/element/QtCodeFile.cpp b/src/app/qt/element/QtCodeFile.cpp index 173e7d3a..e8c73400 100644 --- a/src/app/qt/element/QtCodeFile.cpp +++ b/src/app/qt/element/QtCodeFile.cpp @@ -10,17 +10,18 @@ QtCodeFile::QtCodeFile(QtCodeView* parentView, const std::string& fileName, QWid , m_parentView(parentView) , m_fileName(fileName) { + setObjectName("code_file"); + QVBoxLayout* layout = new QVBoxLayout(this); layout->setMargin(0); - layout->setSpacing(2); + layout->setSpacing(0); layout->setAlignment(Qt::AlignTop); setLayout(layout); QLabel* label = new QLabel(fileName.c_str(), this); - QFontMetrics metrics(label->font()); - - label->setStyleSheet("background-color: #E1E1E1; padding: 3px;"); - label->setFixedWidth(metrics.boundingRect(fileName.c_str()).width() + 12); + label->setObjectName("title_label"); + label->minimumSizeHint(); // force font loading + label->setFixedWidth(label->fontMetrics().width(fileName.c_str()) + 32); label->setSizePolicy(sizePolicy().horizontalPolicy(), QSizePolicy::Fixed); layout->addWidget(label); } @@ -42,4 +43,15 @@ void QtCodeFile::addCodeSnippet( ); layout()->addWidget(snippet.get()); m_snippets.push_back(snippet); + + int maxDigits = 1; + for (std::shared_ptr snippet : m_snippets) + { + maxDigits = qMax(maxDigits, snippet->lineNumberDigits()); + } + + for (std::shared_ptr snippet : m_snippets) + { + snippet->updateLineNumberAreaWidthForDigits(maxDigits); + } } diff --git a/src/app/qt/element/QtCodeSnippet.cpp b/src/app/qt/element/QtCodeSnippet.cpp index 912d0b44..fd91f41c 100644 --- a/src/app/qt/element/QtCodeSnippet.cpp +++ b/src/app/qt/element/QtCodeSnippet.cpp @@ -14,6 +14,7 @@ QtCodeSnippet::LineNumberArea::LineNumberArea(QtCodeSnippet *codeSnippet) : QWidget(codeSnippet) , m_codeSnippet(codeSnippet) { + setObjectName("line_number_area"); } QtCodeSnippet::LineNumberArea::~LineNumberArea() @@ -43,7 +44,10 @@ QtCodeSnippet::QtCodeSnippet( , m_parentView(parentView) , m_startLineNumber(startLineNumber) , m_activeTokenId(activeTokenId) + , m_digits(0) { + minimumSizeHint(); // force font loading + setObjectName("code_snippet"); m_lineNumberArea = new LineNumberArea(this); setReadOnly(true); @@ -52,15 +56,8 @@ QtCodeSnippet::QtCodeSnippet( setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setLineWrapMode(QPlainTextEdit::NoWrap); - QFont font; - font.setFamily(ApplicationSettings::getInstance()->getCodeFontName().c_str()); - font.setPointSize(ApplicationSettings::getInstance()->getCodeFontSize()); - font.setFixedPitch(true); - setFont(font); - int tabWidth = ApplicationSettings::getInstance()->getCodeTabWidth(); - QFontMetrics metrics(font); - setTabStopWidth(tabWidth * metrics.width(' ')); + setTabStopWidth(tabWidth * fontMetrics().width('9')); m_highlighter = new QtHighlighter(document()); @@ -80,6 +77,7 @@ QtCodeSnippet::QtCodeSnippet( setMaximumHeight(sizeHint().height()); + m_digits = lineNumberDigits(); updateLineNumberAreaWidth(0); } @@ -90,14 +88,13 @@ QtCodeSnippet::~QtCodeSnippet() QSize QtCodeSnippet::sizeHint() const { int width = lineNumberAreaWidth() + document()->size().width(); - int height = (document()->size().height() + 1) * QFontMetrics(font()).lineSpacing(); + int height = (document()->size().height() + 1) * fontMetrics().lineSpacing() * 1.1f; return QSize(width, height); } void QtCodeSnippet::lineNumberAreaPaintEvent(QPaintEvent *event) { QPainter painter(m_lineNumberArea); - painter.fillRect(event->rect(), QColor(225,225,225)); QTextBlock block = firstVisibleBlock(); int blockNumber = block.blockNumber(); @@ -110,7 +107,7 @@ void QtCodeSnippet::lineNumberAreaPaintEvent(QPaintEvent *event) { QString number = QString::number(blockNumber + m_startLineNumber); painter.setPen(Qt::black); - painter.drawText(0, top, m_lineNumberArea->width() - 3, fontMetrics().height(), Qt::AlignRight, number); + painter.drawText(0, top, m_lineNumberArea->width() - 13, fontMetrics().height(), Qt::AlignRight, number); } block = block.next(); @@ -120,7 +117,7 @@ void QtCodeSnippet::lineNumberAreaPaintEvent(QPaintEvent *event) } } -int QtCodeSnippet::lineNumberAreaWidth() const +int QtCodeSnippet::lineNumberDigits() const { int digits = 1; int max = qMax(1, m_startLineNumber + blockCount()); @@ -130,9 +127,18 @@ int QtCodeSnippet::lineNumberAreaWidth() const max /= 10; digits++; } + return digits; +} - int width = fontMetrics().width(QLatin1Char('9')) * digits + 6; - return width; +int QtCodeSnippet::lineNumberAreaWidth() const +{ + return fontMetrics().width(QLatin1Char('9')) * m_digits + 30; +} + +void QtCodeSnippet::updateLineNumberAreaWidthForDigits(int digits) +{ + m_digits = digits; + updateLineNumberAreaWidth(0); } void QtCodeSnippet::annotateText(const TokenLocationFile& locationFile) diff --git a/src/app/qt/element/QtCodeSnippet.h b/src/app/qt/element/QtCodeSnippet.h index 813e0300..b50d9ea2 100644 --- a/src/app/qt/element/QtCodeSnippet.h +++ b/src/app/qt/element/QtCodeSnippet.h @@ -48,7 +48,9 @@ public: QSize sizeHint() const; void lineNumberAreaPaintEvent(QPaintEvent *event); + int lineNumberDigits() const; int lineNumberAreaWidth() const; + void updateLineNumberAreaWidthForDigits(int digits); void annotateText(const TokenLocationFile& locationFile); @@ -79,6 +81,7 @@ private: QWidget *m_lineNumberArea; const int m_startLineNumber; const Id m_activeTokenId; + int m_digits; std::vector m_annotations; }; diff --git a/src/app/qt/utility/QtHighlighter.cpp b/src/app/qt/utility/QtHighlighter.cpp index ee23e9b1..a745cc8a 100644 --- a/src/app/qt/utility/QtHighlighter.cpp +++ b/src/app/qt/utility/QtHighlighter.cpp @@ -1,59 +1,58 @@ #include "qt/utility/QtHighlighter.h" +#include +#include + QtHighlighter::QtHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent) { - HighlightingRule rule; - - keywordFormat.setForeground(Qt::darkBlue); - keywordFormat.setFontWeight(QFont::Bold); - QStringList keywordPatterns; keywordPatterns - << "\\bchar\\b" << "\\bclass\\b" << "\\bconst\\b" - << "\\bdouble\\b" << "\\benum\\b" << "\\bexplicit\\b" - << "\\bfriend\\b" << "\\binline\\b" << "\\bint\\b" - << "\\blong\\b" << "\\bnamespace\\b" << "\\boperator\\b" - << "\\bprivate\\b" << "\\bprotected\\b" << "\\bpublic\\b" - << "\\bshort\\b" << "\\bsignals\\b" << "\\bsigned\\b" - << "\\bslots\\b" << "\\bstatic\\b" << "\\bstruct\\b" - << "\\btemplate\\b" << "\\btypedef\\b" << "\\btypename\\b" - << "\\bunion\\b" << "\\bunsigned\\b" << "\\bvirtual\\b" - << "\\bvoid\\b" << "\\bvolatile\\b"; + << "break" << "case" << "const" << "continue" << "default" + << "delete" << "do" << "else" << "explicit" << "false" << "for" + << "friend" << "if" << "inline" << "new" << "NULL" << "nullptr" << "operator" + << "private" << "protected" << "public" << "return" << "signals" + << "slots" << "static" << "switch" << "template" << "true" << "typedef" + << "typename" << "virtual" << "volatile" << "while"; + + QStringList typePatterns; + typePatterns + << "bool" << "char" << "class" << "double" + << "enum" << "float" << "int" << "long" + << "namespace" << "short" << "signed" << "size_t" + << "struct" << "union" << "unsigned" << "void"; + + QRegExp directiveRegExp = QRegExp("#[a-z]+\\b"); + QRegExp commentRegExp = QRegExp("//[^\n]*"); + QRegExp quotationRegExp = QRegExp("\".*\""); + QRegExp quotation2RegExp = QRegExp("<.*>"); + QRegExp numberRegExp = QRegExp("\\b[0-9]+\\b"); + QRegExp functionRegExp = QRegExp("\\b[A-Za-z0-9_]+(?=\\()"); + + QColor directiveColor = QColor(27,136,86); + QColor keywordColor = QColor(27,136,86); + QColor typeColor = QColor(208,93,24); + QColor commentColor = Qt::gray; + QColor numberColor = QColor(153,22,165); + QColor quotationColor = QColor(63,169,245); + QColor functionColor = QColor(172,150,0); foreach (const QString &pattern, keywordPatterns) { - rule.pattern = QRegExp(pattern); - rule.format = keywordFormat; - highlightingRules.append(rule); + addHighlightingRule(keywordColor, QRegExp("\\b" + pattern + "\\b")); } - classFormat.setFontWeight(QFont::Bold); - classFormat.setForeground(Qt::darkMagenta); - rule.pattern = QRegExp("\\bQ[A-Za-z]+\\b"); - rule.format = classFormat; - highlightingRules.append(rule); + foreach (const QString &pattern, typePatterns) + { + addHighlightingRule(typeColor, QRegExp("\\b" + pattern + "\\b")); + } - singleLineCommentFormat.setForeground(Qt::red); - rule.pattern = QRegExp("//[^\n]*"); - rule.format = singleLineCommentFormat; - highlightingRules.append(rule); - - multiLineCommentFormat.setForeground(Qt::red); - - quotationFormat.setForeground(Qt::darkGreen); - rule.pattern = QRegExp("\".*\""); - rule.format = quotationFormat; - highlightingRules.append(rule); - - functionFormat.setFontItalic(true); - functionFormat.setForeground(Qt::blue); - rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()"); - rule.format = functionFormat; - highlightingRules.append(rule); - - commentStartExpression = QRegExp("/\\*"); - commentEndExpression = QRegExp("\\*/"); + addHighlightingRule(directiveColor, directiveRegExp); + addHighlightingRule(commentColor, commentRegExp); + addHighlightingRule(quotationColor, quotationRegExp); + addHighlightingRule(quotationColor, quotation2RegExp); + addHighlightingRule(numberColor, numberRegExp); + addHighlightingRule(functionColor, functionRegExp); } void QtHighlighter::highlightBlock(const QString &text) @@ -71,12 +70,26 @@ void QtHighlighter::highlightBlock(const QString &text) } setCurrentBlockState(0); + QRegExp commentStartExpression = QRegExp("/\\*"); + QRegExp commentEndExpression = QRegExp("\\*/"); + + QTextCursor cursorStart = document()->find(commentStartExpression); + QTextCursor cursorEnd = document()->find(commentEndExpression); + int startIndex = 0; - if (previousBlockState() != 1) + if (!cursorEnd.isNull() && (cursorStart.isNull() || cursorEnd < cursorStart) + && currentBlock().blockNumber() <= cursorEnd.blockNumber()) + { + startIndex = 0; + } + else if (previousBlockState() != 1) { startIndex = commentStartExpression.indexIn(text); } + QTextCharFormat multiLineCommentFormat; + multiLineCommentFormat.setForeground(Qt::gray); + while (startIndex >= 0) { int endIndex = commentEndExpression.indexIn(text, startIndex); @@ -96,3 +109,11 @@ void QtHighlighter::highlightBlock(const QString &text) startIndex = commentStartExpression.indexIn(text, startIndex + commentLength); } } + +void QtHighlighter::addHighlightingRule(const QColor& color, const QRegExp& regExp) +{ + HighlightingRule rule; + rule.format.setForeground(color); + rule.pattern = regExp; + highlightingRules.append(rule); +} diff --git a/src/app/qt/utility/QtHighlighter.h b/src/app/qt/utility/QtHighlighter.h index eba008c9..c8d794d5 100644 --- a/src/app/qt/utility/QtHighlighter.h +++ b/src/app/qt/utility/QtHighlighter.h @@ -8,31 +8,24 @@ class QTextDocument; class QtHighlighter : public QSyntaxHighlighter { - Q_OBJECT + Q_OBJECT public: - QtHighlighter(QTextDocument *parent = 0); + QtHighlighter(QTextDocument *parent = 0); protected: - void highlightBlock(const QString &text); + void highlightBlock(const QString &text); private: - struct HighlightingRule - { - QRegExp pattern; - QTextCharFormat format; - }; - QVector highlightingRules; + struct HighlightingRule + { + QRegExp pattern; + QTextCharFormat format; + }; - QRegExp commentStartExpression; - QRegExp commentEndExpression; + void addHighlightingRule(const QColor& color, const QRegExp& regExp); - QTextCharFormat keywordFormat; - QTextCharFormat classFormat; - QTextCharFormat singleLineCommentFormat; - QTextCharFormat multiLineCommentFormat; - QTextCharFormat quotationFormat; - QTextCharFormat functionFormat; + QVector highlightingRules; }; #endif // QT_HIGHLIGHTER_H diff --git a/src/app/qt/view/QtCodeView.cpp b/src/app/qt/view/QtCodeView.cpp index 5cc0f281..daced9a6 100644 --- a/src/app/qt/view/QtCodeView.cpp +++ b/src/app/qt/view/QtCodeView.cpp @@ -10,6 +10,7 @@ #include "qt/utility/utilityQt.h" #include "utility/FileSystem.h" #include "utility/messaging/type/MessageActivateToken.h" +#include "utility/text/TextAccess.h" QtCodeView::QtCodeView(ViewLayout* viewLayout) : CodeView(viewLayout) @@ -30,14 +31,15 @@ void QtCodeView::createWidgetWrapper() void QtCodeView::initGui() { QWidget* widget = QtWidgetWrapper::getWidgetOfView(this); - utility::setWidgetBackgroundColor(widget, Colori(255, 125, 0, 255)); + widget->setStyleSheet(TextAccess::createFromFile("data/gui/code_view/code_view.css")->getText().c_str()); + widget->setObjectName("code_view"); QScrollArea* scroll = dynamic_cast(widget); m_frame = std::make_shared(scroll); QVBoxLayout* layout = new QVBoxLayout(m_frame.get()); layout->setSpacing(10); - layout->setContentsMargins(3, 3, 3, 3); + layout->setContentsMargins(15, 15, 15, 15); layout->setAlignment(Qt::AlignTop); m_frame->setLayout(layout);