mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 07:30:19 +00:00
LibGUI: Keep still-valid indexes in selection after a model update
This is a stop-gap patch solution for the annoying problem of models being bad at updating. At least the process table will retain your selection in SystemMonitor now.
This commit is contained in:
parent
bdb6b2ced3
commit
a06548eaf7
Notes:
sideshowbarker
2024-07-19 07:47:19 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/a06548eaf7b
3 changed files with 19 additions and 1 deletions
|
@ -60,10 +60,15 @@ void AbstractView::set_model(RefPtr<Model> model)
|
||||||
|
|
||||||
void AbstractView::did_update_model()
|
void AbstractView::did_update_model()
|
||||||
{
|
{
|
||||||
|
// FIXME: It's unfortunate that we lose so much view state when the model updates in any way.
|
||||||
stop_editing();
|
stop_editing();
|
||||||
m_edit_index = {};
|
m_edit_index = {};
|
||||||
m_hovered_index = {};
|
m_hovered_index = {};
|
||||||
selection().clear();
|
if (model()) {
|
||||||
|
selection().remove_matching([this](auto& index) { return !model()->is_valid(index); });
|
||||||
|
} else {
|
||||||
|
selection().clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractView::did_update_selection()
|
void AbstractView::did_update_selection()
|
||||||
|
|
|
@ -31,6 +31,17 @@
|
||||||
|
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
void ModelSelection::remove_matching(Function<bool(const ModelIndex&)> filter)
|
||||||
|
{
|
||||||
|
Vector<ModelIndex> to_remove;
|
||||||
|
for (auto& index : m_indexes) {
|
||||||
|
if (filter(index))
|
||||||
|
to_remove.append(index);
|
||||||
|
}
|
||||||
|
for (auto& index : to_remove)
|
||||||
|
m_indexes.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
void ModelSelection::set(const ModelIndex& index)
|
void ModelSelection::set(const ModelIndex& index)
|
||||||
{
|
{
|
||||||
ASSERT(index.is_valid());
|
ASSERT(index.is_valid());
|
||||||
|
|
|
@ -89,6 +89,8 @@ public:
|
||||||
return *m_indexes.begin();
|
return *m_indexes.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void remove_matching(Function<bool(const ModelIndex&)>);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AbstractView& m_view;
|
AbstractView& m_view;
|
||||||
HashTable<ModelIndex> m_indexes;
|
HashTable<ModelIndex> m_indexes;
|
||||||
|
|
Loading…
Reference in a new issue