Steamrolled errors under panic() in Combobox/Listbox.Append()/InsertBefore() because screw Windows being different.
This commit is contained in:
parent
a7ec908ebd
commit
b9f0ad90ec
19
combobox.go
19
combobox.go
|
@ -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
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
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))
|
||||||
}
|
}
|
||||||
|
|
19
listbox.go
19
listbox.go
|
@ -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
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue