From c8b156b3a1f756f34a0ef9229fd82033e2a5cee9 Mon Sep 17 00:00:00 2001 From: Anthony Bilinski Date: Fri, 17 May 2019 00:09:40 -0700 Subject: [PATCH] feat(settings): save friend list sorting mode --- src/persistence/settings.cpp | 18 +++++++++++++ src/persistence/settings.h | 11 ++++++++ src/widget/friendlistwidget.cpp | 45 +++++++++++++++++++-------------- src/widget/friendlistwidget.h | 15 +++++------ src/widget/widget.cpp | 7 +++-- 5 files changed, 66 insertions(+), 30 deletions(-) diff --git a/src/persistence/settings.cpp b/src/persistence/settings.cpp index 706c1a041..c3dba19b5 100644 --- a/src/persistence/settings.cpp +++ b/src/persistence/settings.cpp @@ -346,6 +346,7 @@ void Settings::loadPersonal(QString profileName, const ToxEncrypt* passKey) ps.beginGroup("GUI"); { compactLayout = ps.value("compactLayout", true).toBool(); + sortingMode = static_cast(ps.value("friendSortingMethod", static_cast(FriendListSortingMode::Name)).toInt()); } ps.endGroup(); @@ -610,6 +611,7 @@ void Settings::savePersonal(QString profileName, const ToxEncrypt* passkey) ps.beginGroup("GUI"); { ps.setValue("compactLayout", compactLayout); + ps.setValue("friendSortingMethod", static_cast(sortingMode)); } ps.endGroup(); @@ -2092,6 +2094,22 @@ void Settings::setCompactLayout(bool value) } } +Settings::FriendListSortingMode Settings::getFriendSortingMode() const +{ + QMutexLocker locker{&bigLock}; + return sortingMode; +} + +void Settings::setFriendSortingMode(FriendListSortingMode mode) +{ + QMutexLocker locker{&bigLock}; + + if (mode != sortingMode) { + sortingMode = mode; + emit sortingModeChanged(sortingMode); + } +} + bool Settings::getSeparateWindow() const { QMutexLocker locker{&bigLock}; diff --git a/src/persistence/settings.h b/src/persistence/settings.h index d7f2316c0..0d0ad0005 100644 --- a/src/persistence/settings.h +++ b/src/persistence/settings.h @@ -133,6 +133,12 @@ public: WITHOUT_CHARS = 2 }; + enum class FriendListSortingMode + { + Name, + Activity, + }; + public: static Settings& getInstance(); static void destroyInstance(); @@ -204,6 +210,7 @@ signals: void styleChanged(const QString& style); void themeColorChanged(int color); void compactLayoutChanged(bool enabled); + void sortingModeChanged(FriendListSortingMode mode); void showIdenticonsChanged(bool enabled); // ChatView @@ -515,6 +522,9 @@ public: bool getCompactLayout() const; void setCompactLayout(bool compact); + FriendListSortingMode getFriendSortingMode() const; + void setFriendSortingMode(FriendListSortingMode mode); + bool getSeparateWindow() const; void setSeparateWindow(bool value); @@ -592,6 +602,7 @@ private: bool autoLogin; bool fauxOfflineMessaging; bool compactLayout; + FriendListSortingMode sortingMode; bool groupchatPosition; bool separateWindow; bool dontGroupWindows; diff --git a/src/widget/friendlistwidget.cpp b/src/widget/friendlistwidget.cpp index 7686686aa..755c5ab38 100644 --- a/src/widget/friendlistwidget.cpp +++ b/src/widget/friendlistwidget.cpp @@ -99,9 +99,6 @@ qint64 timeUntilTomorrow() FriendListWidget::FriendListWidget(Widget* parent, bool groupsOnTop) : QWidget(parent) - // Prevent Valgrind from complaining. We're changing this to Name here. - // Must be Activity for change to take effect. - , mode(Activity) , groupsOnTop(groupsOnTop) { listLayout = new FriendListLayout(); @@ -115,7 +112,8 @@ FriendListWidget::FriendListWidget(Widget* parent, bool groupsOnTop) listLayout->removeItem(listLayout->getLayoutOnline()); listLayout->removeItem(listLayout->getLayoutOffline()); - setMode(Name); + mode = Settings::getInstance().getFriendSortingMode(); + sortByMode(mode); onGroupchatPositionChanged(groupsOnTop); dayTimer = new QTimer(this); @@ -147,14 +145,20 @@ FriendListWidget::~FriendListWidget() } } -void FriendListWidget::setMode(Mode mode) +void FriendListWidget::setMode(SortingMode mode) { if (this->mode == mode) return; this->mode = mode; + Settings::getInstance().setFriendSortingMode(mode); - if (mode == Name) { + sortByMode(mode); +} + +void FriendListWidget::sortByMode(SortingMode mode) +{ + if (mode == SortingMode::Name) { circleLayout = new GenericChatItemLayout; circleLayout->getLayout()->setSpacing(0); circleLayout->getLayout()->setMargin(0); @@ -195,7 +199,7 @@ void FriendListWidget::setMode(Mode mode) } reDraw(); - } else if (mode == Activity) { + } else if (mode == SortingMode::Activity) { QLocale ql(Settings::getInstance().getTranslation()); QDate today = QDate::currentDate(); #define COMMENT "Category for sorting friends by activity" @@ -226,7 +230,9 @@ void FriendListWidget::setMode(Mode mode) moveFriends(listLayout->getLayoutOffline()); moveFriends(listLayout->getLayoutOnline()); - moveFriends(circleLayout->getLayout()); + if (circleLayout != nullptr) { + moveFriends(circleLayout->getLayout()); + } for (int i = 0; i < activityLayout->count(); ++i) { QWidget* widget = activityLayout->itemAt(i)->widget(); @@ -279,7 +285,7 @@ CategoryWidget* FriendListWidget::getTimeCategoryWidget(const Friend* frd) const return qobject_cast(widget); } -FriendListWidget::Mode FriendListWidget::getMode() const +FriendListWidget::SortingMode FriendListWidget::getMode() const { return mode; } @@ -314,7 +320,8 @@ void FriendListWidget::removeGroupWidget(GroupWidget* w) void FriendListWidget::removeFriendWidget(FriendWidget* w) { const Friend* contact = w->getFriend(); - if (mode == Activity) { + + if (mode == SortingMode::Activity) { auto* categoryWidget = getTimeCategoryWidget(contact); categoryWidget->removeFriendWidget(w, contact->getStatus()); categoryWidget->setVisible(categoryWidget->hasChatrooms()); @@ -403,7 +410,7 @@ void FriendListWidget::onFriendWidgetRenamed(FriendWidget* friendWidget) { const Friend* contact = friendWidget->getFriend(); auto status = contact->getStatus(); - if (mode == Activity) { + if (mode == SortingMode::Activity) { auto* categoryWidget = getTimeCategoryWidget(contact); categoryWidget->removeFriendWidget(friendWidget, status); categoryWidget->addFriendWidget(friendWidget, status); @@ -425,7 +432,7 @@ void FriendListWidget::onGroupchatPositionChanged(bool top) { groupsOnTop = top; - if (mode != Name) + if (mode != SortingMode::Name) return; listLayout->removeItem(groupLayout.getLayout()); @@ -447,7 +454,7 @@ void FriendListWidget::cycleContacts(GenericChatroomWidget* activeChatroomWidget int index = -1; FriendWidget* friendWidget = qobject_cast(activeChatroomWidget); - if (mode == Activity) { + if (mode == SortingMode::Activity) { if (!friendWidget) { return; } @@ -601,9 +608,9 @@ void FriendListWidget::dropEvent(QDropEvent* event) void FriendListWidget::dayTimeout() { - if (mode == Activity) { - setMode(Name); - setMode(Activity); // Refresh all. + if (mode == SortingMode::Activity) { + setMode(SortingMode::Name); + setMode(SortingMode::Activity); // Refresh all. } dayTimer->start(timeUntilTomorrow()); @@ -611,7 +618,7 @@ void FriendListWidget::dayTimeout() void FriendListWidget::moveWidget(FriendWidget* widget, Status::Status s, bool add) { - if (mode == Name) { + if (mode == SortingMode::Name) { const Friend* f = widget->getFriend(); int circleId = Settings::getInstance().getFriendCircleID(f->getPublicKey()); CircleWidget* circleWidget = CircleWidget::getFromID(circleId); @@ -635,7 +642,7 @@ void FriendListWidget::moveWidget(FriendWidget* widget, Status::Status s, bool a void FriendListWidget::updateActivityTime(const QDateTime& time) { - if (mode != Activity) + if (mode != SortingMode::Activity) return; int timeIndex = static_cast(getTimeBucket(time)); @@ -660,7 +667,7 @@ CircleWidget* FriendListWidget::createCircleWidget(int id) id = Settings::getInstance().addCircle(); // Stop, after it has been created. Code after this is for displaying. - if (mode == Activity) + if (mode == SortingMode::Activity) return nullptr; assert(circleLayout != nullptr); diff --git a/src/widget/friendlistwidget.h b/src/widget/friendlistwidget.h index 8c60ff6e2..73fdee394 100644 --- a/src/widget/friendlistwidget.h +++ b/src/widget/friendlistwidget.h @@ -23,6 +23,7 @@ #include "genericchatitemlayout.h" #include "src/core/core.h" #include "src/model/status.h" +#include "src/persistence/settings.h" #include class QVBoxLayout; @@ -41,16 +42,11 @@ class FriendListWidget : public QWidget { Q_OBJECT public: - enum Mode : uint8_t - { - Name, - Activity, - }; - + using SortingMode = Settings::FriendListSortingMode; explicit FriendListWidget(Widget* parent, bool groupsOnTop = true); ~FriendListWidget(); - void setMode(Mode mode); - Mode getMode() const; + void setMode(SortingMode mode); + SortingMode getMode() const; void addGroupWidget(GroupWidget* widget); void addFriendWidget(FriendWidget* w, Status::Status s, int circleIndex); @@ -89,8 +85,9 @@ private: QLayout* nextLayout(QLayout* layout, bool forward) const; void moveFriends(QLayout* layout); CategoryWidget* getTimeCategoryWidget(const Friend* frd) const; + void sortByMode(SortingMode mode); - Mode mode; + SortingMode mode; bool groupsOnTop; FriendListLayout* listLayout; GenericChatItemLayout* circleLayout = nullptr; diff --git a/src/widget/widget.cpp b/src/widget/widget.cpp index a6da70404..e454dec07 100644 --- a/src/widget/widget.cpp +++ b/src/widget/widget.cpp @@ -173,6 +173,9 @@ void Widget::init() filterDisplayActivity->setCheckable(true); filterDisplayGroup->addAction(filterDisplayActivity); filterMenu->addAction(filterDisplayActivity); + settings.getFriendSortingMode() == FriendListWidget::SortingMode::Name ? + filterDisplayName->setChecked(true) : + filterDisplayActivity->setChecked(true); filterMenu->addSeparator(); filterAllAction = new QAction(this); @@ -2268,9 +2271,9 @@ void Widget::changeDisplayMode() filterDisplayGroup->setEnabled(false); if (filterDisplayGroup->checkedAction() == filterDisplayActivity) { - contactListWidget->setMode(FriendListWidget::Activity); + contactListWidget->setMode(FriendListWidget::SortingMode::Activity); } else if (filterDisplayGroup->checkedAction() == filterDisplayName) { - contactListWidget->setMode(FriendListWidget::Name); + contactListWidget->setMode(FriendListWidget::SortingMode::Name); } searchContacts();