Skip to content

Commit 062113e

Browse files
committed
Time Options and Image Utility
1 parent cff4873 commit 062113e

12 files changed

+228
-78
lines changed

Frames/MinimalScreenBlockerFrame.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from tkinter import ttk, N, E, W
2-
1+
from tkinter import ttk, N, E, W, S
2+
from datetime import datetime
33

44

55
from Infrastructure.ImageUtility import ImageUtility
@@ -21,35 +21,35 @@ def __init__(self, master, controller, time_options_manager, mobber_manager, cou
2121
self.tips_manager = tips_manager
2222
self.build_window_content()
2323
self.mobber_manager.subscribe_to_mobber_list_change(self.mobber_list_change_callback)
24+
if self.settings_manager.get_continue_screen_blocker_show_current_time():
25+
self.countdown_manager.subscribe_to_time_changes(self.update_current_time)
26+
27+
def update_current_time(self, days, minutes, seconds):
28+
self.current_time_label["text"] = datetime.now().strftime('%Y-%m-%d %I:%M %p')
2429

2530
def build_window_content(self):
2631
center_frame = ttk.Frame(self)
2732
center_frame.grid()
28-
# center_frame.grid_columnconfigure(0, weight=0)
29-
# center_frame.grid_columnconfigure(1, weight=0)
30-
# center_frame.grid_columnconfigure(2, weight=0)
31-
# center_frame.grid_columnconfigure(3, weight=0)
32-
# center_frame.grid_columnconfigure(4, weight=1)
33-
# center_frame.grid_columnconfigure(5, weight=1)
34-
# center_frame.grid_columnconfigure(6, weight=0)
35-
# center_frame.grid_columnconfigure(7, weight=0)
36-
# center_frame.grid_columnconfigure(8, weight=0)
37-
# center_frame.grid_columnconfigure(9, weight=0)
3833

3934
row_index = 0
4035

4136

4237
image_utility = ImageUtility(self.theme_manager)
4338

39+
40+
4441
self.invisible_icon = image_utility.load('images\\invisible.png')
4542
self.fade_label = ttk.Label(center_frame, image=self.invisible_icon)
4643
self.fade_label.grid(row=0, column=0, sticky=(N,W))
4744
self.fade_label.bind("<Enter>", lambda event: self.controller.fade_app())
4845
self.fade_label.bind("<Leave>", lambda event: self.controller.unfade_app())
4946

50-
# 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
51-
52-
title = ttk.Label(center_frame, text="Mobbing Timer", font="Helvetica 60 bold italic")
47+
if self.settings_manager.get_general_use_logo_image():
48+
self.image_utility = ImageUtility(self.theme_manager)
49+
self.background_image = self.image_utility.load(self.settings_manager.get_general_logo_image_name(),800,200,self.settings_manager.get_general_auto_theme_logo())
50+
title = ttk.Label(center_frame, image=self.background_image)
51+
else:
52+
title = ttk.Label(center_frame, text="Mobbing Timer", font="Helvetica 60 bold italic")
5353
title.grid(row=row_index, column = 0, columnspan=6 ,padx=150, pady=10)
5454
row_index += 1
5555

@@ -70,7 +70,7 @@ def build_window_content(self):
7070
self.next_mobber_label = ttk.Label(center_frame, text="", font="Helvetica 50")
7171
self.next_mobber_label.grid(row=row_index, column=4, columnspan=1,sticky=(N,W))
7272
row_index += 1
73-
# 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
73+
7474
start_button = ttk.Button(center_frame, text="Continue Mobbing!", style="StartButton.TButton", )
7575
start_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=10, pady=10)
7676
start_button.bind("<Button-1>", lambda event: self.controller.show_transparent_countdown_frame())
@@ -81,6 +81,12 @@ def build_window_content(self):
8181
self.tip_text.grid(row=row_index, column=1, columnspan=4, padx=30, pady=10, sticky=(N))
8282
row_index += 1
8383

84+
if self.settings_manager.get_continue_screen_blocker_show_current_time():
85+
self.current_time_label = ttk.Label(center_frame, text="current time",font="Helvetica 15")
86+
self.current_time_label.grid(row=row_index, column=1, columnspan=4, padx=30, pady=10, sticky=(N))
87+
row_index += 1
88+
89+
8490
start_button = ttk.Button(center_frame, text="Mob Setup & Time")
8591
start_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=90, pady=10)
8692
start_button.bind("<Button-1>", lambda event: self.controller.show_screen_blocker_frame())
@@ -90,16 +96,13 @@ def build_window_content(self):
9096
start_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=90, pady=10)
9197
start_button.bind("<Button-1>", lambda event: self.controller.quit_and_destroy_session())
9298
row_index += 1
93-
94-
# 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
95-
9699
def mobber_list_change_callback(self, mobber_list, driver_index, navigator_index):
97100
self.current_mobber_label['text'] = ""
98101
self.next_mobber_label['text'] = ""
99102
for index in range(0, mobber_list.__len__()):
100103
name = mobber_list[index]
101104
if index == driver_index:
102-
self.current_mobber_label['text'] = "{}".format(name)
105+
self.current_mobber_label['text'] = "{} ".format(name)
103106
if index == navigator_index:
104107
self.next_mobber_label['text'] = "{}".format(name)
105108
if self.settings_manager.get_general_enable_tips():

