From ee7a266e9d5dd9722858b2878a350269e7b453be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20R=C3=A9aux?= Date: Fri, 16 Jan 2026 18:13:01 +0100 Subject: [PATCH] add user list and apend --- src/wargame_campaign/controller/controller.py | 27 +- src/wargame_campaign/model/model.py | 13 +- src/wargame_campaign/model/player_service.py | 23 -- .../view/resources/arrow-curve-180-left.png | Bin 0 -> 631 bytes .../view/resources/arrow-curve.png | Bin 0 -> 613 bytes src/wargame_campaign/view/resources/cross.png | Bin 0 -> 544 bytes .../view/resources/disk--pencil.png | Bin 0 -> 677 bytes src/wargame_campaign/view/resources/disk.png | Bin 0 -> 507 bytes .../view/resources/document.png | Bin 0 -> 485 bytes .../view/resources/door--arrow.png | Bin 0 -> 618 bytes .../view/resources/folder.png | Bin 0 -> 476 bytes .../view/resources/notebook--arrow.png | Bin 0 -> 692 bytes .../view/resources/pencil.png | Bin 0 -> 1529 bytes src/wargame_campaign/view/resources/plus.png | Bin 0 -> 521 bytes .../view/resources/question.png | Bin 0 -> 766 bytes .../view/resources/swords-small.png | Bin 0 -> 345 bytes .../view/resources/swords.png | Bin 0 -> 31151 bytes src/wargame_campaign/view/resources/users.png | Bin 0 -> 870 bytes .../view/resources/wargame_campaign_logo.png | Bin 0 -> 9640 bytes .../view/ui/ui_main_window.py | 132 +++++++++- .../view/ui/ui_main_window.ui | 235 +++++++++++++++++- .../view/ui/ui_player_dialog.py | 50 ++++ .../view/ui/ui_player_dialog.ui | 98 ++++++++ src/wargame_campaign/view/view.py | 22 +- 24 files changed, 562 insertions(+), 38 deletions(-) delete mode 100644 src/wargame_campaign/model/player_service.py create mode 100644 src/wargame_campaign/view/resources/arrow-curve-180-left.png create mode 100644 src/wargame_campaign/view/resources/arrow-curve.png create mode 100644 src/wargame_campaign/view/resources/cross.png create mode 100644 src/wargame_campaign/view/resources/disk--pencil.png create mode 100644 src/wargame_campaign/view/resources/disk.png create mode 100644 src/wargame_campaign/view/resources/document.png create mode 100644 src/wargame_campaign/view/resources/door--arrow.png create mode 100644 src/wargame_campaign/view/resources/folder.png create mode 100644 src/wargame_campaign/view/resources/notebook--arrow.png create mode 100644 src/wargame_campaign/view/resources/pencil.png create mode 100644 src/wargame_campaign/view/resources/plus.png create mode 100644 src/wargame_campaign/view/resources/question.png create mode 100644 src/wargame_campaign/view/resources/swords-small.png create mode 100644 src/wargame_campaign/view/resources/swords.png create mode 100644 src/wargame_campaign/view/resources/users.png create mode 100644 src/wargame_campaign/view/resources/wargame_campaign_logo.png create mode 100644 src/wargame_campaign/view/ui/ui_player_dialog.py create mode 100644 src/wargame_campaign/view/ui/ui_player_dialog.ui diff --git a/src/wargame_campaign/controller/controller.py b/src/wargame_campaign/controller/controller.py index 5f77d49..a9869e5 100644 --- a/src/wargame_campaign/controller/controller.py +++ b/src/wargame_campaign/controller/controller.py @@ -1,15 +1,34 @@ +from PyQt6.QtWidgets import QMessageBox, QDialog + +from wargame_campaign.view.view import PlayerDialog + class Controller: def __init__(self, model, view): self.model = model self.view = view self.__connect() - + self.refresh_players_view() def __connect(self): - # self.view.players_view.btn_add.clicked.connect(self.add_player) + self.view.addPlayerBtn.clicked.connect(self.add_player) pass - def add_player(self): - print(f"test") + def refresh_players_view(self): + players = self.model.get_all_players() + self.view.display_players(players) + def add_player(self): + dialog = PlayerDialog(self.view) + result = dialog.exec() # modal blocking dialog + if result == QDialog.DialogCode.Accepted: + name = dialog.get_player_name() + if not name: + QMessageBox.warning( + self.view, + "Invalid name", + "Player name cannot be empty." + ) + return + self.model.add_player(name) + self.refresh_players_view() \ No newline at end of file diff --git a/src/wargame_campaign/model/model.py b/src/wargame_campaign/model/model.py index 2065b9e..494f432 100644 --- a/src/wargame_campaign/model/model.py +++ b/src/wargame_campaign/model/model.py @@ -9,6 +9,7 @@ class Model: self.players = {} data_file_path = Path("data/warmachron.json") self.load_data(data_file_path) + self.save_data(data_file_path) def load_data(self, data_file_path): if not data_file_path.exists() or data_file_path.stat().st_size == 0: @@ -17,10 +18,10 @@ class Model: with open(data_file_path, "r", encoding="utf-8") as f: data = json.load(f) for player in data["players"] : - print(f"player {player}") saved_player = Player.fromDict(player["id"], player['name']) self.players[saved_player.id] = saved_player for war in data["wars"]: + # placeholder pass except json.JSONDecodeError: raise RuntimeError("Data file is corrupted") @@ -28,13 +29,12 @@ class Model: def save_data(self, data_file_path): if data_file_path.exists(): shutil.copy(data_file_path, data_file_path.with_suffix(".json.bak")) - data = {} - data['verion'] = "1.0" + data['version'] = "1.0" data['players'] = [] - for player in self.players: + data['wars'] = [] + for player in self.players.values(): data['players'].append(player.toDict()) - with open(data_file_path, "w", encoding="utf-8") as f: json.dump(data, f, indent=2) @@ -53,3 +53,6 @@ class Model: def delete_player(self, id): del self.players[id] + def get_all_players(self) -> list[Player]: + return list(self.players.values()) + diff --git a/src/wargame_campaign/model/player_service.py b/src/wargame_campaign/model/player_service.py deleted file mode 100644 index c81f52e..0000000 --- a/src/wargame_campaign/model/player_service.py +++ /dev/null @@ -1,23 +0,0 @@ -from models.player import create_player -from model.repository import save_data - -def generate_player_id(players): - return f"P{len(players) + 1}" - -def add_player(data, name): - players = data["players"] - - if any(p["name"].lower() == name.lower() for p in players.values()): - raise ValueError("Player already exists") - - player_id = generate_player_id(players) - players[player_id] = create_player(player_id, name) - save_data(data) - -def update_player(data, player_id, new_name): - data["players"][player_id]["name"] = new_name - save_data(data) - -def delete_player(data, player_id): - del data["players"][player_id] - save_data(data) \ No newline at end of file diff --git a/src/wargame_campaign/view/resources/arrow-curve-180-left.png b/src/wargame_campaign/view/resources/arrow-curve-180-left.png new file mode 100644 index 0000000000000000000000000000000000000000..2a361a0789d620a5f75f126091536fa83d15bf3e GIT binary patch literal 631 zcmV--0*L*IP)*_ z{hQg@@oj!eMM0zo2R>%^%{T9T@0%GSgn;7=3643Gsi!r_WV4{@I;fcpD5`2<{01t! zpAy_o=a4Lt1XvXHk#Igp@Jl)&te7!-^cw}iKeT|G8Kw4}Yh^R75PBZ)IR1MJgT2C{ zQDi^3J!Lu$2O5THcx{v#ae$~JZxQF!qY235lU0ilV$a?+&8;mDbY1ErJ)8jqgi%ae z9p9~QA2d2nIL{e-fgbpM1vCikhclPVjg24ujJ`kYALYA22p;-CDbtdKpDGr$B8$nr zc8jGZK1)rNbJbgW%PYH;E0@QOcAEmIGIV5sZ;61etbmu%p_k2pqvxPWbcq-81(b7^ z`N0}`v`@;jZvjbJcv;mEilrQthxuNg_no6e)K?Bl&!m8b%3%kdoT^D_njg z6CkOaZLSvfKCOJIoVj?xXntI8pf6P<%*9dkl84bk?DXESR{KM|v)kovuf$z9iwa(o zQ6+h-0`lZ_OFBK#zX$C7^D1v{{&sBI`DuWY?a zx%3(1V+aFL9?k}D)(zzCh|;+U RV`TsU002ovPDHLkV1oAS7YqOZ literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/arrow-curve.png b/src/wargame_campaign/view/resources/arrow-curve.png new file mode 100644 index 0000000000000000000000000000000000000000..56776f5fdb4bc1632aebe0758b09c6e105459459 GIT binary patch literal 613 zcmV-r0-F7aP)@rabhG{AgZJRfn%c+wP zau<(BNgTUz6anjWAPPg!cdO9$eK0Lcx{gA(W%r+3;7J0VAOKmlG=9{H8Jj|q@vRnq zPe4(}K!^!+i-^3uJr_a|)oKi`TsZDLcv79}iSPCk3tri2%<8bNx3FqO$M@2&H>o1jPDB{giC-YaGQQOAbQokKR!wj0qxV0>?^R00eOg?O4FEgBh4# zC@n*P5n1$LDo~hw!OkBq@rB^Di6NYV+Q-N+uhh+}8385ITGsjB_{2;``bx zG^)4R``JH6`71{H7&pmR=Unbpx?|+E)gk!yp~4sMJnJpXjx|6e7!za63Iw&MeEI%6 zxu6IpzY#gU-V6GdJraFLdW8KD7XOjZY$wB6x00000NkvXXu0mjf2YnK8 literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/cross.png b/src/wargame_campaign/view/resources/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9fa6dd36ee8165272a13dd263f573507c78ca6 GIT binary patch literal 544 zcmV+*0^j|KP)L-ku(! z6_?D-?!0+#=VtbVZQGdTnZt~apI_HPK#=zVadHM((E`e*C+RoFb)Qo8-U{Lb7{`Tz zw4B8FZ|o?Wox+p=1wp47C;7ar*Xu~;a?<=sjPv>+otDjJ6FaGt!YnNyxQQhp)G1V! zk;r6ZtyV)c8pTbiRAnHRNXTxti%=+p$4aG2*+mMM&xrdiU^`VPk^N*+HX98^7!HT% zwA%;A{T)GxeQ|RcxyzV%! z$AbYD+)i1R64zB?q}NmTz}5|04~J#YG_goA*Eq(QJvp7pG14hUj1pZ^t>3S*xqHUO ze~r;}zTY_XkZ*}d@gm!;N90h8nBQenBUZ_ukZKNicn*hc_Pmc!Jn|2=s<~}>!Sb>Qm3!QP46b_JFw5YU70Tu$X}=T}ez@@t%j iG9vD)nDux55?}x$+|UyQVK_bj0000>tPvNZcrb?u3Y-g%(87__cCVTj7qmf!` zOfVW_O*6@4W}ff9n2>0(cpnF5-rRHUx%a)X1m!RQ3n+e``;IlkFfceacCbH@IFkjg zE5EmobGSI(ttn8cY@RFa8VsKIdtMI>ZA5@O;JA{!x6CNae;}WYvPdMtR8?jEwnMX{ zfKOpCNmtS|4LW1op|NV=A75ffy}XQpyeL=y zG${+~CNsbxlXZ=|Xs%qyCGqi9SdhmjV(92OjZGbgMVrJSu4FL@w8k92UgB-EQYCn4$&6 zgqXT;5Rb>fPpctt(SHXh0w3N2i|q^l{7dU z4v|dH6pYC&0(56M&nk{_irqz)rEY~ox1W5?h00000 LNkvXXu0mjfyNN4+ literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/disk.png b/src/wargame_campaign/view/resources/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..c6194618205d9cd720a3655d12f9f1212e3ee582 GIT binary patch literal 507 zcmVJNRCwB?lfO&DP!Pv2FE5e~MV;&v z#8O>d>Y|Xp!@)ti=;Gj{;NalkR7D&_5C?H_c5^D~D4m3&?IfiRqJ`F4UXz@6uW3zD z+lqn9%a8kh-uLbj0}i< zehi9-nHuaaon*BGgn(C}lmd^+@qNE9z%)(ZT+)dUp!XC(5P%|atJUfYuqZf}bRz1& z^gK@kngakR1aL0tObrN7TQ=FcBJv=Buq<6B=|Vv0fFHhB6pT#ReF2=K0UZa?5{eg3 zL(M)Gi$zL+uM+b4JpA@y8HUllc3qdY?JYsF10K=*TJqZ@EUNqVpahQNK)GDjO(dO+ zI*{x@N(uFP6LQ&mEu34O>RRS^eAu=f_P}ogeDL%pg2uy1jfR3mBB7J{T8|FR9sqv_ zq_gx?uJIh6v3R(*d3^O!d95miI++8p9i3-UfWnVBYq>KH#aI&3=}DN)L+MW4GPHX1#{hY6Z*XlIQn!yMyO$QFmhiDnfBG1feB9&nzoVIt(F1ubl_6>u)cv`-nSF4A3b+l2|eZ{y-eZVLP^M!-wb14jF{m3^ITs2xY>rXg9Th8+i-a zk%!PFs3`>OEl3HF+*Aay_5hh$$N&x*lt3(;!xI3m0oP%lPa(v@_3+37_B@{f$xcDo zLJ*v=Kp9}G${>PknX#}KkKv+PJ?erkfzZ0Ku%1pq4*PxZM^u84L{q4% z2o(}UL5G-&w+^d#sURr5NJ0x~w>@;|59k_wLMUDo51!J4MHG9BZqmV^MZ74HTPVcr zI6J#D?@sUYI-@h|f-gKg@ALJ0e$O-WDsOK>9!0^dP$o`4>p_6&$Y4Qu5l(Y#qGYC0 zDP*%*WHK43stVut(Q38ex~|9x@M(EIfyUbHV}lYal?rmX92$+r30*7}5znWia^Z-i z9Yzhq=&C6m&nIC#hR8XGuIsXZ=*G2WSu)N$7%<^W0MOjjsZ+==0eA<1A47~1sq5il z1G&6fttOXAasR{)IB+and`>0NdH0`@;==qGCF()|l-L&CNvDKfdwK^0 zedlDH@^^-x$h+5UCINUjAaxEx1_M0?t_)o`T4HtN)x|&8#wS~@yX4gCNdPK{Mu_ZA z|GsfGFN(|Io|d{Yh%fPTe+hf~WlUK##HH&`EGHeOf1><0Wg^DGJ+^3z0C`_ z|L``d7Et$r^FaRF9x!_My1BaWwaniC25$8Nh4f(|%}T|#ZA;pQ{}T((=433LPGjF{ zIz2Ow^Iv8^t}CkgQV|XFLeAVfiw}>ci>9V&@-dN)#_&8({tv|PL3PZr_5Lkh`|(Dt z|C(naCnuzD$HC_F7nM`rvU+2v;CLI${QKex+5ZI?0LsyDb6>~C9{>OV07*qoM6N<$ Eg0j^e0{{R3 literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/folder.png b/src/wargame_campaign/view/resources/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..ada85c48b88023b7416ea6141dd8bab7c828f21c GIT binary patch literal 476 zcmV<20VDp2P)eZvkMwh38t{} zfrW*Y_yZQUenT3?Cinv)B7&vZSXwJ6Sl9@DK@bEjl%NC^3n376jho$hc<*jr#N8wV zmpi+2&zW=2%sAx(#KQrKl%_G-s9NBJC$6>0A4)UJrORz-Js2t_%13K^?avMY4FMIw zM$tgL<9Q&A=n!brB`~zR9iqSy0)*)jn63h8M<4(Z5JsjdV6f3@2)<824}ml~f>y&k zaG5}|>-HakA_Xd2fj6GR`(q^`0G7ziTfqdaAP-dBLRttqzPG1JJYU&0C8{s7e|-uf zn2Z(-_5NM2V}5Y~jWBGhfU9&bfg%r7hIx|iSkj^&1R$JDF_GnFD9{p0CGGq)n;iw> z{%3FT<#Pjhr4r%)FC%^z%g%kdo SOD@0w00008A|kZ)A{NtA4&p(SfKW*VX$=K0MPs7U zYz|85$I|R>cK3DO+szk59T@h_zBlv#&F(zu^2`jlNs@G)9%203UOSGHcWfJsF>GYB z@bLvVdPbIJXXkC&G*?!Du`xKbSKrUBu3|Bhxxux_Kk;`*#>XM^YMx8Xam1QvVAX0c zO%sM;K-YC>nuc^TIZyj1DR-!j}bVUm1zc zEq<8hgXjBIE~7gX5-r60T-7Qkh$=!o|NJMWE{tO1H}J>Pdiw)7b#dhAvnSbUUw(NR zu|xt&PmiylR>c8+ql&8gJq`wd^y4?Kv}fkjBr*#x-b=E4pT`RM{sW0bl6khhw#GA^AbQCo%D}*BSy4j&xz4b{XV0*$V$RH^?@_4k a2rvLst)kJfr#LkL0000dr;GM9FHP`2n^XkM5kHQox9N{Y5I&Uu1Q)cv#6yLl#MgAfktf7CFxoiK2UGq zr01prhj%`vo6l3`L_Kxj1H`f0M4jAJ#+>Iib|z|m^5HNX2n3V?OvwvHFlsOu!Wt@-LPjXW5>BFn3Qn9ls6a8IOJIEx%X45@ zkuKo=U|IGk~k#Ji37=!(*_4=AB-vySm?)u;~Qkz?Js9|y+deGaxgEP z|6hI4S>j`02P5)+!6jF*aOyBqFEdrGw2d&%;Z+=;3`JnT>%tEa&C}Vz^GSS7ARHf&GYaTLs<=_NNSIhgtXgWz%L7 zwW=(73{$DilodtIWkW8Z89NZouLG7}hU?TXGYIr$gN@FNW?9!^!Cu8SuJZ!R!8s7p{SuT-d=v4K(%F@os1Qavz(M7VncLRk=4T}n9 z>^#!(b&dY}&=|WV;(TJ#rci5RNn@v}>p+sO_+Z48?y|DJ8-^Q!CNX+RY+i)<{9E9m ztNH)jef-QGdHQkOy|TzwR&noi)3)UWhm0NVn}58pQ>DvMwgTJ#=eqcu6K_{%p7E&9c3w@n+IYNV|?(r@ky|ue*=7ZAu>RW|>h3*4ybT;pv`K0IEj@WhQR^6O!ha=0M zbVt|K-O@W7DMgwMTCgBFVOtr>b*)}*xio!6n@5qGAbeL?o3QL@Z)559yt!=?4{YM1 zx`q7-Ytr&V@s_wrclMaZ^3^{rxp#e0>W1Feo73CZoLQM~9d|jiqoyYG@7VnOtra_7 zLwZ}Vy=RY2n0ku7k+OQmrz;9ir=+$RmD~Ki*RZTKY&n@|NZ0)FNt?U1IjU)W!>H_Uob*rTty zsxMD;*JgcIel513Epkq`<>>rz<1=eNs5?@8JQ41EWyEOUT72}!oP!Jh(gB+#i#kXw GUiBZ;`8Zkt literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/plus.png b/src/wargame_campaign/view/resources/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac1bafbcc6fc7a894a0e7c0a4d58730818477d9 GIT binary patch literal 521 zcmV+k0`~ohP)z{ZCNSP1$Af}nyR+9m-Ti&ToBV4+6k{;p` z-#5Fbj4}9+4e`g_TS0rVQ;aAyIMiRYV6an&AAiA|cmmL#xdS`}j5=9@fxErFguYvkV#=u%aQalROG7#VQWzx$Phm_MZMF~H~fq)W*mE?vYY>(1{m_}{NJt!C_ zL^KkSAP5A2*=d$#1~-wc!J0GuQV>NEwAKOuG=J5$$ajYN`rZ24hRd4y#MIOE>e8y4 z-*+4bH@DY026RFk$JT{_th*mwc%CQnlNd%zakW}aS^WUC&Mr?&`eqmATwT$4dU$M= zg33zh1Mnls_s7^~Hj|Mg>w%+|q3~xDbGJYqX(2Y25SEeam?G)iJ4iAVne6SOec!%)^9H%D3;(ku{)oQ@Kmvdu(l^uw2qma-j-sQQ zw@NV$u1gc$-#{F?5x}#FJ%PX0pxPkaJ$t&NI~r+j)qGwbE3j1BH5R^QFMa;9He_1% zQ=0eoKm|2&D5yNVm5BEdhiDs_ENs+cf#|VNAkrBMk5A48ck(9GM5+RASXIQ~p}~`V z1-+>0dI2V$#1EAAU?dG|Ia#}QxvOvd&DUY8?95PiM&ME6BzjMUy90#*V&B zaZDyNJSBEi1{T}3EG-%dbu-R>1+Ih7x3_7ndcLs##j*DWCk*uFphaDW^im#DDIG*f zgkZ3-m2qg=v%Oy+xI+{`bsPsUc0ezbz_iNHA5-A=^+rf7oABzL34-JWcIdW^RmQ3J zfMA3%M%FF{y;uf95Fk;4M|Y0!@Z%R7AbGX@>Ijk$c=wMAfKf}T7nx7$`D`pv|F5uv?mBr;W zt6?dk<9%SKF2WcYO}Xrw>4WY*I&- wVvBNdO@Q@6twQ?84W?HS3|1KBl0O0r0Hc5`CJFBOhyVZp07*qoM6N<$f}U|+z5oCK literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/swords-small.png b/src/wargame_campaign/view/resources/swords-small.png new file mode 100644 index 0000000000000000000000000000000000000000..d76343b7475c537c086f96323065cf5601652533 GIT binary patch literal 345 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 HanSz(OTNm7 literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/users.png b/src/wargame_campaign/view/resources/users.png new file mode 100644 index 0000000000000000000000000000000000000000..a6aae0404b7313fec54b1c279092a83e25ccae18 GIT binary patch literal 870 zcmV-s1DX7ZP)z8AVPO#zQWo{c3Jan?K~X_re+q=6pZ)7+fBI2GP>~cBS`z2F+n4O9Z}$2}pv8inwC0c6C}x%bhWWuAL3e6@2ld?`Ig$$l)LG&jCYI z#PKr(S0EB8%rRSpO?&njwRp@A2O~5J%jyalPcqsW$5RB6nGnR@)2CrD8lke@wV3Cy zh2_Vz0)Z~6X8yT`*4F**x;o1{k4K((=Z(b^h)Oyglz1G1C?c+Hi$^0{er;Z$-T8Ot z&py))y{9^?E~gbkpKaEzL*B4aM09L;81{+^XqLqqN)~E_thesv4qKEA+`8#)+P|bxs9208Y<(i`t--~lA>VF z#1Bh_vkK4qZqirXH6L?B$wxCKCQKFQf+w{HK?#R^b!NyYW~xgn-A(L5h45@3^)fvA zO*+xz)Yr6Br4$#Y+p2AaTiOer<^&SqJi(4E{lb53x{N`62OgP@K&2$WeYmkcmL|4W zuLt~ecXvg>YKM6$k-*uGqqsfgLFuYulgnIQYoNL{-vX23k~yHw{iee^gYqnCY;Hj$ z8WZo2w7wtrNs~!-CbBF;vl`S?MyfWKxoK2sBYbz?3UK0ngCx`(>vZp185t_JOESh4 z3xfHTp{o!3JxR_NYZ>+q3~ummqiIzSMK#cLHV328Cxkz6=S=7N^6sW8>sm{Gp5*gQ z(zoWJWsS(z1bD4Kfv>HBD3|Lc3|gOk^n4W7(Fi8j~T&Gp$#cK$6bZqsVPAen@bsEQsxyf5hN w=tUZt1dU8Awm|+2g$4hIto?EM$6o>r001#WaFpb2r~m)}07*qoM6N<$f&n$2*#H0l literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/wargame_campaign_logo.png b/src/wargame_campaign/view/resources/wargame_campaign_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ac134e651650cceed2118bb9407eea097aefd9 GIT binary patch literal 9640 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 literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/ui/ui_main_window.py b/src/wargame_campaign/view/ui/ui_main_window.py index f72092b..1b2a884 100644 --- a/src/wargame_campaign/view/ui/ui_main_window.py +++ b/src/wargame_campaign/view/ui/ui_main_window.py @@ -13,23 +13,151 @@ class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/wargame_campaign_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + MainWindow.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget.setObjectName("centralwidget") + self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget) + self.tabWidget.setGeometry(QtCore.QRect(16, 9, 771, 531)) + self.tabWidget.setObjectName("tabWidget") + self.playersTab = QtWidgets.QWidget() + self.playersTab.setObjectName("playersTab") + self.playersTable = QtWidgets.QTableWidget(parent=self.playersTab) + self.playersTable.setGeometry(QtCore.QRect(10, 60, 741, 431)) + self.playersTable.setObjectName("playersTable") + self.playersTable.setColumnCount(2) + self.playersTable.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.playersTable.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.playersTable.setHorizontalHeaderItem(1, item) + self.addPlayerBtn = QtWidgets.QPushButton(parent=self.playersTab) + self.addPlayerBtn.setGeometry(QtCore.QRect(20, 20, 75, 23)) + self.addPlayerBtn.setObjectName("addPlayerBtn") + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/users.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.playersTab, icon1, "") + self.warsTab = QtWidgets.QWidget() + self.warsTab.setObjectName("warsTab") + self.warsTree = QtWidgets.QTreeWidget(parent=self.warsTab) + self.warsTree.setGeometry(QtCore.QRect(10, 60, 211, 431)) + self.warsTree.setObjectName("warsTree") + self.warsTree.headerItem().setText(0, "1") + self.addWarBtn = QtWidgets.QPushButton(parent=self.warsTab) + self.addWarBtn.setGeometry(QtCore.QRect(20, 20, 75, 23)) + self.addWarBtn.setObjectName("addWarBtn") + self.addCampaignBtn = QtWidgets.QPushButton(parent=self.warsTab) + self.addCampaignBtn.setEnabled(False) + self.addCampaignBtn.setGeometry(QtCore.QRect(110, 20, 91, 23)) + self.addCampaignBtn.setObjectName("addCampaignBtn") + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/swords-small.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.warsTab, icon2, "") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) self.menubar.setObjectName("menubar") + self.menuFile = QtWidgets.QMenu(parent=self.menubar) + self.menuFile.setObjectName("menuFile") + self.menuEdit = QtWidgets.QMenu(parent=self.menubar) + self.menuEdit.setObjectName("menuEdit") + self.menuHelp = QtWidgets.QMenu(parent=self.menubar) + self.menuHelp.setObjectName("menuHelp") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) + self.actionNew = QtGui.QAction(parent=MainWindow) + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/document.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionNew.setIcon(icon3) + self.actionNew.setObjectName("actionNew") + self.actionOpen = QtGui.QAction(parent=MainWindow) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/folder.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionOpen.setIcon(icon4) + self.actionOpen.setObjectName("actionOpen") + self.actionSave = QtGui.QAction(parent=MainWindow) + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/disk.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionSave.setIcon(icon5) + self.actionSave.setObjectName("actionSave") + self.actionExit = QtGui.QAction(parent=MainWindow) + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/door--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionExit.setIcon(icon6) + self.actionExit.setObjectName("actionExit") + self.actionUndo = QtGui.QAction(parent=MainWindow) + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/arrow-curve-180-left.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionUndo.setIcon(icon7) + self.actionUndo.setObjectName("actionUndo") + self.actionRedo = QtGui.QAction(parent=MainWindow) + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/arrow-curve.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionRedo.setIcon(icon8) + self.actionRedo.setObjectName("actionRedo") + self.actionAbout = QtGui.QAction(parent=MainWindow) + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/question.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionAbout.setIcon(icon9) + self.actionAbout.setObjectName("actionAbout") + self.actionExport = QtGui.QAction(parent=MainWindow) + self.actionExport.setEnabled(False) + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/notebook--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionExport.setIcon(icon10) + self.actionExport.setObjectName("actionExport") + self.actionSave_as = QtGui.QAction(parent=MainWindow) + icon11 = QtGui.QIcon() + icon11.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/disk--pencil.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionSave_as.setIcon(icon11) + self.actionSave_as.setObjectName("actionSave_as") + self.menuFile.addAction(self.actionNew) + self.menuFile.addAction(self.actionOpen) + self.menuFile.addAction(self.actionSave) + self.menuFile.addAction(self.actionSave_as) + self.menuFile.addSeparator() + self.menuFile.addAction(self.actionExport) + self.menuFile.addSeparator() + self.menuFile.addAction(self.actionExit) + self.menuEdit.addAction(self.actionUndo) + self.menuEdit.addAction(self.actionRedo) + self.menuHelp.addAction(self.actionAbout) + self.menubar.addAction(self.menuFile.menuAction()) + self.menubar.addAction(self.menuEdit.menuAction()) + self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) + MainWindow.setWindowTitle(_translate("MainWindow", "Wargame campaign")) + item = self.playersTable.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Name")) + item = self.playersTable.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "ID")) + self.addPlayerBtn.setText(_translate("MainWindow", "Add player")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.playersTab), _translate("MainWindow", "Players")) + self.addWarBtn.setText(_translate("MainWindow", "Add war")) + self.addCampaignBtn.setText(_translate("MainWindow", "Add Campaign")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.warsTab), _translate("MainWindow", "Wars")) + self.menuFile.setTitle(_translate("MainWindow", "File")) + self.menuEdit.setTitle(_translate("MainWindow", "Edit")) + self.menuHelp.setTitle(_translate("MainWindow", "Help")) + self.actionNew.setText(_translate("MainWindow", "New")) + self.actionNew.setShortcut(_translate("MainWindow", "Ctrl+N")) + self.actionOpen.setText(_translate("MainWindow", "Open")) + self.actionSave.setText(_translate("MainWindow", "Save")) + self.actionExit.setText(_translate("MainWindow", "Exit")) + self.actionUndo.setText(_translate("MainWindow", "Undo")) + self.actionRedo.setText(_translate("MainWindow", "Redo")) + self.actionAbout.setText(_translate("MainWindow", "About")) + self.actionExport.setText(_translate("MainWindow", "Export")) + self.actionSave_as.setText(_translate("MainWindow", "Save as...")) if __name__ == "__main__": diff --git a/src/wargame_campaign/view/ui/ui_main_window.ui b/src/wargame_campaign/view/ui/ui_main_window.ui index 7bff7e1..d68e721 100644 --- a/src/wargame_campaign/view/ui/ui_main_window.ui +++ b/src/wargame_campaign/view/ui/ui_main_window.ui @@ -11,20 +11,249 @@ - MainWindow + Wargame campaign - + + + ../resources/wargame_campaign_logo.png../resources/wargame_campaign_logo.png + + + + + + 16 + 9 + 771 + 531 + + + + 1 + + + + + ../resources/users.png../resources/users.png + + + Players + + + + + 10 + 60 + 741 + 431 + + + + + Name + + + + + ID + + + + + + + 20 + 20 + 75 + 23 + + + + Add player + + + + + + + ../resources/swords-small.png../resources/swords-small.png + + + Wars + + + + + 10 + 60 + 211 + 431 + + + + + 1 + + + + + + + 20 + 20 + 75 + 23 + + + + Add war + + + + + false + + + + 110 + 20 + 91 + 23 + + + + Add Campaign + + + + + 0 0 800 - 21 + 22 + + + File + + + + + + + + + + + + + Edit + + + + + + + Help + + + + + + + + + + ../resources/document.png../resources/document.png + + + New + + + Ctrl+N + + + + + + ../resources/folder.png../resources/folder.png + + + Open + + + + + + ../resources/disk.png../resources/disk.png + + + Save + + + + + + ../resources/door--arrow.png../resources/door--arrow.png + + + Exit + + + + + + ../resources/arrow-curve-180-left.png../resources/arrow-curve-180-left.png + + + Undo + + + + + + ../resources/arrow-curve.png../resources/arrow-curve.png + + + Redo + + + + + + ../resources/question.png../resources/question.png + + + About + + + + + false + + + + ../resources/notebook--arrow.png../resources/notebook--arrow.png + + + Export + + + + + + ../resources/disk--pencil.png../resources/disk--pencil.png + + + Save as... + + diff --git a/src/wargame_campaign/view/ui/ui_player_dialog.py b/src/wargame_campaign/view/ui/ui_player_dialog.py new file mode 100644 index 0000000..5353e22 --- /dev/null +++ b/src/wargame_campaign/view/ui/ui_player_dialog.py @@ -0,0 +1,50 @@ +# Form implementation generated from reading ui file '.\src\wargame_campaign\view\ui\ui_player_dialog.ui' +# +# Created by: PyQt6 UI code generator 6.7.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_playerDialog(object): + def setupUi(self, playerDialog): + playerDialog.setObjectName("playerDialog") + playerDialog.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal) + playerDialog.resize(378, 98) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/wargame_campaign_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + playerDialog.setWindowIcon(icon) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=playerDialog) + self.buttonBox.setGeometry(QtCore.QRect(10, 60, 341, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.label = QtWidgets.QLabel(parent=playerDialog) + self.label.setGeometry(QtCore.QRect(10, 20, 47, 14)) + self.label.setObjectName("label") + self.playerName = QtWidgets.QLineEdit(parent=playerDialog) + self.playerName.setGeometry(QtCore.QRect(60, 20, 113, 20)) + self.playerName.setObjectName("playerName") + + self.retranslateUi(playerDialog) + self.buttonBox.accepted.connect(playerDialog.accept) # type: ignore + self.buttonBox.rejected.connect(playerDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(playerDialog) + + def retranslateUi(self, playerDialog): + _translate = QtCore.QCoreApplication.translate + playerDialog.setWindowTitle(_translate("playerDialog", "Player")) + self.label.setText(_translate("playerDialog", "Name:")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + playerDialog = QtWidgets.QDialog() + ui = Ui_playerDialog() + ui.setupUi(playerDialog) + playerDialog.show() + sys.exit(app.exec()) diff --git a/src/wargame_campaign/view/ui/ui_player_dialog.ui b/src/wargame_campaign/view/ui/ui_player_dialog.ui new file mode 100644 index 0000000..029c92b --- /dev/null +++ b/src/wargame_campaign/view/ui/ui_player_dialog.ui @@ -0,0 +1,98 @@ + + + playerDialog + + + Qt::ApplicationModal + + + + 0 + 0 + 378 + 98 + + + + Player + + + + ../resources/wargame_campaign_logo.png../resources/wargame_campaign_logo.png + + + + + 10 + 60 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 20 + 47 + 14 + + + + Name: + + + + + + 60 + 20 + 113 + 20 + + + + + + + + buttonBox + accepted() + playerDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + playerDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/wargame_campaign/view/view.py b/src/wargame_campaign/view/view.py index cf3c3ac..2898125 100644 --- a/src/wargame_campaign/view/view.py +++ b/src/wargame_campaign/view/view.py @@ -1,9 +1,29 @@ -from PyQt6 import uic, QtWidgets +from PyQt6 import QtWidgets +from PyQt6.QtWidgets import QDialog + from wargame_campaign.view.ui.ui_main_window import Ui_MainWindow +from wargame_campaign.view.ui.ui_player_dialog import Ui_playerDialog class View(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(View, self).__init__(parent) self.setupUi(self) + def display_players(self, players: list): + table = self.playersTable + table.setRowCount(len(players)) + for row, player in enumerate(players): + table.setItem(row, 0, QtWidgets.QTableWidgetItem(player.name)) + table.setItem(row, 1, QtWidgets.QTableWidgetItem(player.id)) + + table.resizeColumnsToContents() + +class PlayerDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.ui = Ui_playerDialog() + self.ui.setupUi(self) + + def get_player_name(self) -> str: + return self.ui.playerName.text().strip()