From b8befd73da92f101aa4a0a2fa0db7f80754f3ab5 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 5 Mar 2023 01:59:32 +0530 Subject: [PATCH 01/22] Step 1: Open a Window --- doc/tutorials/menu/index.rst | 15 +++++++++++ doc/tutorials/menu/menu_01.py | 51 +++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 doc/tutorials/menu/index.rst create mode 100644 doc/tutorials/menu/menu_01.py diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst new file mode 100644 index 0000000000..808142834e --- /dev/null +++ b/doc/tutorials/menu/index.rst @@ -0,0 +1,15 @@ +.. include:: + +.. _menu_tutorial: + + +Making a Menu with Arcade's GUI +=============================== + +Step 1: Open a Window +------------- +First, let's start with a blank window. + +.. literalinclude:: gpu_particle_burst_01.py + :caption: menu_01.py + :linenos: diff --git a/doc/tutorials/menu/menu_01.py b/doc/tutorials/menu/menu_01.py new file mode 100644 index 0000000000..d22d456f42 --- /dev/null +++ b/doc/tutorials/menu/menu_01.py @@ -0,0 +1,51 @@ +""" +Menu. +""" +import arcade + +# Screen title and size +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 +SCREEN_TITLE = "Making a Menu" + + +class MyGame(arcade.Window): + """ Main application class. """ + + def __init__(self): + super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + + arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) + + def setup(self): + """ Set up the game here. Call this function to restart the game. """ + pass + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + + def on_mouse_press(self, x, y, button, key_modifiers): + """ Called when the user presses a mouse button. """ + pass + + def on_mouse_release(self, x: float, y: float, button: int, + modifiers: int): + """ Called when the user presses a mouse button. """ + pass + + def on_mouse_motion(self, x: float, y: float, dx: float, dy: float): + """ User moves mouse """ + pass + + +def main(): + """ Main function """ + window = MyGame() + window.setup() + arcade.run() + + +if __name__ == "__main__": + main() From 6c0500b105ede56aa4e414e90a7e809b5d85f387 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 5 Mar 2023 02:49:47 +0530 Subject: [PATCH 02/22] Step 2: Switching to Menu View --- doc/tutorials/menu/index.rst | 69 ++++++++++++++++++++++-- doc/tutorials/menu/menu_01.py | 32 ++++------- doc/tutorials/menu/menu_01.rst | 10 ++++ doc/tutorials/menu/menu_02.py | 83 +++++++++++++++++++++++++++++ doc/tutorials/menu/menu_02.rst | 10 ++++ doc/tutorials/menu/menu_02_diff.rst | 10 ++++ 6 files changed, 187 insertions(+), 27 deletions(-) create mode 100644 doc/tutorials/menu/menu_01.rst create mode 100644 doc/tutorials/menu/menu_02.py create mode 100644 doc/tutorials/menu/menu_02.rst create mode 100644 doc/tutorials/menu/menu_02_diff.rst diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 808142834e..ba15119d5f 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -7,9 +7,70 @@ Making a Menu with Arcade's GUI =============================== Step 1: Open a Window -------------- -First, let's start with a blank window. +--------------------- -.. literalinclude:: gpu_particle_burst_01.py - :caption: menu_01.py +First, let's start a blank window with a view. + +.. literalinclude:: menu_01.py + :caption: Opening a Window :linenos: + +Step 2: Switching to Menu View +------------------------------- + +For this section we will switch the current view of the window to the menu view. + + +Imports +------- + +First we will import the arcade gui: + +.. literalinclude:: menu_02.py + :caption: Importing arcade.gui + :lines: 4-6 + :emphasize-lines: 5 + +Modify the MainView +------------------- + +We are going to add a button to change the view. For drawing a button we would need a UIManager. + +.. literalinclude:: menu_02.py + :caption: Intialising the Manager + :lines: 15-19 + :emphasize-lines: 18 + +After initialising the manager we need to enable it when the view is shown and disable it when the view is hiddien. + +.. literalinclude:: menu_02.py + :caption: Enabling the Manager + :lines: 42-48 + :emphasize-lines: 46-47 + +.. literalinclude:: menu_02.py + :caption: Disabling the Manager + :lines: 37-39 + +We also need to draw the childrens of the menu in `on_draw`. + + .. literalinclude:: menu_02.py + :caption: Drawing Children's of the Manager + :lines: 49-56 + :emphasize-lines: 54-55 + +Now we have successfully setup the manager, only thing left it to add the button. We are using `UIAnchorLayout` to position the button. + + .. literalinclude:: menu_02.py + :caption: Initialising the Button + :lines: 20-36 + + +Initialise the Menu View +------------------------ + +We make a boiler plate view just like we did in Step-1. + +.. literalinclude:: menu_02.py + :caption: Initialise the Menu View + :lines: 57-70 diff --git a/doc/tutorials/menu/menu_01.py b/doc/tutorials/menu/menu_01.py index d22d456f42..412fd50d0d 100644 --- a/doc/tutorials/menu/menu_01.py +++ b/doc/tutorials/menu/menu_01.py @@ -9,43 +9,29 @@ SCREEN_TITLE = "Making a Menu" -class MyGame(arcade.Window): +class MainView(arcade.View): """ Main application class. """ - def __init__(self): - super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + super().__init__() + def on_show_view(self): + """ This is run once when we switch to this view """ arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) - def setup(self): - """ Set up the game here. Call this function to restart the game. """ - pass - def on_draw(self): """ Render the screen. """ # Clear the screen self.clear() - def on_mouse_press(self, x, y, button, key_modifiers): - """ Called when the user presses a mouse button. """ - pass - - def on_mouse_release(self, x: float, y: float, button: int, - modifiers: int): - """ Called when the user presses a mouse button. """ - pass - - def on_mouse_motion(self, x: float, y: float, dx: float, dy: float): - """ User moves mouse """ - pass - def main(): """ Main function """ - window = MyGame() - window.setup() + + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + main_view = MainView() + window.show_view(main_view) arcade.run() if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/doc/tutorials/menu/menu_01.rst b/doc/tutorials/menu/menu_01.rst new file mode 100644 index 0000000000..2a96dcb44f --- /dev/null +++ b/doc/tutorials/menu/menu_01.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_01: + +menu_01.py Full Listing +------------------------------------- + +.. literalinclude:: menu_01.py + :caption: menu_01.py + :linenos: \ No newline at end of file diff --git a/doc/tutorials/menu/menu_02.py b/doc/tutorials/menu/menu_02.py new file mode 100644 index 0000000000..d342ca2d9d --- /dev/null +++ b/doc/tutorials/menu/menu_02.py @@ -0,0 +1,83 @@ +""" +Menu. +""" +import arcade +import arcade.gui + +# Screen title and size +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 +SCREEN_TITLE = "Making a Menu" + + +class MainView(arcade.View): + """ Main application class. """ + def __init__(self): + super().__init__() + + self.manager = arcade.gui.UIManager() + + switch_menu_button = arcade.gui.UIFlatButton(text="Switch to Menu", width=250) + + # Initialise the button with an on_click event. + @switch_menu_button.event("on_click") + def on_click_switch_button(event): + menu_view = MenuView() + self.window.show_view(menu_view) + + # Use the anchor to position the button on the screen. + self.anchor = self.manager.add(arcade.gui.UIAnchorLayout()) + + self.anchor.add( + anchor_x="center_x", + anchor_y="center_y", + child=switch_menu_button, + ) + + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + + def on_show_view(self): + """ This is run once when we switch to this view """ + arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) + + # Enable the UIManager when the view is showm. + self.manager.enable() + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + + # Draw the manager. + self.manager.draw() + + +class MenuView(arcade.View): + def __init__(self): + super().__init__() + + def on_show_view(self): + """ This is run once when we switch to this view """ + + # Makes the background darker + arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + + +def main(): + """ Main function """ + + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + main_view = MainView() + window.show_view(main_view) + arcade.run() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/doc/tutorials/menu/menu_02.rst b/doc/tutorials/menu/menu_02.rst new file mode 100644 index 0000000000..6bc11b58cb --- /dev/null +++ b/doc/tutorials/menu/menu_02.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_02: + +menu_02.py Full Listing +------------------------------------- + +.. literalinclude:: menu_02.py + :caption: menu_02.py + :linenos: \ No newline at end of file diff --git a/doc/tutorials/menu/menu_02_diff.rst b/doc/tutorials/menu/menu_02_diff.rst new file mode 100644 index 0000000000..9d3724eb68 --- /dev/null +++ b/doc/tutorials/menu/menu_02_diff.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_02_diff: + +menu_02.py Diff +------------------------------------- + +.. literalinclude:: menu_02.py + :caption: menu_02.py + :diff: menu_01.py \ No newline at end of file From e6316918bb3fe96e63597c5782483926cfdcc22b Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 5 Mar 2023 04:02:53 +0530 Subject: [PATCH 03/22] Step 3: Setting Up the Menu View --- doc/tutorials/menu/index.rst | 51 +++++++++--- doc/tutorials/menu/menu_01.py | 2 +- doc/tutorials/menu/menu_01.rst | 2 +- doc/tutorials/menu/menu_02.py | 10 ++- doc/tutorials/menu/menu_02.rst | 2 +- doc/tutorials/menu/menu_02_diff.rst | 2 +- doc/tutorials/menu/menu_03.py | 118 ++++++++++++++++++++++++++++ doc/tutorials/menu/menu_03.rst | 10 +++ doc/tutorials/menu/menu_03_diff.rst | 10 +++ 9 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 doc/tutorials/menu/menu_03.py create mode 100644 doc/tutorials/menu/menu_03.rst create mode 100644 doc/tutorials/menu/menu_03_diff.rst diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index ba15119d5f..6f2c48bd1d 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -28,8 +28,8 @@ First we will import the arcade gui: .. literalinclude:: menu_02.py :caption: Importing arcade.gui - :lines: 4-6 - :emphasize-lines: 5 + :lines: 4-5 + :emphasize-lines: 2 Modify the MainView ------------------- @@ -38,32 +38,32 @@ We are going to add a button to change the view. For drawing a button we would n .. literalinclude:: menu_02.py :caption: Intialising the Manager - :lines: 15-19 - :emphasize-lines: 18 + :lines: 15-18 + :emphasize-lines: 4 After initialising the manager we need to enable it when the view is shown and disable it when the view is hiddien. .. literalinclude:: menu_02.py :caption: Enabling the Manager - :lines: 42-48 - :emphasize-lines: 46-47 + :pyobject: MainView.on_show_view + :emphasize-lines: 3-4 .. literalinclude:: menu_02.py :caption: Disabling the Manager - :lines: 37-39 + :pyobject: MainView.on_hide_view We also need to draw the childrens of the menu in `on_draw`. .. literalinclude:: menu_02.py :caption: Drawing Children's of the Manager - :lines: 49-56 - :emphasize-lines: 54-55 + :pyobject: MainView.on_draw + :emphasize-lines: 6-7 Now we have successfully setup the manager, only thing left it to add the button. We are using `UIAnchorLayout` to position the button. .. literalinclude:: menu_02.py :caption: Initialising the Button - :lines: 20-36 + :lines: 20-35 Initialise the Menu View @@ -73,4 +73,33 @@ We make a boiler plate view just like we did in Step-1. .. literalinclude:: menu_02.py :caption: Initialise the Menu View - :lines: 57-70 + :pyobject: MenuView + +Step 3: Setting Up the Menu View +-------------------------------- + +In this step we will setup the display buttons of the actual menu. + +Initialising the Buttons +------------------------ + +First we setup buttons for resume, starting a new game, volume, options and exit. + +.. literalinclude:: menu_03.py + :caption: Initialising the Buttons + :lines: 63-68 + +Displaying the Buttons in a Grid +--------------------------------- + +After setting up the buttons we add them to `UIGridLayout`, so that they can displayed in a grid like manner. + +.. literalinclude:: menu_03.py + :caption: Setting up the Grid + :lines: 70-86 + +Final code for the `__init__` method after these. + +.. literalinclude:: menu_03.py + :caption: __init__ + :pyobject: MenuView.__init__ diff --git a/doc/tutorials/menu/menu_01.py b/doc/tutorials/menu/menu_01.py index 412fd50d0d..bffb9855bb 100644 --- a/doc/tutorials/menu/menu_01.py +++ b/doc/tutorials/menu/menu_01.py @@ -34,4 +34,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/doc/tutorials/menu/menu_01.rst b/doc/tutorials/menu/menu_01.rst index 2a96dcb44f..8aafbe8742 100644 --- a/doc/tutorials/menu/menu_01.rst +++ b/doc/tutorials/menu/menu_01.rst @@ -7,4 +7,4 @@ menu_01.py Full Listing .. literalinclude:: menu_01.py :caption: menu_01.py - :linenos: \ No newline at end of file + :linenos: diff --git a/doc/tutorials/menu/menu_02.py b/doc/tutorials/menu/menu_02.py index d342ca2d9d..6ef01a4d29 100644 --- a/doc/tutorials/menu/menu_02.py +++ b/doc/tutorials/menu/menu_02.py @@ -58,16 +58,24 @@ class MenuView(arcade.View): def __init__(self): super().__init__() + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + def on_show_view(self): """ This is run once when we switch to this view """ # Makes the background darker arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) + self.manager.enable() + def on_draw(self): """ Render the screen. """ + # Clear the screen self.clear() + self.manager.draw() def main(): @@ -80,4 +88,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/doc/tutorials/menu/menu_02.rst b/doc/tutorials/menu/menu_02.rst index 6bc11b58cb..40b1dd86e5 100644 --- a/doc/tutorials/menu/menu_02.rst +++ b/doc/tutorials/menu/menu_02.rst @@ -7,4 +7,4 @@ menu_02.py Full Listing .. literalinclude:: menu_02.py :caption: menu_02.py - :linenos: \ No newline at end of file + :linenos: diff --git a/doc/tutorials/menu/menu_02_diff.rst b/doc/tutorials/menu/menu_02_diff.rst index 9d3724eb68..462319ed73 100644 --- a/doc/tutorials/menu/menu_02_diff.rst +++ b/doc/tutorials/menu/menu_02_diff.rst @@ -7,4 +7,4 @@ menu_02.py Diff .. literalinclude:: menu_02.py :caption: menu_02.py - :diff: menu_01.py \ No newline at end of file + :diff: menu_01.py diff --git a/doc/tutorials/menu/menu_03.py b/doc/tutorials/menu/menu_03.py new file mode 100644 index 0000000000..24ad7df89d --- /dev/null +++ b/doc/tutorials/menu/menu_03.py @@ -0,0 +1,118 @@ +""" +Menu. +""" +import arcade +import arcade.gui + +# Screen title and size +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 +SCREEN_TITLE = "Making a Menu" + + +class MainView(arcade.View): + """ Main application class. """ + def __init__(self): + super().__init__() + + self.manager = arcade.gui.UIManager() + + switch_menu_button = arcade.gui.UIFlatButton(text="Pause", width=150) + + # Initialise the button with an on_click event. + @switch_menu_button.event("on_click") + def on_click_switch_button(event): + menu_view = MenuView() + self.window.show_view(menu_view) + + # Use the anchor to position the button on the screen. + self.anchor = self.manager.add(arcade.gui.UIAnchorLayout()) + + self.anchor.add( + anchor_x="center_x", + anchor_y="center_y", + child=switch_menu_button, + ) + + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + + def on_show_view(self): + """ This is run once when we switch to this view """ + arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) + + # Enable the UIManager when the view is showm. + self.manager.enable() + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + + # Draw the manager. + self.manager.draw() + + +class MenuView(arcade.View): + def __init__(self): + super().__init__() + + self.manager = arcade.gui.UIManager() + + resume = arcade.gui.UIFlatButton(text="Resume", width=150) + start_new_game = arcade.gui.UIFlatButton(text="Start New Game", width=150) + volume = arcade.gui.UIFlatButton(text="Volume", width=150) + options = arcade.gui.UIFlatButton(text="Options", width=150) + + exit = arcade.gui.UIFlatButton(text="Exit", width=300) + + # Initialise a grid in which widgets can be arranged. + self.grid = arcade.gui.UIGridLayout(column_count=2, row_count=3, horizontal_spacing=20, vertical_spacing=20) + + # Adding the buttons to the layout. + self.grid.add(resume, col_num=0, row_num=0) + self.grid.add(start_new_game, col_num=1, row_num=0) + self.grid.add(volume, col_num=0, row_num=1) + self.grid.add(options, col_num=1, row_num=1) + self.grid.add(exit, col_num=0, row_num=2, col_span=2) + + self.anchor = self.manager.add(arcade.gui.UIAnchorLayout()) + + self.anchor.add( + anchor_x="center_x", + anchor_y="center_y", + child=self.grid, + ) + + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + + def on_show_view(self): + """ This is run once when we switch to this view """ + + # Makes the background darker + arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) + + # Enable the UIManager when the view is showm. + self.manager.enable() + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + self.manager.draw() + + +def main(): + """ Main function """ + + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + main_view = MainView() + window.show_view(main_view) + arcade.run() + + +if __name__ == "__main__": + main() diff --git a/doc/tutorials/menu/menu_03.rst b/doc/tutorials/menu/menu_03.rst new file mode 100644 index 0000000000..e6a599a906 --- /dev/null +++ b/doc/tutorials/menu/menu_03.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_03: + +menu_03.py Full Listing +------------------------------------- + +.. literalinclude:: menu_03.py + :caption: menu_03.py + :linenos: diff --git a/doc/tutorials/menu/menu_03_diff.rst b/doc/tutorials/menu/menu_03_diff.rst new file mode 100644 index 0000000000..31fb748e93 --- /dev/null +++ b/doc/tutorials/menu/menu_03_diff.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_03_diff: + +menu_03.py Diff +------------------------------------- + +.. literalinclude:: menu_03.py + :caption: menu_03.py + :diff: menu_02.py From 742e0d7dcf6fdb611a5492ab64350b0ebc801180 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 5 Mar 2023 04:09:47 +0530 Subject: [PATCH 04/22] Include the tutorial in toctree --- doc/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/index.rst b/doc/index.rst index db89d23893..d27036b573 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -62,6 +62,7 @@ The Python Arcade Library tutorials/compiling_with_nuitka/index tutorials/framebuffer/index tutorials/shader_tutorials + tutorials/menu/index .. image:: images/example_games.svg :alt: Programming guide icon From 0d47ddf830e578af0dc897c0cc4a8ff6cc4b00cb Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 5 Mar 2023 17:47:23 +0530 Subject: [PATCH 05/22] Step 4: Configuring the Menu Buttons --- doc/tutorials/menu/index.rst | 44 ++++++- doc/tutorials/menu/menu_02.py | 9 +- doc/tutorials/menu/menu_03.py | 7 +- doc/tutorials/menu/menu_04.py | 181 ++++++++++++++++++++++++++++ doc/tutorials/menu/menu_04.rst | 10 ++ doc/tutorials/menu/menu_04_diff.rst | 10 ++ 6 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 doc/tutorials/menu/menu_04.py create mode 100644 doc/tutorials/menu/menu_04.rst create mode 100644 doc/tutorials/menu/menu_04_diff.rst diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 6f2c48bd1d..3fc1b7193c 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -65,7 +65,6 @@ Now we have successfully setup the manager, only thing left it to add the button :caption: Initialising the Button :lines: 20-35 - Initialise the Menu View ------------------------ @@ -75,6 +74,13 @@ We make a boiler plate view just like we did in Step-1. :caption: Initialise the Menu View :pyobject: MenuView +Program Listings +~~~~~~~~~~~~~~~~ + +* :ref:`menu_02` |larr| Where we are right now +* :ref:`menu_02_diff` |larr| What we changed to get here + + Step 3: Setting Up the Menu View -------------------------------- @@ -103,3 +109,39 @@ Final code for the `__init__` method after these. .. literalinclude:: menu_03.py :caption: __init__ :pyobject: MenuView.__init__ + +Program Listings +---------------- + +* :ref:`menu_03` |larr| Where we are right now +* :ref:`menu_03_diff` |larr| What we changed to get here + + +Step 4: Configuring the Menu Buttons +------------------------------------ + +We basically add event listener for `on_click` for buttons. + +First we will add the event listener to resume, start_new_game and exit button as they don't have much to explain. + +.. literalinclude:: menu_04.py + :caption: Adding callback for button events 1 + :lines: 91-104 + +Now we need to implement an actual menu for volume and options, for that we have to make a class that acts like a window. Using `UIMouseFilterMixin` we catch all the events happening for the parent and respond nothing to them. Thus making it act like a window/view. + +.. literalinclude:: menu_04.py + :caption: Making a Fake Window. + :pyobject: SubMenu + +We have got ourselves a fake window currently. We could pair it up with the volume and options button to trigger it when they are clicked. + +.. literalinclude:: menu_04.py + :caption: Adding callback for button events 2 + :lines: 106-114 + +Program Listings +---------------- + +* :ref:`menu_04` |larr| Where we are right now +* :ref:`menu_04_diff` |larr| What we changed to get here \ No newline at end of file diff --git a/doc/tutorials/menu/menu_02.py b/doc/tutorials/menu/menu_02.py index 6ef01a4d29..262afe3443 100644 --- a/doc/tutorials/menu/menu_02.py +++ b/doc/tutorials/menu/menu_02.py @@ -22,7 +22,8 @@ def __init__(self): # Initialise the button with an on_click event. @switch_menu_button.event("on_click") def on_click_switch_button(event): - menu_view = MenuView() + # Passing the main view into menu view as an argument. + menu_view = MenuView(self) self.window.show_view(menu_view) # Use the anchor to position the button on the screen. @@ -55,9 +56,13 @@ def on_draw(self): class MenuView(arcade.View): - def __init__(self): + def __init__(self, main_view): super().__init__() + self.manager = arcade.gui.UIManager() + + self.main_view = main_view + def on_hide_view(self): # Disable the UIManager when the view is hidden. self.manager.disable() diff --git a/doc/tutorials/menu/menu_03.py b/doc/tutorials/menu/menu_03.py index 24ad7df89d..89202fbf26 100644 --- a/doc/tutorials/menu/menu_03.py +++ b/doc/tutorials/menu/menu_03.py @@ -22,7 +22,8 @@ def __init__(self): # Initialise the button with an on_click event. @switch_menu_button.event("on_click") def on_click_switch_button(event): - menu_view = MenuView() + # Passing the main view into menu view as an argument. + menu_view = MenuView(self) self.window.show_view(menu_view) # Use the anchor to position the button on the screen. @@ -55,7 +56,7 @@ def on_draw(self): class MenuView(arcade.View): - def __init__(self): + def __init__(self, main_view): super().__init__() self.manager = arcade.gui.UIManager() @@ -85,6 +86,8 @@ def __init__(self): child=self.grid, ) + self.main_view = main_view + def on_hide_view(self): # Disable the UIManager when the view is hidden. self.manager.disable() diff --git a/doc/tutorials/menu/menu_04.py b/doc/tutorials/menu/menu_04.py new file mode 100644 index 0000000000..5942adce0a --- /dev/null +++ b/doc/tutorials/menu/menu_04.py @@ -0,0 +1,181 @@ +""" +Menu. +""" +import arcade +import arcade.gui + +# Screen title and size +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 +SCREEN_TITLE = "Making a Menu" + + +class MainView(arcade.View): + """ Main application class. """ + def __init__(self): + super().__init__() + + self.manager = arcade.gui.UIManager() + + switch_menu_button = arcade.gui.UIFlatButton(text="Pause", width=150) + + # Initialise the button with an on_click event. + @switch_menu_button.event("on_click") + def on_click_switch_button(event): + # Passing the main view into menu view as an argument. + menu_view = MenuView(self) + self.window.show_view(menu_view) + + # Use the anchor to position the button on the screen. + self.anchor = self.manager.add(arcade.gui.UIAnchorLayout()) + + self.anchor.add( + anchor_x="center_x", + anchor_y="center_y", + child=switch_menu_button, + ) + + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + + def on_show_view(self): + """ This is run once when we switch to this view """ + arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) + + # Enable the UIManager when the view is showm. + self.manager.enable() + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + + # Draw the manager. + self.manager.draw() + + +class MenuView(arcade.View): + def __init__(self, main_view): + super().__init__() + + self.manager = arcade.gui.UIManager() + + resume_button = arcade.gui.UIFlatButton(text="Resume", width=150) + start_new_game_button = arcade.gui.UIFlatButton(text="Start New Game", width=150) + volume_button = arcade.gui.UIFlatButton(text="Volume", width=150) + options_button = arcade.gui.UIFlatButton(text="Options", width=150) + + exit_button = arcade.gui.UIFlatButton(text="Exit", width=320) + + # Initialise a grid in which widgets can be arranged. + self.grid = arcade.gui.UIGridLayout(column_count=2, row_count=3, horizontal_spacing=20, vertical_spacing=20) + + # Adding the buttons to the layout. + self.grid.add(resume_button, col_num=0, row_num=0) + self.grid.add(start_new_game_button, col_num=1, row_num=0) + self.grid.add(volume_button, col_num=0, row_num=1) + self.grid.add(options_button, col_num=1, row_num=1) + self.grid.add(exit_button, col_num=0, row_num=2, col_span=2) + + self.anchor = self.manager.add(arcade.gui.UIAnchorLayout()) + + self.anchor.add( + anchor_x="center_x", + anchor_y="center_y", + child=self.grid, + ) + + self.main_view = main_view + + @resume_button.event("on_click") + def on_click_resume_button(event): + # Pass already created view because we are resuming. + self.window.show_view(self.main_view) + + @start_new_game_button.event("on_click") + def on_click_start_new_game_button(event): + # Create a new view because we are starting a new game. + main_view = MainView() + self.window.show_view(main_view) + + @exit_button.event("on_click") + def on_click_exit_button(event): + arcade.exit() + + @volume_button.event("on_click") + def on_click_volume_button(event): + volume_menu = SubMenu() + self.manager.add(volume_menu) + + @options_button.event("on_click") + def on_click_options_button(event): + options_menu = SubMenu() + self.manager.add(options_menu) + + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + + def on_show_view(self): + """ This is run once when we switch to this view """ + + # Makes the background darker + arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) + + # Enable the UIManager when the view is showm. + self.manager.enable() + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + self.manager.draw() + + +class SubMenu(arcade.gui.UIMouseFilterMixin, arcade.gui.UIAnchorLayout): + """Acts like a fake view/window.""" + def __init__(self, ): + super().__init__(size_hint=(1, 1)) + + # Setup frame which will act like the window. + frame = self.add(arcade.gui.UIAnchorLayout(width=300, height=400, size_hint=None)) + frame.with_padding(all=20) + + # Add a background to the window. + frame.with_background(texture=arcade.gui.NinePatchTexture( + left=7, + right=7, + bottom=7, + top=7, + texture=arcade.load_texture( + ":resources:gui_basic_assets/window/grey_panel.png" + ) + )) + + back_button = arcade.gui.UIFlatButton(text="Back", width=250) + # The event listener we used earlier for the button will not work here. + back_button.on_click = self.on_click_back_button + + widget_layout = arcade.gui.UIBoxLayout(spacing=20) + widget_layout.add(back_button) + + frame.add(child=widget_layout, anchor_x="center_x", anchor_y="bottom") + + def on_click_back_button(self, event): + # Removes the widget from the manager. + # After this the manager will respond to its events like it previously did. + self.parent.remove(self) + + +def main(): + """ Main function """ + + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + main_view = MainView() + window.show_view(main_view) + arcade.run() + + +if __name__ == "__main__": + main() diff --git a/doc/tutorials/menu/menu_04.rst b/doc/tutorials/menu/menu_04.rst new file mode 100644 index 0000000000..f4491dfda9 --- /dev/null +++ b/doc/tutorials/menu/menu_04.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_04: + +menu_04.py Full Listing +------------------------------------- + +.. literalinclude:: menu_04.py + :caption: menu_04.py + :linenos: diff --git a/doc/tutorials/menu/menu_04_diff.rst b/doc/tutorials/menu/menu_04_diff.rst new file mode 100644 index 0000000000..03915608c4 --- /dev/null +++ b/doc/tutorials/menu/menu_04_diff.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_04_diff: + +menu_04.py Diff +------------------------------------- + +.. literalinclude:: menu_04.py + :caption: menu_04.py + :diff: menu_04.py From de66a473889062a4fe64ac46c975b174c455503d Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 5 Mar 2023 18:03:53 +0530 Subject: [PATCH 06/22] Small fixes for `index.rst` --- doc/tutorials/menu/index.rst | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 3fc1b7193c..40aa53fd95 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -22,7 +22,7 @@ For this section we will switch the current view of the window to the menu view. Imports -------- +~~~~~~~ First we will import the arcade gui: @@ -32,7 +32,7 @@ First we will import the arcade gui: :emphasize-lines: 2 Modify the MainView -------------------- +~~~~~~~~~~~~~~~~~~~~ We are going to add a button to change the view. For drawing a button we would need a UIManager. @@ -46,7 +46,7 @@ After initialising the manager we need to enable it when the view is shown and d .. literalinclude:: menu_02.py :caption: Enabling the Manager :pyobject: MainView.on_show_view - :emphasize-lines: 3-4 + :emphasize-lines: 5-6 .. literalinclude:: menu_02.py :caption: Disabling the Manager @@ -63,10 +63,10 @@ Now we have successfully setup the manager, only thing left it to add the button .. literalinclude:: menu_02.py :caption: Initialising the Button - :lines: 20-35 + :lines: 20-36 Initialise the Menu View ------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~ We make a boiler plate view just like we did in Step-1. @@ -87,22 +87,22 @@ Step 3: Setting Up the Menu View In this step we will setup the display buttons of the actual menu. Initialising the Buttons ------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~ First we setup buttons for resume, starting a new game, volume, options and exit. .. literalinclude:: menu_03.py :caption: Initialising the Buttons - :lines: 63-68 + :lines: 64-69 Displaying the Buttons in a Grid ---------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ After setting up the buttons we add them to `UIGridLayout`, so that they can displayed in a grid like manner. .. literalinclude:: menu_03.py :caption: Setting up the Grid - :lines: 70-86 + :lines: 71-87 Final code for the `__init__` method after these. @@ -111,7 +111,7 @@ Final code for the `__init__` method after these. :pyobject: MenuView.__init__ Program Listings ----------------- +~~~~~~~~~~~~~~~~ * :ref:`menu_03` |larr| Where we are right now * :ref:`menu_03_diff` |larr| What we changed to get here @@ -122,19 +122,25 @@ Step 4: Configuring the Menu Buttons We basically add event listener for `on_click` for buttons. +Adding `on_click` Callback for Resume, Start New Game and Exit +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + First we will add the event listener to resume, start_new_game and exit button as they don't have much to explain. .. literalinclude:: menu_04.py :caption: Adding callback for button events 1 :lines: 91-104 +Adding `on_click` Callback for Volume and Options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Now we need to implement an actual menu for volume and options, for that we have to make a class that acts like a window. Using `UIMouseFilterMixin` we catch all the events happening for the parent and respond nothing to them. Thus making it act like a window/view. .. literalinclude:: menu_04.py :caption: Making a Fake Window. :pyobject: SubMenu -We have got ourselves a fake window currently. We could pair it up with the volume and options button to trigger it when they are clicked. +We have got ourselves a fake window currently. We now, pair it up with the volume and options button to trigger it when they are clicked. .. literalinclude:: menu_04.py :caption: Adding callback for button events 2 @@ -144,4 +150,4 @@ Program Listings ---------------- * :ref:`menu_04` |larr| Where we are right now -* :ref:`menu_04_diff` |larr| What we changed to get here \ No newline at end of file +* :ref:`menu_04_diff` |larr| What we changed to get here From 88fae56167e71e8a140dfaaf1f405f76871e146a Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Mon, 6 Mar 2023 02:25:49 +0530 Subject: [PATCH 07/22] WIP: Step 5 --- .../toggle/circle_switch_off.png | Bin 0 -> 159 bytes .../toggle/circle_switch_on.png | Bin 0 -> 870 bytes .../window/dark_blue_gray_panel.png | Bin 0 -> 648 bytes doc/conf.py | 12 + doc/tutorials/menu/menu_05.py | 213 ++++++++++++++++++ doc/tutorials/menu/menu_05.rst | 0 doc/tutorials/menu/menu_05_diff.rst | 0 7 files changed, 225 insertions(+) create mode 100644 arcade/resources/gui_basic_assets/toggle/circle_switch_off.png create mode 100644 arcade/resources/gui_basic_assets/toggle/circle_switch_on.png create mode 100644 arcade/resources/gui_basic_assets/window/dark_blue_gray_panel.png create mode 100644 doc/tutorials/menu/menu_05.py create mode 100644 doc/tutorials/menu/menu_05.rst create mode 100644 doc/tutorials/menu/menu_05_diff.rst diff --git a/arcade/resources/gui_basic_assets/toggle/circle_switch_off.png b/arcade/resources/gui_basic_assets/toggle/circle_switch_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd05f251018b5b7f454849e0368aa1adc1255df GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-mSQK*5Dp-y;YjHK^20n`978f1 z-=1&eWKa}1u;Kgn`#)ox3_Oe-cc-Q8WB;?A*)P-Oa>p`3U*%bDCcPO_7flus7Px71 Xge76Zjps5z8yGxY{an^LB{Ts5)9o}l literal 0 HcmV?d00001 diff --git a/arcade/resources/gui_basic_assets/toggle/circle_switch_on.png b/arcade/resources/gui_basic_assets/toggle/circle_switch_on.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9d40a8ed7eaa177ec57da40635865db2ac2cea GIT binary patch literal 870 zcmV-s1DX7ZP);0l z4+gk7SoZdv8{z6c=-=usizkuUpK$gm#3ud^Wme;?Oq$zuaYXg?VzSD`4MY3R9A zSP3h77#{aSceDMrj^>f6A96VrQvx8l4AF0*uWko5{RwHfD zM9f@Plp@>fr47nGVxCYlmldT*cT)k<}%CIYrKNLW^G7Q8D}0G|8hPr-&Yg%X`xY@+p{C zPHmGsDs0O^25=}Q-_3p&f?djpLWb?q;}m6lyDFWGX1EP;I63=cLLA9*fw~2N3@bRY>*G z&q8)lir6OBWrYY*gG%8|D*GW)v}J{CtP4FG$jF%M9T8;IvX>41c20>Gdb0Uv=`Ak* wof4R(H!Ev;F*GQY|2O+uV_hU@tcwJVKXJAW=A`WG9smFU07*qoM6N<$f*LN2b^rhX literal 0 HcmV?d00001 diff --git a/arcade/resources/gui_basic_assets/window/dark_blue_gray_panel.png b/arcade/resources/gui_basic_assets/window/dark_blue_gray_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..89ac84d0931efea4f3b297eba0d76dc818dd83bd GIT binary patch literal 648 zcmeAS@N?(olHy`uVBq!ia0vp^DImEakt zG3V{oja^cK5^WFb@1&)$w7POw`+9AkAZzWpd8NtHtK0Ijb0>2LypA~((=`2o*}Sq# znwdT81Okq68iVhyQ~)mPhQMy|g4E91xW zu+>)&oq1EVbI$eGUk_P|Kd=0kl=f`q%+|yTbE)2EXVX5{78;+{KE3I4iczQE^2_Dt zzyJM}V|JUx@xqF$S>L`)5!<`I#IB_7=Jw~$Q>^Bet^4)&-}AEFe>)|P-u(OF&9`m; z-c{J-t!q1+D8u4-c;|fA_gY(L&%VC-(Ef#sFTdo`a_v8GpF^olA!&FLPMdVB!+}A( z=!Ig%*4u9+*7P`&zSXjDCn$w6c)I$ztaD0e0sxUi3yuH) literal 0 HcmV?d00001 diff --git a/doc/conf.py b/doc/conf.py index 93bb169896..7a5015c877 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -25,6 +25,8 @@ # 'special-members': '__init__', # } +autodoc_default_options = {"members": "add"} + autodoc_inherit_docstrings = False sys.path.insert(0, os.path.abspath('..')) @@ -236,8 +238,18 @@ def post_process(_app, _exception): # traceback.print_exc() # raise +def skip(app, what, name, obj, skip, options): + if skip: + return skip + print(options.inherited_members, name, what, obj.__name__, obj.__module__, skip, obj) + if "arcade.gui.widgets.layout.UIBoxLayout" in str(obj) and 'add' in name: + return False + return True + def setup(app): app.add_css_file("css/custom.css") app.connect('source-read', source_read) app.connect('build-finished', post_process) app.connect("autodoc-process-docstring", warn_undocumented_members) + print("SKIPPING MEMBERS") + app.connect("autodoc-skip-member", skip) diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py new file mode 100644 index 0000000000..ba971f491d --- /dev/null +++ b/doc/tutorials/menu/menu_05.py @@ -0,0 +1,213 @@ +""" +Menu. +""" +import arcade +import arcade.gui + +# Screen title and size +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 +SCREEN_TITLE = "Making a Menu" + + +class MainView(arcade.View): + """ Main application class. """ + def __init__(self): + super().__init__() + + self.manager = arcade.gui.UIManager() + + switch_menu_button = arcade.gui.UIFlatButton(text="Pause", width=150) + + # Initialise the button with an on_click event. + @switch_menu_button.event("on_click") + def on_click_switch_button(event): + # Passing the main view into menu view as an argument. + menu_view = MenuView(self) + self.window.show_view(menu_view) + + # Use the anchor to position the button on the screen. + self.anchor = self.manager.add(arcade.gui.UIAnchorLayout()) + + self.anchor.add( + anchor_x="center_x", + anchor_y="center_y", + child=switch_menu_button, + ) + + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + + def on_show_view(self): + """ This is run once when we switch to this view """ + arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) + + # Enable the UIManager when the view is showm. + self.manager.enable() + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + + # Draw the manager. + self.manager.draw() + + +class MenuView(arcade.View): + def __init__(self, main_view): + super().__init__() + + self.manager = arcade.gui.UIManager() + + resume_button = arcade.gui.UIFlatButton(text="Resume", width=150) + start_new_game_button = arcade.gui.UIFlatButton(text="Start New Game", width=150) + volume_button = arcade.gui.UIFlatButton(text="Volume", width=150) + options_button = arcade.gui.UIFlatButton(text="Options", width=150) + + exit_button = arcade.gui.UIFlatButton(text="Exit", width=320) + + # Initialise a grid in which widgets can be arranged. + self.grid = arcade.gui.UIGridLayout(column_count=2, row_count=3, horizontal_spacing=20, vertical_spacing=20) + + # Adding the buttons to the layout. + self.grid.add(resume_button, col_num=0, row_num=0) + self.grid.add(start_new_game_button, col_num=1, row_num=0) + self.grid.add(volume_button, col_num=0, row_num=1) + self.grid.add(options_button, col_num=1, row_num=1) + self.grid.add(exit_button, col_num=0, row_num=2, col_span=2) + + self.anchor = self.manager.add(arcade.gui.UIAnchorLayout()) + + self.anchor.add( + anchor_x="center_x", + anchor_y="center_y", + child=self.grid, + ) + + self.main_view = main_view + + @resume_button.event("on_click") + def on_click_resume_button(event): + # Pass already created view because we are resuming. + self.window.show_view(self.main_view) + + @start_new_game_button.event("on_click") + def on_click_start_new_game_button(event): + # Create a new view because we are starting a new game. + main_view = MainView() + self.window.show_view(main_view) + + @exit_button.event("on_click") + def on_click_exit_button(event): + arcade.exit() + + @volume_button.event("on_click") + def on_click_volume_button(event): + volume_menu = SubMenu("Volume Menu", "Enable Sound", ["Play: Rock", "Play: Punk", "Play: Pop"], "Adjust Volume") + self.manager.add(volume_menu) + + @options_button.event("on_click") + def on_click_options_button(event): + options_menu = SubMenu("Funny Menu", "Fun?", ["Make Fun", "Enjoy Fun", "Like Fun"], "Adjust Fun") + self.manager.add(options_menu) + + def on_hide_view(self): + # Disable the UIManager when the view is hidden. + self.manager.disable() + + def on_show_view(self): + """ This is run once when we switch to this view """ + + # Makes the background darker + arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) + + # Enable the UIManager when the view is showm. + self.manager.enable() + + def on_draw(self): + """ Render the screen. """ + # Clear the screen + self.clear() + self.manager.draw() + + +class SubMenu(arcade.gui.UIMouseFilterMixin, arcade.gui.UIAnchorLayout): + """Acts like a fake view/window.""" + def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: list[str], slider_label: str): + super().__init__(size_hint=(1, 1)) + + # Setup frame which will act like the window. + frame = self.add(arcade.gui.UIAnchorLayout(width=300, height=400, size_hint=None)) + frame.with_padding(all=20) + + # Add a background to the window. + # Nine patch smoothes the edges. + frame.with_background(texture=arcade.gui.NinePatchTexture( + left=7, + right=7, + bottom=7, + top=7, + texture=arcade.load_texture( + ":resources:gui_basic_assets/window/dark_blue_gray_panel.png" + ) + )) + + back_button = arcade.gui.UIFlatButton(text="Back", width=250) + # The event listener we used earlier for the button will not work here. + back_button.on_click = self.on_click_back_button + + input_text = arcade.gui.UIInputText(text=input_text_default, width=250).with_border() + space_20 = arcade.gui.UISpace(height=20, color=arcade.color.DARK_BLUE_GRAY) + toggle_label = arcade.gui.UILabel(text=toggle_label) + # Load the on-off textures. + on_texture = arcade.load_texture(":resources:gui_basic_assets/toggle/circle_switch_on.png") + off_texture = arcade.load_texture(":resources:gui_basic_assets/toggle/circle_switch_off.png") + + toggle = arcade.gui.UITextureToggle( + on_texture=on_texture, + off_texture=off_texture, + width=20, + height=20 + ) + space_30 = arcade.gui.UISpace(height=30, color=arcade.color.DARK_BLUE_GRAY) + + # The default option is already added in the options list, thats why here we slice. + dropdown = arcade.gui.UIDropdown(default=dropdown_options[0], options=dropdown_options[1:], height=20, width=250) + space_80 = arcade.gui.UISpace(height=80, color=arcade.color.DARK_BLUE_GRAY) + + slider_label = arcade.gui.UILabel(text=slider_label) + slider = arcade.gui.UISlider(value=50, width=250) + + widget_layout = arcade.gui.UIBoxLayout(align="left") + widget_layout.add(input_text) + widget_layout.add(space_20) + widget_layout.add(toggle_label) + widget_layout.add(toggle) + widget_layout.add(space_30) + widget_layout.add(dropdown) + widget_layout.add(space_80) + widget_layout.add(slider_label) + widget_layout.add(slider) + widget_layout.add(back_button) + + frame.add(child=widget_layout, anchor_x="center_x", anchor_y="top") + + def on_click_back_button(self, event): + # Removes the widget from the manager. + # After this the manager will respond to its events like it previously did. + self.parent.remove(self) + + +def main(): + """ Main function """ + + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + main_view = MainView() + window.show_view(main_view) + arcade.run() + + +if __name__ == "__main__": + main() diff --git a/doc/tutorials/menu/menu_05.rst b/doc/tutorials/menu/menu_05.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/doc/tutorials/menu/menu_05_diff.rst b/doc/tutorials/menu/menu_05_diff.rst new file mode 100644 index 0000000000..e69de29bb2 From 9d55da4b2111c559c118428cb3ddb3f6385f89be Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Mon, 6 Mar 2023 04:42:10 +0530 Subject: [PATCH 08/22] Step 5: Finalising the Sub Menu --- arcade/gui/widgets/slider.py | 2 +- doc/tutorials/menu/index.rst | 122 +++++++++++++++++++++++++++- doc/tutorials/menu/menu.gif | Bin 0 -> 53102 bytes doc/tutorials/menu/menu_01.png | Bin 0 -> 5453 bytes doc/tutorials/menu/menu_02.png | Bin 0 -> 6614 bytes doc/tutorials/menu/menu_02.py | 2 +- doc/tutorials/menu/menu_03.png | Bin 0 -> 10971 bytes doc/tutorials/menu/menu_03.py | 2 +- doc/tutorials/menu/menu_04.png | Bin 0 -> 6791 bytes doc/tutorials/menu/menu_04.py | 6 +- doc/tutorials/menu/menu_05.png | Bin 0 -> 11274 bytes doc/tutorials/menu/menu_05.py | 11 ++- doc/tutorials/menu/menu_05.rst | 10 +++ doc/tutorials/menu/menu_05_diff.rst | 10 +++ 14 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 doc/tutorials/menu/menu.gif create mode 100644 doc/tutorials/menu/menu_01.png create mode 100644 doc/tutorials/menu/menu_02.png create mode 100644 doc/tutorials/menu/menu_03.png create mode 100644 doc/tutorials/menu/menu_04.png create mode 100644 doc/tutorials/menu/menu_05.png diff --git a/arcade/gui/widgets/slider.py b/arcade/gui/widgets/slider.py index 8f84e001fd..6667a70a12 100644 --- a/arcade/gui/widgets/slider.py +++ b/arcade/gui/widgets/slider.py @@ -171,7 +171,7 @@ def value_x(self, nx): ) def do_render(self, surface: Surface): - style = self.get_current_style() + style = self.get_current_style() or {} self.prepare_render(surface) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 40aa53fd95..7483604194 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -6,9 +6,17 @@ Making a Menu with Arcade's GUI =============================== +.. image:: menu.gif + :width: 80% + +This tutorial shows how to use most of arcade's gui's widgets. + Step 1: Open a Window --------------------- +.. image:: menu_01.png + :width: 50% + First, let's start a blank window with a view. .. literalinclude:: menu_01.py @@ -18,6 +26,9 @@ First, let's start a blank window with a view. Step 2: Switching to Menu View ------------------------------- +.. image:: menu_02.png + :width: 50% + For this section we will switch the current view of the window to the menu view. @@ -84,6 +95,9 @@ Program Listings Step 3: Setting Up the Menu View -------------------------------- +.. image:: menu_03.png + :width: 50% + In this step we will setup the display buttons of the actual menu. Initialising the Buttons @@ -120,6 +134,9 @@ Program Listings Step 4: Configuring the Menu Buttons ------------------------------------ +.. image:: menu_04.png + :width: 50% + We basically add event listener for `on_click` for buttons. Adding `on_click` Callback for Resume, Start New Game and Exit @@ -147,7 +164,110 @@ We have got ourselves a fake window currently. We now, pair it up with the volum :lines: 106-114 Program Listings ----------------- +~~~~~~~~~~~~~~~~ * :ref:`menu_04` |larr| Where we are right now * :ref:`menu_04_diff` |larr| What we changed to get here + +Step 5: Finalising the Fake Window aka the Sub Menu +--------------------------------------------------- + +.. image:: menu_05.png + :width: 50% + +We finalise the menu or you can call it the last step! + +Editing the Parameters for the Sub Menu +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We will edit the parameters for the sub menu to suit our needs. Will explain later why are those parameters needed. + +.. literalinclude:: menu_05.py + :caption: Editing parameters + :lines: 136-138 + +We also need to change accordingly the places where we have used this class i.e options and volume `on_click` event listener. + +.. literalinclude:: menu_05.py + :caption: Editing arguments + :lines: 106-114 + +Now you might be getting a little idea why we have edited the parameters but follow on to actually know the reason. + + +Adding a Input Field +~~~~~~~~~~~~~~~~~~~~~ + +We will use `UIInputText` to add an input field. The `with_border()` function creates a border around the widget with color(default argument is black) black and thickness(default argument is 2px) 2px. + +.. literalinclude:: menu_05.py + :caption: Adding input field + :lines: 159-164 + :emphasize-lines: 3-6 + +Adding it to the widget layout. + +.. literalinclude:: menu_05.py + :caption: Adding input field to the layout + :lines: 191-193 + +If you paid attention when we defined the `input_text` variable we passed the `text` parameter with our `input_text_default` argument. We basically added those parameters in our sub menu so that it can be used by both volume and options button, with texts respecting their names. We will repeat this again in the last also for those of you who are skipping through this section :P. + +Adding a Toggle Button +~~~~~~~~~~~~~~~~~~~~~~ + +Don't go on the section title much, in arcade the `UITextureToggle` is not really a button it switches between two textures when clicked. Yes, it functions like a button but by "is not really a button" we meant that it doesn't inherits the button class. + +.. literalinclude:: menu_05.py + :caption: Adding toggle button + :lines: 166-177 + +Adding it to the widget layout. + +.. literalinclude:: menu_05.py + :caption: Adding toggle button to the layout + :lines: 191-196 + :emphasize-lines: 3-6 + +Adding a Dropdowm +~~~~~~~~~~~~~~~ + +We add a dropdowm by using `UIDropdown` + +.. literalinclude:: menu_05.py + :caption: Adding dropdown + :lines: 179-181 + +Adding it to the widget layout. + +.. literalinclude:: menu_05.py + :caption: Adding dropdown to the layout + :lines: 197-198 + +Adding a Slider +~~~~~~~~~~~~~~~ + +The final widget. In arcade you can use `UISlider` to implement a slider. Theres a functionality to style the slider, this is also present for `UIFlatButton` and `UITextureButton` + +.. literalinclude:: menu_05.py + :caption: Adding slider + :lines: 183-189 + +Adding it to the widget layout + +.. literalinclude:: menu_05.py + :caption: Adding slider to the layout + :lines: 199-201 + +Finishing touches +~~~~~~~~~~~~~~~~~ + +As we mentioned earlier, to explain the use of those parameters to the class. We basically used them so it can be used by both options and volume as we wanted to have different text for both. +For those who have read the full tutorial line-by-line; 'They will never know'. :D. + + +Program Listings +~~~~~~~~~~~~~~~~ + +* :ref:`menu_05` |larr| Where we are right now +* :ref:`menu_05_diff` |larr| What we changed to get here diff --git a/doc/tutorials/menu/menu.gif b/doc/tutorials/menu/menu.gif new file mode 100644 index 0000000000000000000000000000000000000000..b55afd524600ba477b510362bd8e63df1c0c0518 GIT binary patch literal 53102 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³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 KZ&klWT>TG>v4_Lay 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 C^Q4Uc literal 0 HcmV?d00001 diff --git a/doc/tutorials/menu/menu_02.py b/doc/tutorials/menu/menu_02.py index 262afe3443..177bb23ba1 100644 --- a/doc/tutorials/menu/menu_02.py +++ b/doc/tutorials/menu/menu_02.py @@ -17,7 +17,7 @@ def __init__(self): self.manager = arcade.gui.UIManager() - switch_menu_button = arcade.gui.UIFlatButton(text="Switch to Menu", width=250) + switch_menu_button = arcade.gui.UIFlatButton(text="Pause", width=250) # Initialise the button with an on_click event. @switch_menu_button.event("on_click") diff --git a/doc/tutorials/menu/menu_03.png b/doc/tutorials/menu/menu_03.png new file mode 100644 index 0000000000000000000000000000000000000000..053aa29d76e4030312f732f679299388955646e2 GIT binary patch literal 10971 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 CgOSAm literal 0 HcmV?d00001 diff --git a/doc/tutorials/menu/menu_03.py b/doc/tutorials/menu/menu_03.py index 89202fbf26..0d95ab114c 100644 --- a/doc/tutorials/menu/menu_03.py +++ b/doc/tutorials/menu/menu_03.py @@ -66,7 +66,7 @@ def __init__(self, main_view): volume = arcade.gui.UIFlatButton(text="Volume", width=150) options = arcade.gui.UIFlatButton(text="Options", width=150) - exit = arcade.gui.UIFlatButton(text="Exit", width=300) + exit = arcade.gui.UIFlatButton(text="Exit", width=320) # Initialise a grid in which widgets can be arranged. self.grid = arcade.gui.UIGridLayout(column_count=2, row_count=3, horizontal_spacing=20, vertical_spacing=20) diff --git a/doc/tutorials/menu/menu_04.png b/doc/tutorials/menu/menu_04.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2b2fbc7dc1bd7ec1915b3ba215d9eea69c75a4 GIT binary patch literal 6791 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/menu/menu_04.py b/doc/tutorials/menu/menu_04.py index 5942adce0a..921361a5dd 100644 --- a/doc/tutorials/menu/menu_04.py +++ b/doc/tutorials/menu/menu_04.py @@ -149,7 +149,7 @@ def __init__(self, ): bottom=7, top=7, texture=arcade.load_texture( - ":resources:gui_basic_assets/window/grey_panel.png" + ":resources:gui_basic_assets/window/dark_blue_gray_panel.png" ) )) @@ -157,10 +157,10 @@ def __init__(self, ): # The event listener we used earlier for the button will not work here. back_button.on_click = self.on_click_back_button - widget_layout = arcade.gui.UIBoxLayout(spacing=20) + widget_layout = arcade.gui.UIBoxLayout(align="left") widget_layout.add(back_button) - frame.add(child=widget_layout, anchor_x="center_x", anchor_y="bottom") + frame.add(child=widget_layout, anchor_x="center_x", anchor_y="top") def on_click_back_button(self, event): # Removes the widget from the manager. diff --git a/doc/tutorials/menu/menu_05.png b/doc/tutorials/menu/menu_05.png new file mode 100644 index 0000000000000000000000000000000000000000..ba7eb3985ba98515d5c948b5f0b944661232ae24 GIT binary patch literal 11274 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py index ba971f491d..d789869f27 100644 --- a/doc/tutorials/menu/menu_05.py +++ b/doc/tutorials/menu/menu_05.py @@ -159,7 +159,10 @@ def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: back_button.on_click = self.on_click_back_button input_text = arcade.gui.UIInputText(text=input_text_default, width=250).with_border() + # Adds a widget of the color DARK_BLUE_GRAY with height to separate the widgets + # Its another method for adding space between widgets in a layout. space_20 = arcade.gui.UISpace(height=20, color=arcade.color.DARK_BLUE_GRAY) + toggle_label = arcade.gui.UILabel(text=toggle_label) # Load the on-off textures. on_texture = arcade.load_texture(":resources:gui_basic_assets/toggle/circle_switch_on.png") @@ -178,7 +181,12 @@ def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: space_80 = arcade.gui.UISpace(height=80, color=arcade.color.DARK_BLUE_GRAY) slider_label = arcade.gui.UILabel(text=slider_label) - slider = arcade.gui.UISlider(value=50, width=250) + pressed_style = arcade.gui.UISlider.UIStyle(filled_bar=arcade.color.GREEN, unfilled_bar=arcade.color.RED) + default_style = arcade.gui.UISlider.UIStyle() + style_dict = {"press": pressed_style, "normal": default_style, "hovered": default_style, "disabled": default_style} + # Configuring the styles is optional. + slider = arcade.gui.UISlider(value=50, width=250, style=style_dict) + space_70 = arcade.gui.UISpace(height=70, color=arcade.color.DARK_BLUE_GRAY) widget_layout = arcade.gui.UIBoxLayout(align="left") widget_layout.add(input_text) @@ -190,6 +198,7 @@ def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: widget_layout.add(space_80) widget_layout.add(slider_label) widget_layout.add(slider) + widget_layout.add(space_70) widget_layout.add(back_button) frame.add(child=widget_layout, anchor_x="center_x", anchor_y="top") diff --git a/doc/tutorials/menu/menu_05.rst b/doc/tutorials/menu/menu_05.rst index e69de29bb2..faab4a0091 100644 --- a/doc/tutorials/menu/menu_05.rst +++ b/doc/tutorials/menu/menu_05.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_05: + +menu_05.py Full Listing +------------------------------------- + +.. literalinclude:: menu_05.py + :caption: menu_05.py + :linenos: diff --git a/doc/tutorials/menu/menu_05_diff.rst b/doc/tutorials/menu/menu_05_diff.rst index e69de29bb2..1a5846b54c 100644 --- a/doc/tutorials/menu/menu_05_diff.rst +++ b/doc/tutorials/menu/menu_05_diff.rst @@ -0,0 +1,10 @@ +:orphan: + +.. _menu_05_diff: + +menu_05.py Diff +------------------------------------- + +.. literalinclude:: menu_05.py + :caption: menu_05.py + :diff: menu_04.py From 67f3ede852fdef47601375f11f04c745e5aded39 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Mon, 6 Mar 2023 04:46:29 +0530 Subject: [PATCH 09/22] Revert change to slider.py Will make another pr for it --- arcade/gui/widgets/slider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arcade/gui/widgets/slider.py b/arcade/gui/widgets/slider.py index 6667a70a12..8f84e001fd 100644 --- a/arcade/gui/widgets/slider.py +++ b/arcade/gui/widgets/slider.py @@ -171,7 +171,7 @@ def value_x(self, nx): ) def do_render(self, surface: Surface): - style = self.get_current_style() or {} + style = self.get_current_style() self.prepare_render(surface) From c95a37b3e2762b9b705cc2f3ece210934f551aba Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Mon, 6 Mar 2023 04:58:11 +0530 Subject: [PATCH 10/22] Revert changes to conf.py Will make another pr for this --- doc/conf.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 7a5015c877..93bb169896 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -25,8 +25,6 @@ # 'special-members': '__init__', # } -autodoc_default_options = {"members": "add"} - autodoc_inherit_docstrings = False sys.path.insert(0, os.path.abspath('..')) @@ -238,18 +236,8 @@ def post_process(_app, _exception): # traceback.print_exc() # raise -def skip(app, what, name, obj, skip, options): - if skip: - return skip - print(options.inherited_members, name, what, obj.__name__, obj.__module__, skip, obj) - if "arcade.gui.widgets.layout.UIBoxLayout" in str(obj) and 'add' in name: - return False - return True - def setup(app): app.add_css_file("css/custom.css") app.connect('source-read', source_read) app.connect('build-finished', post_process) app.connect("autodoc-process-docstring", warn_undocumented_members) - print("SKIPPING MEMBERS") - app.connect("autodoc-skip-member", skip) From 729920cbd1879795df291503d58b95c18d38f212 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Mon, 6 Mar 2023 05:01:13 +0530 Subject: [PATCH 11/22] Fix underline too short --- doc/tutorials/menu/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 7483604194..622e4e7f21 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -230,7 +230,7 @@ Adding it to the widget layout. :emphasize-lines: 3-6 Adding a Dropdowm -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~ We add a dropdowm by using `UIDropdown` From 5bfe103de0bec46c9de18c6f21a6ac41fd7b9c54 Mon Sep 17 00:00:00 2001 From: Mohammad Ibrahim <74553450+Ibrahim2750mi@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:29:06 +0530 Subject: [PATCH 12/22] Eryvanos's suggestion for UISlider wrong usage --- doc/tutorials/menu/menu_05.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py index d789869f27..f1ffb5c4e1 100644 --- a/doc/tutorials/menu/menu_05.py +++ b/doc/tutorials/menu/menu_05.py @@ -183,7 +183,7 @@ def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: slider_label = arcade.gui.UILabel(text=slider_label) pressed_style = arcade.gui.UISlider.UIStyle(filled_bar=arcade.color.GREEN, unfilled_bar=arcade.color.RED) default_style = arcade.gui.UISlider.UIStyle() - style_dict = {"press": pressed_style, "normal": default_style, "hovered": default_style, "disabled": default_style} + style_dict = {"press": pressed_style, "normal": default_style, "hover": default_style, "disabled": default_style} # Configuring the styles is optional. slider = arcade.gui.UISlider(value=50, width=250, style=style_dict) space_70 = arcade.gui.UISpace(height=70, color=arcade.color.DARK_BLUE_GRAY) From a730dfc30358608995e0fb64305140913beac2d4 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Tue, 7 Mar 2023 03:02:42 +0530 Subject: [PATCH 13/22] Fixed some punctuation and comments --- arcade/gui/widgets/dropdown.py | 6 ++++++ doc/tutorials/menu/index.rst | 14 +++++++------- doc/tutorials/menu/menu_04.py | 1 + doc/tutorials/menu/menu_05.py | 4 ++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/arcade/gui/widgets/dropdown.py b/arcade/gui/widgets/dropdown.py index bda9f11854..20020a942d 100644 --- a/arcade/gui/widgets/dropdown.py +++ b/arcade/gui/widgets/dropdown.py @@ -125,6 +125,12 @@ def _update_options(self): def _on_button_click(self, event: UIOnClickEvent): self._layout.visible = not self._layout.visible + if self.parent: + print(self.parent) + self.parent._update_size_hints() + self.parent.do_layout() + self.parent.trigger_render() + def _on_option_click(self, event: UIOnClickEvent): source: UIFlatButton = event.source diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 622e4e7f21..0210c5c4a8 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -70,7 +70,7 @@ We also need to draw the childrens of the menu in `on_draw`. :pyobject: MainView.on_draw :emphasize-lines: 6-7 -Now we have successfully setup the manager, only thing left it to add the button. We are using `UIAnchorLayout` to position the button. +Now we have successfully setup the manager, only thing left it to add the button. We are using `UIAnchorLayout` to position the button. We also setup a function which is called when the button is clicked. .. literalinclude:: menu_02.py :caption: Initialising the Button @@ -79,7 +79,7 @@ Now we have successfully setup the manager, only thing left it to add the button Initialise the Menu View ~~~~~~~~~~~~~~~~~~~~~~~~ -We make a boiler plate view just like we did in Step-1. +We make a boiler plate view just like we did in Step-1 for switiching the view when the pause button is clicked. .. literalinclude:: menu_02.py :caption: Initialise the Menu View @@ -98,7 +98,7 @@ Step 3: Setting Up the Menu View .. image:: menu_03.png :width: 50% -In this step we will setup the display buttons of the actual menu. +In this step we will setup the display buttons of the actual menu. The code written in this section is written for `MenuView` Initialising the Buttons ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -232,11 +232,11 @@ Adding it to the widget layout. Adding a Dropdowm ~~~~~~~~~~~~~~~~~ -We add a dropdowm by using `UIDropdown` +We add a dropdowm by using `UIDropdown`. .. literalinclude:: menu_05.py :caption: Adding dropdown - :lines: 179-181 + :lines: 180-182 Adding it to the widget layout. @@ -247,13 +247,13 @@ Adding it to the widget layout. Adding a Slider ~~~~~~~~~~~~~~~ -The final widget. In arcade you can use `UISlider` to implement a slider. Theres a functionality to style the slider, this is also present for `UIFlatButton` and `UITextureButton` +The final widget. In arcade you can use `UISlider` to implement a slider. Theres a functionality to style the slider, this is also present for `UIFlatButton` and `UITextureButton`. .. literalinclude:: menu_05.py :caption: Adding slider :lines: 183-189 -Adding it to the widget layout +Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding slider to the layout diff --git a/doc/tutorials/menu/menu_04.py b/doc/tutorials/menu/menu_04.py index 921361a5dd..8c9e27d5c2 100644 --- a/doc/tutorials/menu/menu_04.py +++ b/doc/tutorials/menu/menu_04.py @@ -157,6 +157,7 @@ def __init__(self, ): # The event listener we used earlier for the button will not work here. back_button.on_click = self.on_click_back_button + # Internal widget layout to handle widgets in this class. widget_layout = arcade.gui.UIBoxLayout(align="left") widget_layout.add(back_button) diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py index f1ffb5c4e1..76bdf74306 100644 --- a/doc/tutorials/menu/menu_05.py +++ b/doc/tutorials/menu/menu_05.py @@ -176,8 +176,7 @@ def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: ) space_30 = arcade.gui.UISpace(height=30, color=arcade.color.DARK_BLUE_GRAY) - # The default option is already added in the options list, thats why here we slice. - dropdown = arcade.gui.UIDropdown(default=dropdown_options[0], options=dropdown_options[1:], height=20, width=250) + dropdown = arcade.gui.UIDropdown(default=dropdown_options[0], options=dropdown_options, height=20, width=250) space_80 = arcade.gui.UISpace(height=80, color=arcade.color.DARK_BLUE_GRAY) slider_label = arcade.gui.UILabel(text=slider_label) @@ -188,6 +187,7 @@ def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: slider = arcade.gui.UISlider(value=50, width=250, style=style_dict) space_70 = arcade.gui.UISpace(height=70, color=arcade.color.DARK_BLUE_GRAY) + # Internal widget layout to handle widgets in this class. widget_layout = arcade.gui.UIBoxLayout(align="left") widget_layout.add(input_text) widget_layout.add(space_20) From 0121abbbaaf043f99fb880eeff4ebf4395108810 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Tue, 7 Mar 2023 03:08:42 +0530 Subject: [PATCH 14/22] Fix inline codeblocks --- doc/tutorials/menu/index.rst | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 0210c5c4a8..4bcb32bc79 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -45,7 +45,7 @@ First we will import the arcade gui: Modify the MainView ~~~~~~~~~~~~~~~~~~~~ -We are going to add a button to change the view. For drawing a button we would need a UIManager. +We are going to add a button to change the view. For drawing a button we would need a ``UIManager``. .. literalinclude:: menu_02.py :caption: Intialising the Manager @@ -63,14 +63,14 @@ After initialising the manager we need to enable it when the view is shown and d :caption: Disabling the Manager :pyobject: MainView.on_hide_view -We also need to draw the childrens of the menu in `on_draw`. +We also need to draw the childrens of the menu in ``on_draw``. .. literalinclude:: menu_02.py :caption: Drawing Children's of the Manager :pyobject: MainView.on_draw :emphasize-lines: 6-7 -Now we have successfully setup the manager, only thing left it to add the button. We are using `UIAnchorLayout` to position the button. We also setup a function which is called when the button is clicked. +Now we have successfully setup the manager, only thing left it to add the button. We are using ``UIAnchorLayout`` to position the button. We also setup a function which is called when the button is clicked. .. literalinclude:: menu_02.py :caption: Initialising the Button @@ -98,7 +98,7 @@ Step 3: Setting Up the Menu View .. image:: menu_03.png :width: 50% -In this step we will setup the display buttons of the actual menu. The code written in this section is written for `MenuView` +In this step we will setup the display buttons of the actual menu. The code written in this section is written for ``MenuView`` Initialising the Buttons ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -112,13 +112,13 @@ First we setup buttons for resume, starting a new game, volume, options and exit Displaying the Buttons in a Grid ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -After setting up the buttons we add them to `UIGridLayout`, so that they can displayed in a grid like manner. +After setting up the buttons we add them to ``UIGridLayout``, so that they can displayed in a grid like manner. .. literalinclude:: menu_03.py :caption: Setting up the Grid :lines: 71-87 -Final code for the `__init__` method after these. +Final code for the ``__init__`` method after these. .. literalinclude:: menu_03.py :caption: __init__ @@ -137,9 +137,9 @@ Step 4: Configuring the Menu Buttons .. image:: menu_04.png :width: 50% -We basically add event listener for `on_click` for buttons. +We basically add event listener for ``on_click`` for buttons. -Adding `on_click` Callback for Resume, Start New Game and Exit +Adding ``on_click`` Callback for Resume, Start New Game and Exit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ First we will add the event listener to resume, start_new_game and exit button as they don't have much to explain. @@ -148,10 +148,10 @@ First we will add the event listener to resume, start_new_game and exit button a :caption: Adding callback for button events 1 :lines: 91-104 -Adding `on_click` Callback for Volume and Options +Adding ``on_click` Callback for Volume and Options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Now we need to implement an actual menu for volume and options, for that we have to make a class that acts like a window. Using `UIMouseFilterMixin` we catch all the events happening for the parent and respond nothing to them. Thus making it act like a window/view. +Now we need to implement an actual menu for volume and options, for that we have to make a class that acts like a window. Using ``UIMouseFilterMixin`` we catch all the events happening for the parent and respond nothing to them. Thus making it act like a window/view. .. literalinclude:: menu_04.py :caption: Making a Fake Window. @@ -186,7 +186,7 @@ We will edit the parameters for the sub menu to suit our needs. Will explain lat :caption: Editing parameters :lines: 136-138 -We also need to change accordingly the places where we have used this class i.e options and volume `on_click` event listener. +We also need to change accordingly the places where we have used this class i.e options and volume ``on_click`` event listener. .. literalinclude:: menu_05.py :caption: Editing arguments @@ -198,7 +198,7 @@ Now you might be getting a little idea why we have edited the parameters but fol Adding a Input Field ~~~~~~~~~~~~~~~~~~~~~ -We will use `UIInputText` to add an input field. The `with_border()` function creates a border around the widget with color(default argument is black) black and thickness(default argument is 2px) 2px. +We will use ``UIInputText`` to add an input field. The ``with_border()`` function creates a border around the widget with color(default argument is black) black and thickness(default argument is 2px) 2px. .. literalinclude:: menu_05.py :caption: Adding input field @@ -211,12 +211,12 @@ Adding it to the widget layout. :caption: Adding input field to the layout :lines: 191-193 -If you paid attention when we defined the `input_text` variable we passed the `text` parameter with our `input_text_default` argument. We basically added those parameters in our sub menu so that it can be used by both volume and options button, with texts respecting their names. We will repeat this again in the last also for those of you who are skipping through this section :P. +If you paid attention when we defined the ``input_text`` variable we passed the ``text`` parameter with our ``input_text_default`` argument. We basically added those parameters in our sub menu so that it can be used by both volume and options button, with texts respecting their names. We will repeat this again in the last also for those of you who are skipping through this section :P. Adding a Toggle Button ~~~~~~~~~~~~~~~~~~~~~~ -Don't go on the section title much, in arcade the `UITextureToggle` is not really a button it switches between two textures when clicked. Yes, it functions like a button but by "is not really a button" we meant that it doesn't inherits the button class. +Don't go on the section title much, in arcade the ``UITextureToggle`` is not really a button it switches between two textures when clicked. Yes, it functions like a button but by "is not really a button" we meant that it doesn't inherits the button class. .. literalinclude:: menu_05.py :caption: Adding toggle button @@ -232,7 +232,7 @@ Adding it to the widget layout. Adding a Dropdowm ~~~~~~~~~~~~~~~~~ -We add a dropdowm by using `UIDropdown`. +We add a dropdowm by using ``UIDropdown``. .. literalinclude:: menu_05.py :caption: Adding dropdown @@ -247,7 +247,7 @@ Adding it to the widget layout. Adding a Slider ~~~~~~~~~~~~~~~ -The final widget. In arcade you can use `UISlider` to implement a slider. Theres a functionality to style the slider, this is also present for `UIFlatButton` and `UITextureButton`. +The final widget. In arcade you can use ``UISlider`` to implement a slider. Theres a functionality to style the slider, this is also present for ``UIFlatButton`` and ``UITextureButton``. .. literalinclude:: menu_05.py :caption: Adding slider From e599ee1bcacbd5e60e94088f926ae08de4afcd37 Mon Sep 17 00:00:00 2001 From: Mohammad Ibrahim <74553450+Ibrahim2750mi@users.noreply.github.com> Date: Tue, 7 Mar 2023 03:13:15 +0530 Subject: [PATCH 15/22] Revert changes to dropdown.py Eruvanos is already fixing it. --- arcade/gui/widgets/dropdown.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/arcade/gui/widgets/dropdown.py b/arcade/gui/widgets/dropdown.py index 20020a942d..bda9f11854 100644 --- a/arcade/gui/widgets/dropdown.py +++ b/arcade/gui/widgets/dropdown.py @@ -125,12 +125,6 @@ def _update_options(self): def _on_button_click(self, event: UIOnClickEvent): self._layout.visible = not self._layout.visible - if self.parent: - print(self.parent) - self.parent._update_size_hints() - self.parent.do_layout() - self.parent.trigger_render() - def _on_option_click(self, event: UIOnClickEvent): source: UIFlatButton = event.source From 1bd3bc6a2ac8d316a733567c0f965f6398591aa4 Mon Sep 17 00:00:00 2001 From: Mohammad Ibrahim <74553450+Ibrahim2750mi@users.noreply.github.com> Date: Tue, 7 Mar 2023 03:18:09 +0530 Subject: [PATCH 16/22] Fix underline too short warning --- doc/tutorials/menu/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 4bcb32bc79..584fc00ae7 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -140,7 +140,7 @@ Step 4: Configuring the Menu Buttons We basically add event listener for ``on_click`` for buttons. Adding ``on_click`` Callback for Resume, Start New Game and Exit -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ First we will add the event listener to resume, start_new_game and exit button as they don't have much to explain. From c6c16773ab02d46a34de440e8fe7615ffd6724be Mon Sep 17 00:00:00 2001 From: Mohammad Ibrahim <74553450+Ibrahim2750mi@users.noreply.github.com> Date: Tue, 7 Mar 2023 03:23:26 +0530 Subject: [PATCH 17/22] Fix missing end backtick --- doc/tutorials/menu/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 584fc00ae7..d12383c27d 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -148,8 +148,8 @@ First we will add the event listener to resume, start_new_game and exit button a :caption: Adding callback for button events 1 :lines: 91-104 -Adding ``on_click` Callback for Volume and Options -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Adding ``on_click`` Callback for Volume and Options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Now we need to implement an actual menu for volume and options, for that we have to make a class that acts like a window. Using ``UIMouseFilterMixin`` we catch all the events happening for the parent and respond nothing to them. Thus making it act like a window/view. From 7b43facf4409019847b23326f27558ef8598a088 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sat, 11 Mar 2023 20:01:43 +0530 Subject: [PATCH 18/22] Add Eruvanos's fixes --- doc/tutorials/menu/index.rst | 60 ++++++++++++++++---------- doc/tutorials/menu/menu_01.py | 5 ++- doc/tutorials/menu/menu_02.py | 7 ++- doc/tutorials/menu/menu_03.py | 9 ++-- doc/tutorials/menu/menu_04.py | 25 ++++++++--- doc/tutorials/menu/menu_05.py | 80 +++++++++++++++++++++-------------- 6 files changed, 118 insertions(+), 68 deletions(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index d12383c27d..c4bf85cb51 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -49,7 +49,7 @@ We are going to add a button to change the view. For drawing a button we would n .. literalinclude:: menu_02.py :caption: Intialising the Manager - :lines: 15-18 + :lines: 16-19 :emphasize-lines: 4 After initialising the manager we need to enable it when the view is shown and disable it when the view is hiddien. @@ -74,7 +74,7 @@ Now we have successfully setup the manager, only thing left it to add the button .. literalinclude:: menu_02.py :caption: Initialising the Button - :lines: 20-36 + :lines: 21-37 Initialise the Menu View ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -107,7 +107,7 @@ First we setup buttons for resume, starting a new game, volume, options and exit .. literalinclude:: menu_03.py :caption: Initialising the Buttons - :lines: 64-69 + :lines: 67-72 Displaying the Buttons in a Grid ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -116,7 +116,7 @@ After setting up the buttons we add them to ``UIGridLayout``, so that they can d .. literalinclude:: menu_03.py :caption: Setting up the Grid - :lines: 71-87 + :lines: 74-90 Final code for the ``__init__`` method after these. @@ -146,7 +146,7 @@ First we will add the event listener to resume, start_new_game and exit button a .. literalinclude:: menu_04.py :caption: Adding callback for button events 1 - :lines: 91-104 + :lines: 94-107 Adding ``on_click`` Callback for Volume and Options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -161,7 +161,7 @@ We have got ourselves a fake window currently. We now, pair it up with the volum .. literalinclude:: menu_04.py :caption: Adding callback for button events 2 - :lines: 106-114 + :lines: 109-123 Program Listings ~~~~~~~~~~~~~~~~ @@ -184,50 +184,65 @@ We will edit the parameters for the sub menu to suit our needs. Will explain lat .. literalinclude:: menu_05.py :caption: Editing parameters - :lines: 136-138 + :lines: 153-156 -We also need to change accordingly the places where we have used this class i.e options and volume ``on_click`` event listener. +We also need to change accordingly the places where we have used this class i.e options and volume ``on_click`` event listener. The layer parameter being set 1, means that this layer is always drawn on top i.e its the first layer. .. literalinclude:: menu_05.py :caption: Editing arguments - :lines: 106-114 + :lines: 109-131 Now you might be getting a little idea why we have edited the parameters but follow on to actually know the reason. +Adding a Title label +-------------------- + +We will be adding a ``UILabel`` that explains the menu. ``UISpace`` is a widget that can be used to add space around some widget, you can set its color to the background color so it appears invisible. + +.. literalinclude:: menu_05.py + :caption: Adding title label + :lines: 179-181 + +Adding it to the widget layout. + +.. literalinclude:: menu_05.py + :caption: Adding title label to the layout + :lines: 209-211 + + Adding a Input Field ~~~~~~~~~~~~~~~~~~~~~ -We will use ``UIInputText`` to add an input field. The ``with_border()`` function creates a border around the widget with color(default argument is black) black and thickness(default argument is 2px) 2px. +We will use ``UIInputText`` to add an input field. The ``with_border()`` function creates a border around the widget with color(default argument is black) black and thickness(default argument is 2px) 2px. Add this just below the title label. .. literalinclude:: menu_05.py :caption: Adding input field - :lines: 159-164 - :emphasize-lines: 3-6 + :lines: 183 Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding input field to the layout - :lines: 191-193 + :lines: 209-212 + :emphasize-lines: 4 If you paid attention when we defined the ``input_text`` variable we passed the ``text`` parameter with our ``input_text_default`` argument. We basically added those parameters in our sub menu so that it can be used by both volume and options button, with texts respecting their names. We will repeat this again in the last also for those of you who are skipping through this section :P. Adding a Toggle Button ~~~~~~~~~~~~~~~~~~~~~~ -Don't go on the section title much, in arcade the ``UITextureToggle`` is not really a button it switches between two textures when clicked. Yes, it functions like a button but by "is not really a button" we meant that it doesn't inherits the button class. +Don't go on the section title much, in arcade the ``UITextureToggle`` is not really a button it switches between two textures when clicked. Yes, it functions like a button but by "is not really a button" we meant that it doesn't inherits the button class. We also pair it up horizontally with the toggle label. .. literalinclude:: menu_05.py :caption: Adding toggle button - :lines: 166-177 + :lines: 189-201 -Adding it to the widget layout. +Adding it to the widget layout. Add this line after you have added the input field. .. literalinclude:: menu_05.py :caption: Adding toggle button to the layout - :lines: 191-196 - :emphasize-lines: 3-6 + :lines: 213 Adding a Dropdowm ~~~~~~~~~~~~~~~~~ @@ -236,13 +251,13 @@ We add a dropdowm by using ``UIDropdown``. .. literalinclude:: menu_05.py :caption: Adding dropdown - :lines: 180-182 + :lines: 203-204 Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding dropdown to the layout - :lines: 197-198 + :lines: 214 Adding a Slider ~~~~~~~~~~~~~~~ @@ -251,19 +266,20 @@ The final widget. In arcade you can use ``UISlider`` to implement a slider. Ther .. literalinclude:: menu_05.py :caption: Adding slider - :lines: 183-189 + :lines: 206-207 Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding slider to the layout - :lines: 199-201 + :lines: 215-216 Finishing touches ~~~~~~~~~~~~~~~~~ As we mentioned earlier, to explain the use of those parameters to the class. We basically used them so it can be used by both options and volume as we wanted to have different text for both. For those who have read the full tutorial line-by-line; 'They will never know'. :D. +We also recommend to see the full code for this section. Program Listings diff --git a/doc/tutorials/menu/menu_01.py b/doc/tutorials/menu/menu_01.py index bffb9855bb..1fb933b65f 100644 --- a/doc/tutorials/menu/menu_01.py +++ b/doc/tutorials/menu/menu_01.py @@ -10,7 +10,8 @@ class MainView(arcade.View): - """ Main application class. """ + """ Main application class.""" + def __init__(self): super().__init__() @@ -27,7 +28,7 @@ def on_draw(self): def main(): """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) arcade.run() diff --git a/doc/tutorials/menu/menu_02.py b/doc/tutorials/menu/menu_02.py index 177bb23ba1..91fbb9f27f 100644 --- a/doc/tutorials/menu/menu_02.py +++ b/doc/tutorials/menu/menu_02.py @@ -12,6 +12,7 @@ class MainView(arcade.View): """ Main application class. """ + def __init__(self): super().__init__() @@ -43,7 +44,7 @@ def on_show_view(self): """ This is run once when we switch to this view """ arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) - # Enable the UIManager when the view is showm. + # Enable the UIManager when the view is showm. self.manager.enable() def on_draw(self): @@ -56,6 +57,8 @@ def on_draw(self): class MenuView(arcade.View): + """Main menu view class.""" + def __init__(self, main_view): super().__init__() @@ -86,7 +89,7 @@ def on_draw(self): def main(): """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) arcade.run() diff --git a/doc/tutorials/menu/menu_03.py b/doc/tutorials/menu/menu_03.py index 0d95ab114c..85f243be32 100644 --- a/doc/tutorials/menu/menu_03.py +++ b/doc/tutorials/menu/menu_03.py @@ -12,6 +12,7 @@ class MainView(arcade.View): """ Main application class. """ + def __init__(self): super().__init__() @@ -43,7 +44,7 @@ def on_show_view(self): """ This is run once when we switch to this view """ arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) - # Enable the UIManager when the view is showm. + # Enable the UIManager when the view is showm. self.manager.enable() def on_draw(self): @@ -56,6 +57,8 @@ def on_draw(self): class MenuView(arcade.View): + """Main menu view class.""" + def __init__(self, main_view): super().__init__() @@ -98,7 +101,7 @@ def on_show_view(self): # Makes the background darker arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) - # Enable the UIManager when the view is showm. + # Enable the UIManager when the view is showm. self.manager.enable() def on_draw(self): @@ -111,7 +114,7 @@ def on_draw(self): def main(): """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) arcade.run() diff --git a/doc/tutorials/menu/menu_04.py b/doc/tutorials/menu/menu_04.py index 8c9e27d5c2..d6b8ad0a1c 100644 --- a/doc/tutorials/menu/menu_04.py +++ b/doc/tutorials/menu/menu_04.py @@ -12,6 +12,7 @@ class MainView(arcade.View): """ Main application class. """ + def __init__(self): super().__init__() @@ -43,7 +44,7 @@ def on_show_view(self): """ This is run once when we switch to this view """ arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) - # Enable the UIManager when the view is showm. + # Enable the UIManager when the view is showm. self.manager.enable() def on_draw(self): @@ -56,6 +57,8 @@ def on_draw(self): class MenuView(arcade.View): + """Main menu view class.""" + def __init__(self, main_view): super().__init__() @@ -106,12 +109,18 @@ def on_click_exit_button(event): @volume_button.event("on_click") def on_click_volume_button(event): volume_menu = SubMenu() - self.manager.add(volume_menu) + self.manager.add( + volume_menu, + layer=1 + ) @options_button.event("on_click") def on_click_options_button(event): options_menu = SubMenu() - self.manager.add(options_menu) + self.manager.add( + options_menu, + layer=1 + ) def on_hide_view(self): # Disable the UIManager when the view is hidden. @@ -123,7 +132,7 @@ def on_show_view(self): # Makes the background darker arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) - # Enable the UIManager when the view is showm. + # Enable the UIManager when the view is showm. self.manager.enable() def on_draw(self): @@ -135,6 +144,7 @@ def on_draw(self): class SubMenu(arcade.gui.UIMouseFilterMixin, arcade.gui.UIAnchorLayout): """Acts like a fake view/window.""" + def __init__(self, ): super().__init__(size_hint=(1, 1)) @@ -154,11 +164,12 @@ def __init__(self, ): )) back_button = arcade.gui.UIFlatButton(text="Back", width=250) - # The event listener we used earlier for the button will not work here. + # The type of event listener we used earlier for the button will not work here. back_button.on_click = self.on_click_back_button # Internal widget layout to handle widgets in this class. - widget_layout = arcade.gui.UIBoxLayout(align="left") + widget_layout = arcade.gui.UIBoxLayout(align="left", space_between=10) + widget_layout.add(back_button) frame.add(child=widget_layout, anchor_x="center_x", anchor_y="top") @@ -172,7 +183,7 @@ def on_click_back_button(self, event): def main(): """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) arcade.run() diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py index 76bdf74306..aee14ca8a9 100644 --- a/doc/tutorials/menu/menu_05.py +++ b/doc/tutorials/menu/menu_05.py @@ -12,6 +12,7 @@ class MainView(arcade.View): """ Main application class. """ + def __init__(self): super().__init__() @@ -43,7 +44,7 @@ def on_show_view(self): """ This is run once when we switch to this view """ arcade.set_background_color(arcade.color.DARK_BLUE_GRAY) - # Enable the UIManager when the view is showm. + # Enable the UIManager when the view is showm. self.manager.enable() def on_draw(self): @@ -56,6 +57,8 @@ def on_draw(self): class MenuView(arcade.View): + """Main menu view class.""" + def __init__(self, main_view): super().__init__() @@ -105,13 +108,27 @@ def on_click_exit_button(event): @volume_button.event("on_click") def on_click_volume_button(event): - volume_menu = SubMenu("Volume Menu", "Enable Sound", ["Play: Rock", "Play: Punk", "Play: Pop"], "Adjust Volume") - self.manager.add(volume_menu) + volume_menu = SubMenu( + "Volume Menu", "How do you like your volume?", "Enable Sound", + ["Play: Rock", "Play: Punk", "Play: Pop"], + "Adjust Volume", + ) + self.manager.add( + volume_menu, + layer=1 + ) @options_button.event("on_click") def on_click_options_button(event): - options_menu = SubMenu("Funny Menu", "Fun?", ["Make Fun", "Enjoy Fun", "Like Fun"], "Adjust Fun") - self.manager.add(options_menu) + options_menu = SubMenu( + "Funny Menu", "Too much fun here", "Fun?", + ["Make Fun", "Enjoy Fun", "Like Fun"], + "Adjust Fun", + ) + self.manager.add( + options_menu, + layer=1 + ) def on_hide_view(self): # Disable the UIManager when the view is hidden. @@ -123,7 +140,7 @@ def on_show_view(self): # Makes the background darker arcade.set_background_color([rgb - 50 for rgb in arcade.color.DARK_BLUE_GRAY]) - # Enable the UIManager when the view is showm. + # Enable the UIManager when the view is showm. self.manager.enable() def on_draw(self): @@ -135,7 +152,8 @@ def on_draw(self): class SubMenu(arcade.gui.UIMouseFilterMixin, arcade.gui.UIAnchorLayout): """Acts like a fake view/window.""" - def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: list[str], slider_label: str): + + def __init__(self, title: str, input_text: str, toggle_label: str, dropdown_options: list[str], slider_label: str): super().__init__(size_hint=(1, 1)) # Setup frame which will act like the window. @@ -155,50 +173,48 @@ def __init__(self, input_text_default: str, toggle_label: str, dropdown_options: )) back_button = arcade.gui.UIFlatButton(text="Back", width=250) - # The event listener we used earlier for the button will not work here. + # The type of event listener we used earlier for the button will not work here. back_button.on_click = self.on_click_back_button - input_text = arcade.gui.UIInputText(text=input_text_default, width=250).with_border() - # Adds a widget of the color DARK_BLUE_GRAY with height to separate the widgets - # Its another method for adding space between widgets in a layout. - space_20 = arcade.gui.UISpace(height=20, color=arcade.color.DARK_BLUE_GRAY) + title_label = arcade.gui.UILabel(text=title, align="center", font_size=20, multiline=False) + # Adding some extra space around the title. + title_label_space = arcade.gui.UISpace(height=30, color=arcade.color.DARK_BLUE_GRAY) - toggle_label = arcade.gui.UILabel(text=toggle_label) - # Load the on-off textures. + input_text = arcade.gui.UIInputText(text=input_text, width=250).with_border() + + # Load the on-off textures. on_texture = arcade.load_texture(":resources:gui_basic_assets/toggle/circle_switch_on.png") off_texture = arcade.load_texture(":resources:gui_basic_assets/toggle/circle_switch_off.png") + # Create the on-off toggle and a label + toggle_label = arcade.gui.UILabel(text=toggle_label) toggle = arcade.gui.UITextureToggle( on_texture=on_texture, off_texture=off_texture, width=20, height=20 ) - space_30 = arcade.gui.UISpace(height=30, color=arcade.color.DARK_BLUE_GRAY) + # Align toggle and label horizontally next to each other + toggle_group = arcade.gui.UIBoxLayout(vertical=False, space_between=5) + toggle_group.add(toggle) + toggle_group.add(toggle_label) + + # Create dropdown with a specified default. dropdown = arcade.gui.UIDropdown(default=dropdown_options[0], options=dropdown_options, height=20, width=250) - space_80 = arcade.gui.UISpace(height=80, color=arcade.color.DARK_BLUE_GRAY) slider_label = arcade.gui.UILabel(text=slider_label) - pressed_style = arcade.gui.UISlider.UIStyle(filled_bar=arcade.color.GREEN, unfilled_bar=arcade.color.RED) - default_style = arcade.gui.UISlider.UIStyle() - style_dict = {"press": pressed_style, "normal": default_style, "hover": default_style, "disabled": default_style} - # Configuring the styles is optional. - slider = arcade.gui.UISlider(value=50, width=250, style=style_dict) - space_70 = arcade.gui.UISpace(height=70, color=arcade.color.DARK_BLUE_GRAY) - - # Internal widget layout to handle widgets in this class. - widget_layout = arcade.gui.UIBoxLayout(align="left") + slider = arcade.gui.UISlider(value=50, width=250) + + widget_layout = arcade.gui.UIBoxLayout(align="left", space_between=10) + widget_layout.add(title_label) + widget_layout.add(title_label_space) widget_layout.add(input_text) - widget_layout.add(space_20) - widget_layout.add(toggle_label) - widget_layout.add(toggle) - widget_layout.add(space_30) + widget_layout.add(toggle_group) widget_layout.add(dropdown) - widget_layout.add(space_80) widget_layout.add(slider_label) widget_layout.add(slider) - widget_layout.add(space_70) + widget_layout.add(back_button) frame.add(child=widget_layout, anchor_x="center_x", anchor_y="top") @@ -212,7 +228,7 @@ def on_click_back_button(self, event): def main(): """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) arcade.run() From 9f97364a7d50a44788d344a4e3c920c59dc8473d Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sat, 11 Mar 2023 20:21:15 +0530 Subject: [PATCH 19/22] Updated screenshots and final gif according to the fix --- doc/tutorials/menu/index.rst | 10 +++++----- doc/tutorials/menu/menu.gif | Bin 53102 -> 58865 bytes doc/tutorials/menu/menu_05.png | Bin 11274 -> 9400 bytes doc/tutorials/menu/menu_05.py | 6 +++++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index c4bf85cb51..0d9963e516 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -208,7 +208,7 @@ Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding title label to the layout - :lines: 209-211 + :lines: 213-215 Adding a Input Field @@ -224,7 +224,7 @@ Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding input field to the layout - :lines: 209-212 + :lines: 213-216 :emphasize-lines: 4 If you paid attention when we defined the ``input_text`` variable we passed the ``text`` parameter with our ``input_text_default`` argument. We basically added those parameters in our sub menu so that it can be used by both volume and options button, with texts respecting their names. We will repeat this again in the last also for those of you who are skipping through this section :P. @@ -242,7 +242,7 @@ Adding it to the widget layout. Add this line after you have added the input fie .. literalinclude:: menu_05.py :caption: Adding toggle button to the layout - :lines: 213 + :lines: 217 Adding a Dropdowm ~~~~~~~~~~~~~~~~~ @@ -257,7 +257,7 @@ Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding dropdown to the layout - :lines: 214 + :lines: 218 Adding a Slider ~~~~~~~~~~~~~~~ @@ -272,7 +272,7 @@ Adding it to the widget layout. .. literalinclude:: menu_05.py :caption: Adding slider to the layout - :lines: 215-216 + :lines: 219-220 Finishing touches ~~~~~~~~~~~~~~~~~ diff --git a/doc/tutorials/menu/menu.gif b/doc/tutorials/menu/menu.gif index b55afd524600ba477b510362bd8e63df1c0c0518..66f84bd86f2f5d719bbbd190cb3b5edfd4bdc62b 100644 GIT binary patch literal 58865 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 GSMy)ne*$~} literal 53102 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³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 diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py index aee14ca8a9..3787772497 100644 --- a/doc/tutorials/menu/menu_05.py +++ b/doc/tutorials/menu/menu_05.py @@ -204,7 +204,11 @@ def __init__(self, title: str, input_text: str, toggle_label: str, dropdown_opti dropdown = arcade.gui.UIDropdown(default=dropdown_options[0], options=dropdown_options, height=20, width=250) slider_label = arcade.gui.UILabel(text=slider_label) - slider = arcade.gui.UISlider(value=50, width=250) + pressed_style = arcade.gui.UISlider.UIStyle(filled_bar=arcade.color.GREEN, unfilled_bar=arcade.color.RED) + default_style = arcade.gui.UISlider.UIStyle() + style_dict = {"press": pressed_style, "normal": default_style, "hover": default_style, "disabled": default_style} + # Configuring the styles is optional. + slider = arcade.gui.UISlider(value=50, width=250, style=style_dict) widget_layout = arcade.gui.UIBoxLayout(align="left", space_between=10) widget_layout.add(title_label) From 862f6d1995e526694b6430060f7e04cb2ba0ea63 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sat, 18 Mar 2023 16:54:17 +0530 Subject: [PATCH 20/22] Renamed variable to avoid confusion --- doc/tutorials/menu/menu_05.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py index 3787772497..d714330d5f 100644 --- a/doc/tutorials/menu/menu_05.py +++ b/doc/tutorials/menu/menu_05.py @@ -180,7 +180,7 @@ def __init__(self, title: str, input_text: str, toggle_label: str, dropdown_opti # Adding some extra space around the title. title_label_space = arcade.gui.UISpace(height=30, color=arcade.color.DARK_BLUE_GRAY) - input_text = arcade.gui.UIInputText(text=input_text, width=250).with_border() + input_text_widget = arcade.gui.UIInputText(text=input_text, width=250).with_border() # Load the on-off textures. on_texture = arcade.load_texture(":resources:gui_basic_assets/toggle/circle_switch_on.png") @@ -213,7 +213,7 @@ def __init__(self, title: str, input_text: str, toggle_label: str, dropdown_opti widget_layout = arcade.gui.UIBoxLayout(align="left", space_between=10) widget_layout.add(title_label) widget_layout.add(title_label_space) - widget_layout.add(input_text) + widget_layout.add(input_text_widget) widget_layout.add(toggle_group) widget_layout.add(dropdown) widget_layout.add(slider_label) From a93bb6e03fedd180accf50b4ab101e7caf9dac29 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 26 Mar 2023 04:50:38 +0530 Subject: [PATCH 21/22] Make max character limit in a line be 80 --- doc/tutorials/menu/index.rst | 75 ++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/doc/tutorials/menu/index.rst b/doc/tutorials/menu/index.rst index 0d9963e516..573d6c17d9 100644 --- a/doc/tutorials/menu/index.rst +++ b/doc/tutorials/menu/index.rst @@ -45,14 +45,16 @@ First we will import the arcade gui: Modify the MainView ~~~~~~~~~~~~~~~~~~~~ -We are going to add a button to change the view. For drawing a button we would need a ``UIManager``. +We are going to add a button to change the view. For drawing a button we would +need a ``UIManager``. .. literalinclude:: menu_02.py :caption: Intialising the Manager :lines: 16-19 :emphasize-lines: 4 -After initialising the manager we need to enable it when the view is shown and disable it when the view is hiddien. +After initialising the manager we need to enable it when the view is shown and +disable it when the view is hiddien. .. literalinclude:: menu_02.py :caption: Enabling the Manager @@ -70,7 +72,9 @@ We also need to draw the childrens of the menu in ``on_draw``. :pyobject: MainView.on_draw :emphasize-lines: 6-7 -Now we have successfully setup the manager, only thing left it to add the button. We are using ``UIAnchorLayout`` to position the button. We also setup a function which is called when the button is clicked. +Now we have successfully setup the manager, only thing left it to add the button. +We are using ``UIAnchorLayout`` to position the button. We also setup a function +which is called when the button is clicked. .. literalinclude:: menu_02.py :caption: Initialising the Button @@ -79,7 +83,8 @@ Now we have successfully setup the manager, only thing left it to add the button Initialise the Menu View ~~~~~~~~~~~~~~~~~~~~~~~~ -We make a boiler plate view just like we did in Step-1 for switiching the view when the pause button is clicked. +We make a boiler plate view just like we did in Step-1 for switiching the view +when the pause button is clicked. .. literalinclude:: menu_02.py :caption: Initialise the Menu View @@ -98,7 +103,8 @@ Step 3: Setting Up the Menu View .. image:: menu_03.png :width: 50% -In this step we will setup the display buttons of the actual menu. The code written in this section is written for ``MenuView`` +In this step we will setup the display buttons of the actual menu. The code +written in this section is written for ``MenuView`` Initialising the Buttons ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -112,7 +118,8 @@ First we setup buttons for resume, starting a new game, volume, options and exit Displaying the Buttons in a Grid ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -After setting up the buttons we add them to ``UIGridLayout``, so that they can displayed in a grid like manner. +After setting up the buttons we add them to ``UIGridLayout``, so that they can +displayed in a grid like manner. .. literalinclude:: menu_03.py :caption: Setting up the Grid @@ -142,7 +149,8 @@ We basically add event listener for ``on_click`` for buttons. Adding ``on_click`` Callback for Resume, Start New Game and Exit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -First we will add the event listener to resume, start_new_game and exit button as they don't have much to explain. +First we will add the event listener to resume, start_new_game and exit button +as they don't have much to explain. .. literalinclude:: menu_04.py :caption: Adding callback for button events 1 @@ -151,13 +159,17 @@ First we will add the event listener to resume, start_new_game and exit button a Adding ``on_click`` Callback for Volume and Options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Now we need to implement an actual menu for volume and options, for that we have to make a class that acts like a window. Using ``UIMouseFilterMixin`` we catch all the events happening for the parent and respond nothing to them. Thus making it act like a window/view. +Now we need to implement an actual menu for volume and options, for that we have +to make a class that acts like a window. Using ``UIMouseFilterMixin`` we catch +all the events happening for the parent and respond nothing to them. Thus +making it act like a window/view. .. literalinclude:: menu_04.py :caption: Making a Fake Window. :pyobject: SubMenu -We have got ourselves a fake window currently. We now, pair it up with the volume and options button to trigger it when they are clicked. +We have got ourselves a fake window currently. We now, pair it up with the +volume and options button to trigger it when they are clicked. .. literalinclude:: menu_04.py :caption: Adding callback for button events 2 @@ -180,25 +192,31 @@ We finalise the menu or you can call it the last step! Editing the Parameters for the Sub Menu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -We will edit the parameters for the sub menu to suit our needs. Will explain later why are those parameters needed. +We will edit the parameters for the sub menu to suit our needs. Will explain +later why are those parameters needed. .. literalinclude:: menu_05.py :caption: Editing parameters :lines: 153-156 -We also need to change accordingly the places where we have used this class i.e options and volume ``on_click`` event listener. The layer parameter being set 1, means that this layer is always drawn on top i.e its the first layer. +We also need to change accordingly the places where we have used this class i.e +options and volume ``on_click`` event listener. The layer parameter being set +1, means that this layer is always drawn on top i.e its the first layer. .. literalinclude:: menu_05.py :caption: Editing arguments :lines: 109-131 -Now you might be getting a little idea why we have edited the parameters but follow on to actually know the reason. +Now you might be getting a little idea why we have edited the parameters but + follow on to actually know the reason. Adding a Title label -------------------- -We will be adding a ``UILabel`` that explains the menu. ``UISpace`` is a widget that can be used to add space around some widget, you can set its color to the background color so it appears invisible. +We will be adding a ``UILabel`` that explains the menu. ``UISpace`` is a widget +that can be used to add space around some widget, you can set its color to the +background color so it appears invisible. .. literalinclude:: menu_05.py :caption: Adding title label @@ -214,7 +232,10 @@ Adding it to the widget layout. Adding a Input Field ~~~~~~~~~~~~~~~~~~~~~ -We will use ``UIInputText`` to add an input field. The ``with_border()`` function creates a border around the widget with color(default argument is black) black and thickness(default argument is 2px) 2px. Add this just below the title label. +We will use ``UIInputText`` to add an input field. The ``with_border()`` +function creates a border around the widget with color(default argument is +black) black and thickness(default argument is 2px) 2px. Add this just below +the title label. .. literalinclude:: menu_05.py :caption: Adding input field @@ -227,18 +248,27 @@ Adding it to the widget layout. :lines: 213-216 :emphasize-lines: 4 -If you paid attention when we defined the ``input_text`` variable we passed the ``text`` parameter with our ``input_text_default`` argument. We basically added those parameters in our sub menu so that it can be used by both volume and options button, with texts respecting their names. We will repeat this again in the last also for those of you who are skipping through this section :P. +If you paid attention when we defined the ``input_text`` variable we passed the +``text`` parameter with our ``input_text_default`` argument. We basically added +those parameters in our sub menu so that it can be used by both volume and +options button, with texts respecting their names. We will repeat this again +in the last also for those of you who are skipping through this section :P. Adding a Toggle Button ~~~~~~~~~~~~~~~~~~~~~~ -Don't go on the section title much, in arcade the ``UITextureToggle`` is not really a button it switches between two textures when clicked. Yes, it functions like a button but by "is not really a button" we meant that it doesn't inherits the button class. We also pair it up horizontally with the toggle label. +Don't go on the section title much, in arcade the ``UITextureToggle`` is not +really a button it switches between two textures when clicked. Yes, it +functions like a button but by "is not really a button" we meant that it +doesn't inherits the button class. We also pair it up horizontally with the +toggle label. .. literalinclude:: menu_05.py :caption: Adding toggle button :lines: 189-201 -Adding it to the widget layout. Add this line after you have added the input field. +Adding it to the widget layout. Add this line after you have added the input +field. .. literalinclude:: menu_05.py :caption: Adding toggle button to the layout @@ -262,7 +292,9 @@ Adding it to the widget layout. Adding a Slider ~~~~~~~~~~~~~~~ -The final widget. In arcade you can use ``UISlider`` to implement a slider. Theres a functionality to style the slider, this is also present for ``UIFlatButton`` and ``UITextureButton``. +The final widget. In arcade you can use ``UISlider`` to implement a slider. +Theres a functionality to style the slider, this is also present for +``UIFlatButton`` and ``UITextureButton``. .. literalinclude:: menu_05.py :caption: Adding slider @@ -277,8 +309,11 @@ Adding it to the widget layout. Finishing touches ~~~~~~~~~~~~~~~~~ -As we mentioned earlier, to explain the use of those parameters to the class. We basically used them so it can be used by both options and volume as we wanted to have different text for both. -For those who have read the full tutorial line-by-line; 'They will never know'. :D. +As we mentioned earlier, to explain the use of those parameters to the class. +We basically used them so it can be used by both options and volume as we +wanted to have different text for both. +For those who have read the full tutorial line-by-line; +'They will never know'. :D. We also recommend to see the full code for this section. From 438501342233c8ff34f90907e395e29fc90d2d9e Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 26 Mar 2023 04:59:20 +0530 Subject: [PATCH 22/22] Enchance comments/docstrings --- doc/tutorials/menu/menu_01.py | 4 ++-- doc/tutorials/menu/menu_02.py | 6 +++--- doc/tutorials/menu/menu_03.py | 6 +++--- doc/tutorials/menu/menu_04.py | 6 +++--- doc/tutorials/menu/menu_05.py | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/tutorials/menu/menu_01.py b/doc/tutorials/menu/menu_01.py index 1fb933b65f..513e1581e4 100644 --- a/doc/tutorials/menu/menu_01.py +++ b/doc/tutorials/menu/menu_01.py @@ -1,5 +1,7 @@ """ Menu. + +Shows the usage of almost every gui widget, switching views and making a modal. """ import arcade @@ -26,8 +28,6 @@ def on_draw(self): def main(): - """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) diff --git a/doc/tutorials/menu/menu_02.py b/doc/tutorials/menu/menu_02.py index 91fbb9f27f..e0e5357f36 100644 --- a/doc/tutorials/menu/menu_02.py +++ b/doc/tutorials/menu/menu_02.py @@ -1,5 +1,7 @@ """ Menu. + +Shows the usage of almost every gui widget, switching views and making a modal. """ import arcade import arcade.gui @@ -11,7 +13,7 @@ class MainView(arcade.View): - """ Main application class. """ + """This is the class where your normal game would go.""" def __init__(self): super().__init__() @@ -87,8 +89,6 @@ def on_draw(self): def main(): - """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) diff --git a/doc/tutorials/menu/menu_03.py b/doc/tutorials/menu/menu_03.py index 85f243be32..563f5e19a2 100644 --- a/doc/tutorials/menu/menu_03.py +++ b/doc/tutorials/menu/menu_03.py @@ -1,5 +1,7 @@ """ Menu. + +Shows the usage of almost every gui widget, switching views and making a modal. """ import arcade import arcade.gui @@ -11,7 +13,7 @@ class MainView(arcade.View): - """ Main application class. """ + """This is the class where your normal game would go.""" def __init__(self): super().__init__() @@ -112,8 +114,6 @@ def on_draw(self): def main(): - """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) diff --git a/doc/tutorials/menu/menu_04.py b/doc/tutorials/menu/menu_04.py index d6b8ad0a1c..b0fdd37b14 100644 --- a/doc/tutorials/menu/menu_04.py +++ b/doc/tutorials/menu/menu_04.py @@ -1,5 +1,7 @@ """ Menu. + +Shows the usage of almost every gui widget, switching views and making a modal. """ import arcade import arcade.gui @@ -11,7 +13,7 @@ class MainView(arcade.View): - """ Main application class. """ + """This is the class where your normal game would go.""" def __init__(self): super().__init__() @@ -181,8 +183,6 @@ def on_click_back_button(self, event): def main(): - """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view) diff --git a/doc/tutorials/menu/menu_05.py b/doc/tutorials/menu/menu_05.py index d714330d5f..d5c5ba6dcf 100644 --- a/doc/tutorials/menu/menu_05.py +++ b/doc/tutorials/menu/menu_05.py @@ -1,5 +1,7 @@ """ Menu. + +Shows the usage of almost every gui widget, switching views and making a modal. """ import arcade import arcade.gui @@ -11,7 +13,7 @@ class MainView(arcade.View): - """ Main application class. """ + """This is the class where your normal game would go.""" def __init__(self): super().__init__() @@ -230,8 +232,6 @@ def on_click_back_button(self, event): def main(): - """ Main function """ - window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True) main_view = MainView() window.show_view(main_view)