FilterGallery.cpp 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "FilterGallery.h"
  7. #include "FilterTreeModel.h"
  8. #include <Applications/PixelPaint/FilterGalleryGML.h>
  9. #include <LibGUI/Button.h>
  10. #include <LibGUI/TreeView.h>
  11. #include <LibGUI/Widget.h>
  12. namespace PixelPaint {
  13. FilterGallery::FilterGallery(GUI::Window* parent_window, ImageEditor* editor)
  14. : GUI::Dialog(parent_window)
  15. {
  16. set_title("Filter Gallery");
  17. set_icon(parent_window->icon());
  18. resize(400, 250);
  19. set_resizable(true);
  20. auto main_widget = set_main_widget<GUI::Widget>().release_value_but_fixme_should_propagate_errors();
  21. main_widget->load_from_gml(filter_gallery_gml).release_value_but_fixme_should_propagate_errors();
  22. m_filter_tree = main_widget->find_descendant_of_type_named<GUI::TreeView>("tree_view");
  23. auto apply_button = main_widget->find_descendant_of_type_named<GUI::Button>("apply_button");
  24. auto cancel_button = main_widget->find_descendant_of_type_named<GUI::Button>("cancel_button");
  25. m_config_widget = main_widget->find_descendant_of_type_named<GUI::Widget>("config_widget");
  26. m_preview_widget = main_widget->find_descendant_of_type_named<FilterPreviewWidget>("preview_widget");
  27. VERIFY(m_filter_tree);
  28. VERIFY(apply_button);
  29. VERIFY(cancel_button);
  30. VERIFY(m_config_widget);
  31. VERIFY(m_preview_widget);
  32. m_error_label = GUI::Label::try_create().release_value_but_fixme_should_propagate_errors();
  33. m_error_label->set_enabled(false);
  34. auto filter_tree_model = MUST(create_filter_tree_model(editor));
  35. m_filter_tree->set_model(filter_tree_model);
  36. m_filter_tree->expand_tree();
  37. m_filter_tree->on_selection_change = [this]() {
  38. auto selected_index = m_filter_tree->selection().first();
  39. if (!selected_index.is_valid()) {
  40. m_preview_widget->clear_filter();
  41. return;
  42. }
  43. auto& node = *static_cast<GUI::TreeViewModel::Node*>(selected_index.internal_data());
  44. if (!is<FilterNode>(node)) {
  45. m_preview_widget->clear_filter();
  46. return;
  47. }
  48. m_selected_filter = &static_cast<FilterNode&>(node).filter();
  49. m_selected_filter->on_settings_change = [&]() {
  50. m_preview_widget->set_filter(m_selected_filter);
  51. };
  52. m_preview_widget->set_filter(m_selected_filter);
  53. auto settings_widget_or_error = m_selected_filter->get_settings_widget();
  54. if (settings_widget_or_error.is_error()) {
  55. m_error_label->set_text(DeprecatedString::formatted("Error creating settings: {}", settings_widget_or_error.error()));
  56. m_selected_filter_config_widget = m_error_label;
  57. } else {
  58. m_selected_filter_config_widget = settings_widget_or_error.release_value();
  59. }
  60. m_config_widget->remove_all_children();
  61. m_config_widget->add_child(*m_selected_filter_config_widget);
  62. };
  63. m_preview_widget->set_layer(editor->active_layer());
  64. m_preview_widget->set_bitmap(editor->active_layer()->content_bitmap().clone().release_value());
  65. apply_button->on_click = [this](auto) {
  66. if (!m_selected_filter) {
  67. done(ExecResult::Aborted);
  68. return;
  69. }
  70. m_selected_filter->apply();
  71. done(ExecResult::OK);
  72. };
  73. cancel_button->on_click = [this](auto) {
  74. done(ExecResult::Cancel);
  75. };
  76. }
  77. }