Skip to content

Commit 0ad75db

Browse files
Sorting screen supports window size change
1 parent 5bbe06e commit 0ad75db

File tree

3 files changed

+106
-71
lines changed

3 files changed

+106
-71
lines changed

AlgoVisual.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def main(fps):
3636
# If window changes size
3737
if event.type == pygame.VIDEORESIZE:
3838
width, height = event.size
39-
window = Wrapper.Window(width, height, window.screen, False, True)
39+
window.change(width, height, window.screen, False, True)
4040
if event.type == pygame.QUIT:
4141
window.event.set()
4242
del midi
@@ -55,9 +55,9 @@ def main(fps):
5555
sorting_actions = UI.SortingActions(window, screen_group, sorting_group, aux_sorting_group, [scroll_group_1, scroll_group_2], options_screen_group, text_box_group, midi)
5656
scroll_bar = sorting_actions.display_sorting(screen_group, options_screen_group, True)
5757
window.screen_change = False
58-
# TODO: make screen size change work for sorting screen
58+
# TODO: make objects on screen scale better when screen size changes
5959
elif (window.screen == Wrapper.Screen.SORTING_SCREEN and window.window_size_change):
60-
#UI.SortingActions.display_sorting(window, True, screen_group, options_screen_group)
60+
scroll_bar = sorting_actions.display_sorting(screen_group, options_screen_group, False)
6161
window.window_size_change = False
6262

6363
# This should update everything (Logic to update everything)
@@ -73,9 +73,10 @@ def main(fps):
7373

7474
# find a way to just get rid of this logic for future
7575
extended = -1
76-
for i in range(len(scroll_bar)):
77-
if (scroll_bar[i].extended):
78-
extended = i
76+
if (scroll_bar != None):
77+
for i in range(len(scroll_bar)):
78+
if (scroll_bar[i].extended):
79+
extended = i
7980
scroll_group_1.draw(window.window)
8081
scroll_group_1.update()
8182
scroll_group_2.draw(window.window)

UI/UI.py

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def close_options(window, options_group):
6868
options_group.empty()
6969
# TODO: Fix glitch where when you press the return button, it will simultaneously press the button behind it
7070
time.sleep(0.30)
71-
window.options_screen = False
71+
window.display = False
7272

