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  }