aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-08 19:18:50 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-08 19:18:50 +0200
commit51f46dce66ac660507dc7abad5506650bc863d7f (patch)
tree7f97264f0a9315b357b9c338519146b572b80a96 /src
parent7caffad75f0e7f7f1b1ce4d9523a67680e9b39a2 (diff)
downloadkristall-51f46dce66ac660507dc7abad5506650bc863d7f.tar.gz
Adds two new options for text display: gophermap rendering with text or icons, all text documents as text/plain, prepares option for text highlighting.
Diffstat (limited to 'src')
-rw-r--r--src/browsertab.cpp11
-rw-r--r--src/geminirenderer.cpp10
-rw-r--r--src/gophermaprenderer.cpp52
-rw-r--r--src/icons.qrc1
-rw-r--r--src/icons/info.svg1
-rw-r--r--src/kristall.hpp8
-rw-r--r--src/kristall.pro1
-rw-r--r--src/main.cpp6
-rw-r--r--src/mainwindow.cpp53
-rw-r--r--src/mainwindow.hpp1
-rw-r--r--src/mainwindow.ui16
-rw-r--r--src/settingsdialog.cpp28
-rw-r--r--src/settingsdialog.hpp2
-rw-r--r--src/settingsdialog.ui122
14 files changed, 238 insertions, 74 deletions
diff --git a/src/browsertab.cpp b/src/browsertab.cpp
index 412c652..4bbfa20 100644
--- a/src/browsertab.cpp
+++ b/src/browsertab.cpp
@@ -5,6 +5,7 @@
#include "settingsdialog.hpp"
#include "gophermaprenderer.hpp"
#include "ioutil.hpp"
+#include "kristall.hpp"
#include <cassert>
#include <QTabWidget>
@@ -260,20 +261,22 @@ void BrowserTab::on_requestComplete(const QByteArray &data, const QString &mime)
this->ui->text_browser->setStyleSheet(QString("QTextBrowser { background-color: %1; }").arg(doc_style.background_color.name()));
- if(mime.startsWith("text/gemini")) {
+ bool plaintext_only = (global_settings.value("text_display").toString() == "plain");
+
+ if(not plaintext_only and mime.startsWith("text/gemini")) {
document = GeminiRenderer::render(
data,
this->current_location,
doc_style,
this->outline);
}
- else if(mime.startsWith("text/gophermap")) {
+ else if(not plaintext_only and mime.startsWith("text/gophermap")) {
document = GophermapRenderer::render(
data,
this->current_location,
doc_style);
}
- else if(mime.startsWith("text/html")) {
+ else if(not plaintext_only and mime.startsWith("text/html")) {
document = std::make_unique<QTextDocument>();
document->setDefaultFont(doc_style.standard_font);
@@ -281,7 +284,7 @@ void BrowserTab::on_requestComplete(const QByteArray &data, const QString &mime)
document->setHtml(QString::fromUtf8(data));
}
#if defined(QT_FEATURE_textmarkdownreader)
- else if(mime.startsWith("text/markdown")) {
+ else if(not plaintext_only and mime.startsWith("text/markdown")) {
document = std::make_unique<QTextDocument>();
document->setDefaultFont(doc_style.standard_font);
document->setDefaultStyleSheet(doc_style.toStyleSheet());
diff --git a/src/geminirenderer.cpp b/src/geminirenderer.cpp
index da2f9e5..a178b65 100644
--- a/src/geminirenderer.cpp
+++ b/src/geminirenderer.cpp
@@ -4,6 +4,9 @@
#include <QTextBlock>
#include <QList>
#include <QStringList>
+#include <QDebug>
+
+#include "kristall.hpp"
static QByteArray trim_whitespace(QByteArray items)
{
@@ -64,9 +67,10 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(
std::unique_ptr<GeminiDocument> result = std::make_unique<GeminiDocument>();
result->setDocumentMargin(themed_style.margin);
result->background_color = themed_style.background_color;
+ result->setDefaultTextOption(no_wrap);
- result->setDefaultTextOption(no_wrap);
+ bool emit_fancy_text = global_settings.value("text_decoration").toBool();
QTextCursor cursor{result.get()};
@@ -228,6 +232,10 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(
}
else
{
+ if(emit_fancy_text)
+ {
+ qDebug() << "implement fancy text emission!";
+ }
cursor.insertText(line + "\n", standard);
}
}
diff --git a/src/gophermaprenderer.cpp b/src/gophermaprenderer.cpp
index 52f4442..d1e3bf6 100644
--- a/src/gophermaprenderer.cpp
+++ b/src/gophermaprenderer.cpp
@@ -9,6 +9,8 @@
#include <QDebug>
#include <QImage>
+#include "kristall.hpp"
+
//Canonical Types
//0 Text File
//1 Gopher submenu or link to another gopher server
@@ -43,21 +45,26 @@ std::unique_ptr<QTextDocument> GophermapRenderer::render(const QByteArray &input
external_link.setFont(themed_style.standard_font);
external_link.setForeground(QBrush(themed_style.external_link_color));
+ bool emit_text_only = (global_settings.value("gophermap_display").toString() == "text");
+
std::unique_ptr<QTextDocument> result = std::make_unique<QTextDocument>();
result->setDocumentMargin(themed_style.margin);
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/binary"), QVariant::fromValue(QImage(":/icons/gopher/binary.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/directory"), QVariant::fromValue(QImage(":/icons/gopher/directory.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/dns"), QVariant::fromValue(QImage(":/icons/gopher/dns.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/error"), QVariant::fromValue(QImage(":/icons/gopher/error.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/gif"), QVariant::fromValue(QImage(":/icons/gopher/gif.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/html"), QVariant::fromValue(QImage(":/icons/gopher/html.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/image"), QVariant::fromValue(QImage(":/icons/gopher/image.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/mirror"), QVariant::fromValue(QImage(":/icons/gopher/mirror.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/search"), QVariant::fromValue(QImage(":/icons/gopher/search.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/sound"), QVariant::fromValue(QImage(":/icons/gopher/sound.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/telnet"), QVariant::fromValue(QImage(":/icons/gopher/telnet.svg")));
- result->addResource(QTextDocument::ImageResource, QUrl("gopher/text"), QVariant::fromValue(QImage(":/icons/gopher/text.svg")));
+ if(not emit_text_only)
+ {
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/binary"), QVariant::fromValue(QImage(":/icons/gopher/binary.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/directory"), QVariant::fromValue(QImage(":/icons/gopher/directory.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/dns"), QVariant::fromValue(QImage(":/icons/gopher/dns.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/error"), QVariant::fromValue(QImage(":/icons/gopher/error.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/gif"), QVariant::fromValue(QImage(":/icons/gopher/gif.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/html"), QVariant::fromValue(QImage(":/icons/gopher/html.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/image"), QVariant::fromValue(QImage(":/icons/gopher/image.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/mirror"), QVariant::fromValue(QImage(":/icons/gopher/mirror.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/search"), QVariant::fromValue(QImage(":/icons/gopher/search.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/sound"), QVariant::fromValue(QImage(":/icons/gopher/sound.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/telnet"), QVariant::fromValue(QImage(":/icons/gopher/telnet.svg")));
+ result->addResource(QTextDocument::ImageResource, QUrl("gopher/text"), QVariant::fromValue(QImage(":/icons/gopher/text.svg")));
+ }
QTextCursor cursor{result.get()};
@@ -169,16 +176,19 @@ std::unique_ptr<QTextDocument> GophermapRenderer::render(const QByteArray &input
qDebug() << line << dst_url;
}
- QTextImageFormat icon_fmt;
- icon_fmt.setName(QString("gopher/%1").arg(icon));
- icon_fmt.setVerticalAlignment(QTextImageFormat::AlignTop);
-
- cursor.insertImage(icon_fmt);
-
- // cursor.insertImage(QImage(QString(":/icons/gopher/%1.svg").arg(icon)));
+ if(emit_text_only)
+ {
+ cursor.insertText("[" + icon + "] ", standard);
+ }
+ else
+ {
+ QTextImageFormat icon_fmt;
+ icon_fmt.setName(QString("gopher/%1").arg(icon));
+ icon_fmt.setVerticalAlignment(QTextImageFormat::AlignTop);
- cursor.insertText(" ");
- // cursor.insertText("[" + icon + "] ", standard);
+ cursor.insertImage(icon_fmt);
+ cursor.insertText(" ");
+ }
QTextCharFormat fmt = standard_link;
fmt.setAnchor(true);
diff --git a/src/icons.qrc b/src/icons.qrc
index 028e0db..a96f1f8 100644
--- a/src/icons.qrc
+++ b/src/icons.qrc
@@ -33,5 +33,6 @@
<file>icons/gopher/sound.svg</file>
<file>icons/gopher/telnet.svg</file>
<file>icons/gopher/text.svg</file>
+ <file>icons/info.svg</file>
</qresource>
</RCC>
diff --git a/src/icons/info.svg b/src/icons/info.svg
new file mode 100644
index 0000000..06d7d6b
--- /dev/null
+++ b/src/icons/info.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M13.5,4A1.5,1.5 0 0,0 12,5.5A1.5,1.5 0 0,0 13.5,7A1.5,1.5 0 0,0 15,5.5A1.5,1.5 0 0,0 13.5,4M13.14,8.77C11.95,8.87 8.7,11.46 8.7,11.46C8.5,11.61 8.56,11.6 8.72,11.88C8.88,12.15 8.86,12.17 9.05,12.04C9.25,11.91 9.58,11.7 10.13,11.36C12.25,10 10.47,13.14 9.56,18.43C9.2,21.05 11.56,19.7 12.17,19.3C12.77,18.91 14.38,17.8 14.54,17.69C14.76,17.54 14.6,17.42 14.43,17.17C14.31,17 14.19,17.12 14.19,17.12C13.54,17.55 12.35,18.45 12.19,17.88C12,17.31 13.22,13.4 13.89,10.71C14,10.07 14.3,8.67 13.14,8.77Z" /></svg> \ No newline at end of file
diff --git a/src/kristall.hpp b/src/kristall.hpp
new file mode 100644
index 0000000..5fbca63
--- /dev/null
+++ b/src/kristall.hpp
@@ -0,0 +1,8 @@
+#ifndef KRISTALL_HPP
+#define KRISTALL_HPP
+
+#include <QSettings>
+
+extern QSettings global_settings;
+
+#endif // KRISTALL_HPP
diff --git a/src/kristall.pro b/src/kristall.pro
index d0bf2c4..52afd74 100644
--- a/src/kristall.pro
+++ b/src/kristall.pro
@@ -46,6 +46,7 @@ HEADERS += \
gopherclient.hpp \
gophermaprenderer.hpp \
ioutil.hpp \
+ kristall.hpp \
mainwindow.hpp \
mediaplayer.hpp \
protocolsetup.hpp \
diff --git a/src/main.cpp b/src/main.cpp
index 2f49049..180a49b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -6,6 +6,8 @@
#include <QCommandLineParser>
#include <QDebug>
+QSettings global_settings { "xqTechnologies", "Kristall" };
+
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
@@ -13,6 +15,10 @@ int main(int argc, char *argv[])
QCommandLineParser cli_parser;
cli_parser.parse(app.arguments());
+ if(not global_settings.contains("start_page")) {
+ global_settings.setValue("start_page", "about:favourites");
+ }
+
MainWindow w(&app);
auto urls = cli_parser.positionalArguments();
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 96ae1da..5bf6211 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -11,20 +11,17 @@
#include <QTextStream>
#include <QFileDialog>
#include "ioutil.hpp"
+#include "kristall.hpp"
MainWindow::MainWindow(QApplication * app, QWidget *parent) :
QMainWindow(parent),
application(app),
- settings("xqTechnologies", "Kristall"),
ui(new Ui::MainWindow),
url_status(new QLabel(this)),
file_size(new QLabel(this)),
file_mime(new QLabel(this)),
load_time(new QLabel(this))
{
- if(not this->settings.contains("start_page")) {
- this->settings.setValue("start_page", "about:favourites");
- }
ui->setupUi(this);
@@ -33,9 +30,9 @@ MainWindow::MainWindow(QApplication * app, QWidget *parent) :
this->statusBar()->addPermanentWidget(this->file_size);
this->statusBar()->addPermanentWidget(this->load_time);
- this->favourites.load(settings);
- this->current_style.load(settings);
- this->protocols.load(settings);
+ this->favourites.load(global_settings);
+ this->current_style.load(global_settings);
+ this->protocols.load(global_settings);
ui->favourites_view->setModel(&favourites);
@@ -69,14 +66,14 @@ MainWindow::MainWindow(QApplication * app, QWidget *parent) :
});
{
- settings.beginGroup("Window State");
- if(settings.contains("geometry")) {
- restoreGeometry(settings.value("geometry").toByteArray());
+ global_settings.beginGroup("Window State");
+ if(global_settings.contains("geometry")) {
+ restoreGeometry(global_settings.value("geometry").toByteArray());
}
- if(settings.contains("state")) {
- restoreState(settings.value("state").toByteArray());
+ if(global_settings.contains("state")) {
+ restoreState(global_settings.value("state").toByteArray());
}
- settings.endGroup();
+ global_settings.endGroup();
}
reloadTheme();
@@ -103,7 +100,7 @@ BrowserTab * MainWindow::addEmptyTab(bool focus_new, bool load_default)
}
if(load_default) {
- tab->navigateTo(QUrl(this->settings.value("start_page").toString()), BrowserTab::DontPush);
+ tab->navigateTo(QUrl(global_settings.value("start_page").toString()), BrowserTab::DontPush);
}
return tab;
@@ -132,20 +129,20 @@ void MainWindow::setUrlPreview(const QUrl &url)
void MainWindow::saveSettings()
{
- this->favourites.save(settings);
- this->current_style.save(settings);
- this->protocols.save(settings);
+ this->favourites.save(global_settings);
+ this->current_style.save(global_settings);
+ this->protocols.save(global_settings);
{
- settings.beginGroup("Window State");
+ global_settings.beginGroup("Window State");
- settings.setValue("geometry", saveGeometry());
- settings.setValue("state", saveState());
+ global_settings.setValue("geometry", saveGeometry());
+ global_settings.setValue("state", saveState());
- settings.endGroup();
+ global_settings.endGroup();
}
- settings.sync();
+ global_settings.sync();
}
void MainWindow::on_browser_tabs_currentChanged(int index)
@@ -225,18 +222,18 @@ void MainWindow::on_actionSettings_triggered()
SettingsDialog dialog;
dialog.setGeminiStyle(this->current_style);
- dialog.setStartPage(this->settings.value("start_page").toString());
+ dialog.setStartPage(global_settings.value("start_page").toString());
dialog.setProtocols(this->protocols);
- dialog.setUiTheme(this->settings.value("theme").toString());
+ dialog.setUiTheme(global_settings.value("theme").toString());
if(dialog.exec() != QDialog::Accepted)
return;
if(auto url = dialog.startPage(); url.isValid()) {
- this->settings.setValue("start_page", url.toString());
+ global_settings.setValue("start_page", url.toString());
}
- this->settings.setValue("theme", dialog.uiTheme());
+ global_settings.setValue("theme", dialog.uiTheme());
this->protocols = dialog.protocols();
this->current_style = dialog.geminiStyle();
@@ -306,7 +303,7 @@ void MainWindow::on_actionAbout_Qt_triggered()
void MainWindow::reloadTheme()
{
- QString theme = settings.value("theme").toString();
+ QString theme = global_settings.value("theme").toString();
if(theme.isEmpty())
theme = "light";
@@ -356,7 +353,7 @@ void MainWindow::on_actionGo_to_home_triggered()
{
BrowserTab * tab = qobject_cast<BrowserTab*>(this->ui->browser_tabs->currentWidget());
if(tab != nullptr) {
- tab->navigateTo(QUrl(this->settings.value("start_page").toString()), BrowserTab::PushAfterSuccess);
+ tab->navigateTo(QUrl(global_settings.value("start_page").toString()), BrowserTab::PushAfterSuccess);
}
}
diff --git a/src/mainwindow.hpp b/src/mainwindow.hpp
index 557744d..f619056 100644
--- a/src/mainwindow.hpp
+++ b/src/mainwindow.hpp
@@ -80,7 +80,6 @@ private:
public:
QApplication * application;
- QSettings settings;
DocumentStyle current_style;
ProtocolSetup protocols;
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 83c8d52..62c05e5 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -231,6 +231,10 @@
<addaction name="menuHelp"/>
</widget>
<action name="actionAbout">
+ <property name="icon">
+ <iconset resource="icons.qrc">
+ <normaloff>:/icons/info.svg</normaloff>:/icons/info.svg</iconset>
+ </property>
<property name="text">
<string>About...</string>
</property>
@@ -249,6 +253,10 @@
</property>
</action>
<action name="actionClose_Tab">
+ <property name="icon">
+ <iconset resource="icons.qrc">
+ <normaloff>:/icons/close.svg</normaloff>:/icons/close.svg</iconset>
+ </property>
<property name="text">
<string>Close Tab</string>
</property>
@@ -308,8 +316,8 @@
</action>
<action name="actionSave_as">
<property name="icon">
- <iconset>
- <normaloff>icons/content-save.svg</normaloff>icons/content-save.svg</iconset>
+ <iconset resource="icons.qrc">
+ <normaloff>:/icons/content-save.svg</normaloff>:/icons/content-save.svg</iconset>
</property>
<property name="text">
<string>Save as...</string>
@@ -335,8 +343,8 @@
</action>
<action name="actionGo_to_home">
<property name="icon">
- <iconset>
- <normaloff>icons/home.svg</normaloff>icons/home.svg</iconset>
+ <iconset resource="icons.qrc">
+ <normaloff>:/icons/home.svg</normaloff>:/icons/home.svg</iconset>
</property>
<property name="text">
<string>Go to home</string>
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index df14fd5..d6b84cf 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -6,6 +6,8 @@
#include <QSettings>
#include <QInputDialog>
+#include "kristall.hpp"
+
SettingsDialog::SettingsDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SettingsDialog),
@@ -28,7 +30,24 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
setGeminiStyle(DocumentStyle { });
-// QSettings settings;
+ if(global_settings.value("gophermap_display").toString() == "text") {
+ this->ui->gophermap_text->setChecked(true);
+ } else {
+ this->ui->gophermap_icon->setChecked(true);
+ }
+
+ if(global_settings.value("text_display").toString() == "plain") {
+ this->ui->fancypants_off->setChecked(true);
+ } else {
+ this->ui->fancypants_on->setChecked(true);
+ }
+
+ if(global_settings.value("text_decoration").toBool()) {
+ this->ui->texthl_on->setChecked(true);
+ } else {
+ this->ui->texthl_off->setChecked(true);
+ }
+
// settings.beginGroup("Themes");
// int items = settings.beginReadArray("Themes");
@@ -346,3 +365,10 @@ void SettingsDialog::on_preset_new_clicked()
}
+
+void SettingsDialog::on_SettingsDialog_accepted()
+{
+ global_settings.setValue("gophermap_display", this->ui->gophermap_text->isChecked() ? "text" : "rendered");
+ global_settings.setValue("text_display", this->ui->fancypants_off->isChecked() ? "plain" : "fancy");
+ global_settings.setValue("text_decoration", this->ui->texthl_on->isChecked());
+}
diff --git a/src/settingsdialog.hpp b/src/settingsdialog.hpp
index 26c0c89..5aa2c77 100644
--- a/src/settingsdialog.hpp
+++ b/src/settingsdialog.hpp
@@ -77,6 +77,8 @@ private slots:
void on_preset_new_clicked();
+ void on_SettingsDialog_accepted();
+
private:
void reloadStylePreview();
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index 16d6cef..23bebf7 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -24,6 +24,16 @@
<string>Generic</string>
</attribute>
<layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_15">
+ <property name="text">
+ <string>UI Theme</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="ui_theme"/>
+ </item>
<item row="1" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
@@ -88,30 +98,109 @@
</property>
</widget>
</item>
+ </layout>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_19">
+ <property name="text">
+ <string>Text Rendering</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
+ <widget class="QRadioButton" name="fancypants_on">
+ <property name="text">
+ <string>Fancy</string>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
+ <property name="checked">
+ <bool>true</bool>
</property>
- </spacer>
+ <attribute name="buttonGroup">
+ <string notr="true">textRenderingBtnGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="fancypants_off">
+ <property name="text">
+ <string>Always plain text</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">textRenderingBtnGroup</string>
+ </attribute>
+ </widget>
</item>
</layout>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_15">
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_18">
<property name="text">
- <string>UI Theme</string>
+ <string>Enable text highlights</string>
</property>
</widget>
</item>
- <item row="0" column="1">
- <widget class="QComboBox" name="ui_theme"/>
+ <item row="4" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QRadioButton" name="texthl_on">
+ <property name="text">
+ <string>On</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">textHighlightsBtnGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="texthl_off">
+ <property name="text">
+ <string>Off</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">textHighlightsBtnGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_20">
+ <property name="text">
+ <string>Gopher Map</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QRadioButton" name="gophermap_icon">
+ <property name="text">
+ <string>Use icons</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">gophermapBtnGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="gophermap_text">
+ <property name="text">
+ <string>Use text only</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">gophermapBtnGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</widget>
@@ -692,4 +781,9 @@
</hints>
</connection>
</connections>
+ <buttongroups>
+ <buttongroup name="textRenderingBtnGroup"/>
+ <buttongroup name="textHighlightsBtnGroup"/>
+ <buttongroup name="gophermapBtnGroup"/>
+ </buttongroups>
</ui>