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 24using std::nothrow; 25 26_USING_ICON_NAMESPACE 27 28 29PathSourceShape::PathSourceShape(::Style* style) 30 : Shape(style), 31 32 fMinVisibilityScale(0.0), 33 fMaxVisibilityScale(4.0) 34{ 35} 36 37 38PathSourceShape::PathSourceShape(const PathSourceShape& other) 39 : Shape(other), 40 41 fMinVisibilityScale(other.fMinVisibilityScale), 42 fMaxVisibilityScale(other.fMaxVisibilityScale) 43{ 44} 45 46 47PathSourceShape::~PathSourceShape() 48{ 49} 50 51 52// #pragma mark - 53 54 55status_t 56PathSourceShape::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 82status_t 83PathSourceShape::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 99PropertyObject* 100PathSourceShape::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 118bool 119PathSourceShape::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 141status_t 142PathSourceShape::InitCheck() const 143{ 144 return Shape::InitCheck(); 145} 146 147 148// #pragma mark - 149 150 151void 152PathSourceShape::SetMinVisibilityScale(float scale) 153{ 154 if (fMinVisibilityScale == scale) 155 return; 156 157 fMinVisibilityScale = scale; 158 Notify(); 159} 160 161 162void 163PathSourceShape::SetMaxVisibilityScale(float scale) 164{ 165 if (fMaxVisibilityScale == scale) 166 return; 167 168 fMaxVisibilityScale = scale; 169 Notify(); 170} 171 172 173bool 174PathSourceShape::Visible(float scale) const 175{ 176 return scale >= MinVisibilityScale() 177 && (scale <= MaxVisibilityScale() || MaxVisibilityScale() >= 4.0f); 178} 179 180