From 9fb4ebff682fd34cbf5452e58bd196ee8913fd5c Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sat, 21 Dec 2013 09:14:03 +0100 Subject: [PATCH] RSS Guard now remembers its size and position, including all nested widgets. --- localization/rssguard_nl.ts | 66 ++++++++++++++++++++--------------- src/core/defs.h.in | 12 +++---- src/core/feedsmodel.cpp | 2 +- src/gui/feedmessageviewer.cpp | 53 +++++++++++++++++++--------- src/gui/feedmessageviewer.h | 10 ++++++ src/gui/formabout.cpp | 2 +- src/gui/formmain.cpp | 35 +++++++++++++++++-- src/gui/formmain.h | 4 +++ 8 files changed, 129 insertions(+), 55 deletions(-) diff --git a/localization/rssguard_nl.ts b/localization/rssguard_nl.ts index 94a6f3167..5ea8c4860 100644 --- a/localization/rssguard_nl.ts +++ b/localization/rssguard_nl.ts @@ -177,7 +177,7 @@ <body>RSS Guard is a (very) tiny feed reader.<br><br>This software is distributed under the terms of GNU General Public License, version 3.<br><br>Contacts:<ul><li><a href="mailto://%1">%1</a> ~email</li><li><a href="%2">%2</a> ~website</li></ul>You can obtain source code for RSS Guard from its website.<br><br><br>Copyrigh (C) 2011-%3 %4</body> - + <body>RSS Guard is een (zeer) makelijk om te gebruiken feed lezer.<br><br>Dit programma is beschikbaar onder te termenvan de GNU General Public License versie 3.<br><br>Contacts:<ul><li><a href="mailto://%1">%1</a> ~email</li><li><a ref="%2">%2</a> ~website </li><ul>U kunt de broncode voor RSS Guard verkrijgen op de website.<br><br><br>Auteursrecht(C)2011-%3 %4</body> @@ -416,15 +416,15 @@ Mark all messages from selected feeds read. This does NOT take message filters into account. - + Markeer alle berichten van geselekteerde feeds als gelezen. Dit zal GEEN bericht filters meenemen in account. Mark all messages from selected feeds unread. This does NOT take message filters into account. - + Markeer alle berichten van geselekteerde feeds als ongelezen. Dit zal GEEN bericht filters meenemen in account. Delete all messages from selected feeds. This does NOT take message filters into account. - + Verwijder alle berichten van geselekteerde feeds. Dit zal GEEN bericht filters meenemen in account. @@ -747,15 +747,15 @@ Current color - + Huidige kleur Executable file of web browser - + Uitvoerbaar bestand van webbrowser Parameters to executable - + Parameter voor exe some keyboard shortcuts are not unique @@ -858,47 +858,47 @@ Id of the message. - + Id van het bericht. Is message read? - + Is bericht gelezen? Is message deleted? - + Is bericht verwijderd? Is message important? - + IS bericht belangrijk? Id of feed which this message belongs to. - + Id van feed waar dit bericht bijhoort. Title of the message. - + Titel van het bericht. Url of the message. - + Url van het bericht. Author of the message. - + De schrijver van het bericht. Creation date of the message. - + Aanmaakdatum van het bericht. Date of the most recent update of the message. - + Datum van het meest recente update van het bericht. Contents of the message. - + Inhoud van het bericht. @@ -945,39 +945,44 @@ %n unread message(s). - - - + + %n ongelezen bericht. + %n ongelezen berichten. ATOM 1.0 - + RDF 1.0 - + RSS 0.90/0.91/0.92 - + RSS 2.0/2.0.1 - + %1 Category type: standard Creation date: %2%3 - + %1 + +Categorie type: standaard +aanmaakdatum: %2%3 This category does not contain any nested items. - + + +Deze categorie bevat geen nested items. %1 @@ -986,7 +991,12 @@ Feed type: %2 URL: %3 Encoding: %4 Language: %5 - + %1 + +Feed type: %2 +URL: %3 +Encodering: %4 +Taal: %5 diff --git a/src/core/defs.h.in b/src/core/defs.h.in index e90eb9024..dd1726036 100755 --- a/src/core/defs.h.in +++ b/src/core/defs.h.in @@ -22,12 +22,12 @@ #define APP_VERSION "@APP_VERSION@" #define APP_USERAGENT QString("@APP_NAME@/@APP_VERSION@ (@APP_URL@) on @CMAKE_SYSTEM@; Webkit/") + qWebKitVersion() -#define TEXT_TITLE_LIMIT 30 -#define MAX_ZOOM_FACTOR 10.0 -#define ICON_SIZE_SETTINGS 16 -#define DATABASE_DRIVER "QSQLITE" -#define NO_PARENT_FEED -1 -#define NO_PARENT_CATEGORY -1 +#define TEXT_TITLE_LIMIT 30 +#define MAX_ZOOM_FACTOR 10.0 +#define ICON_SIZE_SETTINGS 16 +#define DATABASE_DRIVER "QSQLITE" +#define NO_PARENT_CATEGORY -1 +#define TRAY_ICON_BUBBLE_TIMEOUT 15000 #define APP_DB_INIT_FILE "db_init.sql" #define APP_DB_INIT_SPLIT "-- !\n" diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index f5e0b82ad..e2ea00c6b 100644 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -348,7 +348,7 @@ void FeedsModel::assembleFeeds(FeedAssignment feeds) { void FeedsModel::assembleCategories(CategoryAssignment categories) { QHash assignments; - assignments.insert(-1, m_rootItem); + assignments.insert(NO_PARENT_CATEGORY, m_rootItem); // Add top-level categories. while (!categories.isEmpty()) { diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index 824305fa9..bc42322da 100644 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -15,6 +15,7 @@ #include "gui/messagesview.h" #include "gui/feedsview.h" #include "core/messagesproxymodel.h" +#include "core/settings.h" FeedMessageViewer::FeedMessageViewer(QWidget *parent) @@ -26,6 +27,28 @@ FeedMessageViewer::FeedMessageViewer(QWidget *parent) initialize(); initializeViews(); createConnections(); + + loadSize(); +} + +FeedMessageViewer::~FeedMessageViewer() { + qDebug("Destroying FeedMessageViewer instance."); + + saveSize(); +} + +void FeedMessageViewer::saveSize() { + Settings::getInstance()->setValue(APP_CFG_GUI, + "splitter_feeds", + m_feedSplitter->saveState()); + Settings::getInstance()->setValue(APP_CFG_GUI, + "splitter_messages", + m_messageSplitter->saveState()); +} + +void FeedMessageViewer::loadSize() { + m_feedSplitter->restoreState(Settings::getInstance()->value(APP_CFG_GUI, "splitter_feeds").toByteArray()); + m_messageSplitter->restoreState(Settings::getInstance()->value(APP_CFG_GUI, "splitter_messages").toByteArray()); } void FeedMessageViewer::createConnections() { @@ -93,8 +116,8 @@ void FeedMessageViewer::initialize() { void FeedMessageViewer::initializeViews() { // Instantiate needed components. QVBoxLayout *central_layout = new QVBoxLayout(this); - QSplitter *feed_splitter = new QSplitter(Qt::Horizontal, this); - QSplitter *message_splitter = new QSplitter(Qt::Vertical, this); + m_feedSplitter = new QSplitter(Qt::Horizontal, this); + m_messageSplitter = new QSplitter(Qt::Vertical, this); // Set layout properties. central_layout->setMargin(0); @@ -105,30 +128,26 @@ void FeedMessageViewer::initializeViews() { m_messagesView->setFrameStyle(QFrame::NoFrame); // Setup splitters. - message_splitter->setHandleWidth(1); - message_splitter->setChildrenCollapsible(false); - message_splitter->setStretchFactor(0, 1); - message_splitter->addWidget(m_messagesView); - message_splitter->addWidget(m_messagesBrowser); + m_messageSplitter->setHandleWidth(1); + m_messageSplitter->setChildrenCollapsible(false); + m_messageSplitter->setStretchFactor(0, 1); + m_messageSplitter->addWidget(m_messagesView); + m_messageSplitter->addWidget(m_messagesBrowser); - feed_splitter->setHandleWidth(1); - feed_splitter->setChildrenCollapsible(false); - feed_splitter->setStretchFactor(0, 1); - feed_splitter->addWidget(m_feedsView); - feed_splitter->addWidget(message_splitter); + m_feedSplitter->setHandleWidth(1); + m_feedSplitter->setChildrenCollapsible(false); + m_feedSplitter->setStretchFactor(0, 1); + m_feedSplitter->addWidget(m_feedsView); + m_feedSplitter->addWidget(m_messageSplitter); // Add toolbar and main feeds/messages widget to main layout. central_layout->addWidget(m_toolBar); - central_layout->addWidget(feed_splitter); + central_layout->addWidget(m_feedSplitter); // Set layout as active. setLayout(central_layout); } -FeedMessageViewer::~FeedMessageViewer() { - qDebug("Destroying FeedMessageViewer instance."); -} - WebBrowser *FeedMessageViewer::webBrowser() { return m_messagesBrowser; } diff --git a/src/gui/feedmessageviewer.h b/src/gui/feedmessageviewer.h index 821757f32..53dcbcc70 100644 --- a/src/gui/feedmessageviewer.h +++ b/src/gui/feedmessageviewer.h @@ -8,6 +8,7 @@ class WebBrowser; class FeedsView; class MessagesView; class QToolBar; +class QSplitter; class FeedMessageViewer : public TabContent { Q_OBJECT @@ -20,6 +21,12 @@ class FeedMessageViewer : public TabContent { // WebBrowser getter from TabContent interface. WebBrowser *webBrowser(); + // Loads/saves sizes and states of ALL + // underlying widgets, this contains primarily + // splitters, toolbar and views. + void saveSize(); + void loadSize(); + protected: // Initializes some properties of the widget. void initialize(); @@ -33,6 +40,9 @@ class FeedMessageViewer : public TabContent { private: QToolBar *m_toolBar; + QSplitter *m_feedSplitter; + QSplitter *m_messageSplitter; + MessagesView *m_messagesView; FeedsView *m_feedsView; WebBrowser *m_messagesBrowser; diff --git a/src/gui/formabout.cpp b/src/gui/formabout.cpp index 1f926849f..02e3713ae 100644 --- a/src/gui/formabout.cpp +++ b/src/gui/formabout.cpp @@ -66,8 +66,8 @@ FormAbout::FormAbout(QWidget *parent) : QDialog(parent), m_ui(new Ui::FormAbout) APP_REVISION, TextFactory::parseDateTime(QString("%1 %2").arg(__DATE__, __TIME__)).toString(Qt::DefaultLocaleShortDate), - QT_VERSION_STR, qVersion(), + QT_VERSION_STR, APP_NAME)); m_ui->m_txtInfo->setText(tr("RSS Guard is a (very) tiny feed reader." diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index d00d874cf..ae7d8f2b3 100755 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "gui/formmain.h" #include "gui/formabout.h" @@ -35,6 +37,7 @@ FormMain::FormMain(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::FormMain m_ui->m_tabWidget->initializeTabs(); setupIcons(); + setupSize(); } FormMain::~FormMain() { @@ -86,7 +89,7 @@ QList FormMain::getActions() { m_ui->m_actionEditSelectedFeed << m_ui->m_actionDeleteSelectedFeeds; - return actions; + return actions; } void FormMain::prepareMenus() { @@ -109,7 +112,17 @@ void FormMain::prepareMenus() { void FormMain::processExecutionMessage(const QString &message) { qDebug("Received '%s' execution message from another application instance.", qPrintable(message)); - display(); + + if (message == APP_IS_RUNNING) { + if (SystemTrayIcon::isSystemTrayActivated()) { + SystemTrayIcon::getInstance()->showMessage(APP_NAME, + tr("Application is already running."), + QSystemTrayIcon::Information, + TRAY_ICON_BUBBLE_TIMEOUT); + } + + display(); + } } void FormMain::quit() { @@ -155,6 +168,8 @@ void FormMain::onCommitData(QSessionManager &manager) { void FormMain::onAboutToQuit() { qDebug("Cleaning up resources and saving application state before it exits."); + + saveSize(); } bool FormMain::event(QEvent *event) { @@ -206,6 +221,22 @@ void FormMain::setupIcons() { m_ui->m_tabWidget->setupIcons(); } +void FormMain::setupSize() { + QRect screen = qApp->desktop()->screenGeometry(); + + resize(Settings::getInstance()->value(APP_CFG_GUI, + "window_size", + size()).toSize()); + move(Settings::getInstance()->value(APP_CFG_GUI, + "window_position", + screen.center() - rect().center()).toPoint()); +} + +void FormMain::saveSize() { + Settings::getInstance()->setValue(APP_CFG_GUI, "window_position", pos()); + Settings::getInstance()->setValue(APP_CFG_GUI, "window_size", size()); +} + void FormMain::createConnections() { // Core connections. connect(qApp, SIGNAL(commitDataRequest(QSessionManager&)), diff --git a/src/gui/formmain.h b/src/gui/formmain.h index cd7a35526..e8d47a4c3 100644 --- a/src/gui/formmain.h +++ b/src/gui/formmain.h @@ -48,6 +48,10 @@ class FormMain : public QMainWindow { // kind of method and catch ThemeFactoryEvent::type() in its event handler. void setupIcons(); + // Loads saves visual state of the application. + void setupSize(); + void saveSize(); + public slots: // Processes incoming message from another RSS Guard instance. void processExecutionMessage(const QString &message);