aboutsummaryrefslogtreecommitdiff
path: root/src/theme_builder/components/styler/BorderStylerEditor.cpp
blob: 6c87ad32b54beb4f22a467c4ce2337ca4ccd1d33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "BorderStylerEditor.h"
#include <memory>
#include "cru/common/ClonablePtr.h"
#include "cru/platform/graphics/Brush.h"
#include "cru/platform/graphics/Factory.h"
#include "cru/platform/gui/UiApplication.h"
#include "cru/ui/style/ApplyBorderStyleInfo.h"
#include "cru/ui/style/Styler.h"

namespace cru::theme_builder::components::styler {
BorderStylerEditor::BorderStylerEditor() {
  container_.AddChild(corner_radius_editor_.GetRootControl());
  container_.AddChild(thickness_editor_.GetRootControl());
  container_.AddChild(brush_editor_.GetRootControl());
  container_.AddChild(foreground_brush_editor_.GetRootControl());
  container_.AddChild(background_brush_editor_.GetRootControl());

  // TODO: Add change listener.
}

BorderStylerEditor::~BorderStylerEditor() { container_.RemoveFromParent(); }

ClonablePtr<ui::style::BorderStyler> BorderStylerEditor::GetStyler() {
  auto graphics_factory =
      platform::gui::IUiApplication::GetInstance()->GetGraphicsFactory();

  ui::style::ApplyBorderStyleInfo border_style;
  if (corner_radius_editor_.IsEnabled()) {
    border_style.border_radius =
        corner_radius_editor_.GetEditor()->GetCornerRadius();
  }

  if (thickness_editor_.IsEnabled()) {
    border_style.border_thickness =
        thickness_editor_.GetEditor()->GetThickness();
  }

  if (brush_editor_.IsEnabled()) {
    border_style.border_brush = graphics_factory->CreateSolidColorBrush(
        brush_editor_.GetEditor()->GetColor());
  }

  if (foreground_brush_editor_.IsEnabled()) {
    border_style.foreground_brush = graphics_factory->CreateSolidColorBrush(
        foreground_brush_editor_.GetEditor()->GetColor());
  }

  if (background_brush_editor_.IsEnabled()) {
    border_style.background_brush = graphics_factory->CreateSolidColorBrush(
        background_brush_editor_.GetEditor()->GetColor());
  }

  return ui::style::BorderStyler::Create(border_style);
}

void BorderStylerEditor::SetStyler(
    const ClonablePtr<ui::style::BorderStyler> &styler) {
  Expects(styler);

  auto border_style = styler->GetBorderStyle();
  corner_radius_editor_.SetEnabled(border_style.border_radius.has_value());
  if (border_style.border_radius.has_value()) {
    corner_radius_editor_.GetEditor()->SetCornerRadius(
        *border_style.border_radius);
  }

  thickness_editor_.SetEnabled(border_style.border_thickness.has_value());
  if (border_style.border_thickness.has_value()) {
    thickness_editor_.GetEditor()->SetThickness(*border_style.border_thickness);
  }

  brush_editor_.SetEnabled(border_style.border_brush.has_value());
  if (border_style.border_brush.has_value()) {
    brush_editor_.GetEditor()->SetColor(
        std::dynamic_pointer_cast<platform::graphics::ISolidColorBrush>(
            border_style.border_brush.value())
            ->GetColor());
  }

  foreground_brush_editor_.SetEnabled(
      border_style.foreground_brush.has_value());
  if (border_style.foreground_brush.has_value()) {
    foreground_brush_editor_.GetEditor()->SetColor(
        std::dynamic_pointer_cast<platform::graphics::ISolidColorBrush>(
            border_style.foreground_brush.value())
            ->GetColor());
  }

  background_brush_editor_.SetEnabled(
      border_style.background_brush.has_value());

  if (border_style.background_brush.has_value()) {
    background_brush_editor_.GetEditor()->SetColor(
        std::dynamic_pointer_cast<platform::graphics::ISolidColorBrush>(
            border_style.background_brush.value())
            ->GetColor());
  }
}

}  // namespace cru::theme_builder::components::styler