From dbd44c7bbc8f19eab6f50432b59a081ab3420cb3 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Mon, 25 Feb 2019 17:06:39 +0100 Subject: Replace some occurrences of Widget with *WidgetBase --- boxlayout.go | 18 ++++++------- gridlayout.go | 81 +++++++++++++++++++++++++++++++++++++++-------------------- widgetlist.go | 19 ++++++++------ 3 files changed, 74 insertions(+), 44 deletions(-) diff --git a/boxlayout.go b/boxlayout.go index cc5203ce..b0aa51ea 100644 --- a/boxlayout.go +++ b/boxlayout.go @@ -162,12 +162,12 @@ func (l *BoxLayout) cleanupStretchFactors() { } type widgetInfo struct { - index int - minSize int - maxSize int - stretch int - greedy bool - widget Widget + index int + minSize int + maxSize int + stretch int + greedy bool + widgetBase *WidgetBase } type widgetInfoList []widgetInfo @@ -177,8 +177,8 @@ func (l widgetInfoList) Len() int { } func (l widgetInfoList) Less(i, j int) bool { - _, iIsSpacer := l[i].widget.(*Spacer) - _, jIsSpacer := l[j].widget.(*Spacer) + _, iIsSpacer := l[i].widgetBase.window.(*Spacer) + _, jIsSpacer := l[j].widgetBase.window.(*Spacer) if l[i].greedy == l[j].greedy { if iIsSpacer == jIsSpacer { @@ -419,7 +419,7 @@ func boxLayoutItems(widgets []Widget, orientation Orientation, bounds Rectangle, sortedWidgetInfo[i].minSize = minSizes[i] sortedWidgetInfo[i].maxSize = maxSizes[i] sortedWidgetInfo[i].stretch = sf - sortedWidgetInfo[i].widget = widget + sortedWidgetInfo[i].widgetBase = widget.AsWidgetBase() minSizesRemaining += minSizes[i] diff --git a/gridlayout.go b/gridlayout.go index ce67eca7..daa00678 100644 --- a/gridlayout.go +++ b/gridlayout.go @@ -11,9 +11,9 @@ import ( ) type gridLayoutCell struct { - row int - column int - widget Widget + row int + column int + widgetBase *WidgetBase } type gridLayoutSection struct { @@ -36,15 +36,15 @@ type GridLayout struct { resetNeeded bool rowStretchFactors []int columnStretchFactors []int - widget2Info map[Widget]*gridLayoutWidgetInfo + widgetBase2Info map[*WidgetBase]*gridLayoutWidgetInfo cells [][]gridLayoutCell size2MinSize map[Size]Size } func NewGridLayout() *GridLayout { l := &GridLayout{ - widget2Info: make(map[Widget]*gridLayoutWidgetInfo), - size2MinSize: make(map[Size]Size), + widgetBase2Info: make(map[*WidgetBase]*gridLayoutWidgetInfo), + size2MinSize: make(map[Size]Size), } return l @@ -148,8 +148,8 @@ func (l *GridLayout) ensureSufficientSize(rows, columns int) { } // FIXME: Not sure if this works. - for widget, info := range l.widget2Info { - l.widget2Info[widget].cell = &l.cells[info.cell.row][info.cell.column] + for wb, info := range l.widgetBase2Info { + l.widgetBase2Info[wb].cell = &l.cells[info.cell.row][info.cell.column] } } @@ -235,9 +235,14 @@ func rangeFromGridLayoutWidgetInfo(info *gridLayoutWidgetInfo) Rectangle { } func (l *GridLayout) setWidgetOnCells(widget Widget, r Rectangle) { + var wb *WidgetBase + if widget != nil { + wb = widget.AsWidgetBase() + } + for row := r.Y; row < r.Y+r.Height; row++ { for col := r.X; col < r.X+r.Width; col++ { - l.cells[row][col].widget = widget + l.cells[row][col].widgetBase = wb } } } @@ -247,7 +252,7 @@ func (l *GridLayout) Range(widget Widget) (r Rectangle, ok bool) { return Rectangle{}, false } - info := l.widget2Info[widget] + info := l.widgetBase2Info[widget.AsWidgetBase()] if info == nil || l.container == nil || @@ -275,7 +280,9 @@ func (l *GridLayout) SetRange(widget Widget, r Rectangle) error { return newError("range.Width and range.Height must be >= 1") } - info := l.widget2Info[widget] + wb := widget.AsWidgetBase() + + info := l.widgetBase2Info[wb] if info == nil { info = new(gridLayoutWidgetInfo) } else { @@ -290,7 +297,7 @@ func (l *GridLayout) SetRange(widget Widget, r Rectangle) error { if info.cell == nil { // We have to do this _after_ calling ensureSufficientSize(). - l.widget2Info[widget] = info + l.widgetBase2Info[wb] = info } info.cell = cell @@ -305,10 +312,10 @@ func (l *GridLayout) SetRange(widget Widget, r Rectangle) error { func (l *GridLayout) cleanup() { // Make sure only children of our container occupy the precious cells. children := l.container.Children() - for widget, info := range l.widget2Info { - if !children.containsHandle(widget.Handle()) { + for wb, info := range l.widgetBase2Info { + if !children.containsHandle(wb.window.Handle()) { l.setWidgetOnCells(nil, rangeFromGridLayoutWidgetInfo(info)) - delete(l.widget2Info, widget) + delete(l.widgetBase2Info, wb) } } } @@ -377,7 +384,9 @@ func (l *GridLayout) MinSizeForSize(size Size) Size { widget2MinSize := make(map[Widget]Size) - for widget, _ := range l.widget2Info { + for wb, _ := range l.widgetBase2Info { + widget := wb.window.(Widget) + if !shouldLayoutWidget(widget) { continue } @@ -387,14 +396,19 @@ func (l *GridLayout) MinSizeForSize(size Size) Size { for row := 0; row < len(l.cells); row++ { for col := 0; col < len(ws); col++ { - widget := l.cells[row][col].widget + wb := l.cells[row][col].widgetBase + if wb == nil { + continue + } + + widget := wb.window.(Widget) if !shouldLayoutWidget(widget) { continue } min := widget2MinSize[widget] - info := l.widget2Info[widget] + info := l.widgetBase2Info[wb] if info.spanHorz == 1 { ws[col] = maxi(ws[col], min.Width) @@ -408,15 +422,20 @@ func (l *GridLayout) MinSizeForSize(size Size) Size { for row := range heights { var maxHeight int for col := range widths { - widget := l.cells[row][col].widget + wb := l.cells[row][col].widgetBase + if wb == nil { + continue + } + + widget := wb.window.(Widget) if !shouldLayoutWidget(widget) { continue } - if info := l.widget2Info[widget]; info.spanVert == 1 { + if info := l.widgetBase2Info[wb]; info.spanVert == 1 { if hfw, ok := widget.(HeightForWidther); ok { - maxHeight = maxi(maxHeight, hfw.HeightForWidth(l.spannedWidth(l.widget2Info[widget], widths))) + maxHeight = maxi(maxHeight, hfw.HeightForWidth(l.spannedWidth(info, widths))) } else { maxHeight = maxi(maxHeight, widget2MinSize[widget].Height) } @@ -551,9 +570,11 @@ func (l *GridLayout) Update(reset bool) error { widths := l.sectionSizesForSpace(Horizontal, cb.Width, nil) heights := l.sectionSizesForSpace(Vertical, cb.Height, widths) - items := make([]layoutResultItem, 0, len(l.widget2Info)) + items := make([]layoutResultItem, 0, len(l.widgetBase2Info)) + + for wb, info := range l.widgetBase2Info { + widget := wb.window.(Widget) - for widget, info := range l.widget2Info { if !shouldLayoutWidget(widget) { continue } @@ -625,18 +646,24 @@ func (l *GridLayout) sectionSizesForSpace(orientation Orientation, space int, wi } for j := 0; j < otherAxisCount; j++ { - var widget Widget + var wb *WidgetBase if orientation == Horizontal { - widget = l.cells[j][i].widget + wb = l.cells[j][i].widgetBase } else { - widget = l.cells[i][j].widget + wb = l.cells[i][j].widgetBase } + if wb == nil { + continue + } + + widget := wb.window.(Widget) + if !shouldLayoutWidget(widget) { continue } - info := l.widget2Info[widget] + info := l.widgetBase2Info[wb] flags := widget.LayoutFlags() max := widget.MaxSize() diff --git a/widgetlist.go b/widgetlist.go index 9e7ed918..edbfdd3d 100644 --- a/widgetlist.go +++ b/widgetlist.go @@ -20,7 +20,7 @@ type widgetListObserver interface { } type WidgetList struct { - items []Widget + items []*WidgetBase observer widgetListObserver removingIndex int } @@ -34,7 +34,7 @@ func (l *WidgetList) Add(item Widget) error { } func (l *WidgetList) At(index int) Widget { - return l.items[index] + return l.items[index].window.(Widget) } func (l *WidgetList) Clear() error { @@ -59,8 +59,10 @@ func (l *WidgetList) Clear() error { } func (l *WidgetList) Index(item Widget) int { + wb := item.AsWidgetBase() + for i, widget := range l.items { - if widget == item { + if widget == wb { return i } } @@ -89,7 +91,7 @@ func (l *WidgetList) containsHandle(handle win.HWND) bool { func (l *WidgetList) insertIntoSlice(index int, item Widget) { l.items = append(l.items, nil) copy(l.items[index+1:], l.items[index:]) - l.items[index] = item + l.items[index] = item.AsWidgetBase() } func (l *WidgetList) Insert(index int, item Widget) error { @@ -135,14 +137,15 @@ func (l *WidgetList) RemoveAt(index int) error { } observer := l.observer - item := l.items[index] + widget := l.items[index].window.(Widget) + if observer != nil { l.removingIndex = index defer func() { l.removingIndex = -1 }() - if err := observer.onRemovingWidget(index, item); err != nil { + if err := observer.onRemovingWidget(index, widget); err != nil { return err } } @@ -150,8 +153,8 @@ func (l *WidgetList) RemoveAt(index int) error { l.items = append(l.items[:index], l.items[index+1:]...) if observer != nil { - if err := observer.onRemovedWidget(index, item); err != nil { - l.insertIntoSlice(index, item) + if err := observer.onRemovedWidget(index, widget); err != nil { + l.insertIntoSlice(index, widget) return err } } -- cgit v1.2.3-59-g8ed1b