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);