Browse Source

Add font configuration for code editor

Alexander Gorishnyak 7 months ago
parent
commit
db93ec6126

+ 43 - 0
src/base/settings.cpp

@@ -6,6 +6,8 @@
 #include "tools/apktool.h"
 #include <QApplication>
 #include <QDir>
+#include <QFont>
+#include <QFontDatabase>
 #include <QSettings>
 
 Settings::Settings()
@@ -227,6 +229,35 @@ QByteArray Settings::getFileSystemTreeHeader() const
     return settings->value("MainWindow/FileSystemTreeHeader").toByteArray();
 }
 
+QFont Settings::getEditorFont() const
+{
+    const auto fontFamily = this->getEditorFontFamily();
+    const auto fontSize = this->getEditorFontSize();
+    return QFont(fontFamily, fontSize);
+}
+
+QString Settings::getEditorFontFamily() const
+{
+#if defined(Q_OS_WIN)
+    const QString defaultFamily("Consolas");
+#else
+    const QString defaultFamily(QFontDatabase::systemFont(QFontDatabase::FixedFont).family());
+#endif
+    return settings->value("CodeEditor/FontFamily", defaultFamily).toString();
+}
+
+int Settings::getEditorFontSize() const
+{
+#if defined(Q_OS_WIN)
+    const int defaultSize = 11;
+#elif defined(Q_OS_MACOS)
+    const int defaultSize = 12;
+#elif defined(Q_OS_LINUX)
+    const int defaultSize = 10;
+#endif
+    return settings->value("CodeEditor/FontSize", defaultSize).toInt();
+}
+
 bool Settings::getSearchCaseSensitive() const
 {
     return settings->value("CodeEditor/SearchCaseSensitive", false).toBool();
@@ -504,6 +535,18 @@ void Settings::setFileSystemTreeHeader(const QByteArray &state) const
     settings->setValue("MainWindow/FileSystemTreeHeader", state);
 }
 
+void Settings::setEditorFontFamily(const QString &family)
+{
+    settings->setValue("CodeEditor/FontFamily", family);
+    emit editorFontChanged(getEditorFont());
+}
+
+void Settings::setEditorFontSize(int size)
+{
+    settings->setValue("CodeEditor/FontSize", qBound(5, size, 35));
+    emit editorFontChanged(getEditorFont());
+}
+
 void Settings::setSearchCaseSensitive(bool enabled) const
 {
     settings->setValue("CodeEditor/SearchCaseSensitive", enabled);

+ 6 - 0
src/base/settings.h

@@ -51,6 +51,9 @@ public:
     QByteArray getMainWindowState() const;
     QByteArray getResourceTreeHeader() const;
     QByteArray getFileSystemTreeHeader() const;
+    QFont getEditorFont() const;
+    QString getEditorFontFamily() const;
+    int getEditorFontSize() const;
     bool getSearchCaseSensitive() const;
     bool getSearchByRegex() const;
     bool getWordWrap() const;
@@ -105,6 +108,8 @@ public:
     void setMainWindowState(const QByteArray &state);
     void setResourceTreeHeader(const QByteArray &state) const;
     void setFileSystemTreeHeader(const QByteArray &state) const;
+    void setEditorFontFamily(const QString &family);
+    void setEditorFontSize(int size);
     void setSearchCaseSensitive(bool enabled) const;
     void setSearchByRegex(bool enabled) const;
     void setWordWrap(bool enabled) const;
@@ -123,6 +128,7 @@ public:
 #endif
 
 signals:
+    void editorFontChanged(const QFont &font);
     void recentApkListUpdated();
     void resetDone();
 

+ 10 - 2
src/translations/apk-editor-studio.ru.ts

@@ -916,6 +916,14 @@ Do you want to discard them and exit?</source>
         <source>Theme:</source>
         <translation>Тема:</translation>
     </message>
+    <message>
+        <source>Code Editor Font:</source>
+        <translation>Шрифт редактора кода:</translation>
+    </message>
+    <message>
+        <source>Code Editor Font Size:</source>
+        <translation>Размер шрифта редактора кода:</translation>
+    </message>
     <message>
         <source>Extracted from environment variables by default</source>
         <translation>По умолчанию извлекается из переменных окружения</translation>
@@ -936,12 +944,12 @@ Do you want to discard them and exit?</source>
     <message>
         <source>Initial heap size:</source>
         <extracomment>&quot;Heap&quot; refers to a memory heap. If there is no clear translation in your language, you may also put the original English word in the parentheses.</extracomment>
-        <translation>Начальный размер кучи (heap):</translation>
+        <translation>Начальный размер «кучи» (heap):</translation>
     </message>
     <message>
         <source>Maximum heap size:</source>
         <extracomment>&quot;Heap&quot; refers to a memory heap. If there is no clear translation in your language, you may also put the original English word in the parentheses.</extracomment>
-        <translation>Максимальный размер кучи (heap):</translation>
+        <translation>Максимальный размер «кучи» (heap):</translation>
     </message>
     <message>
         <source>Apktool path:</source>

+ 20 - 12
src/widgets/codeeditor.cpp

@@ -6,6 +6,7 @@
 #include <KSyntaxHighlighting/Definition>
 #include <KSyntaxHighlighting/SyntaxHighlighter>
 #include <QRegularExpression>
+#include <QShortcut>
 
 CodeEditor::CodeEditor(QWidget *parent)
     : QPlainTextEdit(parent)
@@ -17,18 +18,17 @@ CodeEditor::CodeEditor(QWidget *parent)
         : KSyntaxHighlighting::Repository::LightTheme);
     setTheme(defaultTheme);
 
-#if defined(Q_OS_WIN)
-    QFont font("Consolas");
-    font.setPointSize(11);
-#elif defined(Q_OS_MACOS)
-    QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
-    font.setPointSize(12);
-#elif defined(Q_OS_LINUX)
-    QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
-    font.setPointSize(10);
-#endif
-    setFont(font);
-    sidebar->setFont(font);
+    setFont(app->settings->getEditorFont());
+
+    new QShortcut(QKeySequence(QKeySequence::ZoomIn), this, this, [this]() {
+        const int newSize = this->font().pointSize() + 2;
+        app->settings->setEditorFontSize(newSize);
+    });
+
+    new QShortcut(QKeySequence(QKeySequence::ZoomOut), this, this, [this]() {
+        const int newSize = this->font().pointSize() - 2;
+        app->settings->setEditorFontSize(newSize);
+    });
 
     setWordWrapMode(app->settings->getWordWrap()
         ? QTextOption::WrapAtWordBoundaryOrAnywhere
@@ -36,6 +36,7 @@ CodeEditor::CodeEditor(QWidget *parent)
 
     connect(this, &CodeEditor::cursorPositionChanged, this, &CodeEditor::highlightCurrentLine);
     connect(this, &CodeEditor::textChanged, this, &CodeEditor::highlightSearchResults);
+    connect(app->settings, &Settings::editorFontChanged, this, &CodeEditor::setFont);
 }
 
 int CodeEditor::getTabWidth() const
@@ -256,6 +257,13 @@ void CodeEditor::setExtraSelectionGroup(ExtraSelectionGroup group, const QList<Q
     setExtraSelections(allSelections);
 }
 
