telephant/panemodel.go
2019-09-04 04:27:37 +02:00

135 lines
2.7 KiB
Go

package main
import (
"github.com/therecipe/qt/core"
)
// Model Roles
const (
PaneName = int(core.Qt__UserRole) + 1<<iota
PaneSticky
MsgModel
)
// PaneModel holds a collection of panes
type PaneModel struct {
core.QAbstractListModel
_ func() `constructor:"init"`
_ map[int]*core.QByteArray `property:"roles"`
_ []*Pane `property:"panes"`
_ func(*Pane) `slot:"addPane"`
_ func(row int) `slot:"removePane"`
_ func() `slot:"clear"`
}
// Pane represents a single pane
type Pane struct {
core.QObject
Name string
Sticky bool
Model *MessageModel
}
func (m *PaneModel) init() {
m.SetRoles(map[int]*core.QByteArray{
PaneName: core.NewQByteArray2("panename", -1),
PaneSticky: core.NewQByteArray2("panesticky", -1),
MsgModel: core.NewQByteArray2("msgmodel", -1),
})
m.ConnectData(m.data)
m.ConnectSetData(m.setData)
m.ConnectRowCount(m.rowCount)
m.ConnectColumnCount(m.columnCount)
m.ConnectRoleNames(m.roleNames)
m.ConnectAddPane(m.addPane)
m.ConnectRemovePane(m.removePane)
m.ConnectClear(m.clear)
}
func (m *PaneModel) setData(index *core.QModelIndex, value *core.QVariant, role int) bool {
if !index.IsValid() {
return false
}
// var p = m.Panes()[len(m.Panes())-1-index.Row()]
m.DataChanged(index, index, []int{Editing})
return true
}
func (m *PaneModel) data(index *core.QModelIndex, role int) *core.QVariant {
if !index.IsValid() {
return core.NewQVariant()
}
if index.Row() >= len(m.Panes()) {
return core.NewQVariant()
}
var p = m.Panes()[index.Row()]
switch role {
case PaneName:
{
return core.NewQVariant1(p.Name)
}
case PaneSticky:
{
return core.NewQVariant1(p.Sticky)
}
case MsgModel:
{
return p.Model.ToVariant()
}
default:
{
return core.NewQVariant()
}
}
}
func (m *PaneModel) rowCount(parent *core.QModelIndex) int {
return len(m.Panes())
}
func (m *PaneModel) columnCount(parent *core.QModelIndex) int {
return 1
}
func (m *PaneModel) roleNames() map[int]*core.QByteArray {
return m.Roles()
}
func (m *PaneModel) clear() {
m.BeginResetModel()
m.SetPanes([]*Pane{})
m.EndResetModel()
}
func (m *PaneModel) addPane(p *Pane) {
// add pane before the last pane, which is always the notifications pane
if len(m.Panes()) == 0 {
m.BeginInsertRows(core.NewQModelIndex(), 0, 0)
m.SetPanes(append(m.Panes(), p))
} else {
m.BeginInsertRows(core.NewQModelIndex(), len(m.Panes())-1, len(m.Panes())-1)
m.SetPanes(append(m.Panes()[:len(m.Panes())-1], p, m.Panes()[len(m.Panes())-1]))
}
m.EndInsertRows()
}
func (m *PaneModel) removePane(row int) {
m.BeginRemoveRows(core.NewQModelIndex(), row, row)
m.SetPanes(append(m.Panes()[:row], m.Panes()[row+1:]...))
m.EndRemoveRows()
}
func init() {
PaneModel_QRegisterMetaType()
Pane_QRegisterMetaType()
}