MultiView.cpp 4.1 KB

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