From 14cd54668e8f107775508879fbe942d45fc3bd6d Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 8 Aug 2018 18:45:25 +0200 Subject: [PATCH] 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)