Added Listboxes. You can't use the results just yet...

This commit is contained in:
Pietro Gagliardi 2014-02-14 16:25:39 -05:00
parent 61d7f285ac
commit 88646445b0
5 changed files with 138 additions and 70 deletions

View File

@ -287,91 +287,89 @@ const (
_EIMES_COMPLETECOMPSTRKILLFOCUS = 0x0004 _EIMES_COMPLETECOMPSTRKILLFOCUS = 0x0004
) )
/*
// Listbox styles. // Listbox styles.
const ( const (
// from winuser.h // from winuser.h
LBS_NOTIFY = 0x0001 _LBS_NOTIFY = 0x0001
LBS_SORT = 0x0002 _LBS_SORT = 0x0002
LBS_NOREDRAW = 0x0004 _LBS_NOREDRAW = 0x0004
LBS_MULTIPLESEL = 0x0008 _LBS_MULTIPLESEL = 0x0008
LBS_OWNERDRAWFIXED = 0x0010 _LBS_OWNERDRAWFIXED = 0x0010
LBS_OWNERDRAWVARIABLE = 0x0020 _LBS_OWNERDRAWVARIABLE = 0x0020
LBS_HASSTRINGS = 0x0040 _LBS_HASSTRINGS = 0x0040
LBS_USETABSTOPS = 0x0080 _LBS_USETABSTOPS = 0x0080
LBS_NOINTEGRALHEIGHT = 0x0100 _LBS_NOINTEGRALHEIGHT = 0x0100
LBS_MULTICOLUMN = 0x0200 _LBS_MULTICOLUMN = 0x0200
LBS_WANTKEYBOARDINPUT = 0x0400 _LBS_WANTKEYBOARDINPUT = 0x0400
LBS_EXTENDEDSEL = 0x0800 _LBS_EXTENDEDSEL = 0x0800
LBS_DISABLENOSCROLL = 0x1000 _LBS_DISABLENOSCROLL = 0x1000
LBS_NODATA = 0x2000 _LBS_NODATA = 0x2000
LBS_NOSEL = 0x4000 _LBS_NOSEL = 0x4000
LBS_COMBOBOX = 0x8000 _LBS_COMBOBOX = 0x8000
LBS_STANDARD = (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER) _LBS_STANDARD = (_LBS_NOTIFY | _LBS_SORT | _WS_VSCROLL | _WS_BORDER)
) )
// Listbox messages. // Listbox messages.
// TODO filter out messages not provided in windows 2000 // TODO filter out messages not provided in windows 2000
const ( const (
// from winuser.h // from winuser.h
LB_ADDSTRING = 0x0180 _LB_ADDSTRING = 0x0180
LB_INSERTSTRING = 0x0181 _LB_INSERTSTRING = 0x0181
LB_DELETESTRING = 0x0182 _LB_DELETESTRING = 0x0182
LB_SELITEMRANGEEX = 0x0183 _LB_SELITEMRANGEEX = 0x0183
LB_RESETCONTENT = 0x0184 _LB_RESETCONTENT = 0x0184
LB_SETSEL = 0x0185 _LB_SETSEL = 0x0185
LB_SETCURSEL = 0x0186 _LB_SETCURSEL = 0x0186
LB_GETSEL = 0x0187 _LB_GETSEL = 0x0187
LB_GETCURSEL = 0x0188 _LB_GETCURSEL = 0x0188
LB_GETTEXT = 0x0189 _LB_GETTEXT = 0x0189
LB_GETTEXTLEN = 0x018A _LB_GETTEXTLEN = 0x018A
LB_GETCOUNT = 0x018B _LB_GETCOUNT = 0x018B
LB_SELECTSTRING = 0x018C _LB_SELECTSTRING = 0x018C
LB_DIR = 0x018D _LB_DIR = 0x018D
LB_GETTOPINDEX = 0x018E _LB_GETTOPINDEX = 0x018E
LB_FINDSTRING = 0x018F _LB_FINDSTRING = 0x018F
LB_GETSELCOUNT = 0x0190 _LB_GETSELCOUNT = 0x0190
LB_GETSELITEMS = 0x0191 _LB_GETSELITEMS = 0x0191
LB_SETTABSTOPS = 0x0192 _LB_SETTABSTOPS = 0x0192
LB_GETHORIZONTALEXTENT = 0x0193 _LB_GETHORIZONTALEXTENT = 0x0193
LB_SETHORIZONTALEXTENT = 0x0194 _LB_SETHORIZONTALEXTENT = 0x0194
LB_SETCOLUMNWIDTH = 0x0195 _LB_SETCOLUMNWIDTH = 0x0195
LB_ADDFILE = 0x0196 _LB_ADDFILE = 0x0196
LB_SETTOPINDEX = 0x0197 _LB_SETTOPINDEX = 0x0197
LB_GETITEMRECT = 0x0198 _LB_GETITEMRECT = 0x0198
LB_GETITEMDATA = 0x0199 _LB_GETITEMDATA = 0x0199
LB_SETITEMDATA = 0x019A _LB_SETITEMDATA = 0x019A
LB_SELITEMRANGE = 0x019B _LB_SELITEMRANGE = 0x019B
LB_SETANCHORINDEX = 0x019C _LB_SETANCHORINDEX = 0x019C
LB_GETANCHORINDEX = 0x019D _LB_GETANCHORINDEX = 0x019D
LB_SETCARETINDEX = 0x019E _LB_SETCARETINDEX = 0x019E
LB_GETCARETINDEX = 0x019F _LB_GETCARETINDEX = 0x019F
LB_SETITEMHEIGHT = 0x01A0 _LB_SETITEMHEIGHT = 0x01A0
LB_GETITEMHEIGHT = 0x01A1 _LB_GETITEMHEIGHT = 0x01A1
LB_FINDSTRINGEXACT = 0x01A2 _LB_FINDSTRINGEXACT = 0x01A2
LB_SETLOCALE = 0x01A5 _LB_SETLOCALE = 0x01A5
LB_GETLOCALE = 0x01A6 _LB_GETLOCALE = 0x01A6
LB_SETCOUNT = 0x01A7 _LB_SETCOUNT = 0x01A7
LB_INITSTORAGE = 0x01A8 _LB_INITSTORAGE = 0x01A8
LB_ITEMFROMPOINT = 0x01A9 _LB_ITEMFROMPOINT = 0x01A9
LB_MULTIPLEADDSTRING = 0x01B1 _LB_MULTIPLEADDSTRING = 0x01B1
LB_GETLISTBOXINFO = 0x01B2 _LB_GETLISTBOXINFO = 0x01B2
) )
// Listbox WM_COMMAND notifications and message returns. // Listbox WM_COMMAND notifications and message returns.
// TODO filter out notifications not provided in windows 2000 // TODO filter out notifications not provided in windows 2000
const ( const (
// from winuser.h // from winuser.h
LB_OKAY = 0 _LB_OKAY = 0
LB_ERR = (-1) // TODO this will blow up the Go compiler if it's used _LB_ERR = (-1) // TODO this will blow up the Go compiler if it's used
LBN_ERRSPACE = (-2) // TODO this will blow up the Go compiler if it's used _LBN_ERRSPACE = (-2) // TODO this will blow up the Go compiler if it's used
LBN_SELCHANGE = 1 _LBN_SELCHANGE = 1
LBN_DBLCLK = 2 _LBN_DBLCLK = 2
LBN_SELCANCEL = 3 _LBN_SELCANCEL = 3
LBN_SETFOCUS = 4 _LBN_SETFOCUS = 4
LBN_KILLFOCUS = 5 _LBN_KILLFOCUS = 5
) )
*/
// Static control styles. // Static control styles.
const ( const (

57
listbox.go Normal file
View File

@ -0,0 +1,57 @@
// 14 february 2014
//package ui
package main
import (
"sync"
)
// A Listbox is a vertical list of items, of which one or (optionally) more items can be selected at any given time.
type Listbox struct {
// TODO Select event
lock sync.Mutex
created bool
sysData *sysData
initItems []string
}
// NewCombobox makes a new combobox with the given items. If multiple is true, the listbox allows multiple selection.
func NewListbox(multiple bool, items ...string) (l *Listbox) {
l = &Listbox{
sysData: mksysdata(c_listbox),
initItems: items,
}
l.sysData.alternate = multiple
return l
}
// TODO Append, InsertBefore, Delete
// TODO Selection
// TODO SelectedIndices
func (l *Listbox) make(window *sysData) (err error) {
l.lock.Lock()
defer l.lock.Unlock()
err = l.sysData.make("", 300, 300, window)
if err != nil {
return err
}
for _, s := range l.initItems {
err = l.sysData.append(s)
if err != nil {
return err
}
}
return nil
}
func (l *Listbox) setRect(x int, y int, width int, height int) error {
l.lock.Lock()
defer l.lock.Unlock()
return l.sysData.setRect(x, y, width, height)
}

View File

@ -14,7 +14,9 @@ func main() {
cb2 := NewCombobox(false, "You can't edit me!", "No you can't!", "No you won't!") cb2 := NewCombobox(false, "You can't edit me!", "No you can't!", "No you won't!")
e := NewLineEdit("Enter text here too") e := NewLineEdit("Enter text here too")
l := NewLabel("This is a label") l := NewLabel("This is a label")
s := NewStack(Vertical, b, c, cb1, cb2, e, l) s0 := NewStack(Vertical, b, c, cb1, cb2, e, l)
lb := NewListbox(true, "Select One", "Or More", "To Continue")
s := NewStack(Horizontal, lb, s0)
err := w.Open(s) err := w.Open(s)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -37,6 +37,7 @@ func (c *cSysData) append(string) error {
panic(runtime.GOOS + " sysData does not define append()") panic(runtime.GOOS + " sysData does not define append()")
} }
// TODO insertAfter // TODO insertAfter
// TODO selectedIndex, selectedIndices, selectedTexts
const ( const (
c_window = iota c_window = iota
@ -45,6 +46,7 @@ const (
c_combobox c_combobox
c_lineedit c_lineedit
c_label c_label
c_listbox
nctypes nctypes
) )

View File

@ -66,6 +66,15 @@ var classTypes = [nctypes]*classData{
style: _SS_NOPREFIX | controlstyle, style: _SS_NOPREFIX | controlstyle,
xstyle: 0 | controlxstyle, xstyle: 0 | controlxstyle,
}, },
c_listbox: &classData{
name: "LISTBOX",
style: 0 | controlstyle,
xstyle: 0 | controlxstyle,
altStyle: _LBS_EXTENDEDSEL | controlstyle,
appendMsg: _LB_ADDSTRING,
insertAfterMsg: _LB_INSERTSTRING,
deleteMsg: _LB_DELETESTRING,
},
} }
func (s *sysData) addChild(child *sysData) _HMENU { func (s *sysData) addChild(child *sysData) _HMENU {