summaryrefslogtreecommitdiffstatshomepage
path: root/maptablemodel.go
diff options
context:
space:
mode:
authorAlexander Neumann <an2048@gmail.com>2013-05-16 17:28:56 +0200
committerAlexander Neumann <an2048@gmail.com>2013-05-16 17:28:56 +0200
commit78946864da6e4fd8fe58866ff43f7e3df088fdd4 (patch)
tree66bb823dded4874b78b86174dca6c881b408c7ea /maptablemodel.go
parentMove body of tableReflectModel.Less to new less func (diff)
downloadwireguard-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.go74
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]
+}