From 7bc8fa884a2a4409a88882966c7e2b1e602b3dbf Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Fri, 10 Jan 2020 19:17:14 +0300 Subject: [PATCH] FileManager: Add a columns view This new view, backed by a GColumnsView, joins the existing table and icon views :^) Even though it displays a file tree, its data is provided by the very same GFileSystemModel that the other two views use. This commit also includes my attempt at making an icon for the new mode. --- Applications/FileManager/DirectoryView.cpp | 20 ++++++++++++++++++++ Applications/FileManager/DirectoryView.h | 6 ++++++ Applications/FileManager/main.cpp | 16 ++++++++++++++++ Base/res/icons/16x16/columns-view.png | Bin 0 -> 1622 bytes 4 files changed, 42 insertions(+) create mode 100644 Base/res/icons/16x16/columns-view.png 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 0000000000000000000000000000000000000000..304c71e1a005e769dca02ae39e921c7c79e4287c GIT binary patch literal 1622 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to*H(o@lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNUGcmOJUS2G5`M!EXd7wEVE(GYj~dx8eAGHfz5}K53IGBX=jI zM0)sc?{R*6-+u1DgNlC4mED?81Z4Q;*G^+n-ud>1TUlM)cjsalNmDE7qd3XO-Elu_=i43#& zxaIfFeb4eYm2`JJU7@qR<5ks^iU;ez&#KD5{i@4dK2`pkYwR>5T^79s!Oyoe7(Yti z@Yu%q+>@?o$C{%-;zitfM%)%}-|Q@UcrLe3dws);rJhGLHg);MU($%Y=DAm1y}WZt z;j+&nxe&lFvQ&=F&mYf|D=w4@jKq z)n25)@qKRa>_0}i&DQeH5v@&TnSK!og{P+_8SeWw&2R2iNyRI>*FLqpX3MDIl*=p; zrtyGjbzy?ItCDer&xPd-J6B9+<=QaOlhy0vD#k}Dl3NYcKlO-CKHK}2)oBLX9xYBL z(T=Bke>QyAUD(PsbC&t$go~3>wH=%J#hf}4-vp~>eYu#_VYqBYvgfRtO(H=)nomPE zr5rU&o8sJO`E-uAUTbFIur}b=CS?kvrdqK8`h=>D0TU zB9!-?guZ4)j=GsibJ8QpuHy?Cq@vo=^frDsnj$@Gr;gVuHHS>+Ij5WrHC{+}m)dRF zt@S;`oN4#_S8DN^?#{dXHQb$dNk5e<{q3|h>RH+9-~}JWnu6a<=(^6&s4ME3S~I=Q z^isaMo!YB?Q!AVEZ^!q1ImQxuy`ZVswUIw1H9yC<`1>R4oc{dfExHXC!*8q9S3c8g zJ8$LoE#r?{^{YF6$Ik9aHBXwy*0pXY=k^7^n;$Nb416^0*3S6;FZWu6d!$87=9PJW zt#>oAtF>>MSyI*ygvWmug@R#7P(8*JnPucTTxo082ILg`;?dV8zbx7`(NE(&%nUgn(6Eu z;OXoP%eV{-6?1AQ+Ik!g5NY)fUK$i7^G4y(goRd-0@_CdR|m9kEey-Jdhp58`U^`` zJqrs(Vz~MK>4eF~%qcA`5M?^)O2@eSzZc%KZU6p`xg~6BX4-v~ z1uv&f^i(|>Qy0p!=TN)CArA#TMera!IXNz{PENt2D?b<%P}5 zhw_Dggm#J)g&sJuu|dk@M4$X0{<`zmbdD{*vm`+1Mg7LN{e}t~xVOyS_O~|Y_FLft z|9N6w#@4T8JySF3-kYq8$_WM1J9fOwIwe=IlbOf&DV18f4&ZwhW=U|?WN@^*J& z_z!{$_AZ~yz`(#+;1OBOz`!jG!i)^F=14FwFtC?+`ns||VdUatl=^FZ{~`ke!%R;X z#}JFtXD40cWHJ