From ee924ef36e8c34d2eea241790423bd6eefec0a82 Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 16:24:20 +0200 Subject: [PATCH 01/12] Added title name to UI window --- ui/window.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/window.py b/ui/window.py index cb9a17e0..0c5b9774 100644 --- a/ui/window.py +++ b/ui/window.py @@ -9,6 +9,7 @@ class Window: def __init__(self): self.tk = Tk() + self.tk.title("DCS Liberation") self.tk.grid_columnconfigure(0, weight=1) self.tk.grid_rowconfigure(0, weight=1) From 2047089b642b364f6ed7fa754d20d4385e7aa1db Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 16:27:42 +0200 Subject: [PATCH 02/12] Added icon to ui windows. --- icon.ico | Bin 0 -> 82726 bytes ui/window.py | 1 + 2 files changed, 1 insertion(+) create mode 100644 icon.ico diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..733e3be98c481ac5710fc8333b5c148bd9850857 GIT binary patch literal 82726 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 K;1u}ZQQ%L83lhEn literal 0 HcmV?d00001 diff --git a/ui/window.py b/ui/window.py index 0c5b9774..e13337b9 100644 --- a/ui/window.py +++ b/ui/window.py @@ -10,6 +10,7 @@ class Window: def __init__(self): self.tk = Tk() self.tk.title("DCS Liberation") + self.tk.iconbitmap("icon.ico") self.tk.grid_columnconfigure(0, weight=1) self.tk.grid_rowconfigure(0, weight=1) From 14cd54668e8f107775508879fbe942d45fc3bd6d Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 18:45:25 +0200 Subject: [PATCH 03/12] Improved style of new game menu --- __init__.py | 1 + resources/ui/terrain_caucasus.png | Bin 0 -> 1202 bytes resources/ui/terrain_nevada.png | Bin 0 -> 1863 bytes resources/ui/terrain_pg.png | Bin 0 -> 1690 bytes ui/corruptedsavemenu.py | 7 +-- ui/newgamemenu.py | 75 ++++++++++++++++++++++++------ ui/styles.py | 31 ++++++++++++ ui/window.py | 9 ++-- 8 files changed, 103 insertions(+), 20 deletions(-) create mode 100644 resources/ui/terrain_caucasus.png create mode 100644 resources/ui/terrain_nevada.png create mode 100644 resources/ui/terrain_pg.png create mode 100644 ui/styles.py diff --git a/__init__.py b/__init__.py index cd71579c..927f9d98 100755 --- a/__init__.py +++ b/__init__.py @@ -65,6 +65,7 @@ try: else: proceed_to_main_menu(game) except Exception as e: + print(e) ui.corruptedsavemenu.CorruptedSaveMenu(w).display() w.run() diff --git a/resources/ui/terrain_caucasus.png b/resources/ui/terrain_caucasus.png new file mode 100644 index 0000000000000000000000000000000000000000..d27ee1ce24d0144ac3f73ff67f8d8cb186c53606 GIT binary patch literal 1202 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 BiRu6V literal 0 HcmV?d00001 diff --git a/resources/ui/terrain_pg.png b/resources/ui/terrain_pg.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ecc4533ed35b0fa2fbbd5002ae89da7261e1b7 GIT binary patch literal 1690 zcmV;L24(q)P)N2bZe?^J zG%heMGBNQWX_Wu~1{X<0K~y+TT~ujP8tE49A2Kyn_ro}`GD*}VS|%=&#F!YBB;KgO z5sA=16QGeDTeb#dr)l;jC??~EB90=8LNJR)&CJ|!*DOlr&L6q2dM6*I>Zw!bIp;i2 zSHJz9hDw6j%GBq&_~wJ;7HxKiJHIQ+?8%q*d$aqh+`c-uuQ>%s0L8NVilu$&;vTxN z$C}%v&TKa&wrUm%C7~PyT$+qyY*!M1<(guO3N8I}2?kvO@wYA9@~zHF)X)-GJ_o+|c~@V{Qh-e+WEFYstc9}F3Nf&O5?I5wbupO$UDQ|O{Z zqiXO}a)LTV^xrePQ0Me!tu%5|9t8j;YfQh95nvW`z2ezT`9O1D=)Nl0)EA=k1wpr7 zIUuvx-p!(uzbNiv|5w#WBHihIh?Cl?>IqhfBGsZWG1T{ZnpZFLUl&E16>e8hX(jOW z9I~E4WJWyfmsE+upj9o31bxcMDYQl$2Es~VkiU2U3DVo;e1AC_;9B&{)2y34o+g>Y z6BQu_oT<=7eCYfHJDXtn2r(VglO9og0KOq4uL^=gA)&^r0KzMLpDcF>iRZUVxSmRs zT%PH=BeY%Sd2b1MGaPt**>3Nn*oj-&WnVoY?;sL5DWjl&tqK>1#!O_u_nBK@Y;jGKGdtfioMXdXr5xKirbBG$nezq5yOEme}H;Vj2yo% zwq9b}@9?xen5Y6am`rROPD0Y^MJ@PMM3fr(bmB1|MqG+>q-`u#9ZA`N&Mw-G!ZXUxRA zuE2J`mC=qW&ir?dt!zX&j@c~-GX0>RDWZOGl`e8Tm!Fagd3bb?bqR4_V3Rsv zBwN@ied;aa`8t*Q5AQm(0j!kgzsmPs;rT$3-m5FDQ2*SZKGEQSmht=`R-^8@Jo4LO z=MB^eXerlwa*sswJ68pP3SkhejLxL|^yVkJ)(q$g&>%(OJbK^#-{0x}n4GG$p4Dl6 zmaR0cRc`1E@W@DKIP6lRvB_Fa0rF9D3HC8mZY%73Ja;vB8$%SYvAR z$DO&N)#)pDu~_(7o1UPXJ@l88m8;3J&zWz(EPZnyBYsNlLHFW+2rO!UxDzLNF9sXH zLkwQj73?@(`d4DOVKsR!EP_+H_fdvhvMT`AV|<9u{p( z?n2dbpYGt#nT~O$bAo9fVcJJw$2bfU+b|4r`&k4SgPoJGa{{!^2F~hW{+4Q>dj1Hy z9L`@$A2s}P@HqVeS^6l;f6~1EYwPh0R literal 0 HcmV?d00001 diff --git a/ui/corruptedsavemenu.py b/ui/corruptedsavemenu.py index 04a85fa0..85264011 100644 --- a/ui/corruptedsavemenu.py +++ b/ui/corruptedsavemenu.py @@ -1,5 +1,6 @@ from tkinter import * from tkinter.ttk import * +from .styles import STYLES from ui.window import * @@ -12,6 +13,6 @@ class CorruptedSaveMenu(Menu): def display(self): self.window.clear_right_pane() - Label(text="Your save game was corrupted!").grid(row=0, column=0) - Label(text="Please restore it by replacing \"liberation_save\" file with \"liberation_save_tmp\" to restore last saved copy.").grid(row=1, column=0) - Label(text="You can find those files under user DCS directory.").grid(row=2, column=0) + Label(text="Your save game was corrupted!", **STYLES["widget"]).grid(row=0, column=0) + Label(text="Please restore it by replacing \"liberation_save\" file with \"liberation_save_tmp\" to restore last saved copy.", **STYLES["widget"]).grid(row=1, column=0) + Label(text="You can find those files under user DCS directory.", **STYLES["widget"]).grid(row=2, column=0) diff --git a/ui/newgamemenu.py b/ui/newgamemenu.py index 23bcfec6..186dc6a8 100644 --- a/ui/newgamemenu.py +++ b/ui/newgamemenu.py @@ -1,7 +1,9 @@ +import os from tkinter import * from tkinter.ttk import * from ui.window import * +from .styles import STYLES class NewGameMenu(Menu): @@ -14,6 +16,7 @@ class NewGameMenu(Menu): def __init__(self, window: Window, callback: typing.Callable): super(NewGameMenu, self).__init__(window, None, None) self.frame = window.right_pane + window.left_pane.configure(background="black") self.callback = callback self.selected_country = IntVar() @@ -57,23 +60,69 @@ class NewGameMenu(Menu): def display(self): self.window.clear_right_pane() - Label(self.frame, text="Player country").grid(row=0, column=0) - Radiobutton(self.frame, text="USA", variable=self.selected_country, value=0).grid(row=1, column=0) - Radiobutton(self.frame, text="Russia", variable=self.selected_country, value=1).grid(row=2, column=0) + # Header + head = Frame(self.frame, **STYLES["header"]) + head.grid(row=0, column=0, sticky=NSEW) + Label(head, text="Start a new game", **STYLES["title"]).grid() - Label(self.frame, text="Terrain").grid(row=0, column=1) - Radiobutton(self.frame, text="Caucasus", variable=self.selected_terrain, value=0).grid(row=1, column=1) - Radiobutton(self.frame, text="Nevada", variable=self.selected_terrain, value=1).grid(row=2, column=1) - Radiobutton(self.frame, text="Persian Gulf", variable=self.selected_terrain, value=2).grid(row=3, column=1) + # Main Frame + body = Frame(self.frame, **STYLES["body"]) + body.grid(row=1, column=0, sticky=NSEW) - Label(self.frame, text="Options").grid(row=1, column=2) - Checkbutton(self.frame, text="SAMs", variable=self.sams).grid(row=1, column=2) - Checkbutton(self.frame, text="Mid game", variable=self.midgame).grid(row=2, column=2) + # Country Selection + country = LabelFrame(body, text="Player Side", **STYLES["label-frame"]) + country.grid(row=0, column=0, sticky=NW, padx=5) + Radiobutton(country, variable=self.selected_country, value=0, **STYLES["radiobutton"]).grid(row=0, column=0, + sticky=W) + Label(country, text="USA", **STYLES["widget"]).grid(row=0, column=1, sticky=W) + Radiobutton(country, variable=self.selected_country, value=1, **STYLES["radiobutton"]).grid(row=1, column=0, + sticky=W) + Label(country, text="Russia", **STYLES["widget"]).grid(row=1, column=1, sticky=W) - Label(self.frame, text="Multiplier").grid(row=0, column=3) - Entry(self.frame, textvariable=self.multiplier).grid(row=1, column=3) + # Terrain Selection + terrain = LabelFrame(body, text="Terrain", **STYLES["label-frame"]) + terrain.grid(row=0, column=1, sticky=N, padx=5) - Button(self.frame, text="Proceed", command=self.proceed).grid(row=5, column=0, columnspan=4) + Radiobutton(terrain, variable=self.selected_terrain, value=0, **STYLES["radiobutton"]) \ + .grid(row=0, column=0, sticky=W) + Label(terrain, text="Caucasus", **STYLES["widget"]).grid(row=0, column=1, sticky=W) + self.create_label_image(terrain, "terrain_caucasus.png").grid(row=0, column=2, padx=5) + + Radiobutton(terrain, variable=self.selected_terrain, value=1, **STYLES["radiobutton"]) \ + .grid(row=1, column=0, sticky=W) + Label(terrain, text="Nevada", **STYLES["widget"]).grid(row=1, column=1, sticky=W) + self.create_label_image(terrain, "terrain_nevada.png").grid(row=1, column=2, padx=5) + + Radiobutton(terrain, variable=self.selected_terrain, value=2, **STYLES["radiobutton"]) \ + .grid(row=2, column=0, sticky=W) + Label(terrain, text="Persian Gulf", **STYLES["widget"]).grid(row=2, column=1, sticky=W) + self.create_label_image(terrain, "terrain_pg.png").grid(row=2, column=2, padx=5) + + # Misc Options + options = LabelFrame(body, text="Misc Options", **STYLES["label-frame"]) + options.grid(row=0, column=2, sticky=NE, padx=5) + + Checkbutton(options, variable=self.sams, **STYLES["radiobutton"]).grid(row=0, column=0, sticky=W) + Label(options, text="SAMs", **STYLES["widget"]).grid(row=0, column=1, sticky=W) + + Checkbutton(options, variable=self.midgame, **STYLES["radiobutton"]).grid(row=1, column=0, sticky=W) + Label(options, text="Mid Game", **STYLES["widget"]).grid(row=1, column=1, sticky=W) + + Label(options, text="Multiplier", **STYLES["widget"]).grid(row=2, column=0, sticky=W) + Entry(options, textvariable=self.multiplier).grid(row=2, column=1, sticky=W) + + # Footer with Proceed Button + footer = Frame(self.frame, **STYLES["header"]) + footer.grid(row=2, sticky=N + E + W) + Button(footer, text="Proceed", command=self.proceed, **STYLES["btn-primary"]).grid(row=0, column=0, sticky=SE, + padx=5, pady=5) + + @staticmethod + def create_label_image(parent, image): + im = PhotoImage(file=os.path.join("resources", "ui", image)) + label = Label(parent, image=im) + label.image = im + return label def proceed(self): self.callback(self.player_country_name, diff --git a/ui/styles.py b/ui/styles.py new file mode 100644 index 00000000..92c6ed6e --- /dev/null +++ b/ui/styles.py @@ -0,0 +1,31 @@ +# Style for UI + +# Padding +PADDING_X = 5 +PADDING_Y = 5 + +# Colors +FG_COLOR = "white" +BG_COLOR = "#4E5760" +BTN_COLOR = "#699245" +BG_TITLE_COLOR = "#2D3E50" + +# Fonts +FONT_FAMILY = "Trebuchet MS" +DEFAULT_FONT = (FONT_FAMILY, 8) +BOLD_FONT = (FONT_FAMILY, 10, "bold italic") +TITLE_FONT = (FONT_FAMILY, 16, "bold italic") + +# List of styles +STYLES = {} +STYLES["label-frame"] = {"font": BOLD_FONT, "bg": BG_COLOR, "fg": FG_COLOR} + +STYLES["body"] = {"bg": BG_COLOR, "padx": 35, "pady": 35} + +STYLES["widget"] = {"bg": BG_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT} +STYLES["radiobutton"] = {"bg": BG_COLOR, "fg": "black", "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT, + "activebackground": BG_COLOR, "highlightbackground": BG_COLOR, "selectcolor": "white"} +STYLES["title"] = {"bg": BG_TITLE_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": TITLE_FONT} +STYLES["header"] = {"bg": BG_TITLE_COLOR} + +STYLES["btn-primary"] = {"bg": BTN_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT} diff --git a/ui/window.py b/ui/window.py index e13337b9..b01ef6f4 100644 --- a/ui/window.py +++ b/ui/window.py @@ -1,6 +1,6 @@ from tkinter import * from game.game import * - +from .styles import BG_COLOR class Window: image = None @@ -11,13 +11,14 @@ class Window: self.tk = Tk() self.tk.title("DCS Liberation") self.tk.iconbitmap("icon.ico") + self.tk.resizable(True, True) self.tk.grid_columnconfigure(0, weight=1) self.tk.grid_rowconfigure(0, weight=1) - self.frame = Frame(self.tk) + self.frame = Frame(self.tk, bg=BG_COLOR) self.frame.grid(column=0, row=0, sticky=NSEW) - self.frame.grid_columnconfigure(0, minsize=300) - self.frame.grid_columnconfigure(1, minsize=400) + self.frame.grid_columnconfigure(0) + self.frame.grid_columnconfigure(1) self.frame.grid_columnconfigure(0, weight=0) self.frame.grid_columnconfigure(1, weight=1) From 1b2ad5b41983eccfaf93f1fd9d88ae6031ffd2c5 Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 21:22:00 +0200 Subject: [PATCH 04/12] Improved style of main menu, configuration menu, and base menu --- ui/basemenu.py | 16 +++++----- ui/configurationmenu.py | 39 ++++++++++++++++------- ui/mainmenu.py | 69 +++++++++++++++++++++++++++-------------- ui/newgamemenu.py | 2 +- ui/styles.py | 11 +++++-- ui/window.py | 6 ++-- 6 files changed, 92 insertions(+), 51 deletions(-) diff --git a/ui/basemenu.py b/ui/basemenu.py index 8cc15640..6bc98db0 100644 --- a/ui/basemenu.py +++ b/ui/basemenu.py @@ -1,6 +1,7 @@ from ui.eventmenu import * from game.game import * +from .styles import STYLES class BaseMenu(Menu): @@ -9,7 +10,6 @@ class BaseMenu(Menu): def __init__(self, window: Window, parent, game: Game, cp: ControlPoint): super(BaseMenu, self).__init__(window, parent, game) - self.cp = cp self.base = cp.base self.frame = window.right_pane @@ -26,15 +26,15 @@ class BaseMenu(Menu): existing_units = self.base.total_units_of_type(unit_type) scheduled_units = self.event.units.get(unit_type, 0) - Label(self.frame, text="{}".format(db.unit_type_name(unit_type))).grid(row=row, sticky=W) + Label(self.frame, text="{}".format(db.unit_type_name(unit_type)), **STYLES["widget"]).grid(row=row, sticky=W) - label = Label(self.frame, text="({})".format(existing_units)) + label = Label(self.frame, text="({})".format(existing_units), **STYLES["widget"]) label.grid(column=1, row=row) self.bought_amount_labels[unit_type] = label - Label(self.frame, text="{}m".format(unit_price)).grid(column=2, row=row) - Button(self.frame, text="+", command=self.buy(unit_type)).grid(column=3, row=row) - Button(self.frame, text="-", command=self.sell(unit_type)).grid(column=4, row=row) + Label(self.frame, text="{}m".format(unit_price), **STYLES["widget"]).grid(column=2, row=row, sticky=E) + Button(self.frame, text="+", command=self.buy(unit_type), **STYLES["btn-primary"]).grid(column=3, row=row, padx=(10,0)) + Button(self.frame, text="-", command=self.sell(unit_type), **STYLES["btn-warning"]).grid(column=4, row=row, padx=(10,5)) row += 1 units = { @@ -47,11 +47,11 @@ class BaseMenu(Menu): self.budget_label = Label(self.frame, text="Budget: {}m".format(self.game.budget)) self.budget_label.grid(row=row, sticky=W) - Button(self.frame, text="Back", command=self.dismiss).grid(column=4, row=row) + Button(self.frame, text="Back", command=self.dismiss, **STYLES["btn-primary"]).grid(column=4, row=row) row += 1 for task_type, units in units.items(): - Label(self.frame, text="{}".format(db.task_name(task_type))).grid(row=row, columnspan=5); row += 1 + Label(self.frame, text="{}".format(db.task_name(task_type)), **STYLES["strong"]).grid(row=row, columnspan=5, sticky=NSEW); row += 1 units = list(set(units)) units.sort(key=lambda x: db.PRICES[x]) diff --git a/ui/configurationmenu.py b/ui/configurationmenu.py index 7add0536..a44a5b05 100644 --- a/ui/configurationmenu.py +++ b/ui/configurationmenu.py @@ -1,5 +1,6 @@ from tkinter import * from tkinter.ttk import * +from .styles import STYLES from ui.window import * @@ -34,22 +35,36 @@ class ConfigurationMenu(Menu): def display(self): self.window.clear_right_pane() - Label(self.frame, text="Player coalition skill").grid(row=0, column=0) - Label(self.frame, text="Enemy coalition skill").grid(row=1, column=0) + # Header + head = Frame(self.frame, **STYLES["header"]) + head.grid(row=0, column=0, columnspan=2, sticky=NSEW) + Label(head, text="Configuration", **STYLES["title"]).grid() - OptionMenu(self.frame, self.player_skill_var, "Average", "Good", "High", "Excellent").grid(row=0, column=1) - OptionMenu(self.frame, self.enemy_skill_var, "Average", "Good", "High", "Excellent").grid(row=1, column=1) + # Body + body = Frame(self.frame, **STYLES["body"]) + body.grid(row=1, column=0, sticky=NSEW) - Label(self.frame, text="Aircraft cold start").grid(row=2, column=0) - Label(self.frame, text="Takeoff only for player group").grid(row=3, column=0) - Label(self.frame, text="Disable night missions").grid(row=4, column=0) + Label(body, text="Player coalition skill", **STYLES["widget"]).grid(row=0, column=0, sticky=W) + Label(body, text="Enemy coalition skill", **STYLES["widget"]).grid(row=1, column=0, sticky=W) - Checkbutton(self.frame, variable=self.cold_start_var).grid(row=2, column=1) - Checkbutton(self.frame, variable=self.takeoff_var).grid(row=3, column=1) - Checkbutton(self.frame, variable=self.night_var).grid(row=4, column=1) + p_skill = OptionMenu(body, self.player_skill_var, "Average", "Good", "High", "Excellent") + p_skill.grid(row=0, column=1, sticky=E, pady=5) + p_skill.configure(**STYLES["btn-primary"]) - Button(self.frame, text="Back", command=self.dismiss).grid(row=5, column=0, columnspan=1) - Button(self.frame, text="Cheat +200m", command=self.cheat_money).grid(row=6, column=1) + e_skill = OptionMenu(body, self.enemy_skill_var, "Average", "Good", "High", "Excellent") + e_skill.grid(row=1, column=1, sticky=E) + e_skill.configure(**STYLES["btn-primary"]) + + Label(body, text="Aircraft cold start", **STYLES["widget"]).grid(row=2, column=0, sticky=W) + Label(body, text="Takeoff only for player group", **STYLES["widget"]).grid(row=3, column=0, sticky=W) + Label(body, text="Disable night missions", **STYLES["widget"]).grid(row=4, column=0, sticky=W) + + Checkbutton(body, variable=self.cold_start_var, **STYLES["radiobutton"]).grid(row=2, column=1, sticky=E) + Checkbutton(body, variable=self.takeoff_var, **STYLES["radiobutton"]).grid(row=3, column=1, sticky=E) + Checkbutton(body, variable=self.night_var, **STYLES["radiobutton"]).grid(row=4, column=1, sticky=E) + + Button(body, text="Back", command=self.dismiss, **STYLES["btn-primary"]).grid(row=5, column=1, sticky=E, pady=30) + Button(body, text="Cheat +200m", command=self.cheat_money, **STYLES["btn-danger"]).grid(row=6, column=1) def cheat_money(self): self.game.budget += 200 diff --git a/ui/mainmenu.py b/ui/mainmenu.py index b7aeb2be..63106d20 100644 --- a/ui/mainmenu.py +++ b/ui/mainmenu.py @@ -1,11 +1,13 @@ -import pickle - -from ui.basemenu import * -from ui.overviewcanvas import * -from ui.configurationmenu import * - from game.game import * +from ui.basemenu import * +from ui.configurationmenu import * +from ui.overviewcanvas import * from userdata import persistency +from .styles import STYLES + + +import tkinter as tk +from tkinter import ttk class MainMenu(Menu): @@ -18,45 +20,57 @@ class MainMenu(Menu): self.upd.update() self.frame = self.window.right_pane - self.frame.grid_columnconfigure(0, weight=1) + self.frame.columnconfigure(0, weight=1) + self.frame.rowconfigure(0, weight=1) def display(self): persistency.save_game(self.game) self.window.clear_right_pane() self.upd.update() - row = 1 + row = 0 + + # Header : + header = Frame(self.frame, **STYLES["header"]) + Button(header, text="Configuration", command=self.configuration_menu, **STYLES["btn-primary"]).grid(column=0, row=0, sticky=NE) + Label(header, text="Budget: {}m (+{}m)".format(self.game.budget, self.game.budget_reward_amount), **STYLES["strong"]).grid(column=1, row=0, sticky=NSEW, padx=50) + Button(header, text="Pass turn", command=self.pass_turn, **STYLES["btn-primary"]).grid(column=2, row=0, sticky=NW) + header.grid(column=0, row=0, sticky=N+EW) + + body = LabelFrame(self.frame, **STYLES["body"]) + body.grid(column=0, row=1, sticky=NSEW) def label(text): - nonlocal row - Label(self.frame, text=text).grid(row=row, sticky=NW) + nonlocal row, body + frame = LabelFrame(body, **STYLES["label-frame"]) + frame.grid(row=row, sticky=NSEW, columnspan=2) + Label(frame, text=text, **STYLES["widget"]).grid(row=row, sticky=NS) row += 1 def event_button(event): - nonlocal row - Message(self.frame, text="{}{} at {}".format( + nonlocal row, body + frame = LabelFrame(body, **STYLES["label-frame"]) + frame.grid(row=row, sticky=NSEW) + Message(frame, text="{}{} at {}".format( event.defender_name == self.game.player and "Enemy attacking: " or "", event, event.to_cp, - ), aspect=1600).grid(column=0, row=row, sticky=NW) - Button(self.frame, text=">", command=self.start_event(event)).grid(column=0, row=row, sticky=NE+S); row += 1 + ), aspect=1600, **STYLES["widget"]).grid(column=0, row=0, sticky=NSEW) + Button(body, text=">", command=self.start_event(event), **STYLES["btn-primary"]).grid(column=1, row=row, sticky=E) + row += 1 - def destination_header(text, separator=True): - nonlocal row - if separator: - Separator(self.frame, orient=HORIZONTAL).grid(row=row, sticky=EW); row += 1 - Label(self.frame, text=text).grid(column=0, row=row, sticky=N); row += 1 + def destination_header(text, pady=0): + nonlocal row, body + Label(body, text=text, **STYLES["strong"]).grid(column=0, columnspan=2, row=row, sticky=N+EW, pady=(pady,0)); row += 1 - Button(self.frame, text="Configuration", command=self.configuration_menu).grid(column=0, row=0, sticky=NE) - Button(self.frame, text="Pass turn", command=self.pass_turn).grid(column=0, row=0, sticky=NW) - Label(self.frame, text="Budget: {}m (+{}m)".format(self.game.budget, self.game.budget_reward_amount)).grid(column=0, row=0, sticky=N) - Separator(self.frame, orient='horizontal').grid(row=row, sticky=EW); row += 1 + #Separator(self.frame, orient='horizontal').grid(row=row, sticky=EW); row += 1 events = self.game.events events.sort(key=lambda x: x.from_cp.name) events.sort(key=lambda x: x.informational and 2 or (self.game.is_player_attack(x) and 1 or 0)) destination = None + deliveries = False for event in events: if not event.informational: if self.game.is_player_attack(event): @@ -64,10 +78,13 @@ class MainMenu(Menu): else: new_destination = "Enemy attack" if destination != new_destination: - destination_header(new_destination, destination is not None) + destination_header(new_destination) destination = new_destination if event.informational: + if not deliveries: + deliveries = True + destination_header("Deliveries", 15) label(str(event)) else: event_button(event) @@ -92,3 +109,7 @@ class MainMenu(Menu): self.basemenu = BaseMenu(self.window, self, self.game, cp) self.basemenu.display() + + + + diff --git a/ui/newgamemenu.py b/ui/newgamemenu.py index 186dc6a8..8f34db6d 100644 --- a/ui/newgamemenu.py +++ b/ui/newgamemenu.py @@ -65,7 +65,7 @@ class NewGameMenu(Menu): head.grid(row=0, column=0, sticky=NSEW) Label(head, text="Start a new game", **STYLES["title"]).grid() - # Main Frame + # Body body = Frame(self.frame, **STYLES["body"]) body.grid(row=1, column=0, sticky=NSEW) diff --git a/ui/styles.py b/ui/styles.py index 92c6ed6e..e375ecdf 100644 --- a/ui/styles.py +++ b/ui/styles.py @@ -8,6 +8,8 @@ PADDING_Y = 5 FG_COLOR = "white" BG_COLOR = "#4E5760" BTN_COLOR = "#699245" +YELLOW = "#FDB731" +RED = "#D0232E" BG_TITLE_COLOR = "#2D3E50" # Fonts @@ -19,13 +21,16 @@ TITLE_FONT = (FONT_FAMILY, 16, "bold italic") # List of styles STYLES = {} STYLES["label-frame"] = {"font": BOLD_FONT, "bg": BG_COLOR, "fg": FG_COLOR} +STYLES["frame-wrapper"] = {"bg": BG_COLOR, "relief":"sunken"} -STYLES["body"] = {"bg": BG_COLOR, "padx": 35, "pady": 35} - +STYLES["body"] = {"bg": BG_COLOR, "padx": 25, "pady": 35} +STYLES["strong"] = {"font": BOLD_FONT, "bg": BG_TITLE_COLOR, "fg": FG_COLOR} STYLES["widget"] = {"bg": BG_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT} STYLES["radiobutton"] = {"bg": BG_COLOR, "fg": "black", "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT, "activebackground": BG_COLOR, "highlightbackground": BG_COLOR, "selectcolor": "white"} STYLES["title"] = {"bg": BG_TITLE_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": TITLE_FONT} STYLES["header"] = {"bg": BG_TITLE_COLOR} -STYLES["btn-primary"] = {"bg": BTN_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT} +STYLES["btn-primary"] = {"bg": BTN_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": 2, "font": DEFAULT_FONT} +STYLES["btn-danger"] = {"bg": RED, "fg": FG_COLOR, "padx": PADDING_X, "pady": 2, "font": DEFAULT_FONT} +STYLES["btn-warning"] = {"bg": YELLOW, "fg": FG_COLOR, "padx": PADDING_X, "pady": 2, "font": DEFAULT_FONT} diff --git a/ui/window.py b/ui/window.py index b01ef6f4..a71c83cb 100644 --- a/ui/window.py +++ b/ui/window.py @@ -1,6 +1,6 @@ from tkinter import * from game.game import * -from .styles import BG_COLOR +from .styles import BG_COLOR,BG_TITLE_COLOR class Window: image = None @@ -24,9 +24,9 @@ class Window: self.frame.grid_columnconfigure(1, weight=1) self.frame.grid_rowconfigure(0, weight=1) - self.left_pane = Frame(self.frame) + self.left_pane = Frame(self.frame, bg=BG_TITLE_COLOR) self.left_pane.grid(row=0, column=0, sticky=NSEW) - self.right_pane = Frame(self.frame) + self.right_pane = Frame(self.frame, bg=BG_COLOR) self.right_pane.grid(row=0, column=1, sticky=NSEW) self.tk.focus() From fd54a5f86c76474ef9e5abc85897288d18384748 Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 21:41:16 +0200 Subject: [PATCH 05/12] Display the name of the base in base menu --- ui/basemenu.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/basemenu.py b/ui/basemenu.py index 6bc98db0..2c9f866b 100644 --- a/ui/basemenu.py +++ b/ui/basemenu.py @@ -45,7 +45,13 @@ class BaseMenu(Menu): AirDefence: db.find_unittype(AirDefence, self.game.player), } - self.budget_label = Label(self.frame, text="Budget: {}m".format(self.game.budget)) + # Header + head = Frame(self.frame, **STYLES["header"]) + head.grid(row=row, column=0, columnspan=5, sticky=NSEW, pady=5) + Label(head, text=self.cp.name, **STYLES["title"]).grid() + row += 1 + + self.budget_label = Label(self.frame, text="Budget: {}m".format(self.game.budget), **STYLES["widget"]) self.budget_label.grid(row=row, sticky=W) Button(self.frame, text="Back", command=self.dismiss, **STYLES["btn-primary"]).grid(column=4, row=row) row += 1 From 5eb921948a2d236031aba63dae8669bb6e08b565 Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 21:52:09 +0200 Subject: [PATCH 06/12] Display the units x/x/x value of the base in the base menu. --- ui/basemenu.py | 4 +++- ui/styles.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/basemenu.py b/ui/basemenu.py index 2c9f866b..6a29f84f 100644 --- a/ui/basemenu.py +++ b/ui/basemenu.py @@ -48,7 +48,9 @@ class BaseMenu(Menu): # Header head = Frame(self.frame, **STYLES["header"]) head.grid(row=row, column=0, columnspan=5, sticky=NSEW, pady=5) - Label(head, text=self.cp.name, **STYLES["title"]).grid() + Label(head, text=self.cp.name, **STYLES["title"]).grid(row=0, column=0, sticky=NW+S) + units_title = "{}/{}/{}".format(self.cp.base.total_planes, self.cp.base.total_armor, self.cp.base.total_aa) + Label(head, text=units_title, **STYLES["strong-grey"]).grid(row=0, column=1, sticky=NE+S) row += 1 self.budget_label = Label(self.frame, text="Budget: {}m".format(self.game.budget), **STYLES["widget"]) diff --git a/ui/styles.py b/ui/styles.py index e375ecdf..48e5ebe1 100644 --- a/ui/styles.py +++ b/ui/styles.py @@ -6,6 +6,7 @@ PADDING_Y = 5 # Colors FG_COLOR = "white" +FG_COLOR_LIGHT = "#dddddd" BG_COLOR = "#4E5760" BTN_COLOR = "#699245" YELLOW = "#FDB731" @@ -25,6 +26,7 @@ STYLES["frame-wrapper"] = {"bg": BG_COLOR, "relief":"sunken"} STYLES["body"] = {"bg": BG_COLOR, "padx": 25, "pady": 35} STYLES["strong"] = {"font": BOLD_FONT, "bg": BG_TITLE_COLOR, "fg": FG_COLOR} +STYLES["strong-grey"] = {"font": BOLD_FONT, "bg": BG_TITLE_COLOR, "fg": FG_COLOR_LIGHT} STYLES["widget"] = {"bg": BG_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT} STYLES["radiobutton"] = {"bg": BG_COLOR, "fg": "black", "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT, "activebackground": BG_COLOR, "highlightbackground": BG_COLOR, "selectcolor": "white"} From 86706231e0daf72cfe709b87bef023b17a1bb3ed Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 22:30:12 +0200 Subject: [PATCH 07/12] New style for event/mission menu --- ui/eventmenu.py | 64 +++++++++++++++++++++++++++++++------------------ ui/styles.py | 5 +++- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/ui/eventmenu.py b/ui/eventmenu.py index 9d352d57..26ae3f3d 100644 --- a/ui/eventmenu.py +++ b/ui/eventmenu.py @@ -4,6 +4,7 @@ from ui.eventresultsmenu import * from game import * from game.event import * +from .styles import STYLES UNITTYPES_FOR_EVENTS = { @@ -44,39 +45,46 @@ class EventMenu(Menu): self.window.clear_right_pane() row = 0 + def header(text, style="strong"): + nonlocal row + head = Frame(self.frame, **STYLES["header"]) + head.grid(row=row, column=0, sticky=N+EW, columnspan=5) + Label(head, text=text, **STYLES[style]).grid() + row += 1 + def label(text, _row=None, _column=None, sticky=None): nonlocal row - Label(self.frame, text=text).grid(row=_row and _row or row, column=_column and _column or 0, sticky=sticky) + Label(self.frame, text=text, **STYLES["widget"]).grid(row=_row and _row or row, column=_column and _column or 0, sticky=sticky) if _row is None: row += 1 def scrable_row(unit_type, unit_count): nonlocal row - Label(self.frame, text="{} ({})".format(db.unit_type_name(unit_type), unit_count)).grid(row=row, sticky=W) + Label(self.frame, text="{} ({})".format(db.unit_type_name(unit_type), unit_count), **STYLES["widget"]).grid(row=row, sticky=W) scramble_entry = Entry(self.frame, width=2) - scramble_entry.grid(column=1, row=row, sticky=W) + scramble_entry.grid(column=1, row=row, sticky=E, padx=5) scramble_entry.insert(0, "0") self.aircraft_scramble_entries[unit_type] = scramble_entry - Button(self.frame, text="+", command=self.scramble_half(True, unit_type)).grid(column=2, row=row) + Button(self.frame, text="+", command=self.scramble_half(True, unit_type), **STYLES["btn-primary"]).grid(column=2, row=row) client_entry = Entry(self.frame, width=2) - client_entry.grid(column=3, row=row, sticky=E) + client_entry.grid(column=3, row=row, sticky=E, padx=5) client_entry.insert(0, "0") self.aircraft_client_entries[unit_type] = client_entry - Button(self.frame, text="+", command=self.client_one(unit_type)).grid(column=4, row=row) + Button(self.frame, text="+", command=self.client_one(unit_type), **STYLES["btn-primary"]).grid(column=4, row=row) row += 1 def scramble_armor_row(unit_type, unit_count): nonlocal row - Label(self.frame, text="{} ({})".format(db.unit_type_name(unit_type), unit_count)).grid(row=row, sticky=W) + Label(self.frame, text="{} ({})".format(db.unit_type_name(unit_type), unit_count), **STYLES["widget"]).grid(row=row, sticky=W) scramble_entry = Entry(self.frame, width=2) scramble_entry.insert(0, "0") - scramble_entry.grid(column=1, row=row) + scramble_entry.grid(column=1, row=row, sticky=E, padx=5) self.armor_scramble_entries[unit_type] = scramble_entry - Button(self.frame, text="+", command=self.scramble_half(False, unit_type)).grid(column=2, row=row) + Button(self.frame, text="+", command=self.scramble_half(False, unit_type),**STYLES["btn-primary"]).grid(column=2, row=row) row += 1 @@ -84,21 +92,18 @@ class EventMenu(Menu): if threat_descr: threat_descr = "Approx. {}".format(threat_descr) - Label(self.frame, text="{}. {}".format(self.event, threat_descr)).grid(row=row, column=0, columnspan=5) + # Header + header("Mission Menu", "title") + + # Mission Description + Label(self.frame, text="{}. {}".format(self.event, threat_descr), **STYLES["mission-preview"]).grid(row=row, column=0, columnspan=5, sticky=S+EW, padx=5, pady=5) row += 1 - Button(self.frame, text="Commit", command=self.start).grid(column=3, row=row, sticky=E) - Button(self.frame, text="Back", command=self.dismiss).grid(column=4, row=row, sticky=E) - - awacs_enabled = self.game.budget >= AWACS_BUDGET_COST and NORMAL or DISABLED - Checkbutton(self.frame, text="AWACS ({}m)".format(AWACS_BUDGET_COST), var=self.awacs, state=awacs_enabled).grid(row=row, column=0, sticky=W) - row += 1 - - label("Aircraft") + header("Aircraft :") if self.base.aircraft: - Label(self.frame, text="Amount").grid(row=row, column=1, columnspan=2) - Label(self.frame, text="Client slots").grid(row=row, column=3, columnspan=2) + Label(self.frame, text="Amount", **STYLES["widget"]).grid(row=row, column=1, columnspan=2) + Label(self.frame, text="Client slots", **STYLES["widget"]).grid(row=row, column=3, columnspan=2) row += 1 filter_to = UNITTYPES_FOR_EVENTS[self.event.__class__] @@ -114,16 +119,29 @@ class EventMenu(Menu): if not self.base.total_planes: label("None", sticky=W) - label("Armor") + header("Armor :") + armor_counter = 0 for unit_type, count in self.base.armor.items(): if filter_to and db.unit_task(unit_type) not in filter_to: continue - scramble_armor_row(unit_type, count) + armor_counter += 1 - if not self.base.total_armor: + if not self.base.total_armor or armor_counter == 0: label("None", sticky=W) + header("Support :") + # Options + awacs_enabled = self.game.budget >= AWACS_BUDGET_COST and NORMAL or DISABLED + Checkbutton(self.frame, var=self.awacs, state=awacs_enabled, **STYLES["radiobutton"]).grid(row=row, column=0, sticky=E) + Label(self.frame, text="AWACS ({}m)".format(AWACS_BUDGET_COST), **STYLES["widget"]).grid(row=row, column=3, sticky=W, padx=5, pady=5) + row += 1 + + header("Ready ?") + Button(self.frame, text="Commit", command=self.start, **STYLES["btn-primary"]).grid(column=0, row=row, sticky=E, padx=5, pady=(10,10)) + Button(self.frame, text="Back", command=self.dismiss, **STYLES["btn-warning"]).grid(column=3, row=row, sticky=E, padx=5, pady=(10,10)) + row += 1 + def _scrambled_aircraft_count(self, unit_type: UnitType) -> int: value = self.aircraft_scramble_entries[unit_type].get() if value and int(value) > 0: diff --git a/ui/styles.py b/ui/styles.py index 48e5ebe1..6e7f6a12 100644 --- a/ui/styles.py +++ b/ui/styles.py @@ -9,7 +9,7 @@ FG_COLOR = "white" FG_COLOR_LIGHT = "#dddddd" BG_COLOR = "#4E5760" BTN_COLOR = "#699245" -YELLOW = "#FDB731" +YELLOW = "#BF9A46" RED = "#D0232E" BG_TITLE_COLOR = "#2D3E50" @@ -27,6 +27,9 @@ STYLES["frame-wrapper"] = {"bg": BG_COLOR, "relief":"sunken"} STYLES["body"] = {"bg": BG_COLOR, "padx": 25, "pady": 35} STYLES["strong"] = {"font": BOLD_FONT, "bg": BG_TITLE_COLOR, "fg": FG_COLOR} STYLES["strong-grey"] = {"font": BOLD_FONT, "bg": BG_TITLE_COLOR, "fg": FG_COLOR_LIGHT} + +STYLES["mission-preview"] = {"font": BOLD_FONT, "bg": YELLOW, "fg": FG_COLOR} + STYLES["widget"] = {"bg": BG_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT} STYLES["radiobutton"] = {"bg": BG_COLOR, "fg": "black", "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT, "activebackground": BG_COLOR, "highlightbackground": BG_COLOR, "selectcolor": "white"} From a132cba7ef5ba55485b07dd45b80a2eecc9f746a Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 22:30:33 +0200 Subject: [PATCH 08/12] Changed the color of text on map (easier to read this way for now imo) --- ui/overviewcanvas.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ui/overviewcanvas.py b/ui/overviewcanvas.py index d3ca3ac7..e3522e35 100644 --- a/ui/overviewcanvas.py +++ b/ui/overviewcanvas.py @@ -50,11 +50,12 @@ class OverviewCanvas: title = cp.name font = ("Helvetica", 10) - id = self.canvas.create_text(coords[0]+1, coords[1]+1, text=title, fill='white', font=font) - self.canvas.tag_bind(id, "", self.display(cp)) id = self.canvas.create_text(coords[0], coords[1], text=title, font=font) self.canvas.tag_bind(id, "", self.display(cp)) + id = self.canvas.create_text(coords[0]+1, coords[1]+1, text=title, fill='white', font=font) + self.canvas.tag_bind(id, "", self.display(cp)) + def _player_color(self): return self.game.player == "USA" and "blue" or "red" @@ -116,7 +117,8 @@ class OverviewCanvas: self.create_cp_title((coords[0] + arc_size/4, coords[1] + arc_size/4), cp) units_title = "{}/{}/{}".format(cp.base.total_planes, cp.base.total_armor, cp.base.total_aa) - self.canvas.create_text(coords[0], coords[1] - arc_size / 1.5, text=units_title, font=("Helvetica", 10)) + self.canvas.create_text(coords[0]+1, coords[1] - arc_size / 1.5 +1, text=units_title, font=("Helvetica", 10), fill=color) + self.canvas.create_text(coords[0], coords[1] - arc_size / 1.5, text=units_title, font=("Helvetica", 10), fill="white") def display(self, cp: ControlPoint): def action(_): From d236b8a94dc8d22734fb63c5790a59f4f44e263e Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 22:38:09 +0200 Subject: [PATCH 09/12] UI alignement in base menu --- ui/basemenu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/basemenu.py b/ui/basemenu.py index 6a29f84f..1e2e86f2 100644 --- a/ui/basemenu.py +++ b/ui/basemenu.py @@ -55,7 +55,7 @@ class BaseMenu(Menu): self.budget_label = Label(self.frame, text="Budget: {}m".format(self.game.budget), **STYLES["widget"]) self.budget_label.grid(row=row, sticky=W) - Button(self.frame, text="Back", command=self.dismiss, **STYLES["btn-primary"]).grid(column=4, row=row) + Button(self.frame, text="Back", command=self.dismiss, **STYLES["btn-primary"]).grid(column=4, row=row, padx=(0,15), pady=(0,5)) row += 1 for task_type, units in units.items(): From 834ee30c86f3fb5a2271f29f44e3ccf1de324b66 Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 23:18:49 +0200 Subject: [PATCH 10/12] Style for event result menu --- ui/eventresultsmenu.py | 90 ++++++++++++++++++++++++++++++------------ ui/styles.py | 2 + 2 files changed, 67 insertions(+), 25 deletions(-) diff --git a/ui/eventresultsmenu.py b/ui/eventresultsmenu.py index 7bfe1662..a41e1c98 100644 --- a/ui/eventresultsmenu.py +++ b/ui/eventresultsmenu.py @@ -3,6 +3,7 @@ from ui.window import * from game.game import * from userdata.debriefing import * +from .styles import STYLES class EventResultsMenu(Menu): @@ -13,6 +14,7 @@ class EventResultsMenu(Menu): def __init__(self, window: Window, parent, game: Game, event: Event): super(EventResultsMenu, self).__init__(window, parent, game) self.frame = window.right_pane + self.frame.grid_rowconfigure(0, weight=0) self.event = event self.finished = False @@ -21,46 +23,82 @@ class EventResultsMenu(Menu): def display(self): self.window.clear_right_pane() + row = 0 + + def header(text, style="strong"): + nonlocal row + head = Frame(self.frame, **STYLES["header"]) + head.grid(row=row, column=0, sticky=N + EW, columnspan=2, pady=(0, 10)) + Label(head, text=text, **STYLES[style]).grid() + row += 1 + + def label(text, style="widget"): + nonlocal row + Label(self.frame, text=text, **STYLES[style]).grid(row=row, column=0, sticky=NW, columnspan=2) + row += 1 + if not self.finished: - Label(self.frame, text="Play the mission and save debriefing to").grid(row=0, column=0) - Label(self.frame, text=debriefing_directory_location()).grid(row=1, column=0) - """ - For debugging purposes - """ + header("You are clear for take off !") + + label("In DCS, open and play the mission :") + label("liberation_nextturn", "italic") + label("or") + label("liberation_nextturn_quick", "italic") + header("Then save the debriefing to the folder:") + label(debriefing_directory_location(), "italic") + header("Waiting for results...") + + pg = Progressbar(self.frame, orient="horizontal", length=200, mode="determinate") + pg.grid(row=row, column=0, columnspan=2, sticky=EW, pady=5, padx=5) + pg.start(10) + row += 1 + + Separator(self.frame, orient=HORIZONTAL).grid(row=row, sticky=EW); + row += 1 + + Label(self.frame, text="Cheat operation results: ", **STYLES["strong"]).grid(column=0, row=row, + columnspan=2, sticky=NSEW, + pady=5); + + row += 1 + Button(self.frame, text="full enemy losses", command=self.simulate_result(0, 1), + **STYLES["btn-warning"]).grid(column=0, row=row, padx=5, pady=5) + Button(self.frame, text="full player losses", command=self.simulate_result(1, 0), + **STYLES["btn-warning"]).grid(column=1, row=row, padx=5, pady=5) + row += 1 + Button(self.frame, text="some enemy losses", command=self.simulate_result(0, 0.8), + **STYLES["btn-warning"]).grid(column=0, row=row, padx=5, pady=5) + Button(self.frame, text="some player losses", command=self.simulate_result(0.8, 0), + **STYLES["btn-warning"]).grid(column=1, row=row, padx=5, pady=5) + row += 1 - row = 3 - Separator(self.frame, orient=HORIZONTAL).grid(row=row, sticky=EW); row += 1 - Label(self.frame, text="Cheat operation results: ").grid(row=row); row += 1 - Button(self.frame, text="full enemy losses", command=self.simulate_result(0, 1)).grid(row=row); row += 1 - Button(self.frame, text="full player losses", command=self.simulate_result(1, 0)).grid(row=row); row += 1 - Button(self.frame, text="some enemy losses", command=self.simulate_result(0, 0.8)).grid(row=row); row += 1 - Button(self.frame, text="some player losses", command=self.simulate_result(0.8, 0)).grid(row=row); row += 1 else: row = 0 if self.event.is_successfull(self.debriefing): - Label(self.frame, text="Operation success").grid(row=row, columnspan=1); row += 1 + header("Operation success") else: - Label(self.frame, text="Operation failed").grid(row=row, columnspan=1); row += 1 + header("Operation failed") + + header("Player losses") - Separator(self.frame, orient='horizontal').grid(row=row, columnspan=1, sticky=NE); row += 1 - Label(self.frame, text="Player losses").grid(row=row, columnspan=1); row += 1 for unit_type, count in self.player_losses.items(): - Label(self.frame, text=db.unit_type_name(unit_type)).grid(row=row) - Label(self.frame, text="{}".format(count)).grid(column=1, row=row) + Label(self.frame, text=db.unit_type_name(unit_type), **STYLES["widget"]).grid(row=row) + Label(self.frame, text="{}".format(count), **STYLES["widget"]).grid(column=1, row=row) row += 1 - Separator(self.frame, orient='horizontal').grid(row=row, columnspan=1, sticky=NE); row += 1 - Label(self.frame, text="Enemy losses").grid(columnspan=1, row=row); row += 1 + header("Enemy losses") + for unit_type, count in self.enemy_losses.items(): if count == 0: continue - Label(self.frame, text=db.unit_type_name(unit_type)).grid(row=row) - Label(self.frame, text="{}".format(count)).grid(column=1, row=row) + Label(self.frame, text=db.unit_type_name(unit_type), **STYLES["widget"]).grid(row=row) + Label(self.frame, text="{}".format(count), **STYLES["widget"]).grid(column=1, row=row) row += 1 - Button(self.frame, text="Okay", command=self.dismiss).grid(columnspan=1, row=row); row += 1 + Button(self.frame, text="Okay", command=self.dismiss, **STYLES["btn-primary"]).grid(columnspan=1, row=row); + row += 1 def process_debriefing(self, debriefing: Debriefing): self.debriefing = debriefing @@ -106,8 +144,10 @@ class EventResultsMenu(Menu): alive_player_units = count(player) alive_enemy_units = count(enemy) - destroyed_player_units = db.unitdict_restrict_count(alive_player_units, math.ceil(sum(alive_player_units.values()) * player_factor)) - destroyed_enemy_units = db.unitdict_restrict_count(alive_enemy_units, math.ceil(sum(alive_enemy_units.values()) * enemy_factor)) + destroyed_player_units = db.unitdict_restrict_count(alive_player_units, math.ceil( + sum(alive_player_units.values()) * player_factor)) + destroyed_enemy_units = db.unitdict_restrict_count(alive_enemy_units, math.ceil( + sum(alive_enemy_units.values()) * enemy_factor)) alive_player_units = {k: v - destroyed_player_units.get(k, 0) for k, v in alive_player_units.items()} alive_enemy_units = {k: v - destroyed_enemy_units.get(k, 0) for k, v in alive_enemy_units.items()} diff --git a/ui/styles.py b/ui/styles.py index 6e7f6a12..ee26f472 100644 --- a/ui/styles.py +++ b/ui/styles.py @@ -16,6 +16,7 @@ BG_TITLE_COLOR = "#2D3E50" # Fonts FONT_FAMILY = "Trebuchet MS" DEFAULT_FONT = (FONT_FAMILY, 8) +ITALIC = (FONT_FAMILY, 8, "italic") BOLD_FONT = (FONT_FAMILY, 10, "bold italic") TITLE_FONT = (FONT_FAMILY, 16, "bold italic") @@ -31,6 +32,7 @@ STYLES["strong-grey"] = {"font": BOLD_FONT, "bg": BG_TITLE_COLOR, "fg": FG_COLOR STYLES["mission-preview"] = {"font": BOLD_FONT, "bg": YELLOW, "fg": FG_COLOR} STYLES["widget"] = {"bg": BG_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT} +STYLES["italic"] = {"bg": BG_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": ITALIC} STYLES["radiobutton"] = {"bg": BG_COLOR, "fg": "black", "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT, "activebackground": BG_COLOR, "highlightbackground": BG_COLOR, "selectcolor": "white"} STYLES["title"] = {"bg": BG_TITLE_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": TITLE_FONT} From 1d73affa085b46cc2a8edeefe6be58b72161b616 Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 23:40:10 +0200 Subject: [PATCH 11/12] New style for event result menu --- ui/eventresultsmenu.py | 4 ++-- ui/styles.py | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ui/eventresultsmenu.py b/ui/eventresultsmenu.py index a41e1c98..dd1fb3d9 100644 --- a/ui/eventresultsmenu.py +++ b/ui/eventresultsmenu.py @@ -76,9 +76,9 @@ class EventResultsMenu(Menu): else: row = 0 if self.event.is_successfull(self.debriefing): - header("Operation success") + header("Operation success", "title-green") else: - header("Operation failed") + header("Operation failed", "title-red") header("Player losses") diff --git a/ui/styles.py b/ui/styles.py index ee26f472..10a2d48d 100644 --- a/ui/styles.py +++ b/ui/styles.py @@ -8,7 +8,7 @@ PADDING_Y = 5 FG_COLOR = "white" FG_COLOR_LIGHT = "#dddddd" BG_COLOR = "#4E5760" -BTN_COLOR = "#699245" +GREEN = "#699245" YELLOW = "#BF9A46" RED = "#D0232E" BG_TITLE_COLOR = "#2D3E50" @@ -36,8 +36,10 @@ STYLES["italic"] = {"bg": BG_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": P STYLES["radiobutton"] = {"bg": BG_COLOR, "fg": "black", "padx": PADDING_X, "pady": PADDING_Y, "font": DEFAULT_FONT, "activebackground": BG_COLOR, "highlightbackground": BG_COLOR, "selectcolor": "white"} STYLES["title"] = {"bg": BG_TITLE_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": TITLE_FONT} +STYLES["title-green"] = {"bg": GREEN, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": TITLE_FONT} +STYLES["title-red"] = {"bg": RED, "fg": FG_COLOR, "padx": PADDING_X, "pady": PADDING_Y, "font": TITLE_FONT} STYLES["header"] = {"bg": BG_TITLE_COLOR} -STYLES["btn-primary"] = {"bg": BTN_COLOR, "fg": FG_COLOR, "padx": PADDING_X, "pady": 2, "font": DEFAULT_FONT} +STYLES["btn-primary"] = {"bg": GREEN, "fg": FG_COLOR, "padx": PADDING_X, "pady": 2, "font": DEFAULT_FONT} STYLES["btn-danger"] = {"bg": RED, "fg": FG_COLOR, "padx": PADDING_X, "pady": 2, "font": DEFAULT_FONT} STYLES["btn-warning"] = {"bg": YELLOW, "fg": FG_COLOR, "padx": PADDING_X, "pady": 2, "font": DEFAULT_FONT} From 75d734d6e4982c13e613bd18f1eb842530546acd Mon Sep 17 00:00:00 2001 From: Khopa Date: Thu, 9 Aug 2018 13:08:07 +0200 Subject: [PATCH 12/12] Typo in UI --- ui/eventresultsmenu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/eventresultsmenu.py b/ui/eventresultsmenu.py index dd1fb3d9..16db01d2 100644 --- a/ui/eventresultsmenu.py +++ b/ui/eventresultsmenu.py @@ -39,7 +39,7 @@ class EventResultsMenu(Menu): if not self.finished: - header("You are clear for take off !") + header("You are clear for takeoff !") label("In DCS, open and play the mission :") label("liberation_nextturn", "italic")