github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/GUI/lists/tree.go (about) 1 package lists 2 3 import ( 4 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 5 "github.com/therecipe/qt/core" 6 ) 7 8 func initItems(data []rd.ItemChilds) *customTreeItem { 9 root := NewCustomTreeItem(nil) 10 childs := make([]*customTreeItem, len(data)) 11 for index, accesParent := range data { 12 item := NewCustomTreeItem(nil).initWith(accesParent.Item) 13 item._parentItem = root 14 childsAcces := accesParent.Childs 15 childsItems := make([]*customTreeItem, len(childsAcces)) 16 for indexChild, childAc := range childsAcces { 17 chi := NewCustomTreeItem(nil).initWith(childAc) 18 chi._parentItem = item 19 childsItems[indexChild] = chi 20 } 21 item._childItems = childsItems 22 childs[index] = item 23 } 24 root._childItems = childs 25 return root 26 } 27 28 type customTreeItem struct { 29 core.QObject 30 31 _ func() `constructor:"init"` 32 33 _itemData rd.Item 34 _parentItem *customTreeItem 35 36 _childItems []*customTreeItem 37 } 38 39 func (i *customTreeItem) init() { 40 i.ConnectDestroyCustomTreeItem(i.destroyCustomTreeItem) 41 } 42 43 func (i *customTreeItem) initWith(data rd.Item) *customTreeItem { 44 i._itemData = data 45 return i 46 } 47 48 func (i *customTreeItem) row() int { 49 if i._parentItem != nil { 50 for index, item := range i._parentItem._childItems { 51 if item.Pointer() == i.Pointer() { 52 return index 53 } 54 } 55 } 56 return 0 57 } 58 59 func (i *customTreeItem) destroyCustomTreeItem() { 60 for _, child := range i._childItems { 61 child.DestroyCustomTreeItem() 62 } 63 i.DestroyCustomTreeItemDefault() 64 } 65 66 type TreeModel struct { 67 core.QAbstractItemModel 68 69 _ func() `constructor:"init"` 70 71 rootItem *customTreeItem 72 73 headers []rd.Header 74 } 75 76 func (m *TreeModel) init() { 77 m.rootItem = NewCustomTreeItem(nil) 78 m.ConnectIndex(m.index) 79 m.ConnectParent(m.parent) 80 m.ConnectHeaderData(m.headerData) 81 m.ConnectRowCount(m.rowCount) 82 m.ConnectData(m.data) 83 } 84 85 func (m *TreeModel) getHeaders() []rd.Header { 86 return m.headers 87 } 88 89 func (m *TreeModel) index(row int, column int, parent *core.QModelIndex) *core.QModelIndex { 90 if !m.HasIndex(row, column, parent) { 91 return core.NewQModelIndex() 92 } 93 94 var parentItem *customTreeItem 95 if !parent.IsValid() { 96 parentItem = m.rootItem 97 } else { 98 parentItem = NewCustomTreeItemFromPointer(parent.InternalPointer()) 99 } 100 101 childItem := parentItem._childItems[row].Pointer() 102 if childItem != nil { 103 return m.CreateIndex(row, column, childItem) 104 } 105 return core.NewQModelIndex() 106 } 107 108 func (m *TreeModel) parent(index *core.QModelIndex) *core.QModelIndex { 109 if !index.IsValid() { 110 return core.NewQModelIndex() 111 } 112 113 item := NewCustomTreeItemFromPointer(index.InternalPointer()) 114 parentItem := item._parentItem 115 116 if parentItem.Pointer() == m.rootItem.Pointer() { 117 return core.NewQModelIndex() 118 } 119 120 return m.CreateIndex(parentItem.row(), 0, parentItem.Pointer()) 121 } 122 123 func (m *TreeModel) headerData(section int, orientation core.Qt__Orientation, role int) *core.QVariant { 124 return _headerData(section, orientation, role, m.headers) 125 } 126 127 func (m *TreeModel) rowCount(parent *core.QModelIndex) int { 128 if !parent.IsValid() { 129 return len(m.rootItem._childItems) 130 } 131 return len(NewCustomTreeItemFromPointer(parent.InternalPointer())._childItems) 132 } 133 134 func (m *TreeModel) data(index *core.QModelIndex, role int) *core.QVariant { 135 acces, ok := m.dataAt(index) 136 if !ok { 137 return core.NewQVariant() 138 } 139 return _data(index, role, m.headers, acces) 140 } 141 142 func (m *TreeModel) SetData(data []rd.ItemChilds) { 143 m.BeginResetModel() 144 m.rootItem = initItems(data) 145 m.EndResetModel() 146 } 147 148 func (m *TreeModel) GetData() []rd.ItemChilds { 149 out := make([]rd.ItemChilds, len(m.rootItem._childItems)) 150 for index, modelItem := range m.rootItem._childItems { 151 item := rd.ItemChilds{Item: modelItem._itemData} 152 for _, child := range modelItem._childItems { 153 item.Childs = append(item.Childs, child._itemData) 154 } 155 out[index] = item 156 } 157 return out 158 } 159 160 func (m *TreeModel) dataAt(index *core.QModelIndex) (rd.Item, bool) { 161 if !index.IsValid() { 162 return rd.Item{}, false 163 } 164 qitem := NewCustomTreeItemFromPointer(index.InternalPointer()) 165 return qitem._itemData, true 166 } 167 168 func (m *TreeModel) remove(_ int) { 169 panic("Un arbre n'implémente pas de suppression !") 170 }