Frames/MobTimerController.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def __init__(self, *args, **kwargs):
2525
self.settings_manager = SettingsManager()
2626
self.tips_manager = TipsManager()
2727
self.time_options_manager = TimeOptionsManager()
28-
self.mobber_manager = MobberManager()
28+
self.mobber_manager = MobberManager(self.settings_manager.get_randomize_randomize_next_driver())
2929
self.countdown_manager = CountdownManager(self)
3030
self.session_manager = SessionManager(uuid)
3131
atexit.register(self.session_manager.clear_sessions)
@@ -88,7 +88,7 @@ def frame_is_screen_blocking(self):
8888
def show_minimal_screen_blocker_frame(self):
8989
if self.last_frame != MinimalScreenBlockerFrame:
9090
self.launch_blocking_Frame(MinimalScreenBlockerFrame)
91-
self.mobber_manager.switch_navigator_driver()
91+
self.mobber_manager.switch_next_driver()
9292

9393
def quit_and_destroy_session(self):
9494
self.session_manager.clear_sessions()

Frames/ScreenBlockerFrame.py

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import random
12
from tkinter import *
23
from tkinter import ttk
4+
from Infrastructure.ImageUtility import ImageUtility
5+
from PIL import Image
6+
from PIL import ImageTk
37

48
TAGNAME_CURRENT_MOBBER = 'current_mobber'
59

