Added the beginning of the Mac OS X implementation of Combobox; also added a file to plan out how lists will be implemented/are being implemented.
This commit is contained in:
parent
db1c6c5c17
commit
01e5871741
|
@ -0,0 +1,78 @@
|
||||||
|
NSPopUpButton (non-editable combo box)
|
||||||
|
make:
|
||||||
|
b = [[NSPopUpButton alloc]
|
||||||
|
initWithFrame:(0, 0, 100, 100)
|
||||||
|
pullsDown:NO]
|
||||||
|
add:
|
||||||
|
[b addItemWithTitle:toNSString(s)]
|
||||||
|
insertBefore:
|
||||||
|
[b insertItemWithTitle:toNSString(s)
|
||||||
|
atIndex:index] (NSInteger)
|
||||||
|
remove:
|
||||||
|
[b removeItemAtIndex:index] (NSInteger)
|
||||||
|
selection:
|
||||||
|
fromNSString([b titleOfSelectedItem])
|
||||||
|
(returns nil if nothing is selected; need to edit to return "" if so)
|
||||||
|
selectedIndex:
|
||||||
|
[b indexOfSelectedItem] (NSInteger)
|
||||||
|
(returns -1 if nothing is selected)
|
||||||
|
NSComboBox (editable combo box)
|
||||||
|
make:
|
||||||
|
b = [[NSComboBox alloc]
|
||||||
|
initWithFrame:(0, 0, 100, 100)]
|
||||||
|
[b setUsesDataSource:NO] // internal data soruce
|
||||||
|
add:
|
||||||
|
[b addItemWithObjectValue:toNSString(s)]
|
||||||
|
insertBefore:
|
||||||
|
[b insertItemWithObjectValue:toNSString(s)
|
||||||
|
atIndex:index] (NSInteger)
|
||||||
|
remove:
|
||||||
|
[b removeItemAtIndex:index] (NSInteger)
|
||||||
|
selection:
|
||||||
|
this depends on if the /user/ selecting an item changes the edit box
|
||||||
|
this appears to be the case, so
|
||||||
|
fromNSString([b stringValue])
|
||||||
|
note that if we ever add Combobox.SetText(), we are responsible for managing both the edit field AND the list, as they are programmatically separate
|
||||||
|
selectedIndex:
|
||||||
|
[b indexOfSelectedItem] (NSInteger)
|
||||||
|
(returns -1 if nothing is selected)
|
||||||
|
(TODO custom text?)
|
||||||
|
NSTableView (listbox)
|
||||||
|
make:
|
||||||
|
b = [[NSTableView alloc]
|
||||||
|
initWithFrame:(0, 0, 100, 100)]
|
||||||
|
col = [[NSTableColumn alloc]
|
||||||
|
initWithIdentifier:@"listboxcolumn"]
|
||||||
|
listDict = [NSMutableDictionary xxxx]
|
||||||
|
listItems = [[xxx]]
|
||||||
|
[listItems addObject:listDict]
|
||||||
|
[col bind:@"value"
|
||||||
|
toObject:listItems
|
||||||
|
withKeyPath:@"xxxxx.listboxcolumn"
|
||||||
|
options:nilid]
|
||||||
|
[b addTableColumn:col]
|
||||||
|
// TODO autoresizing
|
||||||
|
add:
|
||||||
|
insertBefore:
|
||||||
|
remove:
|
||||||
|
selection:
|
||||||
|
idx = [b selectedRow] (NSInteger)
|
||||||
|
if idx == -1 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
dataSource = [b dataSource]
|
||||||
|
selectedIndex:
|
||||||
|
[b selectedRow] (NSInteger)
|
||||||
|
(returns -1 if none selected)
|
||||||
|
selectedIndices:
|
||||||
|
nsidx = [b selectedRowIndexes]
|
||||||
|
c = [nsidx count] (NSUInteger)
|
||||||
|
nsidxbuf = C.makeNSUIntegerArray(c)
|
||||||
|
[nsidx getIndexes:nsidxbuf
|
||||||
|
maxCont:c
|
||||||
|
inIndexRange:nilid]
|
||||||
|
// and just copy out of nsidxbuf somehow
|
||||||
|
// I think this is going to have to make 2 temporary arrays; a better option will be needed! TODO
|
||||||
|
selectedTexts:
|
||||||
|
indices := selectedIndices()
|
||||||
|
dataSource = [b dataSource]
|
|
@ -24,11 +24,14 @@ type classData struct {
|
||||||
settextsel C.SEL
|
settextsel C.SEL
|
||||||
textsel C.SEL
|
textsel C.SEL
|
||||||
alttextsel C.SEL
|
alttextsel C.SEL
|
||||||
|
append func(id C.id, what string, alternate bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_NSWindow = objc_getClass("NSWindow")
|
_NSWindow = objc_getClass("NSWindow")
|
||||||
_NSButton = objc_getClass("NSButton")
|
_NSButton = objc_getClass("NSButton")
|
||||||
|
_NSPopUpButton = objc_getClass("NSPopUpButton")
|
||||||
|
_NSComboBox = objc_getClass("NSComboBox")
|
||||||
|
|
||||||
_initWithContentRect = sel_getUid("initWithContentRect:styleMask:backing:defer:")
|
_initWithContentRect = sel_getUid("initWithContentRect:styleMask:backing:defer:")
|
||||||
_initWithFrame = sel_getUid("initWithFrame:")
|
_initWithFrame = sel_getUid("initWithFrame:")
|
||||||
|
@ -50,6 +53,15 @@ var (
|
||||||
_contentView = sel_getUid("contentView")
|
_contentView = sel_getUid("contentView")
|
||||||
_addSubview = sel_getUid("addSubview:")
|
_addSubview = sel_getUid("addSubview:")
|
||||||
_setButtonType = sel_getUid("setButtonType:")
|
_setButtonType = sel_getUid("setButtonType:")
|
||||||
|
_initWithFramePullsDown = sel_getUid("initWithFrame:pullsDown:")
|
||||||
|
_setUsesDataSource = sel_getUid("setUsesDataSource:")
|
||||||
|
_addItemWithTitle = sel_getUid("addItemWithTitle:")
|
||||||
|
_insertItemWithTitleAtIndex = sel_getUid("insertItemWithTitle:atIndex:")
|
||||||
|
_removeItemAtIndex = sel_getUid("removeItemAtIndex:")
|
||||||
|
_titleOfSelectedItem = sel_getUid("titleOfSelectedItem")
|
||||||
|
_indexOfSelectedItem = sel_getUid("indexOfSelectedItem")
|
||||||
|
_addItemWithObjectValue = sel_getUid("addItemWithObjectValue:")
|
||||||
|
_insertItemWithObjectValueAtIndex = sel_getUid("insertItemWithObjectValue:atIndex:")
|
||||||
)
|
)
|
||||||
|
|
||||||
func controlShow(what C.id) {
|
func controlShow(what C.id) {
|
||||||
|
@ -126,6 +138,37 @@ var classTypes = [nctypes]*classData{
|
||||||
textsel: _title,
|
textsel: _title,
|
||||||
},
|
},
|
||||||
c_combobox: &classData{
|
c_combobox: &classData{
|
||||||
|
make: func(parentWindow C.id, alternate bool) C.id {
|
||||||
|
var combobox C.id
|
||||||
|
|
||||||
|
if alternate {
|
||||||
|
combobox = objc_alloc(_NSComboBox)
|
||||||
|
combobox = objc_msgSend_rect(combobox, _initWithFrame,
|
||||||
|
0, 0, 100, 100)
|
||||||
|
C.objc_msgSend_bool(combobox, _setUsesDataSource, C.BOOL(C.NO))
|
||||||
|
} else {
|
||||||
|
combobox = objc_alloc(_NSPopUpButton)
|
||||||
|
combobox = objc_msgSend_rect_bool(combobox, _initWithFramePullsDown,
|
||||||
|
0, 0, 100, 100,
|
||||||
|
C.BOOL(C.NO))
|
||||||
|
}
|
||||||
|
windowView := C.objc_msgSend_noargs(parentWindow, _contentView)
|
||||||
|
C.objc_msgSend_id(windowView, _addSubview, combobox)
|
||||||
|
return combobox
|
||||||
|
},
|
||||||
|
show: controlShow,
|
||||||
|
hide: controlHide,
|
||||||
|
// TODO setText
|
||||||
|
textsel: _titleOfSelectedItem,
|
||||||
|
alttextsel: _stringValue,
|
||||||
|
append: func(id C.id, what string, alternate bool) {
|
||||||
|
str := toNSString(what)
|
||||||
|
if alternate {
|
||||||
|
C.objc_msgSend_id(id, _addItemWithObjectValue, str)
|
||||||
|
} else {
|
||||||
|
C.objc_msgSend_id(id, _addItemWithTitle, str)
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
c_lineedit: &classData{
|
c_lineedit: &classData{
|
||||||
},
|
},
|
||||||
|
@ -260,7 +303,14 @@ if classTypes[s.ctype].textsel == zero { return "" }
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sysData) append(what string) error {
|
func (s *sysData) append(what string) error {
|
||||||
// TODO
|
if classTypes[s.ctype].append == nil { return nil }
|
||||||
|
ret := make(chan struct{})
|
||||||
|
defer close(ret)
|
||||||
|
uitask <- func() {
|
||||||
|
classTypes[s.ctype].append(s.id, what, s.alternate)
|
||||||
|
ret <- struct{}{}
|
||||||
|
}
|
||||||
|
<-ret
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue