github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/GUI/fields/roles.go (about) 1 package fields 2 3 import ( 4 "strings" 5 6 "github.com/benoitkugler/goACVE/client/GUI/basic" 7 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 8 "github.com/therecipe/qt/widgets" 9 ) 10 11 type Roles struct { 12 *widgets.QPushButton 13 14 values rd.Roles 15 } 16 17 func NewRoles(editable bool) *Roles { 18 m := Roles{QPushButton: widgets.NewQPushButton(nil)} 19 l := widgets.NewQMenu(m) 20 m.SetMenu(l) 21 l.ConnectAboutToShow(func() { 22 m.updateMenu(RoleEquipes) 23 }) 24 m.SetEnabled(editable) 25 return &m 26 } 27 28 func (m Roles) updateText() { 29 chunks := []string{} 30 for _, v := range m.values { 31 chunks = append(chunks, rd.RoleLabels[v]) 32 } 33 m.SetText(strings.Join(chunks, " ; ")) 34 } 35 36 func (m *Roles) removeValue(toRemove rd.Role) { 37 tmp := rd.Roles{} 38 for _, v := range m.values { 39 if v != toRemove { 40 tmp = append(tmp, v) 41 } 42 } 43 m.values = tmp 44 } 45 46 func (m *Roles) updateMenu(choices []Choice) { 47 crible := map[rd.Role]bool{} 48 for _, v := range m.values { 49 crible[v] = true 50 } 51 52 m.Menu().Clear() 53 for _, c := range choices { 54 c := c // closure in loop 55 56 cb := widgets.NewQCheckBox2(c.Label, nil) 57 frame := basic.Frame() 58 lay := widgets.NewQHBoxLayout2(frame) 59 lay.AddWidget(cb, 1, 0) 60 lay.SetContentsMargins(5, 2, 5, 2) 61 62 action := widgets.NewQWidgetAction(m.Menu()) 63 action.SetDefaultWidget(frame) 64 m.Menu().AddActions([]*widgets.QAction{&action.QAction}) 65 66 cb.SetChecked(crible[rd.Role(c.Field)]) 67 cb.ConnectToggled(func(checked bool) { 68 if checked { 69 m.values = append(m.values, rd.Role(c.Field)) 70 } else { 71 m.removeValue(rd.Role(c.Field)) 72 } 73 m.updateText() 74 }) 75 } 76 } 77 78 func (m *Roles) SetData(values rd.Roles) { 79 // update internal storage 80 m.values = values 81 // update label 82 m.updateText() 83 } 84 85 func (m Roles) GetData() rd.Roles { 86 return m.values 87 }