lxn / walk

A Windows GUI toolkit for the Go Programming Language
Other
6.78k stars 886 forks source link

TableView use model.PublishRowsReset(),Some lines do not take effect #789

Open ParkourLiu opened 2 years ago

ParkourLiu commented 2 years ago

A running example and code example are given below, I change two lines of data, but only the last line takes effect. The first line takes effect only if you mouse over it, action.settext () does not work either. You need to move the mouse over it to take effect

ParkourLiu commented 2 years ago

image

image

image

ParkourLiu commented 2 years ago

package main

import ( "fmt" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" "sort" "time" )

var model = NewCondomModel() var at *walk.Action

func main() { if _, err := (MainWindow{ Title: "666", Size: Size{600, 500}, Layout: Grid{}, MenuItems: []MenuItem{ Action{ AssignTo: &at, Text: "testAction", }, }, Children: []Widget{ HSplitter{ Children: []Widget{ VSplitter{ StretchFactor: 4, Children: []Widget{ TableView{ StretchFactor: 9, Columns: []TableViewColumn{ {Title: "Terrace", Width: 200}, {Title: "IP"}, }, Model: model, }, Composite{ StretchFactor: 1, Layout: Grid{Columns: 1, Spacing: 10}, Children: []Widget{ PushButton{Text: "test", OnClicked: func() { go func() { aa := []*Condom{ &Condom{ IP: "1", Terrace: time.Now().Format("2006-01-02 15:04:05"), checked: false, }, &Condom{ IP: "2", Terrace: time.Now().Format("2006-01-02 15:04:05"), checked: false, }, } model.items = aa model.PublishRowsReset() err := at.SetText(time.Now().Format("2006-01-02 15:04:05")) fmt.Println(err) }()

                                }},
                            },
                        },
                    },
                },
            },
        },
    },
}.Run()); err != nil {
    var tmp walk.Form
    walk.MsgBox(tmp, "error", err.Error(), walk.MsgBoxIconInformation)
}

}

//--------------------

type Condom struct { Terrace string IP string checked bool }

type CondomModel struct { walk.TableModelBase walk.SorterBase sortColumn int sortOrder walk.SortOrder items []*Condom }

func (m *CondomModel) RowCount() int { return len(m.items) }

func (m *CondomModel) Value(row, col int) interface{} { item := m.items[row]

switch col {
case 0:
    return item.Terrace
case 1:
    return item.IP
}
panic("unexpected col")

}

func (m *CondomModel) Checked(row int) bool { return m.items[row].checked }

func (m *CondomModel) SetChecked(row int, checked bool) error { m.items[row].checked = checked return nil }

func (m *CondomModel) Sort(col int, order walk.SortOrder) error { m.sortColumn, m.sortOrder = col, order

sort.Stable(m)

return m.SorterBase.Sort(col, order)

}

func (m *CondomModel) Len() int { return len(m.items) }

func (m *CondomModel) Less(i, j int) bool { a, b := m.items[i], m.items[j]

c := func(ls bool) bool {
    if m.sortOrder == walk.SortAscending {
        return ls
    }

    return !ls
}

switch m.sortColumn {
case 0:
    return c(a.Terrace < b.Terrace)
case 1:
    return c(a.IP < b.IP)
}

panic("unreachable")

}

func (m *CondomModel) Swap(i, j int) { m.items[i], m.items[j] = m.items[j], m.items[i] }

func NewCondomModel() *CondomModel { m := new(CondomModel) return m }

ParkourLiu commented 2 years ago

In the above code, I change two lines of data, but only the last line takes effect. The first line takes effect only if you mouse over it

bobowang2017 commented 3 months ago

how to solve it?