@@ -17,6 +21,9 @@ def __init__(self, master, controller, time_options_manager, mobber_manager, cou
1721
self.time_options_manager = time_options_manager
1822
self.mobber_manager = mobber_manager
1923
self.settings_manager = settings_manager
24+
self.mouse_wheel_seconds_delta = self.settings_manager.get_screen_blocker_mouse_wheel_seconds_delta()
25+
self.click_seconds_delta = self.settings_manager.get_screen_blocker_click_seconds_delta()
26+
2027
self.build_window_content()
2128
self.time_options_manager.subscribe_to_timechange(self.time_change_callback)
2229
self.mobber_manager.subscribe_to_mobber_list_change(self.mobber_list_change_callback)
@@ -52,22 +59,35 @@ def mouse_wheel_minutes(self, event):
5259
self.time_options_manager.decrement_minutes()
5360

5461
def mouse_wheel_seconds(self, event):
62+
5563
if event.delta > 0:
56-
self.time_options_manager.increment_seconds()
64+
self.time_options_manager.increment_seconds(self.mouse_wheel_seconds_delta)
5765
else:
58-
self.time_options_manager.decrement_seconds()
66+
self.time_options_manager.decrement_seconds(self.mouse_wheel_seconds_delta)
5967

6068
def build_window_content(self):
69+
70+
71+
6172
center_frame = ttk.Frame(self)
73+
6274
center_frame.grid(row=0, column=0)
6375
center_frame.grid_columnconfigure(0, weight=1)
6476
center_frame.grid_columnconfigure(1, weight=0)
6577
center_frame.grid_columnconfigure(2, weight=0)
6678
center_frame.grid_columnconfigure(3, weight=0)
6779
center_frame.grid_columnconfigure(4, weight=1)
6880

81+
82+
6983
row_index = 0
70-
title = ttk.Label(center_frame, text="Mobbing Timer", font="Helvetica 60 bold italic")
84+
85+
if self.settings_manager.get_general_use_logo_image():
86+
self.image_utility = ImageUtility(self.theme_manager)
87+
self.background_image = self.image_utility.load(self.settings_manager.get_general_logo_image_name(),800,200,self.settings_manager.get_general_auto_theme_logo())
88+
title = ttk.Label(center_frame, image=self.background_image)
89+
else:
90+
title = ttk.Label(center_frame, text="Mobbing Timer", font="Helvetica 60 bold italic")
7191
title.grid(row=row_index, columnspan=5, padx=30, pady=(70, 10))
7292
row_index += 1
7393

@@ -87,8 +107,10 @@ def build_window_content(self):
87107

88108
self.label_seconds = ttk.Label(center_frame, text="30", font="Helvetica 180 bold")
89109
self.label_seconds.grid(row=row_index, column=3, sticky=W)
90-
self.label_seconds.bind("<Button-1>", lambda event: self.time_options_manager.increment_seconds())
91-
self.label_seconds.bind("<Button-3>", lambda event: self.time_options_manager.decrement_seconds())
110+
self.label_seconds.bind("<Button-1>",
111+
lambda event: self.time_options_manager.increment_seconds(self.click_seconds_delta))
112+
self.label_seconds.bind("<Button-3>",
113+
lambda event: self.time_options_manager.decrement_seconds(self.click_seconds_delta))
92114
self.label_seconds.bind("<MouseWheel>", self.mouse_wheel_seconds)
93115
row_index += 1
94116

@@ -106,7 +128,8 @@ def build_window_content(self):
106128
row_index += 1
107129

108130
self.names_list = ttk.Treeview(center_frame)
109-
self.names_list.tag_configure(TAGNAME_CURRENT_MOBBER, background=self.theme_manager.highlight_color, foreground=self.theme_manager.background_color)
131+
self.names_list.tag_configure(TAGNAME_CURRENT_MOBBER, background=self.theme_manager.highlight_color,
132+
foreground=self.theme_manager.background_color)
110133
self.names_list['show'] = 'tree'
111134
self.names_list.grid(row=row_index, rowspan=7, columnspan=2, column=1, padx=10, pady=button_pad,
112135
sticky=N + E + W + S)
@@ -115,6 +138,7 @@ def build_window_content(self):
115138
remove_mobber_button.grid(row=row_index, column=3, sticky=N + E + W, padx=10, pady=button_pad)
116139
remove_mobber_button.bind("<Button-1>", lambda event: self.mobber_manager.remove_mobber(
117140
int(self.names_list.index(self.names_list.selection()))))
141+
self.controller.bind("<Delete>", self.remove_mobber_if_screen_blocking)
118142
row_index += 1
119143

120144
move_mobber_up_button = ttk.Button(center_frame, text="Move Mobber Up")
@@ -134,12 +158,13 @@ def build_window_content(self):
134158

135159
clear_mobbers_button = ttk.Button(center_frame, text="Skip Driver")
136160
clear_mobbers_button.grid(row=row_index, column=3, sticky=N + E + W, padx=10, pady=button_pad)
137-
clear_mobbers_button.bind("<Button-1>", lambda event: self.mobber_manager.switch_navigator_driver())
161+
clear_mobbers_button.bind("<Button-1>", lambda event: self.mobber_manager.switch_next_driver())
138162
row_index += 1
139163

140-
clear_mobbers_button = ttk.Button(center_frame, text="Rewind Driver")
141-
clear_mobbers_button.grid(row=row_index, column=3, sticky=N + E + W, padx=10, pady=button_pad)
142-
clear_mobbers_button.bind("<Button-1>", lambda event: self.mobber_manager.rewind_driver())
164+
if not self.settings_manager.get_randomize_randomize_next_driver():
165+
clear_mobbers_button = ttk.Button(center_frame, text="Rewind Driver")
166+
clear_mobbers_button.grid(row=row_index, column=3, sticky=N + E + W, padx=10, pady=button_pad)
167+
clear_mobbers_button.bind("<Button-1>", lambda event: self.mobber_manager.rewind_driver())
143168
row_index += 1
144169

145170
clear_mobbers_button = ttk.Button(center_frame, text="Add Team")
@@ -161,9 +186,16 @@ def build_window_content(self):
161186

162187
self.focus_mobber_entry()
163188

164-
def add_default_team(self,event):
189+
def remove_mobber_if_screen_blocking(self,event):
190+
if self.controller.last_frame == ScreenBlockerFrame:
191+
self.mobber_manager.remove_mobber(int(self.names_list.index(self.names_list.selection())))
192+
193+
def add_default_team(self, event):
165194
team = self.settings_manager.get_general_team().split(',')
195+
randomize_team = self.settings_manager.get_randomize_team()
166196
self.mobber_manager.clear()
197+
if randomize_team:
198+
random.shuffle(team)
167199
for member in team:
168200
self.mobber_manager.add_mobber(member)
169201

Infrastructure/ImageUtility.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from PIL import Image
22
from PIL import ImageTk
33

4+
45
class ImageUtility(object):
56
def __init__(self, theme_manager):
67
self.theme_manager = theme_manager
@@ -11,23 +12,24 @@ def hex_to_rgb(value):
1112
lv = len(value)
1213
return tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))
1314

14-
def load(self, image_path, width=50, height=50):
15+
def load(self, image_path, width=50, height=50, normalize_color=True):
1516
background_color = ImageUtility.hex_to_rgb(self.theme_manager.background_color)
1617
highlight_color = ImageUtility.hex_to_rgb(self.theme_manager.highlight_color)
1718
original = Image.open(image_path)
1819
resized = original.resize((width, height), Image.ANTIALIAS)
19-
pixel_access = resized.load()
2020

