1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 06:07:44 +00:00

LibGUI: Add ModelClient abstract class and allow registering clients

This solves a problem where the SortingProxyModel doesn't
receive the on_update call because other code overwrote
the handler later on.
This commit is contained in:
Tom 2020-07-11 06:47:26 -06:00 committed by Andreas Kling
parent 0e10a92ebc
commit b778804d20
13 changed files with 144 additions and 60 deletions

View file

@ -95,16 +95,7 @@ DirectoryView::DirectoryView()
on_path_change(model().root_path());
};
// NOTE: We're using the on_update hook on the GUI::SortingProxyModel here instead of
// the GUI::FileSystemModel's hook. This is because GUI::SortingProxyModel has already
// installed an on_update hook on the GUI::FileSystemModel internally.
// FIXME: This is an unfortunate design. We should come up with something better.
m_table_view->model()->on_update = [this] {
for_each_view_implementation([](auto& view) {
view.selection().clear();
});
update_statusbar();
};
m_model->register_client(*this);
m_model->on_thumbnail_progress = [this](int done, int total) {
if (on_thumbnail_progress)
@ -169,6 +160,17 @@ DirectoryView::DirectoryView()
DirectoryView::~DirectoryView()
{
m_model->unregister_client(*this);
}
void DirectoryView::on_model_update(unsigned flags)
{
if (flags & GUI::Model::UpdateFlag::InvalidateAllIndexes) {
for_each_view_implementation([](auto& view) {
view.selection().clear();
});
}
update_statusbar();
}
void DirectoryView::set_view_mode(ViewMode mode)

View file

@ -34,7 +34,8 @@
#include <LibGUI/TableView.h>
#include <sys/stat.h>
class DirectoryView final : public GUI::StackWidget {
class DirectoryView final : public GUI::StackWidget
, private GUI::ModelClient {
C_OBJECT(DirectoryView)
public:
virtual ~DirectoryView() override;
@ -94,6 +95,8 @@ private:
DirectoryView();
const GUI::FileSystemModel& model() const { return *m_model; }
virtual void on_model_update(unsigned) override;
void handle_activation(const GUI::ModelIndex&);
void set_status_message(const StringView&);