mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:58:12 +00:00
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.
This commit is contained in:
parent
207ecf454a
commit
f7116bba43
8 changed files with 31 additions and 25 deletions
|
@ -202,6 +202,7 @@ void DirectoryView::setup_model()
|
|||
void DirectoryView::setup_icon_view()
|
||||
{
|
||||
m_icon_view = add<GUI::IconView>();
|
||||
m_icon_view->set_selection_mode(GUI::AbstractView::SelectionMode::MultiSelection);
|
||||
m_icon_view->set_editable(true);
|
||||
m_icon_view->set_edit_triggers(GUI::AbstractView::EditTrigger::EditKeyPressed);
|
||||
m_icon_view->aid_create_editing_delegate = [](auto&) {
|
||||
|
@ -236,6 +237,7 @@ void DirectoryView::setup_icon_view()
|
|||
void DirectoryView::setup_columns_view()
|
||||
{
|
||||
m_columns_view = add<GUI::ColumnsView>();
|
||||
m_columns_view->set_selection_mode(GUI::AbstractView::SelectionMode::MultiSelection);
|
||||
m_columns_view->set_editable(true);
|
||||
m_columns_view->set_edit_triggers(GUI::AbstractView::EditTrigger::EditKeyPressed);
|
||||
m_columns_view->aid_create_editing_delegate = [](auto&) {
|
||||
|
@ -266,6 +268,7 @@ void DirectoryView::setup_columns_view()
|
|||
void DirectoryView::setup_table_view()
|
||||
{
|
||||
m_table_view = add<GUI::TableView>();
|
||||
m_table_view->set_selection_mode(GUI::AbstractView::SelectionMode::MultiSelection);
|
||||
m_table_view->set_editable(true);
|
||||
m_table_view->set_edit_triggers(GUI::AbstractView::EditTrigger::EditKeyPressed);
|
||||
m_table_view->aid_create_editing_delegate = [](auto&) {
|
||||
|
|
|
@ -160,7 +160,6 @@ void CellTypeDialog::setup_tabs(GUI::TabWidget& tabs, const Vector<Position>& po
|
|||
|
||||
auto& type_list = left_side.add<GUI::ListView>();
|
||||
type_list.set_model(*GUI::ItemListModel<String>::create(g_types));
|
||||
type_list.set_multi_select(false);
|
||||
type_list.set_should_hide_unnecessary_scrollbars(true);
|
||||
type_list.on_selection = [&](auto& index) {
|
||||
if (!index.is_valid()) {
|
||||
|
|
|
@ -403,16 +403,21 @@ void AbstractView::drop_event(DropEvent& event)
|
|||
on_drop(index, event);
|
||||
}
|
||||
|
||||
void AbstractView::set_multi_select(bool multi_select)
|
||||
void AbstractView::set_selection_mode(SelectionMode selection_mode)
|
||||
{
|
||||
if (m_multi_select == multi_select)
|
||||
if (m_selection_mode == selection_mode)
|
||||
return;
|
||||
m_multi_select = multi_select;
|
||||
if (!multi_select && m_selection.size() > 1) {
|
||||
m_selection_mode = selection_mode;
|
||||
|
||||
if (m_selection_mode == SelectionMode::NoSelection)
|
||||
m_selection.clear();
|
||||
else if (m_selection_mode != SelectionMode::SingleSelection && m_selection.size() > 1) {
|
||||
auto first_selected = m_selection.first();
|
||||
m_selection.clear();
|
||||
m_selection.set(first_selected);
|
||||
}
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void AbstractView::set_key_column_and_sort_order(int column, SortOrder sort_order)
|
||||
|
|
|
@ -65,6 +65,12 @@ public:
|
|||
SelectRows,
|
||||
};
|
||||
|
||||
enum class SelectionMode {
|
||||
SingleSelection,
|
||||
MultiSelection,
|
||||
NoSelection,
|
||||
};
|
||||
|
||||
virtual void move_cursor(CursorMovement, SelectionUpdate) { }
|
||||
|
||||
void set_model(RefPtr<Model>);
|
||||
|
@ -96,8 +102,8 @@ public:
|
|||
SelectionBehavior selection_behavior() const { return m_selection_behavior; }
|
||||
void set_selection_behavior(SelectionBehavior behavior) { m_selection_behavior = behavior; }
|
||||
|
||||
bool is_multi_select() const { return m_multi_select; }
|
||||
void set_multi_select(bool);
|
||||
SelectionMode selection_mode() const { return m_selection_mode; }
|
||||
void set_selection_mode(SelectionMode);
|
||||
|
||||
virtual void model_did_update(unsigned flags) override;
|
||||
virtual void did_update_selection();
|
||||
|
@ -197,9 +203,9 @@ private:
|
|||
RefPtr<Core::Timer> m_searching_timer;
|
||||
ModelIndex m_cursor_index;
|
||||
SelectionBehavior m_selection_behavior { SelectionBehavior::SelectItems };
|
||||
SelectionMode m_selection_mode { SelectionMode::SingleSelection };
|
||||
unsigned m_edit_triggers { EditTrigger::DoubleClicked | EditTrigger::EditKeyPressed };
|
||||
bool m_activates_on_selection { false };
|
||||
bool m_multi_select { true };
|
||||
bool m_tab_key_navigation_enabled { false };
|
||||
bool m_is_dragging { false };
|
||||
bool m_draw_item_text_with_shadow { false };
|
||||
|
|
|
@ -123,7 +123,7 @@ FilePicker::FilePicker(Window* parent_window, Mode mode, Options options, const
|
|||
m_location_textbox->set_text(path);
|
||||
|
||||
m_view = vertical_container.add<MultiView>();
|
||||
m_view->set_multi_select(m_mode == Mode::OpenMultiple);
|
||||
m_view->set_selection_mode(m_mode == Mode::OpenMultiple ? GUI::AbstractView::SelectionMode::MultiSelection : GUI::AbstractView::SelectionMode::SingleSelection);
|
||||
m_view->set_model(SortingProxyModel::create(*m_model));
|
||||
m_view->set_model_column(FileSystemModel::Column::Name);
|
||||
m_view->set_key_column_and_sort_order(GUI::FileSystemModel::Column::Name, GUI::SortOrder::Ascending);
|
||||
|
|
|
@ -247,7 +247,7 @@ void IconView::mousedown_event(MouseEvent& event)
|
|||
auto adjusted_position = to_content_position(event.position());
|
||||
|
||||
m_might_drag = false;
|
||||
if (is_multi_select()) {
|
||||
if (selection_mode() == SelectionMode::MultiSelection) {
|
||||
m_rubber_banding = true;
|
||||
m_rubber_band_origin = adjusted_position;
|
||||
m_rubber_band_current = adjusted_position;
|
||||
|
|
|
@ -97,7 +97,6 @@ MultiView::MultiView()
|
|||
|
||||
build_actions();
|
||||
set_view_mode(ViewMode::Icon);
|
||||
apply_multi_select();
|
||||
}
|
||||
|
||||
MultiView::~MultiView()
|
||||
|
@ -176,19 +175,16 @@ void MultiView::build_actions()
|
|||
m_view_type_action_group->add_action(*m_view_as_columns_action);
|
||||
}
|
||||
|
||||
void MultiView::apply_multi_select()
|
||||
AbstractView::SelectionMode MultiView::selection_mode() const
|
||||
{
|
||||
m_table_view->set_multi_select(m_multi_select);
|
||||
m_icon_view->set_multi_select(m_multi_select);
|
||||
m_columns_view->set_multi_select(m_multi_select);
|
||||
return m_table_view->selection_mode();
|
||||
}
|
||||
|
||||
void MultiView::set_multi_select(bool multi_select)
|
||||
void MultiView::set_selection_mode(AbstractView::SelectionMode selection_mode)
|
||||
{
|
||||
if (m_multi_select == multi_select)
|
||||
return;
|
||||
m_multi_select = multi_select;
|
||||
apply_multi_select();
|
||||
m_table_view->set_selection_mode(selection_mode);
|
||||
m_icon_view->set_selection_mode(selection_mode);
|
||||
m_columns_view->set_selection_mode(selection_mode);
|
||||
}
|
||||
|
||||
void MultiView::set_key_column_and_sort_order(int column, SortOrder sort_order)
|
||||
|
|
|
@ -97,14 +97,13 @@ public:
|
|||
Action& view_as_icons_action() { return *m_view_as_icons_action; }
|
||||
Action& view_as_columns_action() { return *m_view_as_columns_action; }
|
||||
|
||||
bool is_multi_select() const { return m_multi_select; }
|
||||
void set_multi_select(bool);
|
||||
AbstractView::SelectionMode selection_mode() const;
|
||||
void set_selection_mode(AbstractView::SelectionMode);
|
||||
|
||||
private:
|
||||
MultiView();
|
||||
|
||||
void build_actions();
|
||||
void apply_multi_select();
|
||||
|
||||
ViewMode m_view_mode { Invalid };
|
||||
int m_model_column { 0 };
|
||||
|
@ -120,8 +119,6 @@ private:
|
|||
RefPtr<Action> m_view_as_columns_action;
|
||||
|
||||
OwnPtr<ActionGroup> m_view_type_action_group;
|
||||
|
||||
bool m_multi_select { true };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue