Commit 479b67693cfeca8809d7ee32463a13a29446e419
1 parent
83242a06
Exists in
master
and in
68 other branches
ENH: changing the mouse cursor when over push buttons
Showing
1 changed file
with
45 additions
and
7 deletions
Show diff stats
invesalius/gui/widgets/gradient.py
| ... | ... | @@ -43,7 +43,15 @@ class SliderEvent(wx.PyCommandEvent): |
| 43 | 43 | self.maximun = maxValue |
| 44 | 44 | |
| 45 | 45 | class GradientSlider(wx.Panel): |
| 46 | + # This widget is formed by a gradient background (black-white), two push | |
| 47 | + # buttons change the min and max values respectively and a slider which you can drag to | |
| 48 | + # change the both min and max values. | |
| 46 | 49 | def __init__(self, parent, id, minRange, maxRange, minValue, maxValue, colour): |
| 50 | + # minRange: the minimal value | |
| 51 | + # maxrange: the maximum value | |
| 52 | + # minValue: the least value in the range | |
| 53 | + # maxValue: the most value in the range | |
| 54 | + # colour: colour used in this widget. | |
| 47 | 55 | super(GradientSlider, self).__init__(parent, id, size = (100, 25)) |
| 48 | 56 | self._bind_events_wx() |
| 49 | 57 | |
| ... | ... | @@ -65,6 +73,7 @@ class GradientSlider(wx.Panel): |
| 65 | 73 | self.Bind(wx.EVT_SIZE, self.OnSize) |
| 66 | 74 | |
| 67 | 75 | def OnPaint(self, evt): |
| 76 | + # Where the magic happens. Here the controls are drawn. | |
| 68 | 77 | dc = wx.BufferedPaintDC(self) |
| 69 | 78 | dc.Clear() |
| 70 | 79 | |
| ... | ... | @@ -79,26 +88,32 @@ class GradientSlider(wx.Panel): |
| 79 | 88 | |
| 80 | 89 | width_transparency = self.max_position - self.min_position |
| 81 | 90 | |
| 91 | + # Drawing the left blank area. | |
| 82 | 92 | pen = wx.Pen((0, 0, 0)) |
| 83 | 93 | brush = wx.Brush((0, 0, 0)) |
| 84 | 94 | dc.SetPen(pen) |
| 85 | 95 | dc.SetBrush(brush) |
| 86 | 96 | dc.DrawRectangle(0, 0, PUSH_WIDTH, h) |
| 87 | 97 | |
| 98 | + # Drawing the right blank area. | |
| 88 | 99 | pen = wx.Pen((255, 255, 255)) |
| 89 | 100 | brush = wx.Brush((255, 255, 255)) |
| 90 | 101 | dc.SetPen(pen) |
| 91 | 102 | dc.SetBrush(brush) |
| 92 | 103 | dc.DrawRectangle(x_init_gradient + width_gradient, 0, PUSH_WIDTH, h) |
| 93 | 104 | |
| 105 | + # Drawing the gradient. | |
| 94 | 106 | dc.GradientFillLinear((x_init_gradient, y_init_gradient, |
| 95 | 107 | width_gradient, height_gradient), |
| 96 | 108 | (0, 0, 0), (255,255, 255)) |
| 97 | 109 | |
| 98 | 110 | n = wx.RendererNative_Get() |
| 111 | + | |
| 112 | + # Drawing the push buttons | |
| 99 | 113 | n.DrawPushButton(self, dc, (x_init_push1, 0, PUSH_WIDTH, h)) |
| 100 | 114 | n.DrawPushButton(self, dc, (x_init_push2, 0, PUSH_WIDTH, h)) |
| 101 | 115 | |
| 116 | + # Drawing the transparent slider. | |
| 102 | 117 | bytes = numpy.array(self.colour * width_transparency * h, 'B') |
| 103 | 118 | try: |
| 104 | 119 | slider = wx.BitmapFromBufferRGBA(width_transparency, h, bytes) |
| ... | ... | @@ -108,12 +123,23 @@ class GradientSlider(wx.Panel): |
| 108 | 123 | dc.DrawBitmap(slider, self.min_position, 0, True) |
| 109 | 124 | |
| 110 | 125 | def OnEraseBackGround(self, evt): |
| 126 | + # Only to avoid this widget to flick. | |
| 111 | 127 | pass |
| 112 | 128 | |
| 113 | 129 | def OnMotion(self, evt): |
| 114 | 130 | x = evt.GetX() |
| 115 | 131 | w, h = self.GetSize() |
| 116 | - if self.selected == 1: | |
| 132 | + | |
| 133 | + # user is only moving the mouse, not changing the max our min values | |
| 134 | + if not self.selected: | |
| 135 | + # The user is over a push button, change the cursor. | |
| 136 | + if self._is_over_what(x) in (1, 2): | |
| 137 | + self.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) | |
| 138 | + else: | |
| 139 | + self.SetCursor(wx.NullCursor) | |
| 140 | + | |
| 141 | + # The user is moving the first PUSH (Min) | |
| 142 | + elif self.selected == 1: | |
| 117 | 143 | x -= self._delta |
| 118 | 144 | if x - PUSH_WIDTH < 0: |
| 119 | 145 | x = PUSH_WIDTH |
| ... | ... | @@ -126,6 +152,7 @@ class GradientSlider(wx.Panel): |
| 126 | 152 | self.Refresh() |
| 127 | 153 | self._generate_event() |
| 128 | 154 | |
| 155 | + # The user is moving the second push (Max) | |
| 129 | 156 | elif self.selected == 2: |
| 130 | 157 | x -= self._delta |
| 131 | 158 | if x + PUSH_WIDTH > w: |
| ... | ... | @@ -139,6 +166,7 @@ class GradientSlider(wx.Panel): |
| 139 | 166 | self.Refresh() |
| 140 | 167 | self._generate_event() |
| 141 | 168 | |
| 169 | + # The user is moving the slide. | |
| 142 | 170 | elif self.selected == 3: |
| 143 | 171 | x -= self._delta |
| 144 | 172 | slider_size = self.max_position - self.min_position |
| ... | ... | @@ -169,14 +197,12 @@ class GradientSlider(wx.Panel): |
| 169 | 197 | |
| 170 | 198 | def OnClick(self, evt): |
| 171 | 199 | x = evt.GetX() |
| 172 | - if self.min_position - PUSH_WIDTH <= x <= self.min_position: | |
| 173 | - self.selected = 1 | |
| 200 | + self.selected = self._is_over_what(x) | |
| 201 | + if self.selected == 1: | |
| 174 | 202 | self._delta = x - self.min_position |
| 175 | - elif self.max_position <= x <= self.max_position + PUSH_WIDTH: | |
| 176 | - self.selected = 2 | |
| 203 | + elif self.selected == 2: | |
| 177 | 204 | self._delta = x - self.max_position |
| 178 | - elif self.min_position <= x <= self.max_position: | |
| 179 | - self.selected = 3 | |
| 205 | + elif self.selected == 3: | |
| 180 | 206 | self._delta = x - self.min_position |
| 181 | 207 | evt.Skip() |
| 182 | 208 | |
| ... | ... | @@ -227,6 +253,18 @@ class GradientSlider(wx.Panel): |
| 227 | 253 | |
| 228 | 254 | return minimun |
| 229 | 255 | |
| 256 | + def _is_over_what(self, position_x): | |
| 257 | + # Test if the given position (x) is over some object. Return 1 to first | |
| 258 | + # pus, 2 to second push, 3 to slide and 0 to nothing. | |
| 259 | + if self.min_position - PUSH_WIDTH <= position_x <= self.min_position: | |
| 260 | + return 1 | |
| 261 | + elif self.max_position <= position_x <= self.max_position + PUSH_WIDTH: | |
| 262 | + return 2 | |
| 263 | + elif self.min_position <= position_x <= self.max_position: | |
| 264 | + return 3 | |
| 265 | + else: | |
| 266 | + return 0 | |
| 267 | + | |
| 230 | 268 | def SetColour(self, colour): |
| 231 | 269 | self.colour = colour |
| 232 | 270 | ... | ... |