diff --git a/Applications/FileManager/DirectoryView.cpp b/Applications/FileManager/DirectoryView.cpp index 928a0a1e90..f7e9b294cb 100644 --- a/Applications/FileManager/DirectoryView.cpp +++ b/Applications/FileManager/DirectoryView.cpp @@ -89,12 +89,16 @@ DirectoryView::DirectoryView(GWidget* parent) m_item_view = GItemView::construct(this); m_item_view->set_model(model()); + m_columns_view = GColumnsView::construct(this); + m_columns_view->set_model(model()); + m_table_view = GTableView::construct(this); m_table_view->set_model(GSortingProxyModel::create(m_model)); m_table_view->model()->set_key_column_and_sort_order(GFileSystemModel::Column::Name, GSortOrder::Ascending); m_item_view->set_model_column(GFileSystemModel::Column::Name); + m_columns_view->set_model_column(GFileSystemModel::Column::Name); m_model->on_root_path_change = [this] { m_table_view->selection().clear(); @@ -122,6 +126,9 @@ DirectoryView::DirectoryView(GWidget* parent) m_item_view->on_activation = [&](const GModelIndex& index) { handle_activation(index); }; + m_columns_view->on_activation = [&](const GModelIndex& index) { + handle_activation(index); + }; m_table_view->on_activation = [&](auto& index) { auto& filter_model = (GSortingProxyModel&)*m_table_view->model(); handle_activation(filter_model.map_to_target(index)); @@ -137,6 +144,11 @@ DirectoryView::DirectoryView(GWidget* parent) if (on_selection_change) on_selection_change(*m_item_view); }; + m_columns_view->on_selection_change = [this] { + update_statusbar(); + if (on_selection_change) + on_selection_change(*m_columns_view); + }; m_table_view->on_context_menu_request = [this](auto& index, auto& event) { if (on_context_menu_request) @@ -146,6 +158,10 @@ DirectoryView::DirectoryView(GWidget* parent) if (on_context_menu_request) on_context_menu_request(*m_item_view, index, event); }; + m_columns_view->on_context_menu_request = [this](auto& index, auto& event) { + if (on_context_menu_request) + on_context_menu_request(*m_columns_view, index, event); + }; set_view_mode(ViewMode::Icon); } @@ -164,6 +180,10 @@ void DirectoryView::set_view_mode(ViewMode mode) set_active_widget(m_table_view); return; } + if (mode == ViewMode::Columns) { + set_active_widget(m_columns_view); + return; + } if (mode == ViewMode::Icon) { set_active_widget(m_item_view); return; diff --git a/Applications/FileManager/DirectoryView.h b/Applications/FileManager/DirectoryView.h index 2e314f8e60..ea7ceb8ec9 100644 --- a/Applications/FileManager/DirectoryView.h +++ b/Applications/FileManager/DirectoryView.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -31,6 +32,7 @@ public: enum ViewMode { Invalid, List, + Columns, Icon }; void set_view_mode(ViewMode); @@ -41,6 +43,8 @@ public: switch (m_view_mode) { case ViewMode::List: return *m_table_view; + case ViewMode::Columns: + return *m_columns_view; case ViewMode::Icon: return *m_item_view; default: @@ -53,6 +57,7 @@ public: { callback(*m_table_view); callback(*m_item_view); + callback(*m_columns_view); } GFileSystemModel& model() { return *m_model; } @@ -75,4 +80,5 @@ private: RefPtr m_table_view; RefPtr m_item_view; + RefPtr m_columns_view; }; diff --git a/Applications/FileManager/main.cpp b/Applications/FileManager/main.cpp index ab72a27066..1c1da6bf41 100644 --- a/Applications/FileManager/main.cpp +++ b/Applications/FileManager/main.cpp @@ -149,6 +149,7 @@ int main(int argc, char** argv) RefPtr view_as_table_action; RefPtr view_as_icons_action; + RefPtr view_as_columns_action; view_as_table_action = GAction::create("Table view", { Mod_Ctrl, KeyCode::Key_L }, GraphicsBitmap::load_from_file("/res/icons/16x16/table-view.png"), [&](const GAction&) { directory_view->set_view_mode(DirectoryView::ViewMode::List); @@ -168,10 +169,20 @@ int main(int argc, char** argv) }); view_as_icons_action->set_checkable(true); + view_as_columns_action = GAction::create("Columns view", GraphicsBitmap::load_from_file("/res/icons/16x16/columns-view.png"), [&](const GAction&) { + directory_view->set_view_mode(DirectoryView::ViewMode::Columns); + view_as_columns_action->set_checked(true); + + config->write_entry("DirectoryView", "ViewMode", "Columns"); + config->sync(); + }); + view_as_columns_action->set_checkable(true); + auto view_type_action_group = make(); view_type_action_group->set_exclusive(true); view_type_action_group->add_action(*view_as_table_action); view_type_action_group->add_action(*view_as_icons_action); + view_type_action_group->add_action(*view_as_columns_action); auto selected_file_paths = [&] { Vector paths; @@ -385,6 +396,7 @@ int main(int argc, char** argv) auto view_menu = GMenu::construct("View"); view_menu->add_action(*view_as_icons_action); view_menu->add_action(*view_as_table_action); + view_menu->add_action(*view_as_columns_action); menubar->add_menu(move(view_menu)); auto go_menu = GMenu::construct("Go"); @@ -416,6 +428,7 @@ int main(int argc, char** argv) main_toolbar->add_separator(); main_toolbar->add_action(*view_as_icons_action); main_toolbar->add_action(*view_as_table_action); + main_toolbar->add_action(*view_as_columns_action); directory_view->on_path_change = [&](const String& new_path) { window->set_title(String::format("File Manager: %s", new_path.characters())); @@ -545,6 +558,9 @@ int main(int argc, char** argv) if (dir_view_mode.contains("List")) { directory_view->set_view_mode(DirectoryView::ViewMode::List); view_as_table_action->set_checked(true); + } else if (dir_view_mode.contains("Columns")) { + directory_view->set_view_mode(DirectoryView::ViewMode::Columns); + view_as_columns_action->set_checked(true); } else { directory_view->set_view_mode(DirectoryView::ViewMode::Icon); view_as_icons_action->set_checked(true); diff --git a/Base/res/icons/16x16/columns-view.png b/Base/res/icons/16x16/columns-view.png new file mode 100644 index 0000000000..304c71e1a0 Binary files /dev/null and b/Base/res/icons/16x16/columns-view.png differ