1 /* 2 * Copyright 2007, Ingo Weinhold <bonefish@cs.tu-berlin.de>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 6 #include "TwoDimensionalSliderView.h" 7 8 #include <View.h> 9 10 11 TwoDimensionalSliderView::TwoDimensionalSliderView(BMessage* message, 12 BMessenger target) 13 : View(BRect(0, 0, 4, 4)), 14 BInvoker(message, target), 15 fMinLocation(0, 0), 16 fMaxLocation(0, 0), 17 fDragging(false) 18 { 19 SetViewColor((rgb_color){255, 0, 0, 255}); 20 } 21 22 23 void 24 TwoDimensionalSliderView::SetLocationRange(BPoint minLocation, 25 BPoint maxLocation) 26 { 27 if (maxLocation.x < minLocation.x) 28 maxLocation.x = minLocation.x; 29 if (maxLocation.y < minLocation.y) 30 maxLocation.y = minLocation.y; 31 32 fMinLocation = minLocation; 33 fMaxLocation = maxLocation; 34 35 // force valid value 36 SetValue(Value()); 37 } 38 39 40 BPoint 41 TwoDimensionalSliderView::MinLocation() const 42 { 43 return fMinLocation; 44 } 45 46 47 BPoint 48 TwoDimensionalSliderView::MaxLocation() const 49 { 50 return fMaxLocation; 51 } 52 53 54 BPoint 55 TwoDimensionalSliderView::Value() const 56 { 57 return Location() - fMinLocation; 58 } 59 60 61 void 62 TwoDimensionalSliderView::SetValue(BPoint value) 63 { 64 BPoint location = fMinLocation + value; 65 if (location.x < fMinLocation.x) 66 location.x = fMinLocation.x; 67 if (location.y < fMinLocation.y) 68 location.y = fMinLocation.y; 69 if (location.x > fMaxLocation.x) 70 location.x = fMaxLocation.x; 71 if (location.y > fMaxLocation.y) 72 location.y = fMaxLocation.y; 73 74 if (location != Location()) { 75 SetFrame(Frame().OffsetToCopy(location)); 76 77 // send the message 78 if (Message()) { 79 BMessage message(*Message()); 80 message.AddPoint("value", Value()); 81 InvokeNotify(&message); 82 } 83 } 84 } 85 86 87 void 88 TwoDimensionalSliderView::MouseDown(BPoint where, uint32 buttons, 89 int32 modifiers) 90 { 91 if (fDragging) 92 return; 93 94 fOriginalLocation = Frame().LeftTop(); 95 fOriginalPoint = ConvertToContainer(where); 96 fDragging = true; 97 } 98 99 100 void 101 TwoDimensionalSliderView::MouseUp(BPoint where, uint32 buttons, int32 modifiers) 102 { 103 if (!fDragging || (buttons & B_PRIMARY_MOUSE_BUTTON)) 104 return; 105 106 fDragging = false; 107 } 108 109 110 void 111 TwoDimensionalSliderView::MouseMoved(BPoint where, uint32 buttons, 112 int32 modifiers) 113 { 114 if (!fDragging) 115 return; 116 117 BPoint moved = ConvertToContainer(where) - fOriginalPoint; 118 SetValue(fOriginalLocation - fMinLocation + moved); 119 } 120