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 f624ee1c..00000000 Binary files a/bin/app/data/fonts/SourceCodePro-Light.otf and /dev/null differ 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);