1 /*
2 * Copyright 2006, 2023, Haiku. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Stephan Aßmus <superstippi@gmx.de>
7 * Zardshard
8 */
9
10 #include "PathSourceShape.h"
11
12 #include <new>
13
14 #include <agg_bounding_rect.h>
15 #include <Message.h>
16
17 #ifdef ICON_O_MATIC
18 # include "CommonPropertyIDs.h"
19 # include "Property.h"
20 # include "PropertyObject.h"
21 #endif // ICON_O_MATIC
22 #include "Style.h"
23
24 using std::nothrow;
25
26 _USING_ICON_NAMESPACE
27
28
PathSourceShape(::Style * style)29 PathSourceShape::PathSourceShape(::Style* style)
30 : Shape(style),
31
32 fMinVisibilityScale(0.0),
33 fMaxVisibilityScale(4.0)
34 {
35 }
36
37
PathSourceShape(const PathSourceShape & other)38 PathSourceShape::PathSourceShape(const PathSourceShape& other)
39 : Shape(other),
40
41 fMinVisibilityScale(other.fMinVisibilityScale),
42 fMaxVisibilityScale(other.fMaxVisibilityScale)
43 {
44 }
45
46
~PathSourceShape()47 PathSourceShape::~PathSourceShape()
48 {
49 }
50
51
52 // #pragma mark -
53
54
55 status_t
Unarchive(BMessage * archive)56 PathSourceShape::Unarchive(BMessage* archive)
57 {
58 Shape::Unarchive(archive);
59
60 // min visibility scale
61 if (archive->FindFloat("min visibility scale", &fMinVisibilityScale) < B_OK)
62 fMinVisibilityScale = 0.0;
63
64 // max visibility scale
65 if (archive->FindFloat("max visibility scale", &fMaxVisibilityScale) < B_OK)
66 fMaxVisibilityScale = 4.0;
67
68 if (fMinVisibilityScale < 0.0)
69 fMinVisibilityScale = 0.0;
70 if (fMinVisibilityScale > 4.0)
71 fMinVisibilityScale = 4.0;
72 if (fMaxVisibilityScale < 0.0)
73 fMaxVisibilityScale = 0.0;
74 if (fMaxVisibilityScale > 4.0)
75 fMaxVisibilityScale = 4.0;
76
77 return B_OK;
78 }
79
80
81 #ifdef ICON_O_MATIC
82 status_t
Archive(BMessage * into,bool deep) const83 PathSourceShape::Archive(BMessage* into, bool deep) const
84 {
85 status_t ret = Shape::Archive(into, deep);
86
87 // min visibility scale
88 if (ret == B_OK)
89 ret = into->AddFloat("min visibility scale", fMinVisibilityScale);
90
91 // max visibility scale
92 if (ret == B_OK)
93 ret = into->AddFloat("max visibility scale", fMaxVisibilityScale);
94
95 return ret;
96 }
97
98
99 PropertyObject*
MakePropertyObject() const100 PathSourceShape::MakePropertyObject() const
101 {
102 PropertyObject* object = Shape::MakePropertyObject();
103 if (object == NULL)
104 return NULL;
105
106 // object->AddProperty(new BoolProperty(PROPERTY_HINTING, fHinting));
107
108 object->AddProperty(new FloatProperty(PROPERTY_MIN_VISIBILITY_SCALE,
109 fMinVisibilityScale, 0, 4));
110
111 object->AddProperty(new FloatProperty(PROPERTY_MAX_VISIBILITY_SCALE,
112 fMaxVisibilityScale, 0, 4));
113
114 return object;
115 }
116
117
118 bool
SetToPropertyObject(const PropertyObject * object)119 PathSourceShape::SetToPropertyObject(const PropertyObject* object)
120 {
121 AutoNotificationSuspender _(this);
122 Shape::SetToPropertyObject(object);
123
124 // hinting
125 // SetHinting(object->Value(PROPERTY_HINTING, fHinting));
126
127 // min visibility scale
128 SetMinVisibilityScale(object->Value(PROPERTY_MIN_VISIBILITY_SCALE, fMinVisibilityScale));
129
130 // max visibility scale
131 SetMaxVisibilityScale(object->Value(PROPERTY_MAX_VISIBILITY_SCALE, fMaxVisibilityScale));
132
133 return HasPendingNotifications();
134 }
135 #endif // ICON_O_MATIC
136
137
138 // #pragma mark -
139
140
141 status_t
InitCheck() const142 PathSourceShape::InitCheck() const
143 {
144 return Shape::InitCheck();
145 }
146
147
148 // #pragma mark -
149
150
151 void
SetMinVisibilityScale(float scale)152 PathSourceShape::SetMinVisibilityScale(float scale)
153 {
154 if (fMinVisibilityScale == scale)
155 return;
156
157 fMinVisibilityScale = scale;
158 Notify();
159 }
160
161
162 void
SetMaxVisibilityScale(float scale)163 PathSourceShape::SetMaxVisibilityScale(float scale)
164 {
165 if (fMaxVisibilityScale == scale)
166 return;
167
168 fMaxVisibilityScale = scale;
169 Notify();
170 }
171
172
173 bool
Visible(float scale) const174 PathSourceShape::Visible(float scale) const
175 {
176 return scale >= MinVisibilityScale()
177 && (scale <= MaxVisibilityScale() || MaxVisibilityScale() >= 4.0f);
178 }
179
180