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  }