Option to set folder as default when editing

This commit is contained in:
Eric Kotato 2020-03-30 08:10:26 +03:00
parent 581bbc0d00
commit d819c07823
7 changed files with 87 additions and 8 deletions

View file

@ -2460,4 +2460,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"ktg_settings_recent_stickers_limit#other" = "Recent stickers: show {count} stickers";
"ktg_settings_recent_stickers_limit_none" = "Recent stickers: hide all";
"ktg_filters_default" = "Default folder";
// Keys finished

View file

@ -97,5 +97,6 @@
"many": "Недавние стикеры: показывать {count} стикеров",
"other": "Недавние стикеры: показывать {count} стикеров"
},
"ktg_settings_recent_stickers_limit_none": "Недавние стикеры: скрыть все"
"ktg_settings_recent_stickers_limit_none": "Недавние стикеры: скрыть все",
"ktg_filters_default": "Папка по умолчанию"
}

View file

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "chat_helpers/emoji_suggestions_widget.h"
#include "ui/layers/generic_box.h"
#include "ui/text/text_utilities.h"
#include "ui/widgets/checkbox.h"
#include "ui/widgets/buttons.h"
#include "ui/widgets/input_fields.h"
#include "ui/effects/panel_animation.h"
@ -19,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_chat_filters.h"
#include "data/data_peer.h"
#include "data/data_session.h"
#include "core/kotato_settings.h"
#include "settings/settings_common.h"
#include "base/event_filter.h"
#include "lang/lang_keys.h"
@ -539,6 +541,19 @@ void EditFilterBox(
name->setFocusFast();
});
const auto isCurrent = filter.id() == cDefaultFilterId();
const auto checkboxDefault = content->add(
object_ptr<Ui::Checkbox>(
box,
tr::ktg_filters_default(tr::now),
(creating ? false : isCurrent),
st::defaultBoxCheckbox),
style::margins(
st::boxPadding.left(),
st::boxPadding.bottom(),
st::boxPadding.right(),
st::boxPadding.bottom()));
AddSkip(content);
AddDivider(content);
AddSkip(content);
@ -618,6 +633,7 @@ void EditFilterBox(
const auto save = [=] {
const auto title = name->getLastText().trimmed();
const auto rules = data->current();
const auto checked = checkboxDefault && checkboxDefault->checked();
const auto result = Data::ChatFilter(
rules.id(),
title,
@ -625,7 +641,8 @@ void EditFilterBox(
rules.flags(),
rules.always(),
rules.pinned(),
rules.never());
rules.never(),
checked);
if (title.isEmpty()) {
name->showError();
return;
@ -670,6 +687,12 @@ void EditExistingFilter(
MTP_int(id),
tl
)).send();
const auto isCurrentDefault = result.id() == cDefaultFilterId();
if ((isCurrentDefault && !result.isDefault())
|| (!isCurrentDefault && result.isDefault())) {
cSetDefaultFilterId(result.isDefault() ? result.id() : 0);
KotatoSettings::Write();
}
};
window->window().show(Box(
EditFilterBox,

View file

@ -29,6 +29,9 @@ constexpr auto kLoadExceptionsPerRequest = 100;
} // namespace
ChatFilter::ChatFilter(FilterId id) : _id(id) {
}
ChatFilter::ChatFilter(
FilterId id,
const QString &title,
@ -36,14 +39,16 @@ ChatFilter::ChatFilter(
Flags flags,
base::flat_set<not_null<History*>> always,
std::vector<not_null<History*>> pinned,
base::flat_set<not_null<History*>> never)
base::flat_set<not_null<History*>> never,
bool isDefault)
: _id(id)
, _title(title)
, _iconEmoji(iconEmoji)
, _always(std::move(always))
, _pinned(std::move(pinned))
, _never(std::move(never))
, _flags(flags) {
, _flags(flags)
, _isDefault(isDefault) {
}
ChatFilter ChatFilter::FromTL(
@ -102,7 +107,8 @@ ChatFilter ChatFilter::FromTL(
flags,
std::move(list),
std::move(pinned),
{ never.begin(), never.end() });
{ never.begin(), never.end() },
(data.vid().v == cDefaultFilterId()));
});
}
@ -154,6 +160,10 @@ QString ChatFilter::title() const {
return _title;
}
bool ChatFilter::isDefault() const {
return _isDefault;
}
QString ChatFilter::iconEmoji() const {
return _iconEmoji;
}
@ -465,7 +475,8 @@ const ChatFilter &ChatFilters::applyUpdatedPinned(
i->flags(),
std::move(always),
std::move(pinned),
i->never()));
i->never(),
(id == cDefaultFilterId())));
return *i;
}

View file

