FilterModel.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * Copyright (c) 2021-2022, Tobias Christiansen <tobyase@serenityos.org>
  3. * Copyright (c) 2021, Mustafa Quraish <mustafa@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include "FilterModel.h"
  8. #include "FilterParams.h"
  9. #include "Filters/Bloom.h"
  10. #include "Filters/BoxBlur3.h"
  11. #include "Filters/BoxBlur5.h"
  12. #include "Filters/FastBoxBlur.h"
  13. #include "Filters/GaussBlur3.h"
  14. #include "Filters/GaussBlur5.h"
  15. #include "Filters/Grayscale.h"
  16. #include "Filters/Invert.h"
  17. #include "Filters/LaplaceCardinal.h"
  18. #include "Filters/LaplaceDiagonal.h"
  19. #include "Filters/Sepia.h"
  20. #include "Filters/Sharpen.h"
  21. #include "Layer.h"
  22. #include <LibGUI/FileIconProvider.h>
  23. namespace PixelPaint {
  24. FilterModel::FilterModel(ImageEditor* editor)
  25. {
  26. auto artistic_category = FilterInfo::create_category("Artistic");
  27. auto bloom_filter = FilterInfo::create_filter<Filters::Bloom>(editor, artistic_category);
  28. m_filters.append(artistic_category);
  29. auto spatial_category = FilterInfo::create_category("Spatial");
  30. auto edge_detect_category = FilterInfo::create_category("Edge Detection", spatial_category);
  31. auto laplace_cardinal_filter = FilterInfo::create_filter<Filters::LaplaceCardinal>(editor, edge_detect_category);
  32. auto laplace_diagonal_filter = FilterInfo::create_filter<Filters::LaplaceDiagonal>(editor, edge_detect_category);
  33. auto blur_category = FilterInfo::create_category("Blur & Sharpen", spatial_category);
  34. auto fast_box_filter = FilterInfo::create_filter<Filters::FastBoxBlur>(editor, blur_category);
  35. auto gaussian_blur_filter_3 = FilterInfo::create_filter<Filters::GaussBlur3>(editor, blur_category);
  36. auto gaussian_blur_filter_5 = FilterInfo::create_filter<Filters::GaussBlur5>(editor, blur_category);
  37. auto box_blur_filter_3 = FilterInfo::create_filter<Filters::BoxBlur3>(editor, blur_category);
  38. auto box_blur_filter_5 = FilterInfo::create_filter<Filters::BoxBlur5>(editor, blur_category);
  39. auto sharpen_filter = FilterInfo::create_filter<Filters::Sharpen>(editor, blur_category);
  40. m_filters.append(spatial_category);
  41. auto color_category = FilterInfo::create_category("Color");
  42. auto grayscale_filter = FilterInfo::create_filter<Filters::Grayscale>(editor, color_category);
  43. auto invert_filter = FilterInfo::create_filter<Filters::Invert>(editor, color_category);
  44. auto sepia_filter = FilterInfo::create_filter<Filters::Sepia>(editor, color_category);
  45. m_filters.append(color_category);
  46. auto filter_bitmap = Gfx::Bitmap::try_load_from_file("/res/icons/pixelpaint/filter.png").release_value_but_fixme_should_propagate_errors();
  47. m_filter_icon = GUI::Icon(filter_bitmap);
  48. }
  49. GUI::ModelIndex FilterModel::index(int row, int column, const GUI::ModelIndex& parent_index) const
  50. {
  51. if (!parent_index.is_valid()) {
  52. if (static_cast<size_t>(row) >= m_filters.size())
  53. return {};
  54. return create_index(row, column, &m_filters[row]);
  55. }
  56. auto* parent = static_cast<const FilterInfo*>(parent_index.internal_data());
  57. if (static_cast<size_t>(row) >= parent->children.size())
  58. return {};
  59. auto* child = &parent->children[row];
  60. return create_index(row, column, child);
  61. }
  62. GUI::ModelIndex FilterModel::parent_index(const GUI::ModelIndex& index) const
  63. {
  64. if (!index.is_valid())
  65. return {};
  66. auto* child = static_cast<const FilterInfo*>(index.internal_data());
  67. auto* parent = child->parent;
  68. if (parent == nullptr)
  69. return {};
  70. if (parent->parent == nullptr) {
  71. for (size_t row = 0; row < m_filters.size(); row++)
  72. if (m_filters.ptr_at(row).ptr() == parent)
  73. return create_index(row, 0, parent);
  74. VERIFY_NOT_REACHED();
  75. }
  76. for (size_t row = 0; row < parent->parent->children.size(); row++) {
  77. FilterInfo* child_at_row = parent->parent->children.ptr_at(row).ptr();
  78. if (child_at_row == parent)
  79. return create_index(row, 0, parent);
  80. }
  81. VERIFY_NOT_REACHED();
  82. }
  83. int FilterModel::row_count(const GUI::ModelIndex& index) const
  84. {
  85. if (!index.is_valid())
  86. return m_filters.size();
  87. auto* node = static_cast<const FilterInfo*>(index.internal_data());
  88. return node->children.size();
  89. }
  90. GUI::Variant FilterModel::data(const GUI::ModelIndex& index, GUI::ModelRole role) const
  91. {
  92. auto* filter = static_cast<const FilterInfo*>(index.internal_data());
  93. switch (role) {
  94. case GUI::ModelRole::Display:
  95. return filter->text;
  96. case GUI::ModelRole::Icon:
  97. if (filter->type == FilterInfo::Type::Category)
  98. return GUI::FileIconProvider::directory_icon();
  99. return m_filter_icon;
  100. default:
  101. return {};
  102. }
  103. }
  104. }