diff --git a/resources/icons.qrc b/resources/icons.qrc index 40e04c62a..ee20715ed 100644 --- a/resources/icons.qrc +++ b/resources/icons.qrc @@ -7,7 +7,9 @@ ./graphics/Breeze/categories/32/applications-science.svg ./graphics/Breeze/categories/32/applications-system.svg ./graphics/Breeze/actions/32/arrow-down.svg + ./graphics/Breeze/actions/32/arrow-down-double.svg ./graphics/Breeze/actions/32/arrow-up.svg + ./graphics/Breeze/actions/32/arrow-up-double.svg ./graphics/Breeze/actions/32/call-start.svg ./graphics/Breeze/actions/32/dialog-cancel.svg ./graphics/Breeze/status/64/dialog-error.svg @@ -31,10 +33,13 @@ ./graphics/Breeze/places/96/folder.svg ./graphics/Breeze/actions/22/format-indent-more.svg ./graphics/Breeze/actions/22/format-justify-fill.svg + ./graphics/Breeze/actions/22/format-text-bold.svg + ./graphics/Breeze/actions/32/go-down.svg ./graphics/Breeze/actions/64/go-home.svg ./graphics/Breeze/actions/32/go-jump.svg ./graphics/Breeze/actions/32/go-next.svg ./graphics/Breeze/actions/32/go-previous.svg + ./graphics/Breeze/actions/32/go-up.svg ./graphics/Breeze/actions/22/gtk-cancel.svg ./graphics/Breeze/actions/22/gtk-edit.svg ./graphics/Breeze/actions/32/help-about.svg @@ -75,7 +80,9 @@ ./graphics/Breeze Dark/categories/32/applications-science.svg ./graphics/Breeze Dark/categories/32/applications-system.svg ./graphics/Breeze Dark/actions/32/arrow-down.svg + ./graphics/Breeze Dark/actions/32/arrow-down-double.svg ./graphics/Breeze Dark/actions/32/arrow-up.svg + ./graphics/Breeze Dark/actions/32/arrow-up-double.svg ./graphics/Breeze Dark/actions/32/call-start.svg ./graphics/Breeze Dark/actions/32/dialog-cancel.svg ./graphics/Breeze Dark/status/64/dialog-error.svg @@ -99,10 +106,13 @@ ./graphics/Breeze Dark/places/96/folder.svg ./graphics/Breeze Dark/actions/22/format-indent-more.svg ./graphics/Breeze Dark/actions/22/format-justify-fill.svg + ./graphics/Breeze Dark/actions/22/format-text-bold.svg + ./graphics/Breeze Dark/actions/32/go-down.svg ./graphics/Breeze Dark/actions/64/go-home.svg ./graphics/Breeze Dark/actions/32/go-jump.svg ./graphics/Breeze Dark/actions/32/go-next.svg ./graphics/Breeze Dark/actions/32/go-previous.svg + ./graphics/Breeze Dark/actions/32/go-up.svg ./graphics/Breeze Dark/actions/22/gtk-cancel.svg ./graphics/Breeze Dark/actions/22/gtk-edit.svg ./graphics/Breeze Dark/actions/32/help-about.svg @@ -166,10 +176,13 @@ ./graphics/Faenza/places/64/folder.png ./graphics/Faenza/actions/64/format-indent-more.png ./graphics/Faenza/actions/64/format-justify-fill.png + ./graphics/Faenza/actions/64/format-text-bold.png + ./graphics/Faenza/actions/64/go-down.png ./graphics/Faenza/actions/64/go-home.png ./graphics/Faenza/actions/64/go-jump.png ./graphics/Faenza/actions/64/go-next.png ./graphics/Faenza/actions/64/go-previous.png + ./graphics/Faenza/actions/64/go-up.png ./graphics/Faenza/actions/64/gtk-cancel.png ./graphics/Faenza/actions/64/gtk-edit.png ./graphics/Faenza/actions/64/help-about.png @@ -211,7 +224,9 @@ ./graphics/Numix/22/categories/applications-science.svg ./graphics/Numix/22/categories/applications-system.svg ./graphics/Numix/22/actions/arrow-down.svg + ./graphics/Numix/22/actions/arrow-down-double.svg ./graphics/Numix/22/actions/arrow-up.svg + ./graphics/Numix/22/actions/arrow-up-double.svg ./graphics/Numix/22/actions/call-start.svg ./graphics/Numix/22/actions/dialog-cancel.svg ./graphics/Numix/22/status/dialog-error.svg @@ -238,10 +253,13 @@ ./graphics/Numix/22/places/folder.svg ./graphics/Numix/22/actions/format-indent-more.svg ./graphics/Numix/22/actions/format-justify-fill.svg + ./graphics/Numix/22/actions/format-text-bold.svg + ./graphics/Numix/22/actions/go-down.svg ./graphics/Numix/22/actions/go-home.svg ./graphics/Numix/22/actions/go-jump.svg ./graphics/Numix/22/actions/go-next.svg ./graphics/Numix/22/actions/go-previous.svg + ./graphics/Numix/22/actions/go-up.svg ./graphics/Numix/22/actions/gtk-cancel.svg ./graphics/Numix/22/actions/gtk-edit.svg ./graphics/Numix/22/categories/help-about.svg diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index f395b437e..17dd58c13 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -2161,33 +2161,22 @@ bool DatabaseQueries::deleteCategory(const QSqlDatabase& db, int id) { } void DatabaseQueries::moveItem(RootItem* item, bool move_top, bool move_bottom, int move_index, const QSqlDatabase& db) { - switch (item->kind()) { - case RootItem::Kind::Feed: - moveFeed(item->toFeed(), move_top, move_bottom, move_index, db); - break; - - case RootItem::Kind::Category: - break; - - case RootItem::Kind::ServiceRoot: - break; - - default: - return; + if (item->kind() != RootItem::Kind::Feed && + item->kind() != RootItem::Kind::Category && + item->kind() != RootItem::Kind::ServiceRoot) { + return; } -} -void DatabaseQueries::moveFeed(Feed* feed, bool move_top, bool move_bottom, int move_index, const QSqlDatabase& db) { - auto neighbors = feed->parent()->childItems(); - int max_sort_order = boolinq::from(neighbors).select([](RootItem* it) { - return it->kind() == RootItem::Kind::Feed ? it->sortOrder() : 0; + auto neighbors = item->parent()->childItems(); + int max_sort_order = boolinq::from(neighbors).select([=](RootItem* it) { + return it->kind() == item->kind() ? it->sortOrder() : 0; }).max(); - if ((!move_top && !move_bottom && feed->sortOrder() == move_index) || /* Item is already sorted OK. */ + if ((!move_top && !move_bottom && item->sortOrder() == move_index) || /* Item is already sorted OK. */ (!move_top && !move_bottom && move_index < 0 ) || /* Order cannot be smaller than 0 if we do not move to begin/end. */ (!move_top && !move_bottom && move_index > max_sort_order ) || /* Cannot move past biggest sort order. */ - (move_top && feed->sortOrder() == 0) || /* Item is already on top. */ - (move_bottom && feed->sortOrder() == max_sort_order) || /* Item is already on bottom. */ + (move_top && item->sortOrder() == 0) || /* Item is already on top. */ + (move_bottom && item->sortOrder() == max_sort_order) || /* Item is already on bottom. */ max_sort_order <= 0) { /* We only have 1 item, nothing to sort. */ return; } @@ -2201,20 +2190,52 @@ void DatabaseQueries::moveFeed(Feed* feed, bool move_top, bool move_bottom, int move_index = max_sort_order; } - int move_low = qMin(move_index, feed->sortOrder()); - int move_high = qMax(move_index, feed->sortOrder()); + int move_low = qMin(move_index, item->sortOrder()); + int move_high = qMax(move_index, item->sortOrder()); + QString parent_field, table_name; - if (feed->sortOrder() > move_index) { - q.prepare(QSL("UPDATE Feeds SET ordr = ordr + 1 " - "WHERE account_id = :account_id AND category = :category AND ordr < :move_high AND ordr >= :move_low;")); + switch (item->kind()) { + case RootItem::Kind::Feed: + parent_field = QSL("category"); + table_name = QSL("Feeds"); + break; + + case RootItem::Kind::Category: + parent_field = QSL("parent_id"); + table_name = QSL("Categories"); + break; + + case RootItem::Kind::ServiceRoot: + table_name = QSL("Accounts"); + break; + } + + if (item->kind() == RootItem::Kind::ServiceRoot) { + if (item->sortOrder() > move_index) { + q.prepare(QSL("UPDATE Accounts SET ordr = ordr + 1 " + "WHERE ordr < :move_high AND ordr >= :move_low;")); + } + else { + q.prepare(QSL("UPDATE Accounts SET ordr = ordr - 1 " + "WHERE ordr > :move_low AND ordr <= :move_high;")); + } } else { - q.prepare(QSL("UPDATE Feeds SET ordr = ordr - 1 " - "WHERE account_id = :account_id AND category = :category AND ordr > :move_low AND ordr <= :move_high;")); + if (item->sortOrder() > move_index) { + q.prepare(QSL("UPDATE %1 SET ordr = ordr + 1 " + "WHERE account_id = :account_id AND %2 = :category AND ordr < :move_high AND ordr >= :move_low;") + .arg(table_name, parent_field)); + } + else { + q.prepare(QSL("UPDATE %1 SET ordr = ordr - 1 " + "WHERE account_id = :account_id AND %2 = :category AND ordr > :move_low AND ordr <= :move_high;") + .arg(table_name, parent_field)); + } + + q.bindValue(QSL(":account_id"), item->getParentServiceRoot()->accountId()); + q.bindValue(QSL(":category"), item->parent()->id()); } - q.bindValue(QSL(":account_id"), feed->getParentServiceRoot()->accountId()); - q.bindValue(QSL(":category"), feed->parent()->id()); q.bindValue(QSL(":move_low"), move_low); q.bindValue(QSL(":move_high"), move_high); @@ -2222,8 +2243,8 @@ void DatabaseQueries::moveFeed(Feed* feed, bool move_top, bool move_bottom, int throw ApplicationException(q.lastError().text()); } - q.prepare(QSL("UPDATE Feeds SET ordr = :ordr WHERE id = :id;")); - q.bindValue(QSL(":id"), feed->id()); + q.prepare(QSL("UPDATE %1 SET ordr = :ordr WHERE id = :id;").arg(table_name)); + q.bindValue(QSL(":id"), item->kind() == RootItem::Kind::ServiceRoot ? item->toServiceRoot()->accountId() : item->id()); q.bindValue(QSL(":ordr"), move_index); if (!q.exec()) { @@ -2231,22 +2252,22 @@ void DatabaseQueries::moveFeed(Feed* feed, bool move_top, bool move_bottom, int } // Fix live sort orders. - if (feed->sortOrder() > move_index) { + if (item->sortOrder() > move_index) { boolinq::from(neighbors).where([=](RootItem* it) { - return it->kind() == RootItem::Kind::Feed && it->sortOrder() < move_high && it->sortOrder() >= move_low; + return it->kind() == item->kind() && it->sortOrder() < move_high && it->sortOrder() >= move_low; }).for_each([](RootItem* it) { it->setSortOrder(it->sortOrder() + 1); }); } else { boolinq::from(neighbors).where([=](RootItem* it) { - return it->kind() == RootItem::Kind::Feed && it->sortOrder() > move_low && it->sortOrder() <= move_high; + return it->kind() == item->kind() && it->sortOrder() > move_low && it->sortOrder() <= move_high; }).for_each([](RootItem* it) { it->setSortOrder(it->sortOrder() - 1); }); } - feed->setSortOrder(move_index); + item->setSortOrder(move_index); } MessageFilter* DatabaseQueries::addMessageFilter(const QSqlDatabase& db, const QString& title, diff --git a/src/librssguard/database/databasequeries.h b/src/librssguard/database/databasequeries.h index 17b6e4ab1..26cca9a2c 100644 --- a/src/librssguard/database/databasequeries.h +++ b/src/librssguard/database/databasequeries.h @@ -136,7 +136,6 @@ class DatabaseQueries { // Item order methods. static void moveItem(RootItem* item, bool move_top, bool move_bottom, int move_index, const QSqlDatabase& db); - static void moveFeed(Feed* feed, bool move_top, bool move_bottom, int move_index, const QSqlDatabase& db); // Message filters operators. static bool purgeLeftoverMessageFilterAssignments(const QSqlDatabase& db, int account_id); diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 7a155cd8f..70e413b7a 100644 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -621,10 +621,10 @@ void FormMain::setupIcons() { m_ui->m_actionAddCategoryIntoSelectedItem->setIcon(icon_theme_factory->fromTheme(QSL("folder"))); m_ui->m_actionMessageFilters->setIcon(icon_theme_factory->fromTheme(QSL("view-list-details"))); - m_ui->m_actionFeedMoveUp->setIcon(icon_theme_factory->fromTheme(QSL("arrow-up"))); - m_ui->m_actionFeedMoveDown->setIcon(icon_theme_factory->fromTheme(QSL("arrow-down"))); - m_ui->m_actionFeedMoveTop->setIcon(icon_theme_factory->fromTheme(QSL("arrow-up-double"))); - m_ui->m_actionFeedMoveBottom->setIcon(icon_theme_factory->fromTheme(QSL("arrow-down-double"))); + m_ui->m_actionFeedMoveUp->setIcon(icon_theme_factory->fromTheme(QSL("arrow-up"), QSL("go-up"))); + m_ui->m_actionFeedMoveDown->setIcon(icon_theme_factory->fromTheme(QSL("arrow-down"), QSL("go-down"))); + m_ui->m_actionFeedMoveTop->setIcon(icon_theme_factory->fromTheme(QSL("arrow-up-double"), QSL("go-up"))); + m_ui->m_actionFeedMoveBottom->setIcon(icon_theme_factory->fromTheme(QSL("arrow-down-double"), QSL("go-down"))); // Tabs & web browser. m_ui->m_actionTabNewWebBrowser->setIcon(icon_theme_factory->fromTheme(QSL("tab-new"))); diff --git a/src/librssguard/gui/feedsview.cpp b/src/librssguard/gui/feedsview.cpp index 8e11710df..07b4fdb14 100644 --- a/src/librssguard/gui/feedsview.cpp +++ b/src/librssguard/gui/feedsview.cpp @@ -483,6 +483,15 @@ QMenu* FeedsView::initializeContextMenuService(RootItem* clicked_item) { m_contextMenuService->addAction(qApp->mainForm()->m_ui->m_actionAddFeedIntoSelectedItem); } + if (!qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::SortAlphabetically)).toBool()) { + m_contextMenuService->addSeparator(); + m_contextMenuService->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveUp); + m_contextMenuService->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveDown); + m_contextMenuService->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveTop); + m_contextMenuService->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveBottom); + } + if (!specific_actions.isEmpty()) { m_contextMenuService->addSeparator(); m_contextMenuService->addActions(specific_actions); @@ -683,6 +692,15 @@ QMenu* FeedsView::initializeContextMenuCategories(RootItem* clicked_item) { m_contextMenuCategories->addAction(qApp->mainForm()->m_ui->m_actionAddFeedIntoSelectedItem); } + if (!qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::SortAlphabetically)).toBool()) { + m_contextMenuCategories->addSeparator(); + m_contextMenuCategories->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveUp); + m_contextMenuCategories->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveDown); + m_contextMenuCategories->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveTop); + m_contextMenuCategories->addAction(qApp->mainForm()->m_ui->m_actionFeedMoveBottom); + } + if (!specific_actions.isEmpty()) { m_contextMenuCategories->addSeparator(); m_contextMenuCategories->addActions(specific_actions);