Commit 83242a06378ed7faead941c0c4be8731ebf54ef7
1 parent
eb522836
Exists in
master
and in
6 other branches
ENH: the gradient widget has been rewritten
Showing
3 changed files
with
301 additions
and
578 deletions
Show diff stats
invesalius/data/slice_.py
@@ -188,15 +188,11 @@ class Slice(object): | @@ -188,15 +188,11 @@ class Slice(object): | ||
188 | self.SetMaskEditionThreshold(index, threshold_range) | 188 | self.SetMaskEditionThreshold(index, threshold_range) |
189 | 189 | ||
190 | def __set_current_mask_threshold(self, evt_pubsub): | 190 | def __set_current_mask_threshold(self, evt_pubsub): |
191 | - session = ses.Session() | ||
192 | - #FIXME: find a better way to implement this | ||
193 | - if (self.num_gradient >= 2) or \ | ||
194 | - (session.project_status != const.PROJ_OPEN): | ||
195 | - threshold_range = evt_pubsub.data | ||
196 | - index = self.current_mask.index | ||
197 | - self.SetMaskThreshold(index, threshold_range) | ||
198 | - #Clear edited points | ||
199 | - self.current_mask.edited_points = {} | 191 | + threshold_range = evt_pubsub.data |
192 | + index = self.current_mask.index | ||
193 | + self.SetMaskThreshold(index, threshold_range) | ||
194 | + #Clear edited points | ||
195 | + self.current_mask.edited_points = {} | ||
200 | self.num_gradient += 1 | 196 | self.num_gradient += 1 |
201 | 197 | ||
202 | def __set_current_mask_colour(self, pubsub_evt): | 198 | def __set_current_mask_colour(self, pubsub_evt): |
invesalius/gui/task_slice.py
@@ -318,7 +318,7 @@ class MaskProperties(wx.Panel): | @@ -318,7 +318,7 @@ class MaskProperties(wx.Panel): | ||
318 | self.combo_thresh = combo_thresh | 318 | self.combo_thresh = combo_thresh |
319 | 319 | ||
320 | ## LINE 4 | 320 | ## LINE 4 |
321 | - gradient = grad.GradientSlider(self, -1, -5000, 5000, 0, 5000, | 321 | + gradient = grad.GradientCtrl(self, -1, -5000, 5000, 0, 5000, |
322 | (0, 255, 0, 100)) | 322 | (0, 255, 0, 100)) |
323 | self.gradient = gradient | 323 | self.gradient = gradient |
324 | 324 | ||
@@ -476,17 +476,17 @@ class MaskProperties(wx.Panel): | @@ -476,17 +476,17 @@ class MaskProperties(wx.Panel): | ||
476 | 476 | ||
477 | def OnComboThresh(self, evt): | 477 | def OnComboThresh(self, evt): |
478 | (thresh_min, thresh_max) = Project().threshold_modes[evt.GetString()] | 478 | (thresh_min, thresh_max) = Project().threshold_modes[evt.GetString()] |
479 | - self.gradient.SetMinValue(thresh_min, True) | ||
480 | - self.gradient.SetMaxValue(thresh_max, True) | 479 | + self.gradient.SetMinValue(thresh_min) |
480 | + self.gradient.SetMaxValue(thresh_max) | ||
481 | + self.OnSlideChanged(None) | ||
481 | 482 | ||
482 | def OnSlideChanged(self, evt): | 483 | def OnSlideChanged(self, evt): |
483 | thresh_min = self.gradient.GetMinValue() | 484 | thresh_min = self.gradient.GetMinValue() |
484 | thresh_max = self.gradient.GetMaxValue() | 485 | thresh_max = self.gradient.GetMaxValue() |
485 | - if self.bind_evt_gradient: | ||
486 | - ps.Publisher().sendMessage('Set threshold values', | ||
487 | - (thresh_min, thresh_max)) | ||
488 | - session = ses.Session() | ||
489 | - session.ChangeProject() | 486 | + ps.Publisher().sendMessage('Set threshold values', |
487 | + (thresh_min, thresh_max)) | ||
488 | + session = ses.Session() | ||
489 | + session.ChangeProject() | ||
490 | 490 | ||
491 | def OnSelectColour(self, evt): | 491 | def OnSelectColour(self, evt): |
492 | colour = evt.GetValue() | 492 | colour = evt.GetValue() |
@@ -549,7 +549,7 @@ class EditionTools(wx.Panel): | @@ -549,7 +549,7 @@ class EditionTools(wx.Panel): | ||
549 | text_thresh = wx.StaticText(self, -1, _("Brush threshold range:")) | 549 | text_thresh = wx.StaticText(self, -1, _("Brush threshold range:")) |
550 | 550 | ||
551 | ## LINE 4 | 551 | ## LINE 4 |
552 | - gradient_thresh = grad.GradientSlider(self, -1, 0, 5000, 0, 5000, | 552 | + gradient_thresh = grad.GradientCtrl(self, -1, 0, 5000, 0, 5000, |
553 | (0, 0, 255, 100)) | 553 | (0, 0, 255, 100)) |
554 | self.gradient_thresh = gradient_thresh | 554 | self.gradient_thresh = gradient_thresh |
555 | self.bind_evt_gradient = True | 555 | self.bind_evt_gradient = True |
invesalius/gui/widgets/gradient.py
@@ -19,547 +19,315 @@ | @@ -19,547 +19,315 @@ | ||
19 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | 19 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais |
20 | # detalhes. | 20 | # detalhes. |
21 | #-------------------------------------------------------------------------- | 21 | #-------------------------------------------------------------------------- |
22 | - | ||
23 | import sys | 22 | import sys |
24 | 23 | ||
25 | import numpy | 24 | import numpy |
26 | import wx | 25 | import wx |
27 | -import wx.lib.intctrl | ||
28 | -import wx.lib.pubsub as ps | ||
29 | - | ||
30 | -MINBORDER=1 | ||
31 | -MAXBORDER=2 | ||
32 | 26 | ||
33 | -class SliderData(object): | ||
34 | - def __init__(self, minRange, maxRange, minValue, maxValue, colour): | ||
35 | - """ | ||
36 | - minRange: The minimum value accepted. | ||
37 | - maxRange: The maximum value accepted. | ||
38 | - minValue: initial minimum value. | ||
39 | - maxValue: initial maximum value. | ||
40 | - colour: the colour associated, must be in RGBA form. | ||
41 | - """ | ||
42 | - self.minRange = minRange | ||
43 | - self.maxRange = maxRange | ||
44 | - self.minValue = minValue | ||
45 | - self.maxValue = maxValue | ||
46 | - self.colour = colour | ||
47 | - self.wasChanged = True | 27 | +from wx.lib import intctrl |
48 | 28 | ||
49 | - def GetMinValue(self): | ||
50 | - return self.minValue | 29 | +PUSH_WIDTH = 7 |
51 | 30 | ||
52 | - def GetMaxValue(self): | ||
53 | - return self.maxValue | ||
54 | - | ||
55 | - def SetMinValue(self, value): | ||
56 | - if value < self.minRange: | ||
57 | - value = self.minRange | ||
58 | - self.minValue = value | ||
59 | - self.wasChanged = True | ||
60 | - | ||
61 | - def SetMaxValue(self, value): | ||
62 | - if value > self.maxRange: | ||
63 | - value = self.maxRange | ||
64 | - self.maxValue = value | ||
65 | - self.wasChanged = True | ||
66 | - | ||
67 | - def GetMinRange(self): | ||
68 | - return self.minRange | ||
69 | - | ||
70 | - def GetMaxRange(self): | ||
71 | - return self.maxRange | ||
72 | - | ||
73 | - def SetMinRange(self, value): | ||
74 | - if value < self.minValue: | ||
75 | - self.SetMinValue(value) | ||
76 | - self.minRange = value | ||
77 | - self.wasChanged = True | 31 | +myEVT_SLIDER_CHANGE = wx.NewEventType() |
32 | +EVT_SLIDER_CHANGE = wx.PyEventBinder(myEVT_SLIDER_CHANGE, 1) | ||
78 | 33 | ||
79 | - def SetMaxRange(self, value): | ||
80 | - if value > self.maxValue: | ||
81 | - self.SetMaxValue(value) | ||
82 | - self.maxRange = value | ||
83 | - self.wasChanged = True | 34 | +myEVT_THRESHOLD_CHANGE = wx.NewEventType() |
35 | +EVT_THRESHOLD_CHANGE = wx.PyEventBinder(myEVT_THRESHOLD_CHANGE, 1) | ||
84 | 36 | ||
85 | - def GetColour(self): | ||
86 | - return self.colour | 37 | +class SliderEvent(wx.PyCommandEvent): |
38 | + def __init__(self , evtType, id, minRange, maxRange, minValue, maxValue): | ||
39 | + wx.PyCommandEvent.__init__(self, evtType, id,) | ||
40 | + self.min_range = minRange | ||
41 | + self.max_range = maxRange | ||
42 | + self.minimun = minValue | ||
43 | + self.maximun = maxValue | ||
87 | 44 | ||
88 | - def SetColour(self, colour): | 45 | +class GradientSlider(wx.Panel): |
46 | + def __init__(self, parent, id, minRange, maxRange, minValue, maxValue, colour): | ||
47 | + super(GradientSlider, self).__init__(parent, id, size = (100, 25)) | ||
48 | + self._bind_events_wx() | ||
49 | + | ||
50 | + self.min_range = minRange | ||
51 | + self.max_range = maxRange | ||
52 | + self.minimun = minValue | ||
53 | + self.maximun = maxValue | ||
89 | self.colour = colour | 54 | self.colour = colour |
90 | - self.wasChanged = True | ||
91 | - | ||
92 | - def GetRange(self): | ||
93 | - return self.maxRange - self.minRange | ||
94 | - | ||
95 | - | ||
96 | -class SliderControler(object): | ||
97 | - def __init__(self, slider): | ||
98 | - self.slider = slider | ||
99 | - ps.Publisher().subscribe(self.SetMinValue, "ChangeMinValue") | ||
100 | - ps.Publisher().subscribe(self.SetMaxValue, "ChangeMaxValue") | ||
101 | - | ||
102 | - def SetMinValue(self, data): | ||
103 | - self.slider.SetMinValue(data.data) | 55 | + self.selected = 0 |
104 | 56 | ||
105 | - def SetMaxValue(self, data): | ||
106 | - self.slider.SetMaxValue(data.data) | 57 | + self.CalculateControlPositions() |
107 | 58 | ||
108 | - def GetMinValue(self): | ||
109 | - return self.slider.GetMinValue() | 59 | + def _bind_events_wx(self): |
60 | + self.Bind(wx.EVT_LEFT_DOWN, self.OnClick) | ||
61 | + self.Bind(wx.EVT_LEFT_UP, self.OnRelease) | ||
62 | + self.Bind(wx.EVT_PAINT, self.OnPaint) | ||
63 | + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackGround) | ||
64 | + self.Bind(wx.EVT_MOTION, self.OnMotion) | ||
65 | + self.Bind(wx.EVT_SIZE, self.OnSize) | ||
110 | 66 | ||
111 | - def GetMaxValue(self): | ||
112 | - return self.slider.GetMaxValue() | 67 | + def OnPaint(self, evt): |
68 | + dc = wx.BufferedPaintDC(self) | ||
69 | + dc.Clear() | ||
70 | + | ||
71 | + w, h = self.GetSize() | ||
72 | + width_gradient = w - 2*PUSH_WIDTH | ||
73 | + height_gradient = h | ||
74 | + x_init_gradient = PUSH_WIDTH | ||
75 | + y_init_gradient = 0 | ||
76 | + | ||
77 | + x_init_push1 = self.min_position - PUSH_WIDTH | ||
78 | + x_init_push2 = self.max_position | ||
79 | + | ||
80 | + width_transparency = self.max_position - self.min_position | ||
81 | + | ||
82 | + pen = wx.Pen((0, 0, 0)) | ||
83 | + brush = wx.Brush((0, 0, 0)) | ||
84 | + dc.SetPen(pen) | ||
85 | + dc.SetBrush(brush) | ||
86 | + dc.DrawRectangle(0, 0, PUSH_WIDTH, h) | ||
87 | + | ||
88 | + pen = wx.Pen((255, 255, 255)) | ||
89 | + brush = wx.Brush((255, 255, 255)) | ||
90 | + dc.SetPen(pen) | ||
91 | + dc.SetBrush(brush) | ||
92 | + dc.DrawRectangle(x_init_gradient + width_gradient, 0, PUSH_WIDTH, h) | ||
93 | + | ||
94 | + dc.GradientFillLinear((x_init_gradient, y_init_gradient, | ||
95 | + width_gradient, height_gradient), | ||
96 | + (0, 0, 0), (255,255, 255)) | ||
97 | + | ||
98 | + n = wx.RendererNative_Get() | ||
99 | + n.DrawPushButton(self, dc, (x_init_push1, 0, PUSH_WIDTH, h)) | ||
100 | + n.DrawPushButton(self, dc, (x_init_push2, 0, PUSH_WIDTH, h)) | ||
113 | 101 | ||
102 | + bytes = numpy.array(self.colour * width_transparency * h, 'B') | ||
103 | + try: | ||
104 | + slider = wx.BitmapFromBufferRGBA(width_transparency, h, bytes) | ||
105 | + except: | ||
106 | + pass | ||
107 | + else: | ||
108 | + dc.DrawBitmap(slider, self.min_position, 0, True) | ||
114 | 109 | ||
115 | -class SliderBorder(object): | ||
116 | - def __init__(self, pos, width, WindowWidth, type): | ||
117 | - """ | ||
118 | - pos: initial border's position | ||
119 | - width: border's width | ||
120 | - """ | ||
121 | - self.pos = pos | ||
122 | - self.width = width | ||
123 | - self.WindowWidth = WindowWidth | ||
124 | - self.type = type | 110 | + def OnEraseBackGround(self, evt): |
111 | + pass | ||
125 | 112 | ||
126 | - def IsOver(self, x): | ||
127 | - """ | ||
128 | - Is the mouse over border? | ||
129 | - """ | ||
130 | - return self.pos <= x <= self.pos + self.width | 113 | + def OnMotion(self, evt): |
114 | + x = evt.GetX() | ||
115 | + w, h = self.GetSize() | ||
116 | + if self.selected == 1: | ||
117 | + x -= self._delta | ||
118 | + if x - PUSH_WIDTH < 0: | ||
119 | + x = PUSH_WIDTH | ||
120 | + elif x >= self.max_position: | ||
121 | + x = self.max_position | ||
122 | + | ||
123 | + value = self._min_position_to_minimun(x) | ||
124 | + self.minimun = value | ||
125 | + self.min_position = x | ||
126 | + self.Refresh() | ||
127 | + self._generate_event() | ||
128 | + | ||
129 | + elif self.selected == 2: | ||
130 | + x -= self._delta | ||
131 | + if x + PUSH_WIDTH > w: | ||
132 | + x = w - PUSH_WIDTH | ||
133 | + elif x < self.min_position: | ||
134 | + x = self.min_position | ||
135 | + | ||
136 | + value = self._max_position_to_maximun(x) | ||
137 | + self.maximun = value | ||
138 | + self.max_position = x | ||
139 | + self.Refresh() | ||
140 | + self._generate_event() | ||
141 | + | ||
142 | + elif self.selected == 3: | ||
143 | + x -= self._delta | ||
144 | + slider_size = self.max_position - self.min_position | ||
145 | + diff_values = self.maximun - self.minimun | ||
146 | + | ||
147 | + if x - PUSH_WIDTH < 0: | ||
148 | + min_x = PUSH_WIDTH | ||
149 | + self.minimun = self._min_position_to_minimun(min_x) | ||
150 | + self.maximun = self.minimun + diff_values | ||
151 | + self.CalculateControlPositions() | ||
152 | + | ||
153 | + elif x + slider_size + PUSH_WIDTH > w: | ||
154 | + max_x = w - PUSH_WIDTH | ||
155 | + self.maximun = self._max_position_to_maximun(max_x) | ||
156 | + self.minimun = self.maximun - diff_values | ||
157 | + self.CalculateControlPositions() | ||
131 | 158 | ||
132 | - def DoSlide(self, slide): | ||
133 | - """ | ||
134 | - Move the border | ||
135 | - """ | ||
136 | - self.pos += slide | ||
137 | - if self.type == MINBORDER and self.pos < 0: | ||
138 | - self.pos = 0 | ||
139 | - elif self.type == MAXBORDER and self.pos+self.width >= self.WindowWidth: | ||
140 | - self.pos = self.WindowWidth - self.width | 159 | + else: |
160 | + min_x = x | ||
161 | + self.minimun = self._min_position_to_minimun(min_x) | ||
162 | + self.maximun = self.minimun + diff_values | ||
163 | + self.CalculateControlPositions() | ||
141 | 164 | ||
142 | - def SetPosition(self, pos): | ||
143 | - """ | ||
144 | - Move the border | ||
145 | - """ | ||
146 | - self.pos = pos | ||
147 | - if self.type == MINBORDER and self.pos < 0: | ||
148 | - self.pos = 0 | ||
149 | - elif self.type == MAXBORDER and self.pos+self.width >= self.WindowWidth: | ||
150 | - self.pos = self.WindowWidth - self.width | 165 | + self.Refresh() |
166 | + self._generate_event() | ||
167 | + evt.Skip() | ||
168 | + | ||
169 | + | ||
170 | + def OnClick(self, evt): | ||
171 | + x = evt.GetX() | ||
172 | + if self.min_position - PUSH_WIDTH <= x <= self.min_position: | ||
173 | + self.selected = 1 | ||
174 | + self._delta = x - self.min_position | ||
175 | + elif self.max_position <= x <= self.max_position + PUSH_WIDTH: | ||
176 | + self.selected = 2 | ||
177 | + self._delta = x - self.max_position | ||
178 | + elif self.min_position <= x <= self.max_position: | ||
179 | + self.selected = 3 | ||
180 | + self._delta = x - self.min_position | ||
181 | + evt.Skip() | ||
182 | + | ||
183 | + def OnRelease(self, evt): | ||
184 | + self.selected = 0 | ||
185 | + evt.Skip() | ||
186 | + | ||
187 | + def OnSize(self, evt): | ||
188 | + self.CalculateControlPositions() | ||
189 | + self.Refresh() | ||
190 | + evt.Skip() | ||
151 | 191 | ||
152 | - def GetCursor(self): | 192 | + def CalculateControlPositions(self): |
153 | """ | 193 | """ |
154 | - This function returns the cursor related to the SliderBorder | 194 | + Calculates the Min and Max control position based on the size of this |
195 | + widget. | ||
155 | """ | 196 | """ |
156 | - return wx.StockCursor(wx.CURSOR_SIZEWE) | ||
157 | - | ||
158 | - def SetWindowWidth(self, width): | ||
159 | - self.WindowWith = width | ||
160 | - | ||
161 | - def GetPosition(self): | ||
162 | - return self.pos | 197 | + w, h = self.GetSize() |
198 | + window_width = w - 2*PUSH_WIDTH | ||
199 | + proportion = window_width / float(self.max_range - self.min_range) | ||
163 | 200 | ||
201 | + self.min_position = int(round((self.minimun - self.min_range) * \ | ||
202 | + proportion)) + PUSH_WIDTH | ||
203 | + self.max_position = int(round((self.maximun - self.min_range) * \ | ||
204 | + proportion)) + PUSH_WIDTH | ||
205 | + print self.min_position, self.max_position | ||
164 | 206 | ||
165 | -class SliderControl(object): | ||
166 | - def __init__(self, sliderData, width, height): | ||
167 | - """ | ||
168 | - sliderData: associated sliderData, where the info is. | ||
169 | - width: SliderControl's width | ||
170 | - height: SliderControl's height | ||
171 | - """ | ||
172 | - self.width = width | ||
173 | - self.height = height | ||
174 | - self.imgSlider = None | ||
175 | - self.SliderData = sliderData | ||
176 | - self.ToResize = False | ||
177 | - ps.Publisher().subscribe(self.SetMinValue, "SetMinValue") | ||
178 | - | ||
179 | - def Resize(self, WindowWidth, WindowHeight): | ||
180 | - """ | ||
181 | - Occurs when parent panel resizes, then the slider resize too keeping the | ||
182 | - proportion | ||
183 | - """ | ||
184 | - self.WindowWidth = WindowWidth | ||
185 | - self.MinBorder.SetWindowWidth(WindowWidth) | ||
186 | - self.MaxBorder.SetWindowWidth(WindowWidth) | ||
187 | - proportion = WindowWidth/float(self.SliderData.GetRange()) | ||
188 | - self.MinPoint = int(round((self.SliderData.GetMinValue() -\ | ||
189 | - self.SliderData.minRange) * proportion)) | ||
190 | - self.MaxPoint = int(round((self.SliderData.GetMaxValue() -\ | ||
191 | - self.SliderData.minRange)* proportion)) | ||
192 | - self.width = self.MaxPoint - self.MinPoint | ||
193 | - self.height = WindowHeight | ||
194 | - self.ToResize = True | ||
195 | - | ||
196 | - def GetSliderControl(self): | ||
197 | - """ | ||
198 | - Returns the slider control | ||
199 | - """ | ||
200 | - if not self.imgSlider or self.ToResize or self.SliderData.wasChanged: | ||
201 | - bytes = numpy.array(self.SliderData.GetColour() * self.width * self.height, 'B') | ||
202 | - self.imgSlider = wx.BitmapFromBufferRGBA(self.width, self.height, bytes) | ||
203 | - self.ToResize = False | ||
204 | - self.SliderData.wasChanged = False | ||
205 | - return self.imgSlider | ||
206 | - | ||
207 | - def GetCursor(self): | ||
208 | - """ | ||
209 | - Returns the slider associated to the SliderControl | 207 | + def _max_position_to_maximun(self, max_position): |
208 | + """ | ||
209 | + Calculates the min and max value based on the control positions. | ||
210 | """ | 210 | """ |
211 | - return wx.StockCursor(wx.CURSOR_ARROW) | 211 | + w, h = self.GetSize() |
212 | + window_width = w - 2*PUSH_WIDTH | ||
213 | + proportion = window_width / float(self.max_range - self.min_range) | ||
212 | 214 | ||
213 | - def DoSlide(self, slide): | ||
214 | - """ | ||
215 | - Moves the SliderControl with associated borders | ||
216 | - """ | ||
217 | - if slide + self.MinPoint >= 0 \ | ||
218 | - and slide + self.MaxPoint <= self.WindowWidth: | ||
219 | - self.MinPoint += slide | ||
220 | - self.MaxPoint = self.MinPoint + self.width | ||
221 | - self.SetMinValueByMinPoint() | ||
222 | - self.SetMaxValueByMaxPoint() | ||
223 | - self.MinBorder.DoSlide(slide) | ||
224 | - self.MaxBorder.DoSlide(slide) | ||
225 | - | ||
226 | - def IsOver(self, x): | ||
227 | - """ | ||
228 | - The mouse cursor is over me? | ||
229 | - """ | ||
230 | - return self.MinPoint <= x <= self.MaxPoint | ||
231 | - | ||
232 | - def SetMinValueByMinPoint(self): | ||
233 | - """ | ||
234 | - Sets the minimum slider value based on the min point position | ||
235 | - """ | ||
236 | - proportion = self.WindowWidth/float(self.SliderData.GetRange()) | ||
237 | - self.SliderData.SetMinValue(int(round(self.MinPoint/proportion +\ | ||
238 | - self.SliderData.minRange))) | 215 | + maximun = int(round((max_position - PUSH_WIDTH)/proportion + \ |
216 | + self.min_range)) | ||
239 | 217 | ||
240 | - def SetMaxValueByMaxPoint(self): | ||
241 | - """ | ||
242 | - Sets the maximum slider values based on the max point position | ||
243 | - """ | ||
244 | - proportion = self.WindowWidth/float(self.SliderData.GetRange()) | ||
245 | - self.SliderData.SetMaxValue(int(round(self.MaxPoint/proportion +\ | ||
246 | - self.SliderData.minRange))) | ||
247 | - | ||
248 | - def SetMaxPointByMaxValue(self): | ||
249 | - # proportion = self.WindowWidth/float(self.SliderData.GetRange()) | ||
250 | - #self.SetMaxPoint(int((self.SliderData.GetMaxValue() \ | ||
251 | - # -self.SliderData.minRange)*proportion)) | ||
252 | - self.MaxBorder.pos = self.MaxPoint | ||
253 | - | ||
254 | - def SetMinPointByMinValue(self): | ||
255 | - # proportion = self.WindowWidth/float(self.SliderData.GetRange()) | ||
256 | - #self.SetMinPoint(int((self.SliderData.GetMinValue() \ | ||
257 | - # -self.SliderData.minRange)*proportion)) | ||
258 | - self.MinBorder.pos = self.MinPoint | ||
259 | - | ||
260 | - def SetMinPoint(self, x): | ||
261 | - """ | ||
262 | - Sets the min point position in pixels | ||
263 | - """ | ||
264 | - self.MinPoint = x | ||
265 | - self.width = self.MaxPoint - self.MinPoint | ||
266 | - self.SetMinValueByMinPoint() | ||
267 | - self.ToResize = True | 218 | + return maximun |
268 | 219 | ||
269 | - def SetMaxPoint(self, x): | ||
270 | - """ | ||
271 | - Sets the max point position in pixels | ||
272 | - """ | ||
273 | - self.MaxPoint = x | ||
274 | - self.width = self.MaxPoint - self.MinPoint | ||
275 | - self.SetMaxValueByMaxPoint() | ||
276 | - self.ToResize = True | ||
277 | - | ||
278 | - def SetMinValue(self, min): | ||
279 | - self.SliderData.SetMinValue(min) | ||
280 | - proportion = self.WindowWidth/float(self.SliderData.GetRange()) | ||
281 | - self.MinPoint = int(round((min - self.SliderData.minRange) * proportion)) | ||
282 | - self.width = self.MaxPoint - self.MinPoint | ||
283 | - self.ToResize = True | ||
284 | - self.MinBorder.pos = self.MinPoint | ||
285 | - | ||
286 | - def SetMaxValue(self, max): | ||
287 | - self.SliderData.SetMaxValue(max) | ||
288 | - proportion = self.WindowWidth/float(self.SliderData.GetRange()) | ||
289 | - self.MaxPoint = int(round((max - self.SliderData.minRange) * proportion)) | ||
290 | - self.width = self.MaxPoint - self.MinPoint | ||
291 | - self.ToResize = True | ||
292 | - self.MaxBorder.pos = self.MaxPoint - self.MaxBorder.width | ||
293 | - | ||
294 | - def SetMinBorder(self, border): | ||
295 | - """ | ||
296 | - Hello, I'm the min border. I do the hard work to squeeze and stretch | ||
297 | - the slider body together with my brother max border. | ||
298 | - """ | ||
299 | - self.MinBorder = border | 220 | + def _min_position_to_minimun(self, min_position): |
221 | + w, h = self.GetSize() | ||
222 | + window_width = w - 2*PUSH_WIDTH | ||
223 | + proportion = window_width / float(self.max_range - self.min_range) | ||
300 | 224 | ||
301 | - def SetMaxBorder(self, border): | ||
302 | - """ | ||
303 | - And I'm the max border. I do the same work of my brother, I'm in the | ||
304 | - right side, while he is in left side. | ||
305 | - """ | ||
306 | - self.MaxBorder = border | 225 | + minimun = int(round((min_position - PUSH_WIDTH)/proportion + \ |
226 | + self.min_range)) | ||
307 | 227 | ||
308 | - def Calculate(self, object): | ||
309 | - """ | ||
310 | - Calculate the new min or max point based on the border brothers position. | ||
311 | - """ | ||
312 | - if object is self.MinBorder: | ||
313 | - self.SetMinPoint(object.pos) | ||
314 | - elif object is self.MaxBorder: | ||
315 | - self.SetMaxPoint(object.pos) | ||
316 | - | ||
317 | - | ||
318 | -class GradientPanel(wx.Panel): | ||
319 | - def __init__(self, parent, id, sliderData): | ||
320 | - super(GradientPanel, self).__init__(parent, id, size=wx.Size(200,50)) | ||
321 | - self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) | ||
322 | - self.SetMinSize((100, 20)) | ||
323 | - self.imgGradient = None | ||
324 | - self.SliderData = sliderData | ||
325 | - self.Slider = SliderControl(self.SliderData, 1, 1) | ||
326 | - self.BorderMin = SliderBorder(self.SliderData.GetMinValue(), 7, | ||
327 | - self.GetSize().GetWidth(), | ||
328 | - MINBORDER) | ||
329 | - self.BorderMax = SliderBorder(self.SliderData.GetMaxValue()-10, 7, | ||
330 | - self.GetSize().GetWidth(), | ||
331 | - MAXBORDER) | ||
332 | - self.Slider.SetMinBorder(self.BorderMin) | ||
333 | - self.Slider.SetMaxBorder(self.BorderMax) | ||
334 | - self._DoBinds() | ||
335 | - self.Show() | 228 | + return minimun |
336 | 229 | ||
337 | - def _DoBinds(self): | ||
338 | - self.Bind(wx.EVT_LEFT_DOWN, self.OnClick) | ||
339 | - self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) | ||
340 | - self.Bind(wx.EVT_PAINT, self.OnPaint) | ||
341 | - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackGround) | ||
342 | - self.Bind(wx.EVT_MOTION, self.OnMotion) | ||
343 | - self.Bind(wx.EVT_SIZE, self.OnSize) | ||
344 | - self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) | ||
345 | - | ||
346 | - def GetMin(self): | ||
347 | - return self.SliderData.GetMinValue() | ||
348 | - | ||
349 | - def GetMax(self): | ||
350 | - return self.SliderData.GetMaxValue() | 230 | + def SetColour(self, colour): |
231 | + self.colour = colour | ||
351 | 232 | ||
352 | - def SetMinValue(self, min): | ||
353 | - self.Slider.SetMinValue(min) | 233 | + def SetMinRange(self, min_range): |
234 | + self.min_range = min_range | ||
235 | + self.CalculateControlPositions() | ||
354 | self.Refresh() | 236 | self.Refresh() |
355 | 237 | ||
356 | - def SetMaxValue(self, max): | ||
357 | - self.Slider.SetMaxValue(max) | 238 | + def SetMaxRange(self, max_range): |
239 | + self.max_range = max_range | ||
240 | + self.CalculateControlPositions() | ||
358 | self.Refresh() | 241 | self.Refresh() |
359 | 242 | ||
360 | - def GetObjectAt(self, x): | ||
361 | - """ | ||
362 | - Is there a object(border or slider) at this x position? Then return it | ||
363 | - to me. | ||
364 | - """ | ||
365 | - if self.BorderMin.IsOver(x): | ||
366 | - return self.BorderMin | ||
367 | - elif self.BorderMax.IsOver(x): | ||
368 | - return self.BorderMax | ||
369 | - elif self.Slider.IsOver(x): | ||
370 | - return self.Slider | ||
371 | - else: | ||
372 | - return None | ||
373 | - | ||
374 | - def DrawSliderControl(self, dc): | ||
375 | - try: | ||
376 | - dc.DrawBitmap(self.Slider.GetSliderControl(), | ||
377 | - self.Slider.MinPoint, 0, True) | ||
378 | - except (ValueError, RuntimeError): | ||
379 | - print "ERROR" | ||
380 | - | ||
381 | - def DrawSliderBorders(self, dc): | ||
382 | - n = wx.RendererNative_Get() | ||
383 | - n.DrawPushButton(self, dc, (self.BorderMin.pos, 0, | ||
384 | - self.BorderMin.width, | ||
385 | - self.Slider.height)) | ||
386 | - n.DrawPushButton(self, dc, (self.BorderMax.pos, 0, | ||
387 | - self.BorderMax.width, | ||
388 | - self.Slider.height)) | ||
389 | - | ||
390 | - def OnPaint(self, e): | ||
391 | - """ | ||
392 | - Occurs when panel must be refreshed, it redraw the sliderControl and | ||
393 | - borders. | ||
394 | - """ | ||
395 | - dc = wx.BufferedPaintDC(self) | ||
396 | - dc.Clear() | ||
397 | - w,h = self.GetSize() | ||
398 | - dc.GradientFillLinear((0, 0, w, h), (0, 0, 0), (255, 255, 255)) | ||
399 | - self.DrawSliderControl(dc) | ||
400 | - self.DrawSliderBorders(dc) | ||
401 | - | ||
402 | - def OnEraseBackGround(self, e): | ||
403 | - pass | ||
404 | - | ||
405 | - def OnSize(self, e): | ||
406 | - """ | ||
407 | - OMG! Incredible how I fatten and become thin easily, then I must adjust my | ||
408 | - clothes(SliderControl and the borders). | ||
409 | - """ | ||
410 | - w,h = self.GetSize() | ||
411 | - if w > 0: | ||
412 | - self.Slider.Resize(w, h) | ||
413 | - self.BorderMin.pos = self.Slider.MinPoint | ||
414 | - self.BorderMax.pos = self.Slider.MaxPoint - self.BorderMax.width | ||
415 | - self.Refresh() | ||
416 | - e.Skip() | ||
417 | - | ||
418 | - def OnClick(self, e): | ||
419 | - """ | ||
420 | - Occurs when the user click in the panel. It verifies if the click was | ||
421 | - over an object and memorise the mouse position to do the slide. | ||
422 | - """ | ||
423 | - self.SelectedObject = self.GetObjectAt(e.GetX()) | ||
424 | - self.MousePositionX = e.GetX() | 243 | + def SetMinimun(self, minimun): |
244 | + self.minimun = minimun | ||
245 | + self.CalculateControlPositions() | ||
246 | + self.Refresh() | ||
425 | 247 | ||
426 | - def OnLeftUp(self, e): | ||
427 | - """ | ||
428 | - Occurs when left mouse button is freed then the selected object must be | ||
429 | - freed too. | ||
430 | - """ | ||
431 | - self.SelectedObject = None | 248 | + def SetMaximun(self, maximun): |
249 | + self.maximun = maximun | ||
250 | + self.CalculateControlPositions() | ||
251 | + self.Refresh() | ||
432 | 252 | ||
433 | - def OnMotion(self, e): | ||
434 | - """ | ||
435 | - This is where the slide occurs ... | ||
436 | - """ | ||
437 | - x = e.GetX() | ||
438 | - # but the user must be dragging a selected object | ||
439 | - if e.Dragging() and self.SelectedObject: | ||
440 | - slide = x - self.MousePositionX | ||
441 | - self.MousePositionX += slide | ||
442 | - self.SetCursor(self.SelectedObject.GetCursor()) | ||
443 | - if isinstance(self.SelectedObject, SliderControl): | ||
444 | - self.SelectedObject.DoSlide(slide) | ||
445 | - else: | ||
446 | - self.SelectedObject.SetPosition(x) | ||
447 | - self.Slider.Calculate(self.SelectedObject) | ||
448 | - if self.GetMin() >= self.GetMax(): | ||
449 | - self.SetMinValue(self.GetMax()-1) | ||
450 | - self.Slider.SetMinPointByMinValue() | ||
451 | - # dc = wx.ClientDC(self) | ||
452 | - evt = SliderEvent(myEVT_SLIDER_CHANGE, self.GetId()) | ||
453 | - self.GetEventHandler().ProcessEvent(evt) | ||
454 | - self.Refresh() | ||
455 | - # else only the mouse cursor must be changed based on the object the | ||
456 | - # mouse is over | ||
457 | - else: | ||
458 | - try: | ||
459 | - self.SetCursor(self.GetObjectAt(x).GetCursor()) | ||
460 | - except AttributeError: | ||
461 | - self.SetCursor(wx.NullCursor) | ||
462 | - | ||
463 | - def OnMouseWheel(self, e): | ||
464 | - v = e.GetWheelRotation()/e.GetWheelDelta() | ||
465 | - self.SliderData.SetMinValue(self.SliderData.GetMinValue()+v) | ||
466 | - self.SliderData.SetMaxValue(self.SliderData.GetMaxValue()+v) | ||
467 | - evt = SliderEvent(myEVT_SLIDER_CHANGE, self.GetId()) | 253 | + def _generate_event(self): |
254 | + evt = SliderEvent(myEVT_SLIDER_CHANGE, self.GetId(), self.min_range, | ||
255 | + self.max_range, self.minimun, self.maximun) | ||
468 | self.GetEventHandler().ProcessEvent(evt) | 256 | self.GetEventHandler().ProcessEvent(evt) |
469 | - self.Refresh() | ||
470 | 257 | ||
471 | 258 | ||
472 | -class GradientSlider(wx.Panel): | ||
473 | - def __init__(self, parent, id, minRange, maxRange, min, max, colour): | ||
474 | - super(GradientSlider, self).__init__(parent, id) | ||
475 | - self.slided = 0 | 259 | +class GradientCtrl(wx.Panel): |
260 | + def __init__(self, parent, id, minRange, maxRange, minValue, maxValue, colour): | ||
261 | + super(GradientCtrl, self).__init__(parent, id) | ||
476 | self.sizer = wx.BoxSizer(wx.HORIZONTAL) | 262 | self.sizer = wx.BoxSizer(wx.HORIZONTAL) |
477 | self.SetSizer(self.sizer) | 263 | self.SetSizer(self.sizer) |
478 | self.sizer.Fit(self) | 264 | self.sizer.Fit(self) |
479 | self.SetAutoLayout(1) | 265 | self.SetAutoLayout(1) |
480 | - self.SliderData = SliderData(minRange, maxRange, min, max, colour) | ||
481 | - self.transparency = colour[3] | ||
482 | - self.DrawControls() | ||
483 | - #ps.Publisher().subscribe(self.SetMinValue, ('SetMinValue')) | 266 | + self.min_range = minRange |
267 | + self.max_range = maxRange | ||
268 | + self.minimun = minValue | ||
269 | + self.maximun = maxValue | ||
270 | + self.colour = colour | ||
271 | + self._draw_controls() | ||
272 | + self._bind_events_wx() | ||
273 | + self.SetBackgroundColour((0, 255, 0)) | ||
484 | self.Show() | 274 | self.Show() |
485 | - self.__bind_events() | ||
486 | - | ||
487 | - def __bind_events(self): | ||
488 | - ps.Publisher().subscribe(self.SetColour, 'Change Gradient Colour') | ||
489 | - ps.Publisher().subscribe(self.SetMinValue, 'Change Gradient MinValue') | ||
490 | - ps.Publisher().subscribe(self.SetMaxValue, 'Change Gradient MaxValue') | ||
491 | - | ||
492 | - def DrawControls(self): | ||
493 | - """self.SpinMin = wx.SpinCtrl(parent=self, | ||
494 | - id=-1, | ||
495 | - initial=self.SliderData.minValue, | ||
496 | - min=self.SliderData.minRange, | ||
497 | - max=self.SliderData.maxRange, | ||
498 | - size=wx.Size(55,15)) | ||
499 | - self.SpinMin.SetValue(self.SliderData.minValue) # needed in MacOS 10.5.5 | ||
500 | - | ||
501 | - for child in self.SpinMin.GetChildren(): | ||
502 | - if isinstance(child, wx.TextCtrl): | ||
503 | - child.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) | ||
504 | - | ||
505 | - self.SpinMax = wx.SpinCtrl(parent=self, | ||
506 | - id=-1, | ||
507 | - initial=self.SliderData.maxValue, | ||
508 | - min=self.SliderData.minRange, | ||
509 | - max=self.SliderData.maxRange, | ||
510 | - size=wx.Size(55,15)) | ||
511 | - self.SpinMax.SetValue(self.SliderData.maxValue) # needed in MacOS 10.5.5 | ||
512 | - | ||
513 | - for child in self.SpinMax.GetChildren(): | ||
514 | - if isinstance(child, wx.TextCtrl): | ||
515 | - child.SetWindowVariant(wx.WINDOW_VARIANT_SMALL)""" | ||
516 | - | ||
517 | - | ||
518 | - self.SpinMin = wx.lib.intctrl.IntCtrl(self, size=(40,20), style=wx.TE_PROCESS_ENTER) | ||
519 | - #self.SpinMin.SetLimited(True) | ||
520 | - self.SpinMin.SetBounds(self.SliderData.minRange, self.SliderData.maxRange) | 275 | + |
276 | + def _draw_controls(self): | ||
277 | + self.gradient_slider = GradientSlider(self, -1, self.min_range, | ||
278 | + self.max_range, self.minimun, | ||
279 | + self.maximun, self.colour) | ||
280 | + | ||
281 | + self.spin_min = intctrl.IntCtrl(self, size=(40,20), | ||
282 | + style=wx.TE_PROCESS_ENTER) | ||
283 | + self.spin_min.SetValue(self.minimun) | ||
521 | if sys.platform != 'win32': | 284 | if sys.platform != 'win32': |
522 | - self.SpinMin.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) | ||
523 | - self.SpinMin.SetValue(self.SliderData.minValue) | 285 | + self.spin_min.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) |
524 | 286 | ||
525 | - self.SpinMax = wx.lib.intctrl.IntCtrl(self, size=(40,20), style=wx.TE_PROCESS_ENTER) | ||
526 | - #self.SpinMax.SetLimited(True) | ||
527 | - self.SpinMax.SetBounds(self.SliderData.minRange, self.SliderData.maxRange) | 287 | + self.spin_max = intctrl.IntCtrl(self, size=(40,20), |
288 | + style=wx.TE_PROCESS_ENTER) | ||
289 | + self.spin_max.SetValue(self.maximun) | ||
528 | if sys.platform != 'win32': | 290 | if sys.platform != 'win32': |
529 | - self.SpinMax.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) | ||
530 | - self.SpinMax.SetValue(self.SliderData.maxValue) | ||
531 | - | ||
532 | - self.GradientPanel = GradientPanel(self, -1, self.SliderData) | ||
533 | - self.sizer.Add(self.SpinMin, 0, wx.CENTRE)#, wx.EXPAND) | ||
534 | - self.sizer.AddSpacer(5) | ||
535 | - self.sizer.Add(self.GradientPanel, 2, wx.CENTRE)#, wx.EXPAND) | ||
536 | - self.sizer.AddSpacer(5) | ||
537 | - self.sizer.Add(self.SpinMax, 0, wx.CENTRE)#, wx.EXPAND) | ||
538 | - self._DoBinds() | ||
539 | - | ||
540 | - def _DoBinds(self): | ||
541 | - self.SpinMin.Bind(wx.lib.intctrl.EVT_INT, self.ChangeMinValue) | ||
542 | - self.SpinMin.Bind(wx.EVT_KILL_FOCUS, self._FireSpinMinChange) | ||
543 | - self.SpinMin.Bind(wx.EVT_TEXT_ENTER, self._FireSpinMinChange) | ||
544 | - self.SpinMin.Bind(wx.EVT_MOUSEWHEEL, self.OnMinMouseWheel) | ||
545 | - | ||
546 | - self.SpinMax.Bind(wx.lib.intctrl.EVT_INT, self.ChangeMaxValue) | ||
547 | - self.SpinMax.Bind(wx.EVT_KILL_FOCUS, self._FireSpinMaxChange) | ||
548 | - self.SpinMax.Bind(wx.EVT_TEXT_ENTER, self._FireSpinMaxChange) | ||
549 | - self.SpinMax.Bind(wx.EVT_MOUSEWHEEL, self.OnMaxMouseWheel) | ||
550 | - | ||
551 | - self.Bind(EVT_SLIDER_CHANGE, self.OnSlider, self.GradientPanel) | 291 | + self.spin_max.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) |
292 | + | ||
293 | + sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
294 | + sizer.Add(self.spin_min, 0, wx.EXPAND) | ||
295 | + sizer.Add(self.gradient_slider, 1, wx.EXPAND) | ||
296 | + sizer.Add(self.spin_max, 0, wx.EXPAND) | ||
297 | + self.sizer.Add(sizer, 1, wx.EXPAND) | ||
298 | + | ||
299 | + def _bind_events_wx(self): | ||
300 | + self.gradient_slider.Bind(EVT_SLIDER_CHANGE, self.OnSlider) | ||
301 | + | ||
302 | + # self.spin_min.Bind(wx.lib.intctrl.EVT_INT, self.ChangeMinValue) | ||
303 | + self.spin_min.Bind(wx.EVT_KILL_FOCUS, self._FireSpinMinChange) | ||
304 | + self.spin_min.Bind(wx.EVT_TEXT_ENTER, self._FireSpinMinChange) | ||
305 | + self.spin_min.Bind(wx.EVT_MOUSEWHEEL, self.OnMinMouseWheel) | ||
306 | + | ||
307 | + # self.spin_max.Bind(wx.lib.intctrl.EVT_INT, self.ChangeMaxValue) | ||
308 | + self.spin_max.Bind(wx.EVT_KILL_FOCUS, self._FireSpinMaxChange) | ||
309 | + self.spin_max.Bind(wx.EVT_TEXT_ENTER, self._FireSpinMaxChange) | ||
310 | + self.spin_max.Bind(wx.EVT_MOUSEWHEEL, self.OnMaxMouseWheel) | ||
311 | + | ||
312 | + def OnSlider(self, evt): | ||
313 | + self.spin_min.SetValue(evt.minimun) | ||
314 | + self.spin_max.SetValue(evt.maximun) | ||
315 | + self.minimun = evt.minimun | ||
316 | + self.maximun = evt.maximun | ||
317 | + self._GenerateEvent() | ||
552 | 318 | ||
553 | def _FireSpinMinChange(self, evt): | 319 | def _FireSpinMinChange(self, evt): |
554 | - value = int(self.SpinMin.GetValue()) | 320 | + value = int(self.spin_min.GetValue()) |
555 | if value != self.GetMinValue(): | 321 | if value != self.GetMinValue(): |
556 | - self.GradientPanel.SetMinValue(value) | 322 | + self.gradient_slider.SetMinimun(value) |
323 | + self.minimun = value | ||
557 | self._GenerateEvent() | 324 | self._GenerateEvent() |
558 | 325 | ||
559 | def _FireSpinMaxChange(self, evt): | 326 | def _FireSpinMaxChange(self, evt): |
560 | - value = int(self.SpinMax.GetValue()) | 327 | + value = int(self.spin_max.GetValue()) |
561 | if value != self.GetMaxValue(): | 328 | if value != self.GetMaxValue(): |
562 | - self.GradientPanel.SetMaxValue(value) | 329 | + self.gradient_slider.SetMaximun(value) |
330 | + self.maximun = value | ||
563 | self._GenerateEvent() | 331 | self._GenerateEvent() |
564 | 332 | ||
565 | def OnMinMouseWheel(self, e): | 333 | def OnMinMouseWheel(self, e): |
@@ -570,97 +338,56 @@ class GradientSlider(wx.Panel): | @@ -570,97 +338,56 @@ class GradientSlider(wx.Panel): | ||
570 | v = self.GetMaxValue() + e.GetWheelRotation()/e.GetWheelDelta() | 338 | v = self.GetMaxValue() + e.GetWheelRotation()/e.GetWheelDelta() |
571 | self.SetMaxValue(v) | 339 | self.SetMaxValue(v) |
572 | 340 | ||
341 | + def SetColour(self, colour): | ||
342 | + colour = colour + [90,] | ||
343 | + self.colour = colour | ||
344 | + self.gradient_slider.SetColour(colour) | ||
345 | + self.gradient_slider.Refresh() | ||
346 | + | ||
347 | + def SetMaxRange(self, value): | ||
348 | + self.spin_min.SetMax(value) | ||
349 | + self.spin_max.SetMax(value) | ||
350 | + self.gradient_slider.SetMaxRange(value) | ||
351 | + | ||
352 | + def SetMinRange(self, value): | ||
353 | + self.spin_min.SetMin(value) | ||
354 | + self.spin_max.SetMin(value) | ||
355 | + self.gradient_slider.SetMinRange(value) | ||
356 | + | ||
357 | + def SetMaxValue(self, value): | ||
358 | + value = int(value) | ||
359 | + self.spin_max.SetValue(value) | ||
360 | + self.gradient_slider.SetMaximun(value) | ||
361 | + self.maximun = value | ||
362 | + | ||
363 | + def SetMinValue(self, value): | ||
364 | + value = int(value) | ||
365 | + self.spin_min.SetValue(value) | ||
366 | + self.gradient_slider.SetMinimun(value) | ||
367 | + self.minimun = value | ||
368 | + | ||
573 | def ChangeMinValue(self, e): | 369 | def ChangeMinValue(self, e): |
574 | # Why do I need to change slide min value if it has been changed for | 370 | # Why do I need to change slide min value if it has been changed for |
575 | # the user? | 371 | # the user? |
576 | print "ChangeMinValue", self.slided | 372 | print "ChangeMinValue", self.slided |
577 | if not self.slided: | 373 | if not self.slided: |
578 | - self.GradientPanel.SetMinValue(int(self.SpinMin.GetValue())) | 374 | + self.gradient_slider.SetMinValue(int(self.spin_min.GetValue())) |
579 | self._GenerateEvent() | 375 | self._GenerateEvent() |
580 | 376 | ||
581 | def ChangeMaxValue(self, e): | 377 | def ChangeMaxValue(self, e): |
582 | # Why do I need to change slide min value if it has been changed for | 378 | # Why do I need to change slide min value if it has been changed for |
583 | # the user? | 379 | # the user? |
584 | if not self.slided: | 380 | if not self.slided: |
585 | - self.GradientPanel.SetMaxValue(int(self.SpinMax.GetValue())) | 381 | + self.gradient_slider.SetMaxValue(int(self.spin_max.GetValue())) |
586 | self._GenerateEvent() | 382 | self._GenerateEvent() |
587 | 383 | ||
588 | - def OnSlider(self, e): | ||
589 | - self.slided = 1 | ||
590 | - self.SpinMin.SetValue(int(self.SliderData.GetMinValue())) | ||
591 | - self.SpinMax.SetValue(int(self.SliderData.GetMaxValue())) | ||
592 | - self.slided = 0 | ||
593 | - self._GenerateEvent() | ||
594 | - | ||
595 | - def SetMinValue(self, value, do_event=False): | ||
596 | - try: | ||
597 | - value = value.data | ||
598 | - except AttributeError: | ||
599 | - pass | ||
600 | - self.slided = 0 if do_event else 1 | ||
601 | - self.GradientPanel.SetMinValue(value) | ||
602 | - self.SpinMin.SetValue(int(value)) | ||
603 | - self.GradientPanel.Refresh() | ||
604 | - | ||
605 | - def SetMaxValue(self, value, do_event=False): | ||
606 | - try: | ||
607 | - value = value.data | ||
608 | - except AttributeError: | ||
609 | - pass | ||
610 | - self.slided = 0 if do_event else 1 | ||
611 | - self.GradientPanel.SetMaxValue(value) | ||
612 | - self.SpinMax.SetValue(int(value)) | ||
613 | - self.GradientPanel.Refresh() | ||
614 | - | ||
615 | - def SetMaxRange(self, value): | ||
616 | - self.SliderData.SetMaxRange(value) | ||
617 | - self.SpinMin.SetMax(value) | ||
618 | - self.SpinMax.SetMax(value) | ||
619 | - self.GradientPanel.Refresh() | ||
620 | - | ||
621 | - def SetMinRange(self, value): | ||
622 | - self.SliderData.SetMinRange(value) | ||
623 | - self.SpinMin.SetMin(value) | ||
624 | - self.SpinMax.SetMin(value) | ||
625 | - self.GradientPanel.Refresh() | ||
626 | - | ||
627 | def GetMaxValue(self): | 384 | def GetMaxValue(self): |
628 | - return self.SliderData.GetMaxValue() | 385 | + return self.maximun |
629 | 386 | ||
630 | def GetMinValue(self): | 387 | def GetMinValue(self): |
631 | - return self.SliderData.GetMinValue() | ||
632 | - | ||
633 | - def GetSliderData(self): | ||
634 | - """ | ||
635 | - Returns the associated SliderData. | ||
636 | - """ | ||
637 | - return self.SliderData | ||
638 | - | ||
639 | - def SetColour(self, colour, transparency=None): | ||
640 | - """ | ||
641 | - Set colour of the slider, the colour must be in RGB format. | ||
642 | - And values varying 0-255. | ||
643 | - """ | ||
644 | - if transparency is not None: | ||
645 | - A = transparency | ||
646 | - else: | ||
647 | - A = self.transparency | ||
648 | - (R,G,B) = colour | ||
649 | - self.SliderData.SetColour((R,G,B,A)) | ||
650 | - self.GradientPanel.Refresh() | 388 | + return self.minimun |
651 | 389 | ||
652 | def _GenerateEvent(self): | 390 | def _GenerateEvent(self): |
653 | - evt = SliderEvent(myEVT_THRESHOLD_CHANGE, self.GetId()) | 391 | + evt = SliderEvent(myEVT_THRESHOLD_CHANGE, self.GetId(), self.min_range, |
392 | + self.max_range, self.minimun, self.maximun) | ||
654 | self.GetEventHandler().ProcessEvent(evt) | 393 | self.GetEventHandler().ProcessEvent(evt) |
655 | - | ||
656 | -class SliderEvent(wx.PyCommandEvent): | ||
657 | - def __init__(self , evtType, id): | ||
658 | - wx.PyCommandEvent.__init__(self, evtType, id) | ||
659 | - | ||
660 | -myEVT_SLIDER_CHANGE = wx.NewEventType() | ||
661 | -# This event occurs when the user do slide, used only internaly | ||
662 | -EVT_SLIDER_CHANGE = wx.PyEventBinder(myEVT_SLIDER_CHANGE, 1) | ||
663 | - | ||
664 | -myEVT_THRESHOLD_CHANGE = wx.NewEventType() | ||
665 | -# This event occurs when the user change the threshold. | ||
666 | -EVT_THRESHOLD_CHANGE = wx.PyEventBinder(myEVT_THRESHOLD_CHANGE, 1) |