diff options
| author | Pietro Gagliardi <[email protected]> | 2016-05-30 00:14:46 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2016-05-30 00:14:46 -0400 |
| commit | 52f7d276a6bb04b8827ac019ad1e135b43819cea (patch) | |
| tree | 5f0ebbfdf5885ef832e77e243b5916e59f46ba18 /prev/spinbox_windows.go | |
| parent | c9b32c1333e4009b342eedc5f5b39127a724fb42 (diff) | |
Removed prev/.
Diffstat (limited to 'prev/spinbox_windows.go')
| -rw-r--r-- | prev/spinbox_windows.go | 148 |
1 files changed, 0 insertions, 148 deletions
diff --git a/prev/spinbox_windows.go b/prev/spinbox_windows.go deleted file mode 100644 index 05dd928..0000000 --- a/prev/spinbox_windows.go +++ /dev/null @@ -1,148 +0,0 @@ -// 28 october 2014 - -package ui - -import ( - "strconv" - "unsafe" -) - -// #include "winapi_windows.h" -import "C" - -// TODO do we have to manually monitor user changes to the edit control? -// TODO WS_EX_CLIENTEDGE on the updown? - -type spinbox struct { - hwndEdit C.HWND - hwndUpDown C.HWND - changed *event - // updown state - updownVisible bool - // keep these here to avoid having to get them out - value int - min int - max int -} - -func newSpinbox(min int, max int) Spinbox { - s := new(spinbox) - s.hwndEdit = C.newControl(editclass, - C.textfieldStyle | C.ES_NUMBER, - C.textfieldExtStyle) - s.changed = newEvent() - s.updownVisible = true // initially shown - s.min = min - s.max = max - s.value = s.min - s.remakeUpDown() - C.controlSetControlFont(s.hwndEdit) - C.setSpinboxEditSubclass(s.hwndEdit, unsafe.Pointer(s)) - return s -} - -func (s *spinbox) cap() { - if s.value < s.min { - s.value = s.min - } - if s.value > s.max { - s.value = s.max - } -} - -func (s *spinbox) Value() int { - return s.value -} - -func (s *spinbox) SetValue(value int) { - // UDM_SETPOS32 is documented to do what we want, but since we're keeping a copy of value we need to do it anyway - s.value = value - s.cap() - C.SendMessageW(s.hwndUpDown, C.UDM_SETPOS32, 0, C.LPARAM(s.value)) -} - -func (s *spinbox) OnChanged(e func()) { - s.changed.set(e) -} - -//export spinboxUpDownClicked -func spinboxUpDownClicked(data unsafe.Pointer, nud *C.NMUPDOWN) { - // this is where we do custom increments - s := (*spinbox)(data) - s.value = int(nud.iPos + nud.iDelta) - // this can go above or below the bounds (the spinbox only rejects invalid values after the UDN_DELTAPOS notification is processed) - // because we have a copy of the value, we need to fix that here - s.cap() - s.changed.fire() -} - -//export spinboxEditChanged -func spinboxEditChanged(data unsafe.Pointer) { - // we're basically on our own here - s := (*spinbox)(unsafe.Pointer(data)) - // this basically does what OS X does: values too low get clamped to the minimum, values too high get clamped to the maximum, and deleting everything clamps to the minimum - value, err := strconv.Atoi(getWindowText(s.hwndEdit)) - if err != nil { - // best we can do fo rnow in this case :S - // a partial atoi() like in C would be more optimal - // it handles the deleting everything case just fine - value = s.min - } - s.value = value - s.cap() - C.SendMessageW(s.hwndUpDown, C.UDM_SETPOS32, 0, C.LPARAM(s.value)) - // TODO position the insertion caret at the end (or wherever is appropriate) - s.changed.fire() -} - -func (s *spinbox) setParent(p *controlParent) { - C.controlSetParent(s.hwndEdit, p.hwnd) - C.controlSetParent(s.hwndUpDown, p.hwnd) -} - -// an up-down control will only properly position itself the first time -// stupidly, there are no messages to force a size calculation, nor can I seem to reset the buddy window to force a new position -// alas, we have to make a new up/down control each time :( -// TODO we'll need to store a copy of the current position and range for this -func (s *spinbox) remakeUpDown() { - // destroying the previous one, setting the parent properly, and subclassing are handled here - s.hwndUpDown = C.newUpDown(s.hwndUpDown, unsafe.Pointer(s)) - // for this to work, hwndUpDown needs to have rect [0 0 0 0] - C.moveWindow(s.hwndUpDown, 0, 0, 0, 0) - C.SendMessageW(s.hwndUpDown, C.UDM_SETBUDDY, C.WPARAM(uintptr(unsafe.Pointer(s.hwndEdit))), 0) - C.SendMessageW(s.hwndUpDown, C.UDM_SETRANGE32, C.WPARAM(s.min), C.LPARAM(s.max)) - C.SendMessageW(s.hwndUpDown, C.UDM_SETPOS32, 0, C.LPARAM(s.value)) - if s.updownVisible { - C.ShowWindow(s.hwndUpDown, C.SW_SHOW) - } -} - -// use the same height as normal text fields -// TODO constrain the width somehow -func (s *spinbox) preferredSize(d *sizing) (width, height int) { - return fromdlgunitsX(textfieldWidth, d), fromdlgunitsY(textfieldHeight, d) -} - -func (s *spinbox) resize(x int, y int, width int, height int, d *sizing) { - C.moveWindow(s.hwndEdit, C.int(x), C.int(y), C.int(width), C.int(height)) - s.remakeUpDown() -} - -func (s *spinbox) nTabStops() int { - // TODO does the up-down control count? - return 1 -} - -// TODO be sure to modify this when we add Show()/Hide() -func (s *spinbox) containerShow() { - C.ShowWindow(s.hwndEdit, C.SW_SHOW) - C.ShowWindow(s.hwndUpDown, C.SW_SHOW) - s.updownVisible = true -} - -// TODO be sure to modify this when we add Show()/Hide() -func (s *spinbox) containerHide() { - C.ShowWindow(s.hwndEdit, C.SW_HIDE) - C.ShowWindow(s.hwndUpDown, C.SW_HIDE) - s.updownVisible = false -} |
