Simplify set_dialog_is_pinned implementation.
This commit is contained in:
parent
c474942666
commit
ceaa37fe0d
|
@ -15119,35 +15119,31 @@ bool MessagesManager::set_dialog_is_pinned(DialogListId dialog_list_id, Dialog *
|
|||
if (!list->are_pinned_dialogs_inited_) {
|
||||
return false;
|
||||
}
|
||||
bool was_pinned = false;
|
||||
for (size_t pos = 0; pos < list->pinned_dialogs_.size(); pos++) {
|
||||
auto &pinned_dialog = list->pinned_dialogs_[pos];
|
||||
if (pinned_dialog.get_dialog_id() == d->dialog_id) {
|
||||
// the dialog was already pinned
|
||||
if (is_pinned) {
|
||||
if (pos == 0) {
|
||||
return false;
|
||||
}
|
||||
auto order = get_next_pinned_dialog_order();
|
||||
pinned_dialog = DialogDate(order, d->dialog_id);
|
||||
std::rotate(list->pinned_dialogs_.begin(), list->pinned_dialogs_.begin() + pos,
|
||||
list->pinned_dialogs_.begin() + pos + 1);
|
||||
list->pinned_dialog_id_orders_[d->dialog_id] = order;
|
||||
} else {
|
||||
list->pinned_dialogs_.erase(list->pinned_dialogs_.begin() + pos);
|
||||
list->pinned_dialog_id_orders_.erase(d->dialog_id);
|
||||
}
|
||||
was_pinned = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!was_pinned) {
|
||||
if (!is_pinned) {
|
||||
auto dialog_id = d->dialog_id;
|
||||
auto is_changed_dialog = [dialog_id](const DialogDate &dialog_date) {
|
||||
return dialog_date.get_dialog_id() == dialog_id;
|
||||
};
|
||||
if (is_pinned) {
|
||||
if (!list->pinned_dialogs_.empty() && is_changed_dialog(list->pinned_dialogs_[0])) {
|
||||
return false;
|
||||
}
|
||||
auto order = get_next_pinned_dialog_order();
|
||||
list->pinned_dialogs_.insert(list->pinned_dialogs_.begin(), {order, d->dialog_id});
|
||||
list->pinned_dialog_id_orders_.emplace(d->dialog_id, order);
|
||||
DialogDate dialog_date(order, dialog_id);
|
||||
add_to_top_if(list->pinned_dialogs_, list->pinned_dialogs_.size() + 1, dialog_date, is_changed_dialog);
|
||||
auto it = list->pinned_dialog_id_orders_.find(dialog_id);
|
||||
if (it != list->pinned_dialog_id_orders_.end()) {
|
||||
CHECK(list->pinned_dialogs_[0] != dialog_date);
|
||||
list->pinned_dialogs_[0] = dialog_date;
|
||||
it->second = order;
|
||||
} else {
|
||||
CHECK(list->pinned_dialogs_[0] == dialog_date);
|
||||
list->pinned_dialog_id_orders_.emplace(dialog_id, order);
|
||||
}
|
||||
} else {
|
||||
if (!td::remove_if(list->pinned_dialogs_, is_changed_dialog)) {
|
||||
return false;
|
||||
}
|
||||
list->pinned_dialog_id_orders_.erase(dialog_id);
|
||||
}
|
||||
|
||||
LOG(INFO) << "Set " << d->dialog_id << " is pinned in " << dialog_list_id << " to " << is_pinned;
|
||||
|
|
|
@ -98,7 +98,7 @@ void add_to_top(V &v, size_t max_size, T value) {
|
|||
}
|
||||
if (i == size) {
|
||||
if (size < max_size || i == 0) {
|
||||
v.emplace_back();
|
||||
v.emplace_back(value);
|
||||
} else {
|
||||
i--;
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ void add_to_top_if(V &v, size_t max_size, T value, const F &is_equal_to_value) {
|
|||
}
|
||||
if (i == size) {
|
||||
if (size < max_size || i == 0) {
|
||||
v.emplace_back();
|
||||
v.emplace_back(value);
|
||||
} else {
|
||||
i--;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue