diff options
author | Alexander Neumann <an2048@gmail.com> | 2013-05-16 17:28:56 +0200 |
---|---|---|
committer | Alexander Neumann <an2048@gmail.com> | 2013-05-16 17:28:56 +0200 |
commit | 78946864da6e4fd8fe58866ff43f7e3df088fdd4 (patch) | |
tree | 66bb823dded4874b78b86174dca6c881b408c7ea /maptablemodel.go | |
parent | Move body of tableReflectModel.Less to new less func (diff) | |
download | wireguard-windows-78946864da6e4fd8fe58866ff43f7e3df088fdd4.tar.xz wireguard-windows-78946864da6e4fd8fe58866ff43f7e3df088fdd4.zip |
TableView: Add support for []map[string]interface{} models
Diffstat (limited to 'maptablemodel.go')
-rw-r--r-- | maptablemodel.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/maptablemodel.go b/maptablemodel.go new file mode 100644 index 00000000..3fef29f5 --- /dev/null +++ b/maptablemodel.go @@ -0,0 +1,74 @@ +// Copyright 2013 The Walk Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package walk + +import ( + "sort" +) + +type mapTableModel struct { + TableModelBase + SorterBase + dataMembers []string + dataSource interface{} + items []map[string]interface{} +} + +func newMapTableModel(dataSource interface{}) (TableModel, error) { + items, ok := dataSource.([]map[string]interface{}) + if !ok { + return nil, newError("dataSource must be assignable to []map[string]interface{}") + } + + return &mapTableModel{dataSource: dataSource, items: items}, nil +} + +func (m *mapTableModel) setDataMembers(dataMembers []string) { + m.dataMembers = dataMembers +} + +func (m *mapTableModel) RowCount() int { + return len(m.items) +} + +func (m *mapTableModel) Value(row, col int) interface{} { + if m.items[row] == nil { + if populator, ok := m.dataSource.(Populator); ok { + if err := populator.Populate(index); err != nil { + return err + } + } + + if m.items[row] == nil { + return nil + } + } + + return m.items[row][m.dataMembers[col]] +} + +func (m *mapTableModel) Sort(col int, order SortOrder) error { + m.col, m.order = col, order + + sort.Sort(m) + + m.changedPublisher.Publish() + + return nil +} + +func (m *mapTableModel) Len() int { + return m.RowCount() +} + +func (m *mapTableModel) Less(i, j int) bool { + col := m.SortedColumn() + + return less(m.Value(i, col), m.Value(j, col), m.SortOrder()) +} + +func (m *mapTableModel) Swap(i, j int) { + m.items[i], m.items[j] = m.items[j], m.items[i] +} |