+void CodeEditor::setFont(const QFont &font)
+{
+    QPlainTextEdit::setFont(font);
+    sidebar->setFont(font);
+    emit blockCountChanged(blockCount());
+}
+
 void CodeEditor::setWordWrap(bool enabled)
 {
     setWordWrapMode(enabled ? QTextOption::WrapAtWordBoundaryOrAnywhere : QTextOption::NoWrap);

+ 1 - 0
src/widgets/codeeditor.h

@@ -46,6 +46,7 @@ public:
     void setDefinition(const KSyntaxHighlighting::Definition &definition);
     void setExtraSelectionGroup(ExtraSelectionGroup group, const QList<QTextEdit::ExtraSelection> &selection);
 
+    void setFont(const QFont &font);
     void setWordWrap(bool enabled);
 
 signals:

+ 13 - 10
src/widgets/codesidebar.cpp

@@ -87,23 +87,26 @@ void CodeSideBar::paintEvent(QPaintEvent *event)
 
         // Folding marker
         if (block.isVisible() && editor->highlighter->startsFoldingRegion(block)) {
+            const int coord1 = foldingMarkerSize / 3.6;
+            const int coord2 = foldingMarkerSize / 2.57;
+            const int penWidth = (foldingMarkerSize / 14) + 1;
             QPainterPath foldingMarker;
             if (!editor->isFolded(block)) {
-                foldingMarker.moveTo(5, 7);
-                foldingMarker.lineTo(foldingMarkerSize / 2, foldingMarkerSize - 7);
-                foldingMarker.lineTo(foldingMarkerSize - 5, 7);
+                foldingMarker.moveTo(coord1, coord2);
+                foldingMarker.lineTo(foldingMarkerSize / 2, foldingMarkerSize - coord2);
+                foldingMarker.lineTo(foldingMarkerSize - coord1, coord2);
             } else if (layoutDirection() == Qt::LeftToRight) {
-                foldingMarker.moveTo(7, 5);
-                foldingMarker.lineTo(foldingMarkerSize - 7, foldingMarkerSize / 2);
-                foldingMarker.lineTo(7, foldingMarkerSize - 5);
+                foldingMarker.moveTo(coord2, coord1);
+                foldingMarker.lineTo(foldingMarkerSize - coord2, foldingMarkerSize / 2);
+                foldingMarker.lineTo(coord2, foldingMarkerSize - coord1);
             } else if (layoutDirection() == Qt::RightToLeft) {
-                foldingMarker.moveTo(foldingMarkerSize - 7, 5);
-                foldingMarker.lineTo(7, foldingMarkerSize / 2);
-                foldingMarker.lineTo(foldingMarkerSize - 7, foldingMarkerSize - 5);
+                foldingMarker.moveTo(foldingMarkerSize - coord2, coord1);
+                foldingMarker.lineTo(coord2, foldingMarkerSize / 2);
+                foldingMarker.lineTo(foldingMarkerSize - coord2, foldingMarkerSize - coord1);
             }
             painter.save();
             painter.setRenderHint(QPainter::Antialiasing);
-            painter.setPen(QPen(QColor(editor->getEditorColor(KSyntaxHighlighting::Theme::LineNumbers)), 2));
+            painter.setPen(QPen(QColor(editor->getEditorColor(KSyntaxHighlighting::Theme::LineNumbers)), penWidth));
             painter.translate(layoutDirection() == Qt::LeftToRight ? width() - foldingMarkerSize : 0, top);
             painter.drawPath(foldingMarker);
             painter.restore();

+ 17 - 0
src/windows/optionsdialog.cpp

@@ -15,6 +15,7 @@
 #include <QCheckBox>
 #include <QComboBox>
 #include <QDialogButtonBox>
+#include <QFontDatabase>
 #include <QFormLayout>
 #include <QGroupBox>
 #include <QLabel>
@@ -94,6 +95,9 @@ void OptionsDialog::load()
     const int themeIndex = comboThemes->findData(app->settings->getTheme());
     comboThemes->setCurrentIndex(themeIndex != -1 ? themeIndex : 0);
 
+    comboFontFamily->setCurrentText(app->settings->getEditorFontFamily());
+    spinboxFontSize->setValue(app->settings->getEditorFontSize());
+
     // Java
 
     fileboxJava->setCurrentPath(app->settings->getJavaPath());
@@ -150,6 +154,8 @@ void OptionsDialog::save()
 
     app->setLanguage(comboLanguages->currentData().toString());
     app->settings->setTheme(comboThemes->currentData().toString());
+    app->settings->setEditorFontFamily(comboFontFamily->currentText());
+    app->settings->setEditorFontSize(spinboxFontSize->value());
 
     // Java
 
@@ -263,6 +269,7 @@ void OptionsDialog::initialize()
     comboLanguages = new QComboBox(this);
 
     auto pageAppearance = new QFormLayout;
+
     comboThemes = new QComboBox(this);
     ThemeRepository themes;
     const auto names = themes.getThemeNames();
@@ -270,8 +277,18 @@ void OptionsDialog::initialize()
         comboThemes->addItem(themes.getTheme(name)->title(), name);
     }
 
+    comboFontFamily = new QComboBox(this);
+    const auto fonts = QFontDatabase().families(QFontDatabase::Any);
+    comboFontFamily->addItems(fonts);
+
+    spinboxFontSize = new QSpinBox(this);
+    spinboxFontSize->setMinimum(5);
+    spinboxFontSize->setMaximum(35);
+
     pageAppearance->addRow(tr("Language:"), comboLanguages);
     pageAppearance->addRow(tr("Theme:"), comboThemes);
+    pageAppearance->addRow(tr("Code Editor Font:"), comboFontFamily);
+    pageAppearance->addRow(tr("Code Editor Font Size:"), spinboxFontSize);
 
     // Java
 

+ 2 - 0
src/windows/optionsdialog.h

@@ -51,6 +51,8 @@ private:
 
     QComboBox *comboLanguages;
     QComboBox *comboThemes;
+    QComboBox *comboFontFamily;
+    QSpinBox *spinboxFontSize;
 
     // Java