Skip to content

Commit d22c22f

Browse files
committed
First atempt at mac build. Many issues with a mac deployment
1 parent 19da11b commit d22c22f

File tree

436 files changed

+213
-123
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

436 files changed

+213
-123
lines changed

Frames/MinimalScreenBlockerFrame.py

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from tkinter import ttk, N, E, W, S
21
from datetime import datetime
3-
2+
from tkinter import ttk, N, E, W
43

54
from Infrastructure.ImageUtility import ImageUtility
5+
from Infrastructure.PathUtility import PathUtility
66

77

88
class MinimalScreenBlockerFrame(ttk.Frame):
@@ -33,42 +33,38 @@ def build_window_content(self):
3333

3434
row_index = 0
3535

36-
3736
image_utility = ImageUtility(self.theme_manager)
3837

39-
40-
41-
self.invisible_icon = image_utility.load('images\\invisible.png')
38+
invisible_path = PathUtility.normalize_path('images\\invisible.png')
39+
self.invisible_icon = image_utility.load(invisible_path)
4240
self.fade_label = ttk.Label(center_frame, image=self.invisible_icon)
43-
self.fade_label.grid(row=0, column=0, sticky=(N,W))
41+
self.fade_label.grid(row=0, column=0, sticky=(N, W))
4442
self.fade_label.bind("<Enter>", lambda event: self.controller.fade_app())
4543
self.fade_label.bind("<Leave>", lambda event: self.controller.unfade_app())
4644

4745
if self.settings_manager.get_general_use_logo_image():
4846
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())
47+
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())
5048
title = ttk.Label(center_frame, image=self.background_image)
5149
else:
5250
title = ttk.Label(center_frame, text="Mobbing Timer", font="Helvetica 60 bold italic")
53-
title.grid(row=row_index, column = 0, columnspan=6 ,padx=150, pady=10)
51+
title.grid(row=row_index, column=0, columnspan=6, padx=150, pady=10)
5452
row_index += 1
5553

56-
self.keyboard_icon = image_utility.load('images\\keyboard.png',75,75)
54+
self.keyboard_icon = image_utility.load(PathUtility.normalize_path('images\\keyboard.png'), 75, 75)
5755
self.keyboard_label = ttk.Label(center_frame, image=self.keyboard_icon)
58-
self.keyboard_label.grid(row=row_index, column=1, sticky=(N,E))
56+
self.keyboard_label.grid(row=row_index, column=1, sticky=(N, E))
5957

6058
self.current_mobber_label = ttk.Label(center_frame, text="", font="Helvetica 50 bold italic",
6159
style="Highlight.TLabel")
62-
self.current_mobber_label.grid(row=row_index, column=2, columnspan=1, sticky=(N,W))
63-
60+
self.current_mobber_label.grid(row=row_index, column=2, columnspan=1, sticky=(N, W))
6461

65-
66-
self.minions_icon = image_utility.load('images\\minions.png',75,75)
62+
self.minions_icon = image_utility.load(PathUtility.normalize_path('images\\minions.png'), 75, 75)
6763
self.minions_label = ttk.Label(center_frame, image=self.minions_icon)
68-
self.minions_label.grid(row=row_index, column=3, sticky=(N,E))
64+
self.minions_label.grid(row=row_index, column=3, sticky=(N, E))
6965

7066
self.next_mobber_label = ttk.Label(center_frame, text="", font="Helvetica 50")
71-
self.next_mobber_label.grid(row=row_index, column=4, columnspan=1,sticky=(N,W))
67+
self.next_mobber_label.grid(row=row_index, column=4, columnspan=1, sticky=(N, W))
7268
row_index += 1
7369

7470
start_button = ttk.Button(center_frame, text="Continue Mobbing!", style="StartButton.TButton", )
@@ -82,20 +78,31 @@ def build_window_content(self):
8278
row_index += 1
8379

8480
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")
81+
self.current_time_label = ttk.Label(center_frame, text="current time", font="Helvetica 15")
8682
self.current_time_label.grid(row=row_index, column=1, columnspan=4, padx=30, pady=10, sticky=(N))
8783
row_index += 1
8884

85+
if self.settings_manager.get_timer_extension_enabled() and not self.settings_manager.get_randomize_randomize_next_driver():
86+
minutes = self.settings_manager.get_timer_extension_minutes()
87+
extend_time_button = ttk.Button(center_frame, text="Extend Time By {} Minutes".format(minutes))
88+
extend_time_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=90, pady=10)
89+
extend_time_button.bind("<Button-1>", lambda event: self.rewind_and_extend(minutes))
90+
row_index += 1
8991

