Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 * Copyright (c) 2022, the SerenityOS developers.
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8#include <AK/StringBuilder.h>
9#include <LibGUI/Action.h>
10#include <LibGUI/ActionGroup.h>
11#include <LibGUI/Model.h>
12#include <LibGUI/MultiView.h>
13#include <LibGUI/Window.h>
14#include <stdio.h>
15#include <unistd.h>
16
17REGISTER_WIDGET(GUI, MultiView)
18
19namespace GUI {
20
21MultiView::MultiView()
22{
23 set_active_widget(nullptr);
24 set_grabbable_margins(2);
25 m_icon_view = add<IconView>();
26 m_table_view = add<TableView>();
27 m_columns_view = add<ColumnsView>();
28
29 for_each_view_implementation([&](auto& view) {
30 view.set_should_hide_unnecessary_scrollbars(true);
31 view.on_activation = [this](auto& index) {
32 if (on_activation)
33 on_activation(index);
34 };
35 view.on_selection_change = [this] {
36 if (on_selection_change)
37 on_selection_change();
38 };
39 view.on_context_menu_request = [this](auto& index, auto& event) {
40 if (on_context_menu_request)
41 on_context_menu_request(index, event);
42 };
43 view.on_drop = [this](auto& index, auto& event) {
44 if (on_drop)
45 on_drop(index, event);
46 };
47 });
48
49 build_actions();
50 set_view_mode(ViewMode::Icon);
51}
52
53void MultiView::set_view_mode(ViewMode mode)
54{
55 if (m_view_mode == mode)
56 return;
57 m_view_mode = mode;
58 update();
59 if (mode == ViewMode::Table) {
60 set_active_widget(m_table_view);
61 m_view_as_table_action->set_checked(true);
62 return;
63 }
64 if (mode == ViewMode::Columns) {
65 set_active_widget(m_columns_view);
66 m_view_as_columns_action->set_checked(true);
67 return;
68 }
69 if (mode == ViewMode::Icon) {
70 set_active_widget(m_icon_view);
71 m_view_as_icons_action->set_checked(true);
72 return;
73 }
74 VERIFY_NOT_REACHED();
75}
76
77void MultiView::set_model(RefPtr<Model> model)
78{
79 if (m_model == model)
80 return;
81 m_model = model;
82 for_each_view_implementation([&](auto& view) {
83 view.set_model(model);
84 });
85}
86
87void MultiView::set_model_column(int column)
88{
89 if (m_model_column == column)
90 return;
91 m_model_column = column;
92 m_icon_view->set_model_column(column);
93 m_columns_view->set_model_column(column);
94}
95
96void MultiView::set_column_visible(int column_index, bool visible)
97{
98 m_table_view->set_column_visible(column_index, visible);
99}
100
101void MultiView::build_actions()
102{
103 m_view_as_icons_action = Action::create_checkable(
104 "Icon view", { Mod_Ctrl, KeyCode::Key_1 }, Gfx::Bitmap::load_from_file("/res/icons/16x16/icon-view.png"sv).release_value_but_fixme_should_propagate_errors(), [this](auto&) {
105 set_view_mode(ViewMode::Icon);
106 },
107 this);
108
109 m_view_as_table_action = Action::create_checkable(
110 "Table view", { Mod_Ctrl, KeyCode::Key_2 }, Gfx::Bitmap::load_from_file("/res/icons/16x16/table-view.png"sv).release_value_but_fixme_should_propagate_errors(), [this](auto&) {
111 set_view_mode(ViewMode::Table);
112 },
113 this);
114
115 m_view_as_columns_action = Action::create_checkable(
116 "Columns view", { Mod_Ctrl, KeyCode::Key_3 }, Gfx::Bitmap::load_from_file("/res/icons/16x16/columns-view.png"sv).release_value_but_fixme_should_propagate_errors(), [this](auto&) {
117 set_view_mode(ViewMode::Columns);
118 },
119 this);
120
121 m_view_type_action_group = make<ActionGroup>();
122 m_view_type_action_group->set_exclusive(true);
123 m_view_type_action_group->add_action(*m_view_as_icons_action);
124 m_view_type_action_group->add_action(*m_view_as_table_action);
125 m_view_type_action_group->add_action(*m_view_as_columns_action);
126}
127
128AbstractView::SelectionMode MultiView::selection_mode() const
129{
130 return m_table_view->selection_mode();
131}
132
133void MultiView::set_selection_mode(AbstractView::SelectionMode selection_mode)
134{
135 m_table_view->set_selection_mode(selection_mode);
136 m_icon_view->set_selection_mode(selection_mode);
137 m_columns_view->set_selection_mode(selection_mode);
138}
139
140void MultiView::set_key_column_and_sort_order(int column, SortOrder sort_order)
141{
142 for_each_view_implementation([&](auto& view) {
143 view.set_key_column_and_sort_order(column, sort_order);
144 });
145}
146
147}