DirectoryView.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/URL.h>
  8. #include <AK/Vector.h>
  9. #include <LibConfig/Listener.h>
  10. #include <LibDesktop/Launcher.h>
  11. #include <LibGUI/Action.h>
  12. #include <LibGUI/ColumnsView.h>
  13. #include <LibGUI/FileSystemModel.h>
  14. #include <LibGUI/IconView.h>
  15. #include <LibGUI/StackWidget.h>
  16. #include <LibGUI/TableView.h>
  17. #include <fcntl.h>
  18. #include <sys/stat.h>
  19. namespace FileManager {
  20. void spawn_terminal(String const& directory);
  21. class LauncherHandler : public RefCounted<LauncherHandler> {
  22. public:
  23. LauncherHandler(NonnullRefPtr<Desktop::Launcher::Details> const& details)
  24. : m_details(details)
  25. {
  26. }
  27. NonnullRefPtr<GUI::Action> create_launch_action(Function<void(LauncherHandler const&)>);
  28. Desktop::Launcher::Details const& details() const { return *m_details; }
  29. private:
  30. NonnullRefPtr<Desktop::Launcher::Details> m_details;
  31. };
  32. class DirectoryView final
  33. : public GUI::StackWidget
  34. , private GUI::ModelClient
  35. , public Config::Listener {
  36. C_OBJECT(DirectoryView);
  37. public:
  38. enum class Mode {
  39. Desktop,
  40. Normal,
  41. };
  42. virtual ~DirectoryView() override;
  43. bool open(String const& path);
  44. String path() const { return model().root_path(); }
  45. void open_parent_directory();
  46. void open_previous_directory();
  47. void open_next_directory();
  48. int path_history_size() const { return m_path_history.size(); }
  49. int path_history_position() const { return m_path_history_position; }
  50. static RefPtr<LauncherHandler> get_default_launch_handler(NonnullRefPtrVector<LauncherHandler> const& handlers);
  51. static NonnullRefPtrVector<LauncherHandler> get_launch_handlers(URL const& url);
  52. static NonnullRefPtrVector<LauncherHandler> get_launch_handlers(String const& path);
  53. void refresh();
  54. void launch(URL const&, LauncherHandler const&) const;
  55. Function<void(StringView path, bool can_read_in_path, bool can_write_in_path)> on_path_change;
  56. Function<void(GUI::AbstractView&)> on_selection_change;
  57. Function<void(GUI::ModelIndex const&, GUI::ContextMenuEvent const&)> on_context_menu_request;
  58. Function<void(StringView)> on_status_message;
  59. Function<void(int done, int total)> on_thumbnail_progress;
  60. Function<void()> on_accepted_drop;
  61. enum ViewMode {
  62. Invalid,
  63. Table,
  64. Columns,
  65. Icon
  66. };
  67. void set_view_mode(ViewMode);
  68. ViewMode view_mode() const { return m_view_mode; }
  69. void set_view_mode_from_string(String const&);
  70. GUI::AbstractView& current_view()
  71. {
  72. switch (m_view_mode) {
  73. case ViewMode::Table:
  74. return *m_table_view;
  75. case ViewMode::Columns:
  76. return *m_columns_view;
  77. case ViewMode::Icon:
  78. return *m_icon_view;
  79. default:
  80. VERIFY_NOT_REACHED();
  81. }
  82. }
  83. GUI::AbstractView const& current_view() const
  84. {
  85. return const_cast<DirectoryView*>(this)->current_view();
  86. }
  87. template<typename Callback>
  88. void for_each_view_implementation(Callback callback)
  89. {
  90. if (m_icon_view)
  91. callback(*m_icon_view);
  92. if (m_table_view)
  93. callback(*m_table_view);
  94. if (m_columns_view)
  95. callback(*m_columns_view);
  96. }
  97. void set_should_show_dotfiles(bool);
  98. GUI::FileSystemModel::Node const& node(GUI::ModelIndex const&) const;
  99. bool is_desktop() const { return m_mode == Mode::Desktop; }
  100. Vector<String> selected_file_paths() const;
  101. GUI::Action& mkdir_action() { return *m_mkdir_action; }
  102. GUI::Action& touch_action() { return *m_touch_action; }
  103. GUI::Action& open_terminal_action() { return *m_open_terminal_action; }
  104. GUI::Action& delete_action() { return *m_delete_action; }
  105. GUI::Action& force_delete_action() { return *m_force_delete_action; }
  106. GUI::Action& rename_action() { return *m_rename_action; }
  107. GUI::Action& view_as_icons_action() { return *m_view_as_icons_action; }
  108. GUI::Action& view_as_table_action() { return *m_view_as_table_action; }
  109. GUI::Action& view_as_columns_action() { return *m_view_as_columns_action; }
  110. // ^Config::Listener
  111. virtual void config_string_did_change(String const& domain, String const& group, String const& key, String const& value) override;
  112. private:
  113. explicit DirectoryView(Mode);
  114. GUI::FileSystemModel const& model() const { return *m_model; }
  115. GUI::FileSystemModel& model() { return *m_model; }
  116. void handle_selection_change();
  117. void handle_drop(GUI::ModelIndex const&, GUI::DropEvent const&);
  118. void do_delete(bool should_confirm);
  119. // ^GUI::ModelClient
  120. virtual void model_did_update(unsigned) override;
  121. void setup_actions();
  122. void setup_model();
  123. void setup_icon_view();
  124. void setup_columns_view();
  125. void setup_table_view();
  126. void handle_activation(GUI::ModelIndex const&);
  127. void set_status_message(StringView);
  128. void update_statusbar();
  129. Mode m_mode { Mode::Normal };
  130. ViewMode m_view_mode { Invalid };
  131. NonnullRefPtr<GUI::FileSystemModel> m_model;
  132. NonnullRefPtr<GUI::SortingProxyModel> m_sorting_model;
  133. size_t m_path_history_position { 0 };
  134. Vector<String> m_path_history;
  135. void add_path_to_history(String);
  136. RefPtr<GUI::Label> m_error_label;
  137. RefPtr<GUI::TableView> m_table_view;
  138. RefPtr<GUI::IconView> m_icon_view;
  139. RefPtr<GUI::ColumnsView> m_columns_view;
  140. RefPtr<GUI::Action> m_mkdir_action;
  141. RefPtr<GUI::Action> m_touch_action;
  142. RefPtr<GUI::Action> m_open_terminal_action;
  143. RefPtr<GUI::Action> m_delete_action;
  144. RefPtr<GUI::Action> m_force_delete_action;
  145. RefPtr<GUI::Action> m_rename_action;
  146. RefPtr<GUI::Action> m_view_as_table_action;
  147. RefPtr<GUI::Action> m_view_as_icons_action;
  148. RefPtr<GUI::Action> m_view_as_columns_action;
  149. };
  150. }