Rework default folders feature

This commit is contained in:
Eric Kotato 2020-07-02 03:34:22 +03:00
parent f8f70fe828
commit 532243092b
13 changed files with 167 additions and 35 deletions

View file

@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h"
#include "history/history.h"
#include "main/main_session.h"
#include "main/main_account.h"
#include "window/window_session_controller.h"
#include "window/window_controller.h"
#include "apiwrap.h"
@ -637,7 +638,8 @@ void EditFilterBox(
name->setFocusFast();
});
const auto isCurrent = filter.id() == cDefaultFilterId();
const auto defaultFilterId = window->session().account().defaultFilterId();
const auto isCurrent = filter.id() == defaultFilterId;
const auto checkboxDefault = content->add(
object_ptr<Ui::Checkbox>(
box,
@ -783,10 +785,11 @@ void EditExistingFilter(
MTP_int(id),
tl
)).send();
const auto isCurrentDefault = result.id() == cDefaultFilterId();
const auto defaultFilterId = session->account().defaultFilterId();
const auto isCurrentDefault = result.id() == defaultFilterId;
if ((isCurrentDefault && !result.isDefault())
|| (!isCurrentDefault && result.isDefault())) {
cSetDefaultFilterId(result.isDefault() ? result.id() : 0);
session->account().setDefaultFilterId(result.isDefault() ? result.id() : 0);
Kotato::JsonSettings::Write();
}
};

View file

@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "dialogs/dialogs_main_list.h"
#include "ui/ui_utility.h"
#include "main/main_session.h"
#include "main/main_account.h"
#include "apiwrap.h"
namespace Data {
@ -100,6 +101,7 @@ ChatFilter ChatFilter::FromTL(
all.begin(),
all.end()
};
const auto defaultFilterId = owner->session().account().defaultFilterId();
return ChatFilter(
data.vid().v,
qs(data.vtitle()),
@ -108,7 +110,7 @@ ChatFilter ChatFilter::FromTL(
std::move(list),
std::move(pinned),
{ never.begin(), never.end() },
(data.vid().v == cDefaultFilterId()));
(data.vid().v == defaultFilterId));
});
}
@ -472,6 +474,7 @@ const ChatFilter &ChatFilters::applyUpdatedPinned(
}
}
}
const auto defaultFilterId = _owner->session().account().defaultFilterId();
set(ChatFilter(
id,
i->title(),
@ -480,7 +483,7 @@ const ChatFilter &ChatFilters::applyUpdatedPinned(
std::move(always),
std::move(pinned),
i->never(),
(id == cDefaultFilterId())));
(id == defaultFilterId)));
return *i;
}

View file