90-
start_button = ttk.Button(center_frame, text="Mob Setup & Time")
91-
start_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=90, pady=10)
92-
start_button.bind("<Button-1>", lambda event: self.controller.show_screen_blocker_frame())
92+
setup_button = ttk.Button(center_frame, text="Mob Setup & Time")
93+
setup_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=90, pady=10)
94+
setup_button.bind("<Button-1>", lambda event: self.controller.show_screen_blocker_frame())
9395
row_index += 1
9496

95-
start_button = ttk.Button(center_frame, text="Quit Mobbing")
96-
start_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=90, pady=10)
97-
start_button.bind("<Button-1>", lambda event: self.controller.quit_and_destroy_session())
97+
quit_button = ttk.Button(center_frame, text="Quit Mobbing")
98+
quit_button.grid(row=row_index, column=1, columnspan=4, sticky=N + E + W, padx=90, pady=10)
99+
quit_button.bind("<Button-1>", lambda event: self.controller.quit_and_destroy_session())
98100
row_index += 1
101+
102+
def rewind_and_extend(self,minutes):
103+
self.mobber_manager.rewind_driver()
104+
return self.controller.show_transparent_countdown_frame(minutes)
105+
99106
def mobber_list_change_callback(self, mobber_list, driver_index, navigator_index):
100107
self.current_mobber_label['text'] = ""
101108
self.next_mobber_label['text'] = ""

Frames/MobTimerController.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import atexit
2+
import os
23
import uuid
34
from tkinter import *
45
from tkinter import ttk
56

6-
from screeninfo import *
7-
87
from Frames.MinimalScreenBlockerFrame import MinimalScreenBlockerFrame
98
from Frames.ScreenBlockerFrame import ScreenBlockerFrame
109
from Frames.TransparentCountdownFrame import TransparentCountdownFrame
1110
from Infrastructure.CountdownManager import CountdownManager
1211
from Infrastructure.MobberManager import MobberManager
12+
from Infrastructure.PlatformUtility import PlatformUtility
13+
from Infrastructure.ScreenUtility import ScreenUtility
1314
from Infrastructure.SessionManager import SessionManager
1415
from Infrastructure.SettingsManager import SettingsManager
1516
from Infrastructure.ThemeManager import ThemeManager
@@ -33,16 +34,15 @@ def __init__(self, *args, **kwargs):
3334
self.quit_and_destroy_session()
3435

3536
self.session_manager.create_session()
36-
self.iconbitmap(default='time-bomb.ico')
37+
# self.iconbitmap(default='time-bomb.ico')
3738
self.countdown_manager.subscribe_to_time_changes(self.show_screen_blocker_when_session_interupted)
3839

3940
self.theme_manager = ThemeManager()
4041
theme = self.settings_manager.get_general_theme()
4142
if not theme == 'none':
4243
self.theme_manager.set_theme(theme)
4344

44-
monitors = get_monitors()
45-
num_monitors = monitors.__len__()
45+
num_monitors = ScreenUtility.get_monitors_or_default(self).__len__()
4646
self.containers = [self]
4747
for monitor_index in range(1, num_monitors):
4848
monitor_screen_blocker = Toplevel(self)
@@ -74,12 +74,10 @@ def __init__(self, *args, **kwargs):
7474
self.transparent_frame_position = 0
7575
self.title("Mob Timer")
7676
self.bind_all("<Control-Return>", self.launch_transparent_countdown_if_blocking)
77-
self.time_options_manager.set_countdown_time(self.settings_manager.get_general_minutes(), self.settings_manager.get_general_seconds())
78-
77+
self.time_options_manager.set_countdown_time(self.settings_manager.get_timer_minutes(), self.settings_manager.get_timer_seconds())
7978

8079
def launch_transparent_countdown_if_blocking(self, event):
8180
if self.frame_is_screen_blocking():
82-
8381
self.show_transparent_countdown_frame()
8482

8583
def frame_is_screen_blocking(self):
@@ -101,7 +99,6 @@ def show_screen_blocker_when_session_interupted(self, days, minutes, seconds):
10199
self.session_manager.create_session()
102100

103101
def show_frame(self, frame_class):
104-
105102
switched_frames = False
106103
if self.last_frame != frame_class:
107104
for frame_instances in self.frames[frame_class]:
@@ -129,40 +126,49 @@ def launch_blocking_Frame(self, frame):
129126
if self.show_frame(frame):
130127
self.set_full_screen_always_on_top()
131128

