Option to set folder as default when editing
This commit is contained in:
parent
581bbc0d00
commit
d819c07823
7 changed files with 87 additions and 8 deletions
|
|
@ -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#other" = "Recent stickers: show {count} stickers";
|
||||||
"ktg_settings_recent_stickers_limit_none" = "Recent stickers: hide all";
|
"ktg_settings_recent_stickers_limit_none" = "Recent stickers: hide all";
|
||||||
|
|
||||||
|
"ktg_filters_default" = "Default folder";
|
||||||
|
|
||||||
// Keys finished
|
// Keys finished
|
||||||
|
|
|
||||||
|
|
@ -97,5 +97,6 @@
|
||||||
"many": "Недавние стикеры: показывать {count} стикеров",
|
"many": "Недавние стикеры: показывать {count} стикеров",
|
||||||
"other": "Недавние стикеры: показывать {count} стикеров"
|
"other": "Недавние стикеры: показывать {count} стикеров"
|
||||||
},
|
},
|
||||||
"ktg_settings_recent_stickers_limit_none": "Недавние стикеры: скрыть все"
|
"ktg_settings_recent_stickers_limit_none": "Недавние стикеры: скрыть все",
|
||||||
|
"ktg_filters_default": "Папка по умолчанию"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "chat_helpers/emoji_suggestions_widget.h"
|
#include "chat_helpers/emoji_suggestions_widget.h"
|
||||||
#include "ui/layers/generic_box.h"
|
#include "ui/layers/generic_box.h"
|
||||||
#include "ui/text/text_utilities.h"
|
#include "ui/text/text_utilities.h"
|
||||||
|
#include "ui/widgets/checkbox.h"
|
||||||
#include "ui/widgets/buttons.h"
|
#include "ui/widgets/buttons.h"
|
||||||
#include "ui/widgets/input_fields.h"
|
#include "ui/widgets/input_fields.h"
|
||||||
#include "ui/effects/panel_animation.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_chat_filters.h"
|
||||||
#include "data/data_peer.h"
|
#include "data/data_peer.h"
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
|
#include "core/kotato_settings.h"
|
||||||
#include "settings/settings_common.h"
|
#include "settings/settings_common.h"
|
||||||
#include "base/event_filter.h"
|
#include "base/event_filter.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
|
|
@ -539,6 +541,19 @@ void EditFilterBox(
|
||||||
name->setFocusFast();
|
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);
|
AddSkip(content);
|
||||||
AddDivider(content);
|
AddDivider(content);
|
||||||
AddSkip(content);
|
AddSkip(content);
|
||||||
|
|
@ -618,6 +633,7 @@ void EditFilterBox(
|
||||||
const auto save = [=] {
|
const auto save = [=] {
|
||||||
const auto title = name->getLastText().trimmed();
|
const auto title = name->getLastText().trimmed();
|
||||||
const auto rules = data->current();
|
const auto rules = data->current();
|
||||||
|
const auto checked = checkboxDefault && checkboxDefault->checked();
|
||||||
const auto result = Data::ChatFilter(
|
const auto result = Data::ChatFilter(
|
||||||
rules.id(),
|
rules.id(),
|
||||||
title,
|
title,
|
||||||
|
|
@ -625,7 +641,8 @@ void EditFilterBox(
|
||||||
rules.flags(),
|
rules.flags(),
|
||||||
rules.always(),
|
rules.always(),
|
||||||
rules.pinned(),
|
rules.pinned(),
|
||||||
rules.never());
|
rules.never(),
|
||||||
|
checked);
|
||||||
if (title.isEmpty()) {
|
if (title.isEmpty()) {
|
||||||
name->showError();
|
name->showError();
|
||||||
return;
|
return;
|
||||||
|
|
@ -670,6 +687,12 @@ void EditExistingFilter(
|
||||||
MTP_int(id),
|
MTP_int(id),
|
||||||
tl
|
tl
|
||||||
)).send();
|
)).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(
|
window->window().show(Box(
|
||||||
EditFilterBox,
|
EditFilterBox,
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,9 @@ constexpr auto kLoadExceptionsPerRequest = 100;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
ChatFilter::ChatFilter(FilterId id) : _id(id) {
|
||||||
|
}
|
||||||
|
|
||||||
ChatFilter::ChatFilter(
|
ChatFilter::ChatFilter(
|
||||||
FilterId id,
|
FilterId id,
|
||||||
const QString &title,
|
const QString &title,
|
||||||
|
|
@ -36,14 +39,16 @@ ChatFilter::ChatFilter(
|
||||||
Flags flags,
|
Flags flags,
|
||||||
base::flat_set<not_null<History*>> always,
|
base::flat_set<not_null<History*>> always,
|
||||||
std::vector<not_null<History*>> pinned,
|
std::vector<not_null<History*>> pinned,
|
||||||
base::flat_set<not_null<History*>> never)
|
base::flat_set<not_null<History*>> never,
|
||||||
|
bool isDefault)
|
||||||
: _id(id)
|
: _id(id)
|
||||||
, _title(title)
|
, _title(title)
|
||||||
, _iconEmoji(iconEmoji)
|
, _iconEmoji(iconEmoji)
|
||||||
, _always(std::move(always))
|
, _always(std::move(always))
|
||||||
, _pinned(std::move(pinned))
|
, _pinned(std::move(pinned))
|
||||||
, _never(std::move(never))
|
, _never(std::move(never))
|
||||||
, _flags(flags) {
|
, _flags(flags)
|
||||||
|
, _isDefault(isDefault) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatFilter ChatFilter::FromTL(
|
ChatFilter ChatFilter::FromTL(
|
||||||
|
|
@ -102,7 +107,8 @@ ChatFilter ChatFilter::FromTL(
|
||||||
flags,
|
flags,
|
||||||
std::move(list),
|
std::move(list),
|
||||||
std::move(pinned),
|
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;
|
return _title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ChatFilter::isDefault() const {
|
||||||
|
return _isDefault;
|
||||||
|
}
|
||||||
|
|
||||||
QString ChatFilter::iconEmoji() const {
|
QString ChatFilter::iconEmoji() const {
|
||||||
return _iconEmoji;
|
return _iconEmoji;
|
||||||
}
|
}
|
||||||
|
|
@ -465,7 +475,8 @@ const ChatFilter &ChatFilters::applyUpdatedPinned(
|
||||||
i->flags(),
|
i->flags(),
|
||||||
std::move(always),
|
std::move(always),
|
||||||
std::move(pinned),
|
std::move(pinned),
|
||||||
i->never()));
|
i->never(),
|
||||||
|
(id == cDefaultFilterId())));
|
||||||
return *i;
|
return *i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@ public:
|
||||||
static constexpr int kPinnedLimit = 100;
|
static constexpr int kPinnedLimit = 100;
|
||||||
|
|
||||||
ChatFilter() = default;
|
ChatFilter() = default;
|
||||||
|
ChatFilter(FilterId id);
|
||||||
ChatFilter(
|
ChatFilter(
|
||||||
FilterId id,
|
FilterId id,
|
||||||
const QString &title,
|
const QString &title,
|
||||||
|
|
@ -45,7 +46,8 @@ public:
|
||||||
Flags flags,
|
Flags flags,
|
||||||
base::flat_set<not_null<History*>> always,
|
base::flat_set<not_null<History*>> always,
|
||||||
std::vector<not_null<History*>> pinned,
|
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(
|
[[nodiscard]] static ChatFilter FromTL(
|
||||||
const MTPDialogFilter &data,
|
const MTPDialogFilter &data,
|
||||||
|
|
@ -54,6 +56,7 @@ public:
|
||||||
|
|
||||||
[[nodiscard]] FilterId id() const;
|
[[nodiscard]] FilterId id() const;
|
||||||
[[nodiscard]] QString title() const;
|
[[nodiscard]] QString title() const;
|
||||||
|
[[nodiscard]] bool isDefault() const;
|
||||||
[[nodiscard]] QString iconEmoji() const;
|
[[nodiscard]] QString iconEmoji() const;
|
||||||
[[nodiscard]] Flags flags() const;
|
[[nodiscard]] Flags flags() const;
|
||||||
[[nodiscard]] const base::flat_set<not_null<History*>> &always() const;
|
[[nodiscard]] const base::flat_set<not_null<History*>> &always() const;
|
||||||
|
|
@ -70,6 +73,7 @@ private:
|
||||||
std::vector<not_null<History*>> _pinned;
|
std::vector<not_null<History*>> _pinned;
|
||||||
base::flat_set<not_null<History*>> _never;
|
base::flat_set<not_null<History*>> _never;
|
||||||
Flags _flags;
|
Flags _flags;
|
||||||
|
bool _isDefault = false;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "ui/wrap/slide_wrap.h"
|
#include "ui/wrap/slide_wrap.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "ui/filter_icons.h"
|
#include "ui/filter_icons.h"
|
||||||
|
#include "core/kotato_settings.h"
|
||||||
#include "settings/settings_common.h"
|
#include "settings/settings_common.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
|
@ -39,6 +40,8 @@ namespace {
|
||||||
|
|
||||||
constexpr auto kRefreshSuggestedTimeout = 7200 * crl::time(1000);
|
constexpr auto kRefreshSuggestedTimeout = 7200 * crl::time(1000);
|
||||||
constexpr auto kFiltersLimit = 10;
|
constexpr auto kFiltersLimit = 10;
|
||||||
|
auto currentDefaultRemoved = false;
|
||||||
|
auto localNewFilterId = kFiltersLimit;
|
||||||
|
|
||||||
using Flag = Data::ChatFilter::Flag;
|
using Flag = Data::ChatFilter::Flag;
|
||||||
using Flags = Data::ChatFilter::Flags;
|
using Flags = Data::ChatFilter::Flags;
|
||||||
|
|
@ -309,6 +312,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
not_null<Ui::VerticalLayout*> container) {
|
not_null<Ui::VerticalLayout*> container) {
|
||||||
auto &lifetime = container->lifetime();
|
auto &lifetime = container->lifetime();
|
||||||
|
const auto currentDefaultId = cDefaultFilterId();
|
||||||
|
localNewFilterId = kFiltersLimit;
|
||||||
|
currentDefaultRemoved = false;
|
||||||
|
|
||||||
const auto session = &controller->session();
|
const auto session = &controller->session();
|
||||||
AddSkip(container, st::settingsSectionSkip);
|
AddSkip(container, st::settingsSectionSkip);
|
||||||
|
|
@ -337,6 +343,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
|
||||||
button->removeRequests(
|
button->removeRequests(
|
||||||
) | rpl::start_with_next([=] {
|
) | rpl::start_with_next([=] {
|
||||||
button->setRemoved(true);
|
button->setRemoved(true);
|
||||||
|
if (find(button)->filter.id() == cDefaultFilterId()) {
|
||||||
|
currentDefaultRemoved = true;
|
||||||
|
}
|
||||||
find(button)->removed = true;
|
find(button)->removed = true;
|
||||||
}, button->lifetime());
|
}, button->lifetime());
|
||||||
button->restoreRequests(
|
button->restoreRequests(
|
||||||
|
|
@ -344,6 +353,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
|
||||||
if (showLimitReached()) {
|
if (showLimitReached()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (find(button)->filter.id() == cDefaultFilterId()) {
|
||||||
|
currentDefaultRemoved = false;
|
||||||
|
}
|
||||||
button->setRemoved(false);
|
button->setRemoved(false);
|
||||||
find(button)->removed = false;
|
find(button)->removed = false;
|
||||||
}, button->lifetime());
|
}, button->lifetime());
|
||||||
|
|
@ -354,6 +366,11 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
|
||||||
}
|
}
|
||||||
const auto doneCallback = [=](const Data::ChatFilter &result) {
|
const auto doneCallback = [=](const Data::ChatFilter &result) {
|
||||||
find(button)->filter = 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);
|
button->updateData(result);
|
||||||
};
|
};
|
||||||
controller->window().show(Box(
|
controller->window().show(Box(
|
||||||
|
|
@ -414,12 +431,15 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto doneCallback = [=](const Data::ChatFilter &result) {
|
const auto doneCallback = [=](const Data::ChatFilter &result) {
|
||||||
|
if (result.isDefault()) {
|
||||||
|
cSetDefaultFilterId(result.id());
|
||||||
|
}
|
||||||
addFilter(result);
|
addFilter(result);
|
||||||
};
|
};
|
||||||
controller->window().show(Box(
|
controller->window().show(Box(
|
||||||
EditFilterBox,
|
EditFilterBox,
|
||||||
controller,
|
controller,
|
||||||
Data::ChatFilter(),
|
Data::ChatFilter(++localNewFilterId),
|
||||||
crl::guard(container, doneCallback)));
|
crl::guard(container, doneCallback)));
|
||||||
});
|
});
|
||||||
AddSkip(container);
|
AddSkip(container);
|
||||||
|
|
@ -508,6 +528,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
|
||||||
continue;
|
continue;
|
||||||
} else if (!ranges::contains(list, id, &Data::ChatFilter::id)) {
|
} else if (!ranges::contains(list, id, &Data::ChatFilter::id)) {
|
||||||
result.emplace(row.button, chooseNextId());
|
result.emplace(row.button, chooseNextId());
|
||||||
|
if (cDefaultFilterId() == id) {
|
||||||
|
cSetDefaultFilterId(localId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -565,6 +588,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
|
||||||
if (!order.empty() && !addRequests.empty()) {
|
if (!order.empty() && !addRequests.empty()) {
|
||||||
realFilters.saveOrder(order, previousId);
|
realFilters.saveOrder(order, previousId);
|
||||||
}
|
}
|
||||||
|
if (currentDefaultRemoved) {
|
||||||
|
cSetDefaultFilterId(0);
|
||||||
|
controller->setActiveChatsFilter(0);
|
||||||
|
}
|
||||||
|
if (currentDefaultId != cDefaultFilterId()) {
|
||||||
|
KotatoSettings::Write();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "ui/widgets/popup_menu.h"
|
#include "ui/widgets/popup_menu.h"
|
||||||
#include "boxes/confirm_box.h"
|
#include "boxes/confirm_box.h"
|
||||||
#include "boxes/filters/edit_filter_box.h"
|
#include "boxes/filters/edit_filter_box.h"
|
||||||
|
#include "core/kotato_settings.h"
|
||||||
#include "settings/settings_common.h"
|
#include "settings/settings_common.h"
|
||||||
#include "api/api_chat_filters.h"
|
#include "api/api_chat_filters.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
|
@ -292,6 +293,13 @@ void FiltersMenu::remove(FilterId id) {
|
||||||
MTP_int(id),
|
MTP_int(id),
|
||||||
MTPDialogFilter()
|
MTPDialogFilter()
|
||||||
)).send();
|
)).send();
|
||||||
|
if (id == cDefaultFilterId()) {
|
||||||
|
cSetDefaultFilterId(0);
|
||||||
|
KotatoSettings::Write();
|
||||||
|
if (id == _session->activeChatsFilterCurrent()) {
|
||||||
|
_session->setActiveChatsFilter(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FiltersMenu::applyReorder(
|
void FiltersMenu::applyReorder(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue