MultiView.cpp 4.3 KB

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