7373
'''@args[0] = options_group
7474
@args[1] = screen_group
@@ -78,7 +78,7 @@ def press_main_menu(window, options_group):
7878
OptionActions.close_options(window, options_group)
7979
window.screen = Wrapper.Screen.MAIN_MENU
8080
window.screen_change = True
81-
window.options_screen = False
81+
window.display = False
8282

8383
'''@args = options_group should be passed in first, then screen_group'''
8484
def display_options(window, options_group):
@@ -87,7 +87,7 @@ def display_options(window, options_group):
8787
OPTIONS_HEIGHT = 300
8888

8989
# Switch on options
90-
window.options_screen = True
90+
window.display = True
9191
options_group.empty()
9292

9393
# Draw everything
@@ -171,39 +171,40 @@ def update(self):
171171
# self.scroll_bar[1] = sort scroll
172172
# Glitch where it will click the button behind it
173173
#print(len(self.list))
174-
if (self.window.options_screen and self.handled != 1):
175-
#print("options extended")
176-
self.scroll_bar[0].set_unpressable()
177-
self.scroll_bar[1].set_unpressable()
178-
self.toggle_aux.set_unpressable()
179-
self.generate.set_unpressable()
180-
self.advanced.set_unpressable()
181-
self.handled = 1
182-
elif (self.scroll_bar[0].extended and self.handled != 2):
183-
#print("reset scroll extended")
184-
185-
self.scroll_bar[1].set_unpressable()
186-
self.toggle_aux.set_unpressable()
187-
self.generate.set_unpressable()
188-
self.advanced.set_unpressable()
189-
self.handled = 2
190-
elif (self.scroll_bar[1].extended and self.handled != 3):
191-
#print("sorts scroll extended")
192-
193-
self.scroll_bar[0].set_unpressable()
194-
self.toggle_aux.set_unpressable()
195-
self.generate.set_unpressable()
196-
self.advanced.set_unpressable()
197-
self.handled = 3
198-
elif (self.handled != 0):
199-
#print("nothing extended")
200-
201-
self.scroll_bar[0].set_pressable()
202-
self.scroll_bar[1].set_pressable()
203-
self.toggle_aux.set_pressable()
204-
self.generate.set_pressable()
205-
self.advanced.set_pressable()
206-
self.handled = 0
174+
if (self.scroll_bar != []):
175+
if (self.window.display and self.handled != 1):
176+
#print("options extended")
177+
self.scroll_bar[0].set_unpressable()
178+
self.scroll_bar[1].set_unpressable()
179+
self.toggle_aux.set_unpressable()
180+
self.generate.set_unpressable()
181+
self.advanced.set_unpressable()
182+
self.handled = 1
183+
elif (self.scroll_bar[0].extended and self.handled != 2):
184+
#print("reset scroll extended")
185+
186+
self.scroll_bar[1].set_unpressable()
187+
self.toggle_aux.set_unpressable()
188+
self.generate.set_unpressable()
189+
self.advanced.set_unpressable()
190+
self.handled = 2
191+
elif (self.scroll_bar[1].extended and self.handled != 3):
192+
#print("sorts scroll extended")
193+
194+
self.scroll_bar[0].set_unpressable()
195+
self.toggle_aux.set_unpressable()
196+
self.generate.set_unpressable()
197+
self.advanced.set_unpressable()
198+
self.handled = 3
199+
elif (self.handled != 0):
200+
#print("nothing extended")
201+
202+
self.scroll_bar[0].set_pressable()
203+
self.scroll_bar[1].set_pressable()
204+
self.toggle_aux.set_pressable()
205+
self.generate.set_pressable()
206+
self.advanced.set_pressable()
207+
self.handled = 0
207208

208209
def on_reset(self):
209210
self.window.event.set()
@@ -213,12 +214,21 @@ def display_sorting(self, screen_group, options_screen_group, slide_in = True):
213214
if (self.window.screen == Wrapper.Screen.SORTING_SCREEN and (not self.window.screen_change and not self.window.window_size_change)):
214215
return
215216
# Change Screen
216-
self.window.switch_screen(Wrapper.Screen.SORTING_SCREEN)
217+
self.window.screen = Wrapper.Screen.SORTING_SCREEN
217218

218219
# Drawing Everything
219220
screen_group.empty()
220-
screen_group.add(Wrapper.Text(Wrapper.DefaultText.text("Sorting", Wrapper.FontSizes.TITLE_SIZE), (self.window.window.get_size()[0]/2, self.TITLE_Y), self.window))
221-
screen_group.add(Wrapper.Background((self.SORTING_X, self.SORTING_Y), (self.SORTING_WIDTH, self.SORTING_HEIGHT), Wrapper.Colors.SMALL_BACKGROUND_COLOR, self.window, False))
221+
self.scroll_group[0].empty()
222+
self.scroll_group[1].empty()
223+
self.SORTING_WIDTH = (3*self.window.window.get_size()[0]/4 - 2*self.MARGIN_X) # Ideally is ~800
224+
self.SORTING_HEIGHT = (self.window.window.get_size()[1] - 2*self.TITLE_Y - 2*self.MARGIN_Y)
225+
self.SORTING_X = (3*self.window.window.get_size()[0]/4 - 2*self.MARGIN_X)/2 + self.MARGIN_X
226+
self.SORTING_Y = 2*self.TITLE_Y + self.MARGIN_Y + (self.window.window.get_size()[1] - 2*self.TITLE_Y - 2*self.MARGIN_Y)/2
227+
print(self.SORTING_X, self.SORTING_Y, self.SORTING_WIDTH, self.SORTING_HEIGHT)
228+
self.array = Array(self.sorting_group, (self.SORTING_WIDTH, self.SORTING_HEIGHT), (self.MARGIN_X, self.SORTING_Y - self.SORTING_HEIGHT/2), 1, self.array_length, self.midi)
229+
230+
screen_group.add(Wrapper.Text(Wrapper.DefaultText.text("Sorting", Wrapper.FontSizes.TITLE_SIZE), (self.window.window.get_size()[0]/2, self.TITLE_Y), self.window, slide_in))
231+
screen_group.add(Wrapper.Background((self.MARGIN_X + self.SORTING_WIDTH/2, self.SORTING_Y), (self.SORTING_WIDTH, self.SORTING_HEIGHT), Wrapper.Colors.SMALL_BACKGROUND_COLOR, self.window, False))
222232

223233
def set_sorting_thread(thread):
224234
if self.sorting_thread is not None:
@@ -254,14 +264,14 @@ def func():
254264
button_col_top = 130 # Where the buttons start
255265
button_margin = 70
256266

257-
self.shuffle_button = Wrapper.TextButton(Wrapper.DefaultText.text("Shuffle", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top), Wrapper.sequential_functions(self.on_reset, self.array.shuffle), self.window)
267+
self.shuffle_button = Wrapper.TextButton(Wrapper.DefaultText.text("Shuffle", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top), Wrapper.sequential_functions(self.on_reset, self.array.shuffle), self.window, slide_in)
258268
#self.reset_button = Wrapper.TextButton(Wrapper.DefaultText.text("Reset", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + button_margin), Wrapper.sequential_functions(self.on_reset, self.array.reset), self.window)
259269

260270

261-
self.toggle_aux = Wrapper.TextButton(Wrapper.DefaultText.text("Auxillary Array", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 3 * button_margin), Wrapper.sequential_functions(self.on_reset, self.toggle_aux_array), self.window)
262-
self.generate = Wrapper.TextButton(Wrapper.DefaultText.text("Generate", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 4 * button_margin), Wrapper.sequential_functions(self.on_reset, self.array.generate), self.window)
263-
self.advanced = Wrapper.TextButton(Wrapper.DefaultText.text("Advanced", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 5 * button_margin), Wrapper.sequential_functions(self.on_reset, self.show_advanced), self.window)
264-
self.input = Wrapper.TextButton(Wrapper.DefaultText.text("Input", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 6 * button_margin), Wrapper.sequential_functions(self.on_reset, self.custom_array), self.window)
271+
self.toggle_aux = Wrapper.TextButton(Wrapper.DefaultText.text("Auxillary Array", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 3 * button_margin), Wrapper.sequential_functions(self.on_reset, self.toggle_aux_array), self.window, slide_in)
272+
self.generate = Wrapper.TextButton(Wrapper.DefaultText.text("Generate", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 4 * button_margin), Wrapper.sequential_functions(self.on_reset, self.array.generate), self.window, slide_in)
273+
self.advanced = Wrapper.TextButton(Wrapper.DefaultText.text("Advanced", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 5 * button_margin), Wrapper.sequential_functions(self.on_reset, self.show_advanced), self.window, slide_in)
274+
self.input = Wrapper.TextButton(Wrapper.DefaultText.text("Input", Wrapper.FontSizes.BUTTON_SIZE), ((5*self.window.window.get_size()[0]/6), button_col_top + 6 * button_margin), Wrapper.sequential_functions(self.on_reset, self.custom_array), self.window, slide_in)
265275
self.screen_group.add(self.shuffle_button)
266276
self.screen_group.add(self.toggle_aux)
267277
self.screen_group.add(self.generate)
@@ -271,6 +281,7 @@ def func():
271281
# scroll_group[0] = reset
272282
# scroll_group[1] = sorts
273283
# This scroll bar looks so shit cuz its off by a bit, make it better somehow
284+
self.scroll_bar = []
274285
self.scroll_bar.append(Wrapper.ScrollBar(resets, ((5*self.window.window.get_size()[0]/6), button_col_top + button_margin), (200, 50), self.scroll_group[0], self.window, "Reset", slide_in, 124.9))
275286
self.scroll_bar.append(Wrapper.ScrollBar(buttons, ((5*self.window.window.get_size()[0]/6), button_col_top + 2 * button_margin), (200, 50), self.scroll_group[1], self.window, "Choose Sorted", slide_in))
276287
# Options button
@@ -292,7 +303,7 @@ def show_advanced(self):
292303
OPTIONS_HEIGHT = 300
293304

294305
# Switch on options
295-
self.window.options_screen = True
306+
self.window.display = True
296307

297308
# Where the text starts rendering
298309
text_start = self.window.window.get_size()[1]/2 - OPTIONS_HEIGHT/2 + 50
@@ -328,7 +339,7 @@ def close_window(self):
328339
self.text_box_group.empty()
329340
# TODO: Fix glitch where when you press the return button, it will simultaneously press the button behind it
330341
time.sleep(0.30)
331-
self.window.options_screen = False
342+
self.window.display = False
332343

333344
def custom_array(self):
334345
tkinter.Tk().withdraw() # prevents an empty tkinter window from appearing

UI/Wrapper.py

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,12 @@ def __init__(self, width, height, screen, screen_change, window_size_change):
5757
self.screen = screen
5858
self.background = pygame.Surface((width, height))
5959
self.background.fill(Colors.BACKGROUND_COLOR)
60+
self.width = width
61+
self.height = height
6062

6163
self.screen_change = screen_change
62-
self.options_screen = False
6364
self.window_size_change = window_size_change
64-
self.mouse_button_down = False
65+
self.display = False
6566
self.event = threading.Event()
6667

6768
def update(self):
@@ -71,6 +72,17 @@ def switch_screen(self, screen):
7172
self.screen = screen
7273
self.screen_change = True
7374

75+
def change(self, width, height, screen, screen_change, window_size_change):
76+
self.width = width
77+
self.height = height
78+
self.screen = screen
79+
self.screen_change = screen_change
80+
self.window_size_change = window_size_change
81+
82+
self.window.fill(Colors.BACKGROUND_COLOR)
83+
self.background = pygame.Surface((width, height))
84+
self.background.fill(Colors.BACKGROUND_COLOR)
85+
7486
''' Seperate class to make it so that you don't have 9 parameters when making text
7587
@text = the text to be displayed
7688
@font = the font
@@ -404,6 +416,7 @@ def draw_drop_menu(self):
404416
return
405417
if (self.coords[1] + (i + 1)*self.dim[1] - self.shift + self.tolerance < self.coords[1] + self.dim[1]):
406418
continue
419+
#print((self.coords[0], self.coords[1] + (i + 1)*self.dim[1] - self.shift))
407420
self.buttons[i].setCoords((self.coords[0], self.coords[1] + (i + 1)*self.dim[1] - self.shift))
408421
self.scroll_group.add(self.buttons[i])
409422

@@ -471,6 +484,8 @@ def __init__(self, text_arg, function, window, will_slide = False, screen = None
471484
self.can_press = True
472485
self.can_press_timer = 0
473486
self.timer_is_handled = True
487+
488+
self.stop_slide = False
474489

475490
if will_slide:
476491
self.rect = self.image.get_rect(center = (window.window.get_size()[0] + 400, self.coords[1]))
@@ -492,15 +507,21 @@ def destroy(self):
492507
self.kill()
493508

494509
def slide(self):
495-
print(self.coords[0], self.coords[1])
496-
if ((self.screen != self.window.screen) or self.rect.x + self.dim[0]/2 > self.coords[0]):
497-
self.accel += -1
498-
self.rect.x += self.accel
499-
self.textRect.x += self.accel
510+
#print(self.coords[0], self.coords[1])
511+
if (not self.stop_slide):
512+
if ((self.screen != self.window.screen) or self.rect.x + self.dim[0]/2 > self.coords[0]):
513+
self.accel += -1
514+
self.rect.x += self.accel
515+
self.textRect.x += self.accel
516+
else:
517+
self.accel = 0
518+
self.rect = self.image.get_rect(center = self.coords)
519+
self.textRect = self.text.get_rect(center = self.coords)
520+
self.stop_slide = True
500521
else:
501-
self.accel = 0
502522
self.rect = self.image.get_rect(center = self.coords)
503523
self.textRect = self.text.get_rect(center = self.coords)
524+
self.window.window.blit(self.text, self.textRect)
504525

505526
def copy(self):
506527
copy = ScrollButton(self.copy_text, self.function, self.window)
@@ -541,9 +562,7 @@ def change_func(self, func):
541562
def update(self):
542563
#self.window.window.blit(self.text, (self.rect.x + self.width/2, self.rect.y + self.height/2))
543564
self.image = pygame.Surface(self.dim)
544-
#self.rect = self.image.get_rect(center = self.coords)
545-
#self.textRect = self.text.get_rect(center = self.coords)
546-
self.window.window.blit(self.text, self.textRect)
565+
547566
self.player_input()
548567

549568
if (self.can_press_timer != 0):
@@ -555,28 +574,32 @@ def update(self):
555574

556575
if self.will_slide:
557576
self.slide()
577+
else:
578+
self.rect = self.image.get_rect(center = self.coords)
579+
self.textRect = self.text.get_rect(center = self.coords)
580+
self.window.window.blit(self.text, self.textRect)
558581
self.destroy()
559582

560-
class Background(Slide):
583+
class Background(pygame.sprite.Sprite):
561584
'''Creates a background (also used as an array element)
562585
@color = the color that the background will be in
563586
@coords = the coordinates where the rectangle will be centered at
564587
@dim = the dimensions of the rectangle
565588
@window = window class
566589
'''
567590
def __init__(self, coords, dim, color, window, will_slide = False, border_width = 0, screen = None, border_color = Colors.DEFAULT_BORDER_COLOR):
568-
image = pygame.Surface(dim)
591+
super().__init__()
592+
self.image = pygame.Surface(dim)
569593
self.color = color
570-
image.fill(color)
594+
self.rect = self.image.get_rect(center = coords)
595+
self.coords = coords
596+
self.image.fill(color)
571597
self.border_width = border_width
572598
self.border_color = border_color
573-
574-
self.is_slide = False
575-
super().__init__(image, coords, dim, window, will_slide, screen)
599+
self.window = window
576600

577601
def update(self):
578-
super().update()
579-
#self.rect = self.image.get_rect(center = self.coords)
602+
self.rect = self.image.get_rect(center = self.coords)
580603
top_left = self.rect.topleft
581604
if (self.border_width != 0):
582605
pygame.draw.rect(self.window.window, self.border_color, [top_left[0], top_left[1], self.rect.width, self.border_width])

0 commit comments

Comments
 (0)