github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/GUI/onglets/equipiers.go (about) 1 package onglets 2 3 import ( 4 "fmt" 5 6 dm "github.com/benoitkugler/goACVE/server/core/datamodel" 7 8 "github.com/therecipe/qt/core" 9 10 "github.com/benoitkugler/goACVE/client/GUI/fields" 11 12 "github.com/benoitkugler/goACVE/client/GUI/basic" 13 "github.com/benoitkugler/goACVE/client/GUI/common" 14 "github.com/benoitkugler/goACVE/client/GUI/lists" 15 "github.com/benoitkugler/goACVE/client/controllers" 16 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 17 "github.com/therecipe/qt/widgets" 18 ) 19 20 func (e *Equipiers) Render() { 21 e.liste.Model().SetData(e.controller.Liste) 22 e.liste.SetSearch(e.controller.Etat.Recherche) 23 if e.controller.Etat.EquipierCurrent != nil { 24 e.liste.SelectRow(e.controller.Etat.EquipierCurrent) 25 } 26 e.renderSimilaires() 27 28 var op rd.OptionnalId 29 if e.controller.Etat.CritereCamp != nil { 30 op = rd.NewOptionnalId(e.controller.Etat.CritereCamp.Id) 31 } 32 e.camp.Update() 33 e.camp.SetData(op) 34 e.temporaire.SetData(e.controller.Etat.CritereTemporaire) 35 36 e.stats.SetData(e.controller.GetStats()) 37 } 38 39 func (e *Equipiers) renderSimilaires() { 40 var in rd.Personne 41 if id := e.controller.Etat.EquipierCurrent; id != nil { 42 equipier := e.controller.Base.NewEquipier(id.Int64()) 43 in = equipier.GetPersonne().RawData() 44 } 45 e.similaires.SetData(in.BasePersonne, bool(in.IsTemporaire)) 46 e.similaires.SetEnabled(bool(in.IsTemporaire) && e.controller.EditRight) 47 } 48 49 func (Equipiers) ChoixEviteDoublonsDocuments(docs []dm.AccesDocumentPersonne) (toSupp rd.Ids) { 50 return common.ChoixEviteDoublonsDocuments(docs) 51 } 52 53 func (e *Equipiers) ConfirmeSupprimeEquipier(part rd.Personne) bool { 54 msg := fmt.Sprintf("Etes-vous sur de vouloir supprimer l'équipier <b>%s</b>?<br/>", part.NomPrenom()) 55 return basic.Confirmation(msg, "Supprimer", basic.ONDelete) 56 } 57 58 type Equipiers struct { 59 *widgets.QFrame 60 controller *controllers.Equipiers 61 parent *widgets.QTabWidget 62 toolbar *widgets.QToolBar 63 64 liste lists.Table 65 similaires *common.Similaires 66 camp fields.Camp 67 temporaire fields.OptionnalBool 68 stats common.Statistics 69 } 70 71 func newEquipiers(ct *controllers.Equipiers) *Equipiers { 72 p := Equipiers{QFrame: basic.Frame(), controller: ct} 73 p.liste = lists.Table{ 74 Liste: lists.Liste{ 75 Headers: ct.Header, 76 OnClick: func(acces rd.Item, _ int) { 77 ct.Etat.EquipierCurrent = acces.Id 78 p.UpdateToolbar() 79 p.renderSimilaires() 80 }, 81 OnRightClick: func(acces rd.Item, pos *core.QPoint) { 82 eq := ct.Base.NewEquipier(acces.Id.Int64()) 83 accesPers := eq.GetPersonne() 84 if accesPers.RawData().IsTemporaire { 85 return 86 } 87 menu := widgets.NewQMenu(p.liste) 88 ac := menu.AddAction("Aller à la personne") 89 ac.ConnectTriggered(func(_ bool) { 90 ct.Main().Controllers.Personnes.SelectPersonne(accesPers) 91 }) 92 p.liste.ShowContextMenu(menu, pos) 93 }, 94 OnDoubleClick: func(acces rd.Item, _ int) { 95 p.editEquipier(acces) 96 }, 97 OnSearch: func(pattern string) { 98 ct.Etat.Recherche = pattern 99 ct.Reset() 100 }, 101 OnSort: func(field rd.Field, reverse bool) { 102 lists.DefaultSort(p.liste, field, reverse) 103 }, 104 }, 105 } 106 p.liste.Init() 107 p.similaires = common.NewSimilaires(ct.Base, p.controller.IdentifieTmp) 108 p.stats = common.NewStatistics(true) 109 p.camp = fields.NewCamp(true, ct.Base, true) 110 p.camp.ShowTerminated(false) 111 p.camp.ConnectActivated(func(_ int) { 112 ct.Etat.CritereCamp = p.camp.GetData() 113 ct.Reset() 114 }) 115 showTerminated := widgets.NewQCheckBox2("Afficher les camps terminés", nil) 116 showTerminated.ConnectClicked(p.camp.ShowTerminated) 117 118 p.temporaire = fields.NewOptionnalBool(true, "Temporaires", "Référencés") 119 p.temporaire.ConnectCurrentIndexChanged(func(_ int) { 120 ct.Etat.CritereTemporaire = p.temporaire.GetData() 121 ct.Reset() 122 }) 123 124 row := widgets.NewQHBoxLayout() 125 row.AddWidget(basic.Label("Choix du camp"), 1, 0) 126 row.AddWidget(p.camp, 1, 0) 127 row.AddWidget(showTerminated, 1, 0) 128 row.AddStretch(3) 129 row.AddWidget(basic.Label("Statut des participants"), 1, 0) 130 row.AddWidget(p.temporaire, 1, 0) 131 132 lay := widgets.NewQVBoxLayout2(p) 133 lay.AddWidget(p.stats, 0, 0) 134 lay.AddLayout(row, 0) 135 lay.AddWidget(p.liste, 3, 0) 136 lay.AddWidget(p.similaires, 2, 0) 137 return &p 138 } 139 140 func (e *Equipiers) creer() { 141 camp := e.controller.Etat.CritereCamp 142 var id rd.OptionnalId 143 if camp != nil { 144 id = rd.NewOptionnalId(camp.Id) 145 } 146 participant := CreeEquipier(e.controller.Base, id) 147 if participant == nil { 148 return 149 } 150 e.controller.CreateEquipier(*participant) 151 } 152 153 func (e *Equipiers) supprimer() { 154 e.controller.SupprimeEquipier() 155 } 156 157 func (e *Equipiers) exporter() { 158 path := e.controller.ExportEquipiers() 159 if path != "" { 160 basic.ShowFile(path) 161 } 162 } 163 164 func (e *Equipiers) editEquipier(acces rd.Item) { 165 eq := e.controller.Base.NewEquipier(acces.Id.Int64()) 166 if eq.GetPersonne().RawData().IsTemporaire { 167 basic.Confirmation("Cet équipier n'est pas encore référencé."+ 168 " <br/>Veuillez l'<b>identifier</b> pour accéder à ses détails.", "Ok", "") 169 return 170 } 171 modif := EditEquipier(e.controller.Base, e.controller.EditRight, eq.RawData(), 172 rd.NewOptionnalId(eq.RawData().IdPersonne), 173 rd.NewOptionnalId(eq.RawData().IdCamp), 174 ) 175 if modif == nil { 176 return 177 } 178 e.controller.UpdateEquipier(*modif) 179 } 180 181 // CreeEquipier propose la création d'un participant avec un rôle Equipe. 182 // En cas d'annulation, out vaut `nil` 183 func CreeEquipier(base *dm.BaseLocale, idCamp rd.OptionnalId) *rd.Equipier { 184 return EditEquipier(base, true, rd.Equipier{ 185 Roles: rd.RAnimation.AsRoles(), 186 }, rd.OptionnalId{}, idCamp) 187 } 188 189 func EditEquipier(base *dm.BaseLocale, editable bool, participant rd.Equipier, 190 idPersonne rd.OptionnalId, idCamp rd.OptionnalId) *rd.Equipier { 191 d := common.NewFicheEquipier(base, editable) 192 d.ActiveCamp(idCamp.IsNil()) 193 d.SetData(participant, idPersonne, idCamp) 194 dialog := common.NewDetails(&d, editable) 195 if dialog.Exec() == 0 { 196 return nil 197 } 198 part := d.GetData() 199 return &part 200 }