From 121b8460b77cd6ecc232e2e1f4743563362d420e Mon Sep 17 00:00:00 2001 From: defnax Date: Tue, 1 Jul 2025 23:27:06 +0200 Subject: [PATCH 1/2] Added forum font size settings --- .../src/gui/gxsforums/CreateGxsForumMsg.cpp | 2 + .../src/gui/gxsforums/CreateGxsForumMsg.h | 3 + .../gui/gxsforums/GxsForumThreadWidget.cpp | 16 ++ .../src/gui/gxsforums/GxsForumThreadWidget.h | 4 + .../src/gui/gxsforums/GxsForumThreadWidget.ui | 188 ++++++++++-------- retroshare-gui/src/gui/settings/ForumPage.cpp | 16 ++ retroshare-gui/src/gui/settings/ForumPage.ui | 70 ++++++- .../src/gui/settings/rsharesettings.cpp | 16 ++ .../src/gui/settings/rsharesettings.h | 3 + retroshare-gui/src/util/FontSizeHandler.cpp | 3 + retroshare-gui/src/util/FontSizeHandler.h | 10 +- 11 files changed, 244 insertions(+), 87 deletions(-) diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp index 4236b6f04..59e0ab3e2 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.cpp @@ -122,6 +122,8 @@ CreateGxsForumMsg::CreateGxsForumMsg(const RsGxsGroupId &fId, const RsGxsMessage ui->hashGroupBox->hide(); + mForumFontSizeHandler.registerFontSize(ui->forumMessage); + #ifndef ENABLE_GENERATE ui->generateCheckBox->hide(); ui->generateSpinBox->hide(); diff --git a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h index 8697fbbc3..a860d076d 100644 --- a/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h +++ b/retroshare-gui/src/gui/gxsforums/CreateGxsForumMsg.h @@ -26,6 +26,7 @@ #include #include #include "gui/common/HashBox.h" +#include "util/FontSizeHandler.h" namespace Ui { class CreateGxsForumMsg; @@ -84,6 +85,8 @@ private: UIStateHelper *mStateHelper; + MessageFontSizeHandler mForumFontSizeHandler; + /** Qt Designer generated object */ Ui::CreateGxsForumMsg *ui; }; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index fd293560f..e04a30b5d 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -299,6 +299,9 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget connect(ui->nextUnreadButton, SIGNAL(clicked()), this, SLOT(nextUnreadMessage())); connect(ui->downloadButton, SIGNAL(clicked()), this, SLOT(downloadAllFiles())); + connect(ui->zoomInButton, SIGNAL(clicked()), this, SLOT(zoom_In())); + connect(ui->zoomOutButton, SIGNAL(clicked()), this, SLOT(zoom_Out())); + connect(ui->filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems(QString))); connect(ui->filterLineEdit, SIGNAL(filterChanged(int)), this, SLOT(filterColumnChanged(int))); @@ -380,6 +383,8 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget mFontSizeHandler.registerFontSize(ui->threadTreeWidget, 1.4f, [this](QAbstractItemView *view, int) { mThreadModel->setFont(view->font()); }); + + mForumSizeHandler.registerFontSize(ui->postText); } void GxsForumThreadWidget::handleEvent_main_thread(std::shared_ptr event) @@ -2099,3 +2104,14 @@ void GxsForumThreadWidget::showAuthorInPeople(const RsGxsForumMsg& msg) MainWindow::showWindow(MainWindow::People); idDialog->navigate(RsGxsId(msg.mMeta.mAuthorId)); } + +void GxsForumThreadWidget::zoom_In() +{ + ui->postText->zoomIn(1); +} + +void GxsForumThreadWidget::zoom_Out() +{ + ui->postText->zoomOut(1); +} + diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index 8e6b1c01b..5b2e417c3 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -161,6 +161,9 @@ private slots: void filterColumnChanged(int column); void filterItems(const QString &text); + void zoom_In(); + void zoom_Out(); + #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) void expandSubtree(); #endif @@ -236,6 +239,7 @@ private: QList mSavedExpandedMessages; FontSizeHandler mFontSizeHandler; + ForumFontSizeHandler mForumSizeHandler; Ui::GxsForumThreadWidget *ui; RsEventsHandlerId_t mEventHandlerId; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index 439234047..bb2e824a3 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -302,6 +302,56 @@ + + + + Qt::Vertical + + + + + + + + 24 + 24 + + + + Qt::NoFocus + + + + + + + :/images/edit_remove24.png:/images/edit_remove24.png + + + true + + + true + + + + + + + Zoom in + + + + + + + + + + + + + + @@ -331,6 +381,13 @@ + + + + + + + @@ -369,6 +426,42 @@ + + + + + 24 + 24 + + + + Qt::NoFocus + + + Download all files + + + Qt::LeftToRight + + + + :/icons/png/download.png:/icons/png/download.png + + + true + + + + + + + Qt::Vertical + + + + + + @@ -433,70 +526,6 @@ - - - - - 24 - 24 - - - - Qt::NoFocus - - - Download all files - - - Qt::LeftToRight - - - - :/icons/png/download.png:/icons/png/download.png - - - true - - - - - - - Qt::Vertical - - - - - - - - - - - - - - - - - Qt::Vertical - - - - - - - By - - - - - - - - - - @@ -510,29 +539,20 @@ - - - - - 24 - 24 - + + + + By - - Qt::NoFocus + + + + + + Zoom out - - - - - :/images/edit_remove24.png:/images/edit_remove24.png - - - true - - - true + - diff --git a/retroshare-gui/src/gui/settings/ForumPage.cpp b/retroshare-gui/src/gui/settings/ForumPage.cpp index ee0d32566..b7e0bd2cb 100644 --- a/retroshare-gui/src/gui/settings/ForumPage.cpp +++ b/retroshare-gui/src/gui/settings/ForumPage.cpp @@ -18,9 +18,12 @@ * * *******************************************************************************/ +#include + #include "ForumPage.h" #include "util/misc.h" #include "rsharesettings.h" +#include "gui/notifyqt.h" ForumPage::ForumPage(QWidget * parent, Qt::WindowFlags flags) : ConfigPage(parent, flags) @@ -38,6 +41,14 @@ ForumPage::ForumPage(QWidget * parent, Qt::WindowFlags flags) connect(ui.minimumFontSize , SIGNAL(valueChanged(int)), this, SLOT(updateFonts())); connect(ui.minimumContrast , SIGNAL(valueChanged(int)), this, SLOT(updateFonts())); + // Font size + QFontDatabase db; + foreach(int size, db.standardSizes()) { + ui.minFontSize->addItem(QString::number(size), size); + } + + connect(ui.minFontSize, SIGNAL(activated(QString)), this, SLOT(updateFonts())) ; + ui.groupFrameSettingsWidget->setType(GroupFrameSettings::Forum) ; } @@ -61,6 +72,8 @@ void ForumPage::load() whileBlocking(ui.minimumFontSize)->setValue(Settings->value("MinimumFontSize", 10).toInt()); whileBlocking(ui.minimumContrast)->setValue(Settings->value("MinimumContrast", 4.5).toDouble()); Settings->endGroup(); + whileBlocking(ui.minFontSize)->setCurrentIndex(ui.minFontSize->findData(Settings->getForumFontSize())); + ui.groupFrameSettingsWidget->loadSettings(GroupFrameSettings::Forum); } @@ -71,4 +84,7 @@ void ForumPage::updateFonts() Settings->setValue("MinimumFontSize", ui.minimumFontSize->value()); Settings->setValue("MinimumContrast", ui.minimumContrast->value()); Settings->endGroup(); + Settings->setForumFontSize(ui.minFontSize->currentData().toInt()); + + NotifyQt::getInstance()->notifySettingsChanged(); } diff --git a/retroshare-gui/src/gui/settings/ForumPage.ui b/retroshare-gui/src/gui/settings/ForumPage.ui index a52638987..2fcab51bd 100644 --- a/retroshare-gui/src/gui/settings/ForumPage.ui +++ b/retroshare-gui/src/gui/settings/ForumPage.ui @@ -7,7 +7,7 @@ 0 0 507 - 340 + 406 @@ -106,6 +106,67 @@ + + + + 0 + 0 + + + + Fonts + + + + + + + + Qt::LeftToRight + + + Minimum font size + + + + + + + + MS Sans Serif + 10 + + + + Qt::ClickFocus + + + Font size + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Tabs @@ -117,7 +178,7 @@ - + Qt::Vertical @@ -133,6 +194,11 @@ + + RSComboBox + QComboBox +
gui/common/RSComboBox.h
+
GroupFrameSettingsWidget QWidget diff --git a/retroshare-gui/src/gui/settings/rsharesettings.cpp b/retroshare-gui/src/gui/settings/rsharesettings.cpp index d878d6c99..535e81bec 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.cpp +++ b/retroshare-gui/src/gui/settings/rsharesettings.cpp @@ -1222,6 +1222,22 @@ void RshareSettings::setMessageFontSize(int value) setValueToGroup("Message", "FontSize", value); } +int RshareSettings::getForumFontSize() +{ +#if defined(Q_OS_DARWIN) + int defaultFontSize = 12; +#else + int defaultFontSize = 11; +#endif + + return valueFromGroup("Forum", "FontSize", defaultFontSize).toInt(); +} + +void RshareSettings::setForumFontSize(int value) +{ + setValueToGroup("Forum", "FontSize", value); +} + #ifdef RS_JSONAPI bool RshareSettings::getJsonApiEnabled() { diff --git a/retroshare-gui/src/gui/settings/rsharesettings.h b/retroshare-gui/src/gui/settings/rsharesettings.h index 317dedb56..c8066a88f 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.h +++ b/retroshare-gui/src/gui/settings/rsharesettings.h @@ -349,6 +349,9 @@ public: int getMessageFontSize(); void setMessageFontSize(int value); + int getForumFontSize(); + void setForumFontSize(int value); + #ifdef RS_JSONAPI bool getJsonApiEnabled(); void setJsonApiEnabled(bool enabled); diff --git a/retroshare-gui/src/util/FontSizeHandler.cpp b/retroshare-gui/src/util/FontSizeHandler.cpp index c184da0de..482287ac0 100644 --- a/retroshare-gui/src/util/FontSizeHandler.cpp +++ b/retroshare-gui/src/util/FontSizeHandler.cpp @@ -136,6 +136,9 @@ int FontSizeHandlerBase::getFontSize() case MESSAGE_FONT_SIZE: return Settings->getMessageFontSize(); + + case FORUM_FONT_SIZE: + return Settings->getForumFontSize(); } return 0; diff --git a/retroshare-gui/src/util/FontSizeHandler.h b/retroshare-gui/src/util/FontSizeHandler.h index bf9c8058b..4b27b0502 100644 --- a/retroshare-gui/src/util/FontSizeHandler.h +++ b/retroshare-gui/src/util/FontSizeHandler.h @@ -46,7 +46,8 @@ public: protected: enum Type { FONT_SIZE, - MESSAGE_FONT_SIZE + MESSAGE_FONT_SIZE, + FORUM_FONT_SIZE }; FontSizeHandlerBase(Type type); @@ -70,4 +71,11 @@ public: MessageFontSizeHandler() : FontSizeHandlerBase(MESSAGE_FONT_SIZE) {} }; +// Class to handle forum font size setting +class ForumFontSizeHandler : public FontSizeHandlerBase +{ +public: + ForumFontSizeHandler() : FontSizeHandlerBase(FORUM_FONT_SIZE) {} +}; + #endif // FONTSIZEHANDLER From ccc191851bff80b0370ac169998a306a6556242e Mon Sep 17 00:00:00 2001 From: defnax Date: Wed, 2 Jul 2025 18:05:14 +0200 Subject: [PATCH 2/2] Added icons for buttons --- .../src/gui/gxsforums/GxsForumThreadWidget.ui | 14 ++++++++++++++ retroshare-gui/src/gui/icons.qrc | 2 ++ retroshare-gui/src/gui/icons/zoom-in.png | Bin 0 -> 4429 bytes retroshare-gui/src/gui/icons/zoom-out.png | Bin 0 -> 4784 bytes 4 files changed, 16 insertions(+) create mode 100644 retroshare-gui/src/gui/icons/zoom-in.png create mode 100644 retroshare-gui/src/gui/icons/zoom-out.png diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index bb2e824a3..eaa067701 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -343,6 +343,13 @@ + + + + :/icons/zoom-in.png:/icons/zoom-in.png + + + true +
@@ -554,6 +561,13 @@ - + + + :/icons/zoom-out.png:/icons/zoom-out.png + + + true + diff --git a/retroshare-gui/src/gui/icons.qrc b/retroshare-gui/src/gui/icons.qrc index ff3771075..36d6ffdee 100644 --- a/retroshare-gui/src/gui/icons.qrc +++ b/retroshare-gui/src/gui/icons.qrc @@ -383,5 +383,7 @@ icons/filetype/dll.svg icons/filetype/collection.svg icons/filetype/patch.svg + icons/zoom-in.png + icons/zoom-out.png diff --git a/retroshare-gui/src/gui/icons/zoom-in.png b/retroshare-gui/src/gui/icons/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4bd87ed599025066752e2ec45b8bd5086b33f2 GIT binary patch literal 4429 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