From 0ba0e2fc18159b92ecd1872ae26a9bcbc46c8405 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 29 Jan 2014 08:53:37 +0100 Subject: [PATCH] Icons now fully changeable for categories. --- resources/misc/db_init.sql | 4 +- src/core/feedsmodelstandardcategory.cpp | 4 +- src/core/feedsmodelstandardfeed.cpp | 4 +- src/core/settings.cpp | 4 +- src/gui/feedsview.cpp | 10 ++++ src/gui/formstandardcategorydetails.cpp | 74 ++++++++++++++++++++++++- src/gui/formstandardcategorydetails.h | 14 +++++ src/gui/formstandardcategorydetails.ui | 23 +++++++- src/gui/iconfactory.cpp | 4 +- src/gui/iconfactory.h | 3 +- 10 files changed, 128 insertions(+), 16 deletions(-) diff --git a/resources/misc/db_init.sql b/resources/misc/db_init.sql index 968b27f67..f1fc1ef42 100644 --- a/resources/misc/db_init.sql +++ b/resources/misc/db_init.sql @@ -64,9 +64,9 @@ CREATE TABLE IF NOT EXISTS Messages ( FOREIGN KEY (feed) REFERENCES Feeds (id) ); -- ! -INSERT INTO Categories (id, parent_id, title, description, date_created, type) VALUES (1, -1, 'Linux', 'Collections of GNU/Linux-related feeds.', 1388678961000, 0); +INSERT INTO Categories (id, parent_id, title, description, date_created, type, icon) VALUES (1, -1, 'Linux', 'Collections of GNU/Linux-related feeds.', 1388678961000, 0, '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'); -- ! -INSERT INTO Categories (id, parent_id, title, description, date_created, type) VALUES (2, -1, 'RSS Guard', 'News and updates on RSS Guard.', 1388678961000, 0); +INSERT INTO Categories (id, parent_id, title, description, date_created, type, icon) VALUES (2, -1, 'RSS Guard', 'News and updates on RSS Guard.', 1388678961000, 0, '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'); -- ! INSERT INTO Feeds (title, description, date_created, category, encoding, url, type) VALUES ('Linux Today', 'Linux Today - Linux News on Internet Time.', 1388678961000, 1, 'UTF-8', 'http://feeds.feedburner.com/linuxtoday/linux?format=xml', 1); -- ! diff --git a/src/core/feedsmodelstandardcategory.cpp b/src/core/feedsmodelstandardcategory.cpp index 24360c46b..b12f1c5d1 100755 --- a/src/core/feedsmodelstandardcategory.cpp +++ b/src/core/feedsmodelstandardcategory.cpp @@ -70,9 +70,7 @@ QVariant FeedsModelStandardCategory::data(int column, int role) const { case Qt::DecorationRole: if (column == FDS_MODEL_TITLE_INDEX) { - return m_icon.isNull() ? - IconThemeFactory::instance()->fromTheme("folder-black") : - m_icon; + return m_icon; } else { return QVariant(); diff --git a/src/core/feedsmodelstandardfeed.cpp b/src/core/feedsmodelstandardfeed.cpp index 9a77c344c..d7cd4ec6e 100755 --- a/src/core/feedsmodelstandardfeed.cpp +++ b/src/core/feedsmodelstandardfeed.cpp @@ -64,9 +64,7 @@ QVariant FeedsModelStandardFeed::data(int column, int role) const { case Qt::DecorationRole: if (column == FDS_MODEL_TITLE_INDEX) { - return m_icon.isNull() ? - IconThemeFactory::instance()->fromTheme("application-rss+xml") : - m_icon; + return m_icon; } else { return QVariant(); diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 87eac3941..1d2219d1a 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -86,12 +86,12 @@ QSettings::Status Settings::setupSettings() { // a upravovat dané vlastnosti // do FOrmSettings Webbrowser & proxy pridat tab "Advanced" a tam // naflakat vsecky zajimavy attributy - QWebSettings::globalSettings()->setAttribute(QWebSettings::DnsPrefetchEnabled, + /*QWebSettings::globalSettings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true); QWebSettings::globalSettings()->setAttribute(QWebSettings::AutoLoadImages, false); QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled, - false); + false);*/ qDebug("Initializing settings in '%s' (non-portable way).", qPrintable(QDir::toNativeSeparators(home_path_file))); diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index e26f3b688..e9f70df63 100644 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -104,6 +104,9 @@ void FeedsView::addNewStandardCategory() { } delete form_pointer.data(); + + // Changes are done, unlock the update master lock. + SystemFactory::instance()->applicationCloseLock()->unlock(); } void FeedsView::editStandardCategory(FeedsModelStandardCategory *category) { @@ -161,6 +164,8 @@ void FeedsView::editSelectedItem() { // Feed is selected. } + // Changes are done, unlock the update master lock. + SystemFactory::instance()->applicationCloseLock()->unlock(); } void FeedsView::deleteSelectedItem() { @@ -188,6 +193,8 @@ void FeedsView::deleteSelectedItem() { QItemSelectionModel *selection_model = selectionModel(); if (!current_index.isValid()) { + // Changes are done, unlock the update master lock and exit. + SystemFactory::instance()->applicationCloseLock()->unlock(); return; } @@ -207,6 +214,9 @@ void FeedsView::deleteSelectedItem() { // Item WAS NOT removed, either database-related error occurred // or update is undergoing. } + + // Changes are done, unlock the update master lock. + SystemFactory::instance()->applicationCloseLock()->unlock(); } void FeedsView::markSelectedFeedsReadStatus(int read) { diff --git a/src/gui/formstandardcategorydetails.cpp b/src/gui/formstandardcategorydetails.cpp index 69cd766fe..931779cdb 100644 --- a/src/gui/formstandardcategorydetails.cpp +++ b/src/gui/formstandardcategorydetails.cpp @@ -8,12 +8,16 @@ #include "gui/iconthemefactory.h" #include "gui/feedsview.h" #include "gui/baselineedit.h" +#include "gui/messagebox.h" #include #include #include #include #include +#include +#include +#include FormStandardCategoryDetails::FormStandardCategoryDetails(FeedsModel *model, @@ -26,6 +30,7 @@ FormStandardCategoryDetails::FormStandardCategoryDetails(FeedsModel *model, // Initialize text boxes. onTitleChanged(QString()); + onDescriptionChanged(QString()); } FormStandardCategoryDetails::~FormStandardCategoryDetails() { @@ -33,10 +38,18 @@ FormStandardCategoryDetails::~FormStandardCategoryDetails() { } void FormStandardCategoryDetails::createConnections() { + // General connections. connect(m_ui->m_buttonBox, SIGNAL(accepted()), this, SLOT(apply())); connect(m_ui->m_txtTitle->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onTitleChanged(QString))); + connect(m_ui->m_txtDescription->lineEdit(), SIGNAL(textChanged(QString)), + this, SLOT(onDescriptionChanged(QString))); + + // Icon connections. + connect(m_actionLoadIconFromFile, SIGNAL(triggered()), this, SLOT(onLoadIconFromFile())); + connect(m_actionNoIcon, SIGNAL(triggered()), this, SLOT(onNoIconSelected())); + connect(m_actionUseDefaultIcon, SIGNAL(triggered()), this, SLOT(onUseDefaultIcon())); } void FormStandardCategoryDetails::setEditableCategory(FeedsModelStandardCategory *editable_category) { @@ -88,7 +101,6 @@ void FormStandardCategoryDetails::apply() { } } else { - // TODO: edit category if (m_feedsModel->editStandardCategory(m_editableCategory, new_category)) { accept(); } @@ -101,14 +113,49 @@ void FormStandardCategoryDetails::apply() { void FormStandardCategoryDetails::onTitleChanged(const QString &new_title){ if (new_title.size() >= MIN_CATEGORY_NAME_LENGTH) { m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); - m_ui->m_txtTitle->setStatus(LineEditWithStatus::Ok, tr("This category name is ok.")); + m_ui->m_txtTitle->setStatus(LineEditWithStatus::Ok, tr("Category name is ok.")); } else { m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); - m_ui->m_txtTitle->setStatus(LineEditWithStatus::Error, tr("This category name is too short.")); + m_ui->m_txtTitle->setStatus(LineEditWithStatus::Error, tr("Category name is too short.")); } } +void FormStandardCategoryDetails::onDescriptionChanged(const QString &new_description) { + if (new_description.isEmpty()) { + m_ui->m_txtDescription->setStatus(LineEditWithStatus::Warning, tr("Please, enter some description.")); + } + else { + m_ui->m_txtDescription->setStatus(LineEditWithStatus::Ok, tr("The description os ok.")); + } +} + +void FormStandardCategoryDetails::onNoIconSelected() { + m_ui->m_btnIcon->setIcon(QIcon()); +} + +void FormStandardCategoryDetails::onLoadIconFromFile() { + QFileDialog dialog(this, tr("Select icon file for the category"), + QDir::homePath(), tr("Images (*.bmp *.jpg *.jpeg *.png *.svg *.tga)")); + dialog.setFileMode(QFileDialog::ExistingFile); + dialog.setWindowIcon(IconThemeFactory::instance()->fromTheme("image-x-generic")); + dialog.setOptions(QFileDialog::DontUseNativeDialog | QFileDialog::ReadOnly); + dialog.setViewMode(QFileDialog::Detail); + dialog.setLabelText(QFileDialog::Accept, tr("Select icon")); + dialog.setLabelText(QFileDialog::Reject, tr("Cancel")); + dialog.setLabelText(QFileDialog::LookIn, tr("Look in:")); + dialog.setLabelText(QFileDialog::FileName, tr("Icon name:")); + dialog.setLabelText(QFileDialog::FileType, tr("Icon type:")); + + if (dialog.exec() == QDialog::Accepted) { + m_ui->m_btnIcon->setIcon(QIcon(dialog.selectedFiles().value(0))); + } +} + +void FormStandardCategoryDetails::onUseDefaultIcon() { + m_ui->m_btnIcon->setIcon(IconThemeFactory::instance()->fromTheme("folder-black")); +} + void FormStandardCategoryDetails::initialize() { m_ui = new Ui::FormStandardCategoryDetails(); m_ui->setupUi(this); @@ -117,7 +164,28 @@ void FormStandardCategoryDetails::initialize() { setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::Dialog); setWindowIcon(IconThemeFactory::instance()->fromTheme("document-new")); + // Setup button box. m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + +#if !defined(Q_OS_WIN) + MessageBox::iconify(m_ui->m_buttonBox); +#endif + + // Setup menu & actions for icon selection. + m_iconMenu = new QMenu(tr("Icon selection"), this); + m_actionLoadIconFromFile = new QAction(IconThemeFactory::instance()->fromTheme("image-x-generic"), + tr("Load icon from file..."), + this); + m_actionNoIcon = new QAction(IconThemeFactory::instance()->fromTheme("edit-delete"), + tr("No icon"), + this); + m_actionUseDefaultIcon = new QAction(IconThemeFactory::instance()->fromTheme("folder-black"), + tr("Use default icon"), + this); + m_iconMenu->addAction(m_actionLoadIconFromFile); + m_iconMenu->addAction(m_actionUseDefaultIcon); + m_iconMenu->addAction(m_actionNoIcon); + m_ui->m_btnIcon->setMenu(m_iconMenu); } void FormStandardCategoryDetails::loadCategories(const QList categories, diff --git a/src/gui/formstandardcategorydetails.h b/src/gui/formstandardcategorydetails.h index 9b7edd09c..39d0d312f 100644 --- a/src/gui/formstandardcategorydetails.h +++ b/src/gui/formstandardcategorydetails.h @@ -14,6 +14,8 @@ class FeedsModelCategory; class FeedsModelStandardCategory; class FeedsModel; class FeedsModelRootItem; +class QMenu; +class QAction; class FormStandardCategoryDetails : public QDialog { @@ -42,10 +44,17 @@ class FormStandardCategoryDetails : public QDialog { int exec(FeedsModelStandardCategory *input_category); protected slots: + // Applies changes. void apply(); // Trigerred when title/description changes. void onTitleChanged(const QString &new_title); + void onDescriptionChanged(const QString &new_description); + + // Icon selectors. + void onNoIconSelected(); + void onLoadIconFromFile(); + void onUseDefaultIcon(); protected: // Sets the category which will be edited. @@ -66,6 +75,11 @@ class FormStandardCategoryDetails : public QDialog { Ui::FormStandardCategoryDetails *m_ui; FeedsModelStandardCategory *m_editableCategory; FeedsModel *m_feedsModel; + + QMenu *m_iconMenu; + QAction *m_actionLoadIconFromFile; + QAction *m_actionUseDefaultIcon; + QAction *m_actionNoIcon; }; #endif // FORMCATEGORYDETAILS_H diff --git a/src/gui/formstandardcategorydetails.ui b/src/gui/formstandardcategorydetails.ui index 4f6f1f290..c75107815 100644 --- a/src/gui/formstandardcategorydetails.ui +++ b/src/gui/formstandardcategorydetails.ui @@ -64,6 +64,12 @@ + + + 0 + 0 + + 40 @@ -71,7 +77,22 @@ - + + + + + 20 + 20 + + + + QToolButton::InstantPopup + + + false + + + Qt::NoArrow diff --git a/src/gui/iconfactory.cpp b/src/gui/iconfactory.cpp index fbb77cc69..55e1e2d96 100644 --- a/src/gui/iconfactory.cpp +++ b/src/gui/iconfactory.cpp @@ -7,6 +7,8 @@ IconFactory::IconFactory() { } QIcon IconFactory::fromByteArray(QByteArray array) { + array = QByteArray::fromBase64(array); + QIcon icon; QBuffer buffer(&array); buffer.open(QIODevice::ReadOnly); @@ -27,5 +29,5 @@ QByteArray IconFactory::toByteArray(const QIcon &icon) { out << icon; buffer.close(); - return array; + return array.toBase64(); } diff --git a/src/gui/iconfactory.h b/src/gui/iconfactory.h index 02080c540..70ca26477 100644 --- a/src/gui/iconfactory.h +++ b/src/gui/iconfactory.h @@ -9,7 +9,8 @@ class IconFactory { explicit IconFactory(); public: - // Used to store/retrieve QIcons from/to database. + // Used to store/retrieve QIcons from/to database via Base64-encoded + // byte array. static QIcon fromByteArray(QByteArray array); static QByteArray toByteArray(const QIcon &icon); };