From e14dd06b8c590fb1292b6219f8c1da249ec85f98 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 9 Mar 2019 14:52:25 +0100 Subject: [PATCH] FileManager: Hook up a GSortingProxyTableModel so we get sorted files. :^) The next step here is coming up with a nice way to always put directories ahead of files. --- Applications/FileManager/DirectoryTableModel.cpp | 15 ++++++++++++++- Applications/FileManager/DirectoryTableView.cpp | 6 +++++- Applications/FileManager/DirectoryTableView.h | 6 ++++-- LibGUI/GSortingProxyTableModel.cpp | 8 ++------ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Applications/FileManager/DirectoryTableModel.cpp b/Applications/FileManager/DirectoryTableModel.cpp index c21a8a98d7..e04b544098 100644 --- a/Applications/FileManager/DirectoryTableModel.cpp +++ b/Applications/FileManager/DirectoryTableModel.cpp @@ -137,8 +137,21 @@ String DirectoryTableModel::name_for_gid(uid_t gid) const GVariant DirectoryTableModel::data(const GModelIndex& index, Role role) const { - ASSERT(role == Role::Display); + ASSERT(is_valid(index)); auto& entry = this->entry(index.row()); + if (role == Role::Sort) { + switch (index.column()) { + case Column::Icon: return entry.is_directory() ? 0 : 1; + case Column::Name: return entry.name; + case Column::Size: return (int)entry.size; + case Column::Owner: return name_for_uid(entry.uid); + case Column::Group: return name_for_gid(entry.gid); + case Column::Permissions: return permission_string(entry.mode); + case Column::Inode: return (int)entry.inode; + } + ASSERT_NOT_REACHED(); + } + ASSERT(role == Role::Display); switch (index.column()) { case Column::Icon: return icon_for(entry); case Column::Name: return entry.name; diff --git a/Applications/FileManager/DirectoryTableView.cpp b/Applications/FileManager/DirectoryTableView.cpp index 4e116a1981..28f54303de 100644 --- a/Applications/FileManager/DirectoryTableView.cpp +++ b/Applications/FileManager/DirectoryTableView.cpp @@ -1,9 +1,13 @@ #include "DirectoryTableView.h" +#include DirectoryTableView::DirectoryTableView(GWidget* parent) : GTableView(parent) { - set_model(make()); + auto directory_model = make(); + m_model = directory_model.ptr(); + set_model(make(move(directory_model))); + GTableView::model()->set_key_column_and_sort_order(DirectoryTableModel::Column::Name, GSortOrder::Ascending); } DirectoryTableView::~DirectoryTableView() diff --git a/Applications/FileManager/DirectoryTableView.h b/Applications/FileManager/DirectoryTableView.h index 4d2c369a81..1bc56e8ab1 100644 --- a/Applications/FileManager/DirectoryTableView.h +++ b/Applications/FileManager/DirectoryTableView.h @@ -19,8 +19,10 @@ public: private: virtual void model_notification(const GModelNotification&) override; - DirectoryTableModel& model() { return static_cast(*GTableView::model()); } - const DirectoryTableModel& model() const { return static_cast(*GTableView::model()); } + DirectoryTableModel& model() { return *m_model; } + const DirectoryTableModel& model() const { return *m_model; } void set_status_message(const String&); + + DirectoryTableModel* m_model { nullptr }; }; diff --git a/LibGUI/GSortingProxyTableModel.cpp b/LibGUI/GSortingProxyTableModel.cpp index 9e73615e6d..364b5f3638 100644 --- a/LibGUI/GSortingProxyTableModel.cpp +++ b/LibGUI/GSortingProxyTableModel.cpp @@ -28,14 +28,10 @@ int GSortingProxyTableModel::column_count() const GModelIndex GSortingProxyTableModel::map_to_target(const GModelIndex& index) const { ASSERT(!m_row_mappings.is_empty()); - if (!index.is_valid()) { - ASSERT_NOT_REACHED(); + if (!index.is_valid()) return { }; - } - if (index.row() >= row_count() || index.column() >= column_count()) { - ASSERT_NOT_REACHED(); + if (index.row() >= row_count() || index.column() >= column_count()) return { }; - } return { m_row_mappings[index.row()], index.column() }; }