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()