Skip to content

Commit f7116bb

Browse files
committed
LibGUI: Refactor AbstractView "multi select" mode into "selection mode"
There are three possible selection modes for a GUI::AbstractView. - NoSelection - SingleSelection - MultiSelection We don't enforce these modes fully yet, this patch mostly adds them in place of the old "multi select" flag.
1 parent 207ecf4 commit f7116bb

File tree

8 files changed

+31
-25
lines changed

8 files changed

+31
-25
lines changed

Applications/FileManager/DirectoryView.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ void DirectoryView::setup_model()
202202
void DirectoryView::setup_icon_view()
203203
{
204204
m_icon_view = add<GUI::IconView>();
205+
m_icon_view->set_selection_mode(GUI::AbstractView::SelectionMode::MultiSelection);
205206
m_icon_view->set_editable(true);
206207
m_icon_view->set_edit_triggers(GUI::AbstractView::EditTrigger::EditKeyPressed);
207208
m_icon_view->aid_create_editing_delegate = [](auto&) {
@@ -236,6 +237,7 @@ void DirectoryView::setup_icon_view()
236237
void DirectoryView::setup_columns_view()
237238
{
238239
m_columns_view = add<GUI::ColumnsView>();
240+
m_columns_view->set_selection_mode(GUI::AbstractView::SelectionMode::MultiSelection);
239241
m_columns_view->set_editable(true);
240242
m_columns_view->set_edit_triggers(GUI::AbstractView::EditTrigger::EditKeyPressed);
241243
m_columns_view->aid_create_editing_delegate = [](auto&) {
@@ -266,6 +268,7 @@ void DirectoryView::setup_columns_view()
266268
void DirectoryView::setup_table_view()
267269
{
268270
m_table_view = add<GUI::TableView>();
271+
m_table_view->set_selection_mode(GUI::AbstractView::SelectionMode::MultiSelection);
269272
m_table_view->set_editable(true);
270273
m_table_view->set_edit_triggers(GUI::AbstractView::EditTrigger::EditKeyPressed);
271274
m_table_view->aid_create_editing_delegate = [](auto&) {

Applications/Spreadsheet/CellTypeDialog.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ void CellTypeDialog::setup_tabs(GUI::TabWidget& tabs, const Vector<Position>& po
160160

161161
auto& type_list = left_side.add<GUI::ListView>();
162162
type_list.set_model(*GUI::ItemListModel<String>::create(g_types));
163-
type_list.set_multi_select(false);
164163
type_list.set_should_hide_unnecessary_scrollbars(true);
165164
type_list.on_selection = [&](auto& index) {
166165
if (!index.is_valid()) {

Libraries/LibGUI/AbstractView.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -403,16 +403,21 @@ void AbstractView::drop_event(DropEvent& event)
403403
on_drop(index, event);
404404
}
405405

406-
void AbstractView::set_multi_select(bool multi_select)
406+
void AbstractView::set_selection_mode(SelectionMode selection_mode)
407407
{
408-
if (m_multi_select == multi_select)
408+
if (m_selection_mode == selection_mode)
409409
return;
410-
m_multi_select = multi_select;
411-
if (!multi_select && m_selection.size() > 1) {
410+
m_selection_mode = selection_mode;
411+
412+
if (m_selection_mode == SelectionMode::NoSelection)
413+
m_selection.clear();
414+
else if (m_selection_mode != SelectionMode::SingleSelection && m_selection.size() > 1) {
412415
auto first_selected = m_selection.first();
413416
m_selection.clear();
414417
m_selection.set(first_selected);
415418
}
419+
420+
update();
416421
}
417422

418423
void AbstractView::set_key_column_and_sort_order(int column, SortOrder sort_order)

Libraries/LibGUI/AbstractView.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ class AbstractView
6565
SelectRows,
6666
};
6767

68+
enum class SelectionMode {
69+
SingleSelection,
70+
MultiSelection,
71+
NoSelection,
72+
};
73+
6874
virtual void move_cursor(CursorMovement, SelectionUpdate) { }
6975

7076
void set_model(RefPtr<Model>);
@@ -96,8 +102,8 @@ class AbstractView
96102
SelectionBehavior selection_behavior() const { return m_selection_behavior; }
97103
void set_selection_behavior(SelectionBehavior behavior) { m_selection_behavior = behavior; }
98104

99-
bool is_multi_select() const { return m_multi_select; }
100-
void set_multi_select(bool);
105+
SelectionMode selection_mode() const { return m_selection_mode; }
106+
void set_selection_mode(SelectionMode);
101107

102108
virtual void model_did_update(unsigned flags) override;
103109
virtual void did_update_selection();
@@ -197,9 +203,9 @@ class AbstractView
197203
RefPtr<Core::Timer> m_searching_timer;
198204
ModelIndex m_cursor_index;
199205
SelectionBehavior m_selection_behavior { SelectionBehavior::SelectItems };
206+
SelectionMode m_selection_mode { SelectionMode::SingleSelection };
200207
unsigned m_edit_triggers { EditTrigger::DoubleClicked | EditTrigger::EditKeyPressed };
201208
bool m_activates_on_selection { false };
202-
bool m_multi_select { true };
203209
bool m_tab_key_navigation_enabled { false };
204210
bool m_is_dragging { false };
205211
bool m_draw_item_text_with_shadow { false };

Libraries/LibGUI/FilePicker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ FilePicker::FilePicker(Window* parent_window, Mode mode, Options options, const
123123
m_location_textbox->set_text(path);
124124

125125
m_view = vertical_container.add<MultiView>();
126-
m_view->set_multi_select(m_mode == Mode::OpenMultiple);
126+
m_view->set_selection_mode(m_mode == Mode::OpenMultiple ? GUI::AbstractView::SelectionMode::MultiSelection : GUI::AbstractView::SelectionMode::SingleSelection);
127127
m_view->set_model(SortingProxyModel::create(*m_model));
128128
m_view->set_model_column(FileSystemModel::Column::Name);
129129
m_view->set_key_column_and_sort_order(GUI::FileSystemModel::Column::Name, GUI::SortOrder::Ascending);

Libraries/LibGUI/IconView.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ void IconView::mousedown_event(MouseEvent& event)
247247
auto adjusted_position = to_content_position(event.position());
248248

249249
m_might_drag = false;
250-
if (is_multi_select()) {
250+
if (selection_mode() == SelectionMode::MultiSelection) {
251251
m_rubber_banding = true;
252252
m_rubber_band_origin = adjusted_position;
253253
m_rubber_band_current = adjusted_position;

Libraries/LibGUI/MultiView.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ MultiView::MultiView()
9797

9898
build_actions();
9999
set_view_mode(ViewMode::Icon);
100-
apply_multi_select();
101100
}
102101

103102
MultiView::~MultiView()
@@ -176,19 +175,16 @@ void MultiView::build_actions()
176175
m_view_type_action_group->add_action(*m_view_as_columns_action);
177176
}
178177

179-
void MultiView::apply_multi_select()
178+
AbstractView::SelectionMode MultiView::selection_mode() const
180179
{
181-
m_table_view->set_multi_select(m_multi_select);
182-
m_icon_view->set_multi_select(m_multi_select);
183-
m_columns_view->set_multi_select(m_multi_select);
180+
return m_table_view->selection_mode();
184181
}
185182

186-
void MultiView::set_multi_select(bool multi_select)
183+
void MultiView::set_selection_mode(AbstractView::SelectionMode selection_mode)
187184
{
188-
if (m_multi_select == multi_select)
189-
return;
190-
m_multi_select = multi_select;
191-
apply_multi_select();
185+
m_table_view->set_selection_mode(selection_mode);
186+
m_icon_view->set_selection_mode(selection_mode);
187+
m_columns_view->set_selection_mode(selection_mode);
192188
}
193189

194190
void MultiView::set_key_column_and_sort_order(int column, SortOrder sort_order)

Libraries/LibGUI/MultiView.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,13 @@ class MultiView final : public GUI::StackWidget {
9797
Action& view_as_icons_action() { return *m_view_as_icons_action; }
9898
Action& view_as_columns_action() { return *m_view_as_columns_action; }
9999

100-
bool is_multi_select() const { return m_multi_select; }
101-
void set_multi_select(bool);
100+
AbstractView::SelectionMode selection_mode() const;
101+
void set_selection_mode(AbstractView::SelectionMode);
102102

103103
private:
104104
MultiView();
105105

106106
void build_actions();
107-
void apply_multi_select();
108107

109108
ViewMode m_view_mode { Invalid };
110109
int m_model_column { 0 };
@@ -120,8 +119,6 @@ class MultiView final : public GUI::StackWidget {
120119
RefPtr<Action> m_view_as_columns_action;
121120

122121
OwnPtr<ActionGroup> m_view_type_action_group;
123-
124-
bool m_multi_select { true };
125122
};
126123

127124
}

0 commit comments

Comments
 (0)