21-
for y in range(resized.size[1]):
22-
for x in range(resized.size[0]):
23-
pixel = pixel_access[x, y]
24-
if pixel[0] < 50:
25-
pixel_access[x, y] = (background_color[0] + pixel_access[x, y][0],
26-
background_color[1] + pixel_access[x, y][1],
27-
background_color[2] + pixel_access[x, y][2])
28-
elif pixel[0] > 50:
29-
pixel_access[x, y] = (int(highlight_color[0] * pixel_access[x, y][0]/255),
30-
int(highlight_color[1] * pixel_access[x, y][1]/255),
31-
int(highlight_color[2] * pixel_access[x, y][2]/255))
21+
if normalize_color:
22+
pixel_access = resized.load()
23+
for y in range(resized.size[1]):
24+
for x in range(resized.size[0]):
25+
pixel = pixel_access[x, y]
26+
if pixel[0] < 50:
27+
pixel_access[x, y] = (background_color[0] + pixel_access[x, y][0],
28+
background_color[1] + pixel_access[x, y][1],
29+
background_color[2] + pixel_access[x, y][2])
30+
elif pixel[0] > 50:
31+
pixel_access[x, y] = (int(highlight_color[0] * pixel_access[x, y][0] / 255),
32+
int(highlight_color[1] * pixel_access[x, y][1] / 255),
33+
int(highlight_color[2] * pixel_access[x, y][2] / 255))
3234

33-
return ImageTk.PhotoImage(resized)
35+
return ImageTk.PhotoImage(resized)

Infrastructure/MobberManager.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
import random
2+
3+
14
class MobberManager(object):
2-
def __init__(self):
5+
def __init__(self, randomize=False):
36
self.driver_index = 0
4-
self.navigator_index = 1
7+
self.next_driver_index = 1
58
self.mobber_list = []
69
self.mobber_list_change_callbacks = []
10+
self.randomize = randomize
711

812
def mobber_count(self):
913
return self.mobber_list.__len__()
@@ -40,36 +44,43 @@ def subscribe_to_mobber_list_change(self, mobber_list_change_callback):
4044
self.fire_time_change_callbacks()
4145

4246
def fire_time_change_callbacks(self):
43-
self.update_navigator_driver_index()
47+
self.update_next_driver_index()
4448
for mobber_list_change_callback in self.mobber_list_change_callbacks:
4549
if mobber_list_change_callback:
46-
mobber_list_change_callback(self.mobber_list, self.driver_index, self.navigator_index)
50+
mobber_list_change_callback(self.mobber_list, self.driver_index, self.next_driver_index)
4751

4852
def clear(self):
4953
self.mobber_list = []
5054
self.fire_time_change_callbacks()
5155

52-
def switch_navigator_driver(self):
56+
def switch_next_driver(self):
5357
mobber_count = self.mobber_list.__len__()
5458
if mobber_count > 0:
55-
self.driver_index = (self.driver_index + 1) % mobber_count
56-
self.update_navigator_driver_index()
59+
if self.randomize and mobber_count > 2:
60+
self.driver_index = self.next_driver_index
61+
else:
62+
self.driver_index = (self.driver_index + 1) % mobber_count
5763
self.fire_time_change_callbacks()
5864

59-
def update_navigator_driver_index(self):
65+
def update_next_driver_index(self):
6066
mobber_count = self.mobber_list.__len__()
6167
if mobber_count > 0:
62-
self.driver_index = self.driver_index % mobber_count
63-
self.navigator_index = (self.driver_index + 1) % mobber_count
68+
if self.randomize and mobber_count > 2:
69+
self.next_driver_index = int(random.uniform(0, mobber_count))
70+
while self.driver_index == self.next_driver_index:
71+
self.next_driver_index = int(random.uniform(0, mobber_count))
72+
else:
73+
self.driver_index = self.driver_index % mobber_count
74+
self.next_driver_index = (self.driver_index + 1) % mobber_count
6475
else:
6576
self.driver_index = 0
66-
self.navigator_index = 1
77+
self.next_driver_index = 1
6778

6879
def rewind_driver(self):
6980
mobber_count = self.mobber_list.__len__()
7081
if mobber_count > 0:
7182
self.driver_index = (self.driver_index - 1)
7283
if self.driver_index < 0:
7384
self.driver_index = mobber_count - 1
74-
self.update_navigator_driver_index()
75-
self.fire_time_change_callbacks()
85+
self.update_next_driver_index()
86+
self.fire_time_change_callbacks()

0 commit comments

Comments
 (0)