@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "mainwindow.h"
#include "mainwidget.h"
#include "main/main_session.h"
#include "main/main_account.h"
#include "main/main_session_settings.h"
#include "apiwrap.h"
#include "base/event_filter.h"
@ -696,10 +697,11 @@ void Widget::escape() {
if (controller()->openedFolder().current()) {
controller()->closeFolder();
} else if (!onCancelSearch()) {
const auto defaultFilterId = session().account().defaultFilterId();
if (controller()->activeChatEntryCurrent().key) {
emit cancelled();
} else if (controller()->activeChatsFilterCurrent() != cDefaultFilterId()) {
controller()->setActiveChatsFilter(cDefaultFilterId());
} else if (controller()->activeChatsFilterCurrent() != defaultFilterId) {
controller()->setActiveChatsFilter(defaultFilterId);
}
} else if (!_searchInChat && !controller()->selectingPeer()) {
if (controller()->activeChatEntryCurrent().key) {

View file

@ -137,6 +137,7 @@ QByteArray GenerateSettingsJson(bool areDefault = false) {
auto settingsFonts = QJsonObject();
auto settingsFolders = QJsonObject();
auto settingsFoldersDefault = QJsonObject();
auto settingsScales = QJsonArray();
auto settingsReplaces = QJsonArray();
@ -173,6 +174,22 @@ QByteArray GenerateSettingsJson(bool areDefault = false) {
a << i.key() << i.value();
settingsReplaces << a;
}
const auto defaultFilterIdMap = cDefaultFilterId();
for (auto i = defaultFilterIdMap.constBegin(), e = defaultFilterIdMap.constEnd(); i != e; ++i) {
auto value = i.value();
if (value == 0) {
continue;
}
auto key = QString::number(std::abs(i.key()));
if (i.key() < 0) {
key.prepend("test_");
}
settingsFoldersDefault.insert(key, value);
}
}
settings.insert(qsl("sticker_height"), StickerHeight());
@ -199,7 +216,7 @@ QByteArray GenerateSettingsJson(bool areDefault = false) {
settingsFonts.insert(qsl("use_system_font"), cUseSystemFont());
settingsFonts.insert(qsl("use_original_metrics"), cUseOriginalMetrics());
settingsFolders.insert(qsl("default"), cDefaultFilterId());
settingsFolders.insert(qsl("default"), settingsFoldersDefault);
settingsFolders.insert(qsl("count_unmuted_only"), cUnmutedFilterCounterOnly());
settingsFolders.insert(qsl("hide_edit_button"), cHideFilterEditButton());
settingsFolders.insert(qsl("hide_names"), cHideFilterNames());
@ -443,10 +460,38 @@ bool Manager::readCustomFile() {
});
ReadObjectOption(settings, "folders", [&](auto o) {
ReadIntOption(o, "default", [&](auto v) {
cSetDefaultFilterId(v);
auto isDefaultFilterRead = ReadIntOption(o, "default", [&](auto v) {
SetDefaultFilterId(0, v);
});
if (!isDefaultFilterRead) {
ReadObjectOption(o, "default", [&](auto f) {
if (f.empty()) {
return;
}
bool isInt;
for (auto i = f.begin(), e = f.end(); i != e; ++i) {
auto value = i.value().toInt(0);
if (value == 0) {
continue;
}
auto key = i.key();
if (key.startsWith("test_")) {
key = key.mid(5).prepend("-");
}
auto account_id = key.toInt(&isInt, 10);
if (isInt) {
SetDefaultFilterId(account_id, value);
}
}
});
}
ReadBoolOption(o, "count_unmuted_only", [&](auto v) {
cSetUnmutedFilterCounterOnly(v);
});

View file

@ -149,7 +149,26 @@ bool gDisableTrayCounter = false;
bool gUseTelegramPanelIcon = false;
int gCustomAppIcon = 0;
int gDefaultFilterId = 0;
DefaultFilterMap gDefaultFilterId;
void SetDefaultFilterId(int account, int filter) {
if (gDefaultFilterId.contains(account)) {
gDefaultFilterId[account] = filter;
} else {
gDefaultFilterId.insert(account, filter);
}
}
int DefaultFilterId(int account) {
if (gDefaultFilterId.contains(account)) {
return gDefaultFilterId[account];
}
return 0;
}
bool HasDefaultFilterId(int account) {
return gDefaultFilterId.contains(account);
}
bool ClearDefaultFilterId(int account) {
return gDefaultFilterId.remove(account);
}
bool gUnmutedFilterCounterOnly = false;
bool gHideFilterEditButton = false;
bool gHideFilterNames = false;

View file

@ -105,7 +105,12 @@ DeclareSetting(bool, DisableTrayCounter);
DeclareSetting(bool, UseTelegramPanelIcon);
DeclareSetting(int, CustomAppIcon);
DeclareSetting(int, DefaultFilterId);
using DefaultFilterMap = QMap<int, int>;
DeclareRefSetting(DefaultFilterMap, DefaultFilterId);
void SetDefaultFilterId(int account, int filter);
int DefaultFilterId(int account);
bool HasDefaultFilterId(int account);
bool ClearDefaultFilterId(int account);
DeclareSetting(bool, UnmutedFilterCounterOnly);
DeclareSetting(bool, HideFilterEditButton);
DeclareSetting(bool, HideFilterNames);

View file

@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "main/main_session.h"
#include "main/main_domain.h"
#include "main/main_session_settings.h"
#include "kotato/json_settings.h"
#include "facades.h"
namespace Main {
@ -188,6 +189,19 @@ void Account::createSession(
_sessionValue = _session.get();
Ensures(_session != nullptr);
const auto defaultFilterUserId = _mtp->isTestMode()
? -session().userId()
: session().userId();
if (HasDefaultFilterId(0)) {
const auto newDefaultFilterId = DefaultFilterId(0);
ClearDefaultFilterId(0);
setDefaultFilterId(newDefaultFilterId);
Kotato::JsonSettings::Write();
} else {
_defaultFilterId = DefaultFilterId(defaultFilterUserId);
}
}
void Account::destroySession(DestroyReason reason) {
@ -577,6 +591,22 @@ void Account::destroyStaleAuthorizationKeys() {
}
}
void Account::setDefaultFilterId(int id) {
Expects(_mtp != nullptr);
Expects(_session != nullptr);
_defaultFilterId = id;
const auto defaultFilterUserId = _mtp->isTestMode()
? -session().userId()
: session().userId();
if (id == 0) {
ClearDefaultFilterId(defaultFilterUserId);
} else {
SetDefaultFilterId(defaultFilterUserId, id);
}
}
void Account::resetAuthorizationKeys() {
Expects(_mtp != nullptr);

View file

@ -107,6 +107,11 @@ public:
return _lifetime;
}
[[nodiscard]] int defaultFilterId() {
return _defaultFilterId;
}
void setDefaultFilterId(int id);
private:
static constexpr auto kDefaultSaveDelay = crl::time(1000);
enum class DestroyReason {
@ -152,6 +157,7 @@ private:
MTP::Instance::Fields _mtpFields;
MTP::AuthKeysList _mtpKeysToDestroy;
bool _loggingOut = false;
int _defaultFilterId = 0;
rpl::lifetime _lifetime;

View file

@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_chat_filters.h"
#include "history/history.h"
#include "main/main_session.h"
#include "main/main_account.h"
#include "window/window_session_controller.h"
#include "window/window_controller.h"
#include "ui/layers/generic_box.h"
@ -312,11 +313,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
not_null<Window::SessionController*> controller,
not_null<Ui::VerticalLayout*> container) {
auto &lifetime = container->lifetime();
const auto currentDefaultId = cDefaultFilterId();
const auto session = &controller->session();
const auto account = &session->account();
const auto currentDefaultId = account->defaultFilterId();
localNewFilterId = kFiltersLimit;
currentDefaultRemoved = false;
const auto session = &controller->session();
AddSkip(container, st::settingsSectionSkip);
AddSubsectionTitle(container, tr::lng_filters_subtitle());
@ -343,7 +346,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
button->removeRequests(
) | rpl::start_with_next([=] {
button->setRemoved(true);
if (find(button)->filter.id() == cDefaultFilterId()) {
if (find(button)->filter.id() == account->defaultFilterId()) {
currentDefaultRemoved = true;
}
find(button)->removed = true;
@ -353,7 +356,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
if (showLimitReached()) {
return;
}
if (find(button)->filter.id() == cDefaultFilterId()) {
if (find(button)->filter.id() == account->defaultFilterId()) {
currentDefaultRemoved = false;
}
button->setRemoved(false);
@ -366,10 +369,10 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
}
const auto doneCallback = [=](const Data::ChatFilter &result) {
find(button)->filter = result;
const auto isCurrentDefault = result.id() == cDefaultFilterId();
const auto isCurrentDefault = result.id() == account->defaultFilterId();
if ((isCurrentDefault && !result.isDefault())
|| (!isCurrentDefault && result.isDefault())) {
cSetDefaultFilterId(result.isDefault() ? result.id() : 0);
account->setDefaultFilterId(result.isDefault() ? result.id() : 0);
}
button->updateData(result);
};
@ -432,7 +435,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
}
const auto doneCallback = [=](const Data::ChatFilter &result) {
if (result.isDefault()) {
cSetDefaultFilterId(result.id());
account->setDefaultFilterId(result.id());
}
addFilter(result);
};
@ -528,8 +531,8 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
continue;
} else if (!ranges::contains(list, id, &Data::ChatFilter::id)) {
result.emplace(row.button, chooseNextId());
if (cDefaultFilterId() == id) {
cSetDefaultFilterId(localId);
if (account->defaultFilterId() == id) {
account->setDefaultFilterId(localId);
}
}
}
@ -589,10 +592,10 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
realFilters.saveOrder(order, previousId);
}
if (currentDefaultRemoved) {
cSetDefaultFilterId(0);
account->setDefaultFilterId(0);
controller->setActiveChatsFilter(0);
}
if (currentDefaultId != cDefaultFilterId()) {
if (currentDefaultId != account->defaultFilterId()) {
Kotato::JsonSettings::Write();
}
};

View file

@ -23,6 +23,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/emoji_config.h"
#include "chat_helpers/emoji_sets_manager.h"
#include "window/window_session_controller.h"
#include "window/window_filters_menu.h"
#include "window/themes/window_theme.h"
#include "window/themes/window_theme_editor.h"
#include "boxes/confirm_box.h"
@ -68,6 +69,7 @@ void Controller::showAccount(not_null<Main::Account*> account) {
}, session->lifetime());
}
if (session && session->settings().dialogsFiltersEnabled()) {
ResetFiltersFirstLoad();
_sessionController->toggleFiltersMenu(true);
} else {
sideBarChanged();

View file

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/window_session_controller.h"
#include "window/window_controller.h"
#include "main/main_session.h"
#include "main/main_account.h"
#include "data/data_session.h"
#include "data/data_chat_filters.h"
#include "data/data_folder.h"
@ -61,6 +62,10 @@ bool FiltersFirstLoad = true;
} // namespace
void ResetFiltersFirstLoad() {
FiltersFirstLoad = true;
}
FiltersMenu::FiltersMenu(
not_null<Ui::RpWidget*> parent,
not_null<SessionController*> session)
@ -101,6 +106,7 @@ void FiltersMenu::setup() {
}, _outer.lifetime());
const auto filters = &_session->session().data().chatsFilters();
_activeFilterId = _session->activeChatsFilterCurrent();
rpl::single(
rpl::empty_value()
) | rpl::then(
@ -109,7 +115,6 @@ void FiltersMenu::setup() {
refresh();
}, _outer.lifetime());
_activeFilterId = _session->activeChatsFilterCurrent();
_session->activeChatsFilter(
) | rpl::filter([=](FilterId id) {
return id != _activeFilterId;
@ -200,7 +205,7 @@ void FiltersMenu::refresh() {
}
if (FiltersFirstLoad) {
_session->setActiveChatsFilter(cDefaultFilterId());
_session->setActiveChatsFilter(_session->session().account().defaultFilterId());
FiltersFirstLoad = false;
}
}
@ -321,11 +326,12 @@ void FiltersMenu::showMenu(QPoint position, FilterId id) {
if (i == end(_filters)) {
return;
}
const auto defaultFilterId = _session->session().account().defaultFilterId();
_popupMenu = base::make_unique_q<Ui::PopupMenu>(i->second.get());
_popupMenu->addAction(
tr::lng_filters_context_edit(tr::now),
crl::guard(&_outer, [=] { showEditBox(id); }));
if (cDefaultFilterId() != id) {
if (defaultFilterId != id) {
_popupMenu->addAction(
tr::ktg_filters_context_make_default(tr::now),
crl::guard(&_outer, [=] { setDefaultFilter(id); }));
@ -345,11 +351,12 @@ void FiltersMenu::showAllMenu(QPoint position) {
_popupMenu = nullptr;
return;
}
const auto defaultFilterId = _session->session().account().defaultFilterId();
_popupMenu = base::make_unique_q<Ui::PopupMenu>(_all);
_popupMenu->addAction(
tr::ktg_filters_context_edit_all(tr::now),
crl::guard(&_outer, [=] { _session->showSettings(Settings::Type::Folders); }));
if (cDefaultFilterId() != 0) {
if (defaultFilterId != 0) {
_popupMenu->addAction(
tr::ktg_filters_context_make_default(tr::now),
crl::guard(&_outer, [=] { setDefaultFilter(0); }));
@ -359,8 +366,9 @@ void FiltersMenu::showAllMenu(QPoint position) {
}
void FiltersMenu::setDefaultFilter(FilterId id) {
if (cDefaultFilterId() != id) {
cSetDefaultFilterId(id);
const auto defaultFilterId = _session->session().account().defaultFilterId();
if (defaultFilterId != id) {
_session->session().account().setDefaultFilterId(id);
Kotato::JsonSettings::Write();
}
}
@ -378,6 +386,7 @@ void FiltersMenu::showRemoveBox(FilterId id) {
}
void FiltersMenu::remove(FilterId id) {
const auto defaultFilterId = _session->session().account().defaultFilterId();
_session->session().data().chatsFilters().apply(MTP_updateDialogFilter(
MTP_flags(MTPDupdateDialogFilter::Flag(0)),
MTP_int(id),
@ -387,8 +396,8 @@ void FiltersMenu::remove(FilterId id) {
MTP_int(id),
MTPDialogFilter()
)).send();
if (id == cDefaultFilterId()) {
cSetDefaultFilterId(0);
if (id == defaultFilterId) {
_session->session().account().setDefaultFilterId(0);
Kotato::JsonSettings::Write();
if (id == _session->activeChatsFilterCurrent()) {
_session->setActiveChatsFilter(0);

View file

@ -26,6 +26,8 @@ namespace Window {
class SessionController;
void ResetFiltersFirstLoad();
class FiltersMenu final {
public:
FiltersMenu(

View file

@ -39,6 +39,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "mainwidget.h"
#include "mainwindow.h"
#include "main/main_session.h"
#include "main/main_account.h"
#include "main/main_session_settings.h"
#include "apiwrap.h"
#include "support/support_helper.h"
@ -290,8 +291,9 @@ void SessionController::checkOpenedFilter() {
const auto &list = session().data().chatsFilters().list();
const auto i = ranges::find(list, filterId, &Data::ChatFilter::id);
if (i == end(list)) {
const auto j = ranges::find(list, FilterId(cDefaultFilterId()), &Data::ChatFilter::id);
setActiveChatsFilter(j == end(list) ? 0 : cDefaultFilterId());
const auto defaultFilterId = session().account().defaultFilterId();
const auto j = ranges::find(list, FilterId(defaultFilterId), &Data::ChatFilter::id);
setActiveChatsFilter(j == end(list) ? 0 : defaultFilterId);
}
}
}
@ -311,10 +313,11 @@ void SessionController::openFolder(not_null<Data::Folder*> folder) {
}
void SessionController::closeFolder(bool force) {
if (cDefaultFilterId() == 0 || force) {
const auto defaultFilterId = session().account().defaultFilterId();
if (defaultFilterId == 0 || force) {
_openedFolder = nullptr;
} else {
setActiveChatsFilter(cDefaultFilterId());
setActiveChatsFilter(defaultFilterId);
checkOpenedFilter();
}
}