2014-02-14 11:16:27 -06:00
// 14 february 2014
2014-02-19 10:41:10 -06:00
package ui
2014-02-14 11:16:27 -06:00
import (
"sync"
)
// A Combobox is a drop-down list of items, of which only one can be selected at any given time. You may optionally make the combobox editable to allow custom items.
type Combobox struct {
// TODO Select event
lock sync . Mutex
created bool
sysData * sysData
initItems [ ] string
}
2014-02-25 14:13:37 -06:00
func newCombobox ( editable bool , items ... string ) ( c * Combobox ) {
2014-02-14 11:16:27 -06:00
c = & Combobox {
sysData : mksysdata ( c_combobox ) ,
initItems : items ,
}
2014-02-14 14:54:56 -06:00
c . sysData . alternate = editable
2014-02-14 11:16:27 -06:00
return c
}
2014-02-25 14:13:37 -06:00
// NewCombobox makes a new Combobox with the given items.
func NewCombobox ( items ... string ) * Combobox {
return newCombobox ( false , items ... )
}
// NewEditableCombobox makes a new editable Combobox with the given items.
func NewEditableCombobox ( items ... string ) * Combobox {
return newCombobox ( true , items ... )
}
2014-02-15 16:52:33 -06:00
// Append adds an item to the end of the Combobox's list.
func ( c * Combobox ) Append ( what string ) ( err error ) {
c . lock . Lock ( )
defer c . lock . Unlock ( )
if c . created {
return c . sysData . append ( what )
}
c . initItems = append ( c . initItems , what )
return nil
}
// InsertBefore inserts a new item in the Combobox before the item at the given position.
func ( c * Combobox ) InsertBefore ( what string , before int ) ( err error ) {
c . lock . Lock ( )
defer c . lock . Unlock ( )
if c . created {
return c . sysData . insertBefore ( what , before )
}
m := make ( [ ] string , 0 , len ( c . initItems ) + 1 )
m = append ( m , c . initItems [ : before ] ... )
m = append ( m , what )
c . initItems = append ( m , c . initItems [ before : ] ... )
return nil
}
2014-02-15 17:14:43 -06:00
// Delete removes the given item from the Combobox.
func ( c * Combobox ) Delete ( index int ) error {
c . lock . Lock ( )
defer c . lock . Unlock ( )
if c . created {
return c . sysData . delete ( index )
}
c . initItems = append ( c . initItems [ : index ] , c . initItems [ index + 1 : ] ... )
return nil
}
2014-02-14 11:16:27 -06:00
// Selection returns the current selection.
2014-02-15 12:36:24 -06:00
func ( c * Combobox ) Selection ( ) string {
2014-02-14 11:16:27 -06:00
c . lock . Lock ( )
defer c . lock . Unlock ( )
2014-02-14 19:41:36 -06:00
if c . created {
return c . sysData . text ( )
}
2014-02-15 12:36:24 -06:00
return ""
2014-02-14 11:16:27 -06:00
}
2014-02-15 17:27:34 -06:00
// SelectedIndex returns the index of the current selection in the Combobox. It returns -1 either if no selection was made or if text was manually entered in an editable Combobox.
func ( c * Combobox ) SelectedIndex ( ) int {
c . lock . Lock ( )
defer c . lock . Unlock ( )
if c . created {
return c . sysData . selectedIndex ( )
}
return - 1
}
2014-02-14 11:16:27 -06:00
func ( c * Combobox ) make ( window * sysData ) ( err error ) {
c . lock . Lock ( )
defer c . lock . Unlock ( )
2014-02-15 12:07:46 -06:00
err = c . sysData . make ( "" , window )
2014-02-14 11:16:27 -06:00
if err != nil {
return err
}
for _ , s := range c . initItems {
err = c . sysData . append ( s )
if err != nil {
return err
}
}
2014-02-14 19:41:36 -06:00
c . created = true
2014-02-14 11:16:27 -06:00
return nil
}
2014-03-03 16:44:03 -06:00
func ( c * Combobox ) setRect ( x int , y int , width int , height int , winheight int ) error {
2014-02-14 11:16:27 -06:00
c . lock . Lock ( )
defer c . lock . Unlock ( )
2014-03-03 16:44:03 -06:00
return c . sysData . setRect ( x , y , width , height , winheight )
2014-02-14 11:16:27 -06:00
}
2014-02-24 09:56:35 -06:00
func ( c * Combobox ) preferredSize ( ) ( width int , height int , err error ) {
c . lock . Lock ( )
defer c . lock . Unlock ( )
width , height = c . sysData . preferredSize ( )
return
}