@ -38,6 +38,7 @@ public:
static constexpr int kPinnedLimit = 100;
ChatFilter() = default;
ChatFilter(FilterId id);
ChatFilter(
FilterId id,
const QString &title,
@ -45,7 +46,8 @@ public:
Flags flags,
base::flat_set<not_null<History*>> always,
std::vector<not_null<History*>> pinned,
base::flat_set<not_null<History*>> never);
base::flat_set<not_null<History*>> never,
bool isDefault = false);
[[nodiscard]] static ChatFilter FromTL(
const MTPDialogFilter &data,
@ -54,6 +56,7 @@ public:
[[nodiscard]] FilterId id() const;
[[nodiscard]] QString title() const;
[[nodiscard]] bool isDefault() const;
[[nodiscard]] QString iconEmoji() const;
[[nodiscard]] Flags flags() const;
[[nodiscard]] const base::flat_set<not_null<History*>> &always() const;
@ -70,6 +73,7 @@ private:
std::vector<not_null<History*>> _pinned;
base::flat_set<not_null<History*>> _never;
Flags _flags;
bool _isDefault = false;
};

View file

@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/wrap/slide_wrap.h"
#include "ui/painter.h"
#include "ui/filter_icons.h"
#include "core/kotato_settings.h"
#include "settings/settings_common.h"
#include "lang/lang_keys.h"
#include "apiwrap.h"
@ -39,6 +40,8 @@ namespace {
constexpr auto kRefreshSuggestedTimeout = 7200 * crl::time(1000);
constexpr auto kFiltersLimit = 10;
auto currentDefaultRemoved = false;
auto localNewFilterId = kFiltersLimit;
using Flag = Data::ChatFilter::Flag;
using Flags = Data::ChatFilter::Flags;
@ -309,6 +312,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
not_null<Window::SessionController*> controller,
not_null<Ui::VerticalLayout*> container) {
auto &lifetime = container->lifetime();
const auto currentDefaultId = cDefaultFilterId();
localNewFilterId = kFiltersLimit;
currentDefaultRemoved = false;
const auto session = &controller->session();
AddSkip(container, st::settingsSectionSkip);
@ -337,6 +343,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
button->removeRequests(
) | rpl::start_with_next([=] {
button->setRemoved(true);
if (find(button)->filter.id() == cDefaultFilterId()) {
currentDefaultRemoved = true;
}
find(button)->removed = true;
}, button->lifetime());
button->restoreRequests(
@ -344,6 +353,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
if (showLimitReached()) {
return;
}
if (find(button)->filter.id() == cDefaultFilterId()) {
currentDefaultRemoved = false;
}
button->setRemoved(false);
find(button)->removed = false;
}, button->lifetime());
@ -354,6 +366,11 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
}
const auto doneCallback = [=](const Data::ChatFilter &result) {
find(button)->filter = result;
const auto isCurrentDefault = result.id() == cDefaultFilterId();
if ((isCurrentDefault && !result.isDefault())
|| (!isCurrentDefault && result.isDefault())) {
cSetDefaultFilterId(result.isDefault() ? result.id() : 0);
}
button->updateData(result);
};
controller->window().show(Box(
@ -414,12 +431,15 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
return;
}
const auto doneCallback = [=](const Data::ChatFilter &result) {
if (result.isDefault()) {
cSetDefaultFilterId(result.id());
}
addFilter(result);
};
controller->window().show(Box(
EditFilterBox,
controller,
Data::ChatFilter(),
Data::ChatFilter(++localNewFilterId),
crl::guard(container, doneCallback)));
});
AddSkip(container);
@ -508,6 +528,9 @@ 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);
}
}
}
return result;
@ -565,6 +588,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
if (!order.empty() && !addRequests.empty()) {
realFilters.saveOrder(order, previousId);
}
if (currentDefaultRemoved) {
cSetDefaultFilterId(0);
controller->setActiveChatsFilter(0);
}
if (currentDefaultId != cDefaultFilterId()) {
KotatoSettings::Write();
}
};
}

View file

@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/popup_menu.h"
#include "boxes/confirm_box.h"
#include "boxes/filters/edit_filter_box.h"
#include "core/kotato_settings.h"
#include "settings/settings_common.h"
#include "api/api_chat_filters.h"
#include "apiwrap.h"
@ -292,6 +293,13 @@ void FiltersMenu::remove(FilterId id) {
MTP_int(id),
MTPDialogFilter()
)).send();
if (id == cDefaultFilterId()) {
cSetDefaultFilterId(0);
KotatoSettings::Write();
if (id == _session->activeChatsFilterCurrent()) {
_session->setActiveChatsFilter(0);
}
}
}
void FiltersMenu::applyReorder(