132-
def show_transparent_countdown_frame(self):
129+
def show_transparent_countdown_frame(self, extend_amount=None):
133130
if self.show_frame(TransparentCountdownFrame):
134-
self.countdown_manager.set_countdown_duration(self.time_options_manager.minutes,
135-
self.time_options_manager.seconds)
131+
if extend_amount is None:
132+
self.countdown_manager.set_countdown_duration(self.time_options_manager.minutes,
133+
self.time_options_manager.seconds)
134+
else:
135+
self.countdown_manager.set_countdown_duration(extend_amount, 0)
136136
self.set_partial_screen_transparent()
137137

138138
def get_current_window_geometry(self):
139139
return "{0}x{1}+0+0".format(
140-
self.winfo_screenwidth(), self.winfo_screenheight())
140+
self.winfo_screenwidth(), self.winfo_screenheight())
141141

142142
def disable_resizing(self):
143143
for container in self.containers:
144144
container.resizable(0, 0)
145145

146146
def remove_title_bar(self):
147+
if PlatformUtility.platform_is_mac():
148+
return
147149
for container in self.containers:
148150
container.overrideredirect(1)
149151

150152
def set_always_on_top(self):
151153
for container in self.containers:
152-
container.wm_attributes("-topmost", 1)
154+
container.wm_attributes("-topmost", True)
155+
if PlatformUtility.platform_is_mac():
156+
os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''')
157+
self.focus_force()
158+
self.focus()
153159
container.focus_force()
154160

155161
def set_full_screen_always_on_top(self):
156162
self.set_always_on_top()
157163
self.remove_title_bar()
158164
self.disable_resizing()
159-
top_left_screen = "+0+0"
160-
monitors = get_monitors()
165+
monitors = ScreenUtility.get_monitors_or_default(self)
161166

162167
for container, monitor in zip(self.containers, monitors):
163168
monitor_string = "{}x{}+{}+{}".format(monitor.width, monitor.height, monitor.x, monitor.y)
164169
container.geometry(monitor_string)
165-
container.wait_visibility(container)
170+
if not PlatformUtility.platform_is_mac():
171+
container.wait_visibility(container) # Mac removing this prevented the issue with the continue screen visibility
166172
container.attributes("-alpha", 1)
167173

168174
def set_partial_screen_transparent(self):
@@ -183,8 +189,8 @@ def set_partial_screen_transparent(self):
183189
self.toggle_transparent_frame_position()
184190

185191
def fade_app(self):
186-
for controller in self.containers:
187-
controller.attributes("-alpha", self.settings_manager.get_continue_screen_blocker_window_alpha_percent())
192+
for controller in self.containers:
193+
controller.attributes("-alpha", self.settings_manager.get_continue_screen_blocker_window_alpha_percent())
188194

189195
def unfade_app(self):
190196
for controller in self.containers:
@@ -194,9 +200,7 @@ def toggle_transparent_frame_position(self, e=None):
194200
if self.state() == "withdrawn":
195201
return
196202

197-
198-
199-
monitors = get_monitors()
203+
monitors = ScreenUtility.get_monitors_or_default(self)
200204
monitor = monitors[self.transparent_frame_monitor_index]
201205

202206
screenwidth = monitor.width
@@ -217,6 +221,6 @@ def toggle_transparent_frame_position(self, e=None):
217221
self.transparent_frame_position = monitor.x + 0
218222
self.transparent_frame_position_index = (self.transparent_frame_position_index + 1) % 2
219223

220-
bottom_left_screen = "{}x{}+{}+{}".format(window_width,window_height,self.transparent_frame_position, monitor.y +
224+
bottom_left_screen = "{}x{}+{}+{}".format(window_width, window_height, self.transparent_frame_position, monitor.y +
221225
screenheight - window_height)
222226
self.geometry(bottom_left_screen)

Frames/ScreenBlockerFrame.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
from tkinter import *
33
from tkinter import ttk
44
from Infrastructure.ImageUtility import ImageUtility
5-
from PIL import Image
6-
from PIL import ImageTk
7-
85
TAGNAME_CURRENT_MOBBER = 'current_mobber'
96

107

@@ -48,7 +45,6 @@ def time_change_callback(self, time, minutes, seconds):
4845

4946
def toggle_geometry(self, event):
5047
geom = self.controller.winfo_geometry()
51-
print(geom, self._geom)
5248
self.controller.geometry(self._geom)
5349
self._geom = geom
5450

@@ -67,8 +63,6 @@ def mouse_wheel_seconds(self, event):
6763

6864
def build_window_content(self):
6965

70-
71-
7266
center_frame = ttk.Frame(self)
7367

7468
center_frame.grid(row=0, column=0)
@@ -78,13 +72,11 @@ def build_window_content(self):
7872
center_frame.grid_columnconfigure(3, weight=0)
7973
center_frame.grid_columnconfigure(4, weight=1)
8074

81-
82-
8375
row_index = 0
8476

8577
if self.settings_manager.get_general_use_logo_image():
8678
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())
79+
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())
8880
title = ttk.Label(center_frame, image=self.background_image)
8981
else:
9082
title = ttk.Label(center_frame, text="Mobbing Timer", font="Helvetica 60 bold italic")
@@ -137,7 +129,7 @@ def build_window_content(self):
137129
remove_mobber_button = ttk.Button(center_frame, text="Remove Mobber")
138130
remove_mobber_button.grid(row=row_index, column=3, sticky=N + E + W, padx=10, pady=button_pad)
139131
remove_mobber_button.bind("<Button-1>", lambda event: self.mobber_manager.remove_mobber(
140-
int(self.names_list.index(self.names_list.selection()))))
132+
int(self.names_list.index(self.names_list.selection()))))
141133
self.controller.bind("<Delete>", self.remove_mobber_if_screen_blocking)
142134
row_index += 1
143135

@@ -186,7 +178,7 @@ def build_window_content(self):
186178

187179
self.focus_mobber_entry()
188180

189-
def remove_mobber_if_screen_blocking(self,event):
181+
def remove_mobber_if_screen_blocking(self, event):
190182
if self.controller.last_frame == ScreenBlockerFrame:
191183
self.mobber_manager.remove_mobber(int(self.names_list.index(self.names_list.selection())))
192184

@@ -207,7 +199,7 @@ def move_mobber_down_left_click(self, event):
207199
selected_index = int(int(self.names_list.index(selected_items)))
208200
self.mobber_manager.move_mobber_down(selected_index)
209201
self.names_list.selection_set(
210-
self.names_list.get_children()[(selected_index + 1) % self.mobber_manager.mobber_count()])
202+
self.names_list.get_children()[(selected_index + 1) % self.mobber_manager.mobber_count()])
211203

212204
def move_mobber_up_left_click(self, event):
213205
selected_index = int(int(self.names_list.index(self.names_list.selection())))

Infrastructure/ImageUtility.py

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from PIL import Image
2-
from PIL import ImageTk
1+
32

43

54
class ImageUtility(object):
@@ -13,23 +12,30 @@ def hex_to_rgb(value):
1312
return tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))
1413

1514
def load(self, image_path, width=50, height=50, normalize_color=True):
16-
background_color = ImageUtility.hex_to_rgb(self.theme_manager.background_color)
17-
highlight_color = ImageUtility.hex_to_rgb(self.theme_manager.highlight_color)
18-
original = Image.open(image_path)
19-
resized = original.resize((width, height), Image.ANTIALIAS)
20-
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))
15+
import platform
3416

35-
return ImageTk.PhotoImage(resized)
17+
if platform.system() == 'Darwin':
18+
return None
19+
#
20+
# from PIL import Image
21+
# from PIL import ImageTk
22+
# background_color = ImageUtility.hex_to_rgb(self.theme_manager.background_color)
23+
# highlight_color = ImageUtility.hex_to_rgb(self.theme_manager.highlight_color)
24+
# original = Image.open(image_path)
25+
# resized = original.resize((width, height), Image.ANTIALIAS)
26+
#
27+
# if normalize_color:
28+
# pixel_access = resized.load()
29+
# for y in range(resized.size[1]):
30+
# for x in range(resized.size[0]):
31+
# pixel = pixel_access[x, y]
32+
# if pixel[0] < 50:
33+
# pixel_access[x, y] = (background_color[0] + pixel_access[x, y][0],
34+
# background_color[1] + pixel_access[x, y][1],
35+
# background_color[2] + pixel_access[x, y][2])
36+
# elif pixel[0] > 50:
37+
# pixel_access[x, y] = (int(highlight_color[0] * pixel_access[x, y][0] / 255),
38+
# int(highlight_color[1] * pixel_access[x, y][1] / 255),
39+
# int(highlight_color[2] * pixel_access[x, y][2] / 255))
40+
#
41+
# return ImageTk.PhotoImage(resized)

Infrastructure/PathUtility.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import os
2+
import sys
3+
4+
5+
class PathUtility(object):
6+
@staticmethod
7+
def normalize_path(path):
8+
9+
if not path.startswith("/"):
10+
path = "/" + path
11+
# if sys.frozen == 'macosx_app':
12+
# path = path + "/Resources/"
13+
path = path.replace('\\','/')
14+
result = os.path.dirname(sys.argv[0]) + path
15+
return result

0 commit comments

Comments
 (0)