Skip to content

Commit

Permalink
FileManager: Add a columns view
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
bugaevc authored and awesomekling committed Jan 10, 2020
1 parent edb61d8 commit 7bc8fa8
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 0 deletions.
20 changes: 20 additions & 0 deletions Applications/FileManager/DirectoryView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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));
Expand All @@ -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)
Expand All @@ -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);
}
Expand All @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions Applications/FileManager/DirectoryView.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include <AK/Vector.h>
#include <LibGUI/GColumnsView.h>
#include <LibGUI/GFileSystemModel.h>
#include <LibGUI/GItemView.h>
#include <LibGUI/GStackWidget.h>
Expand Down Expand Up @@ -31,6 +32,7 @@ class DirectoryView final : public GStackWidget {
enum ViewMode {
Invalid,
List,
Columns,
Icon
};
void set_view_mode(ViewMode);
Expand All @@ -41,6 +43,8 @@ class DirectoryView final : public GStackWidget {
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:
Expand All @@ -53,6 +57,7 @@ class DirectoryView final : public GStackWidget {
{
callback(*m_table_view);
callback(*m_item_view);
callback(*m_columns_view);
}

GFileSystemModel& model() { return *m_model; }
Expand All @@ -75,4 +80,5 @@ class DirectoryView final : public GStackWidget {

RefPtr<GTableView> m_table_view;
RefPtr<GItemView> m_item_view;
RefPtr<GColumnsView> m_columns_view;
};
16 changes: 16 additions & 0 deletions Applications/FileManager/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ int main(int argc, char** argv)

RefPtr<GAction> view_as_table_action;
RefPtr<GAction> view_as_icons_action;
RefPtr<GAction> 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);
Expand All @@ -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<GActionGroup>();
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<String> paths;
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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()));
Expand Down Expand Up @@ -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);
Expand Down
Binary file added Base/res/icons/16x16/columns-view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 7bc8fa8

Please sign in to comment.