GFilePicker.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include <LibGUI/GFilePicker.h>
  2. #include <LibGUI/GBoxLayout.h>
  3. #include <LibGUI/GDirectoryModel.h>
  4. #include <LibGUI/GTextBox.h>
  5. #include <LibGUI/GLabel.h>
  6. #include <LibGUI/GButton.h>
  7. #include <LibGUI/GSortingProxyModel.h>
  8. #include <LibGUI/GAction.h>
  9. #include <LibGUI/GToolBar.h>
  10. #include <AK/FileSystemPath.h>
  11. GFilePicker::GFilePicker(const String& path, CObject* parent)
  12. : GDialog(parent)
  13. , m_model(GDirectoryModel::create())
  14. {
  15. set_title("GFilePicker");
  16. set_rect(200, 200, 400, 300);
  17. set_main_widget(new GWidget);
  18. main_widget()->set_layout(make<GBoxLayout>(Orientation::Vertical));
  19. main_widget()->layout()->set_margins({ 4, 4, 4, 4 });
  20. main_widget()->layout()->set_spacing(4);
  21. main_widget()->set_fill_with_background_color(true);
  22. main_widget()->set_background_color(Color::LightGray);
  23. auto* upper_container = new GWidget(main_widget());
  24. upper_container->set_layout(make<GBoxLayout>(Orientation::Horizontal));
  25. upper_container->layout()->set_spacing(4);
  26. upper_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
  27. upper_container->set_preferred_size({ 0, 26 });
  28. auto* toolbar = new GToolBar(upper_container);
  29. toolbar->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill);
  30. toolbar->set_preferred_size({ 32, 0 });
  31. auto* location_textbox = new GTextBox(upper_container);
  32. location_textbox->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
  33. location_textbox->set_preferred_size({ 0, 20 });
  34. m_view = new GTableView(main_widget());
  35. m_view->set_model(GSortingProxyModel::create(*m_model));
  36. m_view->set_column_hidden(GDirectoryModel::Column::Owner, true);
  37. m_view->set_column_hidden(GDirectoryModel::Column::Group, true);
  38. m_view->set_column_hidden(GDirectoryModel::Column::Permissions, true);
  39. m_view->set_column_hidden(GDirectoryModel::Column::Inode, true);
  40. m_model->open(path);
  41. location_textbox->on_return_pressed = [&] {
  42. m_model->open(location_textbox->text());
  43. };
  44. auto open_parent_directory_action = GAction::create("Open parent directory", { Mod_Alt, Key_Up }, GraphicsBitmap::load_from_file("/res/icons/16x16/open-parent-directory.png"), [this] (const GAction&) {
  45. m_model->open(String::format("%s/..", m_model->path().characters()));
  46. });
  47. toolbar->add_action(*open_parent_directory_action);
  48. auto* lower_container = new GWidget(main_widget());
  49. lower_container->set_layout(make<GBoxLayout>(Orientation::Vertical));
  50. lower_container->layout()->set_spacing(4);
  51. lower_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
  52. lower_container->set_preferred_size({ 0, 60 });
  53. auto* filename_container = new GWidget(lower_container);
  54. filename_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
  55. filename_container->set_preferred_size({ 0, 20 });
  56. filename_container->set_layout(make<GBoxLayout>(Orientation::Horizontal));
  57. auto* filename_label = new GLabel("File name:", filename_container);
  58. filename_label->set_text_alignment(TextAlignment::CenterLeft);
  59. filename_label->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill);
  60. filename_label->set_preferred_size({ 60, 0 });
  61. auto* filename_textbox = new GTextBox(filename_container);
  62. m_view->on_activation = [this, filename_textbox] (auto& index) {
  63. auto& filter_model = (GSortingProxyModel&)*m_view->model();
  64. auto local_index = filter_model.map_to_target(index);
  65. const GDirectoryModel::Entry& entry = m_model->entry(local_index.row());
  66. FileSystemPath path(String::format("%s/%s", m_model->path().characters(), entry.name.characters()));
  67. if (entry.is_directory()) {
  68. m_model->open(path.string());
  69. // NOTE: 'entry' is invalid from here on
  70. } else {
  71. filename_textbox->set_text(entry.name);
  72. }
  73. };
  74. auto* button_container = new GWidget(lower_container);
  75. button_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
  76. button_container->set_preferred_size({ 0, 20 });
  77. button_container->set_layout(make<GBoxLayout>(Orientation::Horizontal));
  78. button_container->layout()->set_spacing(4);
  79. button_container->layout()->add_spacer();
  80. auto* cancel_button = new GButton(button_container);
  81. cancel_button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill);
  82. cancel_button->set_preferred_size({ 80, 0 });
  83. cancel_button->set_caption("Cancel");
  84. cancel_button->on_click = [this] (auto&) {
  85. done(ExecCancel);
  86. };
  87. auto* ok_button = new GButton(button_container);
  88. ok_button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill);
  89. ok_button->set_preferred_size({ 80, 0 });
  90. ok_button->set_caption("OK");
  91. ok_button->on_click = [this] (auto&) {
  92. done(ExecOK);
  93. };
  94. }
  95. GFilePicker::~GFilePicker()
  96. {
  97. }