Steamrolled errors under panic() in Combobox/Listbox.Append()/InsertBefore() because screw Windows being different.

This commit is contained in:
Pietro Gagliardi 2014-03-09 16:02:17 -04:00
parent a7ec908ebd
commit b9f0ad90ec
6 changed files with 30 additions and 38 deletions

View File

@ -36,25 +36,23 @@ func NewEditableCombobox(items ...string) *Combobox {
} }
// Append adds items to the end of the Combobox's list. // Append adds items to the end of the Combobox's list.
func (c *Combobox) Append(what ...string) (err error) { // Append will panic if something goes wrong on platforms that do not abort themselves.
func (c *Combobox) Append(what ...string) {
c.lock.Lock() c.lock.Lock()
defer c.lock.Unlock() defer c.lock.Unlock()
if c.created { if c.created {
for i, s := range what { for i, s := range what {
err := c.sysData.append(s) c.sysData.append(s)
if err != nil {
return fmt.Errorf("error adding element %d in Combobox.Append() (%q): %v", i, s, err)
}
} }
return nil return
} }
c.initItems = append(c.initItems, what...) c.initItems = append(c.initItems, what...)
return nil
} }
// InsertBefore inserts a new item in the Combobox before the item at the given position. It panics if the given index is out of bounds. // InsertBefore inserts a new item in the Combobox before the item at the given position. It panics if the given index is out of bounds.
func (c *Combobox) InsertBefore(what string, before int) (err error) { // InsertBefore will also panic if something goes wrong on platforms that do not abort themselves.
func (c *Combobox) InsertBefore(what string, before int) {
c.lock.Lock() c.lock.Lock()
defer c.lock.Unlock() defer c.lock.Unlock()
@ -64,7 +62,8 @@ func (c *Combobox) InsertBefore(what string, before int) (err error) {
if before < 0 || before >= c.sysData.len() { if before < 0 || before >= c.sysData.len() {
goto badrange goto badrange
} }
return c.sysData.insertBefore(what, before) c.sysData.insertBefore(what, before)
return
} }
if before < 0 || before >= len(c.initItems) { if before < 0 || before >= len(c.initItems) {
goto badrange goto badrange
@ -73,7 +72,7 @@ func (c *Combobox) InsertBefore(what string, before int) (err error) {
m = append(m, c.initItems[:before]...) m = append(m, c.initItems[:before]...)
m = append(m, what) m = append(m, what)
c.initItems = append(m, c.initItems[before:]...) c.initItems = append(m, c.initItems[before:]...)
return nil return
badrange: badrange:
panic(fmt.Errorf("index %d out of range in Combobox.InsertBefore()", before)) panic(fmt.Errorf("index %d out of range in Combobox.InsertBefore()", before))
} }

View File

@ -28,25 +28,23 @@ func NewListbox(multiple bool, items ...string) (l *Listbox) {
} }
// Append adds items to the end of the Listbox's list. // Append adds items to the end of the Listbox's list.
func (l *Listbox) Append(what ...string) (err error) { // Append will panic if something goes wrong on platforms that do not abort themselves.
func (l *Listbox) Append(what ...string) {
l.lock.Lock() l.lock.Lock()
defer l.lock.Unlock() defer l.lock.Unlock()
if l.created { if l.created {
for i, s := range what { for i, s := range what {
err := l.sysData.append(s) l.sysData.append(s)
if err != nil {
return fmt.Errorf("error adding element %d in Listbox.Append() (%q): %v", i, s, err)
}
} }
return nil return
} }
l.initItems = append(l.initItems, what...) l.initItems = append(l.initItems, what...)
return nil
} }
// InsertBefore inserts a new item in the Listbox before the item at the given position. It panics if the given index is out of bounds. // InsertBefore inserts a new item in the Listbox before the item at the given position. It panics if the given index is out of bounds.
func (l *Listbox) InsertBefore(what string, before int) (err error) { // InsertBefore will also panic if something goes wrong on platforms that do not abort themselves.
func (l *Listbox) InsertBefore(what string, before int) {
l.lock.Lock() l.lock.Lock()
defer l.lock.Unlock() defer l.lock.Unlock()
@ -56,7 +54,8 @@ func (l *Listbox) InsertBefore(what string, before int) (err error) {
if before < 0 || before >= l.sysData.len() { if before < 0 || before >= l.sysData.len() {
goto badrange goto badrange
} }
return l.sysData.insertBefore(what, before) l.sysData.insertBefore(what, before)
return
} }
if before < 0 || before >= len(l.initItems) { if before < 0 || before >= len(l.initItems) {
goto badrange goto badrange
@ -65,7 +64,7 @@ func (l *Listbox) InsertBefore(what string, before int) (err error) {
m = append(m, l.initItems[:before]...) m = append(m, l.initItems[:before]...)
m = append(m, what) m = append(m, what)
l.initItems = append(m, l.initItems[before:]...) l.initItems = append(m, l.initItems[before:]...)
return nil return
badrange: badrange:
panic(fmt.Errorf("index %d out of range in Listbox.InsertBefore()", before)) panic(fmt.Errorf("index %d out of range in Listbox.InsertBefore()", before))
} }

View File

@ -40,10 +40,10 @@ func (c *cSysData) isChecked() bool {
func (c *cSysData) text() string { func (c *cSysData) text() string {
panic(runtime.GOOS + " sysData does not define text()") panic(runtime.GOOS + " sysData does not define text()")
} }
func (c *cSysData) append(string) error { func (c *cSysData) append(string) {
panic(runtime.GOOS + " sysData does not define append()") panic(runtime.GOOS + " sysData does not define append()")
} }
func (c *cSysData) insertBefore(string, int) error { func (c *cSysData) insertBefore(string, int) {
panic(runtime.GOOS + " sysData does not define insertBefore()") panic(runtime.GOOS + " sysData does not define insertBefore()")
} }
func (c *cSysData) selectedIndex() int { func (c *cSysData) selectedIndex() int {

View File

@ -387,7 +387,7 @@ func (s *sysData) text() string {
return <-ret return <-ret
} }
func (s *sysData) append(what string) error { func (s *sysData) append(what string) {
ret := make(chan struct{}) ret := make(chan struct{})
defer close(ret) defer close(ret)
uitask <- func() { uitask <- func() {
@ -395,10 +395,9 @@ func (s *sysData) append(what string) error {
ret <- struct{}{} ret <- struct{}{}
} }
<-ret <-ret
return nil
} }
func (s *sysData) insertBefore(what string, before int) error { func (s *sysData) insertBefore(what string, before int) {
ret := make(chan struct{}) ret := make(chan struct{})
defer close(ret) defer close(ret)
uitask <- func() { uitask <- func() {
@ -406,7 +405,6 @@ func (s *sysData) insertBefore(what string, before int) error {
ret <- struct{}{} ret <- struct{}{}
} }
<-ret <-ret
return nil
} }
func (s *sysData) selectedIndex() int { func (s *sysData) selectedIndex() int {

View File

@ -216,7 +216,7 @@ func (s *sysData) text() string {
return <-ret return <-ret
} }
func (s *sysData) append(what string) error { func (s *sysData) append(what string) {
ret := make(chan struct{}) ret := make(chan struct{})
defer close(ret) defer close(ret)
uitask <- func() { uitask <- func() {
@ -224,10 +224,9 @@ func (s *sysData) append(what string) error {
ret <- struct{}{} ret <- struct{}{}
} }
<-ret <-ret
return nil
} }
func (s *sysData) insertBefore(what string, before int) error { func (s *sysData) insertBefore(what string, before int) {
ret := make(chan struct{}) ret := make(chan struct{})
defer close(ret) defer close(ret)
uitask <- func() { uitask <- func() {
@ -235,7 +234,6 @@ func (s *sysData) insertBefore(what string, before int) error {
ret <- struct{}{} ret <- struct{}{}
} }
<-ret <-ret
return nil
} }
func (s *sysData) selectedIndex() int { func (s *sysData) selectedIndex() int {

View File

@ -317,7 +317,7 @@ func (s *sysData) text() (str string) {
return syscall.UTF16ToString(tc) return syscall.UTF16ToString(tc)
} }
func (s *sysData) append(what string) (err error) { func (s *sysData) append(what string) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
@ -332,14 +332,13 @@ func (s *sysData) append(what string) (err error) {
} }
r := <-ret r := <-ret
if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) { if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) {
return fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", r.err) panic(fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", r.err))
} else if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) { } else if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) {
return fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", r.err) panic(fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", r.err))
} }
return nil
} }
func (s *sysData) insertBefore(what string, index int) (err error) { func (s *sysData) insertBefore(what string, index int) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
@ -354,11 +353,10 @@ func (s *sysData) insertBefore(what string, index int) (err error) {
} }
r := <-ret r := <-ret
if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) { if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) {
return fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", r.err) panic(fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", r.err))
} else if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) { } else if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) {
return fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", r.err) panic(fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", r.err))
} }
return nil
} }
func (s *sysData) selectedIndex() int { func (s *sysData) selectedIndex() int {