From d1e83b4f6ece9f1e1f8077b1c6821005ff62b00d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 17 Aug 2020 22:49:52 +0200 Subject: [PATCH] FileManager: Make DirectoryView vend indexes from view model Instead of translating between the sorting proxy and the underlying file system model at all the DirectoryView API boundaries, just hand out indexes into the sorting proxy model. The only thing those indexes are used for on the outside is to retrieve a GUI::FileSystemModel::Node for an index, so add a nice helper on DirectoryView that turns a ModelIndex into a Node&. --- Applications/FileManager/DirectoryView.cpp | 32 +++++++++++----------- Applications/FileManager/DirectoryView.h | 4 +-- Applications/FileManager/main.cpp | 4 +-- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Applications/FileManager/DirectoryView.cpp b/Applications/FileManager/DirectoryView.cpp index 4a596ed92a..8efe532ec3 100644 --- a/Applications/FileManager/DirectoryView.cpp +++ b/Applications/FileManager/DirectoryView.cpp @@ -92,7 +92,7 @@ void DirectoryView::handle_activation(const GUI::ModelIndex& index) if (!index.is_valid()) return; dbgprintf("on activation: %d,%d, this=%p, m_model=%p\n", index.row(), index.column(), this, m_model.ptr()); - auto& node = model().node(index); + auto& node = this->node(index); auto path = node.full_path(); struct stat st; @@ -142,6 +142,11 @@ DirectoryView::DirectoryView(Mode mode) set_view_mode(ViewMode::Icon); } +const GUI::FileSystemModel::Node& DirectoryView::node(const GUI::ModelIndex& index) const +{ + return model().node(m_sorting_model->map_to_source(index)); +} + void DirectoryView::setup_model() { m_model->set_root_path(Core::StandardPaths::desktop_directory()); @@ -195,7 +200,7 @@ void DirectoryView::setup_icon_view() m_icon_view->set_model(m_sorting_model); m_icon_view->set_model_column(GUI::FileSystemModel::Column::Name); m_icon_view->on_activation = [&](auto& index) { - handle_activation(map_index(index)); + handle_activation(index); }; m_icon_view->on_selection_change = [this] { update_statusbar(); @@ -204,11 +209,11 @@ void DirectoryView::setup_icon_view() }; m_icon_view->on_context_menu_request = [this](auto& index, auto& event) { if (on_context_menu_request) - on_context_menu_request(map_index(index), event); + on_context_menu_request(index, event); }; m_icon_view->on_drop = [this](auto& index, auto& event) { if (on_drop) - on_drop(map_index(index), event); + on_drop(index, event); }; } @@ -219,7 +224,7 @@ void DirectoryView::setup_columns_view() m_columns_view->set_model_column(GUI::FileSystemModel::Column::Name); m_columns_view->on_activation = [&](auto& index) { - handle_activation(map_index(index)); + handle_activation(index); }; m_columns_view->on_selection_change = [this] { @@ -230,12 +235,12 @@ void DirectoryView::setup_columns_view() m_columns_view->on_context_menu_request = [this](auto& index, auto& event) { if (on_context_menu_request) - on_context_menu_request(map_index(index), event); + on_context_menu_request(index, event); }; m_columns_view->on_drop = [this](auto& index, auto& event) { if (on_drop) - on_drop(map_index(index), event); + on_drop(index, event); }; } @@ -247,7 +252,7 @@ void DirectoryView::setup_table_view() m_table_view->set_key_column_and_sort_order(GUI::FileSystemModel::Column::Name, GUI::SortOrder::Ascending); m_table_view->on_activation = [&](auto& index) { - handle_activation(map_index(index)); + handle_activation(index); }; m_table_view->on_selection_change = [this] { @@ -258,12 +263,12 @@ void DirectoryView::setup_table_view() m_table_view->on_context_menu_request = [this](auto& index, auto& event) { if (on_context_menu_request) - on_context_menu_request(map_index(index), event); + on_context_menu_request(index, event); }; m_table_view->on_drop = [this](auto& index, auto& event) { if (on_drop) - on_drop(map_index(index), event); + on_drop(index, event); }; } @@ -356,11 +361,6 @@ void DirectoryView::open_next_directory() } } -GUI::ModelIndex DirectoryView::map_index(const GUI::ModelIndex& index) const -{ - return m_sorting_model->map_to_source(index); -} - void DirectoryView::update_statusbar() { size_t total_size = model().node({}).total_size; @@ -392,7 +392,7 @@ void DirectoryView::update_statusbar() builder.append(')'); if (selected_item_count == 1) { - auto& node = model().node(map_index(current_view().selection().first())); + auto& node = this->node(current_view().selection().first()); if (!node.symlink_target.is_empty()) { builder.append(" -> "); builder.append(node.symlink_target); diff --git a/Applications/FileManager/DirectoryView.h b/Applications/FileManager/DirectoryView.h index dcfc4a205c..9ee572ac4f 100644 --- a/Applications/FileManager/DirectoryView.h +++ b/Applications/FileManager/DirectoryView.h @@ -128,7 +128,7 @@ public: void set_should_show_dotfiles(bool); - GUI::FileSystemModel& model() { return *m_model; } + const GUI::FileSystemModel::Node& node(const GUI::ModelIndex&) const; bool is_desktop() const { return m_mode == Mode::Desktop; } @@ -140,6 +140,7 @@ public: private: explicit DirectoryView(Mode); const GUI::FileSystemModel& model() const { return *m_model; } + GUI::FileSystemModel& model() { return *m_model; } // ^GUI::ModelClient virtual void model_did_update(unsigned) override; @@ -151,7 +152,6 @@ private: void setup_table_view(); void handle_activation(const GUI::ModelIndex&); - GUI::ModelIndex map_index(const GUI::ModelIndex&) const; void set_status_message(const StringView&); void update_statusbar(); diff --git a/Applications/FileManager/main.cpp b/Applications/FileManager/main.cpp index f6272e1042..a187d9e1b1 100644 --- a/Applications/FileManager/main.cpp +++ b/Applications/FileManager/main.cpp @@ -702,7 +702,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio directory_view.on_context_menu_request = [&](const GUI::ModelIndex& index, const GUI::ContextMenuEvent& event) { if (index.is_valid()) { - auto& node = directory_view.model().node(index); + auto& node = directory_view.node(index); if (node.is_directory()) { auto should_get_enabled = access(node.full_path().characters(), W_OK) == 0 && GUI::Clipboard::the().type() == "text/uri-list"; @@ -769,7 +769,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio return; } - auto& target_node = directory_view.model().node(index); + auto& target_node = directory_view.node(index); if (!target_node.is_directory()) return;