From 72d8c9dc2ea705615aa8a82e8f3e947490eb844a Mon Sep 17 00:00:00 2001 From: dimok321 <15055714+dimok789@users.noreply.github.com> Date: Tue, 14 Jun 2011 17:53:19 +0000 Subject: [PATCH] *Created an automatic resource list generation script which is executed when files are added/removed *Created an own class for the homebrew prompt *Created scrollbar class which is now used on every browser *Created a checkbox browser list class *Changed the category prompts to the new list mode *Improved B-Button scrolling *Fixed horizontal text scrolling *Fixed possible crash on long text display *Many internal gui changes and navigation changes *Fixed booting games by argument (headless id) (Issue 1930) *Fixed SD Reload button to really reload the SD after it was ejected (Issue 1923) *Added booting with arguements from meta.xml for homebrews (Issue 1926) *Added some arguments acception from meta.xml to our app. "-ios=xxx" and "-usbport=x" or "--ios=xxx" and "--usbport=x" can be used. -usbport is for Hermes cIOS to decide which usb port to use on startup. The ios is the boot IOS on startup, it always overrides the compiled boot IOS into the application. --- HBC/META.XML | 4 +- Languages/czech.lang | 9 +- Languages/danish.lang | 9 +- Languages/dutch.lang | 14 +- Languages/english.lang | 9 +- Languages/finnish.lang | 9 +- Languages/french.lang | 14 +- Languages/german.lang | 14 +- Languages/hungarian.lang | 9 +- Languages/italian.lang | 9 +- Languages/japanese.lang | 14 +- Languages/korean.lang | 9 +- Languages/norwegian.lang | 9 +- Languages/polish.lang | 9 +- Languages/portuguese_br.lang | 9 +- Languages/portuguese_pt.lang | 9 +- Languages/russian.lang | 9 +- Languages/schinese.lang | 9 +- Languages/spanish.lang | 9 +- Languages/swedish.lang | 9 +- Languages/tchinese.lang | 9 +- Languages/thai.lang | 9 +- Languages/turkish.lang | 9 +- Makefile | 33 +- Themes/Default.them | 213 ++++- data/certs.dat | Bin 2560 -> 0 bytes {source => data}/fonts/clock.ttf | Bin {source => data}/fonts/font.ttf | Bin data/haxx.certs | Bin 2560 -> 0 bytes {source => data}/images/abcIcon.png | Bin {source => data}/images/add.png | Bin .../images/addressbar_textbox.png | Bin {source => data}/images/arrangeCarousel.png | Bin .../images/arrangeCarousel_gray.png | Bin {source => data}/images/arrangeGrid.png | Bin {source => data}/images/arrangeGrid_gray.png | Bin {source => data}/images/arrangeList.png | Bin {source => data}/images/arrangeList_gray.png | Bin {source => data}/images/background.png | Bin {source => data}/images/balanceboard.png | Bin {source => data}/images/balanceboardR.png | Bin {source => data}/images/battery.png | Bin {source => data}/images/battery_bar.png | Bin {source => data}/images/battery_bar_red.png | Bin {source => data}/images/battery_bar_white.png | Bin {source => data}/images/battery_red.png | Bin {source => data}/images/battery_white.png | Bin {source => data}/images/bg_browser.png | Bin data/images/bg_browser_selection.png | Bin 0 -> 5250 bytes {source => data}/images/bg_options.png | Bin data/images/bg_options_entry.png | Bin 0 -> 1957 bytes .../images/bg_options_settings.png | Bin {source => data}/images/boxBorder.png | Bin {source => data}/images/browser.png | Bin {source => data}/images/browser_over.png | Bin .../images/button_dialogue_box.png | Bin {source => data}/images/button_install.png | Bin .../images/button_install_over.png | Bin {source => data}/images/category.png | Bin data/images/categoryPrompt.png | Bin 0 -> 10406 bytes {source => data}/images/category_gray.png | Bin {source => data}/images/cero_a.png | Bin {source => data}/images/cero_b.png | Bin {source => data}/images/cero_c.png | Bin {source => data}/images/cero_d.png | Bin {source => data}/images/cero_z.png | Bin .../images/channel_btn.png | Bin data/images/checkBoxSelection.png | Bin 0 -> 1914 bytes {source => data}/images/classiccontroller.png | Bin .../images/classiccontrollerR.png | Bin {source => data}/images/closebutton.png | Bin {source => data}/images/credits_bg.png | Bin {source => data}/images/credits_button.png | Bin .../images/credits_button_over.png | Bin {source => data}/images/dancepad.png | Bin {source => data}/images/dancepadR.png | Bin {source => data}/images/dialogue_box.png | Bin .../images/dialogue_box_startgame.png | Bin {source => data}/images/drums.png | Bin {source => data}/images/drumsR.png | Bin {source => data}/images/dvd.png | Bin {source => data}/images/dvd_gray.png | Bin {source => data}/images/esrb_ao.png | Bin {source => data}/images/esrb_e.png | Bin {source => data}/images/esrb_ec.png | Bin {source => data}/images/esrb_eten.png | Bin {source => data}/images/esrb_m.png | Bin {source => data}/images/esrb_t.png | Bin {source => data}/images/exit_bottom.png | Bin {source => data}/images/exit_bottom_over.png | Bin {source => data}/images/exit_button.png | Bin {source => data}/images/exit_top.png | Bin {source => data}/images/exit_top_over.png | Bin {source => data}/images/favIcon.png | Bin {source => data}/images/favIcon_gray.png | Bin {source => data}/images/favorite.png | Bin {source => data}/images/gameinfo1.png | Bin {source => data}/images/gameinfo1a.png | Bin {source => data}/images/gameinfo2.png | Bin {source => data}/images/gameinfo2a.png | Bin {source => data}/images/gcncontroller.png | Bin {source => data}/images/gcncontrollerR.png | Bin {source => data}/images/guitar.png | Bin {source => data}/images/guitarR.png | Bin {source => data}/images/gxlogo.png | Bin {source => data}/images/icon_folder.png | Bin .../images/keyboard_backspace_over.png | Bin .../images/keyboard_clear_over.png | Bin {source => data}/images/keyboard_key.png | Bin {source => data}/images/keyboard_key_over.png | Bin .../images/keyboard_largekey_over.png | Bin .../images/keyboard_mediumkey_over.png | Bin {source => data}/images/keyboard_textbox.png | Bin {source => data}/images/little_star.png | Bin {source => data}/images/lock.png | Bin {source => data}/images/lock_gray.png | Bin {source => data}/images/menu_button.png | Bin {source => data}/images/menu_button_over.png | Bin {source => data}/images/microphone.png | Bin {source => data}/images/microphoneR.png | Bin {source => data}/images/motionplus.png | Bin {source => data}/images/motionplusR.png | Bin {source => data}/images/new.png | Bin {source => data}/images/nintendods.png | Bin {source => data}/images/nintendodsR.png | Bin {source => data}/images/nocover.png | Bin {source => data}/images/nocoverFlat.png | Bin {source => data}/images/nocoverFull.png | Bin {source => data}/images/nodisc.png | Bin {source => data}/images/norating.png | Bin {source => data}/images/not_favorite.png | Bin {source => data}/images/nunchuk.png | Bin {source => data}/images/nunchukR.png | Bin data/images/oneButtonScroll.png | Bin 0 -> 2541 bytes {source => data}/images/pageindicator.png | Bin {source => data}/images/pegi_12.png | Bin {source => data}/images/pegi_16.png | Bin {source => data}/images/pegi_18.png | Bin {source => data}/images/pegi_3.png | Bin {source => data}/images/pegi_7.png | Bin {source => data}/images/playCountIcon.png | Bin {source => data}/images/player1_grab.png | Bin {source => data}/images/player1_point.png | Bin {source => data}/images/player2_grab.png | Bin {source => data}/images/player2_point.png | Bin {source => data}/images/player3_grab.png | Bin {source => data}/images/player3_point.png | Bin {source => data}/images/player4_grab.png | Bin {source => data}/images/player4_point.png | Bin {source => data}/images/playersSort.png | Bin {source => data}/images/progressbar.png | Bin {source => data}/images/progressbar_empty.png | Bin .../images/progressbar_outline.png | Bin {source => data}/images/rankIcon.png | Bin {source => data}/images/remove.png | Bin data/images/rename.png | Bin 0 -> 496 bytes {source => data}/images/rplayer1_point.png | Bin {source => data}/images/rplayer2_point.png | Bin {source => data}/images/rplayer3_point.png | Bin {source => data}/images/rplayer4_point.png | Bin data/images/scrollBarBottom.png | Bin 0 -> 1386 bytes data/images/scrollBarTile.png | Bin 0 -> 261 bytes data/images/scrollBarTop.png | Bin 0 -> 1352 bytes data/images/scrollbar_arrowdown.png | Bin 0 -> 1188 bytes data/images/scrollbar_arrowup.png | Bin 0 -> 1089 bytes data/images/scrollbar_box.png | Bin 0 -> 1328 bytes {source => data}/images/sdcard.png | Bin {source => data}/images/sdcard_over.png | Bin {source => data}/images/searchIcon.png | Bin {source => data}/images/searchIcon_gray.png | Bin .../images/settings_background.png | Bin {source => data}/images/settings_button.png | Bin .../images/settings_button_over.png | Bin {source => data}/images/settings_title.png | Bin .../images/settings_title_over.png | Bin .../images/startgame_arrow_left.png | Bin .../images/startgame_arrow_right.png | Bin {source => data}/images/theme_box.png | Bin .../images/theme_dialogue_box.png | Bin {source => data}/images/tooltip_left.png | Bin {source => data}/images/tooltip_right.png | Bin {source => data}/images/tooltip_tile.png | Bin {source => data}/images/unlock.png | Bin {source => data}/images/unlock_gray.png | Bin {source => data}/images/wbackground.png | Bin .../images/wdialogue_box_startgame.png | Bin {source => data}/images/wheel.png | Bin {source => data}/images/wheelR.png | Bin {source => data}/images/wifi1.png | Bin {source => data}/images/wifi12.png | Bin {source => data}/images/wifi16.png | Bin {source => data}/images/wifi2.png | Bin {source => data}/images/wifi3.png | Bin {source => data}/images/wifi32.png | Bin {source => data}/images/wifi4.png | Bin {source => data}/images/wifi8.png | Bin .../Wifi_btn.png => data/images/wifi_btn.png | Bin {source => data}/images/wiimote.png | Bin .../Wiimote1.png => data/images/wiimote1.png | Bin .../Wiimote2.png => data/images/wiimote2.png | Bin .../Wiimote3.png => data/images/wiimote3.png | Bin .../Wiimote4.png => data/images/wiimote4.png | Bin {source => data}/images/wiimote_poweroff.png | Bin .../images/wiimote_poweroff_over.png | Bin {source => data}/images/wiispeak.png | Bin {source => data}/images/wiispeakR.png | Bin {source => data}/images/zapper.png | Bin {source => data}/images/zapperR.png | Bin {source => data}/sounds/bg_music.ogg | Bin {source => data}/sounds/button_click.wav | Bin {source => data}/sounds/button_click2.wav | Bin {source => data}/sounds/button_over.wav | Bin {source => data}/sounds/credits_music.ogg | Bin {source => data}/sounds/menuin.ogg | Bin {source => data}/sounds/menuout.ogg | Bin {source => data}/sounds/success.ogg | Bin filelist.sh | 61 ++ gui.pnproj | 2 +- source/BoxCover/BoxCover.hpp | 2 +- source/Controls/DeviceHandler.cpp | 5 +- source/Controls/DeviceHandler.hpp | 2 +- source/{libwiigui => GUI}/LoadCoverImage.cpp | 2 +- source/{libwiigui => GUI}/LoadCoverImage.h | 0 source/{libwiigui => GUI}/OptionList.cpp | 0 source/{libwiigui => GUI}/OptionList.hpp | 0 source/{libwiigui => GUI}/Text.cpp | 2 +- source/{libwiigui => GUI}/Text.hpp | 2 +- source/{libwiigui => GUI}/gui.h | 180 +--- source/{libwiigui => GUI}/gui_box.cpp | 0 source/{libwiigui => GUI}/gui_box.hpp | 2 +- source/{libwiigui => GUI}/gui_button.cpp | 22 +- source/{libwiigui => GUI}/gui_checkbox.cpp | 41 + source/{libwiigui => GUI}/gui_checkbox.hpp | 10 +- source/GUI/gui_checkboxbrowser.cpp | 200 +++++ source/GUI/gui_checkboxbrowser.hpp | 65 ++ source/{libwiigui => GUI}/gui_checksign.cpp | 0 source/{libwiigui => GUI}/gui_checksign.hpp | 2 +- source/{libwiigui => GUI}/gui_circle.cpp | 0 source/{libwiigui => GUI}/gui_circle.hpp | 2 +- source/{libwiigui => GUI}/gui_cross.cpp | 0 source/{libwiigui => GUI}/gui_cross.hpp | 2 +- source/{libwiigui => GUI}/gui_diskcover.cpp | 0 source/{libwiigui => GUI}/gui_diskcover.h | 0 source/{libwiigui => GUI}/gui_element.cpp | 20 + source/GUI/gui_filebrowser.cpp | 230 ++++++ source/GUI/gui_filebrowser.h | 41 + source/GUI/gui_gamebrowser.cpp | 321 ++++++++ source/{libwiigui => GUI}/gui_gamebrowser.h | 29 +- .../{libwiigui => GUI}/gui_gamecarousel.cpp | 2 +- source/{libwiigui => GUI}/gui_gamecarousel.h | 0 source/{libwiigui => GUI}/gui_gamegrid.cpp | 2 +- source/{libwiigui => GUI}/gui_gamegrid.h | 0 source/{libwiigui => GUI}/gui_image.cpp | 48 +- source/{libwiigui => GUI}/gui_image_async.cpp | 0 source/{libwiigui => GUI}/gui_image_async.h | 2 +- source/{libwiigui => GUI}/gui_imagedata.cpp | 0 source/{libwiigui => GUI}/gui_imagedata.h | 0 source/{libwiigui => GUI}/gui_keyboard.cpp | 0 source/{libwiigui => GUI}/gui_numpad.cpp | 0 source/GUI/gui_optionbrowser.cpp | 324 ++++++++ .../gui_optionbrowser.h} | 33 +- source/GUI/gui_scrollbar.cpp | 481 +++++++++++ source/GUI/gui_scrollbar.hpp | 109 +++ source/{libwiigui => GUI}/gui_searchbar.cpp | 0 source/{libwiigui => GUI}/gui_searchbar.h | 0 source/{libwiigui => GUI}/gui_text.cpp | 45 +- source/{libwiigui => GUI}/gui_tooltip.cpp | 2 +- source/{libwiigui => GUI}/gui_trigger.cpp | 0 source/{libwiigui => GUI}/gui_window.cpp | 0 source/{libwiigui => GUI}/sigslot.h | 0 source/SoundOperations/gui_sound.cpp | 2 +- source/StartUpProcess.cpp | 74 +- source/StartUpProcess.h | 8 +- source/cheats/cheatmenu.cpp | 11 +- source/filelist.h | 574 ------------- source/homebrewboot/HomebrewBrowser.cpp | 37 +- source/homebrewboot/HomebrewXML.cpp | 11 + source/homebrewboot/HomebrewXML.h | 3 + source/images/back.png | Bin 1536 -> 0 bytes source/images/bg_browser_selection.png | Bin 5132 -> 0 bytes source/images/bg_options_entry.png | Bin 1106 -> 0 bytes source/images/categoryLine.png | Bin 951 -> 0 bytes source/images/categoryPrompt.png | Bin 6411 -> 0 bytes source/images/forward.png | Bin 1473 -> 0 bytes source/images/scrollbar.png | Bin 441 -> 0 bytes source/images/scrollbar_arrowdown.png | Bin 1091 -> 0 bytes source/images/scrollbar_arrowup.png | Bin 1025 -> 0 bytes source/images/scrollbar_box.png | Bin 945 -> 0 bytes source/images/usbport.png | Bin 64867 -> 0 bytes source/input.cpp | 2 +- source/libwiigui/gui_customoptionbrowser.cpp | 531 ------------ source/libwiigui/gui_filebrowser.cpp | 456 ----------- source/libwiigui/gui_gamebrowser.cpp | 623 -------------- source/libwiigui/gui_optionbrowser.cpp | 666 --------------- source/lstub.cpp | 4 +- source/main.cpp | 22 +- source/menu.cpp | 4 +- source/menu.h | 2 +- source/menu/GameBrowseMenu.cpp | 9 +- source/menu/GameBrowseMenu.hpp | 10 +- source/menu/WDMMenu.cpp | 2 +- source/menu/WDMMenu.hpp | 6 +- source/menu/menu_partition_selection.cpp | 4 +- source/menu/menus.h | 2 +- source/prompts/CategoryPrompt.cpp | 325 ++++---- source/prompts/CategoryPrompt.hpp | 63 +- source/prompts/CategorySelectPrompt.cpp | 70 +- source/prompts/CategorySelectPrompt.hpp | 10 +- source/prompts/CategorySwitchPrompt.cpp | 57 +- source/prompts/CategorySwitchPrompt.hpp | 10 +- source/prompts/CheckboxPrompt.hpp | 2 +- source/prompts/DiscBrowser.cpp | 8 +- source/prompts/GameWindow.cpp | 10 +- source/prompts/GameWindow.hpp | 4 +- source/prompts/HomebrewPrompt.cpp | 176 ++++ source/prompts/HomebrewPrompt.hpp | 56 ++ source/prompts/ProgressWindow.cpp | 8 +- source/prompts/PromptWindow.cpp | 2 +- source/prompts/PromptWindow.hpp | 2 +- source/prompts/PromptWindows.cpp | 257 +----- source/prompts/PromptWindows.h | 4 +- source/prompts/TitleBrowser.cpp | 14 +- source/prompts/filebrowser.cpp | 10 +- source/prompts/gameinfo.cpp | 7 +- source/settings/CCategoryList.hpp | 1 + source/settings/CGameCategories.cpp | 2 + source/settings/CGameCategories.hpp | 1 + source/settings/SettingsPrompts.cpp | 12 +- source/settings/menus/FlyingButtonsMenu.cpp | 2 +- source/settings/menus/FlyingButtonsMenu.hpp | 2 +- source/settings/menus/GUISettingsMenu.cpp | 2 +- source/settings/menus/GameLoadSM.cpp | 2 +- source/settings/menus/GameSettingsMenu.cpp | 12 +- source/settings/menus/SettingsMenu.cpp | 14 +- source/settings/menus/SettingsMenu.hpp | 6 +- source/themes/CTheme.cpp | 2 +- source/themes/Resources.cpp | 193 +---- source/themes/Resources.h | 2 +- source/themes/ThemeDownloader.cpp | 6 +- source/themes/ThemeMenu.cpp | 6 +- source/themes/filelist.h | 775 ++++++++++++++++++ source/usbloader/GameBooter.cpp | 2 + source/utils/ResourceManager.h | 2 +- source/utils/rockout.cpp | 2 +- source/utils/tools.h | 1 + source/video.cpp | 2 +- source/wad/wad.cpp | 14 +- source/xml/xml.cpp | 6 +- source/xml/xml.h | 2 +- 349 files changed, 3937 insertions(+), 4053 deletions(-) delete mode 100644 data/certs.dat rename {source => data}/fonts/clock.ttf (100%) rename {source => data}/fonts/font.ttf (100%) delete mode 100644 data/haxx.certs rename {source => data}/images/abcIcon.png (100%) rename {source => data}/images/add.png (100%) rename {source => data}/images/addressbar_textbox.png (100%) rename {source => data}/images/arrangeCarousel.png (100%) rename {source => data}/images/arrangeCarousel_gray.png (100%) rename {source => data}/images/arrangeGrid.png (100%) rename {source => data}/images/arrangeGrid_gray.png (100%) rename {source => data}/images/arrangeList.png (100%) rename {source => data}/images/arrangeList_gray.png (100%) rename {source => data}/images/background.png (100%) rename {source => data}/images/balanceboard.png (100%) rename {source => data}/images/balanceboardR.png (100%) rename {source => data}/images/battery.png (100%) rename {source => data}/images/battery_bar.png (100%) rename {source => data}/images/battery_bar_red.png (100%) rename {source => data}/images/battery_bar_white.png (100%) rename {source => data}/images/battery_red.png (100%) rename {source => data}/images/battery_white.png (100%) rename {source => data}/images/bg_browser.png (100%) create mode 100644 data/images/bg_browser_selection.png rename {source => data}/images/bg_options.png (100%) create mode 100644 data/images/bg_options_entry.png rename {source => data}/images/bg_options_settings.png (100%) rename {source => data}/images/boxBorder.png (100%) rename {source => data}/images/browser.png (100%) rename {source => data}/images/browser_over.png (100%) rename {source => data}/images/button_dialogue_box.png (100%) rename {source => data}/images/button_install.png (100%) rename {source => data}/images/button_install_over.png (100%) rename {source => data}/images/category.png (100%) create mode 100644 data/images/categoryPrompt.png rename {source => data}/images/category_gray.png (100%) rename {source => data}/images/cero_a.png (100%) rename {source => data}/images/cero_b.png (100%) rename {source => data}/images/cero_c.png (100%) rename {source => data}/images/cero_d.png (100%) rename {source => data}/images/cero_z.png (100%) rename source/images/Channel_btn.png => data/images/channel_btn.png (100%) create mode 100644 data/images/checkBoxSelection.png rename {source => data}/images/classiccontroller.png (100%) rename {source => data}/images/classiccontrollerR.png (100%) rename {source => data}/images/closebutton.png (100%) rename {source => data}/images/credits_bg.png (100%) rename {source => data}/images/credits_button.png (100%) rename {source => data}/images/credits_button_over.png (100%) rename {source => data}/images/dancepad.png (100%) rename {source => data}/images/dancepadR.png (100%) rename {source => data}/images/dialogue_box.png (100%) rename {source => data}/images/dialogue_box_startgame.png (100%) rename {source => data}/images/drums.png (100%) rename {source => data}/images/drumsR.png (100%) rename {source => data}/images/dvd.png (100%) rename {source => data}/images/dvd_gray.png (100%) rename {source => data}/images/esrb_ao.png (100%) rename {source => data}/images/esrb_e.png (100%) rename {source => data}/images/esrb_ec.png (100%) rename {source => data}/images/esrb_eten.png (100%) rename {source => data}/images/esrb_m.png (100%) rename {source => data}/images/esrb_t.png (100%) rename {source => data}/images/exit_bottom.png (100%) rename {source => data}/images/exit_bottom_over.png (100%) rename {source => data}/images/exit_button.png (100%) rename {source => data}/images/exit_top.png (100%) rename {source => data}/images/exit_top_over.png (100%) rename {source => data}/images/favIcon.png (100%) rename {source => data}/images/favIcon_gray.png (100%) rename {source => data}/images/favorite.png (100%) rename {source => data}/images/gameinfo1.png (100%) rename {source => data}/images/gameinfo1a.png (100%) rename {source => data}/images/gameinfo2.png (100%) rename {source => data}/images/gameinfo2a.png (100%) rename {source => data}/images/gcncontroller.png (100%) rename {source => data}/images/gcncontrollerR.png (100%) rename {source => data}/images/guitar.png (100%) rename {source => data}/images/guitarR.png (100%) rename {source => data}/images/gxlogo.png (100%) rename {source => data}/images/icon_folder.png (100%) rename {source => data}/images/keyboard_backspace_over.png (100%) rename {source => data}/images/keyboard_clear_over.png (100%) rename {source => data}/images/keyboard_key.png (100%) rename {source => data}/images/keyboard_key_over.png (100%) rename {source => data}/images/keyboard_largekey_over.png (100%) rename {source => data}/images/keyboard_mediumkey_over.png (100%) rename {source => data}/images/keyboard_textbox.png (100%) rename {source => data}/images/little_star.png (100%) rename {source => data}/images/lock.png (100%) rename {source => data}/images/lock_gray.png (100%) rename {source => data}/images/menu_button.png (100%) rename {source => data}/images/menu_button_over.png (100%) rename {source => data}/images/microphone.png (100%) rename {source => data}/images/microphoneR.png (100%) rename {source => data}/images/motionplus.png (100%) rename {source => data}/images/motionplusR.png (100%) rename {source => data}/images/new.png (100%) rename {source => data}/images/nintendods.png (100%) rename {source => data}/images/nintendodsR.png (100%) rename {source => data}/images/nocover.png (100%) rename {source => data}/images/nocoverFlat.png (100%) rename {source => data}/images/nocoverFull.png (100%) rename {source => data}/images/nodisc.png (100%) rename {source => data}/images/norating.png (100%) rename {source => data}/images/not_favorite.png (100%) rename {source => data}/images/nunchuk.png (100%) rename {source => data}/images/nunchukR.png (100%) create mode 100644 data/images/oneButtonScroll.png rename {source => data}/images/pageindicator.png (100%) rename {source => data}/images/pegi_12.png (100%) rename {source => data}/images/pegi_16.png (100%) rename {source => data}/images/pegi_18.png (100%) rename {source => data}/images/pegi_3.png (100%) rename {source => data}/images/pegi_7.png (100%) rename {source => data}/images/playCountIcon.png (100%) rename {source => data}/images/player1_grab.png (100%) rename {source => data}/images/player1_point.png (100%) rename {source => data}/images/player2_grab.png (100%) rename {source => data}/images/player2_point.png (100%) rename {source => data}/images/player3_grab.png (100%) rename {source => data}/images/player3_point.png (100%) rename {source => data}/images/player4_grab.png (100%) rename {source => data}/images/player4_point.png (100%) rename {source => data}/images/playersSort.png (100%) rename {source => data}/images/progressbar.png (100%) rename {source => data}/images/progressbar_empty.png (100%) rename {source => data}/images/progressbar_outline.png (100%) rename {source => data}/images/rankIcon.png (100%) rename {source => data}/images/remove.png (100%) create mode 100644 data/images/rename.png rename {source => data}/images/rplayer1_point.png (100%) rename {source => data}/images/rplayer2_point.png (100%) rename {source => data}/images/rplayer3_point.png (100%) rename {source => data}/images/rplayer4_point.png (100%) create mode 100644 data/images/scrollBarBottom.png create mode 100644 data/images/scrollBarTile.png create mode 100644 data/images/scrollBarTop.png create mode 100644 data/images/scrollbar_arrowdown.png create mode 100644 data/images/scrollbar_arrowup.png create mode 100644 data/images/scrollbar_box.png rename {source => data}/images/sdcard.png (100%) rename {source => data}/images/sdcard_over.png (100%) rename {source => data}/images/searchIcon.png (100%) rename {source => data}/images/searchIcon_gray.png (100%) rename {source => data}/images/settings_background.png (100%) rename {source => data}/images/settings_button.png (100%) rename {source => data}/images/settings_button_over.png (100%) rename {source => data}/images/settings_title.png (100%) rename {source => data}/images/settings_title_over.png (100%) rename {source => data}/images/startgame_arrow_left.png (100%) rename {source => data}/images/startgame_arrow_right.png (100%) rename {source => data}/images/theme_box.png (100%) rename {source => data}/images/theme_dialogue_box.png (100%) rename {source => data}/images/tooltip_left.png (100%) rename {source => data}/images/tooltip_right.png (100%) rename {source => data}/images/tooltip_tile.png (100%) rename {source => data}/images/unlock.png (100%) rename {source => data}/images/unlock_gray.png (100%) rename {source => data}/images/wbackground.png (100%) rename {source => data}/images/wdialogue_box_startgame.png (100%) rename {source => data}/images/wheel.png (100%) rename {source => data}/images/wheelR.png (100%) rename {source => data}/images/wifi1.png (100%) rename {source => data}/images/wifi12.png (100%) rename {source => data}/images/wifi16.png (100%) rename {source => data}/images/wifi2.png (100%) rename {source => data}/images/wifi3.png (100%) rename {source => data}/images/wifi32.png (100%) rename {source => data}/images/wifi4.png (100%) rename {source => data}/images/wifi8.png (100%) rename source/images/Wifi_btn.png => data/images/wifi_btn.png (100%) rename {source => data}/images/wiimote.png (100%) rename source/images/Wiimote1.png => data/images/wiimote1.png (100%) rename source/images/Wiimote2.png => data/images/wiimote2.png (100%) rename source/images/Wiimote3.png => data/images/wiimote3.png (100%) rename source/images/Wiimote4.png => data/images/wiimote4.png (100%) rename {source => data}/images/wiimote_poweroff.png (100%) rename {source => data}/images/wiimote_poweroff_over.png (100%) rename {source => data}/images/wiispeak.png (100%) rename {source => data}/images/wiispeakR.png (100%) rename {source => data}/images/zapper.png (100%) rename {source => data}/images/zapperR.png (100%) rename {source => data}/sounds/bg_music.ogg (100%) rename {source => data}/sounds/button_click.wav (100%) rename {source => data}/sounds/button_click2.wav (100%) rename {source => data}/sounds/button_over.wav (100%) rename {source => data}/sounds/credits_music.ogg (100%) rename {source => data}/sounds/menuin.ogg (100%) rename {source => data}/sounds/menuout.ogg (100%) rename {source => data}/sounds/success.ogg (100%) create mode 100644 filelist.sh rename source/{libwiigui => GUI}/LoadCoverImage.cpp (98%) rename source/{libwiigui => GUI}/LoadCoverImage.h (100%) rename source/{libwiigui => GUI}/OptionList.cpp (100%) rename source/{libwiigui => GUI}/OptionList.hpp (100%) rename source/{libwiigui => GUI}/Text.cpp (98%) rename source/{libwiigui => GUI}/Text.hpp (98%) rename source/{libwiigui => GUI}/gui.h (88%) rename source/{libwiigui => GUI}/gui_box.cpp (100%) rename source/{libwiigui => GUI}/gui_box.hpp (98%) rename source/{libwiigui => GUI}/gui_button.cpp (97%) rename source/{libwiigui => GUI}/gui_checkbox.cpp (69%) rename source/{libwiigui => GUI}/gui_checkbox.hpp (90%) create mode 100644 source/GUI/gui_checkboxbrowser.cpp create mode 100644 source/GUI/gui_checkboxbrowser.hpp rename source/{libwiigui => GUI}/gui_checksign.cpp (100%) rename source/{libwiigui => GUI}/gui_checksign.hpp (98%) rename source/{libwiigui => GUI}/gui_circle.cpp (100%) rename source/{libwiigui => GUI}/gui_circle.hpp (98%) rename source/{libwiigui => GUI}/gui_cross.cpp (100%) rename source/{libwiigui => GUI}/gui_cross.hpp (98%) rename source/{libwiigui => GUI}/gui_diskcover.cpp (100%) rename source/{libwiigui => GUI}/gui_diskcover.h (100%) rename source/{libwiigui => GUI}/gui_element.cpp (98%) create mode 100644 source/GUI/gui_filebrowser.cpp create mode 100644 source/GUI/gui_filebrowser.h create mode 100644 source/GUI/gui_gamebrowser.cpp rename source/{libwiigui => GUI}/gui_gamebrowser.h (55%) rename source/{libwiigui => GUI}/gui_gamecarousel.cpp (99%) rename source/{libwiigui => GUI}/gui_gamecarousel.h (100%) rename source/{libwiigui => GUI}/gui_gamegrid.cpp (99%) rename source/{libwiigui => GUI}/gui_gamegrid.h (100%) rename source/{libwiigui => GUI}/gui_image.cpp (89%) rename source/{libwiigui => GUI}/gui_image_async.cpp (100%) rename source/{libwiigui => GUI}/gui_image_async.h (97%) rename source/{libwiigui => GUI}/gui_imagedata.cpp (100%) rename source/{libwiigui => GUI}/gui_imagedata.h (100%) rename source/{libwiigui => GUI}/gui_keyboard.cpp (100%) rename source/{libwiigui => GUI}/gui_numpad.cpp (100%) create mode 100644 source/GUI/gui_optionbrowser.cpp rename source/{libwiigui/gui_customoptionbrowser.h => GUI/gui_optionbrowser.h} (52%) create mode 100644 source/GUI/gui_scrollbar.cpp create mode 100644 source/GUI/gui_scrollbar.hpp rename source/{libwiigui => GUI}/gui_searchbar.cpp (100%) rename source/{libwiigui => GUI}/gui_searchbar.h (100%) rename source/{libwiigui => GUI}/gui_text.cpp (91%) rename source/{libwiigui => GUI}/gui_tooltip.cpp (98%) rename source/{libwiigui => GUI}/gui_trigger.cpp (100%) rename source/{libwiigui => GUI}/gui_window.cpp (100%) rename source/{libwiigui => GUI}/sigslot.h (100%) delete mode 100644 source/filelist.h delete mode 100644 source/images/back.png delete mode 100644 source/images/bg_browser_selection.png delete mode 100644 source/images/bg_options_entry.png delete mode 100644 source/images/categoryLine.png delete mode 100644 source/images/categoryPrompt.png delete mode 100644 source/images/forward.png delete mode 100644 source/images/scrollbar.png delete mode 100644 source/images/scrollbar_arrowdown.png delete mode 100644 source/images/scrollbar_arrowup.png delete mode 100644 source/images/scrollbar_box.png delete mode 100644 source/images/usbport.png delete mode 100644 source/libwiigui/gui_customoptionbrowser.cpp delete mode 100644 source/libwiigui/gui_filebrowser.cpp delete mode 100644 source/libwiigui/gui_gamebrowser.cpp delete mode 100644 source/libwiigui/gui_optionbrowser.cpp create mode 100644 source/prompts/HomebrewPrompt.cpp create mode 100644 source/prompts/HomebrewPrompt.hpp create mode 100644 source/themes/filelist.h diff --git a/HBC/META.XML b/HBC/META.XML index 4cdda8a6..2befe043 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 2.1 r1088 - 201106051007 + 2.1 r1089 + 201106101221 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. diff --git a/Languages/czech.lang b/Languages/czech.lang index 44c8212d..36303132 100644 --- a/Languages/czech.lang +++ b/Languages/czech.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: David Jelinek (djelinek@hotmail.com) e->e,r->r,u->u, c->c \n" "Language-Team: r1056 - last version on http://djelinek.sweb.cz/_USBLoderGX/czech.lang \n" @@ -774,10 +774,10 @@ msgstr "Jak si prejete provést aktualizaci?" msgid "How to Shutdown?" msgstr "Jakým zpusobem ukoncit?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Odstranit aktualizaci" msgid "Rename Game on WBFS" msgstr "Prejmenovat hru na WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/danish.lang b/Languages/danish.lang index 685cbf5b..7cc15872 100644 --- a/Languages/danish.lang +++ b/Languages/danish.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: Fox888[dk]\n" "Language-Team: [dk]\n" @@ -774,10 +774,10 @@ msgstr "Hvordan skal der opdateres?" msgid "How to Shutdown?" msgstr "Hvordan skal der slukkes?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Fjern opdatering" msgid "Rename Game on WBFS" msgstr "Omdøb spil på WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "Nulstil" diff --git a/Languages/dutch.lang b/Languages/dutch.lang index 215c3f3e..4f695450 100644 --- a/Languages/dutch.lang +++ b/Languages/dutch.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:09+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2011-06-10 08:07+0100\n" "Last-Translator: glowy\n" "Language-Team: tj_cool, glowy\n" @@ -774,12 +774,12 @@ msgstr "Hoe wil je updaten?" msgid "How to Shutdown?" msgstr "Hoe uitzetten?" +msgid "Import Categories" +msgstr "" + msgid "Import categories" msgstr "Importeer categorieën" -msgid "Import categories from WiiTDB" -msgstr "Importeer categorieën van WiiTDB" - msgid "Import operation successfully completed." msgstr "Importeren succesvol afgerond" @@ -1152,6 +1152,9 @@ msgstr "Verwijder update" msgid "Rename Game on WBFS" msgstr "Spel hernoemen op WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" @@ -1574,6 +1577,9 @@ msgstr "van" msgid "seconds left" msgstr "seconden over" +#~ msgid "Import categories from WiiTDB" +#~ msgstr "Importeer categorieën van WiiTDB" + #~ msgid " Wad Saved as:" #~ msgstr " Wad opgeslagen als:" diff --git a/Languages/english.lang b/Languages/english.lang index 975ee0d9..1070d0a5 100644 --- a/Languages/english.lang +++ b/Languages/english.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -774,10 +774,10 @@ msgstr "" msgid "How to Shutdown?" msgstr "" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/finnish.lang b/Languages/finnish.lang index e09eaff7..adcee5c3 100644 --- a/Languages/finnish.lang +++ b/Languages/finnish.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: c64rmx\n" "Language-Team: \n" @@ -774,10 +774,10 @@ msgstr "Kuinka haluat päivittää?" msgid "How to Shutdown?" msgstr "Miten sammutetaan?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "Uudelleennimeä peli" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/french.lang b/Languages/french.lang index 5552b6ed..63a430d4 100644 --- a/Languages/french.lang +++ b/Languages/french.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:09+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: Cyan\n" "Language-Team: Badablek, Amour, ikya & Kin8\n" @@ -774,10 +774,10 @@ msgstr "Comment faire la Mise à jour ?" msgid "How to Shutdown?" msgstr "Arrêt de la Wii ?" -msgid "Import categories" -msgstr "Importer les catégories" +msgid "Import Categories" +msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "Importer les catégories" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Supprimer MàJ" msgid "Rename Game on WBFS" msgstr "Renommer un jeu" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "Réinitialisation" @@ -1574,6 +1577,9 @@ msgstr "sur" msgid "seconds left" msgstr "secondes restantes" +#~ msgid "Import categories from WiiTDB" +#~ msgstr "Importer les catégories" + #~ msgid " Wad Saved as:" #~ msgstr " WAD sauvegardé sous:" diff --git a/Languages/german.lang b/Languages/german.lang index 54c127f2..ec8a868a 100644 --- a/Languages/german.lang +++ b/Languages/german.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:09+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2010-07-03 17:35-0800\n" "Last-Translator: TheRealVisitor\n" "Language-Team: Bertilax, Snoozer, wishmasterf, ZEN.13, TheRealVisitor\n" @@ -774,12 +774,12 @@ msgstr "Was soll aktualisiert werden?" msgid "How to Shutdown?" msgstr "Wie soll ausgeschaltet werden?" +msgid "Import Categories" +msgstr "" + msgid "Import categories" msgstr "Importiere Kategorien" -msgid "Import categories from WiiTDB" -msgstr "Import. Kategorien (WiiTDB)" - msgid "Import operation successfully completed." msgstr "Import erfolgreich." @@ -1152,6 +1152,9 @@ msgstr "Update entfernen" msgid "Rename Game on WBFS" msgstr "Spiel umbenennen" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "Zurücksetzen" @@ -1574,6 +1577,9 @@ msgstr "von" msgid "seconds left" msgstr "Sekunden verbleiben" +#~ msgid "Import categories from WiiTDB" +#~ msgstr "Import. Kategorien (WiiTDB)" + #~ msgid " Wad Saved as:" #~ msgstr " WAD gespeichert als:" diff --git a/Languages/hungarian.lang b/Languages/hungarian.lang index 93a12bfa..2e59f7c9 100644 --- a/Languages/hungarian.lang +++ b/Languages/hungarian.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-12-29 11:05+0100\n" "Last-Translator: Springdale\n" "Language-Team: Tusk, Springdale\n" @@ -774,10 +774,10 @@ msgstr "Hogyan szeretnél frissíteni?" msgid "How to Shutdown?" msgstr "Hogyan kapcsoljon ki?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "WBFS játék átnevezése" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/italian.lang b/Languages/italian.lang index 12a0bfb4..193cfb1b 100644 --- a/Languages/italian.lang +++ b/Languages/italian.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2011-03-10 21:00+0200\n" "Last-Translator: Cambo \n" "Language-Team: Cambo\n" @@ -774,10 +774,10 @@ msgstr "Come Vuoi Aggiornare ?" msgid "How to Shutdown?" msgstr "Spegnimento Wii?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Rimuovi Agg." msgid "Rename Game on WBFS" msgstr "Rinomina Gioco su WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "Resetta" diff --git a/Languages/japanese.lang b/Languages/japanese.lang index a9794fbe..e947e09b 100644 --- a/Languages/japanese.lang +++ b/Languages/japanese.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: hosigumayuugi\n" "Language-Team: hosigumayuugi, papa, ichiroling\n" @@ -774,12 +774,12 @@ msgstr "更新方法の選択" msgid "How to Shutdown?" msgstr "終了方法の選択" +msgid "Import Categories" +msgstr "" + msgid "Import categories" msgstr "カテゴリをインポート" -msgid "Import categories from WiiTDB" -msgstr "WiiTDBからカテゴリをインポート" - msgid "Import operation successfully completed." msgstr "インポートに成功しました" @@ -1152,6 +1152,9 @@ msgstr "更新を取り除く" msgid "Rename Game on WBFS" msgstr "WBFS内のゲーム名を変更" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "リセット" @@ -1574,6 +1577,9 @@ msgstr "中" msgid "seconds left" msgstr "秒で完了" +#~ msgid "Import categories from WiiTDB" +#~ msgstr "WiiTDBからカテゴリをインポート" + #~ msgid " Wad Saved as:" #~ msgstr "WADを保存しました:" diff --git a/Languages/korean.lang b/Languages/korean.lang index 635894de..39dd011a 100644 --- a/Languages/korean.lang +++ b/Languages/korean.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: nextos@korea.com\n" "Language-Team: \n" @@ -774,10 +774,10 @@ msgstr "업데이트 할까요?" msgid "How to Shutdown?" msgstr "어떻게 종료할까요?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "WBFS에서 게임 이름 변경" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/norwegian.lang b/Languages/norwegian.lang index 40b9f889..e3c69778 100644 --- a/Languages/norwegian.lang +++ b/Languages/norwegian.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: raschi\n" "Language-Team: raschi\n" @@ -774,10 +774,10 @@ msgstr "Hvordan vil du oppdatere?" msgid "How to Shutdown?" msgstr "Hvordan skru av?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Fjern oppdatering" msgid "Rename Game on WBFS" msgstr "Gi nytt navn til spill på WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/polish.lang b/Languages/polish.lang index 54d4d9c4..3d2ff36f 100644 --- a/Languages/polish.lang +++ b/Languages/polish.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: ziom666 (zadania_prog@vp.pl)\n" "Language-Team: \n" @@ -774,10 +774,10 @@ msgstr "Wybierz rodzaj aktualizacji" msgid "How to Shutdown?" msgstr "Wybierz rodzaj zamkniecia" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "Zmien tytul gry na WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/portuguese_br.lang b/Languages/portuguese_br.lang index f75a8b72..041c2408 100644 --- a/Languages/portuguese_br.lang +++ b/Languages/portuguese_br.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-23 18:52+0200\n" "Last-Translator: aniemotion\n" "Language-Team: boto12, aniemotion\n" @@ -774,10 +774,10 @@ msgstr "Como pretende atualizar o programa?" msgid "How to Shutdown?" msgstr "Como desligar?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Remover atualização" msgid "Rename Game on WBFS" msgstr "Alterar nome do jogo na partição WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/portuguese_pt.lang b/Languages/portuguese_pt.lang index b21c4315..0d2792ec 100644 --- a/Languages/portuguese_pt.lang +++ b/Languages/portuguese_pt.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2011-03-11 20:00-0000\n" "Last-Translator: pplucky (Sky8000)\n" "Language-Team: pplucky (Sky8000 )\n" @@ -774,10 +774,10 @@ msgstr "O que deseja actualizar?" msgid "How to Shutdown?" msgstr "Como desligar a consola?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Remover actualização" msgid "Rename Game on WBFS" msgstr "Alterar nome do jogo (WBFS)" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "Reinicializar" diff --git a/Languages/russian.lang b/Languages/russian.lang index 2a44b327..00caa0e5 100644 --- a/Languages/russian.lang +++ b/Languages/russian.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: nikolai_ca\n" "Language-Team: Kir, alendit, nikolai_ca\n" @@ -774,10 +774,10 @@ msgstr "Что вы хотите обновить ?" msgid "How to Shutdown?" msgstr "Способ отключения?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "Переименовать игры в WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/schinese.lang b/Languages/schinese.lang index d09dd350..4c67f8e8 100644 --- a/Languages/schinese.lang +++ b/Languages/schinese.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: knife.hu kavid emul8ion\n" "Language-Team: kavid\n" @@ -774,10 +774,10 @@ msgstr "你要升级哪些文件?" msgid "How to Shutdown?" msgstr "如何关机?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "删除更新" msgid "Rename Game on WBFS" msgstr "改变 WBFS (硬盘)上的游戏名称" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "重启" diff --git a/Languages/spanish.lang b/Languages/spanish.lang index a46e2a31..b9efb7cd 100644 --- a/Languages/spanish.lang +++ b/Languages/spanish.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: SirPalax\n" "Language-Team: Penn, SirPalax\n" @@ -774,10 +774,10 @@ msgstr "¿Cómo quieres actualizar?" msgid "How to Shutdown?" msgstr "¿Cómo quieres apagar?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "Quitar actualización" msgid "Rename Game on WBFS" msgstr "Renombrar juego en WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/swedish.lang b/Languages/swedish.lang index 78be6334..e3399333 100644 --- a/Languages/swedish.lang +++ b/Languages/swedish.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2010-01-19 17:39+0200\n" "Last-Translator: Katsurou\n" "Language-Team: Katsurou, pirateX\n" @@ -774,10 +774,10 @@ msgstr "Hur vill du uppdatera?" msgid "How to Shutdown?" msgstr "Hur vill du stänga av?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "Döp om spel på WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/tchinese.lang b/Languages/tchinese.lang index 18208d4c..2e6f24d1 100644 --- a/Languages/tchinese.lang +++ b/Languages/tchinese.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2010-02-15 21:00+0800\n" "Last-Translator: Jane.H\n" "Language-Team: kyogc, Miller, Mika Li, Jane.H\n" @@ -774,10 +774,10 @@ msgstr "是否執行更新?" msgid "How to Shutdown?" msgstr "關機選項?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "移除更新" msgid "Rename Game on WBFS" msgstr "變更WBFS上的遊戲名稱" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "重新啟動" diff --git a/Languages/thai.lang b/Languages/thai.lang index f59ecca6..62a6dd42 100644 --- a/Languages/thai.lang +++ b/Languages/thai.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: Nitro_subzero \n" "Language-Team: Nitro_subzero\n" @@ -774,10 +774,10 @@ msgstr "ต้องการอัพเดทแบบไหน ?" msgid "How to Shutdown?" msgstr "ต้องการปิดแบบไหน ?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "เปลี่ยนชื่อเกมส์บน WBFS" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Languages/turkish.lang b/Languages/turkish.lang index 46748e7f..39ab39bc 100644 --- a/Languages/turkish.lang +++ b/Languages/turkish.lang @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 14:06+0200\n" +"POT-Creation-Date: 2011-06-14 16:22+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "Last-Translator: omercigingelini\n" "Language-Team: omercigingelini\n" @@ -774,10 +774,10 @@ msgstr "Nasıl güncellemek istiyorsun?" msgid "How to Shutdown?" msgstr "Nasıl Kapansın?" -msgid "Import categories" +msgid "Import Categories" msgstr "" -msgid "Import categories from WiiTDB" +msgid "Import categories" msgstr "" msgid "Import operation successfully completed." @@ -1152,6 +1152,9 @@ msgstr "" msgid "Rename Game on WBFS" msgstr "WBFS'deki oyunu yeniden isimlendir" +msgid "Rename category" +msgstr "" + msgid "Reset" msgstr "" diff --git a/Makefile b/Makefile index ed6edcab..5547ce3d 100644 --- a/Makefile +++ b/Makefile @@ -17,10 +17,7 @@ include $(DEVKITPPC)/wii_rules TARGET := boot BUILD := build SOURCES := source \ - source/libwiigui \ - source/images \ - source/fonts \ - source/sounds \ + source/GUI \ source/Controls \ source/system \ source/libs/libwbfs \ @@ -48,7 +45,10 @@ SOURCES := source \ source/utils \ source/utils/minizip \ source/usbloader/wbfs -DATA := data +DATA := data \ + data/images \ + data/fonts \ + data/sounds INCLUDES := source #--------------------------------------------------------------------------------- @@ -97,19 +97,20 @@ export DEPSDIR := $(CURDIR)/$(BUILD) # automatically build a list of object files for our project #--------------------------------------------------------------------------------- SVNREV := $(shell bash ./svnrev.sh) +IMPORTFILES := $(shell bash ./filelist.sh) export CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) export CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) -ELFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.elf))) +ELFFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.elf))) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.bin))) -TTFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ttf))) -PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) -OGGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ogg))) -PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) -WAVFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.wav))) +TTFFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.ttf))) +PNGFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.png))) +OGGFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.ogg))) +PCMFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.pcm))) +WAVFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.wav))) DOLFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.dol))) -MP3FILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mp3))) +MP3FILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.mp3))) #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C @@ -120,12 +121,12 @@ else export LD := $(CXX) endif -export OFILES := $(addsuffix .o,$(BINFILES)) \ - $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ +export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ $(sFILES:.s=.o) $(SFILES:.S=.o) \ - $(TTFFILES:.ttf=.ttf.o) $(PNGFILES:.png=.png.o) $(addsuffix .o,$(DOLFILES))\ + $(TTFFILES:.ttf=.ttf.o) $(PNGFILES:.png=.png.o) $(addsuffix .o,$(DOLFILES)) \ $(OGGFILES:.ogg=.ogg.o) $(PCMFILES:.pcm=.pcm.o) $(MP3FILES:.mp3=.mp3.o) \ - $(WAVFILES:.wav=.wav.o) $(addsuffix .o,$(ELFFILES)) $(CURDIR)/data/magic_patcher.o + $(WAVFILES:.wav=.wav.o) $(addsuffix .o,$(ELFFILES)) $(addsuffix .o,$(BINFILES)) \ + $(CURDIR)/data/magic_patcher.o #--------------------------------------------------------------------------------- # build a list of include paths diff --git a/Themes/Default.them b/Themes/Default.them index 92e4ae55..3cf85f9f 100644 --- a/Themes/Default.them +++ b/Themes/Default.them @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: USB Loader GX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-03 22:18+0200\n" +"POT-Creation-Date: 2011-06-14 16:37+0200\n" "PO-Revision-Date: 2009-10-01 01:00+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -19,15 +19,36 @@ msgstr "" "Theme-Team: Example\n" "Theme-Version: Example\n" -msgid "r=0 g=0 b=0 a=255 - prompt windows text color" +msgid "right - checkbox browser scrollbar align hor" msgstr "" -msgid "r=0 g=0 b=0 a=255 - settings text color" +msgid "top - checkbox browser scrollbar align ver" +msgstr "" + +msgid "0 - checkbox browser scrollbar pos x" +msgstr "" + +msgid "5 - checkbox browser scrollbar pos y" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - checkbox browser text color" msgstr "" msgid "9 - game list browser page size" msgstr "" +msgid "right - game browser scrollbar align hor" +msgstr "" + +msgid "top - game browser scrollbar align ver" +msgstr "" + +msgid "0 - game browser scrollbar pos x" +msgstr "" + +msgid "5 - game browser scrollbar pos y" +msgstr "" + msgid "r=0 g=0 b=0 a=255 - game browser list text color" msgstr "" @@ -70,6 +91,24 @@ msgstr "" msgid "255 - tooltip alpha" msgstr "" +msgid "right - options browser scrollbar align hor" +msgstr "" + +msgid "top - options browser scrollbar align ver" +msgstr "" + +msgid "0 - options browser scrollbar pos x" +msgstr "" + +msgid "5 - options browser scrollbar pos y" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - settings text color" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - prompt windows button text color" +msgstr "" + msgid "r=55 g=190 b=237 a=255 - hdd info color" msgstr "" @@ -376,6 +415,9 @@ msgstr "" msgid "288 - carousel layout category btn pos x widescreen" msgstr "" +msgid "13 - carousel layout category btn pos y" +msgstr "" + msgid "320 - carousel layout list btn pos x" msgstr "" @@ -451,11 +493,176 @@ msgstr "" msgid "68 - region info text pos x" msgstr "" +msgid "r=0 g=0 b=0 a=255 - category prompt title text color" +msgstr "" + +msgid "center - category prompt title text align hor" +msgstr "" + +msgid "top - category prompt title text align ver" +msgstr "" + +msgid "0 - category prompt title text pos x" +msgstr "" + +msgid "10 - category prompt title text pos y" +msgstr "" + +msgid "center - category prompt browser align hor" +msgstr "" + +msgid "top - category prompt browser align ver" +msgstr "" + +msgid "0 - category prompt browser pos x" +msgstr "" + +msgid "45 - category prompt browser pos y" +msgstr "" + +msgid "left - category prompt add button text align hor" +msgstr "" + +msgid "top - category prompt add button text align ver" +msgstr "" + +msgid "10 - category prompt add button text pos x" +msgstr "" + +msgid "6 - category prompt add button text pos y" +msgstr "" + +msgid "left - category prompt add button align hor" +msgstr "" + +msgid "top - category prompt add button align ver" +msgstr "" + +msgid "180 - category prompt add button pos x" +msgstr "" + +msgid "330 - category prompt add button pos y" +msgstr "" + +msgid "left - category prompt delete button text align hor" +msgstr "" + +msgid "top - category prompt delete button text align ver" +msgstr "" + +msgid "10 - category prompt delete button text pos x" +msgstr "" + +msgid "6 - category prompt delete button text pos y" +msgstr "" + +msgid "left - category prompt delete button align hor" +msgstr "" + +msgid "top - category prompt delete button align ver" +msgstr "" + +msgid "330 - category prompt delete button pos y" +msgstr "" + +msgid "5 - category prompt delete button pos x" +msgstr "" + +msgid "left - category prompt edit button text align hor" +msgstr "" + +msgid "top - category prompt edit button text align ver" +msgstr "" + +msgid "10 - category prompt edit button text pos x" +msgstr "" + +msgid "6 - category prompt edit button text pos y" +msgstr "" + +msgid "left - category prompt edit button align hor" +msgstr "" + +msgid "top - category prompt edit button align ver" +msgstr "" + +msgid "180 - category prompt edit button pos x" +msgstr "" + +msgid "362 - category prompt edit button pos y" +msgstr "" + +msgid "bottom - category prompt save button align ver" +msgstr "" + +msgid "center - category prompt save button align hor" +msgstr "" + +msgid "-110 - category prompt save button pos x" +msgstr "" + +msgid "0 - category prompt save button pos y" +msgstr "" + +msgid "bottom - category prompt back button align ver" +msgstr "" + +msgid "center - category prompt back button align hor" +msgstr "" + +msgid "0 - category prompt back button pos y" +msgstr "" + +msgid "110 - category prompt back button pos x" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - prompt windows text color" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - game window name text color" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - game window size text color" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - game window playcount text color" +msgstr "" + msgid "r=0 g=0 b=0 a=255 - game window details button text color" msgstr "" msgid "r=30 g=30 b=240 a=255 - game window details button over text color" msgstr "" +msgid "center - settings option browser align hor" +msgstr "" + +msgid "top - settings option browser align ver" +msgstr "" + +msgid "0 - settings option browser pos x" +msgstr "" + +msgid "90 - settings option browser pos y" +msgstr "" + +msgid "r=0 g=0 b=0 a=255 - settings title text color" +msgstr "" + +msgid "center - settings title text align hor" +msgstr "" + +msgid "top - settings title text align ver" +msgstr "" + +msgid "0 - settings title text pos x" +msgstr "" + +msgid "40 - settings title text pos y" +msgstr "" + +msgid "310 - settings title text max width" +msgstr "" + msgid "1 - Enable tooltips: 0 for off and 1 for on" msgstr "" diff --git a/data/certs.dat b/data/certs.dat deleted file mode 100644 index 2184107db41e656e1a40ce57b3898fdebe9ab42e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 zcmb`FS5y<&7KRfA0u05B!J&vW1se&{38EkpP*hN&p_jl=!~_H}Bot{9dRMBni9iTN z2sMCoLNC%(Vg#(AhY}((cxTp~d6>65djI{f*IDa)|HED%00;n3%c=67XZ5~Gnd;*X zeKR9WyF~UrD!ZjD$L0f0a9oZ{90uJ_d@DIW9H7)E+AKJF=9vEy2w#Vq&^mgsnCm43 zX4Wox1S2G633&OxEb?>$bBP7osm?QYxib~5UbEb2VPUpJpOexDjO+9)ogOJ$gAwA zP!@#xwJF?NxKM+{q`D z#>(EFQZ4SKn3`>A$jP*a7&j4itWQlhM3g7oGP8;Prj@S6-U8~%5jQQUivV6Dey>Up|#?p(jOMoB94KJ^IKY;&<0u2pR{+l!3*JQI3 zWLu5zn_roe>si<|3$htF)eIUu#M?89@ zibTG=x|F{ygUnnX&w3H(&8r@k+I8kziyEi7NSH2RU)bD@k^QL>!#A2^FcZ(B%Zgng zg`e_hi}M)L1;GK%jxdC>T8Purg*(Z%lV}Zm=c3E-#Z^lTgjO1*4$MBcxH66h0RNcp z$sgP`fCKw{q+fhpj*+wIME2&O9dcw)Ufl;pA<-;eQ1w18u*)+<2efRjMM3nBvMBr{&?B5!yS-viWdtHxjrwzy8(F<>1@!F0ASW z;|_jWOCAM3#PuJqo4r<8Fe7GdP8tihW8vqr34FA-U5| zE#UfxX>n7dgc%b5=vpMlxoe&S~52^*g^HE8-OBqGM0C#NW(j0rJUYq)bD z-bBsTPKbizK_iWC8l6l6cvsy@vHc}-en=KG$T$tv!Yb|7$hr;+#b zsbmgQ+$p@-RMjn&4mE#uL^Gc;-x!oHcMkD*pN!h!=N0k0DMZ!Miwyry5?Ok0Q1ZdK zIHsy|Wa=GoS+QuS#5g?jNBj?ZVo$pf$|&ZugYmo1#L(fx!Q^E2&$xw$3$4 zMh&9;L;wD|V{&Qeo;d^I#*gQj8Do`-x>u@+5lUe`t4aq=i5-?x0qFJG)|@(8T(ktV zn=iWT-qCz{0sZ|e8Kf2%P}l1G2iH53i`LVm)B_vWzSig=2H3R_XwBanOYsdqVr_y4-aE^avSJ62jR0g_fBrxWfPJ*$2sUd6h#Q)9(ffVDL6j z67wRVvs=5wEkzp?JJD5bRCeM}6y~Ie)wN~YUJZ}ft7z@FygpY4IiVpj-uL*dR9d;$ z4YWRs?a&H*8fHE2IKBUOw*B+>|HFSvi@*F=`)Bw6`eHZajg^DQS}_3!go5Zg&vW0@ zs{*1a$Evt@E3L_!mbqi$`&1J`C1qAe1$y~34Y|n1Io&2FIAMecdFV;9DgD&cbFF&Y zj<~q)wk%3AAgj6Bqk^oNl&=WreL#N>>uT3PhE58F0HgkvTiBXou{6rq@r<>v9w3SC z==*WktC{KAV50KYd{JjCjFEtP)8c?wRGN~w!KvV)>sPXR!V0Uh$hDSV7pc*(7W2L> z#${|y_MTCQI{AXQGPB-cc8vN~B>i1x2+>=-qdJ_e;TLGFvU^@7f|OO-cH|SEhgkx| l4R;5JEbUe{{fa&sEGgo diff --git a/source/fonts/clock.ttf b/data/fonts/clock.ttf similarity index 100% rename from source/fonts/clock.ttf rename to data/fonts/clock.ttf diff --git a/source/fonts/font.ttf b/data/fonts/font.ttf similarity index 100% rename from source/fonts/font.ttf rename to data/fonts/font.ttf diff --git a/data/haxx.certs b/data/haxx.certs deleted file mode 100644 index 32dd50ca02361daeda4db661dc2813dbffa83839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 zcmb`I_g@l<8pfei)Z>T~b{v_jv?Z8Z%+gA zHMh7&t_G1>TDWl_nMZH;bNdVQKEHq8&--~l&+|S2AOPt9(vEgJh*7|23*&eD7)gf@ z1dtQhFS4hGR$F9Bo7+|-8I_2VnVy5yC*+dRol^$Fb+Z?lsl#Q8y4Nd+p-RDC%Swk$ zh^-dme(2Szrp#(ubc6)7gD;}^(eWI40sVtZsia02P}lO}jLZG8d8-Lh(xJ7RKP&YR zz3eK5!C+2o6{e1-ptbPKl(g?iMxJo|2 zZ7(Fzlye`JS&`Q*vW7zrsKy3K$}A5Fbn$6k z<|6B+bn6}Agh3+YnFqTq!DaC1~;BmG!9VPUL1P1qV z4B(fK_jJ8q6t#pZ?{QvlSIR^mcVyR;FyS25^}P75vK*TaILdK8DRC6^IPSCL^njmI zw`hal(76-73m|+oYE(K)pIV`2v-FFuC(`SdD*)Ehs_E-ioj)y=jbS>GWQ z#$&86GuTO+|8PX5(z{YjL4zM8m~9&2J9~D)E)nsnurcSEubYn$91JUa{$0B(O@vsE z?mzT_dhW&F%i$SFDXM0@t9f==YpJpz)TdeD(cI1Am^8DemUZSh6?;XEPJVKHQgK`- zQ=yJ9=ULf4=t32-P!;K@_Tn)f&@De|F4OCI@<~zxD@a=eSV>9- zfAPWR)(2w;fDgNUoQzDQ5wrM;U@bJbpALW_h^^-_&0|%**r`?TU0|Y_=sMl(-jY}K zx*msr=T%7Vk1$bU+3hRHdZRWzp=4IZ=D2D>7sbSMLqkrcCD5pzuw`{-qBgW7_O7XQ z#I9C~7JCDzE0fhO{vh%6SUa_OjQB?;Pnl%ZS_4Lq?Qg{Y^)kzQv&IvLq^&KyExx)Z z-~5LDoB#drzgXb@-Uk3+z2$FHf$yGPnv(0BTQ}wCaN|HxCb-4y=MJwmf`h6=?ohnI zV!1fa^8}S0IBWT+LxXe*;&BDst&gWX^|p1l8(Vt%quJN@-&P*Zpg&9t$g8nNoH)`G zE!k@%^0BzT%|{=8@(ZnF*A94VtZX28opR@Db(|(MSU{jm8q&$}q^B&aPncr-6e8@R zm>Yso0?Wv{F^#++3AYB_JEihPe!Rb$vnhj2TOCP%8|}%f9-P#EZnsg5(~vJrm$1ug z=)lPSQHJ3g$~5>G!=lTIT_=T{ac_=x@7D#v0ZtAugtA(owUJ!!9IC)FBFADGk;6fn_bAt zMIp^g?UVFgG;Q_~@OQDHeo_v&RV@3nBCL9~VHP4cx$A<_XN&G`AVH~Sc2}nhFdSU6cydt_IS=iugxtRdv zLee(*ICH@C2_J<4b$IFa2H?FFh`I-{TWpVdq)G%Ob#3RryC8t=SS7d1eKV$d>swE6 zMNV1xvc?p`efHzu|408_Hv8Rw>U-OSU7O?Ff>{eWb*Jr=wbzOoG-VkQ8tKN9nIBus zgqW$--aiy$tY%{?M8WZ(kw$k6Psam1%kL)I{1rCcFN^78oP}y(m9{HoUHSy0Sv%iR zJhMGclF)#JfaE7S2{_GD!*?8?)lbxT_h=bq*%$p&%{vL4DxQgX$2AHbH{AY`+kcRv zxv~~ko;R$epPL+MPLmRjHg@XwI180^P7b_|-Xg;T)W~zb9+o{{D4K@ry>S!q9>H$? z#cV(L0wP2zfx{Gc3~4Y?bxoo}&E6l=%wbH|`RB-8K)g60qjvO7Y0P#aQMKp_!}ps+ ey51+0d_WeCsp=G#bRS$?AQ~hw0#Dnk|NjFgps0xe diff --git a/source/images/abcIcon.png b/data/images/abcIcon.png similarity index 100% rename from source/images/abcIcon.png rename to data/images/abcIcon.png diff --git a/source/images/add.png b/data/images/add.png similarity index 100% rename from source/images/add.png rename to data/images/add.png diff --git a/source/images/addressbar_textbox.png b/data/images/addressbar_textbox.png similarity index 100% rename from source/images/addressbar_textbox.png rename to data/images/addressbar_textbox.png diff --git a/source/images/arrangeCarousel.png b/data/images/arrangeCarousel.png similarity index 100% rename from source/images/arrangeCarousel.png rename to data/images/arrangeCarousel.png diff --git a/source/images/arrangeCarousel_gray.png b/data/images/arrangeCarousel_gray.png similarity index 100% rename from source/images/arrangeCarousel_gray.png rename to data/images/arrangeCarousel_gray.png diff --git a/source/images/arrangeGrid.png b/data/images/arrangeGrid.png similarity index 100% rename from source/images/arrangeGrid.png rename to data/images/arrangeGrid.png diff --git a/source/images/arrangeGrid_gray.png b/data/images/arrangeGrid_gray.png similarity index 100% rename from source/images/arrangeGrid_gray.png rename to data/images/arrangeGrid_gray.png diff --git a/source/images/arrangeList.png b/data/images/arrangeList.png similarity index 100% rename from source/images/arrangeList.png rename to data/images/arrangeList.png diff --git a/source/images/arrangeList_gray.png b/data/images/arrangeList_gray.png similarity index 100% rename from source/images/arrangeList_gray.png rename to data/images/arrangeList_gray.png diff --git a/source/images/background.png b/data/images/background.png similarity index 100% rename from source/images/background.png rename to data/images/background.png diff --git a/source/images/balanceboard.png b/data/images/balanceboard.png similarity index 100% rename from source/images/balanceboard.png rename to data/images/balanceboard.png diff --git a/source/images/balanceboardR.png b/data/images/balanceboardR.png similarity index 100% rename from source/images/balanceboardR.png rename to data/images/balanceboardR.png diff --git a/source/images/battery.png b/data/images/battery.png similarity index 100% rename from source/images/battery.png rename to data/images/battery.png diff --git a/source/images/battery_bar.png b/data/images/battery_bar.png similarity index 100% rename from source/images/battery_bar.png rename to data/images/battery_bar.png diff --git a/source/images/battery_bar_red.png b/data/images/battery_bar_red.png similarity index 100% rename from source/images/battery_bar_red.png rename to data/images/battery_bar_red.png diff --git a/source/images/battery_bar_white.png b/data/images/battery_bar_white.png similarity index 100% rename from source/images/battery_bar_white.png rename to data/images/battery_bar_white.png diff --git a/source/images/battery_red.png b/data/images/battery_red.png similarity index 100% rename from source/images/battery_red.png rename to data/images/battery_red.png diff --git a/source/images/battery_white.png b/data/images/battery_white.png similarity index 100% rename from source/images/battery_white.png rename to data/images/battery_white.png diff --git a/source/images/bg_browser.png b/data/images/bg_browser.png similarity index 100% rename from source/images/bg_browser.png rename to data/images/bg_browser.png diff --git a/data/images/bg_browser_selection.png b/data/images/bg_browser_selection.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f49780c71d5bc74f25acf06cac1fa653e40a32 GIT binary patch literal 5250 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 ^~M)RW8^5Ag{_4 z@8zbbj3(9nJ_T+GrMNX+rsakk{LGg(Sd$p!MhE0t&7q~EFUktI>IS%`!=zW-DGxZ^ zP$n&w%PT^wUIvr->*qPVoDgh$2+a>dBaqRhs&f6d^s4M#7B|h^}tFDRVWHcc1bT235+oLWcQ(>_j zGwJ8oxwG2wDNnWyq;x9_E9`$^dQ;o3)Xx5G%rH|R=(RUcd1Ky+0?3#UG1M%$hJqm$ZfnANcx zA-pfyK3G7@O+RsK%40!y;#&0H#IBZ*rTqL0r;9Y4;B~s9+iDovpnawr(O)U?w}>7) zd0PR2H>7Mwz$tu_no?k5R{)ys-~PWTQOr)N6r+~tTE$ge34J|A}eVA=O?7Pv(a zT;F0$5)(D|>YT##{|-q%bkndgM)Y>{R8tf{umy{n#_GuZ?NR7I3%2}q$EF+Mg7p6a DZYy%D literal 0 HcmV?d00001 diff --git a/source/images/bg_options_settings.png b/data/images/bg_options_settings.png similarity index 100% rename from source/images/bg_options_settings.png rename to data/images/bg_options_settings.png diff --git a/source/images/boxBorder.png b/data/images/boxBorder.png similarity index 100% rename from source/images/boxBorder.png rename to data/images/boxBorder.png diff --git a/source/images/browser.png b/data/images/browser.png similarity index 100% rename from source/images/browser.png rename to data/images/browser.png diff --git a/source/images/browser_over.png b/data/images/browser_over.png similarity index 100% rename from source/images/browser_over.png rename to data/images/browser_over.png diff --git a/source/images/button_dialogue_box.png b/data/images/button_dialogue_box.png similarity index 100% rename from source/images/button_dialogue_box.png rename to data/images/button_dialogue_box.png diff --git a/source/images/button_install.png b/data/images/button_install.png similarity index 100% rename from source/images/button_install.png rename to data/images/button_install.png diff --git a/source/images/button_install_over.png b/data/images/button_install_over.png similarity index 100% rename from source/images/button_install_over.png rename to data/images/button_install_over.png diff --git a/source/images/category.png b/data/images/category.png similarity index 100% rename from source/images/category.png rename to data/images/category.png diff --git a/data/images/categoryPrompt.png b/data/images/categoryPrompt.png new file mode 100644 index 0000000000000000000000000000000000000000..8066e1340e96653644d3be1374bab168105cfdf6 GIT binary patch literal 10406 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 literal 0 HcmV?d00001 diff --git a/source/images/category_gray.png b/data/images/category_gray.png similarity index 100% rename from source/images/category_gray.png rename to data/images/category_gray.png diff --git a/source/images/cero_a.png b/data/images/cero_a.png similarity index 100% rename from source/images/cero_a.png rename to data/images/cero_a.png diff --git a/source/images/cero_b.png b/data/images/cero_b.png similarity index 100% rename from source/images/cero_b.png rename to data/images/cero_b.png diff --git a/source/images/cero_c.png b/data/images/cero_c.png similarity index 100% rename from source/images/cero_c.png rename to data/images/cero_c.png diff --git a/source/images/cero_d.png b/data/images/cero_d.png similarity index 100% rename from source/images/cero_d.png rename to data/images/cero_d.png diff --git a/source/images/cero_z.png b/data/images/cero_z.png similarity index 100% rename from source/images/cero_z.png rename to data/images/cero_z.png diff --git a/source/images/Channel_btn.png b/data/images/channel_btn.png similarity index 100% rename from source/images/Channel_btn.png rename to data/images/channel_btn.png diff --git a/data/images/checkBoxSelection.png b/data/images/checkBoxSelection.png new file mode 100644 index 0000000000000000000000000000000000000000..4b01949c3bff8ee941f15e2977913b7599a5631e GIT binary patch literal 1914 zcmYLKYgAKL7CuQxf)E}R5W*`_M^-G>BrpR4jtQXP11M6a)rFMAP#zM+3SyPOO+tA! zq2OQv4G3+lmvI@rw7a7!6e>4)E|KB-->hxi{Y6r*c%ZFz_~2| zh_e9DV(>cyz-gE`%LBl-6af3=(jPAl0YE11+wC9uRr%2ym(KRfBoc{Jp2~x=30QMO z=$keV3GZ616f4igRi!tq84x;aN z47ay91>UwNML~3uzKyWJ|$%!X5CaDjS*ZRog~0iA4!IG?UgS6^ksx{ z?)lY_D-Yc^UF)n(5`;l zZhDA(Pom@{K*|HCrEy=xJx|vvE>89>VH8y+s#krb&i2DleKK)>vkP5QAl+zb1kQgg zdtDce_H>`D%mWr_UXN{7Dr3+~j$JAH^VLoSn~NLTXI6(9Ro2Gl z(|gy{FFE|j80A^o>`r{s{Fc_;ZfxFmCt^GPw}AUAm{k@_$06Y!Bb3CJUjv>vZ=2?R zd0leq3B%z%RL=T1i!z?QQ59s3SIp%aO7;~b=tU|t(W+PiV3 z6b*ABDtWeYd?W-PxwKqW@tTRWq+?NK+9f0-G|@6WnBYUD9?akkCYjZoRL6^j-7X7w zxe>`0idP?CI`kLOo8=d!z(0A8q`w!{!afX?LCpxc)Fe zXlqF1K|O1Z&#zi^#GojutIV3zARp8t6hz$IiL`#J%rmjCtG(&ARFS(hVi|KT;++g{*& zxo~S_d5(D}a}6~g4Z8Im|Lu)`K#GEJE^rd^7w~9qND79&o3kPeVhBYTf>94i%3SjN zg&R5%$`PTQvOOoFeBX&<_b?P|ApG>%mFmIZHi*C3Fq2y9a1I!LEUGG7E61o4zp%p1 zDUq{m9F_SjQ`e|}`=T&JE~iNX`er7c89>_@V(7x#pNjS5l2FGUxjdxYStuVz+3Yn! z$q@t#+)(cUmq@pw!}8txTB2`h{@n%@Tq0x-d&phGybVuOc|vuCM28uc3*Rj+XmLs2 zL#amC(x}g?9y0qgpZIBFu%^_7ZZ!u%pOVa&e6j5jr7X%=bt)YAU;hFK(XLxN@AP)R zl~okKvim2{X(}fl{alEgIFhltc(&N*< U=_!N=f1Y69p0M550(jE@01~lQ?*IS* literal 0 HcmV?d00001 diff --git a/source/images/classiccontroller.png b/data/images/classiccontroller.png similarity index 100% rename from source/images/classiccontroller.png rename to data/images/classiccontroller.png diff --git a/source/images/classiccontrollerR.png b/data/images/classiccontrollerR.png similarity index 100% rename from source/images/classiccontrollerR.png rename to data/images/classiccontrollerR.png diff --git a/source/images/closebutton.png b/data/images/closebutton.png similarity index 100% rename from source/images/closebutton.png rename to data/images/closebutton.png diff --git a/source/images/credits_bg.png b/data/images/credits_bg.png similarity index 100% rename from source/images/credits_bg.png rename to data/images/credits_bg.png diff --git a/source/images/credits_button.png b/data/images/credits_button.png similarity index 100% rename from source/images/credits_button.png rename to data/images/credits_button.png diff --git a/source/images/credits_button_over.png b/data/images/credits_button_over.png similarity index 100% rename from source/images/credits_button_over.png rename to data/images/credits_button_over.png diff --git a/source/images/dancepad.png b/data/images/dancepad.png similarity index 100% rename from source/images/dancepad.png rename to data/images/dancepad.png diff --git a/source/images/dancepadR.png b/data/images/dancepadR.png similarity index 100% rename from source/images/dancepadR.png rename to data/images/dancepadR.png diff --git a/source/images/dialogue_box.png b/data/images/dialogue_box.png similarity index 100% rename from source/images/dialogue_box.png rename to data/images/dialogue_box.png diff --git a/source/images/dialogue_box_startgame.png b/data/images/dialogue_box_startgame.png similarity index 100% rename from source/images/dialogue_box_startgame.png rename to data/images/dialogue_box_startgame.png diff --git a/source/images/drums.png b/data/images/drums.png similarity index 100% rename from source/images/drums.png rename to data/images/drums.png diff --git a/source/images/drumsR.png b/data/images/drumsR.png similarity index 100% rename from source/images/drumsR.png rename to data/images/drumsR.png diff --git a/source/images/dvd.png b/data/images/dvd.png similarity index 100% rename from source/images/dvd.png rename to data/images/dvd.png diff --git a/source/images/dvd_gray.png b/data/images/dvd_gray.png similarity index 100% rename from source/images/dvd_gray.png rename to data/images/dvd_gray.png diff --git a/source/images/esrb_ao.png b/data/images/esrb_ao.png similarity index 100% rename from source/images/esrb_ao.png rename to data/images/esrb_ao.png diff --git a/source/images/esrb_e.png b/data/images/esrb_e.png similarity index 100% rename from source/images/esrb_e.png rename to data/images/esrb_e.png diff --git a/source/images/esrb_ec.png b/data/images/esrb_ec.png similarity index 100% rename from source/images/esrb_ec.png rename to data/images/esrb_ec.png diff --git a/source/images/esrb_eten.png b/data/images/esrb_eten.png similarity index 100% rename from source/images/esrb_eten.png rename to data/images/esrb_eten.png diff --git a/source/images/esrb_m.png b/data/images/esrb_m.png similarity index 100% rename from source/images/esrb_m.png rename to data/images/esrb_m.png diff --git a/source/images/esrb_t.png b/data/images/esrb_t.png similarity index 100% rename from source/images/esrb_t.png rename to data/images/esrb_t.png diff --git a/source/images/exit_bottom.png b/data/images/exit_bottom.png similarity index 100% rename from source/images/exit_bottom.png rename to data/images/exit_bottom.png diff --git a/source/images/exit_bottom_over.png b/data/images/exit_bottom_over.png similarity index 100% rename from source/images/exit_bottom_over.png rename to data/images/exit_bottom_over.png diff --git a/source/images/exit_button.png b/data/images/exit_button.png similarity index 100% rename from source/images/exit_button.png rename to data/images/exit_button.png diff --git a/source/images/exit_top.png b/data/images/exit_top.png similarity index 100% rename from source/images/exit_top.png rename to data/images/exit_top.png diff --git a/source/images/exit_top_over.png b/data/images/exit_top_over.png similarity index 100% rename from source/images/exit_top_over.png rename to data/images/exit_top_over.png diff --git a/source/images/favIcon.png b/data/images/favIcon.png similarity index 100% rename from source/images/favIcon.png rename to data/images/favIcon.png diff --git a/source/images/favIcon_gray.png b/data/images/favIcon_gray.png similarity index 100% rename from source/images/favIcon_gray.png rename to data/images/favIcon_gray.png diff --git a/source/images/favorite.png b/data/images/favorite.png similarity index 100% rename from source/images/favorite.png rename to data/images/favorite.png diff --git a/source/images/gameinfo1.png b/data/images/gameinfo1.png similarity index 100% rename from source/images/gameinfo1.png rename to data/images/gameinfo1.png diff --git a/source/images/gameinfo1a.png b/data/images/gameinfo1a.png similarity index 100% rename from source/images/gameinfo1a.png rename to data/images/gameinfo1a.png diff --git a/source/images/gameinfo2.png b/data/images/gameinfo2.png similarity index 100% rename from source/images/gameinfo2.png rename to data/images/gameinfo2.png diff --git a/source/images/gameinfo2a.png b/data/images/gameinfo2a.png similarity index 100% rename from source/images/gameinfo2a.png rename to data/images/gameinfo2a.png diff --git a/source/images/gcncontroller.png b/data/images/gcncontroller.png similarity index 100% rename from source/images/gcncontroller.png rename to data/images/gcncontroller.png diff --git a/source/images/gcncontrollerR.png b/data/images/gcncontrollerR.png similarity index 100% rename from source/images/gcncontrollerR.png rename to data/images/gcncontrollerR.png diff --git a/source/images/guitar.png b/data/images/guitar.png similarity index 100% rename from source/images/guitar.png rename to data/images/guitar.png diff --git a/source/images/guitarR.png b/data/images/guitarR.png similarity index 100% rename from source/images/guitarR.png rename to data/images/guitarR.png diff --git a/source/images/gxlogo.png b/data/images/gxlogo.png similarity index 100% rename from source/images/gxlogo.png rename to data/images/gxlogo.png diff --git a/source/images/icon_folder.png b/data/images/icon_folder.png similarity index 100% rename from source/images/icon_folder.png rename to data/images/icon_folder.png diff --git a/source/images/keyboard_backspace_over.png b/data/images/keyboard_backspace_over.png similarity index 100% rename from source/images/keyboard_backspace_over.png rename to data/images/keyboard_backspace_over.png diff --git a/source/images/keyboard_clear_over.png b/data/images/keyboard_clear_over.png similarity index 100% rename from source/images/keyboard_clear_over.png rename to data/images/keyboard_clear_over.png diff --git a/source/images/keyboard_key.png b/data/images/keyboard_key.png similarity index 100% rename from source/images/keyboard_key.png rename to data/images/keyboard_key.png diff --git a/source/images/keyboard_key_over.png b/data/images/keyboard_key_over.png similarity index 100% rename from source/images/keyboard_key_over.png rename to data/images/keyboard_key_over.png diff --git a/source/images/keyboard_largekey_over.png b/data/images/keyboard_largekey_over.png similarity index 100% rename from source/images/keyboard_largekey_over.png rename to data/images/keyboard_largekey_over.png diff --git a/source/images/keyboard_mediumkey_over.png b/data/images/keyboard_mediumkey_over.png similarity index 100% rename from source/images/keyboard_mediumkey_over.png rename to data/images/keyboard_mediumkey_over.png diff --git a/source/images/keyboard_textbox.png b/data/images/keyboard_textbox.png similarity index 100% rename from source/images/keyboard_textbox.png rename to data/images/keyboard_textbox.png diff --git a/source/images/little_star.png b/data/images/little_star.png similarity index 100% rename from source/images/little_star.png rename to data/images/little_star.png diff --git a/source/images/lock.png b/data/images/lock.png similarity index 100% rename from source/images/lock.png rename to data/images/lock.png diff --git a/source/images/lock_gray.png b/data/images/lock_gray.png similarity index 100% rename from source/images/lock_gray.png rename to data/images/lock_gray.png diff --git a/source/images/menu_button.png b/data/images/menu_button.png similarity index 100% rename from source/images/menu_button.png rename to data/images/menu_button.png diff --git a/source/images/menu_button_over.png b/data/images/menu_button_over.png similarity index 100% rename from source/images/menu_button_over.png rename to data/images/menu_button_over.png diff --git a/source/images/microphone.png b/data/images/microphone.png similarity index 100% rename from source/images/microphone.png rename to data/images/microphone.png diff --git a/source/images/microphoneR.png b/data/images/microphoneR.png similarity index 100% rename from source/images/microphoneR.png rename to data/images/microphoneR.png diff --git a/source/images/motionplus.png b/data/images/motionplus.png similarity index 100% rename from source/images/motionplus.png rename to data/images/motionplus.png diff --git a/source/images/motionplusR.png b/data/images/motionplusR.png similarity index 100% rename from source/images/motionplusR.png rename to data/images/motionplusR.png diff --git a/source/images/new.png b/data/images/new.png similarity index 100% rename from source/images/new.png rename to data/images/new.png diff --git a/source/images/nintendods.png b/data/images/nintendods.png similarity index 100% rename from source/images/nintendods.png rename to data/images/nintendods.png diff --git a/source/images/nintendodsR.png b/data/images/nintendodsR.png similarity index 100% rename from source/images/nintendodsR.png rename to data/images/nintendodsR.png diff --git a/source/images/nocover.png b/data/images/nocover.png similarity index 100% rename from source/images/nocover.png rename to data/images/nocover.png diff --git a/source/images/nocoverFlat.png b/data/images/nocoverFlat.png similarity index 100% rename from source/images/nocoverFlat.png rename to data/images/nocoverFlat.png diff --git a/source/images/nocoverFull.png b/data/images/nocoverFull.png similarity index 100% rename from source/images/nocoverFull.png rename to data/images/nocoverFull.png diff --git a/source/images/nodisc.png b/data/images/nodisc.png similarity index 100% rename from source/images/nodisc.png rename to data/images/nodisc.png diff --git a/source/images/norating.png b/data/images/norating.png similarity index 100% rename from source/images/norating.png rename to data/images/norating.png diff --git a/source/images/not_favorite.png b/data/images/not_favorite.png similarity index 100% rename from source/images/not_favorite.png rename to data/images/not_favorite.png diff --git a/source/images/nunchuk.png b/data/images/nunchuk.png similarity index 100% rename from source/images/nunchuk.png rename to data/images/nunchuk.png diff --git a/source/images/nunchukR.png b/data/images/nunchukR.png similarity index 100% rename from source/images/nunchukR.png rename to data/images/nunchukR.png diff --git a/data/images/oneButtonScroll.png b/data/images/oneButtonScroll.png new file mode 100644 index 0000000000000000000000000000000000000000..fe89678d5e526b9a554640311f005c899cfd7b29 GIT binary patch literal 2541 zcmX9=dpwlc8-M3!#(gwo++UPh5rZvOYeu@TxlFbdo6XF~P^(BT5i^6u$Ryj9h|zYj zZ4r`o#SD$RVwazCX~rdlN-j0`d3WsZkLP?ppL0Iv`Vkj=L1mzE8~;>9@!G(AiO%0)mLoNpKcGgBfr* z96^;4oTdv7qi81JMg+~WYCIZbpaelIi3?VQoJ#pc2bpRKvhb})2AU18HN%d^m$8 z8p}jXMT94uC@XJInmuS;cnQqu9e&SjX>ObsH12OC6;cqiKyVhAiY7hNV~b(S#8^E5 z1BUAX#{-eH6i}rth~Vl;5Rc2=5O~A(gr2?S*KeAXvAiHfuRC+3JP&R6#9SqNXXk6N zZOD3jAV#PwDB#k$?f}Rtek3u!O)zFFy}fk>R%({E%?}kK`=%Z@x4ymCvM)$Q7l{xb zFVM&jn>kc^y1Pn|cQ?PE+zcLQ&U8mCI2)?(@=gzEkJG|7k#GiGSn?yriWfx?kK@mQNb5XOWYg9X`r#w--`Okj77&v`B!wm0qO!7w6KhQZDn0oo z>~AwAwpeCfhjeGMK{rokk`xlyDqJWVf3L$-L5TJ-2qNpyASnb{`Mx9!d_M^OA~japzFjC`!KAi&=4AaZ#$ab+xTj7~|RD5B#B$%H!fCW-ipH1Cgk($5SGr z2kaF6E*RmH8^KeBmj|DDE1uIQa=js=8^4jPYvH$zK^Dat#9a8Tf~+XW$%88BCmM26 zW2!2PK&yd%CRFE2P)0}6W&K*W!?-QE)DZeC6Z9xDE&9HAUR&&Ol@Xp&JNUbq3G-A&8WggzyPqq|4UiU)l-}Kn#^c_k!N( znBUXP)d$xb$kQi3|yPors(QInKu%Cx+*uV?v#m95-qV{#!c*4%%WO`G{b<==E3FI|xm7X}4X zS%Bw~NbA}!M!e;2;O?HQxP9~baLp1?6+ZGr*~5#A5T&QC%DNjbT3IR~vDgA(J9sXT z(JETWwbQd{%ev;^51Du|6p3rXI|Xtt-nmY=jy88kD;u&ezG^$BkzHfA2(_AC~D%Z4v8p8kIDFsj4IX=sH>ZX#VZ zS&xx9KW~#1YR}XaS4Oo)$J~E-_1r z1{E&xicN$Wa;5mg;!b(d|5(nYEXiZEgUJ2AFCD=?vgWlp zbfXaK*FzXyUKyHH$QPYf)xvwNQb<}+FLHUTkx$|ZA`uTkGJ)j!GH)v}uli!mA76QH z@mykV3@NPP$4W{~igiak!deKmb-T_<-j1#McvkcK@^*xi9&XWK0a+ds@W(yKuP7N$ z8N-etmR@#3L1Lt(CN<<}Al=S7*>byeh{kqUNG|m30cS%Q|9xj4GJllEzw}N{q@0rI z_FZD)O@#1*(iEbKz)*GeNoLx|tacuD@>r#OSX&$zZ`FA5k$czdKRLu3u`7HIR9Qg` z<*~mS6MBr2k9vg&i`_FU4J>CXcnl?qE`*3G#DV9KTG5%c>_f)R3Z$uYT1?!BRW2Gk z+n0ovv^-Nv#Q%&M%`G`rB*H?q>b$@0LS0BG%Ekk5%r$M&>2tv71~^K;v%<-$q^AG4 zXA*7Z{DCE6x=MU8zeM_q$K>!JWwbhpop6s{QulQ5DiesA31GvLkSSv(d|p_672QxS zQO+Q6bt9y7{E78)WBn?3tnvel{DY=_Jp{K{7R$y92RX5^eZy4PUoN}N{UHeWnXxYy z;&b{ioGfTyD@6fclXmhrI#w!I!nYaF4D@S*nbXnIL5;dH)bAI%bWd*i_)C};mee%^ zR6RbT_rhkJ91u#dr_+1i{U29-tE=ZCM3XM8o&clK>;y~etJK~EL;CT=c*=b!4{|8v&0)nDql2X#L@`@^|YU-NWI=Y6& zW|lT~PA+bq@hKPG);9+N^|X1qIEGZ*dOOLG?~nrzOa9yLfJ4>|P5P!D>t zLoH%iH1n=)d2(iHd+OLYnzzghB literal 0 HcmV?d00001 diff --git a/source/images/rplayer1_point.png b/data/images/rplayer1_point.png similarity index 100% rename from source/images/rplayer1_point.png rename to data/images/rplayer1_point.png diff --git a/source/images/rplayer2_point.png b/data/images/rplayer2_point.png similarity index 100% rename from source/images/rplayer2_point.png rename to data/images/rplayer2_point.png diff --git a/source/images/rplayer3_point.png b/data/images/rplayer3_point.png similarity index 100% rename from source/images/rplayer3_point.png rename to data/images/rplayer3_point.png diff --git a/source/images/rplayer4_point.png b/data/images/rplayer4_point.png similarity index 100% rename from source/images/rplayer4_point.png rename to data/images/rplayer4_point.png diff --git a/data/images/scrollBarBottom.png b/data/images/scrollBarBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..426fdc2585630ad7eef01826f3ecdcfbe117778d GIT binary patch literal 1386 zcmW+$eN0nV6u+g<_O%xJ_!t&!^_A8NlK~~L6(-}oQlT(FAR6OGLitpXh!iD;IQs#P z)?ivjKP zm^;(Dysi6Fwma;V(e+6sMO{fL)Qcb9TOQBc$w|{S{X7=;>?Fo4c-@q9xoutNlB71E z)b^)oBqXrmJ^Hc|DF$)3| zBf^n+%HJ3i8pGTSP+acgVvhEy@yX+@0M{BS9GVb*+I2d02-Eyq>vrJgYh-`5qExinlp0%BR0*g{)29E@u;wYMjYsde`up0BrOyU52`Y}1T z9Q8u59-;FBBinVM8S~_qFGhAftZ5=`0_O$0$C58FM79`NgBqFKY@yS<3@5b@D8I%U zV+AhyabNw7SZ^YZuO? z@+PLl&}P+XZY%!EW%Hfu!ZM2@f!$n;}NaTE>Um^4CEU~n2N>T3twugR` zEFmNMsE|0UJb;d1cSkv4I|XWLeS*M`Lux^Y1nDVi(kNfxQb%GSb6C!O6Jq;J#e6MJ-;+FeDHSq0z3j+kS4#Wsx$+Wt zz#3NUK4ZU8peT)UrM#7ie8xKf1iK?y`Kr?(?98qIsKap-CqVX0i*Qu8@G=^kBcQ*N zuedd9oe)#0Haf#Y(fIpBqY#cyI;_0b3~5ShcP1LMU2Uzx{qXp>?rYPBmaDO6+Jhiu z3D><@gir-t83qr%=@Rk~PqoF88nl}*6}KFLfbh$=z2bLZjKIMm#1_L z7d;LHcHch2oa8&qqJV1a6?DjAs|(!8vDGujoPf~Mz_l+D4sDAl^!%zIbz7$5Te(XA EA6`}yivR!s literal 0 HcmV?d00001 diff --git a/data/images/scrollBarTile.png b/data/images/scrollBarTile.png new file mode 100644 index 0000000000000000000000000000000000000000..d50b3b6e837428b694363ac92421607dc28d4979 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj#!3HG%OsG`=Qk(@Ik;M!Q+`=Ht$S`Y;1V}}? zqpu?a!^Xav-+_~Xe1&9>AYTTCDpdxChGqtapZ|gMO9qBg0|tgy2@DKYGZ+}e^C!h0 zbpxuc_H=O!skoJM<{)2#07Jt=ldV@86K&Gn{U6*YHtKQCOkL^h{{QLjzYDJ2+8X55 zIOWnY%loYY?8$GY1kIZ-zVwS)i%81_X2l%-e_omj&+id5RbW9GdSnGBBFFkmV3aVCXf_XJx%14s<31gQu&X%Q~loCIEjL BSGNEF literal 0 HcmV?d00001 diff --git a/data/images/scrollBarTop.png b/data/images/scrollBarTop.png new file mode 100644 index 0000000000000000000000000000000000000000..60c3913353c5538133f14d0a8e74afb6f8b3ac7e GIT binary patch literal 1352 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 literal 0 HcmV?d00001 diff --git a/source/images/sdcard.png b/data/images/sdcard.png similarity index 100% rename from source/images/sdcard.png rename to data/images/sdcard.png diff --git a/source/images/sdcard_over.png b/data/images/sdcard_over.png similarity index 100% rename from source/images/sdcard_over.png rename to data/images/sdcard_over.png diff --git a/source/images/searchIcon.png b/data/images/searchIcon.png similarity index 100% rename from source/images/searchIcon.png rename to data/images/searchIcon.png diff --git a/source/images/searchIcon_gray.png b/data/images/searchIcon_gray.png similarity index 100% rename from source/images/searchIcon_gray.png rename to data/images/searchIcon_gray.png diff --git a/source/images/settings_background.png b/data/images/settings_background.png similarity index 100% rename from source/images/settings_background.png rename to data/images/settings_background.png diff --git a/source/images/settings_button.png b/data/images/settings_button.png similarity index 100% rename from source/images/settings_button.png rename to data/images/settings_button.png diff --git a/source/images/settings_button_over.png b/data/images/settings_button_over.png similarity index 100% rename from source/images/settings_button_over.png rename to data/images/settings_button_over.png diff --git a/source/images/settings_title.png b/data/images/settings_title.png similarity index 100% rename from source/images/settings_title.png rename to data/images/settings_title.png diff --git a/source/images/settings_title_over.png b/data/images/settings_title_over.png similarity index 100% rename from source/images/settings_title_over.png rename to data/images/settings_title_over.png diff --git a/source/images/startgame_arrow_left.png b/data/images/startgame_arrow_left.png similarity index 100% rename from source/images/startgame_arrow_left.png rename to data/images/startgame_arrow_left.png diff --git a/source/images/startgame_arrow_right.png b/data/images/startgame_arrow_right.png similarity index 100% rename from source/images/startgame_arrow_right.png rename to data/images/startgame_arrow_right.png diff --git a/source/images/theme_box.png b/data/images/theme_box.png similarity index 100% rename from source/images/theme_box.png rename to data/images/theme_box.png diff --git a/source/images/theme_dialogue_box.png b/data/images/theme_dialogue_box.png similarity index 100% rename from source/images/theme_dialogue_box.png rename to data/images/theme_dialogue_box.png diff --git a/source/images/tooltip_left.png b/data/images/tooltip_left.png similarity index 100% rename from source/images/tooltip_left.png rename to data/images/tooltip_left.png diff --git a/source/images/tooltip_right.png b/data/images/tooltip_right.png similarity index 100% rename from source/images/tooltip_right.png rename to data/images/tooltip_right.png diff --git a/source/images/tooltip_tile.png b/data/images/tooltip_tile.png similarity index 100% rename from source/images/tooltip_tile.png rename to data/images/tooltip_tile.png diff --git a/source/images/unlock.png b/data/images/unlock.png similarity index 100% rename from source/images/unlock.png rename to data/images/unlock.png diff --git a/source/images/unlock_gray.png b/data/images/unlock_gray.png similarity index 100% rename from source/images/unlock_gray.png rename to data/images/unlock_gray.png diff --git a/source/images/wbackground.png b/data/images/wbackground.png similarity index 100% rename from source/images/wbackground.png rename to data/images/wbackground.png diff --git a/source/images/wdialogue_box_startgame.png b/data/images/wdialogue_box_startgame.png similarity index 100% rename from source/images/wdialogue_box_startgame.png rename to data/images/wdialogue_box_startgame.png diff --git a/source/images/wheel.png b/data/images/wheel.png similarity index 100% rename from source/images/wheel.png rename to data/images/wheel.png diff --git a/source/images/wheelR.png b/data/images/wheelR.png similarity index 100% rename from source/images/wheelR.png rename to data/images/wheelR.png diff --git a/source/images/wifi1.png b/data/images/wifi1.png similarity index 100% rename from source/images/wifi1.png rename to data/images/wifi1.png diff --git a/source/images/wifi12.png b/data/images/wifi12.png similarity index 100% rename from source/images/wifi12.png rename to data/images/wifi12.png diff --git a/source/images/wifi16.png b/data/images/wifi16.png similarity index 100% rename from source/images/wifi16.png rename to data/images/wifi16.png diff --git a/source/images/wifi2.png b/data/images/wifi2.png similarity index 100% rename from source/images/wifi2.png rename to data/images/wifi2.png diff --git a/source/images/wifi3.png b/data/images/wifi3.png similarity index 100% rename from source/images/wifi3.png rename to data/images/wifi3.png diff --git a/source/images/wifi32.png b/data/images/wifi32.png similarity index 100% rename from source/images/wifi32.png rename to data/images/wifi32.png diff --git a/source/images/wifi4.png b/data/images/wifi4.png similarity index 100% rename from source/images/wifi4.png rename to data/images/wifi4.png diff --git a/source/images/wifi8.png b/data/images/wifi8.png similarity index 100% rename from source/images/wifi8.png rename to data/images/wifi8.png diff --git a/source/images/Wifi_btn.png b/data/images/wifi_btn.png similarity index 100% rename from source/images/Wifi_btn.png rename to data/images/wifi_btn.png diff --git a/source/images/wiimote.png b/data/images/wiimote.png similarity index 100% rename from source/images/wiimote.png rename to data/images/wiimote.png diff --git a/source/images/Wiimote1.png b/data/images/wiimote1.png similarity index 100% rename from source/images/Wiimote1.png rename to data/images/wiimote1.png diff --git a/source/images/Wiimote2.png b/data/images/wiimote2.png similarity index 100% rename from source/images/Wiimote2.png rename to data/images/wiimote2.png diff --git a/source/images/Wiimote3.png b/data/images/wiimote3.png similarity index 100% rename from source/images/Wiimote3.png rename to data/images/wiimote3.png diff --git a/source/images/Wiimote4.png b/data/images/wiimote4.png similarity index 100% rename from source/images/Wiimote4.png rename to data/images/wiimote4.png diff --git a/source/images/wiimote_poweroff.png b/data/images/wiimote_poweroff.png similarity index 100% rename from source/images/wiimote_poweroff.png rename to data/images/wiimote_poweroff.png diff --git a/source/images/wiimote_poweroff_over.png b/data/images/wiimote_poweroff_over.png similarity index 100% rename from source/images/wiimote_poweroff_over.png rename to data/images/wiimote_poweroff_over.png diff --git a/source/images/wiispeak.png b/data/images/wiispeak.png similarity index 100% rename from source/images/wiispeak.png rename to data/images/wiispeak.png diff --git a/source/images/wiispeakR.png b/data/images/wiispeakR.png similarity index 100% rename from source/images/wiispeakR.png rename to data/images/wiispeakR.png diff --git a/source/images/zapper.png b/data/images/zapper.png similarity index 100% rename from source/images/zapper.png rename to data/images/zapper.png diff --git a/source/images/zapperR.png b/data/images/zapperR.png similarity index 100% rename from source/images/zapperR.png rename to data/images/zapperR.png diff --git a/source/sounds/bg_music.ogg b/data/sounds/bg_music.ogg similarity index 100% rename from source/sounds/bg_music.ogg rename to data/sounds/bg_music.ogg diff --git a/source/sounds/button_click.wav b/data/sounds/button_click.wav similarity index 100% rename from source/sounds/button_click.wav rename to data/sounds/button_click.wav diff --git a/source/sounds/button_click2.wav b/data/sounds/button_click2.wav similarity index 100% rename from source/sounds/button_click2.wav rename to data/sounds/button_click2.wav diff --git a/source/sounds/button_over.wav b/data/sounds/button_over.wav similarity index 100% rename from source/sounds/button_over.wav rename to data/sounds/button_over.wav diff --git a/source/sounds/credits_music.ogg b/data/sounds/credits_music.ogg similarity index 100% rename from source/sounds/credits_music.ogg rename to data/sounds/credits_music.ogg diff --git a/source/sounds/menuin.ogg b/data/sounds/menuin.ogg similarity index 100% rename from source/sounds/menuin.ogg rename to data/sounds/menuin.ogg diff --git a/source/sounds/menuout.ogg b/data/sounds/menuout.ogg similarity index 100% rename from source/sounds/menuout.ogg rename to data/sounds/menuout.ogg diff --git a/source/sounds/success.ogg b/data/sounds/success.ogg similarity index 100% rename from source/sounds/success.ogg rename to data/sounds/success.ogg diff --git a/filelist.sh b/filelist.sh new file mode 100644 index 00000000..a91de27d --- /dev/null +++ b/filelist.sh @@ -0,0 +1,61 @@ +#! /bin/bash +# +# Automatic resource file list generation +# Created by Dimok + +outFile="./source/themes/filelist.h" +count_old=$(cat $outFile 2>/dev/null | tr -d '\n\n' | sed 's/[^0-9]*\([0-9]*\).*/\1/') + +count=0 +for i in $(find ./data/images/ ./data/sounds/ ./data/fonts/ -maxdepth 1 -type f \( ! -printf "%f\n" \)) +do + files[count]=$i + count=$((count+1)) +done + +if [ "$count_old" != "$count" ] || [ ! -f $outFile ] +then + +echo "Generating filelist.h for $count files." >&2 +cat < $outFile +/**************************************************************************** + * USB Loader GX resource files. + * This file is generated automatically. + * Includes $count files. + * + * NOTE: + * Any manual modification of this file will be overwriten by the generation. + ****************************************************************************/ +#ifndef _FILELIST_H_ +#define _FILELIST_H_ + +#include + +EOF + +for i in ${files[@]} +do + filename=${i%.*} + extension=${i##*.} + echo 'extern const u8 '$filename'_'$extension'[];' >> $outFile + echo 'extern const u32 '$filename'_'$extension'_size;' >> $outFile + echo '' >> $outFile +done + +echo 'RecourceFile Resources::RecourceFiles[] =' >> $outFile +echo '{' >> $outFile + +for i in ${files[@]} +do + filename=${i%.*} + extension=${i##*.} + echo -e '\t{"'$i'", '$filename'_'$extension', '$filename'_'$extension'_size, NULL, 0},' >> $outFile +done + +echo -e '\t{NULL, NULL, 0, NULL, 0}' >> $outFile +echo '};' >> $outFile + +echo '' >> $outFile +echo '#endif' >> $outFile + +fi diff --git a/gui.pnproj b/gui.pnproj index 68a2ffe4..11852976 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/BoxCover/BoxCover.hpp b/source/BoxCover/BoxCover.hpp index 63c21382..bfe9564d 100644 --- a/source/BoxCover/BoxCover.hpp +++ b/source/BoxCover/BoxCover.hpp @@ -24,7 +24,7 @@ #ifndef BOX_COVER_HPP_ #define BOX_COVER_HPP_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" #define EFFECT_BOX_FLY_CENTRE 0x2000000 #define EFFECT_BOX_FLY_BACK 0x4000000 diff --git a/source/Controls/DeviceHandler.cpp b/source/Controls/DeviceHandler.cpp index e5368026..82eaba86 100644 --- a/source/Controls/DeviceHandler.cpp +++ b/source/Controls/DeviceHandler.cpp @@ -161,11 +161,12 @@ static inline bool USBSpinUp() return started; } -bool DeviceHandler::SetUSBPort(int port) +bool DeviceHandler::SetUSBPort(int port, bool spinup) { int ret = USBStorage2_SetPort(port); - USBSpinUp(); + if(spinup) + USBSpinUp(); return ret >= 0; } diff --git a/source/Controls/DeviceHandler.hpp b/source/Controls/DeviceHandler.hpp index 9e6bc18f..5a55eaac 100644 --- a/source/Controls/DeviceHandler.hpp +++ b/source/Controls/DeviceHandler.hpp @@ -83,7 +83,7 @@ class DeviceHandler static const char * GetFSName(int dev); static const char * PathToFSName(const char * path) { return GetFSName(PathToDriveType(path)); }; static const DISC_INTERFACE * GetUSBInterface(); - static bool SetUSBPort(int port); + static bool SetUSBPort(int port, bool spinup = true); static void SetUSBPortFromPartition(int part); private: DeviceHandler() : sd(0), usb(0) { }; diff --git a/source/libwiigui/LoadCoverImage.cpp b/source/GUI/LoadCoverImage.cpp similarity index 98% rename from source/libwiigui/LoadCoverImage.cpp rename to source/GUI/LoadCoverImage.cpp index 7b39eb9e..1b9ae77c 100644 --- a/source/libwiigui/LoadCoverImage.cpp +++ b/source/GUI/LoadCoverImage.cpp @@ -1,4 +1,4 @@ -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "usbloader/disc.h" #include "FileOperations/fileops.h" #include "settings/CSettings.h" diff --git a/source/libwiigui/LoadCoverImage.h b/source/GUI/LoadCoverImage.h similarity index 100% rename from source/libwiigui/LoadCoverImage.h rename to source/GUI/LoadCoverImage.h diff --git a/source/libwiigui/OptionList.cpp b/source/GUI/OptionList.cpp similarity index 100% rename from source/libwiigui/OptionList.cpp rename to source/GUI/OptionList.cpp diff --git a/source/libwiigui/OptionList.hpp b/source/GUI/OptionList.hpp similarity index 100% rename from source/libwiigui/OptionList.hpp rename to source/GUI/OptionList.hpp diff --git a/source/libwiigui/Text.cpp b/source/GUI/Text.cpp similarity index 98% rename from source/libwiigui/Text.cpp rename to source/GUI/Text.cpp index e962c54e..aff1366c 100644 --- a/source/libwiigui/Text.cpp +++ b/source/GUI/Text.cpp @@ -218,7 +218,7 @@ void Text::FillRows() ClearDynamicText(); - for (int i = 0; i < linestodraw && i < (int) TextLines.size(); i++) + for (int i = 0; i < linestodraw && curLineStart+i < (int) TextLines.size(); i++) { if (i >= (int) textDyn.size()) { diff --git a/source/libwiigui/Text.hpp b/source/GUI/Text.hpp similarity index 98% rename from source/libwiigui/Text.hpp rename to source/GUI/Text.hpp index 6c171d82..bba86efc 100644 --- a/source/libwiigui/Text.hpp +++ b/source/GUI/Text.hpp @@ -1,7 +1,7 @@ #ifndef _TEXT_HPP_ #define _TEXT_HPP_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "wstring.hpp" typedef struct diff --git a/source/libwiigui/gui.h b/source/GUI/gui.h similarity index 88% rename from source/libwiigui/gui.h rename to source/GUI/gui.h index 8f023288..725ee663 100644 --- a/source/libwiigui/gui.h +++ b/source/GUI/gui.h @@ -1,33 +1,31 @@ -/*!\mainpage libwiigui Documentation +/**************************************************************************** + * LibWiiGui by Tantric (C) 2009 + * USB Loader GX Team (C) 2009-2011 * - * \section Introduction - * libwiigui is a GUI library for the Wii, created to help structure the - * design of a complicated GUI interface, and to enable an author to create - * a sophisticated, feature-rich GUI. It was originally conceived and written - * after I started to design a GUI for Snes9x GX, and found libwiisprite and - * GRRLIB inadequate for the purpose. It uses GX for drawing, and makes use - * of PNGU for displaying images and FreeTypeGX for text. It was designed to - * be flexible and is easy to modify - don't be afraid to change the way it - * works or expand it to suit your GUI's purposes! If you do, and you think - * your changes might benefit others, please share them so they might be - * added to the project! + * The LibWiiGui library was used as the base for the creation of + * the GUI in USB Loader GX. + * Several modifications and additions were made to the library + * It does no longer match the original LibWiiGui implementation. * - * \section Quickstart - * Start from the supplied template example. For more advanced uses, see the - * source code for Snes9x GX, FCE Ultra GX, and Visual Boy Advance GX. - - * \section Contact - * If you have any suggestions for the library or documentation, or want to - * contribute, please visit the libwiigui website: - - * http://code.google.com/p/libwiigui/ - * \section Credits - * This library was wholly designed and written by Tantric. Thanks to the - * authors of PNGU and FreeTypeGX, of which this library makes use. Thanks - * also to the authors of GRRLIB and libwiisprite for laying the foundations. + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. * - */ - + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ #ifndef LIBWIIGUI_H #define LIBWIIGUI_H @@ -334,6 +332,12 @@ class GuiElement //!\param x X coordinate //!\param y Y coordinate void SetPosition(int x, int y, int z = 0); + //!Sets the element's relative position + int GetRelLeft(); + int GetRelTop(); + //!Sets the element's setup position + int GetLeftPos() const { return xoffset; } + int GetTopPos() const { return yoffset; } //!Updates the element's effects (dynamic values) //!Called by Draw(), used for animation purposes void UpdateEffects(); @@ -548,7 +552,8 @@ class GuiImage: public GuiElement float GetAngle(); //!Sets the number of times to draw the image horizontally //!\param t Number of times to draw the image - void SetTile(int t); + void SetTileHorizontal(int t); + void SetTileVertical(int t); // true set horizontal scale to 0.8 //added void SetWidescreen(bool w); //!Constantly called to draw the image @@ -608,7 +613,8 @@ class GuiImage: public GuiElement int imgType; //!< Type of image data (IMAGE_TEXTURE, IMAGE_COLOR, IMAGE_DATA) u8 * image; //!< Poiner to image data. May be shared with GuiImageData data f32 imageangle; //!< Angle to draw the image - int tile; //!< Number of times to draw (tile) the image horizontally + int tileHorizontal; //!< Number of times to draw (tile) the image horizontally + int tileVertical; //!< Number of times to draw (tile) the image vertically int stripe; //!< Alpha value (0-255) to apply a stripe effect to the texture short widescreen; //added bool parentangle; @@ -972,120 +978,4 @@ class GuiNumpad: public GuiWindow GuiTrigger * trigB; }; -//!Display a list of menu options -class GuiOptionBrowser: public GuiElement -{ - public: - GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollbar); - GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollbar, int start); - ~GuiOptionBrowser(); - void SetCol2Position(int x); - int FindMenuItem(int c, int d); - int GetClickedOption(); - int GetSelectedOption(); - void ResetState(); - void SetFocus(int f); - void Draw(); - void TriggerUpdate(); - void Update(GuiTrigger * t); - GuiText * optionVal[PAGESIZE]; - protected: - int selectedItem; - int listOffset; - bool listChanged; - OptionList * options; - int optionIndex[PAGESIZE]; - GuiButton * optionBtn[PAGESIZE]; - GuiText * optionTxt[PAGESIZE]; - GuiImage * optionBg[PAGESIZE]; - - GuiButton * arrowUpBtn; - GuiButton * arrowDownBtn; - GuiButton * scrollbarBoxBtn; - - GuiImage * bgOptionsImg; - GuiImage * bgOptionsOverImg; - GuiImage * scrollbarImg; - GuiImage * arrowDownImg; - GuiImage * arrowDownOverImg; - GuiImage * arrowUpImg; - GuiImage * arrowUpOverImg; - GuiImage * scrollbarBoxImg; - GuiImage * scrollbarBoxOverImg; - - GuiImageData * bgOptions; - GuiImageData * bgOptionsOver; - GuiImageData * bgOptionsEntry; - GuiImageData * scrollbar; - GuiImageData * arrowDown; - GuiImageData * arrowDownOver; - GuiImageData * arrowUp; - GuiImageData * arrowUpOver; - GuiImageData * scrollbarBox; - GuiImageData * scrollbarBoxOver; - - GuiTrigger * trigA; - GuiTrigger * trigB; - GuiTrigger * trigHeldA; -}; - -//!Display a list of files -class GuiFileBrowser: public GuiElement -{ - public: - GuiFileBrowser(int w, int h); - ~GuiFileBrowser(); - void DisableTriggerUpdate(bool set); - void ResetState(); - void SetFocus(int f); - void Draw(); - void TriggerUpdate(); - void Update(GuiTrigger * t); - GuiButton * fileList[PAGESIZE]; - protected: - int selectedItem; - bool listChanged; - bool triggerdisabled; - - GuiText * fileListText[PAGESIZE]; - GuiText * fileListTextOver[PAGESIZE]; - GuiImage * fileListBg[PAGESIZE]; - //GuiImage * fileListArchives[PAGESIZE]; - //GuiImage * fileListDefault[PAGESIZE]; - GuiImage * fileListFolder[PAGESIZE]; - //GuiImage * fileListGFX[PAGESIZE]; - //GuiImage * fileListPLS[PAGESIZE]; - //GuiImage * fileListSFX[PAGESIZE]; - //GuiImage * fileListTXT[PAGESIZE]; - //GuiImage * fileListXML[PAGESIZE]; - - GuiButton * arrowUpBtn; - GuiButton * arrowDownBtn; - GuiButton * scrollbarBoxBtn; - - GuiImage * bgFileSelectionImg; - GuiImage * scrollbarImg; - GuiImage * arrowDownImg; - GuiImage * arrowUpImg; - GuiImage * scrollbarBoxImg; - - GuiImageData * bgFileSelection; - GuiImageData * bgFileSelectionEntry; - //GuiImageData * fileArchives; - //GuiImageData * fileDefault; - GuiImageData * fileFolder; - //GuiImageData * fileGFX; - //GuiImageData * filePLS; - //GuiImageData * fileSFX; - //GuiImageData * fileTXT; - //GuiImageData * fileXML; - GuiImageData * scrollbar; - GuiImageData * arrowDown; - GuiImageData * arrowUp; - GuiImageData * scrollbarBox; - - GuiTrigger * trigA; - GuiTrigger * trigHeldA; -}; - #endif diff --git a/source/libwiigui/gui_box.cpp b/source/GUI/gui_box.cpp similarity index 100% rename from source/libwiigui/gui_box.cpp rename to source/GUI/gui_box.cpp diff --git a/source/libwiigui/gui_box.hpp b/source/GUI/gui_box.hpp similarity index 98% rename from source/libwiigui/gui_box.hpp rename to source/GUI/gui_box.hpp index 858afc91..e20b7bbc 100644 --- a/source/libwiigui/gui_box.hpp +++ b/source/GUI/gui_box.hpp @@ -24,7 +24,7 @@ #ifndef GUIBOX_HPP_ #define GUIBOX_HPP_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" class GuiBox : public GuiElement { diff --git a/source/libwiigui/gui_button.cpp b/source/GUI/gui_button.cpp similarity index 97% rename from source/libwiigui/gui_button.cpp rename to source/GUI/gui_button.cpp index c5c87944..6f4b468e 100644 --- a/source/libwiigui/gui_button.cpp +++ b/source/GUI/gui_button.cpp @@ -311,17 +311,6 @@ void GuiButton::SetState(int s, int c) } Clicked(this, c, p); } - else if (s == STATE_HELD) - { - POINT p = {0, 0}; - - if (userInput[c].wpad.ir.valid) - { - p.x = userInput[c].wpad.ir.x; - p.y = userInput[c].wpad.ir.y; - } - Held(this, c, p); - } } /** @@ -533,6 +522,17 @@ void GuiButton::Update(GuiTrigger * t) { this->SetState(STATE_HELD, t->chan); } + else if (held && state == STATE_HELD && Held.connected()) + { + POINT p = {0, 0}; + + if (userInput[t->chan].wpad.ir.valid) + { + p.x = userInput[t->chan].wpad.ir.x; + p.y = userInput[t->chan].wpad.ir.y; + } + Held(this, t->chan, p); + } } } } diff --git a/source/libwiigui/gui_checkbox.cpp b/source/GUI/gui_checkbox.cpp similarity index 69% rename from source/libwiigui/gui_checkbox.cpp rename to source/GUI/gui_checkbox.cpp index 02c7698f..7a9572f9 100644 --- a/source/libwiigui/gui_checkbox.cpp +++ b/source/GUI/gui_checkbox.cpp @@ -68,6 +68,13 @@ void GuiCheckbox::SetSize(int w, int h) Blackbox.SetSize(w, h); Whitebox.SetSize(w-WHITEBOX_RED_SIZE, h-WHITEBOX_RED_SIZE); Whitebox.SetPosition(WHITEBOX_RED_SIZE/2, WHITEBOX_RED_SIZE/2); + SetAlignment(alignmentHor, alignmentVert); +} + +void GuiCheckbox::SetClickSize(int w, int h) +{ + width = w; + height = h; } void GuiCheckbox::SetTransparent(bool b) @@ -84,6 +91,40 @@ void GuiCheckbox::SetState(int s, int c) GuiButton::SetState(s, c); } +void GuiCheckbox::SetAlignment(int h, int v) +{ + GuiButton::SetAlignment(h, v); + Checksign.SetAlignment(h, v); + Cross.SetAlignment(h, v); + Blackbox.SetAlignment(h, v); + Whitebox.SetAlignment(h, v); + + if(h == ALIGN_RIGHT) + { + Checksign.SetPosition(-WHITEBOX_RED_SIZE/2, Checksign.GetTopPos()); + Cross.SetPosition(-WHITEBOX_RED_SIZE/2, Cross.GetTopPos()); + Whitebox.SetPosition(-WHITEBOX_RED_SIZE/2, Whitebox.GetTopPos()); + } + else if(h == ALIGN_CENTER) + { + Checksign.SetPosition(0, Checksign.GetTopPos()); + Cross.SetPosition(0, Cross.GetTopPos()); + Whitebox.SetPosition(0, Whitebox.GetTopPos()); + } + if(v == ALIGN_BOTTOM) + { + Checksign.SetPosition(Checksign.GetLeftPos(), -WHITEBOX_RED_SIZE/2); + Cross.SetPosition(Cross.GetLeftPos(), -WHITEBOX_RED_SIZE/2); + Whitebox.SetPosition(Whitebox.GetLeftPos(), -WHITEBOX_RED_SIZE/2); + } + else if(v == ALIGN_MIDDLE) + { + Checksign.SetPosition(Checksign.GetLeftPos(), 0); + Cross.SetPosition(Cross.GetLeftPos(), 0); + Whitebox.SetPosition(Whitebox.GetLeftPos(), 0); + } +} + void GuiCheckbox::Draw() { GuiButton::Draw(); diff --git a/source/libwiigui/gui_checkbox.hpp b/source/GUI/gui_checkbox.hpp similarity index 90% rename from source/libwiigui/gui_checkbox.hpp rename to source/GUI/gui_checkbox.hpp index 9a822b7e..884d3aa9 100644 --- a/source/libwiigui/gui_checkbox.hpp +++ b/source/GUI/gui_checkbox.hpp @@ -24,10 +24,10 @@ #ifndef GUICHECKBOX_HPP_ #define GUICHECKBOX_HPP_ -#include "libwiigui/gui.h" -#include "libwiigui/gui_box.hpp" -#include "libwiigui/gui_cross.hpp" -#include "libwiigui/gui_checksign.hpp" +#include "GUI/gui.h" +#include "GUI/gui_box.hpp" +#include "GUI/gui_cross.hpp" +#include "GUI/gui_checksign.hpp" class GuiCheckbox : public GuiButton { @@ -36,6 +36,8 @@ class GuiCheckbox : public GuiButton GuiCheckbox(int w, int h, int style = CHECKSIGN); void SetTransparent(bool b); void SetSize(int w, int h); + void SetClickSize(int w, int h); + void SetAlignment(int h, int v); void SetChecked(bool c) { LOCK(this); Checked = c; } bool IsChecked() const { return Checked; } virtual void SetState(int s, int c = -1); diff --git a/source/GUI/gui_checkboxbrowser.cpp b/source/GUI/gui_checkboxbrowser.cpp new file mode 100644 index 00000000..2ef44ddb --- /dev/null +++ b/source/GUI/gui_checkboxbrowser.cpp @@ -0,0 +1,200 @@ +/**************************************************************************** + * Copyright (C) 2011 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#include "gui_checkboxbrowser.hpp" +#include "themes/Resources.h" +#include "themes/gettheme.h" +#include "wstring.hpp" + + +GuiCheckboxBrowser::GuiCheckboxBrowser(int w, int h, int s) + : scrollBar(h-10) +{ + width = w; + height = h; + backgroundImg = NULL; + selectedItem = 0; + pageIndex = 0; + pressedChan = -1; + maxSize = s; + scrollBar.SetParent(this); + scrollBar.SetAlignment(thAlign("right - checkbox browser scrollbar align hor"), thAlign("top - checkbox browser scrollbar align ver")); + scrollBar.SetPosition(thInt("0 - checkbox browser scrollbar pos x"), thInt("5 - checkbox browser scrollbar pos y")); + scrollBar.SetButtonScroll(WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B); + scrollBar.listChanged.connect(this, &GuiCheckboxBrowser::onListChange); + trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + markImgData = Resources::GetImageData("checkBoxSelection.png"); + markImg = new GuiImage(markImgData); + markImg->SetParent(this); +} + +GuiCheckboxBrowser::~GuiCheckboxBrowser() +{ + Clear(); + + delete markImg; + delete markImgData; +} + +void GuiCheckboxBrowser::SetImage(GuiImage *Img) +{ + LOCK(this); + backgroundImg = Img; + if(backgroundImg) + backgroundImg->SetParent(this); +} + +void GuiCheckboxBrowser::Clear() +{ + LOCK(this); + for(u32 i = 0; i < checkBoxList.size(); ++i) + { + delete textLineList[i]; + delete checkBoxList[i]; + } + + textLineList.clear(); + checkBoxList.clear(); +} + +bool GuiCheckboxBrowser::AddEntrie(const string &text, bool checked) +{ + LOCK(this); + int currentSize = checkBoxList.size(); + textLineList.resize(currentSize+1); + checkBoxList.resize(currentSize+1); + + checkBoxList[currentSize] = new GuiCheckbox(30, 30); + checkBoxList[currentSize]->SetParent(this); + checkBoxList[currentSize]->SetChecked(checked); + checkBoxList[currentSize]->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + checkBoxList[currentSize]->SetTrigger(&trigA); + checkBoxList[currentSize]->SetClickSize(width-30-scrollBar.GetWidth(), 30); + checkBoxList[currentSize]->Clicked.connect(this, &GuiCheckboxBrowser::OnCheckboxClick); + + textLineList[currentSize] = new GuiText(text.c_str(), 18, thColor("r=0 g=0 b=0 a=255 - checkbox browser text color")); + textLineList[currentSize]->SetParent(this); + textLineList[currentSize]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + + if(textLineDrawn.size() < (u32) maxSize) + { + textLineDrawn.push_back(textLineList[currentSize]); + checkBoxDrawn.push_back(checkBoxList[currentSize]); + } + + return true; +} + +void GuiCheckboxBrowser::OnCheckboxClick(GuiButton *sender, int chan, const POINT &pointer) +{ + LOCK(this); + sender->ResetState(); + + for(u32 i = 0; i < checkBoxDrawn.size(); ++i) + { + if(sender == checkBoxDrawn[i]) + { + checkBoxClicked(checkBoxDrawn[i], pageIndex+i); + return; + } + } +} + +void GuiCheckboxBrowser::onListChange(int SelItem, int SelInd) +{ + selectedItem = SelItem; + pageIndex = SelInd; + RefreshList(); +} + +void GuiCheckboxBrowser::RefreshList() +{ + LOCK(this); + for(u32 i = 0; i < checkBoxDrawn.size(); i++) + { + checkBoxDrawn[i] = checkBoxList[pageIndex+i]; + checkBoxDrawn[i]->SetPosition(-scrollBar.GetWidth()-10, 15+i*(checkBoxDrawn[i]->GetHeight()+6)); + + textLineDrawn[i] = textLineList[pageIndex+i]; + textLineDrawn[i]->SetPosition(25, 15+i*(checkBoxDrawn[i]->GetHeight()+6)+(checkBoxDrawn[i]->GetHeight()-textLineDrawn[i]->GetFontSize())/2+2); + } +} + +void GuiCheckboxBrowser::Draw() +{ + if(backgroundImg) + backgroundImg->Draw(); + + if(checkBoxList.size() >= (u32) maxSize) + scrollBar.Draw(); + + for(u32 i = 0; i < checkBoxDrawn.size(); ++i) + { + textLineDrawn[i]->Draw(); + checkBoxDrawn[i]->Draw(); + } + + markImg->Draw(); +} + +void GuiCheckboxBrowser::Update(GuiTrigger *t) +{ + if(state == STATE_DISABLED || !t) + return; + + if(checkBoxList.size() >= maxSize) + scrollBar.Update(t); + + if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT | + WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) || + (t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN))) + pressedChan = t->chan; + + for(u32 i = 0; i < checkBoxDrawn.size(); i++) + { + if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h)) + { + if(i != (u32) selectedItem && checkBoxDrawn[i]->GetState() == STATE_SELECTED) + checkBoxDrawn[i]->ResetState(); + else if(i == (u32) selectedItem && checkBoxDrawn[i]->GetState() == STATE_DEFAULT) + checkBoxDrawn[selectedItem]->SetState(STATE_SELECTED, -1); + + + checkBoxDrawn[i]->Update(t); + + if(checkBoxDrawn[i]->GetState() == STATE_SELECTED) + selectedItem = i; + } + + if(i == (u32) selectedItem) + markImg->SetPosition(5, 15+i*(checkBoxDrawn[i]->GetHeight()+6)+(checkBoxDrawn[i]->GetHeight()-markImg->GetHeight())/2); + } + + if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h) + pressedChan = -1; + + scrollBar.SetPageSize(checkBoxDrawn.size()); + scrollBar.SetSelectedItem(selectedItem); + scrollBar.SetSelectedIndex(pageIndex); + scrollBar.SetEntrieCount(checkBoxList.size()); +} diff --git a/source/GUI/gui_checkboxbrowser.hpp b/source/GUI/gui_checkboxbrowser.hpp new file mode 100644 index 00000000..1d3ad55d --- /dev/null +++ b/source/GUI/gui_checkboxbrowser.hpp @@ -0,0 +1,65 @@ +/**************************************************************************** + * Copyright (C) 2011 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#ifndef CHECKBOXBROWSER_HPP_ +#define CHECKBOXBROWSER_HPP_ + +#include +#include +#include "gui_checkbox.hpp" +#include "gui_scrollbar.hpp" + +using namespace std; + +class GuiCheckboxBrowser : public GuiElement, public sigslot::has_slots<> +{ + public: + GuiCheckboxBrowser(int w, int h, int maxSize = 7); + ~GuiCheckboxBrowser(); + bool AddEntrie(const string &text, bool checked = false); + int GetSelected() const { return pageIndex+selectedItem; }; + void SetImage(GuiImage *Img); + void RefreshList(); + void Clear(); + void Draw(); + void Update(GuiTrigger *t); + sigslot::signal2 checkBoxClicked; + private: + void onListChange(int SelItem, int SelInd); + void OnCheckboxClick(GuiButton *sender, int chan, const POINT &pointer); + u16 maxSize; + int selectedItem; + int pageIndex; + int pressedChan; + GuiScrollbar scrollBar; + GuiTrigger trigA; + GuiImage *backgroundImg; + GuiImageData *markImgData; + GuiImage *markImg; + vector textLineDrawn; + vector checkBoxDrawn; + vector textLineList; + vector checkBoxList; +}; + +#endif diff --git a/source/libwiigui/gui_checksign.cpp b/source/GUI/gui_checksign.cpp similarity index 100% rename from source/libwiigui/gui_checksign.cpp rename to source/GUI/gui_checksign.cpp diff --git a/source/libwiigui/gui_checksign.hpp b/source/GUI/gui_checksign.hpp similarity index 98% rename from source/libwiigui/gui_checksign.hpp rename to source/GUI/gui_checksign.hpp index 2127312b..83842fe4 100644 --- a/source/libwiigui/gui_checksign.hpp +++ b/source/GUI/gui_checksign.hpp @@ -24,7 +24,7 @@ #ifndef GUICHECKSIGN_HPP_ #define GUICHECKSIGN_HPP_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" class GuiChecksign : public GuiElement { diff --git a/source/libwiigui/gui_circle.cpp b/source/GUI/gui_circle.cpp similarity index 100% rename from source/libwiigui/gui_circle.cpp rename to source/GUI/gui_circle.cpp diff --git a/source/libwiigui/gui_circle.hpp b/source/GUI/gui_circle.hpp similarity index 98% rename from source/libwiigui/gui_circle.hpp rename to source/GUI/gui_circle.hpp index eada84e6..f90cd639 100644 --- a/source/libwiigui/gui_circle.hpp +++ b/source/GUI/gui_circle.hpp @@ -24,7 +24,7 @@ #ifndef GUICIRCLE_HPP_ #define GUICIRCLE_HPP_ -#include "libwiigui/gui.h" +#include "gui.h" class GuiCircle : public GuiElement { diff --git a/source/libwiigui/gui_cross.cpp b/source/GUI/gui_cross.cpp similarity index 100% rename from source/libwiigui/gui_cross.cpp rename to source/GUI/gui_cross.cpp diff --git a/source/libwiigui/gui_cross.hpp b/source/GUI/gui_cross.hpp similarity index 98% rename from source/libwiigui/gui_cross.hpp rename to source/GUI/gui_cross.hpp index 83ada4c1..ed481c9e 100644 --- a/source/libwiigui/gui_cross.hpp +++ b/source/GUI/gui_cross.hpp @@ -24,7 +24,7 @@ #ifndef GUICROSS_HPP_ #define GUICROSS_HPP_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" class GuiCross : public GuiElement { diff --git a/source/libwiigui/gui_diskcover.cpp b/source/GUI/gui_diskcover.cpp similarity index 100% rename from source/libwiigui/gui_diskcover.cpp rename to source/GUI/gui_diskcover.cpp diff --git a/source/libwiigui/gui_diskcover.h b/source/GUI/gui_diskcover.h similarity index 100% rename from source/libwiigui/gui_diskcover.h rename to source/GUI/gui_diskcover.h diff --git a/source/libwiigui/gui_element.cpp b/source/GUI/gui_element.cpp similarity index 98% rename from source/libwiigui/gui_element.cpp rename to source/GUI/gui_element.cpp index 570150a3..f6252b3e 100644 --- a/source/libwiigui/gui_element.cpp +++ b/source/GUI/gui_element.cpp @@ -160,6 +160,26 @@ int GuiElement::GetTop() return y + yoffset; } +int GuiElement::GetRelLeft() +{ + GuiElement *tmp = parentElement; + parentElement = NULL; + int pos = GetLeft(); + parentElement = tmp; + + return pos; +} + +int GuiElement::GetRelTop() +{ + GuiElement *tmp = parentElement; + parentElement = NULL; + int pos = GetTop(); + parentElement = tmp; + + return pos; +} + void GuiElement::SetMinX(int x) { LOCK( this ); diff --git a/source/GUI/gui_filebrowser.cpp b/source/GUI/gui_filebrowser.cpp new file mode 100644 index 00000000..dce08778 --- /dev/null +++ b/source/GUI/gui_filebrowser.cpp @@ -0,0 +1,230 @@ +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_filebrowser.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui_filebrowser.h" +#include "prompts/filebrowser.h" +#include "settings/CSettings.h" +#include "themes/CTheme.h" + +/** + * Constructor for the GuiFileBrowser class. + */ +GuiFileBrowser::GuiFileBrowser(int w, int h) + : scrollBar(h-10) +{ + width = w; + height = h; + selectedItem = 0; + selectable = true; + triggerdisabled = false; // trigger disable + focus = 0; // allow focus + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + + bgFileSelection = new GuiImageData(Resources::GetFile("bg_browser.png"), Resources::GetFileSize("bg_browser.png")); + bgFileSelectionImg = new GuiImage(bgFileSelection); + bgFileSelectionImg->SetParent(this); + bgFileSelectionImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + bgFileSelectionEntry = Resources::GetImageData("bg_browser_selection.png"); + + fileFolder = Resources::GetImageData("icon_folder.png"); + + scrollBar.SetParent(this); + scrollBar.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + scrollBar.SetPosition(0, 5); + scrollBar.listChanged.connect(this, &GuiFileBrowser::onListChange); + + for (int i = 0; i < FILEBROWSERSIZE; i++) + { + fileListText[i] = new GuiText((char *) NULL, 20, ( GXColor ) {0, 0, 0, 0xff}); + fileListText[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + fileListText[i]->SetPosition(5, 0); + fileListText[i]->SetMaxWidth(bgFileSelectionImg->GetWidth() - (scrollBar.GetWidth() + 40), DOTTED); + + fileListTextOver[i] = new GuiText((char *) NULL, 20, ( GXColor ) {0, 0, 0, 0xff}); + fileListTextOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + fileListTextOver[i]->SetPosition(5, 0); + fileListTextOver[i]->SetMaxWidth(bgFileSelectionImg->GetWidth() - (scrollBar.GetWidth() + 40), SCROLL_HORIZONTAL); + + fileListBg[i] = new GuiImage(bgFileSelectionEntry); + fileListFolder[i] = new GuiImage(fileFolder); + fileList[i] = new GuiButton(350, 30); + fileList[i]->SetParent(this); + fileList[i]->SetLabel(fileListText[i]); + fileList[i]->SetLabelOver(fileListTextOver[i]); + fileList[i]->SetImageOver(fileListBg[i]); + fileList[i]->SetPosition(2, 30 * i + 3); + fileList[i]->SetTrigger(trigA); + fileList[i]->SetRumble(false); + fileList[i]->SetSoundClick(btnSoundClick); + } +} + +/** + * Destructor for the GuiFileBrowser class. + */ +GuiFileBrowser::~GuiFileBrowser() +{ + delete bgFileSelectionImg; + + delete bgFileSelection; + delete bgFileSelectionEntry; + delete fileFolder; + + delete trigA; + + for (int i = 0; i < FILEBROWSERSIZE; i++) + { + delete fileListText[i]; + delete fileListTextOver[i]; + delete fileList[i]; + delete fileListBg[i]; + delete fileListFolder[i]; + } +} + +void GuiFileBrowser::SetFocus(int f) +{ + LOCK( this ); + focus = f; + + for (int i = 0; i < FILEBROWSERSIZE; i++) + fileList[i]->ResetState(); + + if (f == 1) + fileList[selectedItem]->SetState(STATE_SELECTED); +} + +void GuiFileBrowser::DisableTriggerUpdate(bool set) +{ + LOCK( this ); + triggerdisabled = set; +} + +void GuiFileBrowser::ResetState() +{ + LOCK( this ); + state = STATE_DEFAULT; + stateChan = -1; + selectedItem = 0; + + for (int i = 0; i < FILEBROWSERSIZE; i++) + { + fileList[i]->ResetState(); + } +} + +void GuiFileBrowser::UpdateList() +{ + LOCK( this ); + for (int i = 0; i < FILEBROWSERSIZE; i++) + { + if (browser->pageIndex + i < (int) browser->browserList.size()) + { + if (fileList[i]->GetState() == STATE_DISABLED) + fileList[i]->SetState(STATE_DEFAULT); + + fileList[i]->SetVisible(true); + + fileListText[i]->SetText(browser->browserList[browser->pageIndex + i].displayname); + fileListTextOver[i]->SetText(browser->browserList[browser->pageIndex + i].displayname); + + if (browser->browserList[browser->pageIndex + i].isdir) // directory + { + fileList[i]->SetIcon(fileListFolder[i]); + fileListText[i]->SetPosition(30, 0); + fileListTextOver[i]->SetPosition(30, 0); + } + else + { + fileList[i]->SetIcon(NULL); + fileListText[i]->SetPosition(10, 0); + fileListTextOver[i]->SetPosition(10, 0); + } + } + else + { + fileList[i]->SetVisible(false); + fileList[i]->SetState(STATE_DISABLED); + } + } +} + +void GuiFileBrowser::onListChange(int SelItem, int SelInd) +{ + selectedItem = SelItem; + browser->pageIndex = SelInd; + UpdateList(); +} + +/** + * Draw the button on screen + */ +void GuiFileBrowser::Draw() +{ + LOCK( this ); + if (!this->IsVisible()) return; + + bgFileSelectionImg->Draw(); + + for (int i = 0; i < FILEBROWSERSIZE; i++) + { + fileList[i]->Draw(); + } + + if(browser->browserList.size() > FILEBROWSERSIZE) + scrollBar.Draw(); + + this->UpdateEffects(); +} + +void GuiFileBrowser::Update(GuiTrigger * t) +{ + LOCK( this ); + if (state == STATE_DISABLED || !t || triggerdisabled) + return; + + static int pressedChan = -1; + + if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT | + WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) || + (t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN))) + pressedChan = t->chan; + + if(browser->browserList.size() > FILEBROWSERSIZE) + scrollBar.Update(t); + + if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h)) + { + for (int i = 0; i < FILEBROWSERSIZE; i++) + { + if (i != selectedItem && fileList[i]->GetState() == STATE_SELECTED) + fileList[i]->ResetState(); + else if (i == selectedItem && fileList[i]->GetState() == STATE_DEFAULT) + fileList[selectedItem]->SetState(STATE_SELECTED, -1); + + fileList[i]->Update(t); + + if (fileList[i]->GetState() == STATE_SELECTED) + selectedItem = i; + } + } + + + if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h) + pressedChan = -1; + + scrollBar.SetPageSize(FILEBROWSERSIZE); + scrollBar.SetSelectedItem(selectedItem); + scrollBar.SetSelectedIndex(browser->pageIndex); + scrollBar.SetEntrieCount(browser->browserList.size()); +} diff --git a/source/GUI/gui_filebrowser.h b/source/GUI/gui_filebrowser.h new file mode 100644 index 00000000..a4458813 --- /dev/null +++ b/source/GUI/gui_filebrowser.h @@ -0,0 +1,41 @@ +#ifndef GUI_FILEBROWSER_H_ +#define GUI_FILEBROWSER_H_ + +#include "gui.h" +#include "gui_scrollbar.hpp" + +//!Display a list of files +class GuiFileBrowser: public GuiElement, public sigslot::has_slots<> +{ + public: + GuiFileBrowser(int w, int h); + ~GuiFileBrowser(); + void DisableTriggerUpdate(bool set); + void ResetState(); + void SetFocus(int f); + void Draw(); + void UpdateList(); + void Update(GuiTrigger * t); + GuiButton * fileList[PAGESIZE]; + protected: + void onListChange(int SelItem, int SelInd); + int selectedItem; + bool triggerdisabled; + + GuiText * fileListText[PAGESIZE]; + GuiText * fileListTextOver[PAGESIZE]; + GuiImage * fileListBg[PAGESIZE]; + GuiImage * fileListFolder[PAGESIZE]; + + GuiImage * bgFileSelectionImg; + + GuiImageData * bgFileSelection; + GuiImageData * bgFileSelectionEntry; + GuiImageData * fileFolder; + + GuiTrigger * trigA; + GuiScrollbar scrollBar; +}; + + +#endif diff --git a/source/GUI/gui_gamebrowser.cpp b/source/GUI/gui_gamebrowser.cpp new file mode 100644 index 00000000..f87f03eb --- /dev/null +++ b/source/GUI/gui_gamebrowser.cpp @@ -0,0 +1,321 @@ +/**************************************************************************** + * libwiigui + * + * gui_gamebrowser.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +#include "../wpad.h" + +#include +#include "gui_gamebrowser.h" +#include "../settings/CSettings.h" +#include "../main.h" +#include "settings/newtitles.h" +#include "settings/GameTitles.h" +#include "usbloader/GameList.h" +#include "themes/CTheme.h" +#include "menu.h" + +#include +#include + +#define GAMESELECTSIZE 30 + +/** + * Constructor for the GuiGameBrowser class. + */ +GuiGameBrowser::GuiGameBrowser(int w, int h, int selectedGame) + : scrollBar(h-10) +{ + width = w; + height = h; + pagesize = thInt("9 - game list browser page size"); + scrollbaron = (gameList.size() > pagesize) ? 1 : 0; + selectable = true; + listOffset = selectedGame - (selectedGame % pagesize); + selectedItem = selectedGame - listOffset; + focus = 1; // allow focus + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + + bgGames = Resources::GetImageData("bg_options.png"); + newGames = Resources::GetImageData("new.png"); + + scrollBar.SetParent(this); + scrollBar.SetAlignment(thAlign("right - game browser scrollbar align hor"), thAlign("top - game browser scrollbar align ver")); + scrollBar.SetPosition(thInt("0 - game browser scrollbar pos x"), thInt("5 - game browser scrollbar pos y")); + scrollBar.SetButtonScroll(WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B); + scrollBar.listChanged.connect(this, &GuiGameBrowser::onListChange); + + bgGameImg = new GuiImage(bgGames); + bgGameImg->SetParent(this); + bgGameImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + bgGamesEntry = Resources::GetImageData("bg_options_entry.png"); + + maxTextWidth = bgGameImg->GetWidth() - scrollBar.GetWidth() - 38; + + gameIndex = new int[pagesize]; + game = new GuiButton *[pagesize]; + gameTxt = new GuiText *[pagesize]; + gameTxtOver = new GuiText *[pagesize]; + gameBg = new GuiImage *[pagesize]; + newImg = new GuiImage *[pagesize]; + + for (int i = 0; i < pagesize; i++) + { + gameTxt[i] = new GuiText(GameTitles.GetTitle(gameList[i]), 20, thColor("r=0 g=0 b=0 a=255 - game browser list text color")); + gameTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + gameTxt[i]->SetPosition(24, 0); + gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); + + gameTxtOver[i] = new GuiText(GameTitles.GetTitle(gameList[i]), 20, thColor("r=0 g=0 b=0 a=255 - game browser list text color over")); + gameTxtOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + gameTxtOver[i]->SetPosition(24, 0); + gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); + + gameBg[i] = new GuiImage(bgGamesEntry); + + newImg[i] = new GuiImage(newGames); + newImg[i]->SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); + newImg[i]->SetVisible(false); + + game[i] = new GuiButton(width - scrollBar.GetWidth(), GAMESELECTSIZE); + game[i]->SetParent(this); + game[i]->SetLabel(gameTxt[i]); + game[i]->SetLabelOver(gameTxtOver[i]); + game[i]->SetIcon(newImg[i]); + game[i]->SetImageOver(gameBg[i]); + game[i]->SetPosition(5, GAMESELECTSIZE * i + 4); + game[i]->SetRumble(false); + game[i]->SetTrigger(trigA); + game[i]->SetSoundClick(btnSoundClick); + + gameIndex[i] = i; + } + UpdateListEntries(); +} + +/** + * Destructor for the GuiGameBrowser class. + */ +GuiGameBrowser::~GuiGameBrowser() +{ + delete bgGameImg; + delete bgGames; + delete bgGamesEntry; + delete newGames; + + delete trigA; + + for (int i = 0; i < pagesize; i++) + { + delete gameTxt[i]; + delete gameTxtOver[i]; + delete gameBg[i]; + delete game[i]; + delete newImg[i]; + } + delete[] gameIndex; + delete[] game; + delete[] gameTxt; + delete[] gameTxtOver; + delete[] gameBg; +} + +void GuiGameBrowser::SetFocus(int f) +{ + LOCK( this ); + if (!gameList.size()) return; + + focus = f; + + for (int i = 0; i < pagesize; i++) + game[i]->ResetState(); + + if (f == 1) game[selectedItem]->SetState(STATE_SELECTED); +} + +void GuiGameBrowser::ResetState() +{ + LOCK( this ); + if (state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } + + for (int i = 0; i < pagesize; i++) + { + game[i]->ResetState(); + } +} + +int GuiGameBrowser::GetOffset() +{ + return listOffset; +} +int GuiGameBrowser::GetClickedOption() +{ + int found = -1; + for (int i = 0; i < pagesize; i++) + { + if (game[i]->GetState() == STATE_CLICKED) + { + game[i]->SetState(STATE_SELECTED); + found = gameIndex[i]; + break; + } + } + return found; +} + +/**************************************************************************** + * FindMenuItem + * + * Help function to find the next visible menu item on the list + ***************************************************************************/ + +int GuiGameBrowser::FindMenuItem(int currentItem, int direction) +{ + int nextItem = currentItem + direction; + + if (nextItem < 0 || nextItem >= gameList.size()) return -1; + + if (strlen(GameTitles.GetTitle(gameList[nextItem])) > 0) + return nextItem; + + return FindMenuItem(nextItem, direction); +} + +void GuiGameBrowser::onListChange(int SelItem, int SelInd) +{ + selectedItem = SelItem; + listOffset = SelInd; + UpdateListEntries(); +} + +/** + * Draw the button on screen + */ +void GuiGameBrowser::Draw() +{ + LOCK( this ); + if (!this->IsVisible() || !gameList.size()) return; + + bgGameImg->Draw(); + + int next = listOffset; + + for (int i = 0; i < pagesize; i++) + { + if (next >= 0) + { + game[i]->Draw(); + next = this->FindMenuItem(next, 1); + } + else break; + } + + if (scrollbaron == 1) + scrollBar.Draw(); + + this->UpdateEffects(); +} + +void GuiGameBrowser::UpdateListEntries() +{ + int next = listOffset; + for (int i = 0; i < pagesize; i++) + { + if (next >= 0) + { + if (game[i]->GetState() == STATE_DISABLED) + { + game[i]->SetVisible(true); + game[i]->SetState(STATE_DEFAULT); + } + gameTxt[i]->SetText(GameTitles.GetTitle(gameList[next])); + gameTxt[i]->SetPosition(24, 0); + gameTxtOver[i]->SetText(GameTitles.GetTitle(gameList[next])); + gameTxtOver[i]->SetPosition(24, 0); + + if (Settings.marknewtitles) + { + bool isNew = NewTitles::Instance()->IsNew(gameList[next]->id); + if (isNew) + { + gameTxt[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), DOTTED); + gameTxtOver[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), SCROLL_HORIZONTAL); + } + else + { + gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); + gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); + } + newImg[i]->SetVisible(isNew); + } + + gameIndex[i] = next; + next = this->FindMenuItem(next, 1); + } + else + { + game[i]->SetVisible(false); + game[i]->SetState(STATE_DISABLED); + } + } +} + +void GuiGameBrowser::Update(GuiTrigger * t) +{ + LOCK( this ); + if (state == STATE_DISABLED || !t || !gameList.size()) return; + + static int pressedChan = -1; + int next; + + if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT | + WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) || + (t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN))) + pressedChan = t->chan; + + if (scrollbaron == 1) + // update the location of the scroll box based on the position in the option list + scrollBar.Update(t); + + next = listOffset; + + if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h)) + { + for (int i = 0; i < pagesize; i++) + { + if (next >= 0) next = this->FindMenuItem(next, 1); + + if (i != selectedItem && game[i]->GetState() == STATE_SELECTED) + game[i]->ResetState(); + else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) + game[selectedItem]->SetState(STATE_SELECTED, -1); + + game[i]->Update(t); + + if (game[i]->GetState() == STATE_SELECTED) + selectedItem = i; + } + } + + if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h) + pressedChan = -1; + + scrollBar.SetPageSize(pagesize); + scrollBar.SetSelectedItem(selectedItem); + scrollBar.SetSelectedIndex(listOffset); + scrollBar.SetEntrieCount(gameList.size()); + + if (updateCB) updateCB(this); +} + diff --git a/source/libwiigui/gui_gamebrowser.h b/source/GUI/gui_gamebrowser.h similarity index 55% rename from source/libwiigui/gui_gamebrowser.h rename to source/GUI/gui_gamebrowser.h index 772b1999..55b16a23 100644 --- a/source/libwiigui/gui_gamebrowser.h +++ b/source/GUI/gui_gamebrowser.h @@ -2,9 +2,10 @@ #define _GUIGAMEBROWSER_H_ #include "gui.h" -#include "../usbloader/disc.h" +#include "gui_scrollbar.hpp" +#include "usbloader/disc.h" -class GuiGameBrowser: public GuiElement +class GuiGameBrowser: public GuiElement, public sigslot::has_slots<> { public: GuiGameBrowser(int w, int h, int selectedGame = 0); @@ -17,9 +18,8 @@ class GuiGameBrowser: public GuiElement void Draw(); void Update(GuiTrigger * t); int GetOffset(); - void Reload(); - //GuiText * optionVal[PAGESIZE]; protected: + void onListChange(int SelItem, int SelInd); void UpdateListEntries(); int selectedItem; int listOffset; @@ -34,31 +34,14 @@ class GuiGameBrowser: public GuiElement GuiImage ** gameBg; GuiImage ** newImg; - GuiButton * arrowUpBtn; - GuiButton * arrowDownBtn; - GuiButton * scrollbarBoxBtn; - GuiImage * bgGameImg; - GuiImage * scrollbarImg; - GuiImage * arrowDownImg; - GuiImage * arrowDownOverImg; - GuiImage * arrowUpImg; - GuiImage * arrowUpOverImg; - GuiImage * scrollbarBoxImg; - GuiImage * scrollbarBoxOverImg; GuiImageData * bgGames; GuiImageData * bgGamesEntry; GuiImageData * newGames; - GuiImageData * scrollbar; - GuiImageData * arrowDown; - GuiImageData * arrowDownOver; - GuiImageData * arrowUp; - GuiImageData * arrowUpOver; - GuiImageData * scrollbarBox; - GuiImageData * scrollbarBoxOver; GuiTrigger * trigA; - GuiTrigger * trigHeldA; + + GuiScrollbar scrollBar; }; #endif diff --git a/source/libwiigui/gui_gamecarousel.cpp b/source/GUI/gui_gamecarousel.cpp similarity index 99% rename from source/libwiigui/gui_gamecarousel.cpp rename to source/GUI/gui_gamecarousel.cpp index 91ce2030..86841ca8 100644 --- a/source/libwiigui/gui_gamecarousel.cpp +++ b/source/GUI/gui_gamecarousel.cpp @@ -16,7 +16,7 @@ #include "usbloader/GameList.h" #include "settings/GameTitles.h" #include "settings/CSettings.h" -#include "libwiigui/LoadCoverImage.h" +#include "GUI/LoadCoverImage.h" #include "themes/CTheme.h" #include "main.h" diff --git a/source/libwiigui/gui_gamecarousel.h b/source/GUI/gui_gamecarousel.h similarity index 100% rename from source/libwiigui/gui_gamecarousel.h rename to source/GUI/gui_gamecarousel.h diff --git a/source/libwiigui/gui_gamegrid.cpp b/source/GUI/gui_gamegrid.cpp similarity index 99% rename from source/libwiigui/gui_gamegrid.cpp rename to source/GUI/gui_gamegrid.cpp index a8ae0605..e09ad966 100644 --- a/source/libwiigui/gui_gamegrid.cpp +++ b/source/GUI/gui_gamegrid.cpp @@ -12,7 +12,7 @@ #include #include "gui_gamegrid.h" #include "gui_image_async.h" -#include "libwiigui/LoadCoverImage.h" +#include "GUI/LoadCoverImage.h" #include "usbloader/GameList.h" #include "settings/GameTitles.h" #include "settings/CSettings.h" diff --git a/source/libwiigui/gui_gamegrid.h b/source/GUI/gui_gamegrid.h similarity index 100% rename from source/libwiigui/gui_gamegrid.h rename to source/GUI/gui_gamegrid.h diff --git a/source/libwiigui/gui_image.cpp b/source/GUI/gui_image.cpp similarity index 89% rename from source/libwiigui/gui_image.cpp rename to source/GUI/gui_image.cpp index aadd3299..6e767495 100644 --- a/source/libwiigui/gui_image.cpp +++ b/source/GUI/gui_image.cpp @@ -19,7 +19,8 @@ GuiImage::GuiImage() width = 0; height = 0; imageangle = 0; - tile = -1; + tileHorizontal = -1; + tileVertical = -1; stripe = 0; widescreen = 0; xx1 = 0; @@ -48,7 +49,8 @@ GuiImage::GuiImage(GuiImageData * img) height = 0; } imageangle = 0; - tile = -1; + tileHorizontal = -1; + tileVertical = -1; stripe = 0; widescreen = 0; parentangle = true; @@ -69,7 +71,8 @@ GuiImage::GuiImage(u8 * img, int w, int h) width = w; height = h; imageangle = 0; - tile = -1; + tileHorizontal = -1; + tileVertical = -1; stripe = 0; widescreen = 0; parentangle = true; @@ -90,7 +93,8 @@ GuiImage::GuiImage(int w, int h, GXColor c) width = w; height = h; imageangle = 0; - tile = -1; + tileHorizontal = -1; + tileVertical = -1; stripe = 0; widescreen = 0; parentangle = true; @@ -131,7 +135,8 @@ GuiImage::GuiImage(GuiImage &srcimage) : memcpy(image, srcimage.GetImage(), len); DCFlushRange(image, len); imageangle = srcimage.GetAngle(); - tile = -1; + tileHorizontal = -1; + tileVertical = -1; stripe = 0; widescreen = 0; parentangle = true; @@ -157,7 +162,8 @@ GuiImage::GuiImage(GuiImage *srcimage) : memcpy(image, srcimage->GetImage(), len); DCFlushRange(image, len); imageangle = srcimage->GetAngle(); - tile = -1; + tileHorizontal = -1; + tileVertical = -1; stripe = 0; widescreen = 0; parentangle = true; @@ -188,7 +194,8 @@ GuiImage &GuiImage::operator=(GuiImage & srcimage) memcpy(image, srcimage.GetImage(), len); DCFlushRange(image, len); imageangle = srcimage.GetAngle(); - tile = -1; + tileHorizontal = -1; + tileVertical = -1; stripe = 0; widescreen = 0; parentangle = true; @@ -267,10 +274,16 @@ float GuiImage::GetAngle() return imageangle; } -void GuiImage::SetTile(int t) +void GuiImage::SetTileHorizontal(int t) { LOCK( this ); - tile = t; + tileHorizontal = t; +} + +void GuiImage::SetTileVertical(int t) +{ + LOCK( this ); + tileVertical = t; } void GuiImage::SetWidescreen(bool w) @@ -428,7 +441,7 @@ void GuiImage::ColorStripe(int shift) void GuiImage::Draw() { LOCK( this ); - if (!image || !this->IsVisible() || tile == 0) return; + if (!image || !this->IsVisible() || tileHorizontal == 0) return; float currScale = this->GetScale(); int currLeft = this->GetLeft(); @@ -437,12 +450,19 @@ void GuiImage::Draw() if (currAngleDyn && parentangle) imageangle = currAngleDyn; - if (tile > 0) + if (tileHorizontal > 0) { - for (int i = 0; i < tile; i++) + for (int i = 0; i < tileHorizontal; i++) Menu_DrawImg(currLeft + width * i, this->GetTop(), zoffset, width, height, image, imageangle, - widescreen ? currScale * Settings.WSFactor : currScale, currScale, this->GetAlpha(), xx1, yy1, xx2, yy2, xx3, - yy3, xx4, yy4); + widescreen ? currScale * Settings.WSFactor : currScale, currScale, this->GetAlpha(), xx1, + yy1, xx2, yy2, xx3, yy3, xx4, yy4); + } + else if(tileVertical > 0) + { + for (int i = 0; i < tileVertical; i++) + Menu_DrawImg(currLeft, this->GetTop() + height * i, zoffset, width, height, image, imageangle, + widescreen ? currScale * Settings.WSFactor : currScale, currScale, this->GetAlpha(), xx1, + yy1, xx2, yy2, xx3, yy3, xx4, yy4); } else { diff --git a/source/libwiigui/gui_image_async.cpp b/source/GUI/gui_image_async.cpp similarity index 100% rename from source/libwiigui/gui_image_async.cpp rename to source/GUI/gui_image_async.cpp diff --git a/source/libwiigui/gui_image_async.h b/source/GUI/gui_image_async.h similarity index 97% rename from source/libwiigui/gui_image_async.h rename to source/GUI/gui_image_async.h index 3f440b4a..ee372e3e 100644 --- a/source/libwiigui/gui_image_async.h +++ b/source/GUI/gui_image_async.h @@ -2,7 +2,7 @@ #define _GUIIMAGEASYNC_H_ #include -#include "libwiigui/gui.h" +#include "gui.h" typedef GuiImageData * (*ImageLoaderCallback)(void *arg); diff --git a/source/libwiigui/gui_imagedata.cpp b/source/GUI/gui_imagedata.cpp similarity index 100% rename from source/libwiigui/gui_imagedata.cpp rename to source/GUI/gui_imagedata.cpp diff --git a/source/libwiigui/gui_imagedata.h b/source/GUI/gui_imagedata.h similarity index 100% rename from source/libwiigui/gui_imagedata.h rename to source/GUI/gui_imagedata.h diff --git a/source/libwiigui/gui_keyboard.cpp b/source/GUI/gui_keyboard.cpp similarity index 100% rename from source/libwiigui/gui_keyboard.cpp rename to source/GUI/gui_keyboard.cpp diff --git a/source/libwiigui/gui_numpad.cpp b/source/GUI/gui_numpad.cpp similarity index 100% rename from source/libwiigui/gui_numpad.cpp rename to source/GUI/gui_numpad.cpp diff --git a/source/GUI/gui_optionbrowser.cpp b/source/GUI/gui_optionbrowser.cpp new file mode 100644 index 00000000..4efd1031 --- /dev/null +++ b/source/GUI/gui_optionbrowser.cpp @@ -0,0 +1,324 @@ +/**************************************************************************** + * libwiigui + * + * gui_customoptionbrowser.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +#include "../wpad.h" +#include "../main.h" +#include "../gecko.h" +#include "../settings/CSettings.h" +#include "gui_optionbrowser.h" +#include "themes/CTheme.h" +#include "utils/tools.h" +#include "menu.h" + +#include + +#define GAMESELECTSIZE 30 + +/** +GuiOptionBrowser * Constructor for the GuiOptionBrowser class. + */ +GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char * custombg) + : scrollBar(h-10) +{ + width = w; + height = h; + options = l; + selectable = true; + selectedItem = 0; + focus = 1; // allow focus + coL2 = 50; + scrollbaron = false; + listChanged = true; + listOffset = 0; + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + + bgOptions = Resources::GetImageData(custombg); + + bgOptionsImg = new GuiImage(bgOptions); + bgOptionsImg->SetParent(this); + bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + bgOptionsEntry = Resources::GetImageData("bg_options_entry.png"); + + scrollBar.SetParent(this); + scrollBar.SetAlignment(thAlign("right - options browser scrollbar align hor"), thAlign("top - options browser scrollbar align ver")); + scrollBar.SetPosition(thInt("0 - options browser scrollbar pos x"), thInt("5 - options browser scrollbar pos y")); + scrollBar.listChanged.connect(this, &GuiOptionBrowser::onListChange); + + for (int i = 0; i < PAGESIZE; i++) + { + optionTxt[i] = new GuiText((wchar_t *) NULL, 20, thColor("r=0 g=0 b=0 a=255 - settings text color")); + optionTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + optionTxt[i]->SetPosition(24, 0); + optionTxt[i]->SetMaxWidth(bgOptionsImg->GetWidth()-scrollBar.GetWidth()-40, DOTTED); + + optionBg[i] = new GuiImage(bgOptionsEntry); + + optionVal[i] = new GuiText((wchar_t *) NULL, 20, thColor("r=0 g=0 b=0 a=255 - settings text color")); + optionVal[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + optionValOver[i] = new GuiText((wchar_t *) NULL, 20, thColor("r=0 g=0 b=0 a=255 - settings text color")); + optionValOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + optionBtn[i] = new GuiButton(width - scrollBar.GetWidth(), GAMESELECTSIZE); + optionBtn[i]->SetParent(this); + optionBtn[i]->SetLabel(optionTxt[i], 0); + optionBtn[i]->SetLabel(optionVal[i], 1); + optionBtn[i]->SetLabelOver(optionValOver[i], 1); + optionBtn[i]->SetImageOver(optionBg[i]); + optionBtn[i]->SetPosition(10, GAMESELECTSIZE * i + 4); + optionBtn[i]->SetRumble(false); + optionBtn[i]->SetTrigger(trigA); + optionBtn[i]->SetSoundClick(btnSoundClick); + } +} + +/** + * Destructor for the GuiOptionBrowser class. + */ +GuiOptionBrowser::~GuiOptionBrowser() +{ + delete bgOptionsImg; + delete bgOptions; + delete bgOptionsEntry; + + delete trigA; + + for (int i = 0; i < PAGESIZE; i++) + { + delete optionTxt[i]; + delete optionVal[i]; + delete optionValOver[i]; + delete optionBg[i]; + delete optionBtn[i]; + } +} + +void GuiOptionBrowser::SetFocus(int f) +{ + focus = f; + + for (int i = 0; i < PAGESIZE; i++) + optionBtn[i]->ResetState(); + + if (f == 1) optionBtn[selectedItem]->SetState(STATE_SELECTED); +} + +void GuiOptionBrowser::ResetState() +{ + if (state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } + + for (int i = 0; i < PAGESIZE; i++) + { + optionBtn[i]->ResetState(); + } +} + +int GuiOptionBrowser::GetClickedOption() +{ + for (int i = 0; i < PAGESIZE; i++) + { + if (optionBtn[i]->GetState() == STATE_CLICKED) + { + optionBtn[i]->SetState(STATE_SELECTED); + return optionIndex[i]; + } + } + + return -1; +} + +int GuiOptionBrowser::GetSelectedOption() +{ + for (int i = 0; i < PAGESIZE; i++) + { + if (optionBtn[i]->GetState() == STATE_SELECTED) + { + return optionIndex[i]; + } + } + return -1; +} + +void GuiOptionBrowser::SetClickable(bool enable) +{ + for (int i = 0; i < PAGESIZE; i++) + { + optionBtn[i]->SetClickable(enable); + } +} + +void GuiOptionBrowser::SetOffset(int optionnumber) +{ + listOffset = optionnumber; + selectedItem = optionnumber; +} + +void GuiOptionBrowser::onListChange(int SelItem, int SelInd) +{ + selectedItem = SelItem; + listOffset = SelInd; + UpdateListEntries(); +} + +/**************************************************************************** + * FindMenuItem + * + * Help function to find the next visible menu item on the list + ***************************************************************************/ + +int GuiOptionBrowser::FindMenuItem(int currentItem, int direction) +{ + int nextItem = currentItem + direction; + + if (nextItem < 0 || nextItem >= options->GetLength()) return -1; + + if (strlen(options->GetName(nextItem)) > 0) + return nextItem; + + return FindMenuItem(nextItem, direction); +} + +/** + * Draw the button on screen + */ +void GuiOptionBrowser::Draw() +{ + if (!this->IsVisible()) return; + + bgOptionsImg->Draw(); + + int next = listOffset; + + for (int i = 0; i < PAGESIZE; i++) + { + if (next >= 0) + { + optionBtn[i]->Draw(); + next = this->FindMenuItem(next, 1); + } + else break; + } + + if (scrollbaron) + scrollBar.Draw(); + + this->UpdateEffects(); +} + +void GuiOptionBrowser::UpdateListEntries() +{ + LOCK(this); + scrollbaron = options->GetLength() > PAGESIZE; + if (listOffset < 0) listOffset = this->FindMenuItem(-1, 1); + int next = listOffset; + + int maxNameWidth = 0; + for (int i = 0; i < PAGESIZE; i++) + { + if (next >= 0) + { + if (optionBtn[i]->GetState() == STATE_DISABLED) + { + optionBtn[i]->SetVisible(true); + optionBtn[i]->SetState(STATE_DEFAULT); + } + + optionTxt[i]->SetText(options->GetName(next)); + if (maxNameWidth < optionTxt[i]->GetTextWidth()) maxNameWidth = optionTxt[i]->GetTextWidth(); + optionVal[i]->SetText(options->GetValue(next)); + optionValOver[i]->SetText(options->GetValue(next)); + + optionIndex[i] = next; + next = this->FindMenuItem(next, 1); + } + else + { + optionBtn[i]->SetVisible(false); + optionBtn[i]->SetState(STATE_DISABLED); + } + } + + if (coL2 < (24 + maxNameWidth + 16)) + coL2 = 24 + maxNameWidth + 16; + + for (int i = 0; i < PAGESIZE; i++) + { + if (optionBtn[i]->GetState() != STATE_DISABLED) + { + optionVal[i]->SetPosition(coL2, 0); + optionVal[i]->SetMaxWidth(bgOptionsImg->GetWidth() - (coL2 + scrollBar.GetWidth()+10), DOTTED); + + optionValOver[i]->SetPosition(coL2, 0); + optionValOver[i]->SetMaxWidth(bgOptionsImg->GetWidth() - (coL2 + scrollBar.GetWidth()+10), SCROLL_HORIZONTAL); + } + } +} + +void GuiOptionBrowser::Update(GuiTrigger * t) +{ + if (state == STATE_DISABLED || !t) return; + + static int pressedChan = -1; + + if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT | + WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) || + (t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN))) + pressedChan = t->chan; + + if (scrollbaron) + // update the location of the scroll box based on the position in the option list + scrollBar.Update(t); + + int next = listOffset; + + if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h)) + { + for(int i = 0; i < PAGESIZE; i++) + { + if (next >= 0) next = this->FindMenuItem(next, 1); + + if (i != selectedItem && optionBtn[i]->GetState() == STATE_SELECTED) + { + optionBtn[i]->ResetState(); + } + else if (i == selectedItem && optionBtn[i]->GetState() == STATE_DEFAULT) + { + optionBtn[selectedItem]->SetState(STATE_SELECTED); + } + + optionBtn[i]->Update(t); + + if (optionBtn[i]->GetState() == STATE_SELECTED) + selectedItem = i; + } + } + + if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h) + pressedChan = -1; + + scrollBar.SetPageSize(PAGESIZE); + scrollBar.SetSelectedItem(selectedItem); + scrollBar.SetSelectedIndex(listOffset); + scrollBar.SetEntrieCount(options->GetLength()); + + if (options->IsChanged()) + { + UpdateListEntries(); + listChanged = false; + } + + if (updateCB) updateCB(this); +} diff --git a/source/libwiigui/gui_customoptionbrowser.h b/source/GUI/gui_optionbrowser.h similarity index 52% rename from source/libwiigui/gui_customoptionbrowser.h rename to source/GUI/gui_optionbrowser.h index 9291b2fa..f84b0d89 100644 --- a/source/libwiigui/gui_customoptionbrowser.h +++ b/source/GUI/gui_optionbrowser.h @@ -1,15 +1,16 @@ -#ifndef GUI_CUSTOMBROWSER_H_ -#define GUI_CUSTOMBROWSER_H_ +#ifndef GUI_OPTIONBROWSER_H_ +#define GUI_OPTIONBROWSER_H_ #include "gui.h" +#include "gui_scrollbar.hpp" #include //!Display a list of menu options -class GuiCustomOptionBrowser: public GuiElement +class GuiOptionBrowser: public GuiElement, public sigslot::has_slots<> { public: - GuiCustomOptionBrowser(int w, int h, OptionList * l, const char * background); - ~GuiCustomOptionBrowser(); + GuiOptionBrowser(int w, int h, OptionList * l, const char * background); + ~GuiOptionBrowser(); int FindMenuItem(int c, int d); int GetClickedOption(); int GetSelectedOption(); @@ -20,11 +21,13 @@ class GuiCustomOptionBrowser: public GuiElement void Draw(); void Update(GuiTrigger * t); protected: + void onListChange(int SelItem, int SelInd); void UpdateListEntries(); int selectedItem; int listOffset; int coL2; bool scrollbaron; + bool listChanged; OptionList * options; int optionIndex[PAGESIZE]; @@ -34,31 +37,13 @@ class GuiCustomOptionBrowser: public GuiElement GuiText * optionValOver[PAGESIZE]; GuiImage * optionBg[PAGESIZE]; - GuiButton * arrowUpBtn; - GuiButton * arrowDownBtn; - GuiButton * scrollbarBoxBtn; - GuiImage * bgOptionsImg; - GuiImage * scrollbarImg; - GuiImage * arrowDownImg; - GuiImage * arrowDownOverImg; - GuiImage * arrowUpImg; - GuiImage * arrowUpOverImg; - GuiImage * scrollbarBoxImg; - GuiImage * scrollbarBoxOverImg; GuiImageData * bgOptions; GuiImageData * bgOptionsEntry; - GuiImageData * scrollbar; - GuiImageData * arrowDown; - GuiImageData * arrowDownOver; - GuiImageData * arrowUp; - GuiImageData * arrowUpOver; - GuiImageData * scrollbarBox; - GuiImageData * scrollbarBoxOver; GuiTrigger * trigA; - GuiTrigger * trigHeldA; + GuiScrollbar scrollBar; }; #endif diff --git a/source/GUI/gui_scrollbar.cpp b/source/GUI/gui_scrollbar.cpp new file mode 100644 index 00000000..b1743249 --- /dev/null +++ b/source/GUI/gui_scrollbar.cpp @@ -0,0 +1,481 @@ +/*************************************************************************** + * Copyright (C) 2011 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#include "themes/Resources.h" +#include "menu/menus.h" +#include "gui_scrollbar.hpp" +#include "utils/tools.h" + +GuiScrollbar::GuiScrollbar(int h, u8 m) +{ + SelItem = 0; + SelInd = 0; + RowSize = 0; + PageSize = 0; + EntrieCount = 0; + ScrollSpeed = 15; + ButtonScroll = 0; + ButtonScrollSpeed = 20; + ScrollState = 0; + pressedChan = -1; + AllowDPad = true; + Mode = m; + listChanged.connect(this, &GuiScrollbar::setScrollboxPosition); + + scrollbarTop = Resources::GetImageData("scrollBarTop.png"); + scrollbarBottom = Resources::GetImageData("scrollBarBottom.png"); + scrollbarTile = Resources::GetImageData("scrollBarTile.png"); + arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); + arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); + arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); + arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); + scrollbarBox = Resources::GetImageData("scrollbar_box.png"); + scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); + oneButtonScrollImgData = Resources::GetImageData("oneButtonScroll.png"); + + height = h; + width = MAX(scrollbarBox->GetWidth(), scrollbarTile->GetWidth()); + + MinHeight = arrowUp->GetHeight(); + MaxHeight = height-scrollbarBox->GetHeight()-arrowDown->GetHeight(); + + trigHeldA = new GuiTrigger; + trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + + int Tiles = (height-scrollbarTop->GetHeight()-scrollbarBottom->GetHeight())/4; + int PositionY = 0; + ButtonPositionX = 0; + + oneButtonScrollImg = new GuiImage(oneButtonScrollImgData); + + scrollbarTopImg = new GuiImage(scrollbarTop); + scrollbarTopImg->SetParent(this); + scrollbarTopImg->SetAlignment(ALIGN_CENTER, ALIGN_TOP); + scrollbarTopImg->SetPosition(0, PositionY); + PositionY += scrollbarTop->GetHeight(); + + scrollbarTileImg = new GuiImage(scrollbarTile); + scrollbarTileImg->SetParent(this); + scrollbarTileImg->SetAlignment(ALIGN_CENTER, ALIGN_TOP); + scrollbarTileImg->SetPosition(0, PositionY); + scrollbarTileImg->SetTileVertical(Tiles); + PositionY += Tiles*scrollbarTile->GetHeight(); + + scrollbarBottomImg = new GuiImage(scrollbarBottom); + scrollbarBottomImg->SetParent(this); + scrollbarBottomImg->SetAlignment(ALIGN_CENTER, ALIGN_TOP); + scrollbarBottomImg->SetPosition(0, PositionY); + + arrowDownImg = new GuiImage(arrowDown); + arrowDownOverImg = new GuiImage(arrowDownOver); + arrowUpImg = new GuiImage(arrowUp); + arrowUpOverImg = new GuiImage(arrowUpOver); + scrollbarBoxImg = new GuiImage(scrollbarBox); + scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); + + arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); + arrowUpBtn->SetParent(this); + arrowUpBtn->SetImage(arrowUpImg); + arrowUpBtn->SetImageOver(arrowUpOverImg); + arrowUpBtn->SetAlignment(ALIGN_CENTER, ALIGN_TOP); + arrowUpBtn->SetPosition(ButtonPositionX, 0); + arrowUpBtn->SetHoldable(true); + arrowUpBtn->SetTrigger(trigHeldA); + arrowUpBtn->SetSoundOver(btnSoundOver); + arrowUpBtn->SetSoundClick(btnSoundClick); + arrowUpBtn->Held.connect(this, &GuiScrollbar::OnUpButtonHold); + + arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); + arrowDownBtn->SetParent(this); + arrowDownBtn->SetImage(arrowDownImg); + arrowDownBtn->SetImageOver(arrowDownOverImg); + arrowDownBtn->SetAlignment(ALIGN_CENTER, ALIGN_BOTTOM); + arrowDownBtn->SetPosition(ButtonPositionX, 0); + arrowDownBtn->SetHoldable(true); + arrowDownBtn->SetTrigger(trigHeldA); + arrowDownBtn->SetSoundOver(btnSoundOver); + arrowDownBtn->SetSoundClick(btnSoundClick); + arrowDownBtn->Held.connect(this, &GuiScrollbar::OnDownButtonHold); + + scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); + scrollbarBoxBtn->SetParent(this); + scrollbarBoxBtn->SetImage(scrollbarBoxImg); + scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); + scrollbarBoxBtn->SetAlignment(ALIGN_CENTER, ALIGN_TOP); + scrollbarBoxBtn->SetPosition(ButtonPositionX, MinHeight); + scrollbarBoxBtn->SetMinY(MinHeight); + scrollbarBoxBtn->SetMaxY(MaxHeight); + scrollbarBoxBtn->SetHoldable(true); + scrollbarBoxBtn->SetTrigger(trigHeldA); + scrollbarBoxBtn->Held.connect(this, &GuiScrollbar::OnBoxButtonHold); +} + +GuiScrollbar::~GuiScrollbar() +{ + delete scrollbarTop; + delete scrollbarBottom; + delete scrollbarTile; + delete arrowDown; + delete arrowDownOver; + delete arrowUp; + delete arrowUpOver; + delete scrollbarBox; + delete scrollbarBoxOver; + delete oneButtonScrollImg; + + delete arrowUpBtn; + delete arrowDownBtn; + delete scrollbarBoxBtn; + + delete scrollbarTopImg; + delete scrollbarBottomImg; + delete scrollbarTileImg; + delete arrowDownImg; + delete arrowDownOverImg; + delete arrowUpImg; + delete arrowUpOverImg; + delete scrollbarBoxImg; + delete scrollbarBoxOverImg; + delete oneButtonScrollImgData; + + delete trigHeldA; +} + +void GuiScrollbar::ScrollOneUp() +{ + if(Mode == ICONMODE) + { + if(SelInd+SelItem-RowSize >= 0) + { + SelItem = SelItem-RowSize; + if(SelItem < 0) + { + // move list up by 1 + SelInd = SelInd-RowSize; + SelItem = SelItem+RowSize; + } + } + } + else if(Mode == LISTMODE) + { + if(SelItem == 0 && SelInd > 0) + { + // move list up by 1 + --SelInd; + } + else if(SelInd+SelItem > 0) + { + --SelItem; + } + } +} + +void GuiScrollbar::ScrollOneDown() +{ + if(Mode == ICONMODE) + { + int i = RowSize; + while(SelInd+SelItem+RowSize >= EntrieCount && i > 0 && SelItem > 0 && RowSize < EntrieCount) + { + --i; + --SelItem; + } + if(SelInd+SelItem+RowSize < EntrieCount) + { + SelItem = SelItem+RowSize; + if(SelItem >= PageSize) + { + // move list down by 1 + SelInd += RowSize; + SelItem = SelItem-RowSize; + } + } + } + else if(Mode == LISTMODE) + { + if(SelInd+SelItem + 1 < EntrieCount) + { + if(SelItem == PageSize-1) + { + // move list down by 1 + SelInd++; + } + else + { + SelItem++; + } + } + } +} + +void GuiScrollbar::OnUpButtonHold(GuiButton *sender, int pointer, const POINT &p) +{ + if(ScrollState < ScrollSpeed) + return; + + ScrollOneUp(); + + ScrollState = 0; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::OnDownButtonHold(GuiButton *sender, int pointer, const POINT &p) +{ + if(ScrollState < ScrollSpeed) + return; + + ScrollOneDown(); + + ScrollState = 0; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::OnBoxButtonHold(GuiButton *sender, int pointer, const POINT &p) +{ + if(ScrollState < ScrollSpeed) + return; + + if(!userInput[pointer].wpad.ir.valid) + return; + + int y = p.y-this->GetTop()-scrollbarBox->GetHeight()/2; + + int positionWiimote = LIMIT(y-MinHeight, 0, MaxHeight-MinHeight); + + int newSelected = (int) ((float) positionWiimote / (float) (MaxHeight-MinHeight) * (float) (EntrieCount-1)); + + if(Mode == ICONMODE) + { + int rows = (int) floor(((float) (newSelected-SelInd-SelItem)) / ((float) RowSize)); + + while(SelInd+rows*RowSize >= EntrieCount-PageSize+RowSize) + rows--; + + int pageIndex = LIMIT(SelInd+rows*RowSize, 0, EntrieCount-1-RowSize); + + if(newSelected <= 0) + SelItem = 0; + else if(newSelected >= EntrieCount-1) + SelItem = EntrieCount-1-pageIndex; + + SelInd = pageIndex; + } + else if(Mode == LISTMODE) + { + int diff = newSelected-SelInd-SelItem; + + if(newSelected <= 0) + { + SelItem = 0; + SelInd = 0; + } + else if(newSelected >= EntrieCount-1) + { + SelItem = (PageSize-1 < EntrieCount-1) ? PageSize-1 : EntrieCount-1; + SelInd = EntrieCount-PageSize; + } + else if(newSelected < PageSize && SelInd == 0 && diff < 0) + { + SelItem = MAX(SelItem+diff, 0); + } + else if(EntrieCount-newSelected < PageSize && SelInd == EntrieCount-PageSize && diff > 0) + { + SelItem = MIN(SelItem+diff, PageSize-1); + } + else + { + SelInd = LIMIT(SelInd+diff, 0, ((EntrieCount-PageSize < 0) ? 0 : EntrieCount-PageSize)); + } + } + + ScrollState = 0; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::SetPageSize(int size) +{ + if(PageSize == size) + return; + + PageSize = size; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::SetRowSize(int size) +{ + if(RowSize == size) + return; + + RowSize = size; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::SetSelectedItem(int pos) +{ + if(SelItem == pos) + return; + + SelItem = pos; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::SetSelectedIndex(int pos) +{ + if(SelInd == pos) + return; + + SelInd = pos; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::SetEntrieCount(int cnt) +{ + if(EntrieCount == cnt) + return; + + EntrieCount = cnt; + listChanged(SelItem, SelInd); +} + +void GuiScrollbar::setScrollboxPosition(int SelItem, int SelInd) +{ + if(Mode == ICONMODE) + { + u8 row = (u8) floor((float) SelItem / (float) RowSize); + + int position = MinHeight+(MaxHeight-MinHeight)*(SelInd+row*RowSize)/(EntrieCount-1); + + if(position < MinHeight) + position = MinHeight; + else if(position > MaxHeight || ((SelInd+PageSize >= (EntrieCount-1)) && row > 1)) + position = MaxHeight; + + scrollbarBoxBtn->SetPosition(ButtonPositionX, position); + } + else if(Mode == LISTMODE) + { + int position = MinHeight+(MaxHeight-MinHeight)*(SelInd+SelItem)/(EntrieCount-1); + + if(position < MinHeight) + position = MinHeight; + else if(position > MaxHeight || (SelInd+SelItem >= EntrieCount-1)) + position = MaxHeight; + + scrollbarBoxBtn->SetPosition(ButtonPositionX, position); + } +} + +void GuiScrollbar::CheckDPadControls(GuiTrigger *t) +{ + if(t->Up()) + { + ScrollOneUp(); + listChanged(SelItem, SelInd); + } + else if(t->Down()) + { + ScrollOneDown(); + listChanged(SelItem, SelInd); + } + + else if(t->Left() && Mode == LISTMODE) + { + SelInd -= PageSize; + if(SelInd < 0) + { + SelInd = 0; + SelItem = 0; + } + listChanged(SelItem, SelInd); + } + else if(t->Right() && Mode == LISTMODE) + { + SelInd += PageSize; + if(SelInd+PageSize >= EntrieCount) + { + SelInd = EntrieCount-PageSize; + SelItem = PageSize-1; + } + listChanged(SelItem, SelInd); + } +} + +void GuiScrollbar::ScrollByButton(GuiTrigger *t) +{ + static int pressedPosition = -1; + + if(!t->wpad.ir.valid || ScrollState < ButtonScrollSpeed-ButtonScrollSpeed*fabs(pressedPosition-t->wpad.ir.y)/250.f) + return; + + if(pressedChan == -1 && (t->wpad.btns_d & ButtonScroll) && + parentElement && parentElement->IsInside(t->wpad.ir.x, t->wpad.ir.y)) + { + pressedPosition = t->wpad.ir.y; + pressedChan = t->chan; + oneButtonScrollImg->SetPosition(t->wpad.ir.x-oneButtonScrollImg->GetWidth()/2, t->wpad.ir.y-oneButtonScrollImg->GetHeight()/2); + } + + if(pressedChan == t->chan && (t->wpad.btns_h & ButtonScroll)) + { + if(pressedPosition-oneButtonScrollImg->GetHeight()/2 > t->wpad.ir.y) + ScrollOneUp(); + else if(pressedPosition+oneButtonScrollImg->GetHeight()/2 < t->wpad.ir.y) + ScrollOneDown(); + + ScrollState = 0; + listChanged(SelItem, SelInd); + } + + if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h) + { + pressedChan = -1; + pressedPosition = -1; + } +} + +void GuiScrollbar::Draw() +{ + scrollbarTileImg->Draw(); + scrollbarTopImg->Draw(); + scrollbarBottomImg->Draw(); + arrowUpBtn->Draw(); + arrowDownBtn->Draw(); + scrollbarBoxBtn->Draw(); + if(pressedChan >= 0 && userInput[pressedChan].wpad.ir.valid) + oneButtonScrollImg->Draw(); + + UpdateEffects(); +} + +void GuiScrollbar::Update(GuiTrigger * t) +{ + arrowUpBtn->Update(t); + arrowDownBtn->Update(t); + scrollbarBoxBtn->Update(t); + if(AllowDPad) + CheckDPadControls(t); + if(ButtonScroll) + ScrollByButton(t); + + ++ScrollState; +} diff --git a/source/GUI/gui_scrollbar.hpp b/source/GUI/gui_scrollbar.hpp new file mode 100644 index 00000000..84b3003d --- /dev/null +++ b/source/GUI/gui_scrollbar.hpp @@ -0,0 +1,109 @@ +/*************************************************************************** + * Copyright (C) 2011 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#ifndef GUISCROLLBAR_HPP_ +#define GUISCROLLBAR_HPP_ + +#include "gui.h" + +class GuiScrollbar : public GuiElement, public sigslot::has_slots<> +{ + public: + GuiScrollbar(int height, u8 mode = LISTMODE); + ~GuiScrollbar(); + void SetDPadControl(bool a) { AllowDPad = a; } + void SetButtonScroll(u32 button) { ButtonScroll = button; } + void ScrollOneUp(); + void ScrollOneDown(); + int GetSelectedItem() { return SelItem; }; + int GetSelectedIndex() { return SelInd; }; + void SetScrollSpeed(u16 speed) { ScrollSpeed = speed; }; + void SetButtonScrollSpeed(u16 speed) { ButtonScrollSpeed = speed; }; + void Draw(); + void Update(GuiTrigger * t); + enum + { + ICONMODE = 0, + LISTMODE, + }; + //! Signals + sigslot::signal2 listChanged; + //! Slots + void SetPageSize(int size); + void SetRowSize(int size); + void SetSelectedItem(int pos); + void SetSelectedIndex(int pos); + void SetEntrieCount(int cnt); + protected: + void setScrollboxPosition(int SelItem, int SelInd); + void OnUpButtonHold(GuiButton *sender, int pointer, const POINT &p); + void OnDownButtonHold(GuiButton *sender, int pointer, const POINT &p); + void OnBoxButtonHold(GuiButton *sender, int pointer, const POINT &p); + void CheckDPadControls(GuiTrigger *t); + void ScrollByButton(GuiTrigger *t); + + u8 Mode; + u32 ScrollState; + u16 ScrollSpeed; + u16 ButtonScrollSpeed; + u32 ButtonScroll; + bool AllowDPad; + + int MinHeight; + int MaxHeight; + int SelItem; + int SelInd; + int RowSize; + int PageSize; + int EntrieCount; + int ButtonPositionX; + int pressedChan; + bool listchanged; + + GuiButton * arrowUpBtn; + GuiButton * arrowDownBtn; + GuiButton * scrollbarBoxBtn; + GuiImage * scrollbarTopImg; + GuiImage * scrollbarBottomImg; + GuiImage * scrollbarTileImg; + GuiImage * arrowDownImg; + GuiImage * arrowDownOverImg; + GuiImage * arrowUpImg; + GuiImage * arrowUpOverImg; + GuiImage * scrollbarBoxImg; + GuiImage * scrollbarBoxOverImg; + GuiImage * oneButtonScrollImg; + GuiImageData * scrollbarTop; + GuiImageData * scrollbarBottom; + GuiImageData * scrollbarTile; + GuiImageData * arrowDown; + GuiImageData * arrowDownOver; + GuiImageData * arrowUp; + GuiImageData * arrowUpOver; + GuiImageData * scrollbarBox; + GuiImageData * scrollbarBoxOver; + GuiImageData * oneButtonScrollImgData; + GuiTrigger * trigHeldA; +}; + +#endif diff --git a/source/libwiigui/gui_searchbar.cpp b/source/GUI/gui_searchbar.cpp similarity index 100% rename from source/libwiigui/gui_searchbar.cpp rename to source/GUI/gui_searchbar.cpp diff --git a/source/libwiigui/gui_searchbar.h b/source/GUI/gui_searchbar.h similarity index 100% rename from source/libwiigui/gui_searchbar.h rename to source/GUI/gui_searchbar.h diff --git a/source/libwiigui/gui_text.cpp b/source/GUI/gui_text.cpp similarity index 91% rename from source/libwiigui/gui_text.cpp rename to source/GUI/gui_text.cpp index 60e2a6d1..d0f4d3d0 100644 --- a/source/libwiigui/gui_text.cpp +++ b/source/GUI/gui_text.cpp @@ -185,7 +185,8 @@ void GuiText::SetText(const wchar_t * t) { LOCK( this ); - if (text) delete[] text; + if (text) + delete [] text; text = NULL; ClearDynamicText(); @@ -214,7 +215,8 @@ void GuiText::ClearDynamicText() { for (u32 i = 0; i < textDyn.size(); i++) { - if (textDyn[i]) delete[] textDyn[i]; + if (textDyn[i]) + delete [] textDyn[i]; } textDyn.clear(); } @@ -370,15 +372,13 @@ void GuiText::MakeDottedText() while (text[i]) { - currentWidth += (font ? font : fontSystem)->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0x0000); - if (currentWidth >= maxWidth) + currentWidth += (font ? font : fontSystem)->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0); + if (currentWidth >= maxWidth && i > 2) { - if (i > 3) - { - textDyn[pos][i - 3] = '.'; - textDyn[pos][i - 2] = '.'; - textDyn[pos][i - 1] = '.'; - } + textDyn[pos][i - 2] = '.'; + textDyn[pos][i - 1] = '.'; + textDyn[pos][i] = '.'; + i++; break; } @@ -399,11 +399,11 @@ void GuiText::ScrollText() textDyn[pos] = new wchar_t[maxWidth]; - while (text[i] && currentWidth < maxWidth-40) + while (text[i] && currentWidth < maxWidth) { textDyn[pos][i] = text[i]; - currentWidth += (font ? font : fontSystem)->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0x0000); + currentWidth += (font ? font : fontSystem)->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0); ++i; } @@ -423,10 +423,10 @@ void GuiText::ScrollText() return; } - int strlen = wcslen(text); + int stringlen = wcslen(text); ++textScrollPos; - if (textScrollPos > strlen) + if (textScrollPos > stringlen) { textScrollPos = 0; textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; @@ -435,27 +435,30 @@ void GuiText::ScrollText() int ch = textScrollPos; int pos = textDyn.size() - 1; - if (textDyn[pos]) delete[] textDyn[pos]; - - textDyn[pos] = new wchar_t[maxWidth]; + if (!textDyn[pos]) new wchar_t[maxWidth]; int i = 0, currentWidth = 0; - while (currentWidth < maxWidth-40) + while (currentWidth < maxWidth) { - if (ch > strlen - 1) + if (ch > stringlen - 1) { textDyn[pos][i++] = ' '; + currentWidth += (font ? font : fontSystem)->getCharWidth(L' ', currentSize, ch > 0 ? text[ch - 1] : 0); textDyn[pos][i++] = ' '; + currentWidth += (font ? font : fontSystem)->getCharWidth(L' ', currentSize, L' '); textDyn[pos][i++] = ' '; + currentWidth += (font ? font : fontSystem)->getCharWidth(L' ', currentSize, L' '); ch = 0; + + if(currentWidth >= maxWidth) + break; } textDyn[pos][i] = text[ch]; + currentWidth += (font ? font : fontSystem)->getCharWidth(text[ch], currentSize, ch > 0 ? text[ch - 1] : 0); ++ch; ++i; - - currentWidth += (font ? font : fontSystem)->getCharWidth(text[ch], currentSize, ch > 0 ? text[ch - 1] : 0x0000); } textDyn[pos][i] = 0; } diff --git a/source/libwiigui/gui_tooltip.cpp b/source/GUI/gui_tooltip.cpp similarity index 98% rename from source/libwiigui/gui_tooltip.cpp rename to source/GUI/gui_tooltip.cpp index 76729258..f9e86f4a 100644 --- a/source/libwiigui/gui_tooltip.cpp +++ b/source/GUI/gui_tooltip.cpp @@ -75,7 +75,7 @@ void GuiTooltip::SetText(const char * t) if (tile_cnt < 0) tile_cnt = 0; } tileImage->SetPosition(leftImage->GetWidth(), 0); - tileImage->SetTile(tile_cnt); + tileImage->SetTileHorizontal(tile_cnt); rightImage->SetPosition(leftImage->GetWidth() + tile_cnt * tileImage->GetWidth(), 0); width = leftImage->GetWidth() + tile_cnt * tileImage->GetWidth() + rightImage->GetWidth(); } diff --git a/source/libwiigui/gui_trigger.cpp b/source/GUI/gui_trigger.cpp similarity index 100% rename from source/libwiigui/gui_trigger.cpp rename to source/GUI/gui_trigger.cpp diff --git a/source/libwiigui/gui_window.cpp b/source/GUI/gui_window.cpp similarity index 100% rename from source/libwiigui/gui_window.cpp rename to source/GUI/gui_window.cpp diff --git a/source/libwiigui/sigslot.h b/source/GUI/sigslot.h similarity index 100% rename from source/libwiigui/sigslot.h rename to source/GUI/sigslot.h diff --git a/source/SoundOperations/gui_sound.cpp b/source/SoundOperations/gui_sound.cpp index a9b8aa8a..8140cd7f 100644 --- a/source/SoundOperations/gui_sound.cpp +++ b/source/SoundOperations/gui_sound.cpp @@ -24,7 +24,7 @@ * for WiiXplorer 2010 ***************************************************************************/ #include -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "utils/uncompress.h" #include "FileOperations/fileops.h" #include "SoundHandler.hpp" diff --git a/source/StartUpProcess.cpp b/source/StartUpProcess.cpp index 2aeb6364..111aaeeb 100644 --- a/source/StartUpProcess.cpp +++ b/source/StartUpProcess.cpp @@ -1,6 +1,6 @@ #include #include "StartUpProcess.h" -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "video.h" #include "audio.h" #include "input.h" @@ -15,6 +15,10 @@ #include "settings/CGameStatistics.h" #include "settings/CGameCategories.hpp" #include "usbloader/usbstorage2.h" +#include "usbloader/MountGamePartition.h" +#include "usbloader/GameBooter.hpp" +#include "usbloader/GameList.h" +#include "utils/tools.h" #include "sys.h" StartUpProcess::StartUpProcess() @@ -47,6 +51,35 @@ StartUpProcess::~StartUpProcess() delete messageTxt; } +int StartUpProcess::ParseArguments(int argc, char *argv[]) +{ + int quickBoot = -1; + + //! The arguments override + for(int i = 0; i < argc; ++i) + { + if(!argv[i]) continue; + + gprintf("Boot argument %i: %s\n", i+1, argv[i]); + + char *ptr = strcasestr(argv[i], "-ios="); + if(ptr) + Settings.cios = LIMIT(atoi(ptr+strlen("-ios=")), 200, 255); + + ptr = strcasestr(argv[i], "-usbport="); + if(ptr) + { + Settings.USBPort = LIMIT(atoi(ptr+strlen("-usbport=")), 0, 1); + DeviceHandler::SetUSBPort(Settings.USBPort, false); + } + + if(strlen(argv[i]) == 6 && strchr(argv[i], '=') == 0 && strchr(argv[i], '-') == 0) + quickBoot = i; + } + + return quickBoot; +} + void StartUpProcess::TextFade(int direction) { if(direction > 0) @@ -110,14 +143,21 @@ bool StartUpProcess::USBSpinUp() return started; } -bool StartUpProcess::Run() +int StartUpProcess::Run(int argc, char *argv[]) { + int quickGameBoot = ParseArguments(argc, argv); + StartUpProcess Process; - return Process.Execute(); + int ret = Process.Execute(); + + if(quickGameBoot != -1) + return QuickGameBoot(argv[quickGameBoot]); + + return ret; } -bool StartUpProcess::Execute() +int StartUpProcess::Execute() { SetTextf("Start up\n"); @@ -150,7 +190,7 @@ bool StartUpProcess::Execute() // Loading now the cios setup in the settings IosLoader::LoadAppCios(); - SetTextf("Loaded cIOS %i R%i\n", IOS_GetVersion(), IOS_GetRevision()); + SetTextf("Reloading into cIOS %i R%i\n", IOS_GetVersion(), IOS_GetRevision()); DeviceHandler::Instance()->MountSD(); USBSpinUp(); @@ -161,7 +201,7 @@ bool StartUpProcess::Execute() { Settings.USBPort = 0; } - else if(Settings.USBPort == 1) + else if(Settings.USBPort == 1 && USBStorage2_GetPort() != Settings.USBPort) { SetTextf("Changing USB Port to %i\n", Settings.USBPort); DeviceHandler::Instance()->UnMountAllUSB(); @@ -180,7 +220,7 @@ bool StartUpProcess::Execute() setlocale(LC_CTYPE, "C-UTF-8"); setlocale(LC_MESSAGES, "C-UTF-8"); - return true; + return 0; } void StartUpProcess::Draw() @@ -191,3 +231,23 @@ void StartUpProcess::Draw() messageTxt->Draw(); Menu_Render(); } + +int StartUpProcess::QuickGameBoot(const char * gameID) +{ + MountGamePartition(false); + + struct discHdr *header = NULL; + for(int i = 0; i < gameList.size(); ++i) + { + if(strncasecmp((char *) gameList[i]->id, gameID, 6) == 0) + header = gameList[i]; + } + + if(!header) + return -1; + + GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1); + GameStatistics.Save(); + + return GameBooter::BootGame(gameID); +} diff --git a/source/StartUpProcess.h b/source/StartUpProcess.h index d785ee66..cab04c2f 100644 --- a/source/StartUpProcess.h +++ b/source/StartUpProcess.h @@ -1,20 +1,22 @@ #ifndef STARTUPPROCESS_H_ #define STARTUPPROCESS_H_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" class StartUpProcess { public: - static bool Run(); + static int Run(int argc, char *argv[]); private: StartUpProcess(); ~StartUpProcess(); - bool Execute(); + int Execute(); bool USBSpinUp(); void TextFade(int direction); void SetTextf(const char * format, ...); void Draw(); + static int ParseArguments(int argc, char *argv[]); + static int QuickGameBoot(const char * gameID); GuiImageData * GXImageData; GuiImage * background; diff --git a/source/cheats/cheatmenu.cpp b/source/cheats/cheatmenu.cpp index 28e824e9..0f538401 100644 --- a/source/cheats/cheatmenu.cpp +++ b/source/cheats/cheatmenu.cpp @@ -1,9 +1,8 @@ #include #include -#include -#include "libwiigui/gui.h" -#include "libwiigui/gui_customoptionbrowser.h" +#include "GUI/gui.h" +#include "GUI/gui_optionbrowser.h" #include "prompts/PromptWindows.h" #include "language/gettext.h" #include "themes/CTheme.h" @@ -30,14 +29,14 @@ int CheatMenu(const char * gameID) GuiTrigger trigB; trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - GuiText backBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText backBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); backBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage backBtnImg(&btnOutline); GuiButton backBtn(&backBtnImg, &backBtnImg, 2, 3, -140, 400, &trigA, NULL, btnSoundClick2, 1); backBtn.SetLabel(&backBtnTxt); backBtn.SetTrigger(&trigB); - GuiText createBtnTxt(tr( "Create" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText createBtnTxt(tr( "Create" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); createBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage createBtnImg(&btnOutline); GuiButton createBtn(&createBtnImg, &createBtnImg, 2, 3, 160, 400, &trigA, NULL, btnSoundClick2, 1); @@ -67,7 +66,7 @@ int CheatMenu(const char * gameID) case 1: int cntcheats = c.getCnt(); OptionList cheatslst; - GuiCustomOptionBrowser chtBrowser(400, 280, &cheatslst, "bg_options_settings.png"); + GuiOptionBrowser chtBrowser(400, 280, &cheatslst, "bg_options_settings.png"); chtBrowser.SetPosition(0, 90); chtBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); chtBrowser.SetClickable(true); diff --git a/source/filelist.h b/source/filelist.h deleted file mode 100644 index f9e5563e..00000000 --- a/source/filelist.h +++ /dev/null @@ -1,574 +0,0 @@ -/**************************************************************************** - * libwiigui Template - * Tantric 2009 - * - * imagelist.h - * Contains a list of all of the files in the images, fonts, sounds folders - ***************************************************************************/ - -#ifndef _FILELIST_H_ -#define _FILELIST_H_ - -#include - -extern const u8 font_ttf[]; -extern const u32 font_ttf_size; - -extern const u8 clock_ttf[]; -extern const u32 clock_ttf_size; - -extern const u8 closebutton_png[]; -extern const u32 closebutton_png_size; - -extern const u8 gxlogo_png[]; -extern const u32 gxlogo_png_size; - -extern const u8 sdcard_png[]; -extern const u32 sdcard_png_size; - -extern const u8 sdcard_over_png[]; -extern const u32 sdcard_over_png_size; - -extern const u8 Wifi_btn_png[]; -extern const u32 Wifi_btn_png_size; - -extern const u8 Channel_btn_png[]; -extern const u32 Channel_btn_png_size; - -extern const u8 wiimote_png[]; -extern const u32 wiimote_png_size; - -extern const u8 bg_music_ogg[]; -extern const u32 bg_music_ogg_size; - -extern const u8 credits_music_ogg[]; -extern const u32 credits_music_ogg_size; - -extern const u8 gameinfo1_png[]; -extern const u32 gameinfo1_png_size; - -extern const u8 gameinfo2_png[]; -extern const u32 gameinfo2_png_size; - -extern const u8 gameinfo1a_png[]; -extern const u32 gameinfo1a_png_size; - -extern const u8 gameinfo2a_png[]; -extern const u32 gameinfo2a_png_size; - -extern const u8 menuin_ogg[]; -extern const u32 menuin_ogg_size; - -extern const u8 menuout_ogg[]; -extern const u32 menuout_ogg_size; - -extern const u8 success_ogg[]; -extern const u32 success_ogg_size; - -extern const u8 credits_button_png[]; -extern const u32 credits_button_png_size; - -extern const u8 credits_button_over_png[]; -extern const u32 credits_button_over_png_size; - -extern const u8 button_over_wav[]; -extern const u32 button_over_wav_size; - -extern const u8 button_click_wav[]; -extern const u32 button_click_wav_size; - -extern const u8 button_click2_wav[]; -extern const u32 button_click2_wav_size; - -extern const u8 tooltip_left_png[]; -extern const u32 tooltip_left_png_size; - -extern const u8 tooltip_tile_png[]; -extern const u32 tooltip_tile_png_size; - -extern const u8 tooltip_right_png[]; -extern const u32 tooltip_right_png_size; - -extern const u8 startgame_arrow_left_png[]; -extern const u32 startgame_arrow_left_png_size; - -extern const u8 startgame_arrow_right_png[]; -extern const u32 startgame_arrow_right_png_size; - -extern const u8 credits_bg_png[]; -extern const u32 credits_bg_png_size; - -extern const u8 little_star_png[]; -extern const u32 little_star_png_size; - -extern const u8 background_png[]; -extern const u32 background_png_size; - -extern const u8 wbackground_png[]; -extern const u32 wbackground_png_size; - -extern const u8 bg_options_settings_png[]; -extern const u32 bg_options_settings_png_size; - -extern const u8 settings_background_png[]; -extern const u32 settings_background_png_size; - -extern const u8 bg_browser_png[]; -extern const u32 bg_browser_png_size; - -extern const u8 icon_folder_png[]; -extern const u32 icon_folder_png_size; - -extern const u8 bg_browser_selection_png[]; -extern const u32 bg_browser_selection_png_size; - -extern const u8 addressbar_textbox_png[]; -extern const u32 addressbar_textbox_png_size; - -extern const u8 browser_png[]; -extern const u32 browser_png_size; - -extern const u8 browser_over_png[]; -extern const u32 browser_over_png_size; - -extern const u8 nocover_png[]; -extern const u32 nocover_png_size; - -extern const u8 nocoverFlat_png[]; -extern const u32 nocoverFlat_png_size; - -extern const u8 nodisc_png[]; -extern const u32 nodisc_png_size; - -extern const u8 theme_dialogue_box_png[]; -extern const u32 theme_dialogue_box_png_size; - -extern const u8 button_install_png[]; -extern const u32 button_install_png_size; - -extern const u8 button_install_over_png[]; -extern const u32 button_install_over_png_size; - -extern const u8 dialogue_box_startgame_png[]; -extern const u32 dialogue_box_startgame_png_size; - -extern const u8 wdialogue_box_startgame_png[]; -extern const u32 wdialogue_box_startgame_png_size; - -extern const u8 button_dialogue_box_png[]; -extern const u32 button_dialogue_box_png_size; - -extern const u8 keyboard_textbox_png[]; -extern const u32 keyboard_textbox_png_size; - -extern const u8 keyboard_key_png[]; -extern const u32 keyboard_key_png_size; - -extern const u8 keyboard_key_over_png[]; -extern const u32 keyboard_key_over_png_size; - -extern const u8 keyboard_mediumkey_over_png[]; -extern const u32 keyboard_mediumkey_over_png_size; - -extern const u8 keyboard_largekey_over_png[]; -extern const u32 keyboard_largekey_over_png_size; - -extern const u8 keyboard_backspace_over_png[]; -extern const u32 keyboard_backspace_over_png_size; - -extern const u8 keyboard_clear_over_png[]; -extern const u32 keyboard_clear_over_png_size; - -extern const u8 menu_button_png[]; -extern const u32 menu_button_png_size; - -extern const u8 menu_button_over_png[]; -extern const u32 menu_button_over_png_size; - -extern const u8 settings_button_png[]; -extern const u32 settings_button_png_size; - -extern const u8 settings_button_over_png[]; -extern const u32 settings_button_over_png_size; - -extern const u8 wiimote_poweroff_png[]; -extern const u32 wiimote_poweroff_png_size; - -extern const u8 dialogue_box_png[]; -extern const u32 dialogue_box_png_size; - -extern const u8 theme_box_png[]; -extern const u32 theme_box_png_size; - -extern const u8 wiimote_poweroff_over_png[]; -extern const u32 wiimote_poweroff_over_png_size; - -extern const u8 bg_options_png[]; -extern const u32 bg_options_png_size; - -extern const u8 bg_options_entry_png[]; -extern const u32 bg_options_entry_png_size; - -extern const u8 scrollbar_png[]; -extern const u32 scrollbar_png_size; - -extern const u8 scrollbar_arrowup_png[]; -extern const u32 scrollbar_arrowup_png_size; - -extern const u8 scrollbar_arrowdown_png[]; -extern const u32 scrollbar_arrowdown_png_size; - -extern const u8 scrollbar_box_png[]; -extern const u32 scrollbar_box_png_size; - -extern const u8 progressbar_png[]; -extern const u32 progressbar_png_size; - -extern const u8 progressbar_empty_png[]; -extern const u32 progressbar_empty_png_size; - -extern const u8 progressbar_outline_png[]; -extern const u32 progressbar_outline_png_size; - -extern const u8 player1_point_png[]; -extern const u32 player1_point_png_size; - -extern const u8 player2_point_png[]; -extern const u32 player2_point_png_size; - -extern const u8 player3_point_png[]; -extern const u32 player3_point_png_size; - -extern const u8 player4_point_png[]; -extern const u32 player4_point_png_size; - -extern const u8 player1_grab_png[]; -extern const u32 player1_grab_png_size; - -extern const u8 player2_grab_png[]; -extern const u32 player2_grab_png_size; - -extern const u8 player3_grab_png[]; -extern const u32 player3_grab_png_size; - -extern const u8 player4_grab_png[]; -extern const u32 player4_grab_png_size; - -extern const u8 rplayer1_point_png[]; -extern const u32 rplayer1_point_png_size; - -extern const u8 rplayer2_point_png[]; -extern const u32 rplayer2_point_png_size; - -extern const u8 rplayer3_point_png[]; -extern const u32 rplayer3_point_png_size; - -extern const u8 rplayer4_point_png[]; -extern const u32 rplayer4_point_png_size; - -extern const u8 battery_png[]; -extern const u32 battery_png_size; - -extern const u8 battery_bar_png[]; -extern const u32 battery_bar_png_size; - -extern const u8 battery_white_png[]; -extern const u32 battery_white_png_size; - -extern const u8 battery_bar_white_png[]; -extern const u32 battery_bar_white_png_size; - -extern const u8 battery_red_png[]; -extern const u32 battery_red_png_size; - -extern const u8 battery_bar_red_png[]; -extern const u32 battery_bar_red_png_size; - -extern const u8 exit_top_png[]; -extern const u32 exit_top_png_size; - -extern const u8 exit_top_over_png[]; -extern const u32 exit_top_over_png_size; - -extern const u8 exit_bottom_png[]; -extern const u32 exit_bottom_png_size; - -extern const u8 exit_bottom_over_png[]; -extern const u32 exit_bottom_over_png_size; - -extern const u8 exit_button_png[]; -extern const u32 exit_button_png_size; - -extern const u8 favorite_png[]; -extern const u32 favorite_png_size; - -extern const u8 not_favorite_png[]; -extern const u32 not_favorite_png_size; - -extern const u8 favIcon_png[]; -extern const u32 favIcon_png_size; - -extern const u8 favIcon_gray_png[]; -extern const u32 favIcon_gray_png_size; - -extern const u8 searchIcon_png[]; -extern const u32 searchIcon_png_size; - -extern const u8 searchIcon_gray_png[]; -extern const u32 searchIcon_gray_png_size; - -extern const u8 abcIcon_png[]; -extern const u32 abcIcon_png_size; - -extern const u8 abcIcon_gray_png[]; -extern const u32 abcIcon_gray_png_size; - -extern const u8 rankIcon_png[]; -extern const u32 rankIcon_png_size; - -extern const u8 rankIcon_gray_png[]; -extern const u32 rankIcon_gray_png_size; - -extern const u8 playCountIcon_png[]; -extern const u32 playCountIcon_png_size; - -extern const u8 playCountIcon_gray_png[]; -extern const u32 playCountIcon_gray_png_size; - -extern const u8 arrangeList_png[]; -extern const u32 arrangeList_png_size; - -extern const u8 arrangeList_gray_png[]; -extern const u32 arrangeList_gray_png_size; - -extern const u8 arrangeGrid_png[]; -extern const u32 arrangeGrid_png_size; - -extern const u8 arrangeGrid_gray_png[]; -extern const u32 arrangeGrid_gray_png_size; - -extern const u8 arrangeCarousel_png[]; -extern const u32 arrangeCarousel_png_size; - -extern const u8 arrangeCarousel_gray_png[]; -extern const u32 arrangeCarousel_gray_png_size; - -extern const u8 settings_title_png[]; -extern const u32 settings_title_png_size; - -extern const u8 settings_title_over_png[]; -extern const u32 settings_title_over_png_size; - -extern const u8 pageindicator_png[]; -extern const u32 pageindicator_png_size; - -extern const u8 Wiimote1_png[]; -extern const u32 Wiimote1_png_size; - -extern const u8 Wiimote2_png[]; -extern const u32 Wiimote2_png_size; - -extern const u8 Wiimote4_png[]; -extern const u32 Wiimote4_png_size; - -extern const u8 wifi1_png[]; -extern const u32 wifi1_png_size; - -extern const u8 wifi2_png[]; -extern const u32 wifi2_png_size; - -extern const u8 wifi3_png[]; -extern const u32 wifi3_png_size; - -extern const u8 wifi4_png[]; -extern const u32 wifi4_png_size; - -extern const u8 wifi8_png[]; -extern const u32 wifi8_png_size; - -extern const u8 wifi12_png[]; -extern const u32 wifi12_png_size; - -extern const u8 wifi16_png[]; -extern const u32 wifi16_png_size; - -extern const u8 wifi32_png[]; -extern const u32 wifi32_png_size; - -extern const u8 norating_png[]; -extern const u32 norating_png_size; - -extern const u8 guitar_png[]; -extern const u32 guitar_png_size; -extern const u8 guitarR_png[]; -extern const u32 guitarR_png_size; - -extern const u8 microphone_png[]; -extern const u32 microphone_png_size; -extern const u8 microphoneR_png[]; -extern const u32 microphoneR_png_size; - -extern const u8 gcncontroller_png[]; -extern const u32 gcncontroller_png_size; -extern const u8 gcncontrollerR_png[]; -extern const u32 gcncontrollerR_png_size; - -extern const u8 classiccontroller_png[]; -extern const u32 classiccontroller_png_size; -extern const u8 classiccontrollerR_png[]; -extern const u32 classiccontrollerR_png_size; - -extern const u8 nunchuk_png[]; -extern const u32 nunchuk_png_size; -extern const u8 nunchukR_png[]; -extern const u32 nunchukR_png_size; - -extern const u8 dancepad_png[]; -extern const u32 dancepad_png_size; -extern const u8 dancepadR_png[]; -extern const u32 dancepadR_png_size; - -extern const u8 balanceboard_png[]; -extern const u32 balanceboard_png_size; -extern const u8 balanceboardR_png[]; -extern const u32 balanceboardR_png_size; - -extern const u8 drums_png[]; -extern const u32 drums_png_size; -extern const u8 drumsR_png[]; -extern const u32 drumsR_png_size; - -extern const u8 motionplus_png[]; -extern const u32 motionplus_png_size; -extern const u8 motionplusR_png[]; -extern const u32 motionplusR_png_size; - -extern const u8 wheel_png[]; -extern const u32 wheel_png_size; -extern const u8 wheelR_png[]; -extern const u32 wheelR_png_size; - -extern const u8 zapper_png[]; -extern const u32 zapper_png_size; -extern const u8 zapperR_png[]; -extern const u32 zapperR_png_size; - -extern const u8 wiispeak_png[]; -extern const u32 wiispeak_png_size; -extern const u8 wiispeakR_png[]; -extern const u32 wiispeakR_png_size; - -extern const u8 nintendods_png[]; -extern const u32 nintendods_png_size; -extern const u8 nintendodsR_png[]; -extern const u32 nintendodsR_png_size; - -extern const u8 esrb_ec_png[]; -extern const u32 esrb_ec_png_size; - -extern const u8 esrb_e_png[]; -extern const u32 esrb_e_png_size; - -extern const u8 esrb_eten_png[]; -extern const u32 esrb_eten_png_size; - -extern const u8 esrb_t_png[]; -extern const u32 esrb_t_png_size; - -extern const u8 esrb_m_png[]; -extern const u32 esrb_m_png_size; - -extern const u8 esrb_ao_png[]; -extern const u32 esrb_ao_png_size; - -extern const u8 cero_a_png[]; -extern const u32 cero_a_png_size; - -extern const u8 cero_b_png[]; -extern const u32 cero_b_png_size; - -extern const u8 cero_c_png[]; -extern const u32 cero_c_png_size; - -extern const u8 cero_d_png[]; -extern const u32 cero_d_png_size; - -extern const u8 cero_z_png[]; -extern const u32 cero_z_png_size; - -extern const u8 pegi_3_png[]; -extern const u32 pegi_3_png_size; - -extern const u8 pegi_7_png[]; -extern const u32 pegi_7_png_size; - -extern const u8 pegi_12_png[]; -extern const u32 pegi_12_png_size; - -extern const u8 pegi_16_png[]; -extern const u32 pegi_16_png_size; - -extern const u8 pegi_18_png[]; -extern const u32 pegi_18_png_size; - -extern const u8 usbport_png[]; -extern const u32 usbport_png_size; - -extern const u8 dvd_png[]; -extern const u32 dvd_png_size; - -extern const u8 dvd_gray_png[]; -extern const u32 dvd_gray_png_size; - -extern const u8 new_png[]; -extern const u32 new_png_size; - -extern const u8 lock_png[]; -extern const u32 lock_png_size; - -extern const u8 lock_gray_png[]; -extern const u32 lock_gray_png_size; - -extern const u8 unlock_png[]; -extern const u32 unlock_png_size; - -extern const u8 unlock_gray_png[]; -extern const u32 unlock_gray_png_size; - -extern const u8 boxBorder_png[]; -extern const u32 boxBorder_png_size; - -extern const u8 nocoverFull_png[]; -extern const u32 nocoverFull_png_size; - -extern const u8 playersSort_png[]; -extern const u32 playersSort_png_size; - -extern const u8 add_png[]; -extern const u32 add_png_size; - -extern const u8 back_png[]; -extern const u32 back_png_size; - -extern const u8 forward_png[]; -extern const u32 forward_png_size; - -extern const u8 categoryPrompt_png[]; -extern const u32 categoryPrompt_png_size; - -extern const u8 categoryLine_png[]; -extern const u32 categoryLine_png_size; - -extern const u8 remove_png[]; -extern const u32 remove_png_size; - -extern const u8 category_png[]; -extern const u32 category_png_size; - -extern const u8 category_gray_png[]; -extern const u32 category_gray_png_size; - -extern const u8 stub_bin[]; -extern const u32 stub_bin_size; - -#endif diff --git a/source/homebrewboot/HomebrewBrowser.cpp b/source/homebrewboot/HomebrewBrowser.cpp index b783606f..4372ec28 100644 --- a/source/homebrewboot/HomebrewBrowser.cpp +++ b/source/homebrewboot/HomebrewBrowser.cpp @@ -24,12 +24,14 @@ #include "HomebrewBrowser.hpp" #include "themes/CTheme.h" #include "prompts/PromptWindows.h" +#include "prompts/HomebrewPrompt.hpp" #include "language/gettext.h" #include "network/networkops.h" #include "utils/minizip/miniunz.h" #include "usbloader/utils.h" #include "prompts/TitleBrowser.h" #include "homebrewboot/BootHomebrew.h" +#include "FileOperations/fileops.h" #include "prompts/ProgressWindow.h" #include "wstring.hpp" #include "HomebrewXML.h" @@ -48,7 +50,7 @@ HomebrewBrowser::HomebrewBrowser() ResumeNetworkWait(); wifiNotSet = true; - wifiImgData = Resources::GetImageData("Wifi_btn.png"); + wifiImgData = Resources::GetImageData("wifi_btn.png"); wifiToolTip = new GuiTooltip(" "); wifiImg = new GuiImage(wifiImgData); wifiBtn = new GuiButton(wifiImgData->GetWidth(), wifiImgData->GetHeight()); @@ -61,7 +63,7 @@ HomebrewBrowser::HomebrewBrowser() wifiBtn->SetTrigger(trigA); Append(wifiBtn); - channelImgData = Resources::GetImageData("Channel_btn.png"); + channelImgData = Resources::GetImageData("channel_btn.png"); channelBtnImg = new GuiImage(channelImgData); channelBtnImg->SetWidescreen(Settings.widescreen); channelBtn = new GuiButton(channelBtnImg->GetWidth(), channelBtnImg->GetHeight()); @@ -283,12 +285,39 @@ void HomebrewBrowser::MainButtonClicked(int button) wString HomebrewName(MainButtonTxt[button]->GetText()); - int choice = HBCWindowPrompt(HomebrewName.toUTF8().c_str(), MetaXML.GetCoder(), MetaXML.GetVersion(), + HomebrewPrompt *HBCWindowPrompt = new HomebrewPrompt(HomebrewName.toUTF8().c_str(), MetaXML.GetCoder(), MetaXML.GetVersion(), MetaXML.GetReleasedate(), MetaXML.GetLongDescription(), IconImgData[button % 4], filesize); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(HBCWindowPrompt); + + int choice = HBCWindowPrompt->MainLoop(); + + delete HBCWindowPrompt; + + mainWindow->SetState(STATE_DEFAULT); + if (choice == 1) { - BootHomebrew(HomebrewList->GetFilepath(button)); + u8 *buffer = NULL; + u64 filesize = 0; + LoadFileToMem(HomebrewList->GetFilepath(button), &buffer, &filesize); + if(!buffer) + { + WindowPrompt(tr("Error"), tr("Not enough memory."), tr("OK")); + return; + } + FreeHomebrewBuffer(); + CopyHomebrewMemory(buffer, 0, filesize); + + AddBootArgument(HomebrewList->GetFilepath(button)); + + for(u32 i = 0; i < MetaXML.GetArguments().size(); ++i) + { + AddBootArgument(MetaXML.GetArguments().at(i).c_str()); + } + + BootHomebrewFromMem(); } } diff --git a/source/homebrewboot/HomebrewXML.cpp b/source/homebrewboot/HomebrewXML.cpp index 34b19cc3..4bb54bf5 100644 --- a/source/homebrewboot/HomebrewXML.cpp +++ b/source/homebrewboot/HomebrewXML.cpp @@ -8,6 +8,7 @@ #include #include "FileOperations/fileops.h" #include "xml/xml.h" +#include "gecko.h" #include "HomebrewXML.h" @@ -75,6 +76,16 @@ int HomebrewXML::LoadHomebrewXMLData(const char* filename) Releasedate = Entrie; + node = mxmlFindElement(node, nodetree, "arguments", NULL, NULL, MXML_DESCEND_FIRST); + + while(node) + { + Entrie[0] = '\0'; + node = GetTextFromNode(node, nodetree, (char*) "arg", NULL, NULL, MXML_DESCEND, Entrie, ENTRIE_SIZE); + if(node) + Arguments.push_back(std::string(Entrie)); + } + delete[] Entrie; mxmlDelete(node); diff --git a/source/homebrewboot/HomebrewXML.h b/source/homebrewboot/HomebrewXML.h index 6032fd02..d3d2c6fa 100644 --- a/source/homebrewboot/HomebrewXML.h +++ b/source/homebrewboot/HomebrewXML.h @@ -6,6 +6,7 @@ #define ___HOMEBREWXML_H_ #include +#include class HomebrewXML { @@ -22,6 +23,7 @@ class HomebrewXML const char * GetReleasedate() const; const char * GetShortDescription() const; const char * GetLongDescription() const; + const std::vector & GetArguments() const { return Arguments; }; protected: std::string Name; @@ -30,6 +32,7 @@ class HomebrewXML std::string Releasedate; std::string ShortDescription; std::string LongDescription; + std::vector Arguments; }; #endif diff --git a/source/images/back.png b/source/images/back.png deleted file mode 100644 index 68ed8a13ebda3f72affbd4061d8225397865b3f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 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 diff --git a/source/images/categoryLine.png b/source/images/categoryLine.png deleted file mode 100644 index 768dedf9aaa233765c89c16703103be7e572f3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcmeAS@N?(olHy`uVBq!ia0vp^SAbZ7gAGV#-3=25QY`6?zK#qG8~bX02Tle_CVK?= zGB8xBGB7kWGcf%852Rl(Fq9fFFuY1&V6d9bz#yJKedSD`LCj8`E{-7;bCM$VmFXVd zWST88ZEbA!rmDkjman(x?cI?0`kJ;wO{Pfyqre{Fc*bW_H?KC!nZa?!`PG6NmO~7T zEa!Z@!`GMH-I{;@w)OY-f9pT~y81snKMttgri=4|`1-hi`zwEc`=7hJESCA1B6C0+ z6Nf^Z>gq7h+(9;qytlXI#qTLn zwRd1>T($DZYxDdj7$D)G?D}=_;UWOy}4zjq(XzlHyMi^&p%(+Uo4p=(w}5xsPTT!|1Tf^Z?oM!otZ`8 z@IU4D{`%kla!s6j9|iiTu|1vZA8+^n{?7XQY7GoY77V8X?DzGjtpNJzalhO82n&WtPq7S6T*eOHH`>z-ICD z|JUE#v5^fJ8`IWD3Rk^+HT8e}zkiYi?Z7a%xnl6*NyG)m>FIiLKlbIEl~Mk_eE}`1$+)d;9(De>!dhs?En7)UAIfziVdye?E545BVFp zR=aY(W>sEDWdx>wQ+VH)b*_!r h&Q~*+*P(%t!8_bW`m#CO8(_|3@O1TaS?83{1OWd|rYQgb diff --git a/source/images/categoryPrompt.png b/source/images/categoryPrompt.png deleted file mode 100644 index d999140dedeca4fbcfca4ca27ed4e0b6ba4916e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6411 zcmcIn2{@Gd_kU-G!4P8~`;^GOjU-t{j3r_$$xbRu31z1kWDQxem3;)M(Y^oY`QPXM?r)xF=AC)J^PcZHpL0H+bH1^7Bi&sHUIYLDyY%(6 zO#uKh0)9`Yhl8K+L7Oe`!r-N6KXaOP5;Is;cK%Ntkb=Qqa7J-^;vso$7x>bB+v zQi^3WGT;V~q!;XS5vtjftjQ)m(*OY?=tvL;3@vmT9IAuqkKix?!y)OE*Y@@7amqePq^iD|OFj6HZF zd6)Wz)E#2x+uN#jG3^J7@0z`Jn&JFbXSiFpEv71l5mTQn#X8JZqZ22WCOLLsY|xw; z0|Pkp-MPIiWA`Yr%Et<^ecChj85q%Ha5(?|xYWog#q85`UDV_%zEzf+OF61byg!kz%{#Rr7-rc7l*4;tgXAJsEAS6D#eq17d(%= zAHoIktk%0AE67*AR&Dn30*;-rXYMXsk*-7#x};Sf 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 Ylt0UV^HqosFiIFaUHx3vIVCg!0P3W%^#A|> diff --git a/source/images/scrollbar_arrowdown.png b/source/images/scrollbar_arrowdown.png deleted file mode 100644 index ebd748c66eaaa0d953feb52042bdc41b73250e5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcmV-J1ibr+P)CF&?XRL;~_MwwR;$yh{>C!tZ??x3uW0)c;b4dlb!kH5xo);mUV;i^owrM-I z!jO_ ziDaPdqU{PmMkE1hiZRDyl|s2-G+XO{{oy1g`J_P{{B5V%x}ldVCC~Gi;i_l!S#Ca?o{K0%)^MpB zj#dUSKnqbK4dOujNC;5ouZ9x{m+VM`7`R(o)pA{bd=0SQjQWJ3qwWak`*ZnKyKS*o zqnT8O$&&1VhyhIiN`w!cC&MKd+ii@SSOx=nf?Tvf-oh0$ERPk7we9^{{pvWdV*&fn z53>1H$F|wa*)y~Aa8?%14qU~}#>o&^WLCIn@u5u5@55cw;qG>^R&MC^uK@eqxX*Ap z?g1hmaGLi`YjN?V^jut#sft-dL_|D-SV(>(Tt61flcheM28DuN+S41?CV`y@IEY6k zzh;>|>)iRp^n6S}!{KLvgC~Xy>jCThdB0ZP-QB-3DeT0+KJ->Pzvi?%{oGP6lNC2& z04y?1e1|>sEI9k?UA?qZJrJgZ`q z0_bAwgNv*!pwFh}G%8cT+PClQJ}guYuZ;2r`(J^BctqY`vlS}8!SP1CS2=uqr?mg& zX~LfLc{yp_`uW~o3+>y`CSZRG|3?ZdtgylgE3B}>3hM=~e*xzqIM?Z=HV*&*002ov JPDHLkV1m3X8|nZ6 diff --git a/source/images/scrollbar_arrowup.png b/source/images/scrollbar_arrowup.png deleted file mode 100644 index 6cef2fa02aea06292b55a8056dfc669da94e86d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmV+c1pfPpP)3VnJRaZ1_9S&;r?Cf8huDPDN=OAIK|&ykgxG+Sg18hH2?>4qpT7LxQhu8eMd{pHV(6)<4m-l`VcZ(cGR$pljukkn@4R3(HH9l2pd6qq zQV;>VkVhF?Ud|QzmRrm0?Axb>=5xTlzgk(kdhvO)k&>`1AV}|hU>X7Y5wI<zfg00Z{j(pu@`=5tRqR6&K1umGF@PoT+Eh8=$l?ZDO9qHYWwZ@sYF zn%N%wG*g$cR{G@JR&`TTs89hZl?G)BrD-5d;(G!q77!=V5DX}wp&%e0p-e603YO!W z#$L;vCDVLX8=R@Ew9hwdn@dS93WAb6Qkw&8CIU_ZSOut@*LVcXqN{*pLlT4$jWd=n z>P2|ETHI^-fc|lzz;fzZJ-gCwHq0$eP&pkC0ZA()*jVAc2P`2y3^#mg+K5aBSg5E#O8)&k5shw6o{dj(`lEd9 z+veMzi+~_gFkvRcZbG+5T~EX70}Y|$uAKfIBQ!eXbH-OU zYW1{H_)xBxr{1mM&u?kD?6s#aY+p>m23qJ*%m}{ch`@DJ>ia4U0^AGikv+5>+i_jr zwQ=%1KU^~aN7aN-6h$PoR8sTM>Ve1Th)`}5AzUt$0Y)K2`nKoX`r*d+cCUYk4bwL> z0Ry&{&g)-P8qYjSJ=byvy&eOoZ&_C7q|@zo2g8x&{6@wWm27vRzoB6yYidWBgEG(x zq{(^}!8bA)O-<{WtddTpJSGH9rLr#L;_lHeM^3Nz8KD1|WqaxPzVF@s_4wwn)9E>u zEnD1&{(_F7J1DR}$HJ4ichXyis`$D_i7IR>@NS?+L6bD8h vCwoCQ;7`w>&1ccSDgT0RQcGWinxZ9DtHHhm z{2Oe3Z1!e%@5~$@X727PNV?f1#c&TCX5r2~^Sx)z`5wLtjWyO-V~xE`lhZbAZf)NL zu3Z9_-N#?w_0zCckx4m&W`sFmx*(o1%?fM66t4_grMNwJ?#wZowP=bI8 z1XT)!Ad1oWa-~cG4Fenp7Hf4CC@trb6fJYAYE8)PwffELmQhK2ZU|z6pP6Zs&fqyxr46y_d zum*w_zD}q6%v2;Ny z$rj~5LjotlclUOlEy`Ut?yUDRk!j7!MFFmZ*Vp~%!OpW6<<5DU+`j)aYq!>WnOPic zov_8HjVw1I-pqtojbP6ZCp+t*AK&ix9zNJ%b8CB{Dfrdhe(!k&E16PUG++f(lLKFT zw$XdL5MIxqZJ@9*V0{BlXTziPampRK)M&bR!!4EJ8qkSCM-{6QC!8pf!1yT_OB^CW zDT6TZ%7KHiUNGQk)1}7y=G!L=v&5ZGHhRyUGE@jEmzUv(XJm={_nvV5)_U)(=Nevu zz0t5l!x9ZkTyd6A{hzSJwCRA4ZufhS&cG61-tG7HD_F5g>oRC9q-JxfeE#W1@0~(; zD~FDS)_@wU=jqMz!paE0mOg{=fe`azy9=e&kD4y z&^1EG2yG)2G6z2CJX;IYc~7^Kr~QSAQ?XmSO)>uXeGk~Za{sM0)>vbWT`~I`=VuD4 ToT1tj00000NkvXXu0mjf+M2jr diff --git a/source/images/usbport.png b/source/images/usbport.png deleted file mode 100644 index 78de06a8752b0d1ded881ef4f4afe508b9286750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64867 zcmV)rK$*XZP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z008oiNklfAjYW_qS4=aFWVb3h;=1j2|Ug9*mQ z=HC0^eQiFk{l32T1%pAtAOy&=1VRafau{jyXmaZ5oMYv1;ttQcf9!KkovN$gNiz76yPF6rh14j}D+D`49H31HiwJMEvQ{Ta+6i| z@4W`Q%J+Nkg;mbg8GE<=Q&)_sU2$%^;{I0q?pkADRvBAe<+`Lj50ajHSZxewf5++h zyItj6cEvca97Ct)J9fqRue`pMb5MJ()#;fBEdQH`fFR4}pGteIM5OZ!lFoH2s44>5 zy?<3TAPL}#biZrb#}ZvW1_~HO6>UEcLC|IQDyuw?-siX4JHaaBV^%!RwYJsXH(6!w zcAuvR1_fPyz0u0=t$5G1=UF5@{{hUoz#vctyq*W;^qj!-Ohi^pe0q$Pt~hD$;OUAR zG^H}8is78L0oMhSH6HNU&7vNTKR(OikC~)c!0eVe>Fpw0^yCs~>Uq9Upw zy~foD*!0`oKlY5hD5yz)q@OED&ot^9I7K>!hqjTjZKKvUTq265wCW$|^>A<-{?oT&u1apVj`|yN}zm?`q@hu3|V>-q*^7 z(hBTE#N4ssV&23 z?@KS@NNT{ey|;?uwEtl>b-s*sUzYdjRzu<)ySO1g$e#TucCS>u?phDX909)hm%*`@Zs zl-KiO?_n)3Wwo$TS21wOix`8|&i_K!%u5)*=ix+YWw#tZXN5>@t`b- zk#wC`1Q9{n<|WZ(VPEP7sVb<7u81H+q#Lzil+;j38qjs!D>bNg=b|qC-s|D69Is@J zxwzW%Hmf{8yNV%Wg%{0gaDa%2ahxRZJj58Wsy2=yv5Cc6E1C|8^mu8isTDRs;K%FN zZ-^6{#3zoQ@Y=@>dqToaNIcbxJFQ%8bPeMqE8IlZz<^fsl2(QQ_7WbNT*9rFH6|V_ z9;UAGH(g_OHmig@<`U;xdC%q&o((TxL}ZnfeJw-060_kF=UHvinpMKP)sACc;JLEK zc)gS{xYQV$RYLhog^R3M=~tUCy3+F#a1_yYXdM=)D;4h*j`7xrA|A4QO5oNSjp*2`g5t?`I5pC;yANhwpa` zUdW)n(EhqgxV+jmNZatFuSL)P?a-|g(@E;!Aky=(q^?qGtWt}H0TmHc6ePv5ItHa} z>`Xh@F~&8T39NXf zLISeF@O40c0kl*sC6`~Z$L_guPcpt?-0^~pQ?FL_!iDqZ$dMy@_S9)JGdoSa-oPd) z)RfI+lEI;&c<1h2_QsoUVSN31=j4eKeqwE}9qGM>j%Vn&t4s)|XLVWa0ozr)pOyH+ zYOCVPLD5UBo?HUwTJ1rYON4{w5}24=0wd!^cqg((GT?jNpEa^1t0fQG0mG_Uv(>yt zd5L47tNdNo`22;&KrUf;WEDfCmzV=DbqtrzEz-VV#F~)M^=H)M8Bvd@G1pR7IAa6OQ9(KA+Y8fg#gZDN8ovtKw3t*JW{Tp85GX zS*$IXD2x@gOQ^H7QFeVngRN`Kfz^I@SA_Lz{Y*5y56b0=?%1_6x$&kO*>mMyuT&{} zj$snF_Opd%hM3zVaN-3uHZB%>Jxm@O#ElR7888jo9|g?a3OgIR<aMZXnHO$lT1doIi7xQ>V|!-299* zn@!ck_PiI;_SZUj!c~p5T_xn>5{rr`YT8F^&#k5Rtc`&=j_c^?$XIgg?YHXy z)~$E^z!z0j6m=ZOG1&|Qen6p6)UomPPOH&S8^_l5J+D|SQ79JGbsVFR#BqXEYdy!6 zTqY-onD!j*HLzW~T#o^IQ;7peSNm=2p@&Yf| zYGC6^?vh!BX0dYhzLW>~Qub$MSltF`EzWttU(j``yYevfBzl|Q@UTH>0*Q+ zn>7Oi19s!ajk0OWW*r_HGP!I{9oKOHO`-t?2M6uI&;SERhxNdL{c`%m38~epHja}v z>9g(erP!De#p+5UEtu5NN?8naEm;bz}No4L3`O{JK3>ghZ$SH&dKHS=~2>DoYAE)dC7Vr7$bnX21z=^(==k$Hui^# zAin20fuHH@>aNI0F2kVK!YNi-=+&&Vu8}Hc4ZaR*#LDslG=kN-W5WH|@Qu7u!KE%?nUDmW_e*9=!MQh#G}NmPjox&prIFvcF1C;w?pv ze9xm$D9}GJK;O`SDHSSOE|)Z4D2VU72u8xNWfrT88r#IoFDznAwKHsv5mDdwB$Lgi zMkA##X_CaL+aMyY>ryP27#SUvb>rg<4G)`AsVtuBiWrj`%M6;y<(zz}p#1~=S}YdT z^E^(UJZa|U<}?b!70*yq(@@`{>3NM~#B)7$T~8fj+I)Bsi?t#K-}7vtkW2dd2h8}o z^>+Qnanm<2p!s|OQ6UUNr`2j%MJ1cfN~uzjzDl1H1c8bXRBb1|Y})`eZOW-x_8zJl z5!9->=?-c;#GXpba-@_fx#ik=kmt$JQ0IR>J@{4V_eBQMf@O0 zJl|8-bIE42_Q;__W_o&>IF37XgAP+GeYPUFu17AHp-?DLsq|@~SkfQ}@I4>b^ThLA zviZFBRmxJXl(nyKz?92n@q+-*_i>Dah>A+;|Cp2y(GG!CtS%#tE{(5tiL8jwNffBH z%jch@7u&)7L{i+zH0v$LTJ6pF8o@B)`G3MCt4tYgel%wz=L3pAV0 zOQ}@ExSmEyB+W*~X*F6li4w;+j%KqN#zx0oq-0Igi$SfdrQ#CgLwOPI_shA-{{qMO``=$K+G*7= zSe9PG7dqY&p=T+~>!CF-O-ETWdGZ52h8K^fIF6%z1O0mWo;`N&)z_M_u`wwWa^g5H zh-rHS7Ocf>IoKqTY$mIoaYe1D6^jb$8b>lgM#{wkmHvJLFA!^>)oKv7S|)16Y8*qp zP}H&Y8_dAa5ZQbV$1zI)`qH?k{3=vY!F60y85p2gD(T?hAVWh#JiqUGP8>hR?Ch+@ zNeos+#1Y?f$z^ktDBdnG7biNGqfJt~b^O-rMd-hXmfX z<}01=i{X*ga6j#tWsX3iY2Aycibav?!lIp-nRYIbNC`V0)LKQhD@l>=McES(Wao{7 zpFy8{0Fvm^)5P(R?N@{2qX!;_Bz}2Jn4d+)wt_KGokJ&2@q@j+B&Sol#T9E>rq06F zGe?&hK+zsxbs6eVvweRBC6rE-}{UzuzshjBe(jfh(@aTJ0Ya@nj54GvN) z7RB?t)b(29@oF1{PC1`~>w9K&Y+UoXysjG?=h0~nGCey(tJzf4is$(hi$yJ$ zEA$WaOQlkwR4$Rt=kWs{ahx`?u1gb!9w1%lK?{Von!+*&VU6Tkj!DFh}>|wI}jb)k{}wF6}KDKcnLtHtLmo_p)WnRwZDN$H zbTknhjH9@&tB&KKk|NR~2G?=Oq}6}z{~5)h0h?RVyD5ImJ z4D}CcUtfiMK2Hz?IIb&3M7z1a6b#a3#mLK8p!#ybEvd1QE_KUkpD+O=3R`yS!h|-P z4Ug63mpWW1aaW}9?J7umZ_VA(ZHcJ4^F2n!wt-D>-uSb`fASkpUs!#T7zgL|AAr75 zP>Z?ahe`h8KY~rZ|JfXc$kwYNY{1-w9~3imQD}V0_w0pU!gjpS2AY<`Q7a5n2Us^E z>GGB?+O#E&(wW@5=)H(@zf=pH`YPRej?~C@1J3Ruyov;f^!&MNsM-LNt~qv&+Maq-l|t$eXaEM_n9<1wKmD!7=vqEjN>3Cy!4CPWu`uqB&($}ZCTo%W1F=FT}INfpT$i{RWYlUNV2rcX^yd18*bg89XVVNcQ z6#=#N#TpamFG!rkmrCj+w27K)RYW^$WY{_!T8AK)G8JqBr9sSP*I}Q!d-dzC3_)dh z>F|9c5M-fI{r=u^RmAn7u>fA?uIrVHIMu60 zx(Z^94h{|38*aMEUUTiWrmwHhNIPM#u0JQkHBkkMFiKVxE98n3T?d>$y0N(}uNQ+@sWxLfqpHPN{o%I(`ML` zB#ChyS2J0kOeWjT%5^4E*VkPBD!09+=c>Z*9JM4?`RR?q?fvroue&N8pR8wzYZtXx zmBs3!&Q}*wfvh&Ozb6?N_xz5_>e@*wwRJk5dEM`du*_ctWao{rih)v9%=T-+&!%1u zunP0}d*3|&e+`)A(k4lJ*D}?fIGs)@y?oz>KvuDB-Ry=4MjSlfC6~=;CdguKLaouH zRkI}`cBN&bF8)rTJ{R1-xXu zN%PjKRhtg22#x^}v&wi#53-bA!odRv+%GnZm zd5zN#guf)ZlHJs04=j(u^u;bxYXhyTkbnThh%rWkOhzkxMeXbFrtwtQjbmf&)x>A^8425FB?!E51@KkeHF^(3hOs)U}SWZa-~mm**4zex)_Xhac7aP96~p+ zl}={<#Xjm@&Tcn!m((>;j3XFzJI}iPzs~fMc0I}xde@nW7tWuT|MVaJ0}VHedEEjx z+;R(V9eH`)%XZ2|FA7yrnAEDrr0E*<4Cx!qlIEYw{G34H{W=R*|u$~WHMQ!FUHDtAd@z*Y#c)_ zmuKC&aWO`;S+7a1kf(oekW#TkHk-wDU2&ux)}^(tDZIrJ(TOhVw&Xp%sL^ao+I53n z(VnD7#~IgU@P6<6DN6uds-50>W38ptY@$hx%};!eU-{9SU)KC{7fDQu^;A1D#vc z(78#NIEn1I{)KOJbPKZi$`q>#o9MBp(W6iE;)&CVJqJWf==W!1a;K zu0=NN0%JsH&!f*jgf2{9at8PQ|3%-}aRajLY9wEVRvo=?0^R=*EY2()Vqjd&<+m8b zpeLSFJ@H%@NRhFv$oA_+lURA?+vvi~#g|bUKrXuu$yY>=Kcjl``HO+&fiX2ZZxX2t zV{9zJ^l{e7f^OWriII^}f=pIw)tV-;Wp-wUdL#8n5-Xh=Pw8T+!<$5Q-l%G==)U{W zne$8cJAN6m?P`c)?9+Ecb?%}k5|kSurc3=a~o|n^Vp<)5vRA0j?|w8E08WEu|Frz77lzN-m$}cwIRb z2OJfLI|IS@y>{r_o=_qjtf@XduTo2(=qcBhM7QL$2WL#j_Qja`2WH`1QyK8#&VjDz zr&@&XOer&wn(>V2&3(E|#ynQ|?yRzJF};q01KaY*E&YNoFt%mNZ%J@vjkmA;T1>RynMLJv6JrG3p2O_PN?a_K zWPE%h^E316xaZ>e`8lW2Xjq$A?eV+}V0$sB-uUlQqGKxpKL?#Yi_T4Au6`A=c@KC& z>Ma2TIpnfyQ}p-9lW5$+ah$cEh@Zv0_WhVEUy&ZiIO#Rt{8sePW7x0%89IAmZR6wy zOSbcMAHeLnJzX*G{v@bf%E7B38+RkG{t0A!dwL!b#3pdd+p!OSQT4$uw9%m@2w(}R zU6Cwn|7vc37v`1k0oMb^gCs(tP;54@de5iZJOG4jUgWO#K^%gg6;AG3O6repMeg|F zl+|`}pRzc!+$Y+04d#tME0hL07@X+I=e0LuYF_ysk!xQoWD8&%tSXC1B4=8YdS!N6 zH&(KUakaXzNEF6QPEInvxIh?&*f3gVd=)_|!^kUtRKzAE7mh)%fg0O}dF79SP11#= z*FcF9?7b7`mG74M;*iW6mkR<1lZ3|_*1VyJzF{Es*%GT=T+a^1A?WR;IrJ7DX&*fiSY5$ zRvw&HtT-taWi5YuK9QR$!h6??R$N)CV0sbD?LE`VzAB7mggXc5s_Pg*zB27_widCw zh}_&~x~_kiSbp!6Cr{0UDL!jlh(o?T6|p(*vMH0E_0CtliowgT<3HE8peLvKwJl0t zdAZd&7aIQS;fQms_E-U5nTXj@P=0QsVK`XTh0@QRQ~BDYQnQ^gR{7dQBHMCq@WcIs z;m(~q$z`*gJ9{QMbLLEZ=JXj^n48mPt4Z6NQhF3Md&jC*8ip-0nqWy_Vw&<1EVu=^fJjn!I#j^pCIyj zAyOKE@-XIA?-MOlu;2KY_HfKZWLYiJa(Xm$CpWBB zBuP>O7Kfn8lIvIYl0i3ldm?9))#xl`7!VORgs-Hrhl(5 zpbImI7eHl%3z=d0y!6Y@=UTeSw|L@cwOW-@rKGvZ9JR$ojiP9Y+nItGqSmI8CkA(M(8}VH@xc>lO z|LRvcd)aGX<2870tKIiRc=X}#^58=c%ha{+hVnT1jIwLpE{2DPWn$tS3yX`0st)uG zFt&a@gF^%2y56!-^%LhEzIr}N7m&DtPER7nLHfry)q>wWmhh`vQx9PYiBs;`f09q= zPO-$`c~m4KaGf^sT6MD8l0Td(aA-D6kG(L1HWqR6MUvtW56m{143S^IOvuO!CuYC( z^{?~%zI~kC`FhxJ6@e3XsX|}=;@`^QW5=1l_D7*Ggm0FfN2Af;FCIA{PYv7*5}~IK zpbJwBZ{2|@52J0l?^dhDH^25Z4n+aFV=$HRT;XM&oS5Omi=&(iEjR|9K8JBVv@*oO zYQ&$PR(^Sl5SZm~z+X=~^11U-+fk{b(`PWQ4}BvXX{vnqeAfTK$U1Y`&RjS&GQ#lK zn3T%p`1sMI=EC_4G#U+2O=W9bR9=b4%_Kk}BzW)Q_5Iy`j`lUb852!bT@EqH(mJ44ksIGERFYgSr>^Hh)1+h3Hj61WDm5^y=(_|!ra%XA z(N5*E7=l7sqg&o3;`-34694t@qX!=aRlF@%;JxFQi3;a58OzGyjr^0CKw`k7~OFMAVG96?sPk)-m`YUj@zoDnoR=Pd*$Rm9CsSAX+ z{xAT^*ZvIq=vQ!pEbbeB27BczcxIu+WAkupU%FouMf}O%-pvEs-T;0EJ@yRAS3jDL zvExy==9TEHeu4!rD}Oc-xW70)pz8`*DHifJ@I7Nhl2#aLc>Wx5oDw9>D&TiFjOAhp zkJSlV#z}FaqtB$}ESs)?YymO_%;qa0Nz$+^3e)edav1djxj*A|Ag!nK2pOg`9 zlk{bLF27AyTBqgt3h9c;YZ9lK%4`wm_IIUNk{F01WPTFY zaqwJUMP#)!{1Q6fJ4PL%vj|pIWOQr#_u4Fa@28c;SxDl}6^gm-htecObr$D=&ugyI zufgCLcmd5vzKVC?0q_EjHiQ}LlF4N$m&*(c^lPb7A;@HL#B{){p0LqeG8xeM>3gp2 z>#HQg!$V1H*R3M`qX2Ap;;*@(lrTEj4@pFH_(_s4{5}##AchC#O&c*-JN$Rkdb#dP z27>E2lFeo5>+fe|bd=H2b(H%m1cBd?98m=Q%wPT`Uz_#7&)_tx?0DicT(`cT!M+L_ zwWvSxHTd>lAdbsa2nXuvIi7jyDZYL0eaOgW5FuZi=Bntd7Tq+~YBrnld%ySla-p;V z6oT2a?1(1Va`jDQ2FHk7O%}iWX9VXCf#>nSjHO{;1arpo)Co;?G~;^5?(E^&18#Y9PE8dN{=`C>Xi0HHTk$L_;Effoy@qJF8IkQ|e+sIO`V>RYLTcy7f z29v~Ss|iWiBlRy>H^2<8PYt5$;lJr;#LHyViDHsw3sk9lK13~=3RM*u_FW3ak`51# zFg!A;Q43}-+ZZ~AN>HYWI>&p0LAcjG=#lQXW zcW5c=Q>#|xGoShtU;g43X&rbR@8t8a{c29smtyD_k^Z>oIXI59biJ|!^?`Ey*fIH= zFMb*M@qY)_vMU?$Z-4cl128u`%b$PrqdfG$1Job=2Hp*ChSDI%n}+L(2?q}xNauv( zLKJe%&TZVbVRM&~@a=DYll`YBakE8;L!{VG>op%hMewF)h?^}`E%i(u;+QJXN+4ri z{si@j8Iq>}R)E@l??zL|K&u1=DjAPXId?^%*rhi}{DHkj18n;Un@07H}T-+lI)~?Hw zRo~RphhXwFI1aM=<`ghTQXJ&$k&9Q|j^R;Ffixk-UD~+N(pTGts=kn7HX^9wtueqo za7@13t%~iOPE`>i9H^LoE7bX%vT%;r4x1hC!7b1=y5LiJRGMR@RM=%kJH~ zxopP{9UL6ez|W-W{~f%k$8Z$#c^w%YwSxnL+Izj?INWyYO)@w#<}55M2*v?x$%`eI zNvS3ILV@>x-~(KJ?X~H`RbK>zR(tk|k>#Q7vQum4A+9i3OJ+@2Vdzx2_uJngisLj) zO=8N$Vt3C;^Jb@xGUJWUC*mxt>xZ(?r8(jsex>& z;Z##N(-fMe&bV(*7frR?+$WU1mqt}t-CFBK3tFkvb_Slk7y0@}k?JfqiCA><9FBAR z{^5w{YcFgWCoWuA&M#^I+;ioXtQ#LsaY$W0&Ik7IZzq}z#3AKMrF*<}=v#?>gPtE zv*(Uf-N44!C%*}^=THdme4pkbD`l^G1@VzjHB0we6Y|JdT>ZuyIce;A2lb zm%h~3ycW6c^~mY{!t)QcLou70u&L8vWAHNAhrfV*=3d0}yT(Cnf}hLNm-B2ib5tAI zK;kG$vkRSK_nstyn6wPcsug?aG3Ih;yN0V4c;&{0i<2ZZId}FfU;FC$lwKkRV+@-&Y>@}|J(Z60^cgUQGfg;HLoP3L-Yd)X zH{QsT$Il|0uYe?Gz!TyyA`07z7;*Zu9$A{!kTpwqC)pyXvaGbN-43c1nhXr3-7W zgr3}o{o0?kGhS^{RUBhnkDvV6pW_u{qc6=ZYAb})V@qhkH$Bx8nS7etY+uzY@4Abp zo_vz0o_K=RxBdbi{99ybBkr!7kiB=InLJ;bgk5qcU(#a}h(e_y7^UI;?cIbch z%o(W7!@?BwkMiVfleY~U@=iN3JvL_cTy>Q`G#Luzp>&MfWLO+D)!`C}lGr3R>C{!) zPBHMxt|Bb=oHS|k*An6-y?<2bF{buaiJ7j!(o%Z$jYd)9PAn?`mT|CcK-}lw`Gx(l|9|YFz z8&cChiiAz{%psCTzC`l$-QZ`i81e%nGB7ZRF$SHTfMyMh!H(?^KU>82Gl=72F26Z7 z{9y~Pxv0Ju;Ch~}^eO|_BO7EipGw3ks%b5xDijAWo3A84eUiR~GgRhJ6F7po^GA6) zzlG171FOrAm&s%qA0L;SZ@I<1`R#9Y-u>S9^6J;U7Gn%dolff}#ZcX}S8llVHg;We zy^t*;yKikjUm@@V@%_};>;8wKu}Cb2KRIDJUX6+4kY=M!RbAY-{6d;FO=7N;Stie) zXJKxx?TwxUW0(rzzS%ZDOJqFEe_zk>1W$zQ}#vK4##m2W1zl>J$nRxJaR)|mUj074 z9rbhf^oz4gU07rC6o@d{QtqEydRAu7?MVM9Br%)3^xewk^Zd(S|8-vbo*!r3=51s& zMo;b|{`#L`4}KSd4Aq2{{cKio+Fm+W*>TgFTz%?pFb?Nh@R5_sLcGKhu%#i)E8o4c zG@)JiDYRNmQ?1pAqo}Ls>h|DI9W}dNT^6^;QW;&72W^pdFE2gzbV}3;I=KsWb=dVJs zAM?ha7yB3gLD5992w?;J^tW+d|5Hf+81DQ3J*C+bRD4&b{Ib;gHxb(yCtl>*ZKEs{ zg_-FYot>Sbwpb;OBCNK1SI4SR5)sBB(G|B7?|CJ`;qPiZaY~v|g1P(_h+5 z`r`RMI(-H`_6)M;cH;6N@?*a#oZ6358B0B&IK;bfL<=^wlFLc6(Uf|xH)(_*mn9Pf zl=>^uTxVX3r7zjUl(bgUnSovn8u6Mwa8If@Dja3tQY3^rn@2=z}1h@2l_o zQY@7uiX&Xtr8Pf^9(x+O`c)jL#qtNA z?Q5B=E%5(6D(v!O48rsMHy}X;q80-*8J;}Cl#OZDYpKC_?g7kAZ$(|7Pn-+7MiDwt<{QCpSuAEcM(d>bRVZ zTU=RuaW8xjqy!^-=yA;L??Mqiei{xeDkt~84QFUO*o2&;+}yW(zw)czL+-Lyv2p$+ z2OqwlIcrkFa@b;BQ97CAmk0Q2A7^}gJiXp$?!n!A7k2AaJT_P7WL?=)5^4$Z%-(k) zK`~91Eg2SrVv{&#VPTPlxj9MVIBDCXF3q6Z2D-vyL6 zh%6btB)T}$h4s3>ZZ5A<}1W`^^e21{)ehjthLw&K99*3kz3x1_Kh%K z8DYLt%^Jt_5%MGDIR;A`r8zQ0qgs>2g$28?ut?YnHEuSkH|jL%4Vjytqt$BB%y>Gp z%joZw=ybno4C9d&`#pjr-P7sF?L@~w~ z?71WG)sJA__Af}hB9F|6Ft9UyA#B1M`&w+sUKED3OZb<+e7D|q8(;du7YG|w9y?EgRA+pOojn}^64eWpZdE%o_lmF^R;I8)( z=li&jEpR~<0!evaamY`u7sfL$?!Di*X;XS%$DhGG`W5u1w-VWe2No09d_C9%HwpP? z|{uec&TZrDWs_CvTo@qZEztY!{%)EV?UpM++u zTh}M0L5#KNg=6U9CsU?%kCK{BpG6NnmWC6J#gzPa_AvI*ucD8A4JlM$_5vJw6c(n_ zb2=W9D`6I<)IEO`d+I=%^*VDHqluc@JW}k#JN`5dsI`e`5@QcPj+{P-HtXrR<|fgT z``CEwKHj@M&uGrU^E}C9vXU{RbSimMBhy z#v)o@L>H#Xoqe9Sjl0~CZ*+&WT&b|{>8FVn=g|ERA+`B5M5@lgxx-v`?ooZ$xRY$^ z%TumYDCCP$uh(Vb!g-N_b(D%lO0{#kA(~-mc!YK1jthUz~+qQiN_w}=+UG2V_Ud<+a@kA zDBJV&0>CUREO7MjVVb87!huK9IoqhF2JhSviU;oJ=eBy>w&BHJ^Wg9>2lwx1dTI)L z=&^MCS`BD5VDdEXkw^LGm-lhg$dZ-5_dDO=_kZVin7A-OGmKIPp}qh!XBnJ6%FkXo z%soi$?x&?x^{1z&3qP>mq=>wJj&fdD^YG0-+XXc}$4!%y0wdWJMdI*S zou-b-??iOoPjjUY!*ry80Us)1GUxQmmXb0arq{k;&Sw4aCd9u;T*aZFXP_+8y_zNF zSO;V(uvBx(-a8ZbTG)$aOT-3+x825X1wAT_60^*ZV%8C3Ir_z%R{gNmL@C2JtM3e$ zYU!X;#pV#^&uFN0GGInQ{=O}vfdj!cBd(l3E}91!QY$$3uQPc~J_k_lW>%;gIwXhC z+u9VUE?PqJq|wMyJ0DN>vn>`+tQ=!5I_}@`(~P`!o&OqzSmk;qDFguU-cmRx!8Uk4x%C2YzlL(>FL`1jfz@0Ll!T3 z74dQieu>l&TrR$ILJAcUeGEi%d}cDN@$PS9!AWE^whub@`d&VF%zgHJhUL2l4N!9P zcUX4%)USVSJ0|G=i4JrjB3vQ9l?~gB+{6-aM@MEL7jPfrLXnlHPj8~xs+z2b3HQwO zvZVaVDe}&1v^jn5@3Cyy?3)XI-Gpy`T+r(*w%%z)6Ye8>-y*AZ2JwK_x?a|Zk*=?Q z$n*(mzs=U4sBf_2(clPTE9Y1>9{d>!h1Tmb7g2S;;*os}Tz#HG zb6~I3Z8stFy6Ao&GI}o~6?I?hQ_W7WO;T>vUt4U)V+-Gn70$U6uxq7G=E7QRV4Ts4 z(o|^uV5|LD49}ZHt%jkqkX2bAld0wpiU(z}K*eP-Z!ux|+4HNQ38TBN=AaPrWYs}@ zX6)-ZI~2?;l_B%KTSQy4XhhGBVra8(ei^1@B0D8=9P+S5t9y;#{scC*VHOkRfZOM_ z><9nf{idNEfgi?kqP?#koHDX9DB{e3$+YRH#csLQepNF3Z<)T+t)bLnC3Lws*L3^E zi(?r%tHHr+a=rZTSA07B$z~0wWe-Ck;&nc~UF78BOJ7)7){tk2G~1@9L>5n??jCT`{gO=` z@fpA<5=ZxK=7|(g&$?cR-=lkOba+Hw8+ZKhAR}hVA{iXRG^aW4pp99MS$*Txvz(Ka z*0lG@_sams4Ue;}M0m1Iz%cW@9JWJw^U{GpaqziC>*Ze7a=jO4yztfMVrB3^gyZr=&YI`-xDc?x&ld8}7ORO+G$l?Z z%m<8Lk!NH`~hdg%ldKSdJT?HMPA@HbQT{oYcswa zZ#17IlJI@SmISTUM`rzKPYLYqj_wG!u58@)CI$9t#@+&wP+p+3Jzl>Ei|#mo z6#3z^FIcKs4mxGm|Ig>{Oc5ckBfilTq4RjY+VUPp8#n}NxzMOnoW}LB#euUO^UJugJCQ>b8p))Y9;Sah!PSz2*$rp z`MreegHuEWg~)Z(0=npz+^>g7$I2?T^K7ilby5v5+^A`8OaJ8L%mh#W&H0+gHf1H?pv4Jo{nUnsI)S7=B$BFv&JTk+} z26&MCXp=_)s0-1jDh-duUb*Y)3S@H+iK|j=)zBh=h4LLm1e^9>B6l2bw+0GSF;TYL z?#MC4MHYPjIN8gGdfP8~bSq#|E?GBCZrdQU{pa5=cIHCaq!4dN7*yb-=?YOU1#wnA z`DOQdR*1)+Q)$U~FzpRVz$Y+NHwVjVa=YW47f@%n$Fj{fXWtXMP2(2ZA5l&K##zI} z$ssQMydw*q)HlMCNtb(YT8Cm0P1AFDyN*xHvXU+2J}MNL|v1# z?cIOR(yCdoE*J@_JuN--!y%Snj1TdGEa14&d}Cmhjkg0q7iFEFc32M{>iOQW51sV8 ztMh*7`ViYAgCRiv7&GczbCn|M^QiKl)VJ7gbM68@g(Om%Y2{xa3<#r9V(6++89fH} za$96sY`Hp|e8Td(@5Ojjf;%l$z}De7j9JeWpvgvFVIDeIe@i%3s4^v$%;ys{{B?>j z{p@S>st`t=oI(y}f7B-xP2MUbC|*yvIp1+A)+fc#%<}e=lBl511!~D28?9!gBGPT^ z4VU7a9DZ1RrXp^+rVV#iOnhwecr#a~BJD&j4JwpNHGw*$5;xX1MXFt?K-J3MKezvp z9}XUFsb(Ls<8}PURfe)(l)15R+r2a9;MNq%ImP|deq<2b#5ym4hzGqW+ramd^dB6Y4m_E3?w3N)cj|639J$9HXf2hdWzfM3#b#RBXP?4 zs)CQ3w>?SY*eT!djU0(>%DoYTt-#)6az~GNlV{_Sqr2D_>p4DFvBP+wSXlp z<$Uue-CIH@Vs;LpC?~*Q2_MqDtP@AJqzut2FsugD1RF?XNu=gBP!=($DPY9K$0jFx zUxd2-z+y(vAGY%pzqB3VbziHWPYgWJ-6aRyL{onb+)o;{m_>ywnCinfD(Y)M?5;o> zCbk`NOi^i8nf{JzpJSlg`*OkxcL9V0vJy?e7n$Gng53K;wN1KH!WpX9gf97VZ-ya5 ze&Q!gjZmPrpVq*4*+O1ZtUPf9R1O{eY&=c3??;KoHoS_)pHSylRXuft4GC)^ziIYG zw8VweXC|Q2Aw;EU3M|Sn&itUqjYh5}n*JYhbAy&dKQ=y5VixDJ_2NaS`y-qfFS7ss ziFsR~D)ou6#cf}yb-%0}U$1c;;iJ)ktDQsfh-Qj=kq6aH-J&)yu$V? zeNj=-W*%!7)JPde`4!pn2%Bc|Ffl^5_eRO?6jihz?FEmEhjJ>4@@W1@4I1>`{@Mi! zHBB^nNio{G_kV8u-)D3fy77~)Bl4!$me3;dq1ou^li)8mRZX4jEa==NmV&ZkIYjI0 ziQF@^DoAjd^sl~_`IP`ONq<9V8ay0)?6FUSR`tmC_QzXYgM6*@s9FSoL;OZ7|K9aq zR)f6-bZ;D(=%9tvY`3pJsZk4c%WVp#$)hMM+-Cyt8V%irm3cvH=G84vwmc5&JFppJ zXgf(XUkg?K%v-bZ`=ok9q7+S&N+b)`yUJ)##VZsYNtB5fr#q%q0j%y(KbJl(Jtw=U z;cwU44)yiyEI{>%?ju>^54b+U?5IvRV0_E|1!vbCyYWX*l28i*{5y(hjF!g6`hozp}EZ#@@}8& zPu|F^*Laon{wdc4PqcA`E65?RV)=_2FuGi43poYpR@$!6 zLtyH?*?z2P;=0#So^T42{+hM#Ee0B#EY^M3-lEDN#_MR8;jyvooQxKL#GEbBed$`1 z+xQvxW36jplqK1@&{U0`s}CQrzgn2P<}~!E5XBbpWGUJ#9G4g@@5#(v6B8KlI#f4r zc{hMI&Yl9_VNR8i5{4~?v9G^OOgfpq*AWXlXD^A(IK)zCntFI`q?A{+N7=WsY6B*L zm;W$&Z!$QA?jFp(OlZ>}o0%%MG^=CSc-ZL7^kQNNZ5VNeoO!D(U`jjb!k>8|qoQ8* zie6F8Sz2Y}WDUCf(>%nd6x;L>X66-u#Ws*)(qR&c!lH>$W4!{)!JUw;E{L*q!N2!+ z0&n~XLfGs}%34WtO1o}*n@K9*`F%21KoL7EN3HeG;G3(wfw5O>X^JA2_rEG0(=0|v zzibRd>lpwDN^j)x2bC&y6^n{!T}>?GEXzy%6B6IvzLAg+vG2+)^9{(XMXjJD;tXC7 z@40X^IOG7cG>0H(fhxWn=AbbINt&PX=Ju9O(EZ%>wJ3HE{vV%PuL?Q+&LI)u_LNJ{ zjy}%hb(%%11_cOm5eqD8OUkHagVGSJd9udF$EJ~6w{(B75^S3z+&dZYDrz;I(X`e^ ze#P$RB4mz9bihCO^dWbDOJE{XpMB72ijN|07V*QP8-gBl-)AM>WV+F4-_>OmO`0ew zTwGi)RYlPI{axqHo|j?ui5z43!i4R__{0&Q8@oC=sot3SD>W+T%9nlmRNk186fH8# zVw21l71=vPXhxkp%E!M5oCnI@0;-h~ZZ703$^jYLA(@0r6mnT?6G2$kPfnOI$EsBt z=761+gP*-LR?2{Ao~wM(--OHP%h8^_p4;lgs6w7bQd&C^Ai4F>RU+IN;0?MVIO_!I zlbVfjRCF#Du$vC=!>E$SnGtW$$bB)vHli&3i<}6r`Jw;^9a)d6G#n8{aq-! z33(?udNo_YCXd4s_PDDM_BgA+l2YB*RMJ`^okh4LW;qLOS zsB!DUG^(t$>JiUacxy*)f1V5A2TIjN+8=)`B(WnQ9;5+}atd>Z~GQT8FW} z_7f83pfFXXRjFFeLi=;p%jOp>s7L5ST~hb& z7`0wH9S4+hhWivZe|JKRaJhg^R5UbsmNa`Pp6J6s>GP08 z3xgMX?H(SKT9&h5V6&wAUjHbszsV5o_HFwW%dW<0rCe^t1>GAE#69;YN@O1`p(Qa9hH&ZbqH@jxl!_YT5{GZ8LV`=7Y{LwYCx?b<0Jd$?r zUrCm8fNrG(f84kKJ&(2M_J=65E&Fu%{e!lM9gZ1t96NP`J!klX*HA-(}f#v<=K)O4fzBqmugVGM)L#}vUI+f87`_hK8QR&ybAAb$ZO7I8ss;lEK zi441`hP@{SFnFsQ+f2K82h36Xjvi*L$P;ucA?%oTN9W zkG)bV3P&J!@h-uqzHimUy?mM+Rs2OEj1M_dml;vGWs4_@tz1pX(2!~##M9)sVY)VXByxyRH6D=yU#@K!LN z-!5Dux(%qPf=o5%wP*kb(IOz** zoNucjAtCuf%Z+v)oBmq_h4YCOq(3%GZu7}u(W(wbV$pft9TsOSUFza@Vs12~gR}oM zv&mvh0s~}OEUgh?a}EP9I0{3o?4EiibxrfAa#t9wn3nGGB@u4Ehv#<+;%H@6YUCe-NPEq-jnx^n zyOH|5pp%4G7PR|H)|i8~L0?rYfX!CNWlFV)!|?V=8#Yubjj*OuHc$JvlHhXMM%flRy$V0m8LrNfeAXntdme+MXWG;jlD)cCp zt4I`fakcB(Lpw6a0;|CLy!@7Ve>GtOK-<_h;6+oQLQ_@f=F|5$5pVPDy=2tA%p1LY z0+i%!{bZ5g$7LIqB^ywZaU~71c&^vBQ-{mBU(>O}d6i|={&dNr*Hw))zt5Raak%@` zia>Vi$XNEE|8w%erPYV-RX3RB(H}uGG9JiEIYPtl*8#6aU)F9X6WY@PAxp)bFt`00 zZf>qfs>D~roFi31F9o0PZM7bj805Lb^qx2GKFre8&^qa!keJs+ugIec1`WwZr&U6lI+QU7t%PFaA+>)p200DkIBM0C7!A6I zBiVmun0RU=Od^hbVt%a8puig}8Z=~*2)af*);-H4h0r7GRA>QD`K4C!6S+ElQWI+N zWcKb*AJxnAwv2DzD(7|E zr3wrOX=Ml3zo!;YdB3+;+?%GIV|Kn+wcmwAf3W{rC~8?KL;q`@#-GkkGSRdGeFiqRrNOQX zwi-kcd(;%@-}|F-wnc-SBfI4Wcx=g2T%}4briG}-tVzGP)=n3+C-rxPr$v*j=xjl^ zu)p(^k*2zpxF+~&)$=7<9dtzYw&Xl(|lWm`*{q>*ehj!JYnmWiuhw>&N@l>>r+-O0%{ z+SW-k%+LM<_yC8O-S-!;(AAC0f$}>Zy@q3iPIgB3sQFOZC|B&^wo*a^yV0JLUNp|P zm7@lKbaZLeBO4;|C0nuNTvLaLf(XmXFq?2MO0fc6MH@<1@g=&iNz^OWbM~Bte{WK8 zZ$9oc>~9>^>fg(1d&;xpHRj3vSvt2}J35;=v#~fKypvTS{-UT)iTq(WDu(pm7cET5 z`XiLuM_++-MlO&plD;FRp_0k3KZ`W_P(fy#%+u?%>>Ww6*3zIdbo|z%8Y-MUU4&o& zc17o7A!@YW6BfPy&{hFfViZ;G&?wsE=i?Exm-9XOh3=ZGzhny$Z@)t%k_=H@8=y8t z4EuJjSo3rjokq%-o=m~bjgqT!3Wx8TtR81WWE&p?Z!EL8PNQB^7uSXz z7k1G^U&7Oc8$Gsy#+%PKd~9_~`WYOI+|w?e@m9o;=K0)6jYj+xks^!!g^>hKjZewd zm;bYw2liwRwDNVQ+%&?W>*dpk0(|C!Kiz~XsG}T(@v^=r(f9D7=J1%v;$wPnwAfev zMXkBt{rp@3!3@Jt#cy|U=8fmOFAq*eaAUju60?(?lrjB^jh`+VoT9 zL`KyiKL>GPCZtG*`ST8_K^~cFxfxc251%`ZXKZ;&nZHa`@O~yj>CuX=Yb^nHQHWykLhVT;~zT0rE^xkJF zhTY&r9It448A-+~;*ZeSww>tLvl>>YLXOxYcO^oi2-GR177x+Vg5pA4t*2LDB$9${m+g54^q-HKPl+{p$6s%1<>u>`a>bb?) zN`a}h%(`Cw{&4kaloLsgN!8!0b#O1n;%$Je=btMbtj=EqvBgtHGa*-$1I{)s`u zm5yO23Wx3LgK`(XiA&zPPnMNgxkfV${Nd2_UKf!`D~`5GE@k)rM=L@MF!G{HN1|)s zTS+*^bd;&cKi$cMNWSww)D8HZ;kfBKG>df6ttjRs8M0;_`f|4XQF=e~&=}rJ zDVHx|HLYN!6XS3-*Zr|3mEblb5}ObsR!m}I{(LZ6=azGo=c^Pf)Qehmj>eVe*v+|r z`#w%mHnUqD$X|ffRIBXAv27P_D3M=q^$|JXmS7q+tj{^~C}G8aK1fSUo-}h`PiXKF zfq+qT<`cIl81Uuo3)8&?NkHdsUj#%WJ?5Eeh*dK9O}+VeFznZaHMr#R8Vh3n z(w+?;2j0T!*Q?2VI=b6p{auVkx%_cG_6Ie=_sKd%3iMII5&3=5`T)@Y&J>fgtDLXN zCcJwiz6#Sd2E@C`XlMIN5W%0cpQM}fD)hAxt#h*rHSI16z2aexJpzAB4XYnuZAjR; zG!eOz`xp-Y(%V5(>VIhsLgzz$R7-5mAjqAtr(L^^a!s+DubEs6CTqOl$BNzI|?uYg=ks3pbI8f*MtO=tMko`x?t7QwMy1{%jk!mz};H`-DB{c<(@c9T(BPi zeNPu-4EDC3aZ{VEdRgWTlM#mpKonb0K2Kzej7y(+Wfu5sB)Z!m5T7xQUCzh*XD2`B zO8oF9LjKWr(uTpof72&YwanGCq>>oZc9HKpoql`s>A;Vr;Z#^h6EJTJvO#*i{!1Rm zTsXFqxoV?Enm2JQ|LJ5PO#-!6sL%ZAz{;S%hEoHslT&C)3W@`WuP&qn#WX5Es-@oe zI=i{Q#kB-XJet8L|6cxkjs>`Yeb(9Uej6~JWG~g$Hb2c|L$hv>s{l{J$AIS>*`sRa zKb1wKPj(MaV6)Zn4+U18ig)4uDFbnOo@IG!N!6S?ZETF*Cqoz_UdFi(ds%9}(7?$= z-)m@7?&$IPlGL>#9@;#&5PAFMfB0>EN*U^ijG9`sr6ZIqQAe zDf7%ZnM?P0@}r>m4yp;qVEHlMTR27E>i{X@*o@~*`+!Jtl7yydpOpb$>+^{GqS?_D z`A@uGR?Txq45baIS-d~CoA<%WI+x*OgZ>ZN0Il<_!5|paL3~IgKfc|?XH*-!Mq22% zk~$cT+J|vj{Ej5xg~@R9zs77owK1vW;_-T9p2p-ly3Z{hfC0~a55Mi5y~wJ_oV{}0 z5s~R}Oox-wTo=5j?j2YNH7;#`pEZ#ma0V2kx8r}x>Ya}qj?BZ2B5|)1#i$#s;{u@xNw}n`cq;z!tr>ubvef9@5w@W|eUV3bZd*S|E zv0Dv8qQ<3?<|k1q`>y|Z^^EB|8!UL~tJgHlFBh^N&w|kkVj10!xMq08f`6(Q=$m%j zJa(G6pX<#KLM(G)jyKz$ge4+pzNb^gQDt&sp-YG0$8qVyU2k!m{K1STb|>9+{6jqQBeDYkBV)W*PoJ5FwMm_$EI>FnZE78x!; z6OrKZ!hODd4}7fIpzd*`o?t%;ISIJqC#>1VVKl~aN5*MtV_R!att(c(o->Q5S~Y|( zgCzhH@t|SQAn>yji#i3tH2hR22rLP$<5N5<;+^WF0cp&N*<~5qUaJt81kCQA>UeIx zJ@cR3L6IxuCT++t^DZw-w@`D3XHl=4){R{~qj!Pn6WC!q(V*+M4N8oy%d){#h3NR#L$F%w zo8RXIdBV2$qRN~0r$*1S46BE2ypFGR4L@J6z?(7WA)rV)+tR?NGjTMht3HIa#oIvI ziesjW0Yx8ljP;j=MrXhqa+%Y5zBi|z(~x3vzix-mV%aLWtTn4(g+q zlVxluQ&&!h%Nb`jx?78k7Q3>X;T4O;WU{12L}xSmvoUUIO?;+vsIhs)_alPK0B2bNegz7J+3AHQE<8N1lP!3Dw=3$i%9J@D4%G3i z^;}c-GQNMh`P8SUq|$uzHkQZHHq8;x?I+TzV-x+xWSyNnpL4SY0;o9>I(M_XA6fPK zZCG^GB~UmlZEFIvn8b*kbppE16kGpm0^PIx&t`-KenY;y`7qW){VO~j!a&aMWs)zx z6~!L&Oow0C<6g%Ehs>!uGDeNl^ateqSov!5RYc%`s{i;^lV^1W6xm6f+!sH6UjOef* z`b|5c6>ls9Dp;<|S+;o(X`bO5zG;70{A@}AX5HjtDa?)@H@5+X5X{1xAT5~IcM5=@ zzAt`*;Uk65vT?9n-ZsN(1LYdM6&jget}%$*O~)4*MBIzUxXkB}_q;@(Xx;Xi#XG$` zAY=>5p@-|UYix$aF2XqOYHHWmKfAvjh?7zB`|zOzKTDZf(kkk&}E}4K(t@eprrmEi% zH>T%YuP}8Ny4BKd+~dV~ES^cHy9f3jHfmdL8}4HXU>e7sEm^c~;B2ncl4%FzPt$xp z3J~XHFI!KMqN_S%I7`Y(k%e|cmawqj6Y{NhtOCz$A-U^=mH`!w*qrq?+=saRN|b!o zW9V_Za{!pcsMGNHRv>~p8VT^DaYyD)>G~x4hPtKk3ygYwZZBjm_tG->t&PDAK-L6(V9Vz)nMk;+dQv^5*_Y!Vlx?r9GF|qyXU^Uef7|c(8cx**9M)LVbxLN z&bX&CmlQK83>uq+yiSV1t0E=AVp~>tsIprmQJ?tiWz^%iFTsXnm_Lpdsk*K4Krb(~YY6{!f2Huyzp36{MC17!2LSVzxNqXH6ASx;fbyRN1}g%3>_h8^t* zjpHR8ysX`cZGilC-4p7wNtGV-=*p93G2}qP!C(K(lP8MK7-(Dx*p`JBX{PJFtO_;$ zEF&WL#%p0adz)fbP83a!-pZaFB^yE`UN-3k7vj|pkD;P3tpU>IQyVDnFL)VS0)GPn zw2#Y@{~r9m+d$}LGg!#!Kq6E1`eT$!xaUhoxImxq*K`LRF}s%a2ZL%alzZQOL1I2v z*r?avxRdxv^rlY!{0=J>EY1`{v#52MAtuqG&CL$#WGWN6{JjOzXEcc7nI_R}F$ld0 ze-)V!3fy}&?N*nY?+7<=iCnV_?`QDE(P3e~>8f$@cBYTqx~>~IS@RH%O^&m(as48! zrlvTXv-c+bO>H89SExROVlQo-h269x|?T4=Hko|&%gg`tmLz^y+5{ezWS(YlZ* zAfFIvF!7B&x7tTYtJ+y-s^?ZnUo^!Ct(T2k2~Vl(0X44P_pXuS1Ti&6KJR{Rme4C&oBRN;V_ol!EK4&^Ed|9dyku>Np9&XGO4 zsL#`Xw6=K;UvJB_)tjFu6G@W_@J;+3K0x4NsklIea6^;qd`sc`&3Mgc4EMuR)?B5U zcnoOBP)PgC!Hs{tK=_UvSEHf)`!HQ8i9g(6dc!@Cy#0*vhvTD3aHW^{0)}p`G*6m^ ztLIOx1_crQJ{x6+$@_~};&#b440G{BnIQ)O4=LMdW513ul7Q&hGR<6E9Z1tUod| zA=C=2TvM34xQ-8qEn>QkXDtlNcrzaz7hTv*TNnvSouyW!{`9iMZ>L)p$YS>!6jMZ* z>W=TJRm{`ce>A`HYU`r2#d3zy_g%KjhkF|oMJ@S?{1{k>&GIcJj<4P@K8BPjDJ#(e zzVrQqX(}LwK8!x@ppZb~izd1}+S#04llN@k%y9m}4Zk^v=rU|HC%h};S4UuSCDV!aZ900Kjv(PTVqiVT*YwGymxw|x_Wl&c=0niF4{}_b^Z!cf zb+E^jLZ<#9%ip|Tc_#$8l)HH^7JS;BA3!T)mkUt_4%sWLD*28ZF&x=We0BI7&zWF( z8&=g7bZ6}?ADA1nP&6`ae^+969OPU2y`jzBbmm5J;#!vdzb;KUc`OG0Ua(Tufv6cI=#31f+95?>3ajvNRSJ$%78#uPEO8XQvZ)$ zXNEUN+F0R=xlUCwuf~IBFE<6qkV3kf3n*W_AA%25uQXio&32uF2_ccMPq4AbGd;4Y z{Cls#b6}hCk#MaIYxmome}luugp0Ch?AmkM&;hM$@9t3S53&38Nc;J`skE>{li~na1~zJg0&Bk&eD}TT6F0>*ym!Z*1u5^bIH%P@}=-Z5~j9ndN=X z*oi-l-q|C4^DtC?JxUCO6(iS5#cA%s-vC-20JtXEv-kgI>WeCR4ZogB5>@TmgexLaLFlTns$Bi8%1KX;yAyBYv-3fkUHVq{s zjB$+lYo;BgxB{ItJ$vJ8JA;|4*bT_GN#wVy8K7!=ar<8WOYqEd4MpiN19+gnA^dM{dh5?2mJN zAHaEAtDxu6VGvTiFcU>MXLrk`A3fW=XdCL;0mKNooMc6p%0tALmhdN} zzt`}s`1OJ3G;;Nugw+bEcHChdn;R|znyH+hu@GFGu!5a?Qfa9T5V@89kC)0MIrdtb zAtQvdSV^^V9tb@OjjDk-!+OxErxl;}YciDW& z|As0T+~)vy+{7j-dDsVSvkErxv9!q-zQ38x&dTm?z9rd&kIAAH45EqO*{LxjUg;!r zxh+qqsccdW&T{6it;$Ou#W1fEa(#bY^5!nYH+Pn4_^(;a8^tLkSD>o}#^buXT^u$P zG4MR``)J30t~j366m+t%Pf0Y`{Hl}~0iD=41jT>o%&uzp?V0qe)da z*AoPe*k&I10lKVFHV%%yB1I@@6_N$Y3(=J?)ZglcKclnZ1_BhnB}g*%CNP=&Lq7VG z+Rfh%zOV4`yiXO=ZqU|zTq_nG2ftsEvG3!`j`Sul8^=n^xA9Dru(_pbo8vakW>KUK zZ$6U73qR2V(2r8`2fgYba`3iG6}(f-M7G7t$?VGvHVG(&EpLe9=Iw_lp=6^3TGK6vYQSOZ+ml98Rh30y8hO?M9+%ay#gphrc2 z&T#Eq`S^B8_t>@Yg%_>3$49lizx{r#*Ax=fd^s*-@!9I^BQG}AoxTSZ)iEzygA*3S zJC?Ipxw{X++=-B}S0)b)`V>Rb3|{FGnj{lYu(xKaJtd3~d+CkG%n=$gg-rCAru08b z?(O51%pZ+Sva<1Z%2clZUI$IvN&>@t%1%Z`E``Iw@Doc$*Wk4fV~Rh|kJW|wkJmxu znkOd*!>xuRd2*)uqB6V1tQgzOq0xUd9H?voQ!2ijKD_AXi{P)gxcj?v!|H@ZO%A<^ z(-x+wQGxb!73%YG8<&d>G*-J1bTl!G33kRlc+F2U8bpdF8}l zu=1mtvTyLeWn93DWUd$OnejzQ@15@PNV?hkh@iIlW1v)tz{y%OFnpW3JCHt)wO@?2 z4=wQ=kcCnYfJOShFHG?YA@7c}+G1L|@H@2ZT9SG_v;vmw0%zjwDr`Zvvz~Cr&`HsP(^lU=4C@bD%=_lh2f1XQy5CMQgy>ohF>@2+6$T!pQ4B z{*^vh$3ruI#2-58HMu|x^XiAKFV2#j3WN_n*{(lPoo`2jABo-XgnaiJYYMxutx)zI4q z7XS*m?DD(E5OqNlazWE>+p`C))Mi|kH*$XOAl$eIE@R=VlCM$exfT`@on=m0YWBhV zf70sx?YUFAKtTHHaijMxo-*r>oGObPv1UK+;!W_*d3E!9nL0Ks7m;GwJRtyc0b^CK zRRCToG8I(N*cf>@El;P{kgwZ8-NN_Yf_T)N;2;2JSuD54?Re&L^_}f0{2g;dT;5oG z$&`!gWu@~i4H>T!O)L+Jp`1(cHWwfTH#l1(jbG3GHb2<`R)l$*(IyE8zdeGjOihDe zCPkHxBU`tIe-yhwe!wQBtJwvDz3x|={QXK>!N)BIT`T@uXa{7gGDXcYZcRfcbFi|Q zb$p`n(eCZgo$2bHa=A$1WOi>hr|fCpb__67*;0 z-L9@wI6MIz89VZoCmR% zFgg6u+F%pod$=H}qf?--t!m!0Wl>OaemP(-i;g}xgxR_BazAYjT5R8K2RhW~xN~oo zT(coXQZpYz44t?-{V9v?+HrQjGM^ap?Ky639Jj?@_NK2pFfgRUx)LAn@j z@g;GZ0=hAAnq_&vvy7DIsh!d2aIZ9<%h?xIY*V7>sft?rL5nr#StaLYVt_ECNM^m9 z6}@)>uIad5qKaqZXYW3)`qv-JyRoLZd@^G9{WO)gu6a`@I582UsJJL%pLVJ_ zvM`hyi)~K(TQKrQ$G)LdczDxQQ5MG2|A?-o&L3oxLbuor>}auGG3-F_&HfQl)fV>; zPnZ-^x1sZz&#um(A?=gpUbN0dRLjNUlV)?Co= zSoFV6lF@K_q}o+?=8`=n8XXWWI84`PrP32nIi7u{u>ta)6PkySvW5MkqzW=H8L{Nq z(*`l}rfn0c*>7Ltp`Q;Y?Jc(s??emZ|LcExAI0A}jj<^HPp|THxP+Cv z^WZbo4O`%P*I5vBvV|g}D^a~rRH(_?6{)+>BHmA)c|$tt;>VHkm3Z;6dtXun9`uo; ztn|$m{o!(tSudx1+ARYl0(N@sQbd{;k1S9jjCLu~EYGAyq=_?&Ob+R~M+ib5w-m>; zo5!bW_7&NsYevlg#U1s0tmEV?DMDci1`50{Vn1f?xy#-TLS`%+@II-GzNl5s0|ET( zVUcykkv-^;)b45aFzH2RNVPY^S8Kh^%3$?R8Dq|+h>DVH4JT{gmbB=x*r8Lh+I5RBY&zAoa6ulGmrfr zkPf|5yQ~3akd@7BP#lrpE@3iFWyU=u!vCZCgUw~@jgsi8Yx1Py%Y*Dh zHu#7(UTcEHPTi#OjB+NAtO1;H{y3_pOKG#p!G1_Aj|BOrR4B{4x}dYEciVr~hEG69 zo`wrq)kFBJcAtu z)FtS(88x2%jAKCN?U!5o}vp+V{vw&yE)-lMa8v{0Rwf-**&Tyt`8I-E1*U(0uw{q*p z16mnbV9r{qx4_z;G%$Ye7Nv5d5ILtVMFUiqLlIMnBq&S*(k zd`wWOVQwL5>mRv8JNo@S#}CSvj}vBNV3;+uT(LNejaUi~N3Ggs8zjS`bNP|JA#IHM zlmibUSFk)qAEO|B+iy=qXD6}eankffu;aA$+aQv@CcymWJiSy@PAJGFNyITWELb<# z-b%G=mGAek%_$Ns^iw7Q8d4&k!W?@LK1P99-Ez-0vHk{)>=!4~OW-a+nkY=d@d*8i z-tW=#Tpi%7i~-%k`KXzTAs1FPnFqmtT9-*AbTnG-TCe9;qgF09^G&j3zD$wB7PZL8 zTJ(1Y;+xOdE{{CtG|UHM4pZ588()*w0!;#G6I)`C_QX{rV&f$kAKTmPIuwt39)s>F;y$9%Hzm;e(PET z$aJJ=;68%dW@Jd5e-k@{35%pyVng5W1ow>blo4Y!oh;{H zLIFC`coH&6P4e6a+)Ap%6iG+^k|cqx4NggS`75he!}XJCee9}BJ-5MlP|4vWa}Zv< zGwd8~4Ns<9KHp4Sp^GL&iv`z`_s6Ohsct8OU5uTkrk%^IE*M;BXaHhfIJ&j0+vUlu z^u?A0BowmEJ*3dS+cw{kly9cx)LIBa(i+oR_>r2YAA`rWjxgM0{9-Ma+!i${kj*#( z!y~#^(zVhPCY$kRsU)k=B{2fDNvs4J=293#7j$utZ*NTe;#Xu=a5az3rMCHiFIKHe z`L+OyDsdsDODt_=zpggM{{ad?^}dsKj2}f2&iFX_!69stFm?VcQKP~1#5rcBXKA*Y zq=H}}g3@TV2wNegVvaWskKzmsh#V;H#>&Hc4u8(`IhsoGespi&N9HVXM`ukTz2A z+Q5|o>Z%$o)EbR^Cdm4(qk{bZ+559*Ns=s04Ev5Qw)lFt*mA9^tjeyc?&=Mk8K413 zLmDyz4ne^XBHV-zTGT1@==3n7I`-AuK;a&vb%|#U#~j zKdTXsbIzCBBm_uEAB+H4TL-~8Z+Ng-yulmi_JDDA2JK&W*2T8K->8r@CElXTdM83% zmJn&W8QaqoF7inQk+@CXKn@H6I0`v7GguJFSW9_cHsd;;sQJ@h{Lvtt?lUvjwyy2$ z_$g(JnSFkIy11Cl6EGi!fTTKOF8~l{tCeuhUF^U2j!cszGIa$ai}_;7&M`G9YE`Xk zRqGtG%+C=CL7ov?)+ovvI!w%Gc?DxE;#hC(*1geFm9f(r{JXv@0f=-2=PcsLpGJ|^ zP*S0&Yh?2aeDdqR#d4LQt_`x%<8an8Rz-x~}aQ2nUx*gx>q>S`}er6t2IT&TGT~>xEG+j>vV**X>U`x z(G4(E=g&=+%?_5WHzRK(f78ic3BX!Y^TqQ=G&?_AoSa``u~;4wNQNNSXP5g5fJhd3 zE~op4^*{cP|C6|?N;b8j=g*#EwOpVoE38&456ZGbUeu_o8dh@K5nW|vh}`~0u2vO{ z4QXp_v9JZ=NFjy<&BkXzkZzsvg(5t1lI9L0zNP%ns(PDZGU0_QKD z;-gO=qIT?cqr#%|Wg($7uI*fUdV)ec7~Xtx^+~McO&*&^5^0nnm~?|vEF}nDj>8XN z%P^WW?g9u%;s~`#P==;P^ZdH5;MfISatVgRV0b%C-r5+ts@ZV-dz6fS_hz>LRy`vtx7o{Q3O($ys8J84Dp+%sj=WyKv+Dk^#^RBmk7w z%8kb(u1x|0aCGOW{jhaap$IxPFP=Te<8L3~`LpN#@&Fj)+JSOo+{QuRI}{8hyS}1m zajUvEVbo~dx#*U^UFVdSv3BMl@P!`zU@#c8ZTeTq;fQzlCL*U5P~q-KSG=ifW>O(hLE8}-CY_=M-YNw3_}KtqI-)7fMo`8&?Tp! zE6$80NjDaB%}mc|5~^C8Yt*iv2)j0!hg5NpZ@uu<4^zm z&+&aebQHlj_S#F1u|HIZltfV(&=2gE<@s-I!HDH@zS&8otM5s3}P>H;1@-xwgeFqt+k;PGuy@K3!I%Eub#a)-FME8iKu4g0sB=b0`}A>-ZiZb zM?gV@QtN2I>>>}cdZK4|E|gL<9(!)k-MjaY4n}zL_(`ikaMPC}1wm_xhEGOBD6$pK zPfu`udfW=~6A_{)hSpJ=hH9-L8&aopEtjO*bln6b*IGA1ZqJ~ke0f($#}2WMki^NA z_ayRz!!puP9V)`MB*<9yL8BvfAH@mM!4S+Zt_1NWkPGsBspk5-(kje=k^+a5Aug9$ za4&AkarPO|7UKj#)Y3JwyudQg+j0@`Dhik9Gt^b>NvcYst_`9nx{)T*WY1+$hEbXS z0Gv1*U^(0~V=b&TP=h0ArBGBg-ei8neZ;-D=AC2IWZJtyz(sAr1R~->h5QrQ*A;?LsIgCB|xxKT;5BdD;?DE<1$&qt52H==E1^^|+ zGD(ssj$`i%C4@-gxF#aW%s4naQse0~-8(o?Po6x3lmb#pQcAH>inP`wrC@-F*})j& zIWcL9x~f_#eS?9}*3Hex@~Ta9g&-I=$6`KTFZAwd9@yFJT&q<>LV&F=O_DSXDXC|G z$FZmHJ7(y>OCnqiL{00p@A`Y2Y%Glv4ATL|gW-lC+&TygfCws0u6->f2_ghI735D? z1LMiwhPd1?iBMaM+ITEunH5+qL)I6rU1<%iG;)+k<0!P5?PdV)%+Y~-z_->0&JJ4n zkD{tjcWjWFM_JYFccY|&5H$wr07`no>rMBuQH=Z#B|ahGaLzG`vi35~@f60n*BX5K zhpq@y0!?|ZLy)9~-7aPO-L832_ErjqRBuzHaEcVJ2{tFQV)E1)hlmsI39VzNU zO`Z%F=?Fqe3`b)OhC@vE54MVMl|cjNWdc;BBkWJ6NaJKDMWF$aeLI+U9llUXLeg5T zL4?-7=r}n0vX-$w9-yiXE*3egUEd!;geZy-Y3&0tGxD-V*(cqRKO8P+D=z}r`P}Q0 z%fGHxYKvhfAv@`aZS?z+2pE|h465zC^4R2EuEP_rgCKUBBvNCD;H z^+7Euj$PQ4}RY$`k-yo}Y;qPaauo46$F| z5+E8)#-y}HUDwnEq|G{$+1J^QonxwN1FaQ?!yyh2_i=c*k01Z|N3hIT%olj^ zFR@t8QRW5mEc1hiRlOcebn6n#S%NXP6EJ$^VzcQx1Bc4pzARmZ&U6&p1w>HQi6on zjACXaNrLHQgwu0k)3 z&)k?@3&wjcm7fZ!s}glxA&R4o72q24&d~@;Yb3+r76P+^(h-cQ!Pa=09*Uu)_h0F) z(O!%|KvbEUswIgMp_FuBk0`5u@*n>bwRf;D)4^yWrHq~b1mv7^jeq*#-FvKb1XFuF zK`O;bI_R4%Ff-F|I7E`f%nXVmy@C4>5%N6ur>^!Cg2VfFaR2>x@ROhaEX>JO$X7Y? zEJIaRUj7uoVm|YX=ekCbW&YnQKceAF0bfEQBq1JL6`dKS^=acA!5HVGZK$gqGt$8T zlf69*hQr%(I&OT-mU9e}1d_x~RGwxp`oQqN&Map-QbbT9Wt+lP3N?l#H7*X@yTVV#JAVnwZBZ0CiQI=kT zHEQSuo6J#=5Qqmu$f`h@7ag0itsOlMXJXeWsts6zh~p$Sk&Z-j)~R>i|B+;7;hZye zT}v5%5DPusKX6_ec%v1@j+ui-R4WNgL@3J=RaKD-ptKM~b#2qCF7pi8(o00l=W~=riREIBx~jqKkY#!3 zAbB-~=DyUG7lXfh?*YcsDegUZfWcsJy}r#$a7tX@v|KUs+Q63l9F=3&>L+arP0l&* zveE&-x8fXvIyhv|Cbw>5&=$dA))>=@?K@+9*$g0w6b{Biq{9@RaJwdfzVrT%@L&AT z{~4kvf{tPw938b7$8>M6Ey)I>5#qLE=`p?^fA}Fj_{GmVrEOTP)M>K^Hh(`O`5^;R zGd@!0c^iy`5UmuA3rzpI_EZ{Edou_@)Xqc3A@f`Xn|Ub+aU9{pU;Z%;&(BfA+mE|; z6r~9m1a=0_GHg}$)<{@qW`(Mori9?xe1>iV<4QHq4$cq!R7c2$OsR>3M5WF$|Y!}@5`2~_BL6sL?H>lfszh!=uvAvVj?iB1j@^I^O|W zM|kg@cW`ucguUq)#xbT%HUr?`@DRh%08x^5f()P|jSv6u7x>^0KJ@P&$`B!a#_4#C zvo&n=rZjKLKx3wp0j-Y9VF;sTNokXpf(6&&-9iN=l3)(udCgMCjFMV!R33)f3( zG9KATM@}p0s=Bs|)so{VCdX{++O(o|z8mLX&U(38V#jOVb?1#c!GyL!B~7Mvc6N@V zqeCn&W|(TdwY9&kGXdUGEHz-c5TWc?r={cl{r1K-8^c+Pswh#HB}ht7fOKIncQ}Ah z;-xkPcNo)=)`*nGD$k&mLUe;92mu%-DVS|Lf5(gtX|E{-`}M!a6&}3xHa__2&me{G zOirg0jD{(OqcMh~6iO<*`@x3+&+*qe-QUB1{lER+fh4tER2_ixrb!_>?D7V;@M8S} zq?<+UU@Pn8Uz+h0=L3^-4)I`sBu$Yo7Rcsv&;K#CKODl$qYeLE6nPjtt&rzAA|2sZ z|H*%f>76_4jN*HEG)A%cV$n+cILD}}3T06sFLD$`0aKfePIOZ`%@=c2f&W)lW!r&X ztyUWc?fLmR&T+mOKz<-Hl!ruQm=RqI-({vLee zvnR3A5#l5kQVLjWNga5hF9$G7CCOUrh=@j`k#){R?4K-!M^z1jH9IC_ElQv2vN4v* zsv>4T-V%Plc4SZp(N4sVh_E<2$KKsLuMYckIt%D_Kelzu0sxst5mFv)ocLP<;!Uk% z5*Uw$h_uFHwS<-mS&@6!ma@d@1c>FNsvSelhFXv z$q0jb6|LI?Pmk%Kzq_^FYN`f7?r{9KtR?y_qQPi41I_pr` zvJK$P`IZicAVHX4&b(5BGcZM%88il_s!-QeU>^H!PM+tGMELN}|7W=W{`+9(FgriP z<;gKV`{eJj%5u~}Z!0goX5uO}_$iWu7Bn_(ABh zEU}y~Fq_XYpU<&cEm4-G|IEhtESop|1lNJQ0lMXlRl&}(avQ6BBZHxJY5W>W;ifUw zT_kz#$Bks*8(vpAC>_Bi&TEw4?ov8hFK}MyQg9NdPASb*RYO^4S@?2~1qnMEj%c}B z@^ZD3qv3#^WA@cq_>my35^2qm)(k*07>mV{S6N2RF(q+~s;()d^g9C;5ip<6F&+(3 zzFZ06HG^5&`wFOH?<#4JVZFp(`LSSu%M~Mh=93x2*Fk>S%uLG_`!ea?aDI|%P-!(yN%hWzQ zu;KTrD!r(F#~K^Vc<&GX5c_xU!c-OJFP`H3^b`-j{1QqkKdN;T+>~xk42{+V6))$*2l%|Giu+ zae8usr_Y|@^5Pte#T-SJ`%E!(xO5ajX^nI++z>u|X}z-0d}sn&RhDZGAArmAbF3C~ zBxwq%6pB3e&8ndP6a^BcQtH(+uwegYjoDyRR)xov$QV?4?r8=)5`+dYZ)ei3**5($ zj~T?w4xR?XQYj*kQy_9uDV9=kLk$?yh)*vrm>F&~9EkCFL?k3-Sw>Y^G7)i;EfEp3 zV@xJv5<+m6=PZ?^NfKkZ%3zG$xxR=9MNweBSYR@lU~zuoHFK2w2g7?2M98ZWMOk8y zrmc*xV~1gyVl)`+?3`?N@+9sZ9^vlM5u}hU2d2SwT(E$0#zI9JbzP$@tI)x;A+VG% zK@GDie3yrvLs=9U9~|LFAO75%HJ%z44j{l0pNNl{eaOV!h4Po}DHadwU;PoLtOuOH(4>=gNG)eb&)Fbx#Br>D&2 z1+(|&ku8^)&n|Iv?>?NhxHvn7H8qMnYpbTV z{0@H>Lg4V;eT>HASL=E*Lkfv>I6}5uwCPPF^(>S4c2g8L@7qnPf&YI2uw!SLz$~<4 ztrd|VQc5b0lbE%RAcSCRt*eTXr^ev)>>N@MPo@(d3F&9OlmWu^jYoU~)(Rhr- zd`{LFjD|xfrNr^+ncJI8#GS(f9G{+XxM4e&+3D#SwAM(H1Z9?Cus8AMXa7JR#u!}8 zXHZId3D)pESnDyRM&`szuU<9DT&=u$r?VF9JYZaxWh=p3m4(lEstS|CBfR^;PhqXY z{PF^;%L|-6eS{ZJ9%Gs1D9h4|*VV@B0U3)}0KfdRKg9>X{3V1^7!1eA<}>{DU;ld? zpPh$Ngv@n;(ZdU3NM~K?gSxu1)^GO z$U7M4aPsUa2ybEdszHhfq-6-fLQ0O)lt#|FRhIGPd@cur0Y#CQg-8bjr<4-2%S*273dR^p z(v+8r1tC~k$6C`W%Xl~(P?{uIu2ytiz0J%xK0d*nJ4euQ6hLaV!7RR7e{b(%{1BNJ z5uvsQ$LHs`e{`qq*g0!q>lz|X0XMs9VpvZINg?B{B@&arv z{_%hM7kKZdKl4TnaRMm>KK}bp@avC10d@4IyN!b%9gbmYj}Iv+q2mP!kRT!= z<=g)tcCdjD;YbjtY0A^_gt9!h7nd`P#$%DDDcCvITGMDe#_aNvvQJPR(hmxE0vYukEnY4ieW^!nYMfl0^!TKAkh39eB(+?MV~IzlN0^5qi$`d|GU zfF05(LS9w4n6FTWuAZ|7ADo@Hgh{P62Gc#nqkS+$J7d+y$d*Ojp`du(ohV5mqyjS# zYlS4zn5~Mdt!g+3^7w*tz9dmPf|3$8Pzs!LIJ=y|I@e11HsyhHp7uc@km`FdUCD-P`v;^d>A8CPJC50;9La=wKhFEKz1ThSLdLD37{XmQZR_ z!t^%r{x+pTRidnGpIHb3JBFz%L?XHNJBtTn#KST2vce+E5h(>5C=pHVU$cev^2)6~ zQ!*G~GTpxxrzvU^2&>$ZG^K3JBfN-R9BIhBYzKhbAYrVRmw_jg)^&|IxWPoigZ9U# z=g7-yBak$Q#>M$8bb)At_jTKcHPsu-iirqS;Kn_A^a!8+?h_opI1X0vTY!`Bf6R=k zHmGWYqO33+B#1lnf1{4<;q-K%N5(Ns_iz+(qOG{@;x8);O`&l--I) zBsMY~Atj1n4p4Rxk)ox^Ie@PyekZLOdt(>*N0AT$x7EQ+>U`8qn5&3#)g7dRRWTAImAce}%S zD??{9YPy7-S;NNa>Lp^ISAilgfX~b*io#r8p1YHiV>&y(pe)bHj}U=WbCa22*4m!H^nA(mH5f zD1EyQUa*~Nrd^D6ZZ@CUr%#{p@$={I^8Adl)k>J!Fqm2Su0-pzAj0Yw43>^9D=A4y ziK48iswx;`TogsZIY*t$2_aB56Ur1vkvQ1fW2Ka6PKxVpke8y+H_PhMRh5|yE$x8M zlv(bFCCd_0dA^74J{EMg<` z4Bx9U-f*DlkQPOOm9Gv^Pxo8mrE{Lx>a2y*+ILX{N2t-&vesdh7pQ6jV;qceu+CwS zdPN5ATuZ)O;sU_Ex8H#f0{cftDDn(>wt6F$YRxqc#^WI1c>56VJFW^UioG3KmU&C7 z{@!HYnSH72XIS#MH>|aMadB=Re)X06>hmvfc6uT%=QFWdWvJ>JjvW*U0SID-lh#@* z8o3O|&Qvu8vg z9oTsBe?RVFP?wb#ZA;>Im=@$`ue{{1g*Bn3FG@daCIoC%BOayz1NmZ!(ZL>~UWPj-i9vftLg}-bany#s#_Cd`}FVon4@=Yv|yaMno^6Sxv~Z493*0cGYdNBMt-Q z&0MAp;)snCN+UUPd2xy5+z*sTag2L!zrC?`nn7Xdnn{7O3<+#4$X!5&@Ch->&h z%&77LDvsK0snH+m*6mHe0(_>$mIIz8uILppd(c@c?S0)Evw`bKn&EWvHcrvnv#j^k zdN5mg|7f?yK$0|ukm6dkPuDt5pbc!sIpkG^%jF7_;Q)?(*}_3CBvR669aX(?4|l1b zUcKbCo)-~8M-eJ(J^6*VmB*a{C1yYKX=*z)%xh(eJ{j#%~~W9D6$MyQMAehd7f>Zg*0^u5)xXb zFN2K>X4o<>+>^(T>?gnd9Ugx5l{&w;5T-P2tx?8Vvub8pIzgl@(?Va)fk*{O z7APqj{E4=-4x8t8b3Ss++UFXWO*&Is9xh zAS)=yri!Z~Z&h8lvJ+A%fUeP6!BvM0bPPV%o03o)i>j)8fb8HFk@A_9yQa*O!VCOG z$}1B1!^Z=_wY4~%&96Lf34o2kY`%i(mc`g&t=)5kX@a6>w0okb)EdZgM3M5r8)}0Q z9ccv}X*7;K&RL8{!*=5{Gi;DuZhsG@TQh6utk(srO7AFRt>;oT!N?c`>nyDCW$Q9X zpKM#3{n^Zh`F(Kb4x%W+$@6DB=RK?1V3`#drg3XL+j9P%K7o{KL;2xNJ({vM9SmCR z^`?gqvX#vC>Jy&$+t(u(O8aKh?f0u=Fco>uPo6yH-~8R*;?qxlD^Fe=tFo@xYdAT_ z48dRvW~fe361_|(pn_gsh#j-B)`rP^*(>WdKHrwVr`rUMRy*kp2Pf(rYcjM`MNlEE z^CDm?qQyQMX;bGM*m9WG=TJHtn4*MC;*BrL8yYm6pX;!6lv7PKr7(`kadtd7W{nSz4qc{?SW@PqhZ@EZya$fGcGRYaMpnWpzcC2 zFhMA=D@xb^%gjJL7+^9P2R>8?Zc^YEfA}k;NeZns;=vGFds77|1k%ySHx>d7B8p=a z%VkRy>6Wz4TGX}i!6)E;))+6>5(EsF%O$G13Zp?~t1I7qotK)O3-@I>9wW~(EatOT z{IBfHu@RwF%^VNYEBCgptM6yVkO)e3t<-Px5gj0??F<`hu8!Wb*MNe4xyvzi?M{x5 z@!O9-#>XFhB%VEejNY?T{Mfi?*ayxzs%t~=(y)D!mF$&v z{eZMB+uHd^)8vh2P%Q}WHDdtjgQDzooZ4U+^2#=N2mv^5`AvfV zcB26er^z|)3@`)3G{OFOh*e%KlcX<&8btTHWzT)0n)dpo%BaSw!1Nt6iRaVP6oU_eJ>{>y{EAOcPE}c!-UZ4>egUv)+IGxw27`2r$z6%`R;<%yAz5;&TUVCtZ@7&>Y$h`m)+ zjZvE5o)9>`TzO1ON+`J=I=+AZ9&Cq%DV4x4e)X%MiWy-r7_>4qQYnlk6GTx2Dab3F z1~-``O(CViKl>N|%|@9igx{piqISXT(}hf?rDp_p-8KUXqZCcYv&lZK@np%ms!&xm zs;Wd;csuy2st`KLD67)zE``_WH!H5?7WH+-dn%LM!72f?9Y7%^1QF`0yz*Y#zS~t^ zp(ty_u|^VUeBTc#6()Q8?e}q0hUjSp0(I%Z@oc$7wp!t^bI-0Xwwx-|Ss0$I zNiFa~x9v0)Me)YIB%fB-Z9r)UTG{icbmGfArL}j-?0D)hJH*357}pT(sm{(pDh;L8 z6_ETUk-Dqjse@1w_uqa8);c6UOqbj|#v^QwTT9A9WT>5g?d9ZxBShn5K zR}Dtg*o5YXhY<;xxr_K5GM*))Jzi9ojH?@(HkxCY|v5i5`417S-2`uWEr9)0XJfBo$Js_qsmJ}X#(qN2tlE3 z&5&CAMQJ>5s!efU(mOATA`FK^{KbFyU$z*S4BmHbHz{0;Qle$vkH;g7$76^Oe&T}) zt))D=8`ewjZeo0%80&+PtJl)IE(8V-kk%lnFbLeGY(7U-mM~QbQ&*^~8g-R}O$}2A zIs*F`Z_6d3bcB09`Wb9pBhPZ2ou1lfqeC8y9hWN|EIfiwf@F|F797hzW1qc}uWqHo?#e$9lWpMK_oYT)`)yMO$}H~?3Pn5eQq>hqZct>IFa4Bk4MLkPQlvDJ>9}>0 zan1p^oLlm^j=*F*1}2k^Xq#*2zt&kOx8P+%By5Z|y##Fyw%$s}%kT#74+IYHJ%EZL z>U@uN0t*@p4-OQ!DMJLi0RK1iR~pm@-T zwKdYgP0+6bfZoX27~?ab#%K~d-m@_o*ojs3h@g3Sy{T*0K=ZpiirRM}Bc&0^+rbD) zIzT!YAc~W%bP8+&#sPaY$g=`UNocK*=h>}?g-Hm=DBirc;Wr&AXek|-6&Rvtp3q?1 zEli}sJd6TCuwydLimIwP%QI1yH8Btb{Z;eHsE0XWJQ{8&3pnQ}h}wk>bUO}|43;`S zlvrJVBS_g;HrW=70stMysEPtodQUf7n+-_LI*Yt45N|R6-1eS%Q6MXG5DD1Y^L`pF zDc|08?c7*A9Ng216{DOFVu4491vi8R$)B(%kPN&vAKv7HB8}i}?)0;Ruc$ ziaZ06Xw3||nbvw8b$o7vyh_{nxW!tyxp&SxO<7+DG|_4I`k`$R2)ozNBD$Y{FdSku znY4%Mjh${1SQRw=Um5fK$-$+P*QnaM+K44Eyq*xLit z?~li|3>$Ghf7Jm}gX@b>p4i!T(>f`?R_a!#8-Y+%B`)SOm}Q2OZ@$LKv!~EX!iJK^ zT8F%>kS&+^=`VhPpZx6Sfmh`DL}xEv;NSj_{}$)-1xgbDUB@k%t*#AzX#mkIav>1K z2}nqMbGAfTZJ(zj5ULtDooC2rGf=R{W@e1XW1Jno*bt{%Q#mB8wO$)+Fu=EuA0yJ* zV^U!}rh8AfCq*HK3X6LY6_!+$}Uu|0!wvFZTIs-{Fsc;)+ zePii$8{7BBTQ5$$8bZEWVKKi%q-0BzX##iyDd^xP%wZli3YO&!#p8A?@*36}xi zW(X2OXstMn6YflXIU>?oo@2FI(R4a-N-5!-=271g$b0jd zlxJL+j<1+!nfq}WQ&ek!m>II+NCkt&W^>;Tlw`zF3?&s9jBg)4#Ft+^L>xtaBV$bx ztm_&Fm$UYj1qn!{A$5e4g0UxzjAiAS<6RC*JQzWSp;)4BfC<35l1S4S zdFYZ+RpIi&kFGcl-K@qwKG=W-V^pmDF`2!r9M)kUv^Z(kf-jc7}T)y=ZHw1U-qhPw9BIY}HN z3B%8owe7wC4)qNy9bvM!k2FpD^KTN~kCQrqi&R}3QCGDr%Tku67S1^V0trE+l;R|g zl~R&I_9Tc%W_j)|XLBipK$;{}8zZtT=+)f; zp%q94U;5fWCtl9QchSUJu-aP2p_15qClJ^;pDbgOcJicslMN}5XM?YUR!Ck zT=>se8x-aBBP+~6nnWN1rUwUz;sn`hwGlLuG!0`*DIy&q83s4uCZGe@KRm)@y4O0& z$e`!d4>UT85G6@#WI&zjq-)^WnCoh-5k(Oq9pV0+JD%DSMHr387>_4lb~rgXK^~-x zZnB@+eG46wQgnFdNKE(k7~g!e0f_fNat7d3p5>~nD`BjY%wZf4B&CpubR^<9Awfbi zFV-LgMuKvo`P-WpyJsuB3z#p8vIX zaEP+Vkt8V?91aAD$^L=APl2A&c9=WWM>C$J!hz+SZRa?XIBDr9X_6vI6A1DaWFoi? zHHM=>?;Ax?U@#b9y0?coiTyf|DvY>z(2r<3orwLzgGvZN z&N)d$T@L1k7S_o#?st!ZM2v$(>nsY&)8#a_g-WI%Swa;JWVA||huUFUWjAt!HBV?$9!2tV5cK`zB z7Z+Y#A*i!vd5OBVyMt56rU!{9!``|7AXtp2xcANwb+DIe))(Ofs0%15DLQ2`rvG(t0ci=sWA|z>w$#ep(HS#P+k|wRn!8VXxD&>j8T4A+Zy{ds~ zmjR2xa6m^#N6qKvZpPGKgeuQ7K_DfBAR(oMH_4;g)Ku4%2z@(2pvEz{c>&omDD18s z^t*hw%_6kcKX_nLQUWBv>`xjOI+2bU!Z}YfkfH@>y}oyXx~evO>**ynga{>}Gc~l1 zu70yk>zf(1@w0lZ+C1QgaDy-(qz^_>q}!dWq=a*XEk1cK`N^WeLSJBySvIhoxfiqZRA!S1|V8qdPBR_U|V@henX%brV zLqxI998R7+N0DccQo=ZgRbIBLr`Kgp!!*KhG{WJ%dx+w=y=NSBrkc!gG#Vk&5z;h8 z9DMHj2aS+kopo0L+GXI`Oi|pqdk2HzupRCmPsW}qvnA*>pnKCWisKmb*&J0-A{~ui z={C2thd2>$z4ewz2Lo5nX0+?f2EeM!a~VZ3q>_RHI?Bw1wY|CkgBUD2Eb{)C%N0u2 zt7I&{S6+AxrJp_VOawyX)t>?CvP3!>ZY&xv>4F=xC<2A4dkY8x)Adp&Rb6i24h^|3 zQWB%l0C5~aD|J<{je(1^V_3E*S4(8GGZd@r+D+D6q1Qs1Zv-K}O(*I#JnGu(u-Ab= z+m4-tP4z0B-+s0b#j!WvOcU(wA0P>%I9Zk<&oVrJ{KyN}DG6&GmRSkY!E!nnbG!Mq zR!Ad-G)-}M_g>3EYO)<;47Ap`fB!zD@J6jSDQkA!i(lrmDy4A$!TpT@d7DzYn~^ou z!)?dbb_6G421}{<;OIz<$0IYJ&15fzxK2hz${I^Zgkln^L$%m;+%=;x)JNL4r*d2D zWp0QE;x;?_dk9R{nvGJ0NCb!8wP+hPR?rRirn6Z+=5V`KEQ5VFP6!xFs9dX?>`SUO z7!+5^18IL zuPpu!#?vg8M#+;1D9RdTWj5ACWP;&ngh4t$ z8hri$;PUbkPoF(SlqATP%U1hqn8dA=ix>ZMt$KnWLL5gJq%lU538n{!zD(TT$7nPH z*bB#9US1;4bBus(x%$I++cn2w z0}QS~TL(ejm_dfAbPD>~6ux+`$hmI+ztqQ|kiI*CB#lFNg`kCmbq-o7FRLOnoP{^~ zbOKeGV|jjxe6j2f8i3esqE;QZUA%tPB>b0^fIEf&iF+~zL9UfAn0Kwol zA~Do-=MD}J5XZ4E>t5kKHcMX*=GQ^hV3&>BO(3}!DiAatjm2AUz0IHg_IF&@b(1+Y zzZz~7si#k#sL^PI!C-(iO`x?Vr4?cwIjNMAN|Ps;35M`7hy<;t_b7;B5OKa-(sDNA zgS&T$yfn*80S`Z9iRb5sT(Gect;kx-L8?m6ZDO=DcTy>sx<;Ah7)__`hG`^FZXcfr zS}Ihg4mgA7CJocL4KU8BR*q$HeugT^JlK8m0_UeMP*pdmGcs^?xoGFc3G}@+CAy^x z!xI(fnHLA#8;u}HASo5>XT*84TKXeM`USm3~^sNYfPi`v+JqmsqZr$g>sd+G|fC5KNU)7!F5B(*cH~ zAtsY4qM%;c*Prr6BKnowR&KM0(ll+25{AR!R*dOJEH*eLb@AaOO|e?7P~~22^Chpm zE#a7fI8NxDx8C7FIxw?(7GbTZBD!Usy1clc)oK|3Gz3 zV7Mr~VBL{w(nv%~W4C-Zb*wEKV@QXhs!$ar%GJ`B2ZLk-^z>PqU+Am(1@hGb*>Z;2 z#Tib|=GS(U)?HHZ#)D8(jy9XJ2xBG2TGYmb><3{K#-Xfh43h+r_9miQ$x!Z751(8o z>l&f-o(@dGh=UW57Ygi4o0FvDJ(B$ zNXJ8r#uJQ(qh3H--;AOxQ5%EW7!+0Ec_%_3%QLLbF9B<}xBNNdDed*_qbmqa>b5s_9`nkL&Y zB+u*d{G23B5yuI}6JNH)NrEIvFdPh#q+a)1231a}))~RN{JWjXhSJ(+B!eN0sbPb1 zr=K3MYYZvq-QT7a&t0MI*Ywa@V>ljpc^muPEXsKcPMV|%R?DT|1Hmo&C2RJG>I?_T(#lqXdN+MziA(JGb zbT}gN2AUlEl(MV+L@yhhnpWr!_2@3DR+h!*;~R^rDoP+Pdu?z+v0Ne<4cCfa26m{8(_ctR0WsuEXonK;pehPNGOEoWnQRDM3AGd0a{ptqb~B3mwQv|?(szF${~m!_VaDTVZOlkZwd zgn@3+QRmR1GN`K>by*@F4AxR}FZVf!Ks=dD#5-@jW&cKy4e~x+{-npCIsiDcrxr+O zSrv6Hs;UMLx&3zn)M#&?r-w&~;@E@d>o1>n1mIh@LcO)n?{}s}v}v5_uU#TZhY-R` zvphdL_6*<94zGhcWWzLf)}qRbAi3+{tU2!?Ci#hVV*co&hi=%7hKwbg7 zZcmi{oLTt$${19kQ&k$%mI2LmDj{G3(JpbzMAdd`Yr#>S}G2P$C za5%(ZFhCM}VqqM*ZBZ0^HP4VOb<4IZsn~1Ew6DBw)9vMkeSOOg?rXTVrkT@p+@d(T z_3Z0zM3mbSb-lj0WuRA8n4tuq;K912$-bPQ{}EmduO3D@8-Y`xovHOAvid4?*_U`>s>Dp6Mjifo0t zu5o@oyV0ofO=L@^$?8J)%!I|6g_0IsjHz=SI*eL0L8)o|H=VXC-(#ngZopWjbij~? z9y=OOkfaHcI6<7m7z~DpqPPu0O6iv5*lm~IwrqP--ATtT7=GTa+@{wMoZ=+G-rm$( zt8XFCzI;*XhF7MereY*7 zu1NCEog4vhKk zB5#SA;qx|w&{}#ImRRczDc#15a%6JwXb$u5_8n{OalPiAeV0R> zx)GDt!^8+9UhMqUPN!3x9G{{rOT=*uSKC$s+dAJ!(oqc2kcFv})V9!^49&(uRG_yB%yTW+!JD?e8I*ErP6W82GIUFWQ!` zP-F|(AUl#}1!l7a^1MJCRfz z;WAVh3G-?S)Wis8>)_zXni^~^CrKjHBr(0Fn(GEA>LBP0Kzi*VBmf58a=7TfWg278R4~%T^l*L zU27YeS<|rSmRlTTlN*x@Kd#}88mh|sNQ(BJ zcAsMdMk<^DiAE6tEC6qq3g%$T&QTOm948HP+-`RJ))`cjMM(l!3L&H`q3C82`#x(ZtV_@nBBx?+c zYyneO!P%rnU3wq3`D_7Z#^uEvWm&ekM7Lymok7WkjZ6UYvTXT9U58(EO$R!GsV&6< zo}`sR6v_o(#>qB=*v3B+g2LevAsHkXjm8*^M;ML9UWzvuFgSL|iww)vvMr0W))Mhdbw%uUwh1=DBqx%bQS;jaT~`#&3Y zZJSq4eqls>M;I@;3KPWk8@->AyJ;L{K&D8pt;24{yQxb_I`@ zcjBhDu;ft5Z6L?JY}1!y9J+Y6<5fr=Ymx%sP7}nf12kJdLrG-e#9Bes858m@W+FjK zNz#$tz@4yWl(zw@HBEpZK}5ni$F*^!YKw}5ki;xOf&nttGBI3~#9}m=l8&NKx=Ei? z`8&7<%EQ8G+Ln8JQw)MX{RYeU_bM=jR5vW5vdB>t8Q9s@kf18_z%s8k3s_d9tH(&^m(F3UTD^!9|#P6deIP z(UgjzgA~j`);JeCxUhj-*YVj|-*%SDE2KAur69ch?z=5M(i$1`3_Tke86kvslHP)K zSsOS|&LPV(RAm*c({4dH=C#ECx&UgjSs$nx4cje@IOs@Yy1)1GRa}^c*shDoUAMK( z(wHesS2T8Q21II2acRn95}|DN2Dxk*aA1ZbkYG3$VjM9DECf-&?3zk$W6-Z#;#stc z+mP0K+;d4K8)vN$B&}oQMUFhr**Yhf*_CC*)A3kN@7%$7x<^6Zh5C_RN7`N_#&H{$MNfI5o($j4wb#&o)e{eykPQHwx zb*`+%muMrgVh$youjI%Tvb)VIVNVNz3CqAz4Z=_Cu48rvnFYFPHDn;Ji=r$L0Oh9 zzV!Q6x>;jjsuERIpe{0xKbXc=+hBINKvmUPEi`!)c)+et4uJj^#2AJ zV_}>F!)pkDu_)EKOi)8T6s-@|{-SnH>yA7>&o6Or{u(M@W*i)hrqe z66h#KI!FWOD+DDHAR)P708qe?C{%7N9b7QZYvgN45ZJm7;NC4WdRa#|Vr|B%>myYw zsNZw}vC&3<*>(*Q>Y;bDQVu3V{ya7Y!db?mQ0U`5I7>q}lO!tr`o_{nPjS(r0 zbdVy6W5h}71=WH)?0Pc_KuGR7FQX$H%q`Qsi4x72L<73J%@V4~a60?8U0#fB2kq5O ze;d-#>zFnnLcYonhr#Z$EIZfJ#h0*F|D=xFH+3l(6o!{W=PPtDn+}-=`~{3PsOzeA zcfP)?qpfTwqV*)fmqn55AI?bSs z9FV%9iUUC1&~FGzda8y0rJ}lE@4kck4<2A|x(6X5&jVEz-Rbye^nPHF${J@@wgdzeo43BKXLn>FbAs+$Z-bW-M^py}ZMo`9~B zCIL!Ix3@Q;;c!Ha(eM=lqmUSl$4HXo2MbP(W=&mJDDxGn+&k!+y71m%wZUqYW3^Zz z%L`P2DET^rQa6Kdup)H_s zEu~Dfjx-4=*x5CoiCjm_i8qRmb)po4YM2GH#=^1n8%!$SVcbNg!cuHHfwvHP{m$`; zA(aF%VLTqgTJN~ha)_Ez$1z+OEViMu*?{CqDNkG-q>$1l5kw9;)(|QI9C`C*W*BQA zB>B&NlOkq6I1!*EK}rU5g{rKPWf|s+1!l83&d<;B^!YJPPtS01KF2Cw`DTWcIQrdZ zc>A5V@ZpC)!%sf=0K?(f1LuzYxGLF@QTeW=sVZE~&hhZeZ}92wKI4;%bF!x7BueP; z?h7hbKfzCb@&WH39JS04tXbsL4^TS%xk2pYI_KWJ3q(YTj%jbYk2s0RCsf2C!wSfj zz;HA~9L1pp{{3f5%#3U?L%z5~RTXf?TOHN4fvF7^ixp;<3*>p;>Ds;CpoFH3WQSEz zqB3T?N(-T+ZSv*Kb!~MOz{mI@`q{%=E z!e*({E9*AnZ)3sDSSKA+EEoW*c3#KFNnrjrSD6!$Vq-dwfR{q4<&Ye*?D8jpfq z7lGD#dK*moX1>i^)Z12>Qfki$V|KW>Jj3zv3lw>d(P)GR5ANaM@CaH*a85wTs|FW4 zdxq3?RQ7BKQ|CCpxWvWTDHe+*R#}NGFR)szFq_SBdU}q_*&NG7hN3KC*@76jIKRZx zr!VmM$#Yy>Uf}0H{{tKy-tpN~GhEluQLMpYae+tQeuK|G`wU-w{WTV=6|*y>mEzfQ zL9mvGgOqiY5Ib(FID@sbi`Rn+!AW+ydCjL^Ym%@3+esmLI2wt`bPr1Dh7&?kX_iWo z5QITG#9)vHXA}P30+T1NtxzoIu-2f+mhJvE)}mOJI5|E;mU%N#dd@4x5X zd;dMUf9HPC-QElr8&M>bsUV+m6h(oP;}d-P`Db|a=n>|#8Hfb-_osOK?YHs4Pk)BH zM|Th>$rZV1>R=_n`tw{V4PVRmE}$a`fMKmeQBYF1CF?F@dQDg;*+RMtY^W~^vgQ}{LcteElshE-q1-8eofxBo}o}62#-th@xmfRb7b= z_S9vSL-n{&O-FB=I|~yLk|YuP`-eQ9PK1ggigd(r6j72UB&39rqB9r7ukvl*BB*ug z_94-+b?$`9HGMsfpw(+y`Gq1Vm@ zt>Z%jw|4XO9zTYA7!<*G>f$uPbblX5ckkkG{|M9lDaMnL7i<%vH@xkG5V30se4aNH z^suCW5NiDuIY-Vp<4kpW^5XfYAAS7y^N&9Ic>47D)A!4&97_mse0q*$wv*fvTz?N#OX!DPA0(;=>PrieLQV=Xmho zEhrhmIfe~QbKW9%LTeT#2#g}n@Z}d@;&1=%H~9SXuW&h^dAS$oJMBcG)xo#U6IEN2 z5MGzFMOotU<7YTIJIB}GJjSnn^$UFP)1TnZog>6?gw<+=Cr_T^*T4Q44UN*fm1+jvF|aj`%16ZjIX-Z5|CacnS!orSk2uTZS!SkBIa*#S_M70Rl{ z+37i!^Hm#^=ru^(cKJdkkRy$CsGSX#;JoqqX(R4l)puyx(80Eu1<9sS!qka9%%0l8 z8%hzKPFYB)9M&TWUXDa#Fc@Gk8elLSKqEp6QM6HG#SLjnrze~<*ie|NtpYi-T8 zK0ZG^{q0}>^kBQJ}6$EEWs=^rt_?Pk!fg(|NIMl@#RCDot?wfrWe=qUw(~e&yVroqfhYedv9TH zIz?U;c=q%K9)0^1%jFVv?KYB?K;EQ0FZkIrFI7F8FS<$w8S2Zc^IuUpNa!Q9H5Mj_x7C4Q$bm;uRTZ-N0<+5t zD6PIp(&Q^4#7Gbw3KDw^i~wi?leg10KHzz27?f2V+Pt2v?85j%qaXgd=m14kZIB~@ zO_ud;huMA(#qEhMgkFq_Zu?YH0J;n!c|M?d-z-hTT5?%cVHG#z;P;J_X8-;pnky7^Tf zmEx(+eNu|rkl`1adJ_{~Qj;j_;_$I0=rAE9Z!6hY`lVdofmQKBeHTwKiX?CCT7 z_P4)<6atIY3iHLv4RUUwM&h}rgmGyP(C@%|le0(B| zwX!2tM+l_xE=W$jtZ8$Am;fmhr%B4=$&@D32}Yw4>sW_{Xi(QBsv!jPa+5Uqru1wc!HmIUMgjMpE8 zWN^gHBkOqL*o~}pBkNq^z|xBiHvCA>pQ=rbsw_Fr@_Mz(3az6HQ@d{*+i!}Zc$}BT zi6Bu$N{`ZXaDO-&z8yv41AuIAd)(bkC@wEMba?YYGOPpU^;L*3=;-il~!o!CTv0N?#p0n20XLRaV>IGP1 zFq_XY3x0#^bwnFf2xdlY4HnBK9zS{tL4>*tnbiFUh~qSj<20cBn#w@JN9Sy{#FMAb zaD04%vJIfG4|jE7{oV9k~^f4Mf>VwU~l&u+|!b z!GOlou^0}ALTU+PYE)%~Y`Mhcsc!%P1rMv!y2 z{x?aS{9UA@Q>o%3*|BQh@0`LGp+6kbWDK@kJ07R&RmC@^9bo=Zs47rvSs*Vis z=IFrfp|u7GS5iVt#Y#yhh;kxvL4-2_ya3~waXd5DPpW?yW4=@-Ee4AV{hy;wSk>?qnKYxM0|M>6m z`4?Z{^yCypQS{c$Rc3iNkT5gKvOsxK;Pm7az$XBJG)XZU4ZVTF-W22U2x*cc86-&K z#M3I06j2iSZe|=I))BPwGQ&#A)~?++hq5eic6x@dzx^6tefbq0Kl&Dn`O<^$w1WZP z2MjmX&^AP?i#Pi*J7Z;V&P*_168jN5jF7iR6I;l(ja` zR?G9pPadCt{Lx41(W6HX@}juI;J9-*lJAtYv;3&*8fRz6{Osuynoh^iN<%4sx3YYN z;}_5I#g|{=^Dn-@$?-ADvg!b|YZ1JcX;?JR&5Im)k>lj_wEYgG63|*fs~9@cND}XV zmn0F=L5egz@8&u%>Z-!Y$uYk8>MJ~Z^6XVzfnVnb;a%C( zj(=m-!J2@LIT&IhNFu?((2%84?AW^HY9Xrgl8#?I$Jxm#E@v~WR;yr7?b?2^hZ@98 zN%2V%MSn9$@ADWp7&b#$Dj@kNqE=UVEol$3V_ zVV@wTg5;P$x;B=VtE?zZodZIwR?G3p>6uzAmUoRY?=oYL!I5)(FW+4(mTx<2M;*ouHQh$; zf$A3*m-zbYZ;+-b*fF9w@vZe2FYwLRU*nr^zQxIl7rq1mEgY&dQiNrJ==gxxyp! z6j`3(`HK_0`_9{V@YVxNCR3!Tr(76oaCteym!E%y-+lHePS4JN&}oh>85FiK$Gaf8 z^nD|u--c{Oc0h9?BIQeS0j;$d42QITuBl0ct2#@|$?dbC(9XtBzFT$%bq z>)emP?hb$f00oBNjqJIhEf6zM3!R>)R7ww|l&O?zAf-;2 zNLp(-%X7@;vvjq}?if?wcg_vrU45Fv$r4ZyVWCv?d@ve(J)KNWhl62m46FHaerGYC zeNYtnyUw`@vmY{V<#pO2*{-jW$K1x_A-(n1+j#HYcMvBjR(X!+PoLt&i{qfAT5U|% zagU1d=8pC?r)Z-+FVMlI#Cqnq+f8mSkl#S|w5=Rm16o>2BuR|PWQ?Q3L+tHMF&Yh_ zwL)1|I6J?P-= ztSiH-<${)37K{S?U<~=ma4SfB9Vzv%Mrr)7)4^cwNc_|Se+cl0V7|-1#BV~@ zese(HwgD^zA=MGIQXcTU;dZx10MI0Q9+a{Qu4J{NZA;n5>HOSH_w@X1KdxjKU$&*`&0l+pSrd-JocQ zs3fAf5aLt`I#W_!Dy3FhsY)p+w9*NLN}Y3QQB|Y7C`MIP9av}f*>M~)zs~q5903l5 ziivUpFBHj)LC!G`8N3g6qXz!#OxshJ97r3?Ng^o;gLHs{y*)@BqbN%(=X2zF4r9$G z>-u}IKl(Vzy3ue)c%FBgK4b_zi5+E%Z zkqIIbf*vMO^nV{D$#0@KN*swl1Mo|L-)0{OQwA$=Yj<_4hnJpJ9>3@qFkZLdT<8!n zGgd()%{sT)ed7%x^Lm(*uK=0sF^n+s;YUiCutDo4#~|xmJG8EaWUUpnkfk8`ke&PY zS&@HsHk%FeqWqAO}W(6PvkGFlf==ce1<=X2vx{{RzirS6e1HsW=cvX zA+)h>Y;8R@)=ivqLuOy*cQUAUfTk069Ieq?0wB0Ef61YBw3+R+T~zMS;2_|w%$cND zqzo9}rnv%s0Q)i8BG$J4dylMj(q--`J27way51m=)0^LEwY3DvApF;8q6fuM-Ygq` z;4+W51S;F<)J?c^AijA z0hsrCMA<8lVuzd4z&t_mt8+T|?V*UF85l6I@2qv!x|+ylHBnANSb!uumoPZ-gM01w zxFH(Eo9TjNpG|hQX-^=08_&y+%xv&N9W$!RfMK>6KJs^hoW46Byw?cn&;>S}j(g&6 z{F>pX>%voLK%kA{VRbt8L+Io>QZB9X!}{632N=|Kz<4k0dOaw&D-~lV3U!6(FzP6* zHX;wC6A>9f;;T5)|9X%PK2bV4V&Xqy&tG}~U;^goWr7pI4`D`11$SC`V=3pHLv1XI zx(=+{UH)X9DUuB(A?_;-QMXKyL{LgPDWsKxDk92>s02{KJHkt5illJEz)w;FB#7C0 zH;2}v;l0;-lI7e*Q%Oo>_i9LR^djy}Gyoy5~kv65Q*Sm(`EyDzX6*E#|XTzx@ zyQL)GW^MV|FTM`?oJ+}`#4SWh2&^WuN#M}vRuQlRXf4E%%a^rk1%N%h;N4)qR> z=2+n$J~+{qQm^^Du8KkPGeUJhsz!FDqoB^TDVy4!)InDUM4&yXLZlQT?VV|N)qy^V^C_&g4tZ6gHpVMb?qYRs zI_zBKr*yVWcT7c+fKrl`l$J=&s$vC))>2`sl$ZdH>->`(sKt0;;t?N|3Ld3odrTW^16*PZ8P`%VJHUO#o)G- zeSK|Yfxv@8Copx(JnrC98`kEu?qkG zN+X0=g6WbipVZEtGxN$Z*UW6e&f|4TXeq={kUS7V-UTpWK!Pz5B<{yrlTD(6*)HMS ztafh1jCc*|ukmGmnZ+B@qu#VWwX<4a8SX%Pdhv~IhUSp!zUa#>b?!_vQ*Rk^E850C zV1wy)fvU;4>HDhaZoH|R`9IN>%=HH@o3~bGw4=nc+p4$*`{?@OIjmd#T|i50#wHjk z^}ier2LD5n#_s|6D}aB>gekZyBTO4PJZ&k>gdk|C5Gx(#r|9ZEChy!~oC_l-b}hu; z`_wyYkY-Cz?*zvBITb_`5F!APl42a|h>fw<7*o}bOpwy-0MzsffnYsc(VUpH&IYN`=HS3IZ+b)A z(WAu9+VVTDPj1Rm+E9|*NMQeAxZVFAUgo-!*hL4J>G$m-X-7w|;XT=YM$wdb20*d} zBf7Hhnc;|Vsg(X7M&seXO``Ze0?~iY%s&DUZ_nrH%9krhK#DN-p(K=4UM`h7c055O zpTVeWi^>=nYXVE1H-Pb5$SCbzWx?WyH_AXCBqae_5J@4NfG{8~*tpEtIxlVIs@iB% z8)co*3<$yAHeL`JsicV_J&(0o#8IrZQZW%pBH^S|R%s1U$x4tg3}?A>M0Xp?uZpHN z&P9#lFHxr*-Vscqo=`4!=bx_?jOKqR5$T8D)VEv89rqVnL;Li7T*FJm^KIo^_s_2L zcdjY%;OLd@+bh45TulZR*I#N4usMBuJ(pQGuKb z84h)!{8!z?&0Xp+DLOPNCT3#txa8L4le+NB|Nrr(0?u_J&b*}zy7~FshJN1BDSPwR zust|&r&4oU{=Ey5w^g0$yrAs`D(VHQLTUNmkH_QxK2GAF66n8T;8*O&Qf@@Zq>zZT zcdcy{2xv!{VjTy4B?A+9Olu=dx|%k1g_p6$Gp;BnULDY6Y|+st0+bLWr8l;eBmlr# z$E9;TGi(=iZERW96JzYeIy-Ufh6F^O-^IRB<&|M-kf=;;^0KTlA;nTku~0(h!~}M1 z1z?;P>F!u1tb1Osj8gErzHUU~xQ*G|hgACOiut>roWBpJ_wU2=Z?pM#l|ksiEZFk* zz;@GtT>+pER&UE@-o!QVmiM+j49az{SMB%$y7DUo!n0WG|I2th{*8{3zXIG}0(dL% zny!%nBPbyeX&GE=<+YB93_pHS8H3ucF{T|aA9@qp7Sc6t9-VFsf!joDO~?aFDM?ES zMbhghft|Cqvh3!@y0faXv)a@HV@ztDo3O(ajA59Wlbzg}8F0kTSwiI;*RZw}M41q@ zBtiv-4Dqx@X`0fQTh!=PPcH7*#)i)~o@#IZzN#&6v>7u9Ptqj$zmCV_ znNsTi$n5?xGf%F04v0Lq6e*2J$=>X^C6d!(x0a3@IXlUSIq8b%osH7t!?372!U8@#LC;9(=|s1!!wJmHK?uE z@ebWEbaC4zh^*(km^#_TRxpleO$~3~->WM$Nt_Q#!Dt|iuyEs;XdSb4&eYZ}tmCK5 z{5xyyZ}PIJ%BuLI+L#|Z$8P~hh+5+b9~r$hun3(r@3!c#RDhryNCoVF(8ga1JSFaY zWZt^TZ#ubX=gG(1@Wva~lwWMr{W^G4PV*n;=}m9&`TeZwy6mAJ99-`n(2mbcJMNd; zlBxASTR*Ve2B_ZkxwpNB>jWX}2-LJAxM4>y-PVw^O@QhT?Fsl{Q7fdph?6AITKxq9 z?=T}-*GRn~k)SFN2b=AH+ia#fUHxgS^_Pq_u-0yMac*&>j-I%mfolaz1B$|Hs}br< zjjiXFh(cjU)R|Imv#8+0=9sNxYn@$L$1~^nOE5mN&V8B{CFfcG7tWf$aNq}_YuN?F zs8if^T%wp;wAz!#y#TKt7hFqf_?X$DxU~Op-O0sUPCRk#$;U1EJit`kU351;|LVr> z{_GENdh?ddL%ihkZ*vc62X55Q9^4K0fOlj~+k#C$m~IOiv?JJwErDknS(2_fO#0W~ z7na*LrouN|`?jBRz3)K)uw8r7t|k|ia!INNGY_k{%l3yC|xx94g%*;Qyst)VhBv9kM09DPsso%xcEpIBoa)m4?3Rr#~3GXIft?oZ(L(d9I__aV2;rKHub&yXosj6&fYMc(#Fp2jYcQ_<_tTfpwAYl9wB_Dx6Ob~! z#Ae&txGqq+8-n(RQH$!Oc&f=zgp^imJrN`lX40W=-(*c91PcfuSP73eDJjD69y?|x z>zu8fCF_{NWS`(b6||0-xpnH`o+FTFJ5w|D5daxq=y9vOOx_K?L4mPOrO?dQb7x+s zGaADoQ8CP1JD_BCOUJx$&RtsT&W*8`#+te;${*Kt^&{u_M*!|`shj=fw+bWF8Q|TB z$xL1apkZ>at#EyI<@#Vafh_wVg&P+8t_9()$x2@K`E8nAta;_40giQjvPC-&XIM_TI*oL zwi7}q64Y!=AE(x9rimtP)5^7-_LgJpN0$X0kst~!I7iIQct~(+>fut%j@LA50yzd- z1{nf!I4-~_EW4$%ZfUHo>bj0=W8SH2GcnfQWyTS_h})aUT>%ru0r>EP3W$+fDns=P++b}5m67RolHq~y)P;PU2_i+;OlJ{U+ z;G=8GExM-6+O@I!pM4kCXDgp$N2haFCfUyhu_Yk&|Ge#>;Tpp_rmPI3O;L|v47Ygg+EOZSY2e-^fUf1cp3&iFgRv~VA54Lse z+!m||x3~w}vYKtw0<)z=rX7KQ8=mBL1e2!3k~=ax-f}Oy8H(tE+@^Pr#g;O^AEb6= zpnS{HuK!u<-e=kPuCELWQ~2=480pwKYb=BmA}B0cB1mF#3?HAE0qeU%j-3;}l^%e0 z-?kUh39FQpl9d%gwjDO+)@IN(#+1%FW37|U893+I1?9GonlJ=G8o^RXQc|*#3POs2 zGf^lDsUZ>tK}~Lf^MIw*5YWy!SaxKc)yA6Gcsndo7q7(J0fNmEi33R z{+mv3+L1xHUIt;ebj#choMqcR;9el>Z@z8!pzCtG?H*hQV%y%I`Iq>va&qM$l`5x|y-nGIRM5+q0n(dq{<*s)`0oh4@-8DoWW z&N_C~nJi^MG}=>ajUW=11xYArA*COokZDGRXUbPS7w?3Pyk7XAwpv)@EveAhJT7_Y}@uWQY3!yvFD zbE0c9iER{s{zi~HFb3MuI^K19+a2kBKR9mdc+rlQ|F+B#J2pihH1B6H4!h^ZMDI0e z2guD^HYHtyEA`8%U1eO2tCJqrbxa$~M{Wsn+rV?$0shxF92~ncs&0UF+Yk5lwKslN z^~;6O^){i?+Vmv@CtS<^2^lwQfbHLqaAJS z?uon$l-;Ef-Iu}WmlWIXf!WcL?}MVEbINuDqumjBc5$L;OHg!MO3rOr6}AN7ZQw0> zWz}`G2<`>7KHfq%lyluo&+aI1yBVYFblI4~KxrhW#=M56i&}I5kOwU zM%@5EX|0;i0_4S#zzwL~bpPp^6n)#GbWH}frGD@H&LRX#5#Hkp$VZJBrT-ajp!#s< z1^JAoJ53|5>8j8UK2LjpHjD^17tgNt{I)EBdmGB_=uFWy3!QcVth+Y)F0dHaaGCg; z5@1(Xa$6AD@%?VyfQ;+qJb26V-8F^0|ZHGA{SZ~rr>oY)O4*Jb#-9@)sq2noq*bi zu5APEwsmm&r>(sj6qw8|0Gaqk|U5fOa^ zVA^>B>fH3MR+8#S?29coowsy?`U_m{sJBILvGjw0+)~=02eQ%@0FJKhas-c>j!=~2 zrU|fVCgiRmL85o@H(hgpZYx`54=B$SfRo;f%PVh0klcXX z+ZW+YIyc)`%-3~j#18C$dqHU%=u0=_2JC`U0tNa32i>RcrMTXPv|CPx{%5y4I6&BO zigp*g!1keA+yDUcmJDH+uD`eeFT#!uOxJv8;u_q-?EuNQv6*Er%M@F%nr-Anx(2xC z8$fuv0UO)3KKq18^teQH104dr^>ke($=BeB{q>1!_+@=SUtGhd>ML4^Yv>;RfV@qb nrU|6#n)mE>j2i>b+5c|<7alJw&b*Qm00000NkvXXu0mjfX - -#define GAMESELECTSIZE 30 - -/** - * Constructor for the GuiCustomOptionBrowser class. - */ -GuiCustomOptionBrowser::GuiCustomOptionBrowser(int w, int h, OptionList * l, const char * custombg) -{ - width = w; - height = h; - options = l; - selectable = true; - selectedItem = 0; - focus = 1; // allow focus - coL2 = 50; - scrollbaron = false; - listOffset = 0; - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - trigHeldA = new GuiTrigger; - trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); - - bgOptions = Resources::GetImageData(custombg); - - bgOptionsImg = new GuiImage(bgOptions); - bgOptionsImg->SetParent(this); - bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - bgOptionsEntry = Resources::GetImageData("bg_options_entry.png"); - - scrollbar = Resources::GetImageData("scrollbar.png"); - scrollbarImg = new GuiImage(scrollbar); - scrollbarImg->SetParent(this); - scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarImg->SetPosition(0, 4); - - arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownOverImg = new GuiImage(arrowDownOver); - arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpOverImg = new GuiImage(arrowUpOver); - scrollbarBox = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); - - arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); - arrowUpBtn->SetParent(this); - arrowUpBtn->SetImage(arrowUpImg); - arrowUpBtn->SetImageOver(arrowUpOverImg); - arrowUpBtn->SetImageHold(arrowUpOverImg); - arrowUpBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - arrowUpBtn->SetPosition(width / 2 - 18 + 7, -18); - arrowUpBtn->SetSelectable(false); - arrowUpBtn->SetTrigger(trigA); - arrowUpBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowUpBtn->SetSoundClick(btnSoundClick); - - arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); - arrowDownBtn->SetParent(this); - arrowDownBtn->SetImage(arrowDownImg); - arrowDownBtn->SetImageOver(arrowDownOverImg); - arrowDownBtn->SetImageHold(arrowDownOverImg); - arrowDownBtn->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - arrowDownBtn->SetPosition(width / 2 - 18 + 7, 18); - arrowDownBtn->SetSelectable(false); - arrowDownBtn->SetTrigger(trigA); - arrowDownBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowDownBtn->SetSoundClick(btnSoundClick); - - scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); - scrollbarBoxBtn->SetParent(this); - scrollbarBoxBtn->SetImage(scrollbarBoxImg); - scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); - scrollbarBoxBtn->SetImageHold(scrollbarBoxOverImg); - scrollbarBoxBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - scrollbarBoxBtn->SetSelectable(false); - scrollbarBoxBtn->SetEffectOnOver(EFFECT_SCALE, 50, 120); - scrollbarBoxBtn->SetMinY(0); - scrollbarBoxBtn->SetMaxY(height - 30); - scrollbarBoxBtn->SetHoldable(true); - scrollbarBoxBtn->SetTrigger(trigHeldA); - - for (int i = 0; i < PAGESIZE; i++) - { - optionTxt[i] = new GuiText((wchar_t *) NULL, 20, thColor("r=0 g=0 b=0 a=255 - settings text color")); - optionTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - optionTxt[i]->SetPosition(24, 0); - optionTxt[i]->SetMaxWidth(bgOptionsImg->GetWidth() - (coL2 + 24), DOTTED); - - optionBg[i] = new GuiImage(bgOptionsEntry); - - optionVal[i] = new GuiText((wchar_t *) NULL, 20, thColor("r=0 g=0 b=0 a=255 - settings text color")); - optionVal[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - optionValOver[i] = new GuiText((wchar_t *) NULL, 20, thColor("r=0 g=0 b=0 a=255 - settings text color")); - optionValOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - optionBtn[i] = new GuiButton(width - 28, GAMESELECTSIZE); - optionBtn[i]->SetParent(this); - optionBtn[i]->SetLabel(optionTxt[i], 0); - optionBtn[i]->SetLabel(optionVal[i], 1); - optionBtn[i]->SetLabelOver(optionValOver[i], 1); - optionBtn[i]->SetImageOver(optionBg[i]); - optionBtn[i]->SetPosition(10, GAMESELECTSIZE * i + 4); - optionBtn[i]->SetRumble(false); - optionBtn[i]->SetTrigger(trigA); - optionBtn[i]->SetSoundClick(btnSoundClick); - } -} - -/** - * Destructor for the GuiCustomOptionBrowser class. - */ -GuiCustomOptionBrowser::~GuiCustomOptionBrowser() -{ - delete arrowUpBtn; - delete arrowDownBtn; - delete scrollbarBoxBtn; - delete scrollbarImg; - delete arrowDownImg; - delete arrowDownOverImg; - delete arrowUpImg; - delete arrowUpOverImg; - delete scrollbarBoxImg; - delete scrollbarBoxOverImg; - delete scrollbar; - delete arrowDown; - delete arrowDownOver; - delete arrowUp; - delete arrowUpOver; - delete scrollbarBox; - delete scrollbarBoxOver; - - delete bgOptionsImg; - delete bgOptions; - delete bgOptionsEntry; - - delete trigA; - delete trigHeldA; - - for (int i = 0; i < PAGESIZE; i++) - { - delete optionTxt[i]; - delete optionVal[i]; - delete optionValOver[i]; - delete optionBg[i]; - delete optionBtn[i]; - } -} - -void GuiCustomOptionBrowser::SetFocus(int f) -{ - focus = f; - - for (int i = 0; i < PAGESIZE; i++) - optionBtn[i]->ResetState(); - - if (f == 1) optionBtn[selectedItem]->SetState(STATE_SELECTED); -} - -void GuiCustomOptionBrowser::ResetState() -{ - if (state != STATE_DISABLED) - { - state = STATE_DEFAULT; - stateChan = -1; - } - - for (int i = 0; i < PAGESIZE; i++) - { - optionBtn[i]->ResetState(); - } -} - -int GuiCustomOptionBrowser::GetClickedOption() -{ - for (int i = 0; i < PAGESIZE; i++) - { - if (optionBtn[i]->GetState() == STATE_CLICKED) - { - optionBtn[i]->SetState(STATE_SELECTED); - return optionIndex[i]; - } - } - - return -1; -} - -int GuiCustomOptionBrowser::GetSelectedOption() -{ - for (int i = 0; i < PAGESIZE; i++) - { - if (optionBtn[i]->GetState() == STATE_SELECTED) - { - return optionIndex[i]; - } - } - return -1; -} - -void GuiCustomOptionBrowser::SetClickable(bool enable) -{ - for (int i = 0; i < PAGESIZE; i++) - { - optionBtn[i]->SetClickable(enable); - } -} - -void GuiCustomOptionBrowser::SetOffset(int optionnumber) -{ - listOffset = optionnumber; - selectedItem = optionnumber; -} - -/**************************************************************************** - * FindMenuItem - * - * Help function to find the next visible menu item on the list - ***************************************************************************/ - -int GuiCustomOptionBrowser::FindMenuItem(int currentItem, int direction) -{ - int nextItem = currentItem + direction; - - if (nextItem < 0 || nextItem >= options->GetLength()) return -1; - - if (strlen(options->GetName(nextItem)) > 0) - return nextItem; - - return FindMenuItem(nextItem, direction); -} - -/** - * Draw the button on screen - */ -void GuiCustomOptionBrowser::Draw() -{ - if (!this->IsVisible()) return; - - bgOptionsImg->Draw(); - - int next = listOffset; - - for (int i = 0; i < PAGESIZE; i++) - { - if (next >= 0) - { - optionBtn[i]->Draw(); - next = this->FindMenuItem(next, 1); - } - else break; - } - - if (PAGESIZE < options->GetLength()) - { - scrollbarImg->Draw(); - arrowUpBtn->Draw(); - arrowDownBtn->Draw(); - scrollbarBoxBtn->Draw(); - } - this->UpdateEffects(); -} - -void GuiCustomOptionBrowser::UpdateListEntries() -{ - LOCK(this); - scrollbaron = options->GetLength() > PAGESIZE; - if (listOffset < 0) listOffset = this->FindMenuItem(-1, 1); - int next = listOffset; - - int maxNameWidth = 0; - for (int i = 0; i < PAGESIZE; i++) - { - if (next >= 0) - { - if (optionBtn[i]->GetState() == STATE_DISABLED) - { - optionBtn[i]->SetVisible(true); - optionBtn[i]->SetState(STATE_DEFAULT); - } - - optionTxt[i]->SetText(options->GetName(next)); - if (maxNameWidth < optionTxt[i]->GetTextWidth()) maxNameWidth = optionTxt[i]->GetTextWidth(); - optionVal[i]->SetText(options->GetValue(next)); - optionValOver[i]->SetText(options->GetValue(next)); - - optionIndex[i] = next; - next = this->FindMenuItem(next, 1); - } - else - { - optionBtn[i]->SetVisible(false); - optionBtn[i]->SetState(STATE_DISABLED); - } - } - - if (coL2 < (24 + maxNameWidth + 16)) - coL2 = 24 + maxNameWidth + 16; - - for (int i = 0; i < PAGESIZE; i++) - { - if (optionBtn[i]->GetState() != STATE_DISABLED) - { - optionVal[i]->SetPosition(coL2, 0); - optionVal[i]->SetMaxWidth(bgOptionsImg->GetWidth() - (coL2 + 24), DOTTED); - - optionValOver[i]->SetPosition(coL2, 0); - optionValOver[i]->SetMaxWidth(bgOptionsImg->GetWidth() - (coL2 + 24), SCROLL_HORIZONTAL); - } - } -} - -void GuiCustomOptionBrowser::Update(GuiTrigger * t) -{ - if (state == STATE_DISABLED || !t) return; - - int next, prev, length = options->GetLength(); - int old_listOffset = listOffset; - - if (scrollbaron) - { - // update the location of the scroll box based on the position in the option list - arrowUpBtn->Update(t); - arrowDownBtn->Update(t); - scrollbarBoxBtn->Update(t); - } - - if(options->IsChanged()) - UpdateListEntries(); - - next = listOffset; - - if (!(t->wpad.btns_h & WPAD_BUTTON_UP || t->wpad.btns_h & WPAD_BUTTON_DOWN || - t->wpad.btns_h & WPAD_CLASSIC_BUTTON_UP || t->wpad.btns_h & WPAD_CLASSIC_BUTTON_DOWN || - t->pad.btns_h & PAD_BUTTON_UP || t->pad.btns_h & PAD_BUTTON_DOWN)) - { - for (int i = 0; i < PAGESIZE; i++) - { - if (next >= 0) next = this->FindMenuItem(next, 1); - - if (focus) - { - if (i != selectedItem && optionBtn[i]->GetState() == STATE_SELECTED) - { - optionBtn[i]->ResetState(); - } - else if (i == selectedItem && optionBtn[i]->GetState() == STATE_DEFAULT) - { - optionBtn[selectedItem]->SetState(STATE_SELECTED); - } - } - - optionBtn[i]->Update(t); - - if (optionBtn[i]->GetState() == STATE_SELECTED) - { - selectedItem = i; - } - } - } - - // pad/joystick navigation - if (!focus) return; // skip navigation - - if (t->Down()) - { - next = this->FindMenuItem(optionIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == PAGESIZE - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (optionBtn[selectedItem + 1]->IsVisible()) - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - } - } - else if (t->Up()) - { - prev = this->FindMenuItem(optionIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - } - } - - if (!scrollbaron) - return; - - if (arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) - { - next = this->FindMenuItem(optionIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == PAGESIZE - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (optionBtn[selectedItem + 1]->IsVisible()) - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - scrollbarBoxBtn->Draw(); - usleep(35000); - } - if (!(t->wpad.btns_h & WPAD_BUTTON_A || t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A || - t->pad.btns_h & PAD_BUTTON_A)) - { - arrowDownBtn->ResetState(); - } - } - else if (arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) - { - prev = this->FindMenuItem(optionIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - scrollbarBoxBtn->Draw(); - usleep(35000); - } - if (!(t->wpad.btns_h & WPAD_BUTTON_A || t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A || - t->pad.btns_h & PAD_BUTTON_A)) - { - arrowUpBtn->ResetState(); - } - } - - if (scrollbarBoxBtn->GetState() == STATE_HELD && scrollbarBoxBtn->GetStateChan() == t->chan && t->wpad.ir.valid - && options->GetLength() > PAGESIZE) - { - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, 0); - - int position = t->wpad.ir.y - scrollbarBoxBtn->GetHeight()/2 - scrollbarBoxBtn->GetTop(); - position = LIMIT(position, 0, 237); - - listOffset = (int) (((float) position / 237.0f)*length); - selectedItem = (int) (((float) listOffset / (float) length)*(PAGESIZE-1)); - - if (listOffset <= 0) - { - listOffset = 0; - selectedItem = 0; - } - else if (listOffset + PAGESIZE >= length) - { - listOffset = length - PAGESIZE; - } - } - int positionbar = 237 * (listOffset + selectedItem) / length; - - if (positionbar > 216) positionbar = 216; - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, positionbar + 8); - - if (t->Right()) - { - if (listOffset < length && length > PAGESIZE) - { - listOffset = listOffset + PAGESIZE; - if (listOffset + PAGESIZE >= length) listOffset = length - PAGESIZE; - } - } - else if (t->Left()) - { - if (listOffset > 0) - { - listOffset = listOffset - PAGESIZE; - if (listOffset < 0) listOffset = 0; - } - } - - if (old_listOffset != listOffset) - UpdateListEntries(); - - if (updateCB) updateCB(this); -} diff --git a/source/libwiigui/gui_filebrowser.cpp b/source/libwiigui/gui_filebrowser.cpp deleted file mode 100644 index d2a5e07c..00000000 --- a/source/libwiigui/gui_filebrowser.cpp +++ /dev/null @@ -1,456 +0,0 @@ -/**************************************************************************** - * libwiigui - * - * Tantric 2009 - * - * gui_filebrowser.cpp - * - * GUI class definitions - ***************************************************************************/ - -#include "gui.h" -#include "prompts/filebrowser.h" -#include "settings/CSettings.h" -#include "themes/CTheme.h" - -/** - * Constructor for the GuiFileBrowser class. - */ -GuiFileBrowser::GuiFileBrowser(int w, int h) -{ - width = w; - height = h; - selectedItem = 0; - selectable = true; - listChanged = true; // trigger an initial list update - triggerdisabled = false; // trigger disable - focus = 0; // allow focus - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - - trigHeldA = new GuiTrigger; - trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - - bgFileSelection = new GuiImageData(Resources::GetFile("bg_browser.png"), Resources::GetFileSize("bg_browser.png")); - bgFileSelectionImg = new GuiImage(bgFileSelection); - bgFileSelectionImg->SetParent(this); - bgFileSelectionImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - bgFileSelectionEntry = Resources::GetImageData("bg_browser_selection.png"); - - fileFolder = Resources::GetImageData("icon_folder.png"); - - scrollbar = Resources::GetImageData("scrollbar.png"); - scrollbarImg = new GuiImage(scrollbar); - scrollbarImg->SetParent(this); - scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarImg->SetPosition(0, 2); - scrollbarImg->SetSkew(0, 0, 0, 0, 0, -30, 0, -30); - - arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownImg = new GuiImage(arrowDown); - arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpImg = new GuiImage(arrowUp); - scrollbarBox = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxImg = new GuiImage(scrollbarBox); - - arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); - arrowUpBtn->SetParent(this); - arrowUpBtn->SetImage(arrowUpImg); - arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - arrowUpBtn->SetPosition(12, -12); - arrowUpBtn->SetSelectable(false); - arrowUpBtn->SetClickable(false); - arrowUpBtn->SetHoldable(true); - arrowUpBtn->SetTrigger(trigHeldA); - arrowUpBtn->SetSoundOver(btnSoundOver); - arrowUpBtn->SetSoundClick(btnSoundClick); - - arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); - arrowDownBtn->SetParent(this); - arrowDownBtn->SetImage(arrowDownImg); - arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - arrowDownBtn->SetPosition(12, 12); - arrowDownBtn->SetSelectable(false); - arrowDownBtn->SetClickable(false); - arrowDownBtn->SetHoldable(true); - arrowDownBtn->SetTrigger(trigHeldA); - arrowDownBtn->SetSoundOver(btnSoundOver); - arrowDownBtn->SetSoundClick(btnSoundClick); - - scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); - scrollbarBoxBtn->SetParent(this); - scrollbarBoxBtn->SetImage(scrollbarBoxImg); - scrollbarBoxBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarBoxBtn->SetPosition(-10, 0); - scrollbarBoxBtn->SetMinY(-10); - scrollbarBoxBtn->SetMaxY(156); - scrollbarBoxBtn->SetSelectable(false); - scrollbarBoxBtn->SetClickable(false); - scrollbarBoxBtn->SetHoldable(true); - scrollbarBoxBtn->SetTrigger(trigHeldA); - - for (int i = 0; i < FILEBROWSERSIZE; i++) - { - fileListText[i] = new GuiText((char *) NULL, 20, ( GXColor ) - { 0, 0, 0, 0xff}); - fileListText[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - fileListText[i]->SetPosition(5, 0); - fileListText[i]->SetMaxWidth(bgFileSelectionImg->GetWidth() - (arrowDownImg->GetWidth() + 20), DOTTED); - - fileListTextOver[i] = new GuiText((char *) NULL, 20, ( GXColor ) - { 0, 0, 0, 0xff}); - fileListTextOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - fileListTextOver[i]->SetPosition(5, 0); - fileListTextOver[i]->SetMaxWidth(bgFileSelectionImg->GetWidth() - (arrowDownImg->GetWidth() + 20), - SCROLL_HORIZONTAL); - - fileListBg[i] = new GuiImage(bgFileSelectionEntry); - //fileListArchives[i] = new GuiImage(fileArchives); - //fileListDefault[i] = new GuiImage(fileDefault); - fileListFolder[i] = new GuiImage(fileFolder); - //fileListGFX[i] = new GuiImage(fileGFX); - //fileListPLS[i] = new GuiImage(filePLS); - //fileListSFX[i] = new GuiImage(fileSFX); - //fileListTXT[i] = new GuiImage(fileTXT); - //fileListXML[i] = new GuiImage(fileXML); - fileList[i] = new GuiButton(350, 30); - fileList[i]->SetParent(this); - fileList[i]->SetLabel(fileListText[i]); - fileList[i]->SetLabelOver(fileListTextOver[i]); - fileList[i]->SetImageOver(fileListBg[i]); - fileList[i]->SetPosition(2, 30 * i + 3); - fileList[i]->SetTrigger(trigA); - fileList[i]->SetRumble(false); - fileList[i]->SetSoundClick(btnSoundClick); - } -} - -/** - * Destructor for the GuiFileBrowser class. - */ -GuiFileBrowser::~GuiFileBrowser() -{ - delete arrowUpBtn; - delete arrowDownBtn; - delete scrollbarBoxBtn; - - delete bgFileSelectionImg; - delete scrollbarImg; - delete arrowDownImg; - delete arrowUpImg; - delete scrollbarBoxImg; - - delete bgFileSelection; - delete bgFileSelectionEntry; - //delete fileArchives; - //delete fileDefault; - delete fileFolder; - //delete fileGFX; - //delete filePLS; - //delete fileSFX; - //delete fileTXT; - //delete fileXML; - delete scrollbar; - delete arrowDown; - delete arrowUp; - delete scrollbarBox; - - delete trigHeldA; - delete trigA; - - for (int i = 0; i < FILEBROWSERSIZE; i++) - { - delete fileListText[i]; - delete fileListTextOver[i]; - delete fileList[i]; - delete fileListBg[i]; - //delete fileListArchives[i]; - //delete fileListDefault[i]; - delete fileListFolder[i]; - //delete fileListGFX[i]; - //delete fileListPLS[i]; - //delete fileListSFX[i]; - //delete fileListTXT[i]; - //delete fileListXML[i]; - } -} - -void GuiFileBrowser::SetFocus(int f) -{ - LOCK( this ); - focus = f; - - for (int i = 0; i < FILEBROWSERSIZE; i++) - fileList[i]->ResetState(); - - if (f == 1) fileList[selectedItem]->SetState(STATE_SELECTED); -} - -void GuiFileBrowser::DisableTriggerUpdate(bool set) -{ - LOCK( this ); - triggerdisabled = set; -} - -void GuiFileBrowser::ResetState() -{ - LOCK( this ); - state = STATE_DEFAULT; - stateChan = -1; - selectedItem = 0; - - for (int i = 0; i < FILEBROWSERSIZE; i++) - { - fileList[i]->ResetState(); - } -} - -void GuiFileBrowser::TriggerUpdate() -{ - LOCK( this ); - listChanged = true; -} - -/** - * Draw the button on screen - */ -void GuiFileBrowser::Draw() -{ - LOCK( this ); - if (!this->IsVisible()) return; - - bgFileSelectionImg->Draw(); - - for (int i = 0; i < FILEBROWSERSIZE; i++) - { - fileList[i]->Draw(); - } - - scrollbarImg->Draw(); - arrowUpBtn->Draw(); - arrowDownBtn->Draw(); - scrollbarBoxBtn->Draw(); - - this->UpdateEffects(); -} - -void GuiFileBrowser::Update(GuiTrigger * t) -{ - LOCK( this ); - if (state == STATE_DISABLED || !t || triggerdisabled) return; - - int position = 0; - int positionWiimote = 0; - - arrowUpBtn->Update(t); - arrowDownBtn->Update(t); - scrollbarBoxBtn->Update(t); - - // move the file listing to respond to wiimote cursor movement - if (scrollbarBoxBtn->GetState() == STATE_HELD && scrollbarBoxBtn->GetStateChan() == t->chan && t->wpad.ir.valid - && browser->browserList.size() > FILEBROWSERSIZE) - { - scrollbarBoxBtn->SetPosition(20, -10); - positionWiimote = t->wpad.ir.y - 60 - scrollbarBoxBtn->GetTop(); - - if (positionWiimote < scrollbarBoxBtn->GetMinY()) - positionWiimote = scrollbarBoxBtn->GetMinY(); - else if (positionWiimote > scrollbarBoxBtn->GetMaxY()) positionWiimote = scrollbarBoxBtn->GetMaxY(); - - browser->pageIndex = (positionWiimote * browser->browserList.size()) / 136.0 - selectedItem; - - if (browser->pageIndex <= 0) - { - browser->pageIndex = 0; - } - else if (browser->pageIndex + FILEBROWSERSIZE >= (int) browser->browserList.size()) - { - browser->pageIndex = browser->browserList.size() - FILEBROWSERSIZE; - } - listChanged = true; - focus = false; - - } - - if (arrowDownBtn->GetState() == STATE_HELD && arrowDownBtn->GetStateChan() == t->chan) - { - t->wpad.btns_h |= WPAD_BUTTON_DOWN; - if (!this->IsFocused()) ((GuiWindow *) this->GetParent())->ChangeFocus(this); - - } - else if (arrowUpBtn->GetState() == STATE_HELD && arrowUpBtn->GetStateChan() == t->chan) - { - t->wpad.btns_h |= WPAD_BUTTON_UP; - if (!this->IsFocused()) ((GuiWindow *) this->GetParent())->ChangeFocus(this); - - } - - /* // pad/joystick navigation - if(!focus) - { - goto endNavigation; // skip navigation - listChanged = false; - } - */ - if (t->Right()) - { - if (browser->pageIndex < (int) browser->browserList.size() && browser->browserList.size() > FILEBROWSERSIZE) - { - browser->pageIndex += FILEBROWSERSIZE; - if (browser->pageIndex + FILEBROWSERSIZE >= (int) browser->browserList.size()) browser->pageIndex - = browser->browserList.size() - FILEBROWSERSIZE; - listChanged = true; - } - } - else if (t->Left()) - { - if (browser->pageIndex > 0) - { - browser->pageIndex -= FILEBROWSERSIZE; - if (browser->pageIndex < 0) browser->pageIndex = 0; - listChanged = true; - } - } - else if (t->Down()) - { - if (browser->pageIndex + selectedItem + 1 < (int) browser->browserList.size()) - { - if (selectedItem == FILEBROWSERSIZE - 1) - { - // move list down by 1 - browser->pageIndex++; - listChanged = true; - } - else if (fileList[selectedItem + 1]->IsVisible()) - { - fileList[selectedItem]->ResetState(); - fileList[++selectedItem]->SetState(STATE_SELECTED, t->chan); - } - } - } - else if (t->Up()) - { - if (selectedItem == 0 && browser->pageIndex + selectedItem > 0) - { - // move list up by 1 - browser->pageIndex--; - listChanged = true; - } - else if (selectedItem > 0) - { - fileList[selectedItem]->ResetState(); - fileList[--selectedItem]->SetState(STATE_SELECTED, t->chan); - } - } - - //endNavigation: - - for (int i = 0; i < FILEBROWSERSIZE; i++) - { - if (listChanged) - { - bool haveselected = false; - if (browser->pageIndex + i < (int) browser->browserList.size()) - { - if (fileList[i]->GetState() == STATE_DISABLED) fileList[i]->SetState(STATE_DEFAULT); - - if (fileList[i]->GetState() == STATE_SELECTED) haveselected = true; - - fileList[i]->SetVisible(true); - - fileListText[i]->SetText(browser->browserList[browser->pageIndex + i].displayname); - fileListTextOver[i]->SetText(browser->browserList[browser->pageIndex + i].displayname); - - if (browser->browserList[browser->pageIndex + i].isdir) // directory - { - fileList[i]->SetIcon(fileListFolder[i]); - fileListText[i]->SetPosition(30, 0); - fileListTextOver[i]->SetPosition(30, 0); - } - else - { - /* - char *fileext = strrchr(browserList[browser.pageIndex+i].displayname, '.'); - fileListText[i]->SetPosition(32,0); - fileListTextOver[i]->SetPosition(32,0); - if(fileext) - { - if(!strcasecmp(fileext, ".png") || !strcasecmp(fileext, ".jpg") || !strcasecmp(fileext, ".jpeg") || - !strcasecmp(fileext, ".gif") || !strcasecmp(fileext, ".tga") || !strcasecmp(fileext, ".tpl") || - !strcasecmp(fileext, ".bmp")) { - fileList[i]->SetIcon(fileListGFX[i]); - } else if(!strcasecmp(fileext, ".mp3") || !strcasecmp(fileext, ".ogg") || !strcasecmp(fileext, ".flac") || - !strcasecmp(fileext, ".mpc") || !strcasecmp(fileext, ".m4a") || !strcasecmp(fileext, ".wav")) { - fileList[i]->SetIcon(fileListSFX[i]); - } else if(!strcasecmp(fileext, ".pls") || !strcasecmp(fileext, ".m3u")) { - fileList[i]->SetIcon(fileListPLS[i]); - } else if(!strcasecmp(fileext, ".txt")) { - fileList[i]->SetIcon(fileListTXT[i]); - } else if(!strcasecmp(fileext, ".xml")) { - fileList[i]->SetIcon(fileListXML[i]); - } else if(!strcasecmp(fileext, ".rar") || !strcasecmp(fileext, ".zip") || - !strcasecmp(fileext, ".gz") || !strcasecmp(fileext, ".7z")) { - fileList[i]->SetIcon(fileListArchives[i]); - } else { - fileList[i]->SetIcon(fileListDefault[i]); - } - } else { - fileList[i]->SetIcon(fileListDefault[i]); - } - */ - fileList[i]->SetIcon(NULL); - fileListText[i]->SetPosition(10, 0); - fileListTextOver[i]->SetPosition(10, 0); - } - } - else - { - fileList[i]->SetVisible(false); - fileList[i]->SetState(STATE_DISABLED); - } - if (!haveselected && browser->pageIndex < (int) browser->browserList.size()) fileList[i]->SetState( - STATE_SELECTED, t->chan); - - } - - if (i != selectedItem && fileList[i]->GetState() == STATE_SELECTED) - fileList[i]->ResetState(); - else if (focus && i == selectedItem && fileList[i]->GetState() == STATE_DEFAULT) fileList[selectedItem]->SetState( - STATE_SELECTED, t->chan); - - int currChan = t->chan; - - if (t->wpad.ir.valid && !fileList[i]->IsInside(t->wpad.ir.x, t->wpad.ir.y)) t->chan = -1; - - fileList[i]->Update(t); - t->chan = currChan; - - if (fileList[i]->GetState() == STATE_SELECTED) - { - selectedItem = i; - } - } - - // update the location of the scroll box based on the position in the file list - if (positionWiimote > 0) - { - position = positionWiimote; // follow wiimote cursor - } - else - { - position = 136 * (browser->pageIndex + FILEBROWSERSIZE / 2.0) / (browser->browserList.size() * 1.0); - - if (browser->pageIndex / (FILEBROWSERSIZE / 2.0) < 1) - position = -10; - else if ((browser->pageIndex + FILEBROWSERSIZE) / (FILEBROWSERSIZE * 1.0) >= (browser->browserList.size()) - / (FILEBROWSERSIZE * 1.0)) position = 156; - } - - scrollbarBoxBtn->SetPosition(12, position + 26); - - listChanged = false; - - if (updateCB) updateCB(this); -} diff --git a/source/libwiigui/gui_gamebrowser.cpp b/source/libwiigui/gui_gamebrowser.cpp deleted file mode 100644 index bd4f0b1d..00000000 --- a/source/libwiigui/gui_gamebrowser.cpp +++ /dev/null @@ -1,623 +0,0 @@ -/**************************************************************************** - * libwiigui - * - * gui_gamebrowser.cpp - * - * GUI class definitions - ***************************************************************************/ - -#include "gui.h" -#include "../wpad.h" - -#include -#include "gui_gamebrowser.h" -#include "../settings/CSettings.h" -#include "../main.h" -#include "settings/newtitles.h" -#include "settings/GameTitles.h" -#include "usbloader/GameList.h" -#include "themes/CTheme.h" -#include "menu.h" - -#include -#include - -#define GAMESELECTSIZE 30 -// scrolldelay affects how fast the list scrolls -// when the arrows are clicked -static const u32 DEFAULT_SCROLL_DELAY = 4; - -/** - * Constructor for the GuiGameBrowser class. - */ -GuiGameBrowser::GuiGameBrowser(int w, int h, int selectedGame) -{ - width = w; - height = h; - pagesize = thInt("9 - game list browser page size"); - scrollbaron = (gameList.size() > pagesize) ? 1 : 0; - selectable = true; - listOffset = selectedGame - (selectedGame % pagesize); - selectedItem = selectedGame - listOffset; - focus = 1; // allow focus - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - trigHeldA = new GuiTrigger; - trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); - - bgGames = Resources::GetImageData("bg_options.png"); - newGames = Resources::GetImageData("new.png"); - - bgGameImg = new GuiImage(bgGames); - bgGameImg->SetParent(this); - bgGameImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - maxTextWidth = bgGameImg->GetWidth() - 24 - 4; - - bgGamesEntry = Resources::GetImageData("bg_options_entry.png"); - - scrollbar = Resources::GetImageData("scrollbar.png"); - scrollbarImg = new GuiImage(scrollbar); - scrollbarImg->SetParent(this); - scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarImg->SetPosition(0, 4); - - maxTextWidth -= scrollbarImg->GetWidth() + 4; - - arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownOverImg = new GuiImage(arrowDownOver); - arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpOverImg = new GuiImage(arrowUpOver); - scrollbarBox = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); - - arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); - arrowUpBtn->SetParent(this); - arrowUpBtn->SetImage(arrowUpImg); - arrowUpBtn->SetImageOver(arrowUpOverImg); - arrowUpBtn->SetImageHold(arrowUpOverImg); - arrowUpBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - arrowUpBtn->SetPosition(width / 2 - 18 + 7, -18); - arrowUpBtn->SetSelectable(false); - arrowUpBtn->SetTrigger(trigA); - arrowUpBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowUpBtn->SetSoundClick(btnSoundClick); - - arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); - arrowDownBtn->SetParent(this); - arrowDownBtn->SetImage(arrowDownImg); - arrowDownBtn->SetImageOver(arrowDownOverImg); - arrowDownBtn->SetImageHold(arrowDownOverImg); - arrowDownBtn->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - arrowDownBtn->SetPosition(width / 2 - 18 + 7, 18); - arrowDownBtn->SetSelectable(false); - arrowDownBtn->SetTrigger(trigA); - arrowDownBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowDownBtn->SetSoundClick(btnSoundClick); - - scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); - scrollbarBoxBtn->SetParent(this); - scrollbarBoxBtn->SetImage(scrollbarBoxImg); - scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); - scrollbarBoxBtn->SetImageHold(scrollbarBoxOverImg); - scrollbarBoxBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - scrollbarBoxBtn->SetSelectable(false); - scrollbarBoxBtn->SetEffectOnOver(EFFECT_SCALE, 50, 120); - scrollbarBoxBtn->SetMinY(0); - scrollbarBoxBtn->SetMaxY(height - 30); - scrollbarBoxBtn->SetHoldable(true); - scrollbarBoxBtn->SetTrigger(trigHeldA); - - gameIndex = new int[pagesize]; - game = new GuiButton *[pagesize]; - gameTxt = new GuiText *[pagesize]; - gameTxtOver = new GuiText *[pagesize]; - gameBg = new GuiImage *[pagesize]; - newImg = new GuiImage *[pagesize]; - - for (int i = 0; i < pagesize; i++) - { - gameTxt[i] = new GuiText(GameTitles.GetTitle(gameList[i]), 20, thColor("r=0 g=0 b=0 a=255 - game browser list text color")); - gameTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - gameTxt[i]->SetPosition(24, 0); - gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); - - gameTxtOver[i] = new GuiText(GameTitles.GetTitle(gameList[i]), 20, thColor("r=0 g=0 b=0 a=255 - game browser list text color over")); - gameTxtOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - gameTxtOver[i]->SetPosition(24, 0); - gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); - - gameBg[i] = new GuiImage(bgGamesEntry); - - newImg[i] = new GuiImage(newGames); - newImg[i]->SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); - newImg[i]->SetVisible(false); - - game[i] = new GuiButton(width - 28, GAMESELECTSIZE); - game[i]->SetParent(this); - game[i]->SetLabel(gameTxt[i]); - game[i]->SetLabelOver(gameTxtOver[i]); - game[i]->SetIcon(newImg[i]); - game[i]->SetImageOver(gameBg[i]); - game[i]->SetPosition(5, GAMESELECTSIZE * i + 4); - game[i]->SetRumble(false); - game[i]->SetTrigger(trigA); - game[i]->SetSoundClick(btnSoundClick); - - gameIndex[i] = i; - } - UpdateListEntries(); -} - -/** - * Destructor for the GuiGameBrowser class. - */ -GuiGameBrowser::~GuiGameBrowser() -{ - delete arrowUpBtn; - delete arrowDownBtn; - delete scrollbarBoxBtn; - delete scrollbarImg; - delete arrowDownImg; - delete arrowDownOverImg; - delete arrowUpImg; - delete arrowUpOverImg; - delete scrollbarBoxImg; - delete scrollbarBoxOverImg; - delete scrollbar; - delete arrowDown; - delete arrowDownOver; - delete arrowUp; - delete arrowUpOver; - delete scrollbarBox; - delete scrollbarBoxOver; - delete bgGameImg; - delete bgGames; - delete bgGamesEntry; - delete newGames; - - delete trigA; - delete trigHeldA; - - for (int i = 0; i < pagesize; i++) - { - delete gameTxt[i]; - delete gameTxtOver[i]; - delete gameBg[i]; - delete game[i]; - delete newImg[i]; - } - delete[] gameIndex; - delete[] game; - delete[] gameTxt; - delete[] gameTxtOver; - delete[] gameBg; -} - -void GuiGameBrowser::SetFocus(int f) -{ - LOCK( this ); - if (!gameList.size()) return; - - focus = f; - - for (int i = 0; i < pagesize; i++) - game[i]->ResetState(); - - if (f == 1) game[selectedItem]->SetState(STATE_SELECTED); -} - -void GuiGameBrowser::ResetState() -{ - LOCK( this ); - if (state != STATE_DISABLED) - { - state = STATE_DEFAULT; - stateChan = -1; - } - - for (int i = 0; i < pagesize; i++) - { - game[i]->ResetState(); - } -} - -int GuiGameBrowser::GetOffset() -{ - return listOffset; -} -int GuiGameBrowser::GetClickedOption() -{ - int found = -1; - for (int i = 0; i < pagesize; i++) - { - if (game[i]->GetState() == STATE_CLICKED) - { - game[i]->SetState(STATE_SELECTED); - found = gameIndex[i]; - break; - } - } - return found; -} - -/**************************************************************************** - * FindMenuItem - * - * Help function to find the next visible menu item on the list - ***************************************************************************/ - -int GuiGameBrowser::FindMenuItem(int currentItem, int direction) -{ - int nextItem = currentItem + direction; - - if (nextItem < 0 || nextItem >= gameList.size()) return -1; - - if (strlen(GameTitles.GetTitle(gameList[nextItem])) > 0) - return nextItem; - - return FindMenuItem(nextItem, direction); -} - -/** - * Draw the button on screen - */ -void GuiGameBrowser::Draw() -{ - LOCK( this ); - if (!this->IsVisible() || !gameList.size()) return; - - bgGameImg->Draw(); - - int next = listOffset; - - for (int i = 0; i < pagesize; i++) - { - if (next >= 0) - { - game[i]->Draw(); - next = this->FindMenuItem(next, 1); - } - else break; - } - - if (scrollbaron == 1) - { - scrollbarImg->Draw(); - arrowUpBtn->Draw(); - arrowDownBtn->Draw(); - scrollbarBoxBtn->Draw(); - } - this->UpdateEffects(); -} - -void GuiGameBrowser::UpdateListEntries() -{ - int next = listOffset; - for (int i = 0; i < pagesize; i++) - { - if (next >= 0) - { - if (game[i]->GetState() == STATE_DISABLED) - { - game[i]->SetVisible(true); - game[i]->SetState(STATE_DEFAULT); - } - gameTxt[i]->SetText(GameTitles.GetTitle(gameList[next])); - gameTxt[i]->SetPosition(24, 0); - gameTxtOver[i]->SetText(GameTitles.GetTitle(gameList[next])); - gameTxtOver[i]->SetPosition(24, 0); - - if (Settings.marknewtitles) - { - bool isNew = NewTitles::Instance()->IsNew(gameList[next]->id); - if (isNew) - { - gameTxt[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), DOTTED); - gameTxtOver[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), SCROLL_HORIZONTAL); - } - else - { - gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); - gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); - } - newImg[i]->SetVisible(isNew); - } - - gameIndex[i] = next; - next = this->FindMenuItem(next, 1); - } - else - { - game[i]->SetVisible(false); - game[i]->SetState(STATE_DISABLED); - } - } -} - -void GuiGameBrowser::Update(GuiTrigger * t) -{ - LOCK( this ); - if (state == STATE_DISABLED || !t || !gameList.size()) return; - - static int pressedChan = -1; - int next, prev; - int old_listOffset = listOffset; - static int position2; - static u32 scrolldelay = 0; - - if(t->wpad.btns_d) - { - pressedChan = t->chan; - } - - if (scrollbaron == 1) - { - // update the location of the scroll box based on the position in the option list - arrowUpBtn->Update(t); - arrowDownBtn->Update(t); - scrollbarBoxBtn->Update(t); - } - - next = listOffset; - - if(pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_h & WPAD_BUTTON_UP) && - !(t->wpad.btns_h & WPAD_BUTTON_DOWN) && !(t->wpad.btns_h & WPAD_BUTTON_B))) - { - for (int i = 0; i < pagesize; i++) - { - if (next >= 0) next = this->FindMenuItem(next, 1); - - if (focus) - { - if (i != selectedItem && game[i]->GetState() == STATE_SELECTED) - game[i]->ResetState(); - else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) - game[selectedItem]->SetState(STATE_SELECTED, -1); - } - - game[i]->Update(t); - - if (game[i]->GetState() == STATE_SELECTED) - { - selectedItem = i; - } - } - } - - // pad and joystick navigation - if (!focus || !gameList.size()) return; // skip navigation - - if (scrollbaron == 1) - { - if (t->Down() || arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) //down - { - if(scrolldelay > 0) - --scrolldelay; - else - { - if(arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) - scrolldelay = DEFAULT_SCROLL_DELAY; - next = this->FindMenuItem(gameIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == pagesize - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (game[selectedItem + 1]->IsVisible()) - { - game[selectedItem]->ResetState(); - game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - } - } - if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_d & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_BUTTON_A))) - arrowDownBtn->ResetState(); - } - else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) //up - { - if(scrolldelay > 0) - --scrolldelay; - else - { - if(arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) - scrolldelay = DEFAULT_SCROLL_DELAY; - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - } - } - if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_d & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_BUTTON_A))) - arrowUpBtn->ResetState(); - } - int position1 = t->wpad.ir.y; - - if (position2 == 0 && t->wpad.ir.valid) - { - position2 = position1; - } - - if (pressedChan == t->chan && (t->wpad.btns_h & WPAD_BUTTON_B) && t->wpad.ir.valid) - { - if(scrolldelay > 0) - --scrolldelay; - else - { - scrolldelay = DEFAULT_SCROLL_DELAY-2; - scrollbarBoxBtn->ScrollIsOn(1); - if (position2 > position1) - { - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - } - } - else if (position2 < position1) - { - next = this->FindMenuItem(gameIndex[selectedItem], 1); - if (next >= 0) - { - if (selectedItem == pagesize - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (game[selectedItem + 1]->IsVisible()) - { - game[selectedItem]->ResetState(); - game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - } - } - } - } - else if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_h & WPAD_BUTTON_B))) - { - scrollbarBoxBtn->ScrollIsOn(0); - position2 = 0; - } - - if (scrollbarBoxBtn->GetState() == STATE_HELD && scrollbarBoxBtn->GetStateChan() == t->chan && t->wpad.ir.valid - && gameList.size() > pagesize) - { - // allow dragging of scrollbar box - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, 0); - int position = t->wpad.ir.y - 32 - scrollbarBoxBtn->GetTop(); - - listOffset = (position * gameList.size()) / (25.2 * pagesize) - selectedItem; - - if (listOffset <= 0) - { - listOffset = 0; - selectedItem = 0; - } - else if (listOffset + pagesize >= gameList.size()) - { - listOffset = gameList.size() - pagesize; - selectedItem = pagesize - 1; - } - - } - int positionbar = (25.2 * pagesize) * (listOffset + selectedItem) / gameList.size(); - - if (positionbar > (24 * pagesize)) positionbar = (24 * pagesize); - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, positionbar + 8); - - if (t->Right()) //skip pagesize # of games if right is pressed - { - if (listOffset < gameList.size() && gameList.size() > pagesize) - { - listOffset = listOffset + pagesize; - if (listOffset + pagesize >= gameList.size()) listOffset = gameList.size() - pagesize; - } - } - else if (t->Left()) - { - if (listOffset > 0) - { - listOffset = listOffset - pagesize; - if (listOffset < 0) listOffset = 0; - } - } - - } - else - { - if (t->Down()) //if there isn't a scrollbar and down is pressed - { - next = this->FindMenuItem(gameIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == pagesize - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (game[selectedItem + 1]->IsVisible()) - { - game[selectedItem]->ResetState(); - game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - } - } - else if (t->Up()) //up - { - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - } - } - } - - if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h) - { - pressedChan = -1; - } - - if (old_listOffset != listOffset) UpdateListEntries(); - - if (updateCB) updateCB(this); -} - -void GuiGameBrowser::Reload() -{ - LOCK( this ); - scrollbaron = (gameList.size() > pagesize) ? 1 : 0; - selectedItem = 0; - listOffset = 0; - focus = 1; - UpdateListEntries(); - - for (int i = 0; i < pagesize; i++) - game[i]->ResetState(); -} diff --git a/source/libwiigui/gui_optionbrowser.cpp b/source/libwiigui/gui_optionbrowser.cpp deleted file mode 100644 index 32086efb..00000000 --- a/source/libwiigui/gui_optionbrowser.cpp +++ /dev/null @@ -1,666 +0,0 @@ -/**************************************************************************** - * libwiigui - * - * Tantric 2009 - * - * gui_optionbrowser.cpp - * - * GUI class definitions - ***************************************************************************/ - -#include "gui.h" -#include "../wpad.h" -#include "settings/CSettings.h" -#include "themes/CTheme.h" - -#include - -#define GAMESELECTSIZE 30 - -static int scrollbaron = 0, startat = 0, loaded = 0; -/** - * Constructor for the GuiOptionBrowser class. - */ -GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollon) -{ - width = w; - height = h; - options = l; - scrollbaron = scrollon; - selectable = true; - listOffset = this->FindMenuItem(-1, 1); - listChanged = true; // trigger an initial list update - selectedItem = 0; - focus = 1; // allow focus - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - trigHeldA = new GuiTrigger; - trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); - - bgOptions = Resources::GetImageData(imagebg); - bgOptionsImg = new GuiImage(bgOptions); - bgOptionsImg->SetParent(this); - bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - bgOptionsEntry = Resources::GetImageData("bg_options_entry.png"); - if (scrollbaron == 1) - { - scrollbar = Resources::GetImageData("scrollbar.png"); - scrollbarImg = new GuiImage(scrollbar); - scrollbarImg->SetParent(this); - scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarImg->SetPosition(0, 4); - - arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownOverImg = new GuiImage(arrowDownOver); - arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpOverImg = new GuiImage(arrowUpOver); - scrollbarBox = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); - - arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); - arrowUpBtn->SetParent(this); - arrowUpBtn->SetImage(arrowUpImg); - arrowUpBtn->SetImageOver(arrowUpOverImg); - arrowUpBtn->SetImageHold(arrowUpOverImg); - arrowUpBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - arrowUpBtn->SetPosition(width / 2 - 18 + 7, -18); - arrowUpBtn->SetSelectable(false); - arrowUpBtn->SetTrigger(trigA); - arrowUpBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowUpBtn->SetSoundClick(btnSoundClick); - - arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); - arrowDownBtn->SetParent(this); - arrowDownBtn->SetImage(arrowDownImg); - arrowDownBtn->SetImageOver(arrowDownOverImg); - arrowDownBtn->SetImageHold(arrowDownOverImg); - arrowDownBtn->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - arrowDownBtn->SetPosition(width / 2 - 18 + 7, 18); - arrowDownBtn->SetSelectable(false); - arrowDownBtn->SetTrigger(trigA); - arrowDownBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowDownBtn->SetSoundClick(btnSoundClick); - - scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); - scrollbarBoxBtn->SetParent(this); - scrollbarBoxBtn->SetImage(scrollbarBoxImg); - scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); - scrollbarBoxBtn->SetImageHold(scrollbarBoxOverImg); - scrollbarBoxBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - scrollbarBoxBtn->SetSelectable(false); - scrollbarBoxBtn->SetEffectOnOver(EFFECT_SCALE, 50, 120); - scrollbarBoxBtn->SetMinY(0); - scrollbarBoxBtn->SetMaxY(height); - scrollbarBoxBtn->SetHoldable(true); - scrollbarBoxBtn->SetTrigger(trigHeldA); - } - - // optionBg = new GuiImage(bgOptionsEntry); - for (int i = 0; i < PAGESIZE; i++) - { - optionTxt[i] = new GuiText((char *) NULL, 20, ( GXColor ) - { 0, 0, 0, 0xff}); - optionTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - optionTxt[i]->SetPosition(24, 0); - - optionBg[i] = new GuiImage(bgOptionsEntry); - - optionVal[i] = new GuiText((char *) NULL, 20, ( GXColor ) - { 0, 0, 0, 0xff}); - optionVal[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - optionVal[i]->SetPosition(250, 0); - - optionBtn[i] = new GuiButton(width - 28, GAMESELECTSIZE); - optionBtn[i]->SetParent(this); - optionBtn[i]->SetLabel(optionTxt[i], 0); - optionBtn[i]->SetLabel(optionVal[i], 1); - optionBtn[i]->SetImageOver(optionBg[i]); - optionBtn[i]->SetPosition(5, GAMESELECTSIZE * i + 4); - optionBtn[i]->SetRumble(false); - optionBtn[i]->SetTrigger(trigA); - optionBtn[i]->SetSoundClick(btnSoundClick); - } -} - -/** - * Constructor for the GuiOptionBrowser class. - */ -GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollon, int start) -{ - width = w; - height = h; - options = l; - startat = start; - loaded = 0; - scrollbaron = scrollon; - selectable = true; - listOffset = this->FindMenuItem(-1, 1); - selectedItem = 0; - focus = 1; // allow focus - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - trigHeldA = new GuiTrigger; - trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); - - bgOptions = Resources::GetImageData(imagebg); - - bgOptionsImg = new GuiImage(bgOptions); - bgOptionsImg->SetParent(this); - bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - bgOptionsEntry = Resources::GetImageData("bg_options_entry.png"); - if (scrollbaron == 1) - { - scrollbar = Resources::GetImageData("scrollbar.png"); - scrollbarImg = new GuiImage(scrollbar); - scrollbarImg->SetParent(this); - scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarImg->SetPosition(0, 4); - - arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); - arrowDownOverImg = new GuiImage(arrowDownOver); - arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); - arrowUpOverImg = new GuiImage(arrowUpOver); - scrollbarBox = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); - scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); - - arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); - arrowUpBtn->SetParent(this); - arrowUpBtn->SetImage(arrowUpImg); - arrowUpBtn->SetImageOver(arrowUpOverImg); - arrowUpBtn->SetImageHold(arrowUpOverImg); - arrowUpBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - arrowUpBtn->SetPosition(width / 2 - 18 + 7, -18); - arrowUpBtn->SetSelectable(false); - arrowUpBtn->SetTrigger(trigA); - arrowUpBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowUpBtn->SetSoundClick(btnSoundClick); - - arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); - arrowDownBtn->SetParent(this); - arrowDownBtn->SetImage(arrowDownImg); - arrowDownBtn->SetImageOver(arrowDownOverImg); - arrowDownBtn->SetImageHold(arrowDownOverImg); - arrowDownBtn->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - arrowDownBtn->SetPosition(width / 2 - 18 + 7, 18); - arrowDownBtn->SetSelectable(false); - arrowDownBtn->SetTrigger(trigA); - arrowDownBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowDownBtn->SetSoundClick(btnSoundClick); - - scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); - scrollbarBoxBtn->SetParent(this); - scrollbarBoxBtn->SetImage(scrollbarBoxImg); - scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); - scrollbarBoxBtn->SetImageHold(scrollbarBoxOverImg); - scrollbarBoxBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - scrollbarBoxBtn->SetSelectable(false); - scrollbarBoxBtn->SetEffectOnOver(EFFECT_SCALE, 50, 120); - scrollbarBoxBtn->SetMinY(0); - scrollbarBoxBtn->SetMaxY(height - 30); - scrollbarBoxBtn->SetHoldable(true); - scrollbarBoxBtn->SetTrigger(trigHeldA); - } - - // optionBg = new GuiImage(bgOptionsEntry); - for (int i = 0; i < PAGESIZE; i++) - { - optionTxt[i] = new GuiText(options->GetName(i), 20, ( GXColor ) {0, 0, 0, 0xff}); - optionTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - optionTxt[i]->SetPosition(24, 0); - - optionBg[i] = new GuiImage(bgOptionsEntry); - - optionVal[i] = new GuiText((char *) NULL, 20, ( GXColor ) - { 0, 0, 0, 0xff}); - optionVal[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - optionVal[i]->SetPosition(250, 0); - - optionBtn[i] = new GuiButton(width - 28, GAMESELECTSIZE); - optionBtn[i]->SetParent(this); - optionBtn[i]->SetLabel(optionTxt[i], 0); - optionBtn[i]->SetLabel(optionVal[i], 1); - optionBtn[i]->SetImageOver(optionBg[i]); - optionBtn[i]->SetPosition(5, GAMESELECTSIZE * i + 4); - optionBtn[i]->SetTrigger(trigA); - optionBtn[i]->SetSoundClick(btnSoundClick); - } -} - -/** - * Destructor for the GuiOptionBrowser class. - */ -GuiOptionBrowser::~GuiOptionBrowser() -{ - if (scrollbaron == 1) - { - delete arrowUpBtn; - delete arrowDownBtn; - delete scrollbarBoxBtn; - delete scrollbarImg; - delete arrowDownImg; - delete arrowDownOverImg; - delete arrowUpImg; - delete arrowUpOverImg; - delete scrollbarBoxImg; - delete scrollbarBoxOverImg; - delete scrollbar; - delete arrowDown; - delete arrowDownOver; - delete arrowUp; - delete arrowUpOver; - delete scrollbarBox; - delete scrollbarBoxOver; - } - delete bgOptionsImg; - delete bgOptions; - delete bgOptionsEntry; - loaded = 0; - - delete trigA; - - // delete optionBg; - for (int i = 0; i < PAGESIZE; i++) - { - delete optionTxt[i]; - delete optionVal[i]; - delete optionBg[i]; - delete optionBtn[i]; - } -} - -void GuiOptionBrowser::SetCol2Position(int x) -{ - LOCK( this ); - for (int i = 0; i < PAGESIZE; i++) - optionVal[i]->SetPosition(x, 0); -} - -void GuiOptionBrowser::SetFocus(int f) -{ - LOCK( this ); - focus = f; - - for (int i = 0; i < PAGESIZE; i++) - optionBtn[i]->ResetState(); - - if (f == 1) optionBtn[selectedItem]->SetState(STATE_SELECTED); -} - -void GuiOptionBrowser::ResetState() -{ - LOCK( this ); - if (state != STATE_DISABLED) - { - state = STATE_DEFAULT; - stateChan = -1; - } - - for (int i = 0; i < PAGESIZE; i++) - { - optionBtn[i]->ResetState(); - } -} - -int GuiOptionBrowser::GetClickedOption() -{ - int found = -1; - for (int i = 0; i < PAGESIZE; i++) - { - if (optionBtn[i]->GetState() == STATE_CLICKED) - { - optionBtn[i]->SetState(STATE_SELECTED); - found = optionIndex[i]; - break; - } - } - return found; -} - -int GuiOptionBrowser::GetSelectedOption() -{ - int found = -1; - for (int i = 0; i < PAGESIZE; i++) - { - if (optionBtn[i]->GetState() == STATE_SELECTED) - { - optionBtn[i]->SetState(STATE_SELECTED); - found = optionIndex[i]; - break; - } - } - return found; -} - -/**************************************************************************** - * FindMenuItem - * - * Help function to find the next visible menu item on the list - ***************************************************************************/ - -int GuiOptionBrowser::FindMenuItem(int currentItem, int direction) -{ - int nextItem = currentItem + direction; - - if (nextItem < 0 || nextItem >= options->GetLength()) return -1; - - if (options->GetName(nextItem) && strlen(options->GetName(nextItem)) > 0) - return nextItem; - else - return FindMenuItem(nextItem, direction); -} - -/** - * Draw the button on screen - */ -void GuiOptionBrowser::Draw() -{ - LOCK( this ); - if (!this->IsVisible()) return; - - bgOptionsImg->Draw(); - - int next = listOffset; - - for (int i = 0; i < PAGESIZE; i++) - { - if (next >= 0) - { - optionBtn[i]->Draw(); - next = this->FindMenuItem(next, 1); - } - else break; - } - - if (scrollbaron == 1) - { - scrollbarImg->Draw(); - arrowUpBtn->Draw(); - arrowDownBtn->Draw(); - scrollbarBoxBtn->Draw(); - } - this->UpdateEffects(); -} - -void GuiOptionBrowser::TriggerUpdate() -{ - listChanged = true; -} - -void GuiOptionBrowser::Update(GuiTrigger * t) -{ - LOCK( this ); - int next, prev, lang = options->GetLength(); - - //go to the last game selected - if ((loaded == 0) && (startat > 0)) - { - - if (startat > (lang - 9)) - { - listOffset = (lang - 9); - selectedItem = startat; - optionBtn[selectedItem]->SetState(STATE_SELECTED, t->chan); - } - else if (startat < 9) - { - selectedItem = startat; - optionBtn[selectedItem]->SetState(STATE_SELECTED, t->chan); - } - else if(startat < PAGESIZE) - { - listOffset = (startat - 4); - selectedItem = startat; - optionBtn[selectedItem]->SetState(STATE_SELECTED, t->chan); - } - this->SetFocus(1); - loaded = 1; - } - - if (state == STATE_DISABLED || !t) return; - - // scrolldelay affects how fast the list scrolls - // when the arrows are clicked - float scrolldelay = 3.5; - - if (scrollbaron == 1) - { - // update the location of the scroll box based on the position in the option list - - - arrowUpBtn->Update(t); - arrowDownBtn->Update(t); - scrollbarBoxBtn->Update(t); - } - next = listOffset; - - if (listChanged) - { - for (int i = 0; i < PAGESIZE; i++) - { - if (next >= 0) - { - if (optionBtn[i]->GetState() == STATE_DISABLED) - { - optionBtn[i]->SetVisible(true); - optionBtn[i]->SetState(STATE_DEFAULT); - } - - optionTxt[i]->SetText(options->GetName(next)); - optionVal[i]->SetText(options->GetValue(next)); - optionIndex[i] = next; - next = this->FindMenuItem(next, 1); - } - else - { - optionBtn[i]->SetVisible(false); - optionBtn[i]->SetState(STATE_DISABLED); - } - } - } - for (int i = 0; i < PAGESIZE; i++) - { - if (focus) - { - if (i != selectedItem && optionBtn[i]->GetState() == STATE_SELECTED) - optionBtn[i]->ResetState(); - else if (i == selectedItem && optionBtn[i]->GetState() == STATE_DEFAULT) optionBtn[selectedItem]->SetState( - STATE_SELECTED, t->chan); - } - - optionBtn[i]->Update(t); - - if (optionBtn[i]->GetState() == STATE_SELECTED) - { - selectedItem = i; - } - } - - // pad/joystick navigation - if (!focus) return; // skip navigation - - if (scrollbaron == 1) - { - - if (t->Down() || arrowDownBtn->GetState() == STATE_CLICKED || ////////////////////////////////////////////down - arrowDownBtn->GetState() == STATE_HELD) - { - - next = this->FindMenuItem(optionIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == PAGESIZE - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (optionBtn[selectedItem + 1]->IsVisible()) - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - - } - WPAD_ScanPads(); - u8 cnt, buttons = 0; - /* Get pressed buttons */ - for (cnt = 0; cnt < 4; cnt++) - buttons |= WPAD_ButtonsHeld(cnt); - if (buttons == WPAD_BUTTON_A) - { - - } - else - { - arrowDownBtn->ResetState(); - - } - - } - else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || ////////////////////////////////////////////up - arrowUpBtn->GetState() == STATE_HELD) - { - prev = this->FindMenuItem(optionIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - - } - WPAD_ScanPads(); - u8 cnt, buttons = 0; - /* Get pressed buttons */ - for (cnt = 0; cnt < 4; cnt++) - buttons |= WPAD_ButtonsHeld(cnt); - if (buttons == WPAD_BUTTON_A) - { - - } - else - { - arrowUpBtn->ResetState(); - - } - } - - if (scrollbarBoxBtn->GetState() == STATE_HELD && scrollbarBoxBtn->GetStateChan() == t->chan && t->wpad.ir.valid - && options->GetLength() > PAGESIZE) - { - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, 0); - int position = t->wpad.ir.y - 50 - scrollbarBoxBtn->GetTop(); - - listOffset = (position * lang) / 180 - selectedItem; - - if (listOffset <= 0) - { - listOffset = 0; - selectedItem = 0; - } - else if (listOffset + PAGESIZE >= lang) - { - listOffset = lang - PAGESIZE; - selectedItem = PAGESIZE - 1; - } - - } - int positionbar = 237 * (listOffset + selectedItem) / lang; - - if (positionbar > 216) positionbar = 216; - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, positionbar + 8); - - if (t->Right()) - { - if (listOffset < lang && lang > PAGESIZE) - { - listOffset = listOffset + PAGESIZE; - if (listOffset + PAGESIZE >= lang) listOffset = lang - PAGESIZE; - } - } - else if (t->Left()) - { - if (listOffset > 0) - { - listOffset = listOffset - PAGESIZE; - if (listOffset < 0) listOffset = 0; - } - } - - } - else - { - - if (t->Down()) - { - next = this->FindMenuItem(optionIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == PAGESIZE - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - listChanged = true; - } - else if (optionBtn[selectedItem + 1]->IsVisible()) - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - } - } - else if (t->Up()) - { - prev = this->FindMenuItem(optionIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - listChanged = true; - } - else - { - optionBtn[selectedItem]->ResetState(); - optionBtn[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - } - } - } - - if (updateCB) updateCB(this); -} diff --git a/source/lstub.cpp b/source/lstub.cpp index 5047e27f..deda3314 100644 --- a/source/lstub.cpp +++ b/source/lstub.cpp @@ -6,11 +6,13 @@ #include #include "lstub.h" -#include "filelist.h" #include "gecko.h" #include "wad/nandtitle.h" +extern const u8 stub_bin[]; +extern const u32 stub_bin_size; + static char* determineStubTIDLocation() { u32 *stubID = (u32*) 0x80001818; diff --git a/source/main.cpp b/source/main.cpp index 1833965d..23d84008 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -19,16 +19,9 @@ #include #include "video.h" -#include "themes/CTheme.h" #include "menu/menus.h" -#include "main.h" -#include "Controls/DeviceHandler.hpp" -#include "settings/CSettings.h" #include "memory/mem2.h" #include "wad/nandtitle.h" -#include "system/IosLoader.h" -#include "usbloader/MountGamePartition.h" -#include "usbloader/GameBooter.hpp" #include "StartUpProcess.h" #include "sys.h" @@ -38,15 +31,6 @@ extern "C" void __exception_setreload(int t); } -static int QuickGameBoot(const char * gameID) -{ - DeviceHandler::Instance()->MountAll(); - Settings.Load(); - - MountGamePartition(false); - return GameBooter::BootGame(gameID); -} - int main(int argc, char *argv[]) { MEM2_init(48); @@ -58,10 +42,8 @@ int main(int argc, char *argv[]) NandTitles.Get(); setlocale(LC_ALL, "en.UTF-8"); - if(argc > 1 && argv[1]) - return QuickGameBoot(argv[1]); - - StartUpProcess::Run(); + if(StartUpProcess::Run(argc, argv) < 0) + return -1; MainMenu(MENU_DISCLIST); return 0; diff --git a/source/menu.cpp b/source/menu.cpp index f6ce217b..55a11e70 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -9,7 +9,7 @@ ***************************************************************************/ #include -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "homebrewboot/BootHomebrew.h" #include "homebrewboot/HomebrewBrowser.hpp" #include "prompts/ProgressWindow.h" @@ -42,7 +42,7 @@ /*** Variables that are also used extern ***/ GuiWindow * mainWindow = NULL; -GuiImageData * pointer[4]; +GuiImageData * pointer[4] = { NULL, NULL, NULL, NULL }; GuiImage * bgImg = NULL; GuiImageData * background = NULL; GuiBGM * bgMusic = NULL; diff --git a/source/menu.h b/source/menu.h index f535941f..ea15b034 100644 --- a/source/menu.h +++ b/source/menu.h @@ -10,7 +10,7 @@ #define _MENU_H_ #include -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "settings/CSettings.h" #include "main.h" diff --git a/source/menu/GameBrowseMenu.cpp b/source/menu/GameBrowseMenu.cpp index 428978a4..b87ec1cb 100644 --- a/source/menu/GameBrowseMenu.cpp +++ b/source/menu/GameBrowseMenu.cpp @@ -1,7 +1,7 @@ #include #include "GameBrowseMenu.hpp" #include "Controls/DeviceHandler.hpp" -#include "libwiigui/LoadCoverImage.h" +#include "GUI/LoadCoverImage.h" #include "prompts/PromptWindows.h" #include "prompts/gameinfo.h" #include "prompts/DiscBrowser.h" @@ -709,7 +709,7 @@ void GameBrowseMenu::ReloadBrowser() sortBtn->SetPosition(Settings.widescreen ? thInt("256 - carousel layout abc/sort btn pos x widescreen") : thInt("240 - carousel layout abc/sort btn pos x"), thInt("13 - carousel layout abc/sort btn pos y")); categBtn->SetPosition(Settings.widescreen ? thInt("288 - carousel layout category btn pos x widescreen") : thInt("280 - carousel layout category btn pos x"), - thInt("13 - carousel layout abc/sort btn pos y")); + thInt("13 - carousel layout category btn pos y")); listBtn->SetPosition(Settings.widescreen ? thInt("320 - carousel layout list btn pos x widescreen") : thInt("320 - carousel layout list btn pos x"), thInt("13 - carousel layout list btn pos y")); gridBtn->SetPosition(Settings.widescreen ? thInt("352 - carousel layout grid btn pos x widescreen") : thInt("360 - carousel layout grid btn pos x"), @@ -846,6 +846,7 @@ int GameBrowseMenu::MainLoop() HaltGui(); bgMusic->Pause(); Settings.Save(); + DeviceHandler::Instance()->UnMountSD(); DeviceHandler::Instance()->MountSD(); gprintf("\tLoading config...%s\n", Settings.Load() ? "done" : "failed"); gprintf("\tLoading language...%s\n", Settings.LoadLanguage(Settings.language_path, CONSOLE_DEFAULT) ? "done" : "failed"); @@ -1154,7 +1155,7 @@ void GameBrowseMenu::CheckDiscSlotUpdate() else if(categBtn->GetState() == STATE_CLICKED) { - SetState(STATE_DISABLED); + mainWindow->SetState(STATE_DISABLED); CategorySwitchPrompt promptMenu; promptMenu.SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE); promptMenu.SetEffect(EFFECT_FADE, 20); @@ -1166,7 +1167,7 @@ void GameBrowseMenu::CheckDiscSlotUpdate() while(promptMenu.GetEffect() > 0) usleep(100); mainWindow->Remove(&promptMenu); categBtn->ResetState(); - SetState(STATE_DEFAULT); + mainWindow->SetState(STATE_DEFAULT); if(promptMenu.categoriesChanged()) { wString oldFilter(gameList.GetCurrentFilter()); diff --git a/source/menu/GameBrowseMenu.hpp b/source/menu/GameBrowseMenu.hpp index 17cbbbd1..db832790 100644 --- a/source/menu/GameBrowseMenu.hpp +++ b/source/menu/GameBrowseMenu.hpp @@ -1,11 +1,11 @@ #ifndef GAMEBROWSEMENU_HPP_ #define GAMEBROWSEMENU_HPP_ -#include "libwiigui/gui.h" -#include "libwiigui/gui_gamebrowser.h" -#include "libwiigui/gui_gamegrid.h" -#include "libwiigui/gui_gamecarousel.h" -#include "libwiigui/gui_searchbar.h" +#include "GUI/gui.h" +#include "GUI/gui_gamebrowser.h" +#include "GUI/gui_gamegrid.h" +#include "GUI/gui_gamecarousel.h" +#include "GUI/gui_searchbar.h" #include "utils/ThreadedTask.hpp" class GameBrowseMenu : public GuiWindow diff --git a/source/menu/WDMMenu.cpp b/source/menu/WDMMenu.cpp index 57689317..6ed2ab67 100644 --- a/source/menu/WDMMenu.cpp +++ b/source/menu/WDMMenu.cpp @@ -63,7 +63,7 @@ WDMMenu::WDMMenu(const struct discHdr * header) backBtn->SetTrigger(trigB); Append(backBtn); - optionBrowser = new GuiCustomOptionBrowser(396, 280, Options, "bg_options_settings.png"); + optionBrowser = new GuiOptionBrowser(396, 280, Options, "bg_options_settings.png"); optionBrowser->SetPosition(0, 90); optionBrowser->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); Append(optionBrowser); diff --git a/source/menu/WDMMenu.hpp b/source/menu/WDMMenu.hpp index 011d2b28..d611c394 100644 --- a/source/menu/WDMMenu.hpp +++ b/source/menu/WDMMenu.hpp @@ -1,8 +1,8 @@ #ifndef WDMMENU_HPP_ #define WDMMENU_HPP_ -#include "libwiigui/gui.h" -#include "libwiigui/gui_customoptionbrowser.h" +#include "GUI/gui.h" +#include "GUI/gui_optionbrowser.h" #include "usbloader/disc.h" #include "usbloader/WDMFile.hpp" @@ -38,7 +38,7 @@ class WDMMenu : public GuiWindow GuiImage * defaultBtnImg; GuiButton * defaultBtn; - GuiCustomOptionBrowser * optionBrowser; + GuiOptionBrowser * optionBrowser; }; #endif diff --git a/source/menu/menu_partition_selection.cpp b/source/menu/menu_partition_selection.cpp index 5749d262..785fa474 100644 --- a/source/menu/menu_partition_selection.cpp +++ b/source/menu/menu_partition_selection.cpp @@ -4,7 +4,7 @@ #include "usbloader/usbstorage2.h" #include "usbloader/utils.h" #include "usbloader/wbfs.h" -#include "libwiigui/gui_customoptionbrowser.h" +#include "GUI/gui_optionbrowser.h" #include "Controls/DeviceHandler.hpp" #include "themes/CTheme.h" @@ -71,7 +71,7 @@ int SelectPartitionMenu() &trigA, btnSoundOver, btnSoundClick2, 1); exitBtn.SetTrigger(&trigHome); - GuiCustomOptionBrowser optionBrowser(396, 280, &options, "bg_options_settings.png"); + GuiOptionBrowser optionBrowser(396, 280, &options, "bg_options_settings.png"); optionBrowser.SetPosition(0, 40); optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); diff --git a/source/menu/menus.h b/source/menu/menus.h index 0733afdc..3e2ad916 100644 --- a/source/menu/menus.h +++ b/source/menu/menus.h @@ -1,7 +1,7 @@ #ifndef _MENUS_H #define _MENUS_H -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "language/gettext.h" #include "prompts/PromptWindows.h" #include "menu.h" diff --git a/source/prompts/CategoryPrompt.cpp b/source/prompts/CategoryPrompt.cpp index 931106be..b356d498 100644 --- a/source/prompts/CategoryPrompt.cpp +++ b/source/prompts/CategoryPrompt.cpp @@ -24,226 +24,173 @@ #include #include "CategoryPrompt.hpp" #include "settings/CGameCategories.hpp" -#include "themes/Resources.h" +#include "settings/CSettings.h" #include "language/gettext.h" +#include "themes/gettheme.h" +#include "themes/Resources.h" #include "menu/menus.h" CategoryPrompt::CategoryPrompt(const string &title) : GuiWindow(0, 0) { - int posX = 15; - const int posY = 50; - const int distance = 10; + changed = false; + trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trigB.SetSimpleTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, PAD_BUTTON_START); + + btnOutline = Resources::GetImageData("button_dialogue_box.png"); bgImgData = Resources::GetImageData("categoryPrompt.png"); + browserImgData = Resources::GetImageData("bg_options.png"); addImgData = Resources::GetImageData("add.png"); - prevImgData = Resources::GetImageData("back.png"); - forwardImgData = Resources::GetImageData("forward.png"); - trashImgData = Resources::GetImageData("remove.png"); - lineImgData = Resources::GetImageData("categoryLine.png"); + deleteImgData = Resources::GetImageData("remove.png"); + editImgData = Resources::GetImageData("rename.png"); bgImg = new GuiImage(bgImgData); Append(bgImg); - width = bgImgData->GetWidth(); - height = bgImgData->GetHeight(); + width = bgImg->GetWidth(); + height = bgImg->GetHeight()+btnOutline->GetHeight()*0.9f; - addImg = new GuiImage(addImgData); - prevImg = new GuiImage(prevImgData); - forwardImg = new GuiImage(forwardImgData); - trashImg = new GuiImage(trashImgData); - lineImg = new GuiImage(lineImgData); - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - trigB = new GuiTrigger; - trigB->SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - trigHome = new GuiTrigger; - trigHome->SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, PAD_BUTTON_START); - trigLeft = new GuiTrigger; - trigLeft->SetButtonOnlyTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); - trigRight = new GuiTrigger; - trigRight->SetButtonOnlyTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); - trigMinus = new GuiTrigger; - trigMinus->SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0); - trigPlus = new GuiTrigger; - trigPlus->SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0); - - homeButton = new GuiButton(0, 0); - homeButton->SetTrigger(trigHome); - Append(homeButton); - - backButton = new GuiButton(0, 0); - backButton->SetTrigger(trigB); - Append(backButton); - - titleTxt = new GuiText(title.c_str(), 30, (GXColor) {0, 0, 0, 255}); - titleTxt->SetAlignment(ALIGN_CENTER, ALIGN_TOP); - titleTxt->SetPosition(0, 10); + titleTxt = new GuiText(title.c_str(), 30, thColor("r=0 g=0 b=0 a=255 - category prompt title text color")); + titleTxt->SetAlignment(thAlign("center - category prompt title text align hor"), thAlign("top - category prompt title text align ver")); + titleTxt->SetPosition(thInt("0 - category prompt title text pos x"), thInt("10 - category prompt title text pos y")); Append(titleTxt); - previousButton = new GuiButton(prevImg->GetWidth(), prevImg->GetHeight()); - previousButton->SetImage(prevImg); - previousButton->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - previousButton->SetPosition(posX, posY); - previousButton->SetSoundOver(btnSoundOver); - previousButton->SetSoundClick(btnSoundClick); - previousButton->SetTrigger(trigA); - previousButton->SetTrigger(trigLeft); - previousButton->SetTrigger(trigMinus); - previousButton->SetEffectGrow(); - previousButton->Clicked.connect(this, &CategoryPrompt::OnPreviousButtonClick); - Append(previousButton); - posX += distance + previousButton->GetWidth(); + browserImg = new GuiImage(browserImgData); + browser = new GuiCheckboxBrowser(browserImg->GetWidth(), browserImg->GetHeight()); + browser->SetImage(browserImg); + browser->SetAlignment(thAlign("center - category prompt browser align hor"), thAlign("top - category prompt browser align ver")); + browser->SetPosition(thInt("0 - category prompt browser pos x"), thInt("45 - category prompt browser pos y")); + Append(browser); - categoryTxt = new GuiText((char *) NULL, 26, (GXColor) {0, 0, 0, 255}); - categoryTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE); - categoryTxt->SetMaxWidth(lineImg->GetWidth()-10, DOTTED); - categoryTxt->SetPosition(0, 2); + homeButton = new GuiButton(0, 0); + homeButton->SetTrigger(&trigHome); + Append(homeButton); - editButton = new GuiButton(lineImg->GetWidth(), lineImg->GetHeight()); - editButton->SetImage(lineImg); - editButton->SetLabel(categoryTxt); - editButton->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - editButton->SetPosition(posX, posY); - editButton->SetSoundOver(btnSoundOver); - editButton->SetSoundClick(btnSoundClick); - editButton->SetTrigger(trigA); - editButton->SetEffectGrow(); - Append(editButton); - posX += distance + editButton->GetWidth(); - - enabledButton = new GuiCheckbox(32, 32); - enabledButton->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - enabledButton->SetPosition(posX, posY); - enabledButton->SetSoundOver(btnSoundOver); - enabledButton->SetSoundClick(btnSoundClick); - enabledButton->SetTrigger(trigA); - enabledButton->Clicked.connect(this, &CategoryPrompt::OnEnableButtonClick); - Append(enabledButton); - posX += distance + enabledButton->GetWidth(); - - forwardButton = new GuiButton(forwardImg->GetWidth(), forwardImg->GetHeight()); - forwardButton->SetImage(forwardImg); - forwardButton->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - forwardButton->SetPosition(posX, posY); - forwardButton->SetSoundOver(btnSoundOver); - forwardButton->SetSoundClick(btnSoundClick); - forwardButton->SetTrigger(trigA); - forwardButton->SetTrigger(trigRight); - forwardButton->SetTrigger(trigPlus); - forwardButton->SetEffectGrow(); - forwardButton->Clicked.connect(this, &CategoryPrompt::OnForwardButtonClick); - Append(forwardButton); - posX += 35 + forwardImg->GetWidth(); - - posTxt = new GuiText((char *) NULL, 26, (GXColor) {0, 0, 0, 255}); - posTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - posTxt->SetPosition(posX, posY+4); - Append(posTxt); - - addTxt = new GuiText(tr("Add category"), 24, (GXColor) {0, 0, 0, 255}); - addTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + addImg = new GuiImage(addImgData); + addTxt = new GuiText(tr("Add category"), 24, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); addTxt->SetMaxWidth(180, DOTTED); - addTxt->SetPosition(10+addImg->GetWidth(), 6); + addTxt->SetAlignment(thAlign("left - category prompt add button text align hor"), thAlign("top - category prompt add button text align ver")); + addTxt->SetPosition(thInt("10 - category prompt add button text pos x")+addImg->GetWidth(), thInt("6 - category prompt add button text pos y")); addButton = new GuiButton(addImg->GetWidth()+10+addTxt->GetTextWidth(), addImg->GetHeight()); addButton->SetImage(addImg); addButton->SetLabel(addTxt); - addButton->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - addButton->SetPosition(15, 100); + addButton->SetAlignment(thAlign("left - category prompt add button align hor"), thAlign("top - category prompt add button align ver")); + addButton->SetPosition(width/2-thInt("180 - category prompt add button pos x")-addImg->GetWidth()/2, thInt("330 - category prompt add button pos y")); addButton->SetSoundOver(btnSoundOver); addButton->SetSoundClick(btnSoundClick); - addButton->SetTrigger(trigA); + addButton->SetTrigger(&trigA); addButton->SetEffectGrow(); Append(addButton); - deleteTxt = new GuiText(tr("Delete category"), 24, (GXColor) {0, 0, 0, 255}); - deleteTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + deleteImg = new GuiImage(deleteImgData); + deleteTxt = new GuiText(tr("Delete category"), 24, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); deleteTxt->SetMaxWidth(180, DOTTED); - deleteTxt->SetPosition(trashImg->GetWidth()+10, 6); + deleteTxt->SetAlignment(thAlign("left - category prompt delete button text align hor"), thAlign("top - category prompt delete button text align ver")); + deleteTxt->SetPosition(thInt("10 - category prompt delete button text pos x")+deleteImg->GetWidth(), thInt("6 - category prompt delete button text pos y")); - deleteButton = new GuiButton(trashImg->GetWidth()+10+deleteTxt->GetTextWidth(), trashImg->GetHeight()); - deleteButton->SetImage(trashImg); + deleteButton = new GuiButton(deleteImg->GetWidth()+10+deleteTxt->GetTextWidth(), deleteImg->GetHeight()); + deleteButton->SetImage(deleteImg); deleteButton->SetLabel(deleteTxt); - deleteButton->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - deleteButton->SetPosition(10+180+addImg->GetWidth(), 100); + deleteButton->SetAlignment(thAlign("left - category prompt delete button align hor"), thAlign("top - category prompt delete button align ver")); + deleteButton->SetPosition(width/2+thInt("5 - category prompt delete button pos x"), thInt("330 - category prompt delete button pos y")); deleteButton->SetSoundOver(btnSoundOver); deleteButton->SetSoundClick(btnSoundClick); - deleteButton->SetTrigger(trigA); + deleteButton->SetTrigger(&trigA); deleteButton->SetEffectGrow(); Append(deleteButton); + + editImg = new GuiImage(editImgData); + editTxt = new GuiText(tr("Rename category"), 24, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); + editTxt->SetAlignment(thAlign("left - category prompt edit button text align hor"), thAlign("top - category prompt edit button text align ver")); + editTxt->SetPosition(thInt("10 - category prompt edit button text pos x")+editImg->GetWidth(), thInt("6 - category prompt edit button text pos y")); + editTxt->SetMaxWidth(180, DOTTED); + + editButton = new GuiButton(editImg->GetWidth()+10+editTxt->GetTextWidth(), editImg->GetHeight()); + editButton->SetImage(editImg); + editButton->SetLabel(editTxt); + editButton->SetAlignment(thAlign("left - category prompt edit button align hor"), thAlign("top - category prompt edit button align ver")); + editButton->SetPosition(width/2-thInt("180 - category prompt edit button pos x")-addImg->GetWidth()/2, thInt("362 - category prompt edit button pos y")); + editButton->SetSoundOver(btnSoundOver); + editButton->SetSoundClick(btnSoundClick); + editButton->SetTrigger(&trigA); + editButton->SetEffectGrow(); + Append(editButton); + + saveImg = new GuiImage(btnOutline); + saveImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + saveImg->SetScale(0.9f); + saveTxt = new GuiText(tr("Save"), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); + saveButton = new GuiButton(saveImg->GetWidth()*0.9f, saveImg->GetHeight()*0.9f); + saveButton->SetImage(saveImg); + saveButton->SetLabel(saveTxt); + saveButton->SetAlignment(thAlign("center - category prompt save button align hor"), thAlign("bottom - category prompt save button align ver")); + saveButton->SetPosition(thInt("-110 - category prompt save button pos x"), thInt("0 - category prompt save button pos y")); + saveButton->SetSoundOver(btnSoundOver); + saveButton->SetSoundClick(btnSoundClick); + saveButton->SetTrigger(&trigA); + saveButton->SetEffectGrow(); + Append(saveButton); + + backImg = new GuiImage(btnOutline); + backImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + backImg->SetScale(0.9f); + backTxt = new GuiText(tr("Back"), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); + backBtn = new GuiButton(backImg->GetWidth()*0.9f, backImg->GetHeight()*0.9f); + backBtn->SetImage(backImg); + backBtn->SetLabel(backTxt); + backBtn->SetAlignment(thAlign("center - category prompt back button align hor"), thAlign("bottom - category prompt back button align ver")); + backBtn->SetPosition(thInt("110 - category prompt back button pos x"), thInt("0 - category prompt back button pos y")); + backBtn->SetSoundOver(btnSoundOver); + backBtn->SetSoundClick(btnSoundClick); + backBtn->SetTrigger(&trigA); + backBtn->SetEffectGrow(); + Append(backBtn); + + browserRefresh(); } CategoryPrompt::~CategoryPrompt() { + RemoveAll(); + delete browser; + + delete btnOutline; delete bgImgData; - delete addImgData; - delete prevImgData; - delete forwardImgData; - delete trashImgData; - delete lineImgData; - delete bgImg; + delete browserImgData; + delete browserImg; + delete addImgData; delete addImg; - delete prevImg; - delete forwardImg; - delete trashImg; - delete lineImg; + delete deleteImgData; + delete deleteImg; + delete editImgData; + delete editImg; + delete backImg; + delete saveImg; + delete backBtn; + delete homeButton; delete addButton; - delete previousButton; - delete backButton; - delete forwardButton; delete deleteButton; delete editButton; - delete homeButton; - delete enabledButton; + delete saveButton; delete titleTxt; - delete categoryTxt; - delete posTxt; delete addTxt; delete deleteTxt; - - delete trigA; - delete trigB; - delete trigHome; - delete trigLeft; - delete trigRight; - delete trigPlus; - delete trigMinus; + delete editTxt; + delete backTxt; + delete saveTxt; } -void CategoryPrompt::OnForwardButtonClick(GuiButton *sender, int chan, const POINT &pointer) +int CategoryPrompt::Show() { - nextCategory(); - categoryChanged(categoryTxt, posTxt, enabledButton); - sender->ResetState(); -} - -void CategoryPrompt::OnPreviousButtonClick(GuiButton *sender, int chan, const POINT &pointer) -{ - previousCategory(); - categoryChanged(categoryTxt, posTxt, enabledButton); - sender->ResetState(); -} - -void CategoryPrompt::OnEnableButtonClick(GuiButton *sender, int chan, const POINT &pointer) -{ - changed = true; - checkBoxClicked(enabledButton); - sender->ResetState(); -} - -int CategoryPrompt::MainLoop() -{ - categoryChanged(categoryTxt, posTxt, enabledButton); - - while(backButton->GetState() != STATE_CLICKED) + while(backBtn->GetState() != STATE_CLICKED) { usleep(100); - if (shutdown) Sys_Shutdown(); else if (reset) @@ -253,15 +200,23 @@ int CategoryPrompt::MainLoop() { gprintf("\thomeButton clicked\n"); WindowExitPrompt(); - + SetState(STATE_DEFAULT); homeButton->ResetState(); } + else if(saveButton->GetState() == STATE_CLICKED) + { + if(categoriesChanged()) + GameCategories.Save(); + return 1; + } + else if(addButton->GetState() == STATE_CLICKED) { if(!Settings.godmode && (Settings.ParentalBlocks & BLOCK_CATEGORIES_MOD)) { WindowPrompt(tr( "Permission denied." ), tr( "Console must be unlocked to be able to use this." ), tr( "OK" )); + SetState(STATE_DEFAULT); addButton->ResetState(); continue; } @@ -272,11 +227,12 @@ int CategoryPrompt::MainLoop() if(result) { GameCategories.CategoryList.AddCategory(entered); - GameCategories.Save(); GameCategories.CategoryList.findCategory(entered); - categoryChanged(categoryTxt, posTxt, enabledButton); + browserRefresh(); + markChanged(); } + SetState(STATE_DEFAULT); addButton->ResetState(); } @@ -285,13 +241,15 @@ int CategoryPrompt::MainLoop() if(!Settings.godmode && (Settings.ParentalBlocks & BLOCK_CATEGORIES_MOD)) { WindowPrompt(tr( "Permission denied." ), tr( "Console must be unlocked to be able to use this." ), tr( "OK" )); + SetState(STATE_DEFAULT); deleteButton->ResetState(); continue; } - if(GameCategories.CategoryList.getCurrentID() == 0) + if(browser->GetSelected() == 0) { WindowPrompt(tr("Error"), tr("You cannot delete this category."), tr("OK")); + SetState(STATE_DEFAULT); deleteButton->ResetState(); continue; } @@ -299,18 +257,19 @@ int CategoryPrompt::MainLoop() int choice = WindowPrompt(tr("Warning"), tr("Are you sure you want to delete this category?"), tr("Yes"), tr("Cancel")); if(choice) { - int pos = GameCategories.CategoryList.pos()-1; + GameCategories.CategoryList.goToFirst(); + for(int i = 0; i < browser->GetSelected(); ++i) + GameCategories.CategoryList.goToNext(); int categoryID = GameCategories.CategoryList.getCurrentID(); GameCategories.CategoryList.RemoveCategory(categoryID); GameCategories.RemoveCategory(categoryID); - GameCategories.Save(); GameCategories.CategoryList.goToFirst(); - for(int i = 0; i < pos; ++i) - GameCategories.CategoryList.goToNext(); - categoryChanged(categoryTxt, posTxt, enabledButton); + browserRefresh(); + markChanged(); } + SetState(STATE_DEFAULT); deleteButton->ResetState(); } @@ -319,10 +278,15 @@ int CategoryPrompt::MainLoop() if(!Settings.godmode && (Settings.ParentalBlocks & BLOCK_CATEGORIES_MOD)) { WindowPrompt(tr( "Permission denied." ), tr( "Console must be unlocked to be able to use this." ), tr( "OK" )); + SetState(STATE_DEFAULT); editButton->ResetState(); continue; } + GameCategories.CategoryList.goToFirst(); + for(int i = 0; i < browser->GetSelected(); ++i) + GameCategories.CategoryList.goToNext(); + char entered[512]; snprintf(entered, sizeof(entered), tr(GameCategories.CategoryList.getCurrentName().c_str())); @@ -330,18 +294,21 @@ int CategoryPrompt::MainLoop() if(result) { GameCategories.CategoryList.SetCategory(GameCategories.CategoryList.getCurrentID(), entered); - int pos = GameCategories.CategoryList.pos(); - GameCategories.Save(); GameCategories.CategoryList.goToFirst(); - for(int i = 0; i < pos; ++i) - GameCategories.CategoryList.goToNext(); - categoryChanged(categoryTxt, posTxt, enabledButton); + browserRefresh(); + markChanged(); } + SetState(STATE_DEFAULT); editButton->ResetState(); } } + //! Reset to old file in case of cancel + if(categoriesChanged()) + resetChanges(); + return 0; } + diff --git a/source/prompts/CategoryPrompt.hpp b/source/prompts/CategoryPrompt.hpp index 95f2fa78..8201164c 100644 --- a/source/prompts/CategoryPrompt.hpp +++ b/source/prompts/CategoryPrompt.hpp @@ -21,67 +21,58 @@ * 3. This notice may not be removed or altered from any source * distribution. ***************************************************************************/ -#ifndef CATEGORYPROMPT_HPP_ -#define CATEGORYPROMPT_HPP_ +#ifndef CATEGORY_PROMPT_HPP_ +#define CATEGORY_PROMPT_HPP_ -#include "libwiigui/gui.h" -#include "libwiigui/gui_checkbox.hpp" +#include "GUI/gui_checkboxbrowser.hpp" class CategoryPrompt : public GuiWindow, public sigslot::has_slots<> { public: - CategoryPrompt(const std::string &title); + CategoryPrompt(const string &title); ~CategoryPrompt(); + int Show(); bool categoriesChanged() const { return changed; } protected: - int MainLoop(); - sigslot::signal3 categoryChanged; - sigslot::signal0<> nextCategory; - sigslot::signal0<> previousCategory; - sigslot::signal1 checkBoxClicked; + void markChanged() { changed = true; } + sigslot::signal0<> browserRefresh; + sigslot::signal0<> resetChanges; + GuiCheckboxBrowser *browser; private: - void OnForwardButtonClick(GuiButton *sender, int chan, const POINT &pointer); - void OnPreviousButtonClick(GuiButton *sender, int chan, const POINT &pointer); - void OnEnableButtonClick(GuiButton *sender, int chan, const POINT &pointer); - bool changed; GuiImageData *bgImgData; + GuiImageData *browserImgData; + GuiImageData *btnOutline; GuiImageData *addImgData; - GuiImageData *prevImgData; - GuiImageData *forwardImgData; - GuiImageData *trashImgData; - GuiImageData *lineImgData; + GuiImageData *deleteImgData; + GuiImageData *editImgData; + GuiImage *browserImg; GuiImage *bgImg; GuiImage *addImg; - GuiImage *prevImg; - GuiImage *forwardImg; - GuiImage *trashImg; - GuiImage *lineImg; + GuiImage *deleteImg; + GuiImage *editImg; + GuiImage *backImg; + GuiImage *saveImg; + GuiButton *backBtn; + GuiButton *homeButton; GuiButton *addButton; - GuiButton *previousButton; - GuiButton *forwardButton; - GuiButton *backButton; GuiButton *deleteButton; GuiButton *editButton; - GuiButton *homeButton; - GuiCheckbox *enabledButton; + GuiButton *saveButton; GuiText *titleTxt; - GuiText *categoryTxt; - GuiText *posTxt; GuiText *addTxt; GuiText *deleteTxt; + GuiText *editTxt; + GuiText *backTxt; + GuiText *saveTxt; - GuiTrigger *trigA; - GuiTrigger *trigB; - GuiTrigger *trigHome; - GuiTrigger *trigLeft; - GuiTrigger *trigRight; - GuiTrigger *trigMinus; - GuiTrigger *trigPlus; + GuiTrigger trigA; + GuiTrigger trigB; + GuiTrigger trigHome; }; #endif diff --git a/source/prompts/CategorySelectPrompt.cpp b/source/prompts/CategorySelectPrompt.cpp index d20e4d62..b1d0aabb 100644 --- a/source/prompts/CategorySelectPrompt.cpp +++ b/source/prompts/CategorySelectPrompt.cpp @@ -26,55 +26,55 @@ #include "settings/CSettings.h" #include "language/gettext.h" #include "utils/StringTools.h" +#include "gecko.h" CategorySelectPrompt::CategorySelectPrompt(struct discHdr * header) : CategoryPrompt(fmt("%s - %s", (char *) header->id, tr("Categories"))), gameHeader(header) { - categoryChanged.connect(this, &CategorySelectPrompt::OnCategoryChange); - nextCategory.connect(this, &CategorySelectPrompt::OnNextCategory); - previousCategory.connect(this, &CategorySelectPrompt::OnPreviousCategory); - checkBoxClicked.connect(this, &CategorySelectPrompt::OnCheckboxClicked); + browser->checkBoxClicked.connect(this, &CategorySelectPrompt::OnCheckboxClick); + browserRefresh.connect(this, &CategorySelectPrompt::onBrowserRefresh); + resetChanges.connect(this, &CategorySelectPrompt::onResetChanges); + + browserRefresh(); } -CategorySelectPrompt::~CategorySelectPrompt() +void CategorySelectPrompt::onResetChanges() { - int pos = GameCategories.CategoryList.pos()-1; - GameCategories.Save(); + GameCategories.Load(Settings.ConfigPath); +} + +void CategorySelectPrompt::onBrowserRefresh() +{ + browser->Clear(); GameCategories.CategoryList.goToFirst(); - for(int i = 0; i < pos; ++i) - GameCategories.CategoryList.goToNext(); -} - -void CategorySelectPrompt::OnNextCategory() -{ - GameCategories.CategoryList.goToNextCicle(); -} - -void CategorySelectPrompt::OnPreviousCategory() -{ - GameCategories.CategoryList.goToPreviousCicle(); -} - -void CategorySelectPrompt::OnCategoryChange(GuiText *catTxt, GuiText *positionTxt, GuiCheckbox *checkBox) -{ - catTxt->SetText(tr(GameCategories.CategoryList.getCurrentName().c_str())); - positionTxt->SetTextf("%i / %i", GameCategories.CategoryList.pos()+1, GameCategories.CategoryList.size()); - checkBox->SetChecked(false); - - const vector gameCat = GameCategories[gameHeader->id]; - for(u32 i = 0; i < gameCat.size(); ++i) + do { - if(gameCat[i] == GameCategories.CategoryList.getCurrentID()) + bool checked = false; + const vector gameCat = GameCategories[gameHeader->id]; + + for(u32 i = 0; i < gameCat.size(); ++i) { - checkBox->SetChecked(true); - break; + if(gameCat[i] == GameCategories.CategoryList.getCurrentID()) + { + checked = true; + break; + } } + + browser->AddEntrie(GameCategories.CategoryList.getCurrentName(), checked); } + while(GameCategories.CategoryList.goToNext()); + + GameCategories.CategoryList.goToFirst(); } -void CategorySelectPrompt::OnCheckboxClicked(GuiCheckbox *checkBox) +void CategorySelectPrompt::OnCheckboxClick(GuiCheckbox *checkBox, int index) { + GameCategories.CategoryList.goToFirst(); + for(int i = 0; i < index; ++i) + GameCategories.CategoryList.goToNext(); + if(GameCategories.CategoryList.getCurrentID() == 0) { checkBox->SetChecked(true); @@ -89,7 +89,10 @@ void CategorySelectPrompt::OnCheckboxClicked(GuiCheckbox *checkBox) if(gameCat[i] == GameCategories.CategoryList.getCurrentID()) { if(!checkBox->IsChecked()) + { GameCategories.RemoveCategory((const char *) gameHeader->id, gameCat[i]); + markChanged(); + } break; } } @@ -97,5 +100,6 @@ void CategorySelectPrompt::OnCheckboxClicked(GuiCheckbox *checkBox) if(i == gameCat.size() && checkBox->IsChecked()) { GameCategories.SetCategory(gameHeader->id, GameCategories.CategoryList.getCurrentID()); + markChanged(); } } diff --git a/source/prompts/CategorySelectPrompt.hpp b/source/prompts/CategorySelectPrompt.hpp index 8fdb5045..1511b6e8 100644 --- a/source/prompts/CategorySelectPrompt.hpp +++ b/source/prompts/CategorySelectPrompt.hpp @@ -31,13 +31,11 @@ class CategorySelectPrompt : public CategoryPrompt { public: CategorySelectPrompt(struct discHdr * header); - ~CategorySelectPrompt(); - int Show() { return CategoryPrompt::MainLoop(); }; private: - void OnCheckboxClicked(GuiCheckbox *checkBox); - void OnCategoryChange(GuiText *categoryTxt, GuiText *posTxt, GuiCheckbox *checkBox); - void OnNextCategory(); - void OnPreviousCategory(); + void OnCheckboxClick(GuiCheckbox *checkBox, int index); + void onBrowserRefresh(); + void onResetChanges(); + struct discHdr * gameHeader; }; diff --git a/source/prompts/CategorySwitchPrompt.cpp b/source/prompts/CategorySwitchPrompt.cpp index 0d1aee15..b3bc5f63 100644 --- a/source/prompts/CategorySwitchPrompt.cpp +++ b/source/prompts/CategorySwitchPrompt.cpp @@ -27,49 +27,61 @@ #include "language/gettext.h" CategorySwitchPrompt::CategorySwitchPrompt() - : CategoryPrompt(tr("Show Categories")) + : CategoryPrompt(tr("Show Categories")), oldSetting(Settings.EnabledCategories) { - categoryChanged.connect(this, &CategorySwitchPrompt::OnCategoryChange); - nextCategory.connect(this, &CategorySwitchPrompt::OnNextCategory); - previousCategory.connect(this, &CategorySwitchPrompt::OnPreviousCategory); - checkBoxClicked.connect(this, &CategorySwitchPrompt::OnCheckboxClicked); + browser->checkBoxClicked.connect(this, &CategorySwitchPrompt::OnCheckboxClick); + browserRefresh.connect(this, &CategorySwitchPrompt::onBrowserRefresh); + resetChanges.connect(this, &CategorySwitchPrompt::onResetChanges); + + browserRefresh(); } -void CategorySwitchPrompt::OnNextCategory() +void CategorySwitchPrompt::onResetChanges() { - GameCategories.CategoryList.goToNextCicle(); + Settings.EnabledCategories = oldSetting; + GameCategories.Load(Settings.ConfigPath); } -void CategorySwitchPrompt::OnPreviousCategory() +void CategorySwitchPrompt::onBrowserRefresh() { - GameCategories.CategoryList.goToPreviousCicle(); -} - -void CategorySwitchPrompt::OnCategoryChange(GuiText *catTxt, GuiText *positionTxt, GuiCheckbox *checkBox) -{ - catTxt->SetText(tr(GameCategories.CategoryList.getCurrentName().c_str())); - positionTxt->SetTextf("%i / %i", GameCategories.CategoryList.pos()+1, GameCategories.CategoryList.size()); - checkBox->SetChecked(false); - - for(u32 i = 0; i < Settings.EnabledCategories.size(); ++i) + browser->Clear(); + GameCategories.CategoryList.goToFirst(); + do { - if(Settings.EnabledCategories[i] == GameCategories.CategoryList.getCurrentID()) + bool checked = false; + + for(u32 i = 0; i < Settings.EnabledCategories.size(); ++i) { - checkBox->SetChecked(true); - break; + if(Settings.EnabledCategories[i] == GameCategories.CategoryList.getCurrentID()) + { + checked = true; + break; + } } + + browser->AddEntrie(GameCategories.CategoryList.getCurrentName(), checked); } + while(GameCategories.CategoryList.goToNext()); + + GameCategories.CategoryList.goToFirst(); } -void CategorySwitchPrompt::OnCheckboxClicked(GuiCheckbox *checkBox) +void CategorySwitchPrompt::OnCheckboxClick(GuiCheckbox *checkBox, int index) { + GameCategories.CategoryList.goToFirst(); + for(int i = 0; i < index; ++i) + GameCategories.CategoryList.goToNext(); + u32 i; for(i = 0; i < Settings.EnabledCategories.size(); ++i) { if(Settings.EnabledCategories[i] == GameCategories.CategoryList.getCurrentID()) { if(!checkBox->IsChecked()) + { Settings.EnabledCategories.erase(Settings.EnabledCategories.begin()+i); + markChanged(); + } break; } } @@ -77,5 +89,6 @@ void CategorySwitchPrompt::OnCheckboxClicked(GuiCheckbox *checkBox) if(i == Settings.EnabledCategories.size() && checkBox->IsChecked()) { Settings.EnabledCategories.push_back(GameCategories.CategoryList.getCurrentID()); + markChanged(); } } diff --git a/source/prompts/CategorySwitchPrompt.hpp b/source/prompts/CategorySwitchPrompt.hpp index ccd54161..5f791f5a 100644 --- a/source/prompts/CategorySwitchPrompt.hpp +++ b/source/prompts/CategorySwitchPrompt.hpp @@ -30,12 +30,12 @@ class CategorySwitchPrompt : public CategoryPrompt { public: CategorySwitchPrompt(); - int Show() { return CategoryPrompt::MainLoop(); }; private: - void OnCheckboxClicked(GuiCheckbox *checkBox); - void OnCategoryChange(GuiText *categoryTxt, GuiText *posTxt, GuiCheckbox *checkBox); - void OnNextCategory(); - void OnPreviousCategory(); + void OnCheckboxClick(GuiCheckbox *checkBox, int index); + void onBrowserRefresh(); + void onResetChanges(); + + const std::vector oldSetting; }; #endif diff --git a/source/prompts/CheckboxPrompt.hpp b/source/prompts/CheckboxPrompt.hpp index 029fdab6..57c9dac8 100644 --- a/source/prompts/CheckboxPrompt.hpp +++ b/source/prompts/CheckboxPrompt.hpp @@ -24,7 +24,7 @@ #ifndef _CHECKBOXPROMPT_HPP_ #define _CHECKBOXPROMPT_HPP_ -#include "libwiigui/gui_checkbox.hpp" +#include "GUI/gui_checkbox.hpp" #include "PromptWindow.hpp" enum diff --git a/source/prompts/DiscBrowser.cpp b/source/prompts/DiscBrowser.cpp index 548b3d04..1d2b87b3 100644 --- a/source/prompts/DiscBrowser.cpp +++ b/source/prompts/DiscBrowser.cpp @@ -6,8 +6,8 @@ ***************************************************************************/ #include #include "language/gettext.h" -#include "libwiigui/gui.h" -#include "libwiigui/gui_customoptionbrowser.h" +#include "GUI/gui.h" +#include "GUI/gui_optionbrowser.h" #include "prompts/PromptWindows.h" #include "menu/menus.h" #include "usbloader/disc.h" @@ -116,7 +116,7 @@ int DiscBrowse(const char * GameID, char * alternatedname, int alternatedname_si settingsbackgroundbtn.SetPosition(0, 0); settingsbackgroundbtn.SetImage(&settingsbackground); - GuiText cancelBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText cancelBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); cancelBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage cancelBtnImg(&btnOutline); if (Settings.wsprompt == ON) @@ -129,7 +129,7 @@ int DiscBrowse(const char * GameID, char * alternatedname, int alternatedname_si cancelBtn.SetLabel(&cancelBtnTxt); cancelBtn.SetTrigger(&trigB); - GuiCustomOptionBrowser optionBrowser3(396, 280, &options, "bg_options_settings.png"); + GuiOptionBrowser optionBrowser3(396, 280, &options, "bg_options_settings.png"); optionBrowser3.SetPosition(0, 90); optionBrowser3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); diff --git a/source/prompts/GameWindow.cpp b/source/prompts/GameWindow.cpp index 07f045ab..91511d56 100644 --- a/source/prompts/GameWindow.cpp +++ b/source/prompts/GameWindow.cpp @@ -60,7 +60,7 @@ GameWindow::GameWindow(int Selected) nameBtnTT = new GuiTooltip(tr( "Rename Game on WBFS" )); if (Settings.wsprompt) nameBtnTT->SetWidescreen(Settings.widescreen); - nameTxt = new GuiText("", 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + nameTxt = new GuiText("", 22, thColor("r=0 g=0 b=0 a=255 - game window name text color")); if (Settings.wsprompt) nameTxt->SetWidescreen(Settings.widescreen); nameTxt->SetMaxWidth(350, SCROLL_HORIZONTAL); nameBtn = new GuiButton(120, 50); @@ -77,7 +77,7 @@ GameWindow::GameWindow(int Selected) nameBtn->SetEffectGrow(); } - sizeTxt = new GuiText((char*) NULL, 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + sizeTxt = new GuiText((char*) NULL, 22, thColor("r=0 g=0 b=0 a=255 - game window size text color")); sizeTxt->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); sizeTxt->SetPosition(-60, 70); @@ -92,7 +92,7 @@ GameWindow::GameWindow(int Selected) diskImg2->SetAngle(0); diskImg2->SetBeta(180); - playcntTxt = new GuiText((char*) NULL, 18, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + playcntTxt = new GuiText((char*) NULL, 18, thColor("r=0 g=0 b=0 a=255 - game window playcount text color")); playcntTxt->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); playcntTxt->SetPosition(-115, 45); @@ -105,7 +105,7 @@ GameWindow::GameWindow(int Selected) gameBtn->SetTrigger(trigA); gameBtn->SetState(STATE_SELECTED); - backBtnTxt = new GuiText(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + backBtnTxt = new GuiText(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); backBtnImg = new GuiImage(btnOutline); if (Settings.wsprompt) { @@ -118,7 +118,7 @@ GameWindow::GameWindow(int Selected) backBtn->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); backBtn->SetPosition(0, -40); - settingsBtnTxt = new GuiText(tr( "Settings" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + settingsBtnTxt = new GuiText(tr( "Settings" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); settingsBtnImg = new GuiImage(btnOutline); if (Settings.wsprompt) { diff --git a/source/prompts/GameWindow.hpp b/source/prompts/GameWindow.hpp index c2679a1e..ca7e8347 100644 --- a/source/prompts/GameWindow.hpp +++ b/source/prompts/GameWindow.hpp @@ -1,8 +1,8 @@ #ifndef GAMEWINDOW_HPP_ #define GAMEWINDOW_HPP_ -#include "libwiigui/gui.h" -#include "libwiigui/gui_diskcover.h" +#include "GUI/gui.h" +#include "GUI/gui_diskcover.h" #include "menu/GameBrowseMenu.hpp" #define FAVORITE_STARS 5 diff --git a/source/prompts/HomebrewPrompt.cpp b/source/prompts/HomebrewPrompt.cpp new file mode 100644 index 00000000..c143f2d5 --- /dev/null +++ b/source/prompts/HomebrewPrompt.cpp @@ -0,0 +1,176 @@ +/**************************************************************************** + * Copyright (C) 2011 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#include +#include "HomebrewPrompt.hpp" +#include "themes/gettheme.h" +#include "themes/Resources.h" +#include "language/gettext.h" +#include "utils/StringTools.h" +#include "menu/menus.h" + +HomebrewPrompt::HomebrewPrompt(const char *name, const char *coder, const char *version, + const char *release_date, const char *long_description, + GuiImageData * iconImgData, u64 filesize) + : PromptWindow(NULL, NULL) +{ + SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + SetPosition(0, 6); + + whiteBox = Resources::GetImageData("bg_options.png"); + + iconImg = new GuiImage(iconImgData); + iconImg->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + iconImg->SetPosition(45, 10); + + dialogBoxImg->SetSkew(0, -80, 0, -80, 0, 50, 0, 50); + dialogBoxImg->SetWidescreen(false); + + whiteBoxImg = new GuiImage(whiteBox); + whiteBoxImg->SetPosition(0, 110); + whiteBoxImg->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + whiteBoxImg->SetSkew(0, 0, 0, 0, 0, -120, 0, -120); + + nameTxt = new GuiText(name, 30, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + nameTxt->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + nameTxt->SetPosition(0, -15); + nameTxt->SetMaxWidth(430, SCROLL_HORIZONTAL); + + coderTxt = new GuiText(fmt(tr( "Coded by: %s" ), coder), 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + coderTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + coderTxt->SetPosition(180, 30); + coderTxt->SetMaxWidth(280); + + versionTxt = new GuiText(fmt(tr( "Version: %s" ), version), 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + versionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + versionTxt->SetPosition(40, 65); + versionTxt->SetMaxWidth(430); + + release_dateTxt = new GuiText(release_date, 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + release_dateTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + release_dateTxt->SetPosition(40, 85); + release_dateTxt->SetMaxWidth(430); + + const int pagesize = 6; + long_descriptionTxt = new Text(long_description, 20, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + long_descriptionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + long_descriptionTxt->SetPosition(46, 117); + long_descriptionTxt->SetMaxWidth(358); + long_descriptionTxt->SetLinesToDraw(pagesize); + long_descriptionTxt->Refresh(); + + //convert filesize from u64 to char and put unit of measurement after it + char filesizeCH[15]; + if (filesize <= 1024.0) + snprintf(filesizeCH, sizeof(filesizeCH), "%lld B", filesize); + if (filesize > 1024.0) + snprintf(filesizeCH, sizeof(filesizeCH), "%0.2f KB", filesize / 1024.0); + if (filesize > 1048576.0) + snprintf(filesizeCH, sizeof(filesizeCH), "%0.2f MB", filesize / 1048576.0); + + filesizeTxt = new GuiText(filesizeCH, 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + filesizeTxt->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + filesizeTxt->SetPosition(-40, 12); + + scrollBar = new GuiScrollbar(150); + scrollBar->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + scrollBar->SetPosition(393, 115); + scrollBar->SetPageSize(pagesize); + scrollBar->SetEntrieCount(long_descriptionTxt->GetTotalLinesCount()); + scrollBar->listChanged.connect(this, &HomebrewPrompt::onListChange); + + Append(whiteBoxImg); + if(strcmp(long_description, "") != 0 && long_descriptionTxt->GetTotalLinesCount() > pagesize) + Append(scrollBar); + + if(strcmp(name, "") != 0) Append(nameTxt); + if(strcmp(version, "") != 0) Append(versionTxt); + if(strcmp(coder, "") != 0) Append(coderTxt); + if(strcmp(release_date, "") != 0) Append(release_dateTxt); + if(strcmp(long_description, "") != 0) Append(long_descriptionTxt); + Append(filesizeTxt); + Append(iconImg); + + AddButton(tr( "Load" )); + AddButton(tr( "Back" )); + + Button[0]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + Button[0]->SetPosition(40, 2); + Button[1]->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + Button[1]->SetPosition(-40, 2); +} + +HomebrewPrompt::~HomebrewPrompt() +{ + ResumeGui(); + + SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); + while(parentElement && this->GetEffect() > 0) usleep(100); + + if(parentElement) + ((GuiWindow *) parentElement)->Remove(this); + parentElement = NULL; + + RemoveAll(); + + delete whiteBox; + delete iconImg; + delete whiteBoxImg; + delete nameTxt; + delete coderTxt; + delete versionTxt; + delete release_dateTxt; + delete long_descriptionTxt; + delete filesizeTxt; + delete scrollBar; +} + +void HomebrewPrompt::onListChange(int SelItem, int SelInd) +{ + long_descriptionTxt->SetTextLine(SelItem+SelInd); +} + +int HomebrewPrompt::MainLoop() +{ + int choice = -1; + + while (choice == -1) + { + usleep(100); + + if (shutdown) + { + wiilight(0); + Sys_Shutdown(); + } + else if (reset) + { + wiilight(0); + Sys_Reboot(); + } + + choice = GetChoice(); + } + + return choice; +} diff --git a/source/prompts/HomebrewPrompt.hpp b/source/prompts/HomebrewPrompt.hpp new file mode 100644 index 00000000..44a4b36b --- /dev/null +++ b/source/prompts/HomebrewPrompt.hpp @@ -0,0 +1,56 @@ +/**************************************************************************** + * Copyright (C) 2011 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#ifndef HOMEBREWPROMPT_HPP_ +#define HOMEBREWPROMPT_HPP_ + +#include "GUI/gui_scrollbar.hpp" +#include "GUI/Text.hpp" +#include "PromptWindow.hpp" + +class HomebrewPrompt : public PromptWindow, public sigslot::has_slots<> +{ + public: + HomebrewPrompt(const char *name, const char *coder, const char *version, + const char *release_date, const char *long_description, + GuiImageData * iconImgData, u64 filesize); + ~HomebrewPrompt(); + int MainLoop(); + private: + void onListChange(int SelItem, int SelInd); + + GuiImageData *whiteBox; + + GuiImage *whiteBoxImg; + GuiImage *iconImg; + + GuiText *nameTxt; + GuiText *coderTxt; + GuiText *versionTxt; + GuiText *release_dateTxt; + GuiText *filesizeTxt; + Text *long_descriptionTxt; + GuiScrollbar *scrollBar; +}; + +#endif diff --git a/source/prompts/ProgressWindow.cpp b/source/prompts/ProgressWindow.cpp index 10d2f9df..e67cf1a4 100644 --- a/source/prompts/ProgressWindow.cpp +++ b/source/prompts/ProgressWindow.cpp @@ -14,7 +14,7 @@ #include "menu/menus.h" #include "sys.h" #include "language/gettext.h" -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "prompts/ProgressWindow.h" #include "usbloader/wbfs.h" #include "usbloader/utils.h" @@ -246,7 +246,7 @@ static void ProgressWindow(const char *title, const char *msg1, const char *msg2 GuiImage progressbarEmptyImg(&progressbarEmpty); progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarEmptyImg.SetPosition(35, 40); - progressbarEmptyImg.SetTile(100); + progressbarEmptyImg.SetTileHorizontal(100); GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png")); GuiImage progressbarImg(&progressbar); @@ -295,7 +295,7 @@ static void ProgressWindow(const char *title, const char *msg1, const char *msg2 progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); progressbarOutlineImg.SetPosition(0, 40); progressbarEmptyImg.SetPosition(80, 40); - progressbarEmptyImg.SetTile(78); + progressbarEmptyImg.SetTileHorizontal(78); progressbarImg.SetPosition(80, 40); msg1Txt.SetMaxWidth(380, DOTTED); msg2Txt.SetMaxWidth(380, DOTTED); @@ -308,7 +308,7 @@ static void ProgressWindow(const char *title, const char *msg1, const char *msg2 sizeTxt.SetFontSize(20); } - GuiText cancelTxt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText cancelTxt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage cancelImg(&btnOutline); if (Settings.wsprompt) { diff --git a/source/prompts/PromptWindow.cpp b/source/prompts/PromptWindow.cpp index cac125eb..11be5f48 100644 --- a/source/prompts/PromptWindow.cpp +++ b/source/prompts/PromptWindow.cpp @@ -191,7 +191,7 @@ void PromptWindow::AddButton(const char *text) ButtonImg.resize(size+1); Button.resize(size+1); - ButtonTxt[size] = new GuiText(text, 20, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + ButtonTxt[size] = new GuiText(text, 20, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); ButtonImg[size] = new GuiImage(btnOutline); if (Settings.wsprompt) { diff --git a/source/prompts/PromptWindow.hpp b/source/prompts/PromptWindow.hpp index 7f83f3ee..59c895de 100644 --- a/source/prompts/PromptWindow.hpp +++ b/source/prompts/PromptWindow.hpp @@ -24,7 +24,7 @@ #ifndef _PROMPTWINDOW_HPP_ #define _PROMPTWINDOW_HPP_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" class PromptWindow : public GuiWindow { diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index 4421db10..989d4f2f 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -14,9 +14,9 @@ #include "usbloader/GameList.h" #include "usbloader/utils.h" #include "language/gettext.h" -#include "libwiigui/gui.h" -#include "libwiigui/gui_diskcover.h" -#include "libwiigui/Text.hpp" +#include "GUI/gui.h" +#include "GUI/gui_diskcover.h" +#include "GUI/Text.hpp" #include "settings/CGameStatistics.h" #include "settings/GameTitles.h" #include "network/networkops.h" @@ -72,7 +72,7 @@ int OnScreenNumpad(char * var, u32 maxlen) GuiTrigger trigB; trigB.SetSimpleTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - GuiText okBtnTxt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText okBtnTxt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage okBtnImg(&btnOutline); if (Settings.wsprompt) { @@ -81,7 +81,7 @@ int OnScreenNumpad(char * var, u32 maxlen) } GuiButton okBtn(&okBtnImg, &okBtnImg, 0, 4, 5, -15, &trigA, btnSoundOver, btnSoundClick2, 1); okBtn.SetLabel(&okBtnTxt); - GuiText cancelBtnTxt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText cancelBtnTxt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage cancelBtnImg(&btnOutline); if (Settings.wsprompt) { @@ -95,6 +95,8 @@ int OnScreenNumpad(char * var, u32 maxlen) numpad.Append(&okBtn); numpad.Append(&cancelBtn); + int oldState = mainWindow->GetState(); + HaltGui(); mainWindow->SetState(STATE_DISABLED); mainWindow->Append(&numpad); @@ -117,7 +119,7 @@ int OnScreenNumpad(char * var, u32 maxlen) HaltGui(); mainWindow->Remove(&numpad); - mainWindow->SetState(STATE_DEFAULT); + mainWindow->SetState(oldState); ResumeGui(); gprintf("\t%s", (save == 1 ? "saved" : "discarded")); return save; @@ -145,7 +147,7 @@ int OnScreenKeyboard(char * var, u32 maxlen, int min) GuiTrigger trigB; trigB.SetSimpleTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - GuiText okBtnTxt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText okBtnTxt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage okBtnImg(&btnOutline); if (Settings.wsprompt) { @@ -154,7 +156,7 @@ int OnScreenKeyboard(char * var, u32 maxlen, int min) } GuiButton okBtn(&okBtnImg, &okBtnImg, 0, 4, 5, 15, &trigA, btnSoundOver, btnSoundClick2, 1); okBtn.SetLabel(&okBtnTxt); - GuiText cancelBtnTxt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText cancelBtnTxt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage cancelBtnImg(&btnOutline); if (Settings.wsprompt) { @@ -168,6 +170,8 @@ int OnScreenKeyboard(char * var, u32 maxlen, int min) keyboard.Append(&okBtn); keyboard.Append(&cancelBtn); + int oldState = mainWindow->GetState(); + HaltGui(); mainWindow->SetState(STATE_DISABLED); mainWindow->Append(&keyboard); @@ -190,7 +194,7 @@ int OnScreenKeyboard(char * var, u32 maxlen, int min) HaltGui(); mainWindow->Remove(&keyboard); - mainWindow->SetState(STATE_DEFAULT); + mainWindow->SetState(oldState); ResumeGui(); gprintf("\t%s", (save ? "saved" : "discarded")); return save; @@ -549,6 +553,7 @@ int WindowPrompt(const char *title, const char *msg, const char *btn1Label, cons if(btn4Label) Window->AddButton(btn4Label); + int oldState = mainWindow->GetState(); mainWindow->SetState(STATE_DISABLED); mainWindow->Append(Window); mainWindow->ChangeFocus(Window); @@ -574,7 +579,7 @@ int WindowPrompt(const char *title, const char *msg, const char *btn1Label, cons delete Window; - mainWindow->SetState(STATE_DEFAULT); + mainWindow->SetState(oldState); gprintf(" %i\n", choice); return choice; @@ -645,7 +650,7 @@ int WindowExitPrompt() batteryImg[i] = new GuiImage(&battery); batteryImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); batteryImg[i]->SetPosition(36, 0); - batteryImg[i]->SetTile(0); + batteryImg[i]->SetTileHorizontal(0); batteryBarImg[i] = new GuiImage(&batteryBar); batteryBarImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); batteryBarImg[i]->SetPosition(33, 0); @@ -769,6 +774,8 @@ int WindowExitPrompt() promptWindow.Append(batteryBtn[2]); promptWindow.Append(batteryBtn[3]); + int oldState = mainWindow->GetState(); + HaltGui(); mainWindow->SetState(STATE_DISABLED); mainWindow->Append(&promptWindow); @@ -796,13 +803,13 @@ int WindowExitPrompt() batteryBarImg[i]->SetImage(&batteryBar); } - batteryImg[i]->SetTile(level); + batteryImg[i]->SetTileHorizontal(level); batteryBtn[i]->SetAlpha(255); } else // controller not connected { - batteryImg[i]->SetTile(0); + batteryImg[i]->SetTileHorizontal(0); batteryImg[i]->SetImage(&battery); batteryBtn[i]->SetAlpha(70); } @@ -908,7 +915,7 @@ int WindowExitPrompt() homein->Stop(); delete homein; mainWindow->Remove(&promptWindow); - mainWindow->SetState(STATE_DEFAULT); + mainWindow->SetState(oldState); while (homeout->IsPlaying() > 0) usleep(100); homeout->Stop(); @@ -961,7 +968,7 @@ int DiscWait(const char *title, const char *msg, const char *btn1Label, const ch msgTxt.SetPosition(0, -40); msgTxt.SetMaxWidth(430); - GuiText btn1Txt(btn1Label, 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText btn1Txt(btn1Label, 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage btn1Img(&btnOutline); if (Settings.wsprompt) { @@ -985,7 +992,7 @@ int DiscWait(const char *title, const char *msg, const char *btn1Label, const ch btn1.SetTrigger(&trigB); btn1.SetState(STATE_SELECTED); - GuiText btn2Txt(btn2Label, 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText btn2Txt(btn2Label, 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage btn2Img(&btnOutline); if (Settings.wsprompt) { @@ -1185,7 +1192,7 @@ bool NetworkInitPrompt() msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); msgTxt.SetPosition(0, -40); - GuiText btn1Txt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText btn1Txt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage btn1Img(&btnOutline); if (Settings.wsprompt) { @@ -1283,7 +1290,7 @@ int CodeDownload(const char *id) msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); msg2Txt.SetPosition(0, 50); - GuiText btn1Txt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText btn1Txt(tr( "Cancel" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage btn1Img(&btnOutline); if (Settings.wsprompt) { @@ -1399,217 +1406,3 @@ int CodeDownload(const char *id) return ret; } -/**************************************************************************** - * HBCWindowPrompt - * - * Displays a prompt window to user, with information, an error message, or - * presenting a user with a choice of up to 2 Buttons. - * - ***************************************************************************/ -int HBCWindowPrompt(const char *name, const char *coder, const char *version, const char *release_date, - const char *long_description, GuiImageData * iconImgData, u64 filesize) -{ - int choice = -1; - - GuiWindow promptWindow(472, 320); - promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - promptWindow.SetPosition(0, 6); - - GuiTrigger trigA; - trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - GuiTrigger trigB; - trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - GuiTrigger trigU; - trigU.SetButtonOnlyTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); - GuiTrigger trigD; - trigD.SetButtonOnlyTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); - - GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); - GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); - GuiImageData whiteBox(Resources::GetFile("bg_options.png"), Resources::GetFileSize("bg_options.png")); - - GuiImageData scrollbar(Resources::GetFile("scrollbar.png"), Resources::GetFileSize("scrollbar.png")); - GuiImage scrollbarImg(&scrollbar); - scrollbarImg.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarImg.SetPosition(-40, 114); - scrollbarImg.SetSkew(0, 0, 0, 0, 0, -120, 0, -120); - - GuiImageData arrowDown(Resources::GetFile("scrollbar_arrowdown.png"), Resources::GetFileSize("scrollbar_arrowdown.png")); - GuiImage arrowDownImg(&arrowDown); - arrowDownImg.SetScale(.8); - - GuiImageData arrowUp(Resources::GetFile("scrollbar_arrowup.png"), Resources::GetFileSize("scrollbar_arrowup.png")); - GuiImage arrowUpImg(&arrowUp); - arrowUpImg.SetScale(.8); - - GuiButton arrowUpBtn(arrowUpImg.GetWidth(), arrowUpImg.GetHeight()); - arrowUpBtn.SetImage(&arrowUpImg); - arrowUpBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - arrowUpBtn.SetPosition(-25, 91); - arrowUpBtn.SetTrigger(&trigA); - arrowUpBtn.SetTrigger(&trigU); - arrowUpBtn.SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowUpBtn.SetSoundClick(btnSoundClick2); - - GuiButton arrowDownBtn(arrowDownImg.GetWidth(), arrowDownImg.GetHeight()); - arrowDownBtn.SetImage(&arrowDownImg); - arrowDownBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - arrowDownBtn.SetPosition(-25, -27); - arrowDownBtn.SetTrigger(&trigA); - arrowDownBtn.SetTrigger(&trigD); - arrowDownBtn.SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowDownBtn.SetSoundClick(btnSoundClick2); - - GuiImage *iconImg = new GuiImage(iconImgData); - iconImg->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - iconImg->SetPosition(45, 10); - - GuiImage dialogBoxImg(&dialogBox); - dialogBoxImg.SetSkew(0, -80, 0, -80, 0, 50, 0, 50); - - GuiImage whiteBoxImg(&whiteBox); - whiteBoxImg.SetPosition(0, 110); - whiteBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - whiteBoxImg.SetSkew(0, 0, 0, 0, 0, -120, 0, -120); - - GuiText nameTxt(name, 30, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - nameTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - nameTxt.SetPosition(0, -15); - nameTxt.SetMaxWidth(430, SCROLL_HORIZONTAL); - - GuiText coderTxt(fmt(tr( "Coded by: %s" ), coder), 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - coderTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - coderTxt.SetPosition(180, 30); - coderTxt.SetMaxWidth(280); - - GuiText versionTxt(fmt(tr( "Version: %s" ), version), 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - versionTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - versionTxt.SetPosition(40, 65); - versionTxt.SetMaxWidth(430); - - GuiText release_dateTxt(release_date, 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - release_dateTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - release_dateTxt.SetPosition(40, 85); - release_dateTxt.SetMaxWidth(430); - - int pagesize = 6; - Text long_descriptionTxt(long_description, 20, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - long_descriptionTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - long_descriptionTxt.SetPosition(46, 117); - long_descriptionTxt.SetMaxWidth(360); - long_descriptionTxt.SetLinesToDraw(pagesize); - long_descriptionTxt.Refresh(); - - //convert filesize from u64 to char and put unit of measurement after it - char filesizeCH[15]; - if (filesize <= 1024.0) - snprintf(filesizeCH, sizeof(filesizeCH), "%lld B", filesize); - if (filesize > 1024.0) - snprintf(filesizeCH, sizeof(filesizeCH), "%0.2f KB", filesize / 1024.0); - if (filesize > 1048576.0) - snprintf(filesizeCH, sizeof(filesizeCH), "%0.2f MB", filesize / 1048576.0); - - GuiText filesizeTxt(filesizeCH, 16, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - filesizeTxt.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - filesizeTxt.SetPosition(-40, 12); - - GuiText btn1Txt(tr( "Load" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - GuiImage btn1Img(&btnOutline); - if (Settings.wsprompt) - { - btn1Txt.SetWidescreen(Settings.widescreen); - btn1Img.SetWidescreen(Settings.widescreen); - } - - GuiButton btn1(&btn1Img, &btn1Img, 0, 3, 0, 0, &trigA, btnSoundOver, btnSoundClick2, 1); - btn1.SetLabel(&btn1Txt); - btn1.SetState(STATE_SELECTED); - - GuiText btn2Txt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); - GuiImage btn2Img(&btnOutline); - if (Settings.wsprompt) - { - btn2Txt.SetWidescreen(Settings.widescreen); - btn2Img.SetWidescreen(Settings.widescreen); - } - GuiButton btn2(&btn2Img, &btn2Img, 0, 3, 0, 0, &trigA, btnSoundOver, btnSoundClick2, 1); - btn2.SetLabel(&btn2Txt); - btn2.SetTrigger(&trigB); - - btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - btn1.SetPosition(40, 2); - btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - btn2.SetPosition(-40, 2); - - promptWindow.Append(&dialogBoxImg); - promptWindow.Append(&whiteBoxImg); - promptWindow.Append(&scrollbarImg); - promptWindow.Append(&arrowDownBtn); - promptWindow.Append(&arrowUpBtn); - - if(strcmp(name, "") != 0) promptWindow.Append(&nameTxt); - if(strcmp(version, "") != 0) promptWindow.Append(&versionTxt); - if(strcmp(coder, "") != 0) promptWindow.Append(&coderTxt); - if(strcmp(release_date, "") != 0) promptWindow.Append(&release_dateTxt); - if(strcmp(long_description, "") != 0) promptWindow.Append(&long_descriptionTxt); - promptWindow.Append(&filesizeTxt); - promptWindow.Append(iconImg); - promptWindow.Append(&btn1); - promptWindow.Append(&btn2); - - promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); - HaltGui(); - mainWindow->SetState(STATE_DISABLED); - mainWindow->Append(&promptWindow); - mainWindow->ChangeFocus(&promptWindow); - ResumeGui(); - - while (choice == -1) - { - VIDEO_WaitVSync(); - - if (shutdown == 1) - { - wiilight(0); - Sys_Shutdown(); - } - else if (reset == 1) - { - wiilight(0); - Sys_Reboot(); - } - - if (btn1.GetState() == STATE_CLICKED) - choice = 1; - else if (btn2.GetState() == STATE_CLICKED) - choice = 0; - - else if (arrowUpBtn.GetState() == STATE_CLICKED || arrowUpBtn.GetState() == STATE_HELD) - { - long_descriptionTxt.PreviousLine(); - - usleep(6000); - if (!((ButtonsHold() & WPAD_BUTTON_UP) || (ButtonsHold() & PAD_BUTTON_UP))) arrowUpBtn.ResetState(); - } - else if (arrowDownBtn.GetState() == STATE_CLICKED || arrowDownBtn.GetState() == STATE_HELD) - { - long_descriptionTxt.NextLine(); - - usleep(60000); - if (!((ButtonsHold() & WPAD_BUTTON_DOWN) || (ButtonsHold() & PAD_BUTTON_DOWN))) arrowDownBtn.ResetState(); - } - } - - promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); - while (promptWindow.GetEffect() > 0) - usleep(100); - HaltGui(); - mainWindow->Remove(&promptWindow); - mainWindow->SetState(STATE_DEFAULT); - ResumeGui(); - - delete iconImg; - - return choice; -} - diff --git a/source/prompts/PromptWindows.h b/source/prompts/PromptWindows.h index 7f58570b..1e14d03f 100644 --- a/source/prompts/PromptWindows.h +++ b/source/prompts/PromptWindows.h @@ -8,7 +8,7 @@ #ifndef _PROMPTWINDOWS_H_ #define _PROMPTWINDOWS_H_ -#include "libwiigui/gui.h" +#include "GUI/gui.h" int WindowPrompt(const char *title, const char *msg = NULL, const char * btn1Label = NULL, const char * btn2Label = NULL, const char * btn3Label = NULL, const char * btn4Label = NULL, int wait = -1); @@ -22,7 +22,5 @@ int FormatingPartition(const char *title, int part_num); bool NetworkInitPrompt(); int WindowScreensaver(); int CodeDownload(const char *id); -int HBCWindowPrompt(const char *name, const char *coder, const char *version, const char *release_date, - const char *long_description, GuiImageData * iconImgData, u64 filesize); #endif diff --git a/source/prompts/TitleBrowser.cpp b/source/prompts/TitleBrowser.cpp index dfc57ecc..12ff4b5e 100644 --- a/source/prompts/TitleBrowser.cpp +++ b/source/prompts/TitleBrowser.cpp @@ -9,8 +9,8 @@ #include #include "language/gettext.h" -#include "libwiigui/gui.h" -#include "libwiigui/gui_customoptionbrowser.h" +#include "GUI/gui.h" +#include "GUI/gui_optionbrowser.h" #include "prompts/PromptWindows.h" #include "prompts/ProgressWindow.h" #include "network/networkops.h" @@ -134,7 +134,7 @@ bool TitleSelector(char output[]) GuiTrigger trigB; trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - GuiText cancelBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText cancelBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); cancelBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage cancelBtnImg(&btnOutline); if (Settings.wsprompt) @@ -146,7 +146,7 @@ bool TitleSelector(char output[]) cancelBtn.SetLabel(&cancelBtnTxt); cancelBtn.SetTrigger(&trigB); - GuiCustomOptionBrowser optionBrowser4(396, 280, &options4, "bg_options_settings.png"); + GuiOptionBrowser optionBrowser4(396, 280, &options4, "bg_options_settings.png"); optionBrowser4.SetPosition(0, 90); optionBrowser4.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); @@ -370,7 +370,7 @@ int TitleBrowser() settingsbackgroundbtn.SetPosition(0, 0); settingsbackgroundbtn.SetImage(&settingsbackground); - GuiText cancelBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText cancelBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); cancelBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage cancelBtnImg(&btnOutline); if (Settings.wsprompt) @@ -383,11 +383,11 @@ int TitleBrowser() cancelBtn.SetLabel(&cancelBtnTxt); cancelBtn.SetTrigger(&trigB); - GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, "bg_options_settings.png"); + GuiOptionBrowser optionBrowser3(396, 280, &options3, "bg_options_settings.png"); optionBrowser3.SetPosition(0, 90); optionBrowser3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - GuiImageData wifiImgData(Resources::GetFile("Wifi_btn.png"), Resources::GetFileSize("Wifi_btn.png")); + GuiImageData wifiImgData(Resources::GetFile("wifi_btn.png"), Resources::GetFileSize("wifi_btn.png")); GuiImage wifiImg(&wifiImgData); if (Settings.wsprompt) { diff --git a/source/prompts/filebrowser.cpp b/source/prompts/filebrowser.cpp index 5aeea416..5db465e2 100644 --- a/source/prompts/filebrowser.cpp +++ b/source/prompts/filebrowser.cpp @@ -25,7 +25,7 @@ #include "FileOperations/fileops.h" #include "language/gettext.h" #include "PromptWindows.h" -#include "libwiigui/gui.h" +#include "GUI/gui_filebrowser.h" #include "sys.h" #include "filebrowser.h" @@ -355,7 +355,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*= usbBtn.SetTrigger(&trigA); usbBtn.SetEffectGrow(); - GuiText okBtnTxt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText okBtnTxt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage okBtnImg(&btnOutline); if (Settings.wsprompt) { @@ -444,7 +444,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*= LOCK( &fileBrowser ); ParseDirectory((char*) NULL, Flags, Filter); fileBrowser.ResetState(); - fileBrowser.TriggerUpdate(); + fileBrowser.UpdateList(); AdressText.SetTextf("%s%s", browser->rootdir, browser->dir); } clickedIndex = -1; @@ -480,7 +480,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*= if (ParseDirectory((curDevice + i) % browsers.size(), Flags, Filter) == 0) { fileBrowser.ResetState(); - fileBrowser.TriggerUpdate(); + fileBrowser.UpdateList(); AdressText.SetTextf("%s%s", browser->rootdir, browser->dir); usbBtnTxt.SetText(browsers[(curDevice + 1) % browsers.size()].rootdir); break; @@ -520,7 +520,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*= if (ParseDirectory(newfolder, Flags, Filter) == 0) { fileBrowser.ResetState(); - fileBrowser.TriggerUpdate(); + fileBrowser.UpdateList(); AdressText.SetTextf("%s%s", browser->rootdir, browser->dir); usbBtnTxt.SetText(browsers[(curDevice + 1) % browsers.size()].rootdir); } diff --git a/source/prompts/gameinfo.cpp b/source/prompts/gameinfo.cpp index efe212db..daffcdf2 100644 --- a/source/prompts/gameinfo.cpp +++ b/source/prompts/gameinfo.cpp @@ -8,8 +8,8 @@ #include "usbloader/wbfs.h" #include "settings/CGameCategories.hpp" #include "language/gettext.h" -#include "libwiigui/gui.h" -#include "libwiigui/Text.hpp" +#include "GUI/gui.h" +#include "GUI/Text.hpp" #include "xml/xml.h" #include "menu.h" #include "menu/menus.h" @@ -389,6 +389,9 @@ static int InternalShowGameInfo(char *ID) else if (GameInfo.Players == 2) playersImgData = Resources::GetImageData("wiimote2.png"); + else if (GameInfo.Players == 3) + playersImgData = Resources::GetImageData("wiimote3.png"); + else if (GameInfo.Players == 4) playersImgData = Resources::GetImageData("wiimote4.png"); diff --git a/source/settings/CCategoryList.hpp b/source/settings/CCategoryList.hpp index 6ebc4a5a..6cb6c2da 100644 --- a/source/settings/CCategoryList.hpp +++ b/source/settings/CCategoryList.hpp @@ -51,6 +51,7 @@ class CCategoryList bool findCategory(unsigned int id) { listIter = nameList.find(id); return listIter != nameList.end(); }; int pos() const { return distance(nameList.begin(), listIter); } int size() const { return nameList.size(); } + void clear() { nameList.clear(); } private: string configPath; map::const_iterator listIter; diff --git a/source/settings/CGameCategories.cpp b/source/settings/CGameCategories.cpp index 12710ff3..32c4fb33 100644 --- a/source/settings/CGameCategories.cpp +++ b/source/settings/CGameCategories.cpp @@ -98,6 +98,8 @@ bool CGameCategories::Load(string filepath) if(!buffer) return false; + clear(); + mxml_node_t *xmlfile = mxmlLoadString(NULL, (const char *) buffer, MXML_OPAQUE_CALLBACK); if(!ValidVersion(xmlfile)) diff --git a/source/settings/CGameCategories.hpp b/source/settings/CGameCategories.hpp index 8adcee0f..41da6113 100644 --- a/source/settings/CGameCategories.hpp +++ b/source/settings/CGameCategories.hpp @@ -51,6 +51,7 @@ class CGameCategories const vector &operator[](const char *gameID) const; const vector &operator[](const unsigned char *gameID) const { return operator[]((const char *) gameID); } bool ImportFromWiiTDB(const string &xmlpath); + void clear() { List.clear(); CategoryList.clear(); }; static bool isInCategory(const char *gameID, unsigned int id); CCategoryList CategoryList; diff --git a/source/settings/SettingsPrompts.cpp b/source/settings/SettingsPrompts.cpp index e7f8845e..163dd56e 100644 --- a/source/settings/SettingsPrompts.cpp +++ b/source/settings/SettingsPrompts.cpp @@ -6,8 +6,8 @@ #include "language/UpdateLanguage.h" #include "prompts/PromptWindows.h" #include "prompts/ProgressWindow.h" -#include "libwiigui/gui.h" -#include "libwiigui/gui_customoptionbrowser.h" +#include "GUI/gui.h" +#include "GUI/gui_optionbrowser.h" #include "settings/CSettings.h" #include "settings/GameTitles.h" #include "themes/CTheme.h" @@ -128,7 +128,7 @@ int MenuLanguageSelect() oggmenubackground.SetAlignment( ALIGN_LEFT, ALIGN_TOP ); oggmenubackground.SetPosition( 0, 0 ); - GuiText backBtnTxt( tr( "Back" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText backBtnTxt( tr( "Back" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); backBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 ); GuiImage backBtnImg( &btnOutline ); if ( Settings.wsprompt == ON ) @@ -147,7 +147,7 @@ int MenuLanguageSelect() backBtn.SetTrigger( &trigB ); backBtn.SetEffectGrow(); - GuiText defaultBtnTxt( tr( "Default" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText defaultBtnTxt( tr( "Default" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); defaultBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 ); GuiImage defaultBtnImg( &btnOutline ); if ( Settings.wsprompt == ON ) @@ -165,7 +165,7 @@ int MenuLanguageSelect() defaultBtn.SetTrigger( &trigA ); defaultBtn.SetEffectGrow(); - GuiText updateBtnTxt( tr( "Update Files" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText updateBtnTxt( tr( "Update Files" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); updateBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 ); GuiImage updateBtnImg( &btnOutline ); if ( Settings.wsprompt == ON ) @@ -196,7 +196,7 @@ int MenuLanguageSelect() } - GuiCustomOptionBrowser optionBrowser4( 396, 280, &options2, "bg_options_settings.png"); + GuiOptionBrowser optionBrowser4( 396, 280, &options2, "bg_options_settings.png"); optionBrowser4.SetPosition( 0, 90 ); optionBrowser4.SetAlignment( ALIGN_CENTRE, ALIGN_TOP ); diff --git a/source/settings/menus/FlyingButtonsMenu.cpp b/source/settings/menus/FlyingButtonsMenu.cpp index 7fbd7ae7..f6127980 100644 --- a/source/settings/menus/FlyingButtonsMenu.cpp +++ b/source/settings/menus/FlyingButtonsMenu.cpp @@ -81,7 +81,7 @@ FlyingButtonsMenu::FlyingButtonsMenu(const char * menu_title) homeBtn->SetTrigger(trigHome); Append(homeBtn); - backBtnTxt = new GuiText(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + backBtnTxt = new GuiText(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); backBtnTxt->SetMaxWidth(btnOutline->GetWidth() - 30); backBtnImg = new GuiImage(btnOutline); if (Settings.wsprompt == ON) diff --git a/source/settings/menus/FlyingButtonsMenu.hpp b/source/settings/menus/FlyingButtonsMenu.hpp index 5b24e4f0..3efbe745 100644 --- a/source/settings/menus/FlyingButtonsMenu.hpp +++ b/source/settings/menus/FlyingButtonsMenu.hpp @@ -26,7 +26,7 @@ #include #include -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "SettingsMenu.hpp" #include "menu.h" diff --git a/source/settings/menus/GUISettingsMenu.cpp b/source/settings/menus/GUISettingsMenu.cpp index c28d0b55..ca236730 100644 --- a/source/settings/menus/GUISettingsMenu.cpp +++ b/source/settings/menus/GUISettingsMenu.cpp @@ -127,7 +127,7 @@ GuiSettingsMenu::GuiSettingsMenu() Options->SetName(Idx++, "%s", tr( "Mark new games" )); Options->SetName(Idx++, "%s", tr( "Show Free Space" )); Options->SetName(Idx++, "%s", tr( "HOME Menu" )); - Options->SetName(Idx++, "%s", tr( "Import categories from WiiTDB" )); + Options->SetName(Idx++, "%s", tr( "Import Categories" )); SetOptionValues(); diff --git a/source/settings/menus/GameLoadSM.cpp b/source/settings/menus/GameLoadSM.cpp index 97e9b211..663d0119 100644 --- a/source/settings/menus/GameLoadSM.cpp +++ b/source/settings/menus/GameLoadSM.cpp @@ -103,7 +103,7 @@ GameLoadSM::GameLoadSM(const char * GameID) trigA = new GuiTrigger(); trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - saveBtnTxt = new GuiText(tr( "Save" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + saveBtnTxt = new GuiText(tr( "Save" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); saveBtnTxt->SetMaxWidth(btnOutline->GetWidth() - 30); saveBtnImg = new GuiImage (btnOutline); if (Settings.wsprompt == ON) diff --git a/source/settings/menus/GameSettingsMenu.cpp b/source/settings/menus/GameSettingsMenu.cpp index 3252c38a..5f8b1f6d 100644 --- a/source/settings/menus/GameSettingsMenu.cpp +++ b/source/settings/menus/GameSettingsMenu.cpp @@ -101,14 +101,9 @@ void GameSettingsMenu::CreateSettingsMenu(int menuNr) else if(menuNr == Idx++) { HideMenu(); - titleTxt = new GuiText(MenuTitle.c_str(), 28, ( GXColor ) {0, 0, 0, 255}); - titleTxt->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - titleTxt->SetPosition(0, 40); - titleTxt->SetMaxWidth(310, SCROLL_HORIZONTAL); - Append(titleTxt); Remove(backBtn); ResumeGui(); - SetState(STATE_DISABLED); + mainWindow->SetState(STATE_DISABLED); CategorySelectPrompt promptMenu(DiscHeader); promptMenu.SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE); promptMenu.SetEffect(EFFECT_FADE, 20); @@ -125,10 +120,7 @@ void GameSettingsMenu::CreateSettingsMenu(int menuNr) gameList.FilterList(oldFilter.c_str()); browserMenu->ReloadBrowser(); } - SetState(STATE_DEFAULT); - Remove(titleTxt); - delete titleTxt; - titleTxt = NULL; + mainWindow->SetState(STATE_DEFAULT); Append(backBtn); ShowMenu(); } diff --git a/source/settings/menus/SettingsMenu.cpp b/source/settings/menus/SettingsMenu.cpp index fa7b40dc..a6c64171 100644 --- a/source/settings/menus/SettingsMenu.cpp +++ b/source/settings/menus/SettingsMenu.cpp @@ -57,14 +57,14 @@ SettingsMenu::SettingsMenu(const char * title, OptionList * opts, int returnTo) Append(backBtn); } - optionBrowser = new GuiCustomOptionBrowser(396, 280, Options, "bg_options_settings.png"); - optionBrowser->SetPosition(0, 90); - optionBrowser->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser = new GuiOptionBrowser(396, 280, Options, "bg_options_settings.png"); + optionBrowser->SetAlignment(thAlign("center - settings option browser align hor"), thAlign("top - settings option browser align ver")); + optionBrowser->SetPosition(thInt("0 - settings option browser pos x"), thInt("90 - settings option browser pos y")); - titleTxt = new GuiText(title, 28, (GXColor) {0, 0, 0, 255}); - titleTxt->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - titleTxt->SetPosition(0, 40); - titleTxt->SetMaxWidth(310, SCROLL_HORIZONTAL); + titleTxt = new GuiText(title, 28, thColor("r=0 g=0 b=0 a=255 - settings title text color")); + titleTxt->SetAlignment(thAlign("center - settings title text align hor"), thAlign("top - settings title text align ver")); + titleTxt->SetPosition(thInt("0 - settings title text pos x"), thInt("40 - settings title text pos y")); + titleTxt->SetMaxWidth(thInt("310 - settings title text max width"), SCROLL_HORIZONTAL); Append(optionBrowser); Append(titleTxt); diff --git a/source/settings/menus/SettingsMenu.hpp b/source/settings/menus/SettingsMenu.hpp index b23a618b..24e08dfd 100644 --- a/source/settings/menus/SettingsMenu.hpp +++ b/source/settings/menus/SettingsMenu.hpp @@ -24,8 +24,8 @@ #ifndef SETTINGS_MENU_HPP_ #define SETTINGS_MENU_HPP_ -#include "libwiigui/gui.h" -#include "libwiigui/gui_customoptionbrowser.h" +#include "GUI/gui.h" +#include "GUI/gui_optionbrowser.h" #include "menu.h" enum @@ -64,7 +64,7 @@ class SettingsMenu : public GuiWindow GuiImage * backBtnImg; GuiButton * backBtn; - GuiCustomOptionBrowser * optionBrowser; + GuiOptionBrowser * optionBrowser; }; diff --git a/source/themes/CTheme.cpp b/source/themes/CTheme.cpp index 1bd5ff97..b3763586 100644 --- a/source/themes/CTheme.cpp +++ b/source/themes/CTheme.cpp @@ -27,7 +27,7 @@ #include #include "CTheme.h" -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "settings/CSettings.h" #include "FileOperations/fileops.h" #include "menu/menus.h" diff --git a/source/themes/Resources.cpp b/source/themes/Resources.cpp index 3c6d4de6..0834edde 100644 --- a/source/themes/Resources.cpp +++ b/source/themes/Resources.cpp @@ -1,199 +1,8 @@ #include #include #include "FileOperations/fileops.h" -#include "filelist.h" #include "Resources.h" - -RecourceFile Resources::RecourceFiles[] = -{ - {"closebutton.png", closebutton_png, closebutton_png_size, NULL, 0}, - {"gxlogo.png", gxlogo_png, gxlogo_png_size, NULL, 0}, - {"sdcard.png", sdcard_png, sdcard_png_size, NULL, 0}, - {"sdcard_over.png", sdcard_over_png, sdcard_over_png_size, NULL, 0}, - {"Wifi_btn.png", Wifi_btn_png, Wifi_btn_png_size, NULL, 0}, - {"wiimote.png", wiimote_png, wiimote_png_size, NULL, 0}, - {"gameinfo1.png", gameinfo1_png, gameinfo1_png_size, NULL, 0}, - {"gameinfo2.png", gameinfo2_png, gameinfo2_png_size, NULL, 0}, - {"gameinfo1a.png", gameinfo1a_png, gameinfo1a_png_size, NULL, 0}, - {"gameinfo2a.png", gameinfo2a_png, gameinfo2a_png_size, NULL, 0}, - {"credits_button.png", credits_button_png, credits_button_png_size, NULL, 0}, - {"credits_button_over.png", credits_button_over_png, credits_button_over_png_size, NULL, 0}, - {"tooltip_left.png", tooltip_left_png, tooltip_left_png_size, NULL, 0}, - {"tooltip_tile.png", tooltip_tile_png, tooltip_tile_png_size, NULL, 0}, - {"tooltip_right.png", tooltip_right_png, tooltip_right_png_size, NULL, 0}, - {"startgame_arrow_left.png", startgame_arrow_left_png, startgame_arrow_left_png_size, NULL, 0}, - {"startgame_arrow_right.png", startgame_arrow_right_png, startgame_arrow_right_png_size, NULL, 0}, - {"credits_bg.png", credits_bg_png, credits_bg_png_size, NULL, 0}, - {"little_star.png", little_star_png, little_star_png_size, NULL, 0}, - {"background.png", background_png, background_png_size, NULL, 0}, - {"wbackground.png", wbackground_png, wbackground_png_size, NULL, 0}, - {"bg_options_settings.png", bg_options_settings_png, bg_options_settings_png_size, NULL, 0}, - {"settings_background.png", settings_background_png, settings_background_png_size, NULL, 0}, - {"bg_browser.png", bg_browser_png, bg_browser_png_size, NULL, 0}, - {"icon_folder.png", icon_folder_png, icon_folder_png_size, NULL, 0}, - {"bg_browser_selection.png", bg_browser_selection_png, bg_browser_selection_png_size, NULL, 0}, - {"addressbar_textbox.png", addressbar_textbox_png, addressbar_textbox_png_size, NULL, 0}, - {"browser.png", browser_png, browser_png_size, NULL, 0}, - {"browser_over.png", browser_over_png, browser_over_png_size, NULL, 0}, - {"nocover.png", nocover_png, nocover_png_size, NULL, 0}, - {"nocoverFlat.png", nocoverFlat_png, nocoverFlat_png_size, NULL, 0}, - {"nodisc.png", nodisc_png, nodisc_png_size, NULL, 0}, - {"theme_dialogue_box.png", theme_dialogue_box_png, theme_dialogue_box_png_size, NULL, 0}, - {"button_install.png", button_install_png, button_install_png_size, NULL, 0}, - {"button_install_over.png", button_install_over_png, button_install_over_png_size, NULL, 0}, - {"dialogue_box_startgame.png", dialogue_box_startgame_png, dialogue_box_startgame_png_size, NULL, 0}, - {"wdialogue_box_startgame.png", wdialogue_box_startgame_png, wdialogue_box_startgame_png_size, NULL, 0}, - {"button_dialogue_box.png", button_dialogue_box_png, button_dialogue_box_png_size, NULL, 0}, - {"keyboard_textbox.png", keyboard_textbox_png, keyboard_textbox_png_size, NULL, 0}, - {"keyboard_key.png", keyboard_key_png, keyboard_key_png_size, NULL, 0}, - {"keyboard_key_over.png", keyboard_key_over_png, keyboard_key_over_png_size, NULL, 0}, - {"keyboard_mediumkey_over.png", keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size, NULL, 0}, - {"keyboard_largekey_over.png", keyboard_largekey_over_png, keyboard_largekey_over_png_size, NULL, 0}, - {"keyboard_backspace_over.png", keyboard_backspace_over_png, keyboard_backspace_over_png_size, NULL, 0}, - {"keyboard_clear_over.png", keyboard_clear_over_png, keyboard_clear_over_png_size, NULL, 0}, - {"menu_button.png", menu_button_png, menu_button_png_size, NULL, 0}, - {"menu_button_over.png", menu_button_over_png, menu_button_over_png_size, NULL, 0}, - {"settings_button.png", settings_button_png, settings_button_png_size, NULL, 0}, - {"settings_button_over.png", settings_button_over_png, settings_button_over_png_size, NULL, 0}, - {"wiimote_poweroff.png", wiimote_poweroff_png, wiimote_poweroff_png_size, NULL, 0}, - {"dialogue_box.png", dialogue_box_png, dialogue_box_png_size, NULL, 0}, - {"theme_box.png", theme_box_png, theme_box_png_size, NULL, 0}, - {"wiimote_poweroff_over.png", wiimote_poweroff_over_png, wiimote_poweroff_over_png_size, NULL, 0}, - {"bg_options.png", bg_options_png, bg_options_png_size, NULL, 0}, - {"bg_options_entry.png", bg_options_entry_png, bg_options_entry_png_size, NULL, 0}, - {"scrollbar.png", scrollbar_png, scrollbar_png_size, NULL, 0}, - {"scrollbar_arrowup.png", scrollbar_arrowup_png, scrollbar_arrowup_png_size, NULL, 0}, - {"scrollbar_arrowdown.png", scrollbar_arrowdown_png, scrollbar_arrowdown_png_size, NULL, 0}, - {"scrollbar_box.png", scrollbar_box_png, scrollbar_box_png_size, NULL, 0}, - {"progressbar.png", progressbar_png, progressbar_png_size, NULL, 0}, - {"progressbar_empty.png", progressbar_empty_png, progressbar_empty_png_size, NULL, 0}, - {"progressbar_outline.png", progressbar_outline_png, progressbar_outline_png_size, NULL, 0}, - {"player1_point.png", player1_point_png, player1_point_png_size, NULL, 0}, - {"player2_point.png", player2_point_png, player2_point_png_size, NULL, 0}, - {"player3_point.png", player3_point_png, player3_point_png_size, NULL, 0}, - {"player4_point.png", player4_point_png, player4_point_png_size, NULL, 0}, - {"player1_grab.png", player1_grab_png, player1_grab_png_size, NULL, 0}, - {"player2_grab.png", player2_grab_png, player2_grab_png_size, NULL, 0}, - {"player3_grab.png", player3_grab_png, player3_grab_png_size, NULL, 0}, - {"player4_grab.png", player4_grab_png, player4_grab_png_size, NULL, 0}, - {"rplayer1_point.png", rplayer1_point_png, rplayer1_point_png_size, NULL, 0}, - {"rplayer2_point.png", rplayer2_point_png, rplayer2_point_png_size, NULL, 0}, - {"rplayer3_point.png", rplayer3_point_png, rplayer3_point_png_size, NULL, 0}, - {"rplayer4_point.png", rplayer4_point_png, rplayer4_point_png_size, NULL, 0}, - {"battery.png", battery_png, battery_png_size, NULL, 0}, - {"battery_bar.png", battery_bar_png, battery_bar_png_size, NULL, 0}, - {"battery_white.png", battery_white_png, battery_white_png_size, NULL, 0}, - {"battery_red.png", battery_red_png, battery_red_png_size, NULL, 0}, - {"battery_bar_white.png", battery_bar_white_png, battery_bar_white_png_size, NULL, 0}, - {"battery_bar_red.png", battery_bar_red_png, battery_bar_red_png_size, NULL, 0}, - {"exit_top.png", exit_top_png, exit_top_png_size, NULL, 0}, - {"exit_top_over.png", exit_top_over_png, exit_top_over_png_size, NULL, 0}, - {"exit_bottom.png", exit_bottom_png, exit_bottom_png_size, NULL, 0}, - {"exit_bottom_over.png", exit_bottom_over_png, exit_bottom_over_png_size, NULL, 0}, - {"exit_button.png", exit_button_png, exit_button_png_size, NULL, 0}, - {"favorite.png", favorite_png, favorite_png_size, NULL, 0}, - {"not_favorite.png", not_favorite_png, not_favorite_png_size, NULL, 0}, - {"favIcon.png", favIcon_png, favIcon_png_size, NULL, 0}, - {"favIcon_gray.png", favIcon_gray_png, favIcon_gray_png_size, NULL, 0}, - {"searchIcon.png", searchIcon_png, searchIcon_png_size, NULL, 0}, - {"searchIcon_gray.png", searchIcon_gray_png, searchIcon_gray_png_size, NULL, 0}, - {"abcIcon.png", abcIcon_png, abcIcon_png_size, NULL, 0}, - {"rankIcon.png", rankIcon_png, rankIcon_png_size, NULL, 0}, - {"playCountIcon.png", playCountIcon_png, playCountIcon_png_size, NULL, 0}, - {"playersSort.png", playersSort_png, playersSort_png_size, NULL, 0}, - {"arrangeList.png", arrangeList_png, arrangeList_png_size, NULL, 0}, - {"arrangeList_gray.png", arrangeList_gray_png, arrangeList_gray_png_size, NULL, 0}, - {"arrangeGrid.png", arrangeGrid_png, arrangeGrid_png_size, NULL, 0}, - {"arrangeGrid_gray.png", arrangeGrid_gray_png, arrangeGrid_gray_png_size, NULL, 0}, - {"arrangeCarousel.png", arrangeCarousel_png, arrangeCarousel_png_size, NULL, 0}, - {"arrangeCarousel_gray.png", arrangeCarousel_gray_png, arrangeCarousel_gray_png_size, NULL, 0}, - {"settings_title.png", settings_title_png, settings_title_png_size, NULL, 0}, - {"settings_title_over.png", settings_title_over_png, settings_title_over_png_size, NULL, 0}, - {"pageindicator.png", pageindicator_png, pageindicator_png_size, NULL, 0}, - {"Wiimote1.png", Wiimote1_png, Wiimote1_png_size, NULL, 0}, - {"Wiimote2.png", Wiimote2_png, Wiimote2_png_size, NULL, 0}, - {"Wiimote4.png", Wiimote4_png, Wiimote4_png_size, NULL, 0}, - {"wifi1.png", wifi1_png, wifi1_png_size, NULL, 0}, - {"wifi2.png", wifi2_png, wifi2_png_size, NULL, 0}, - {"wifi3.png", wifi3_png, wifi3_png_size, NULL, 0}, - {"wifi4.png", wifi4_png, wifi4_png_size, NULL, 0}, - {"wifi8.png", wifi8_png, wifi8_png_size, NULL, 0}, - {"wifi12.png", wifi12_png, wifi12_png_size, NULL, 0}, - {"wifi16.png", wifi16_png, wifi16_png_size, NULL, 0}, - {"wifi32.png", wifi32_png, wifi32_png_size, NULL, 0}, - {"norating.png", norating_png, norating_png_size, NULL, 0}, - {"guitar.png", guitar_png, guitar_png_size, NULL, 0}, - {"guitarR.png", guitarR_png, guitarR_png_size, NULL, 0}, - {"microphone.png", microphone_png, microphone_png_size, NULL, 0}, - {"microphoneR.png", microphoneR_png, microphoneR_png_size, NULL, 0}, - {"gcncontroller.png", gcncontroller_png, gcncontroller_png_size, NULL, 0}, - {"gcncontrollerR.png", gcncontrollerR_png, gcncontrollerR_png_size, NULL, 0}, - {"classiccontroller.png", classiccontroller_png, classiccontroller_png_size, NULL, 0}, - {"classiccontrollerR.png", classiccontrollerR_png, classiccontrollerR_png_size, NULL, 0}, - {"nunchuk.png", nunchuk_png, nunchuk_png_size, NULL, 0}, - {"nunchukR.png", nunchukR_png, nunchukR_png_size, NULL, 0}, - {"dancepad.png", dancepad_png, dancepad_png_size, NULL, 0}, - {"dancepadR.png", dancepadR_png, dancepadR_png_size, NULL, 0}, - {"balanceboard.png", balanceboard_png, balanceboard_png_size, NULL, 0}, - {"balanceboardR.png", balanceboardR_png, balanceboardR_png_size, NULL, 0}, - {"drums.png", drums_png, drums_png_size, NULL, 0}, - {"drumsR.png", drumsR_png, drumsR_png_size, NULL, 0}, - {"motionplus.png", motionplus_png, motionplus_png_size, NULL, 0}, - {"motionplusR.png", motionplusR_png, motionplusR_png_size, NULL, 0}, - {"wheel.png", wheel_png, wheel_png_size, NULL, 0}, - {"wheelR.png", wheelR_png, wheelR_png_size, NULL, 0}, - {"zapper.png", zapper_png, zapper_png_size, NULL, 0}, - {"zapperR.png", zapperR_png, zapperR_png_size, NULL, 0}, - {"wiispeak.png", wiispeak_png, wiispeak_png_size, NULL, 0}, - {"wiispeakR.png", wiispeakR_png, wiispeakR_png_size, NULL, 0}, - {"nintendods.png", nintendods_png, nintendods_png_size, NULL, 0}, - {"nintendodsR.png", nintendodsR_png, nintendodsR_png_size, NULL, 0}, - {"esrb_ec.png", esrb_ec_png, esrb_ec_png_size, NULL, 0}, - {"esrb_e.png", esrb_e_png, esrb_e_png_size, NULL, 0}, - {"esrb_eten.png", esrb_eten_png, esrb_eten_png_size, NULL, 0}, - {"esrb_t.png", esrb_t_png, esrb_t_png_size, NULL, 0}, - {"esrb_m.png", esrb_m_png, esrb_m_png_size, NULL, 0}, - {"esrb_ao.png", esrb_ao_png, esrb_ao_png_size, NULL, 0}, - {"cero_a.png", cero_a_png, cero_a_png_size, NULL, 0}, - {"cero_b.png", cero_b_png, cero_b_png_size, NULL, 0}, - {"cero_c.png", cero_c_png, cero_c_png_size, NULL, 0}, - {"cero_d.png", cero_d_png, cero_d_png_size, NULL, 0}, - {"cero_z.png", cero_z_png, cero_z_png_size, NULL, 0}, - {"pegi_3.png", pegi_3_png, pegi_3_png_size, NULL, 0}, - {"pegi_7.png", pegi_7_png, pegi_7_png_size, NULL, 0}, - {"pegi_12.png", pegi_12_png, pegi_12_png_size, NULL, 0}, - {"pegi_16.png", pegi_16_png, pegi_16_png_size, NULL, 0}, - {"pegi_18.png", pegi_18_png, pegi_18_png_size, NULL, 0}, - {"dvd.png", dvd_png, dvd_png_size, NULL, 0}, - {"dvd_gray.png", dvd_gray_png, dvd_gray_png_size, NULL, 0}, - {"new.png", new_png, new_png_size, NULL, 0}, - {"lock.png", lock_png, lock_png_size, NULL, 0}, - {"lock_gray.png", lock_gray_png, lock_gray_png_size, NULL, 0}, - {"unlock.png", unlock_png, unlock_png_size, NULL, 0}, - {"unlock_gray.png", unlock_gray_png, unlock_gray_png_size, NULL, 0}, - {"Channel_btn.png", Channel_btn_png, Channel_btn_png_size, NULL, 0}, - {"boxBorder.png", boxBorder_png, boxBorder_png_size, NULL, 0}, - {"nocoverFull.png", nocoverFull_png, nocoverFull_png_size, NULL, 0}, - {"add.png", add_png, add_png_size, NULL, 0}, - {"back.png", back_png, back_png_size, NULL, 0}, - {"forward.png", forward_png, forward_png_size, NULL, 0}, - {"categoryPrompt.png", categoryPrompt_png, categoryPrompt_png_size, NULL, 0}, - {"categoryLine.png", categoryLine_png, categoryLine_png_size, NULL, 0}, - {"remove.png", remove_png, remove_png_size, NULL, 0}, - {"category.png", category_png, category_png_size, NULL, 0}, - {"category_gray.png", category_gray_png, category_gray_png_size, NULL, 0}, - {"button_click.wav", button_click_wav, button_click_wav_size, NULL, 0}, - {"button_click2.wav", button_click2_wav, button_click2_wav_size, NULL, 0}, - {"button_over.wav", button_over_wav, button_over_wav_size, NULL, 0}, - {"bg_music.ogg", bg_music_ogg, bg_music_ogg_size, NULL, 0}, - {"credits_music.ogg", credits_music_ogg, credits_music_ogg_size, NULL, 0}, - {"menuin.ogg", menuin_ogg, menuin_ogg_size, NULL, 0}, - {"menuout.ogg", menuout_ogg, menuout_ogg_size, NULL, 0}, - {"success.ogg", success_ogg, success_ogg_size, NULL, 0}, - {"font.ttf", font_ttf, font_ttf_size, NULL, 0}, - {"clock.ttf", clock_ttf, clock_ttf_size, NULL, 0}, - {NULL, NULL, 0, NULL, 0} -}; +#include "filelist.h" void Resources::Clear() { diff --git a/source/themes/Resources.h b/source/themes/Resources.h index 65afc944..a4216767 100644 --- a/source/themes/Resources.h +++ b/source/themes/Resources.h @@ -1,7 +1,7 @@ #ifndef RECOURCES_H_ #define RECOURCES_H_ -#include "libwiigui/gui_imagedata.h" +#include "GUI/gui_imagedata.h" typedef struct _RecourceFile { diff --git a/source/themes/ThemeDownloader.cpp b/source/themes/ThemeDownloader.cpp index a4cce52b..6b34581c 100644 --- a/source/themes/ThemeDownloader.cpp +++ b/source/themes/ThemeDownloader.cpp @@ -69,7 +69,7 @@ ThemeDownloader::ThemeDownloader() ThemePreviews[i] = NULL; - defaultBtnTxt = new GuiText(tr( "Default" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + defaultBtnTxt = new GuiText(tr( "Default" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); defaultBtnTxt->SetMaxWidth(btnOutline->GetWidth() - 30); defaultBtnImg = new GuiImage(btnOutline); if (Settings.wsprompt) @@ -326,7 +326,7 @@ void ThemeDownloader::MainButtonClicked(int button) authorTxt2.SetPosition(230, 120); authorTxt2.SetMaxWidth(dialogBox.GetWidth() - 220, DOTTED); - GuiText downloadBtnTxt(tr( "Download" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText downloadBtnTxt(tr( "Download" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); downloadBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage downloadBtnImg(&btnOutline); if (Settings.wsprompt) @@ -338,7 +338,7 @@ void ThemeDownloader::MainButtonClicked(int button) downloadBtn.SetLabel(&downloadBtnTxt); downloadBtn.SetScale(0.9); - GuiText backBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText backBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); backBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage backBtnImg(&btnOutline); if (Settings.wsprompt) diff --git a/source/themes/ThemeMenu.cpp b/source/themes/ThemeMenu.cpp index 8ea10068..68eaca2f 100644 --- a/source/themes/ThemeMenu.cpp +++ b/source/themes/ThemeMenu.cpp @@ -53,7 +53,7 @@ ThemeMenu::ThemeMenu() for(int i = 0; i < 4; ++i) ThemePreviews[i] = NULL; - defaultBtnTxt = new GuiText(tr( "Default" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + defaultBtnTxt = new GuiText(tr( "Default" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); defaultBtnTxt->SetMaxWidth(btnOutline->GetWidth() - 30); defaultBtnImg = new GuiImage(btnOutline); if (Settings.wsprompt) @@ -348,7 +348,7 @@ void ThemeMenu::MainButtonClicked(int button) versionTxt2.SetPosition(235+versionTxt.GetTextWidth(), PositionY); versionTxt2.SetMaxWidth(dialogBox.GetWidth() - 220, DOTTED); - GuiText applyBtnTxt(tr( "Apply" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText applyBtnTxt(tr( "Apply" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); applyBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage applyBtnImg(&btnOutline); if (Settings.wsprompt) @@ -360,7 +360,7 @@ void ThemeMenu::MainButtonClicked(int button) applyBtn.SetLabel(&applyBtnTxt); applyBtn.SetScale(0.9); - GuiText backBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText backBtnTxt(tr( "Back" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); backBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30); GuiImage backBtnImg(&btnOutline); if (Settings.wsprompt) diff --git a/source/themes/filelist.h b/source/themes/filelist.h new file mode 100644 index 00000000..2c24da28 --- /dev/null +++ b/source/themes/filelist.h @@ -0,0 +1,775 @@ +/**************************************************************************** + * USB Loader GX resource files. + * This file is generated automatically. + * Includes 189 files. + * + * NOTE: + * Any manual modification of this file will be overwriten by the generation. + ****************************************************************************/ +#ifndef _FILELIST_H_ +#define _FILELIST_H_ + +#include + +extern const u8 abcIcon_png[]; +extern const u32 abcIcon_png_size; + +extern const u8 add_png[]; +extern const u32 add_png_size; + +extern const u8 addressbar_textbox_png[]; +extern const u32 addressbar_textbox_png_size; + +extern const u8 arrangeCarousel_png[]; +extern const u32 arrangeCarousel_png_size; + +extern const u8 arrangeCarousel_gray_png[]; +extern const u32 arrangeCarousel_gray_png_size; + +extern const u8 arrangeGrid_png[]; +extern const u32 arrangeGrid_png_size; + +extern const u8 arrangeGrid_gray_png[]; +extern const u32 arrangeGrid_gray_png_size; + +extern const u8 arrangeList_png[]; +extern const u32 arrangeList_png_size; + +extern const u8 arrangeList_gray_png[]; +extern const u32 arrangeList_gray_png_size; + +extern const u8 background_png[]; +extern const u32 background_png_size; + +extern const u8 balanceboard_png[]; +extern const u32 balanceboard_png_size; + +extern const u8 balanceboardR_png[]; +extern const u32 balanceboardR_png_size; + +extern const u8 battery_png[]; +extern const u32 battery_png_size; + +extern const u8 battery_bar_png[]; +extern const u32 battery_bar_png_size; + +extern const u8 battery_bar_red_png[]; +extern const u32 battery_bar_red_png_size; + +extern const u8 battery_bar_white_png[]; +extern const u32 battery_bar_white_png_size; + +extern const u8 battery_red_png[]; +extern const u32 battery_red_png_size; + +extern const u8 battery_white_png[]; +extern const u32 battery_white_png_size; + +extern const u8 bg_browser_png[]; +extern const u32 bg_browser_png_size; + +extern const u8 bg_browser_selection_png[]; +extern const u32 bg_browser_selection_png_size; + +extern const u8 bg_options_png[]; +extern const u32 bg_options_png_size; + +extern const u8 bg_options_entry_png[]; +extern const u32 bg_options_entry_png_size; + +extern const u8 bg_options_settings_png[]; +extern const u32 bg_options_settings_png_size; + +extern const u8 boxBorder_png[]; +extern const u32 boxBorder_png_size; + +extern const u8 browser_png[]; +extern const u32 browser_png_size; + +extern const u8 browser_over_png[]; +extern const u32 browser_over_png_size; + +extern const u8 button_dialogue_box_png[]; +extern const u32 button_dialogue_box_png_size; + +extern const u8 button_install_png[]; +extern const u32 button_install_png_size; + +extern const u8 button_install_over_png[]; +extern const u32 button_install_over_png_size; + +extern const u8 category_png[]; +extern const u32 category_png_size; + +extern const u8 categoryPrompt_png[]; +extern const u32 categoryPrompt_png_size; + +extern const u8 category_gray_png[]; +extern const u32 category_gray_png_size; + +extern const u8 cero_a_png[]; +extern const u32 cero_a_png_size; + +extern const u8 cero_b_png[]; +extern const u32 cero_b_png_size; + +extern const u8 cero_c_png[]; +extern const u32 cero_c_png_size; + +extern const u8 cero_d_png[]; +extern const u32 cero_d_png_size; + +extern const u8 cero_z_png[]; +extern const u32 cero_z_png_size; + +extern const u8 channel_btn_png[]; +extern const u32 channel_btn_png_size; + +extern const u8 checkBoxSelection_png[]; +extern const u32 checkBoxSelection_png_size; + +extern const u8 classiccontroller_png[]; +extern const u32 classiccontroller_png_size; + +extern const u8 classiccontrollerR_png[]; +extern const u32 classiccontrollerR_png_size; + +extern const u8 closebutton_png[]; +extern const u32 closebutton_png_size; + +extern const u8 credits_bg_png[]; +extern const u32 credits_bg_png_size; + +extern const u8 credits_button_png[]; +extern const u32 credits_button_png_size; + +extern const u8 credits_button_over_png[]; +extern const u32 credits_button_over_png_size; + +extern const u8 dancepad_png[]; +extern const u32 dancepad_png_size; + +extern const u8 dancepadR_png[]; +extern const u32 dancepadR_png_size; + +extern const u8 dialogue_box_png[]; +extern const u32 dialogue_box_png_size; + +extern const u8 dialogue_box_startgame_png[]; +extern const u32 dialogue_box_startgame_png_size; + +extern const u8 drums_png[]; +extern const u32 drums_png_size; + +extern const u8 drumsR_png[]; +extern const u32 drumsR_png_size; + +extern const u8 dvd_png[]; +extern const u32 dvd_png_size; + +extern const u8 dvd_gray_png[]; +extern const u32 dvd_gray_png_size; + +extern const u8 esrb_ao_png[]; +extern const u32 esrb_ao_png_size; + +extern const u8 esrb_e_png[]; +extern const u32 esrb_e_png_size; + +extern const u8 esrb_ec_png[]; +extern const u32 esrb_ec_png_size; + +extern const u8 esrb_eten_png[]; +extern const u32 esrb_eten_png_size; + +extern const u8 esrb_m_png[]; +extern const u32 esrb_m_png_size; + +extern const u8 esrb_t_png[]; +extern const u32 esrb_t_png_size; + +extern const u8 exit_bottom_png[]; +extern const u32 exit_bottom_png_size; + +extern const u8 exit_bottom_over_png[]; +extern const u32 exit_bottom_over_png_size; + +extern const u8 exit_button_png[]; +extern const u32 exit_button_png_size; + +extern const u8 exit_top_png[]; +extern const u32 exit_top_png_size; + +extern const u8 exit_top_over_png[]; +extern const u32 exit_top_over_png_size; + +extern const u8 favIcon_png[]; +extern const u32 favIcon_png_size; + +extern const u8 favIcon_gray_png[]; +extern const u32 favIcon_gray_png_size; + +extern const u8 favorite_png[]; +extern const u32 favorite_png_size; + +extern const u8 gameinfo1_png[]; +extern const u32 gameinfo1_png_size; + +extern const u8 gameinfo1a_png[]; +extern const u32 gameinfo1a_png_size; + +extern const u8 gameinfo2_png[]; +extern const u32 gameinfo2_png_size; + +extern const u8 gameinfo2a_png[]; +extern const u32 gameinfo2a_png_size; + +extern const u8 gcncontroller_png[]; +extern const u32 gcncontroller_png_size; + +extern const u8 gcncontrollerR_png[]; +extern const u32 gcncontrollerR_png_size; + +extern const u8 guitar_png[]; +extern const u32 guitar_png_size; + +extern const u8 guitarR_png[]; +extern const u32 guitarR_png_size; + +extern const u8 gxlogo_png[]; +extern const u32 gxlogo_png_size; + +extern const u8 icon_folder_png[]; +extern const u32 icon_folder_png_size; + +extern const u8 keyboard_backspace_over_png[]; +extern const u32 keyboard_backspace_over_png_size; + +extern const u8 keyboard_clear_over_png[]; +extern const u32 keyboard_clear_over_png_size; + +extern const u8 keyboard_key_png[]; +extern const u32 keyboard_key_png_size; + +extern const u8 keyboard_key_over_png[]; +extern const u32 keyboard_key_over_png_size; + +extern const u8 keyboard_largekey_over_png[]; +extern const u32 keyboard_largekey_over_png_size; + +extern const u8 keyboard_mediumkey_over_png[]; +extern const u32 keyboard_mediumkey_over_png_size; + +extern const u8 keyboard_textbox_png[]; +extern const u32 keyboard_textbox_png_size; + +extern const u8 little_star_png[]; +extern const u32 little_star_png_size; + +extern const u8 lock_png[]; +extern const u32 lock_png_size; + +extern const u8 lock_gray_png[]; +extern const u32 lock_gray_png_size; + +extern const u8 menu_button_png[]; +extern const u32 menu_button_png_size; + +extern const u8 menu_button_over_png[]; +extern const u32 menu_button_over_png_size; + +extern const u8 microphone_png[]; +extern const u32 microphone_png_size; + +extern const u8 microphoneR_png[]; +extern const u32 microphoneR_png_size; + +extern const u8 motionplus_png[]; +extern const u32 motionplus_png_size; + +extern const u8 motionplusR_png[]; +extern const u32 motionplusR_png_size; + +extern const u8 new_png[]; +extern const u32 new_png_size; + +extern const u8 nintendods_png[]; +extern const u32 nintendods_png_size; + +extern const u8 nintendodsR_png[]; +extern const u32 nintendodsR_png_size; + +extern const u8 nocover_png[]; +extern const u32 nocover_png_size; + +extern const u8 nocoverFlat_png[]; +extern const u32 nocoverFlat_png_size; + +extern const u8 nocoverFull_png[]; +extern const u32 nocoverFull_png_size; + +extern const u8 nodisc_png[]; +extern const u32 nodisc_png_size; + +extern const u8 norating_png[]; +extern const u32 norating_png_size; + +extern const u8 not_favorite_png[]; +extern const u32 not_favorite_png_size; + +extern const u8 nunchuk_png[]; +extern const u32 nunchuk_png_size; + +extern const u8 nunchukR_png[]; +extern const u32 nunchukR_png_size; + +extern const u8 oneButtonScroll_png[]; +extern const u32 oneButtonScroll_png_size; + +extern const u8 pageindicator_png[]; +extern const u32 pageindicator_png_size; + +extern const u8 pegi_12_png[]; +extern const u32 pegi_12_png_size; + +extern const u8 pegi_16_png[]; +extern const u32 pegi_16_png_size; + +extern const u8 pegi_18_png[]; +extern const u32 pegi_18_png_size; + +extern const u8 pegi_3_png[]; +extern const u32 pegi_3_png_size; + +extern const u8 pegi_7_png[]; +extern const u32 pegi_7_png_size; + +extern const u8 playCountIcon_png[]; +extern const u32 playCountIcon_png_size; + +extern const u8 player1_grab_png[]; +extern const u32 player1_grab_png_size; + +extern const u8 player1_point_png[]; +extern const u32 player1_point_png_size; + +extern const u8 player2_grab_png[]; +extern const u32 player2_grab_png_size; + +extern const u8 player2_point_png[]; +extern const u32 player2_point_png_size; + +extern const u8 player3_grab_png[]; +extern const u32 player3_grab_png_size; + +extern const u8 player3_point_png[]; +extern const u32 player3_point_png_size; + +extern const u8 player4_grab_png[]; +extern const u32 player4_grab_png_size; + +extern const u8 player4_point_png[]; +extern const u32 player4_point_png_size; + +extern const u8 playersSort_png[]; +extern const u32 playersSort_png_size; + +extern const u8 progressbar_png[]; +extern const u32 progressbar_png_size; + +extern const u8 progressbar_empty_png[]; +extern const u32 progressbar_empty_png_size; + +extern const u8 progressbar_outline_png[]; +extern const u32 progressbar_outline_png_size; + +extern const u8 rankIcon_png[]; +extern const u32 rankIcon_png_size; + +extern const u8 remove_png[]; +extern const u32 remove_png_size; + +extern const u8 rename_png[]; +extern const u32 rename_png_size; + +extern const u8 rplayer1_point_png[]; +extern const u32 rplayer1_point_png_size; + +extern const u8 rplayer2_point_png[]; +extern const u32 rplayer2_point_png_size; + +extern const u8 rplayer3_point_png[]; +extern const u32 rplayer3_point_png_size; + +extern const u8 rplayer4_point_png[]; +extern const u32 rplayer4_point_png_size; + +extern const u8 scrollBarBottom_png[]; +extern const u32 scrollBarBottom_png_size; + +extern const u8 scrollBarTile_png[]; +extern const u32 scrollBarTile_png_size; + +extern const u8 scrollBarTop_png[]; +extern const u32 scrollBarTop_png_size; + +extern const u8 scrollbar_arrowdown_png[]; +extern const u32 scrollbar_arrowdown_png_size; + +extern const u8 scrollbar_arrowup_png[]; +extern const u32 scrollbar_arrowup_png_size; + +extern const u8 scrollbar_box_png[]; +extern const u32 scrollbar_box_png_size; + +extern const u8 sdcard_png[]; +extern const u32 sdcard_png_size; + +extern const u8 sdcard_over_png[]; +extern const u32 sdcard_over_png_size; + +extern const u8 searchIcon_png[]; +extern const u32 searchIcon_png_size; + +extern const u8 searchIcon_gray_png[]; +extern const u32 searchIcon_gray_png_size; + +extern const u8 settings_background_png[]; +extern const u32 settings_background_png_size; + +extern const u8 settings_button_png[]; +extern const u32 settings_button_png_size; + +extern const u8 settings_button_over_png[]; +extern const u32 settings_button_over_png_size; + +extern const u8 settings_title_png[]; +extern const u32 settings_title_png_size; + +extern const u8 settings_title_over_png[]; +extern const u32 settings_title_over_png_size; + +extern const u8 startgame_arrow_left_png[]; +extern const u32 startgame_arrow_left_png_size; + +extern const u8 startgame_arrow_right_png[]; +extern const u32 startgame_arrow_right_png_size; + +extern const u8 theme_box_png[]; +extern const u32 theme_box_png_size; + +extern const u8 theme_dialogue_box_png[]; +extern const u32 theme_dialogue_box_png_size; + +extern const u8 tooltip_left_png[]; +extern const u32 tooltip_left_png_size; + +extern const u8 tooltip_right_png[]; +extern const u32 tooltip_right_png_size; + +extern const u8 tooltip_tile_png[]; +extern const u32 tooltip_tile_png_size; + +extern const u8 unlock_png[]; +extern const u32 unlock_png_size; + +extern const u8 unlock_gray_png[]; +extern const u32 unlock_gray_png_size; + +extern const u8 wbackground_png[]; +extern const u32 wbackground_png_size; + +extern const u8 wdialogue_box_startgame_png[]; +extern const u32 wdialogue_box_startgame_png_size; + +extern const u8 wheel_png[]; +extern const u32 wheel_png_size; + +extern const u8 wheelR_png[]; +extern const u32 wheelR_png_size; + +extern const u8 wifi1_png[]; +extern const u32 wifi1_png_size; + +extern const u8 wifi12_png[]; +extern const u32 wifi12_png_size; + +extern const u8 wifi16_png[]; +extern const u32 wifi16_png_size; + +extern const u8 wifi2_png[]; +extern const u32 wifi2_png_size; + +extern const u8 wifi3_png[]; +extern const u32 wifi3_png_size; + +extern const u8 wifi32_png[]; +extern const u32 wifi32_png_size; + +extern const u8 wifi4_png[]; +extern const u32 wifi4_png_size; + +extern const u8 wifi8_png[]; +extern const u32 wifi8_png_size; + +extern const u8 wifi_btn_png[]; +extern const u32 wifi_btn_png_size; + +extern const u8 wiimote_png[]; +extern const u32 wiimote_png_size; + +extern const u8 wiimote1_png[]; +extern const u32 wiimote1_png_size; + +extern const u8 wiimote2_png[]; +extern const u32 wiimote2_png_size; + +extern const u8 wiimote3_png[]; +extern const u32 wiimote3_png_size; + +extern const u8 wiimote4_png[]; +extern const u32 wiimote4_png_size; + +extern const u8 wiimote_poweroff_png[]; +extern const u32 wiimote_poweroff_png_size; + +extern const u8 wiimote_poweroff_over_png[]; +extern const u32 wiimote_poweroff_over_png_size; + +extern const u8 wiispeak_png[]; +extern const u32 wiispeak_png_size; + +extern const u8 wiispeakR_png[]; +extern const u32 wiispeakR_png_size; + +extern const u8 zapper_png[]; +extern const u32 zapper_png_size; + +extern const u8 zapperR_png[]; +extern const u32 zapperR_png_size; + +extern const u8 bg_music_ogg[]; +extern const u32 bg_music_ogg_size; + +extern const u8 button_click_wav[]; +extern const u32 button_click_wav_size; + +extern const u8 button_click2_wav[]; +extern const u32 button_click2_wav_size; + +extern const u8 button_over_wav[]; +extern const u32 button_over_wav_size; + +extern const u8 credits_music_ogg[]; +extern const u32 credits_music_ogg_size; + +extern const u8 menuin_ogg[]; +extern const u32 menuin_ogg_size; + +extern const u8 menuout_ogg[]; +extern const u32 menuout_ogg_size; + +extern const u8 success_ogg[]; +extern const u32 success_ogg_size; + +extern const u8 clock_ttf[]; +extern const u32 clock_ttf_size; + +extern const u8 font_ttf[]; +extern const u32 font_ttf_size; + +RecourceFile Resources::RecourceFiles[] = +{ + {"abcIcon.png", abcIcon_png, abcIcon_png_size, NULL, 0}, + {"add.png", add_png, add_png_size, NULL, 0}, + {"addressbar_textbox.png", addressbar_textbox_png, addressbar_textbox_png_size, NULL, 0}, + {"arrangeCarousel.png", arrangeCarousel_png, arrangeCarousel_png_size, NULL, 0}, + {"arrangeCarousel_gray.png", arrangeCarousel_gray_png, arrangeCarousel_gray_png_size, NULL, 0}, + {"arrangeGrid.png", arrangeGrid_png, arrangeGrid_png_size, NULL, 0}, + {"arrangeGrid_gray.png", arrangeGrid_gray_png, arrangeGrid_gray_png_size, NULL, 0}, + {"arrangeList.png", arrangeList_png, arrangeList_png_size, NULL, 0}, + {"arrangeList_gray.png", arrangeList_gray_png, arrangeList_gray_png_size, NULL, 0}, + {"background.png", background_png, background_png_size, NULL, 0}, + {"balanceboard.png", balanceboard_png, balanceboard_png_size, NULL, 0}, + {"balanceboardR.png", balanceboardR_png, balanceboardR_png_size, NULL, 0}, + {"battery.png", battery_png, battery_png_size, NULL, 0}, + {"battery_bar.png", battery_bar_png, battery_bar_png_size, NULL, 0}, + {"battery_bar_red.png", battery_bar_red_png, battery_bar_red_png_size, NULL, 0}, + {"battery_bar_white.png", battery_bar_white_png, battery_bar_white_png_size, NULL, 0}, + {"battery_red.png", battery_red_png, battery_red_png_size, NULL, 0}, + {"battery_white.png", battery_white_png, battery_white_png_size, NULL, 0}, + {"bg_browser.png", bg_browser_png, bg_browser_png_size, NULL, 0}, + {"bg_browser_selection.png", bg_browser_selection_png, bg_browser_selection_png_size, NULL, 0}, + {"bg_options.png", bg_options_png, bg_options_png_size, NULL, 0}, + {"bg_options_entry.png", bg_options_entry_png, bg_options_entry_png_size, NULL, 0}, + {"bg_options_settings.png", bg_options_settings_png, bg_options_settings_png_size, NULL, 0}, + {"boxBorder.png", boxBorder_png, boxBorder_png_size, NULL, 0}, + {"browser.png", browser_png, browser_png_size, NULL, 0}, + {"browser_over.png", browser_over_png, browser_over_png_size, NULL, 0}, + {"button_dialogue_box.png", button_dialogue_box_png, button_dialogue_box_png_size, NULL, 0}, + {"button_install.png", button_install_png, button_install_png_size, NULL, 0}, + {"button_install_over.png", button_install_over_png, button_install_over_png_size, NULL, 0}, + {"category.png", category_png, category_png_size, NULL, 0}, + {"categoryPrompt.png", categoryPrompt_png, categoryPrompt_png_size, NULL, 0}, + {"category_gray.png", category_gray_png, category_gray_png_size, NULL, 0}, + {"cero_a.png", cero_a_png, cero_a_png_size, NULL, 0}, + {"cero_b.png", cero_b_png, cero_b_png_size, NULL, 0}, + {"cero_c.png", cero_c_png, cero_c_png_size, NULL, 0}, + {"cero_d.png", cero_d_png, cero_d_png_size, NULL, 0}, + {"cero_z.png", cero_z_png, cero_z_png_size, NULL, 0}, + {"channel_btn.png", channel_btn_png, channel_btn_png_size, NULL, 0}, + {"checkBoxSelection.png", checkBoxSelection_png, checkBoxSelection_png_size, NULL, 0}, + {"classiccontroller.png", classiccontroller_png, classiccontroller_png_size, NULL, 0}, + {"classiccontrollerR.png", classiccontrollerR_png, classiccontrollerR_png_size, NULL, 0}, + {"closebutton.png", closebutton_png, closebutton_png_size, NULL, 0}, + {"credits_bg.png", credits_bg_png, credits_bg_png_size, NULL, 0}, + {"credits_button.png", credits_button_png, credits_button_png_size, NULL, 0}, + {"credits_button_over.png", credits_button_over_png, credits_button_over_png_size, NULL, 0}, + {"dancepad.png", dancepad_png, dancepad_png_size, NULL, 0}, + {"dancepadR.png", dancepadR_png, dancepadR_png_size, NULL, 0}, + {"dialogue_box.png", dialogue_box_png, dialogue_box_png_size, NULL, 0}, + {"dialogue_box_startgame.png", dialogue_box_startgame_png, dialogue_box_startgame_png_size, NULL, 0}, + {"drums.png", drums_png, drums_png_size, NULL, 0}, + {"drumsR.png", drumsR_png, drumsR_png_size, NULL, 0}, + {"dvd.png", dvd_png, dvd_png_size, NULL, 0}, + {"dvd_gray.png", dvd_gray_png, dvd_gray_png_size, NULL, 0}, + {"esrb_ao.png", esrb_ao_png, esrb_ao_png_size, NULL, 0}, + {"esrb_e.png", esrb_e_png, esrb_e_png_size, NULL, 0}, + {"esrb_ec.png", esrb_ec_png, esrb_ec_png_size, NULL, 0}, + {"esrb_eten.png", esrb_eten_png, esrb_eten_png_size, NULL, 0}, + {"esrb_m.png", esrb_m_png, esrb_m_png_size, NULL, 0}, + {"esrb_t.png", esrb_t_png, esrb_t_png_size, NULL, 0}, + {"exit_bottom.png", exit_bottom_png, exit_bottom_png_size, NULL, 0}, + {"exit_bottom_over.png", exit_bottom_over_png, exit_bottom_over_png_size, NULL, 0}, + {"exit_button.png", exit_button_png, exit_button_png_size, NULL, 0}, + {"exit_top.png", exit_top_png, exit_top_png_size, NULL, 0}, + {"exit_top_over.png", exit_top_over_png, exit_top_over_png_size, NULL, 0}, + {"favIcon.png", favIcon_png, favIcon_png_size, NULL, 0}, + {"favIcon_gray.png", favIcon_gray_png, favIcon_gray_png_size, NULL, 0}, + {"favorite.png", favorite_png, favorite_png_size, NULL, 0}, + {"gameinfo1.png", gameinfo1_png, gameinfo1_png_size, NULL, 0}, + {"gameinfo1a.png", gameinfo1a_png, gameinfo1a_png_size, NULL, 0}, + {"gameinfo2.png", gameinfo2_png, gameinfo2_png_size, NULL, 0}, + {"gameinfo2a.png", gameinfo2a_png, gameinfo2a_png_size, NULL, 0}, + {"gcncontroller.png", gcncontroller_png, gcncontroller_png_size, NULL, 0}, + {"gcncontrollerR.png", gcncontrollerR_png, gcncontrollerR_png_size, NULL, 0}, + {"guitar.png", guitar_png, guitar_png_size, NULL, 0}, + {"guitarR.png", guitarR_png, guitarR_png_size, NULL, 0}, + {"gxlogo.png", gxlogo_png, gxlogo_png_size, NULL, 0}, + {"icon_folder.png", icon_folder_png, icon_folder_png_size, NULL, 0}, + {"keyboard_backspace_over.png", keyboard_backspace_over_png, keyboard_backspace_over_png_size, NULL, 0}, + {"keyboard_clear_over.png", keyboard_clear_over_png, keyboard_clear_over_png_size, NULL, 0}, + {"keyboard_key.png", keyboard_key_png, keyboard_key_png_size, NULL, 0}, + {"keyboard_key_over.png", keyboard_key_over_png, keyboard_key_over_png_size, NULL, 0}, + {"keyboard_largekey_over.png", keyboard_largekey_over_png, keyboard_largekey_over_png_size, NULL, 0}, + {"keyboard_mediumkey_over.png", keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size, NULL, 0}, + {"keyboard_textbox.png", keyboard_textbox_png, keyboard_textbox_png_size, NULL, 0}, + {"little_star.png", little_star_png, little_star_png_size, NULL, 0}, + {"lock.png", lock_png, lock_png_size, NULL, 0}, + {"lock_gray.png", lock_gray_png, lock_gray_png_size, NULL, 0}, + {"menu_button.png", menu_button_png, menu_button_png_size, NULL, 0}, + {"menu_button_over.png", menu_button_over_png, menu_button_over_png_size, NULL, 0}, + {"microphone.png", microphone_png, microphone_png_size, NULL, 0}, + {"microphoneR.png", microphoneR_png, microphoneR_png_size, NULL, 0}, + {"motionplus.png", motionplus_png, motionplus_png_size, NULL, 0}, + {"motionplusR.png", motionplusR_png, motionplusR_png_size, NULL, 0}, + {"new.png", new_png, new_png_size, NULL, 0}, + {"nintendods.png", nintendods_png, nintendods_png_size, NULL, 0}, + {"nintendodsR.png", nintendodsR_png, nintendodsR_png_size, NULL, 0}, + {"nocover.png", nocover_png, nocover_png_size, NULL, 0}, + {"nocoverFlat.png", nocoverFlat_png, nocoverFlat_png_size, NULL, 0}, + {"nocoverFull.png", nocoverFull_png, nocoverFull_png_size, NULL, 0}, + {"nodisc.png", nodisc_png, nodisc_png_size, NULL, 0}, + {"norating.png", norating_png, norating_png_size, NULL, 0}, + {"not_favorite.png", not_favorite_png, not_favorite_png_size, NULL, 0}, + {"nunchuk.png", nunchuk_png, nunchuk_png_size, NULL, 0}, + {"nunchukR.png", nunchukR_png, nunchukR_png_size, NULL, 0}, + {"oneButtonScroll.png", oneButtonScroll_png, oneButtonScroll_png_size, NULL, 0}, + {"pageindicator.png", pageindicator_png, pageindicator_png_size, NULL, 0}, + {"pegi_12.png", pegi_12_png, pegi_12_png_size, NULL, 0}, + {"pegi_16.png", pegi_16_png, pegi_16_png_size, NULL, 0}, + {"pegi_18.png", pegi_18_png, pegi_18_png_size, NULL, 0}, + {"pegi_3.png", pegi_3_png, pegi_3_png_size, NULL, 0}, + {"pegi_7.png", pegi_7_png, pegi_7_png_size, NULL, 0}, + {"playCountIcon.png", playCountIcon_png, playCountIcon_png_size, NULL, 0}, + {"player1_grab.png", player1_grab_png, player1_grab_png_size, NULL, 0}, + {"player1_point.png", player1_point_png, player1_point_png_size, NULL, 0}, + {"player2_grab.png", player2_grab_png, player2_grab_png_size, NULL, 0}, + {"player2_point.png", player2_point_png, player2_point_png_size, NULL, 0}, + {"player3_grab.png", player3_grab_png, player3_grab_png_size, NULL, 0}, + {"player3_point.png", player3_point_png, player3_point_png_size, NULL, 0}, + {"player4_grab.png", player4_grab_png, player4_grab_png_size, NULL, 0}, + {"player4_point.png", player4_point_png, player4_point_png_size, NULL, 0}, + {"playersSort.png", playersSort_png, playersSort_png_size, NULL, 0}, + {"progressbar.png", progressbar_png, progressbar_png_size, NULL, 0}, + {"progressbar_empty.png", progressbar_empty_png, progressbar_empty_png_size, NULL, 0}, + {"progressbar_outline.png", progressbar_outline_png, progressbar_outline_png_size, NULL, 0}, + {"rankIcon.png", rankIcon_png, rankIcon_png_size, NULL, 0}, + {"remove.png", remove_png, remove_png_size, NULL, 0}, + {"rename.png", rename_png, rename_png_size, NULL, 0}, + {"rplayer1_point.png", rplayer1_point_png, rplayer1_point_png_size, NULL, 0}, + {"rplayer2_point.png", rplayer2_point_png, rplayer2_point_png_size, NULL, 0}, + {"rplayer3_point.png", rplayer3_point_png, rplayer3_point_png_size, NULL, 0}, + {"rplayer4_point.png", rplayer4_point_png, rplayer4_point_png_size, NULL, 0}, + {"scrollBarBottom.png", scrollBarBottom_png, scrollBarBottom_png_size, NULL, 0}, + {"scrollBarTile.png", scrollBarTile_png, scrollBarTile_png_size, NULL, 0}, + {"scrollBarTop.png", scrollBarTop_png, scrollBarTop_png_size, NULL, 0}, + {"scrollbar_arrowdown.png", scrollbar_arrowdown_png, scrollbar_arrowdown_png_size, NULL, 0}, + {"scrollbar_arrowup.png", scrollbar_arrowup_png, scrollbar_arrowup_png_size, NULL, 0}, + {"scrollbar_box.png", scrollbar_box_png, scrollbar_box_png_size, NULL, 0}, + {"sdcard.png", sdcard_png, sdcard_png_size, NULL, 0}, + {"sdcard_over.png", sdcard_over_png, sdcard_over_png_size, NULL, 0}, + {"searchIcon.png", searchIcon_png, searchIcon_png_size, NULL, 0}, + {"searchIcon_gray.png", searchIcon_gray_png, searchIcon_gray_png_size, NULL, 0}, + {"settings_background.png", settings_background_png, settings_background_png_size, NULL, 0}, + {"settings_button.png", settings_button_png, settings_button_png_size, NULL, 0}, + {"settings_button_over.png", settings_button_over_png, settings_button_over_png_size, NULL, 0}, + {"settings_title.png", settings_title_png, settings_title_png_size, NULL, 0}, + {"settings_title_over.png", settings_title_over_png, settings_title_over_png_size, NULL, 0}, + {"startgame_arrow_left.png", startgame_arrow_left_png, startgame_arrow_left_png_size, NULL, 0}, + {"startgame_arrow_right.png", startgame_arrow_right_png, startgame_arrow_right_png_size, NULL, 0}, + {"theme_box.png", theme_box_png, theme_box_png_size, NULL, 0}, + {"theme_dialogue_box.png", theme_dialogue_box_png, theme_dialogue_box_png_size, NULL, 0}, + {"tooltip_left.png", tooltip_left_png, tooltip_left_png_size, NULL, 0}, + {"tooltip_right.png", tooltip_right_png, tooltip_right_png_size, NULL, 0}, + {"tooltip_tile.png", tooltip_tile_png, tooltip_tile_png_size, NULL, 0}, + {"unlock.png", unlock_png, unlock_png_size, NULL, 0}, + {"unlock_gray.png", unlock_gray_png, unlock_gray_png_size, NULL, 0}, + {"wbackground.png", wbackground_png, wbackground_png_size, NULL, 0}, + {"wdialogue_box_startgame.png", wdialogue_box_startgame_png, wdialogue_box_startgame_png_size, NULL, 0}, + {"wheel.png", wheel_png, wheel_png_size, NULL, 0}, + {"wheelR.png", wheelR_png, wheelR_png_size, NULL, 0}, + {"wifi1.png", wifi1_png, wifi1_png_size, NULL, 0}, + {"wifi12.png", wifi12_png, wifi12_png_size, NULL, 0}, + {"wifi16.png", wifi16_png, wifi16_png_size, NULL, 0}, + {"wifi2.png", wifi2_png, wifi2_png_size, NULL, 0}, + {"wifi3.png", wifi3_png, wifi3_png_size, NULL, 0}, + {"wifi32.png", wifi32_png, wifi32_png_size, NULL, 0}, + {"wifi4.png", wifi4_png, wifi4_png_size, NULL, 0}, + {"wifi8.png", wifi8_png, wifi8_png_size, NULL, 0}, + {"wifi_btn.png", wifi_btn_png, wifi_btn_png_size, NULL, 0}, + {"wiimote.png", wiimote_png, wiimote_png_size, NULL, 0}, + {"wiimote1.png", wiimote1_png, wiimote1_png_size, NULL, 0}, + {"wiimote2.png", wiimote2_png, wiimote2_png_size, NULL, 0}, + {"wiimote3.png", wiimote3_png, wiimote3_png_size, NULL, 0}, + {"wiimote4.png", wiimote4_png, wiimote4_png_size, NULL, 0}, + {"wiimote_poweroff.png", wiimote_poweroff_png, wiimote_poweroff_png_size, NULL, 0}, + {"wiimote_poweroff_over.png", wiimote_poweroff_over_png, wiimote_poweroff_over_png_size, NULL, 0}, + {"wiispeak.png", wiispeak_png, wiispeak_png_size, NULL, 0}, + {"wiispeakR.png", wiispeakR_png, wiispeakR_png_size, NULL, 0}, + {"zapper.png", zapper_png, zapper_png_size, NULL, 0}, + {"zapperR.png", zapperR_png, zapperR_png_size, NULL, 0}, + {"bg_music.ogg", bg_music_ogg, bg_music_ogg_size, NULL, 0}, + {"button_click.wav", button_click_wav, button_click_wav_size, NULL, 0}, + {"button_click2.wav", button_click2_wav, button_click2_wav_size, NULL, 0}, + {"button_over.wav", button_over_wav, button_over_wav_size, NULL, 0}, + {"credits_music.ogg", credits_music_ogg, credits_music_ogg_size, NULL, 0}, + {"menuin.ogg", menuin_ogg, menuin_ogg_size, NULL, 0}, + {"menuout.ogg", menuout_ogg, menuout_ogg_size, NULL, 0}, + {"success.ogg", success_ogg, success_ogg_size, NULL, 0}, + {"clock.ttf", clock_ttf, clock_ttf_size, NULL, 0}, + {"font.ttf", font_ttf, font_ttf_size, NULL, 0}, + {NULL, NULL, 0, NULL, 0} +}; + +#endif diff --git a/source/usbloader/GameBooter.cpp b/source/usbloader/GameBooter.cpp index 052c19ea..bc839d33 100644 --- a/source/usbloader/GameBooter.cpp +++ b/source/usbloader/GameBooter.cpp @@ -255,6 +255,7 @@ int GameBooter::BootGame(const char * gameID) } //! Do all the game patches + gprintf("Applying game patches...\n"); gamepatches(videoChoice, languageChoice, countrystrings, viChoice, ocarinaChoice, fix002, reloadblock, iosChoice, returnToChoice); //! Load Ocarina codes @@ -268,6 +269,7 @@ int GameBooter::BootGame(const char * gameID) //! Remember game's USB port int usbport = USBStorage2_GetPort(); + gprintf("Shutting down devices...\n"); //! Flush all caches and close up all devices WBFS_CloseAll(); DeviceHandler::DestroyInstance(); diff --git a/source/utils/ResourceManager.h b/source/utils/ResourceManager.h index e1897087..17c49411 100644 --- a/source/utils/ResourceManager.h +++ b/source/utils/ResourceManager.h @@ -26,7 +26,7 @@ #include -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include diff --git a/source/utils/rockout.cpp b/source/utils/rockout.cpp index 5391cdb9..aa0d2235 100644 --- a/source/utils/rockout.cpp +++ b/source/utils/rockout.cpp @@ -1,4 +1,4 @@ -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "themes/CTheme.h" #include "usbloader/GameList.h" #include "settings/GameTitles.h" diff --git a/source/utils/tools.h b/source/utils/tools.h index 8f8badb9..cc2d1623 100644 --- a/source/utils/tools.h +++ b/source/utils/tools.h @@ -1,6 +1,7 @@ #ifndef TOOLS_H_ #define TOOLS_H_ +#define ABS(x) ( (x) >= (0) ? (x) : (-(x)) ) #define LIMIT(x, min, max) ( ((x) < (min)) ? (min) : ((x) > (max)) ? (max) : (x) ) #define ALIGN(x) (((x) + 3) & ~3) #define ALIGN32(x) (((x) + 31) & ~31) diff --git a/source/video.cpp b/source/video.cpp index ed85d606..27cc4d35 100644 --- a/source/video.cpp +++ b/source/video.cpp @@ -17,7 +17,7 @@ #include "input.h" #include "gecko.h" -#include "libwiigui/gui.h" +#include "GUI/gui.h" #define DEFAULT_FIFO_SIZE 256 * 1024 static unsigned int *xfb[2] = { NULL, NULL }; // Double buffered diff --git a/source/wad/wad.cpp b/source/wad/wad.cpp index 831c1d13..80ccc89a 100644 --- a/source/wad/wad.cpp +++ b/source/wad/wad.cpp @@ -11,7 +11,7 @@ #include "nandtitle.h" #include "prompts/PromptWindows.h" -#include "libwiigui/gui.h" +#include "GUI/gui.h" #include "language/gettext.h" #include "menu.h" #include "themes/CTheme.h" @@ -124,7 +124,7 @@ s32 Wad_Install(FILE *fp) dialogBoxImg.SetWidescreen(Settings.widescreen); } - GuiText btn1Txt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText btn1Txt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage btn1Img(&btnOutline); if (Settings.wsprompt) { @@ -148,7 +148,7 @@ s32 Wad_Install(FILE *fp) GuiImage progressbarEmptyImg(&progressbarEmpty); progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarEmptyImg.SetPosition(25, 50); - progressbarEmptyImg.SetTile(100); + progressbarEmptyImg.SetTileHorizontal(100); GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png")); GuiImage progressbarImg(&progressbar); @@ -192,7 +192,7 @@ s32 Wad_Install(FILE *fp) progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); progressbarOutlineImg.SetPosition(0, 50); progressbarEmptyImg.SetPosition(80, 50); - progressbarEmptyImg.SetTile(78); + progressbarEmptyImg.SetTileHorizontal(78); progressbarImg.SetPosition(80, 50); msg1Txt.SetPosition(90, 75); @@ -358,11 +358,11 @@ s32 Wad_Install(FILE *fp) prTxt.SetTextf("%i%%", 100 * (cnt * len + idx) / (tmd_data->num_contents * len)); if ((Settings.wsprompt) && (Settings.widescreen)) { - progressbarImg.SetTile(78 * (cnt * len + idx) / (tmd_data->num_contents * len)); + progressbarImg.SetTileHorizontal(78 * (cnt * len + idx) / (tmd_data->num_contents * len)); } else { - progressbarImg.SetTile(100 * (cnt * len + idx) / (tmd_data->num_contents * len)); + progressbarImg.SetTileHorizontal(100 * (cnt * len + idx) / (tmd_data->num_contents * len)); } } @@ -438,7 +438,7 @@ s32 Wad_Uninstall(FILE *fp) dialogBoxImg.SetWidescreen(Settings.widescreen); } - GuiText btn1Txt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color")); + GuiText btn1Txt(tr( "OK" ), 22, thColor("r=0 g=0 b=0 a=255 - prompt windows button text color")); GuiImage btn1Img(&btnOutline); if (Settings.wsprompt) { diff --git a/source/xml/xml.cpp b/source/xml/xml.cpp index 2d62def1..f696cf35 100644 --- a/source/xml/xml.cpp +++ b/source/xml/xml.cpp @@ -82,7 +82,7 @@ void CloseXMLDatabase() } } -void GetTextFromNode(mxml_node_t *currentnode, mxml_node_t *topnode, const char *nodename, const char *attributename, +mxml_node_t *GetTextFromNode(mxml_node_t *currentnode, mxml_node_t *topnode, const char *nodename, const char *attributename, char *value, int descend, char *dest, int destsize) { *element_text = 0; @@ -103,12 +103,12 @@ void GetTextFromNode(mxml_node_t *currentnode, mxml_node_t *topnode, const char { strcpy(dest, ""); } + + return nodefound; } bool OpenXMLFile(char *filename) { - //if (xmldebug) dbg_time1(); - if (xml_loaded) return false; nodedata = NULL; diff --git a/source/xml/xml.h b/source/xml/xml.h index cd40b089..3e8686c1 100644 --- a/source/xml/xml.h +++ b/source/xml/xml.h @@ -15,7 +15,7 @@ void GetPublisherFromGameid(char *idtxt, char *dest, int destsize); const char *ConvertLangTextToCode(char *langtext); int ConvertRating(const char *ratingvalue, const char *fromrating, const char *torating); char *MemInfo(); -void GetTextFromNode(mxml_node_t *currentnode, mxml_node_t *topnode, const char *nodename, const char *attributename, +mxml_node_t *GetTextFromNode(mxml_node_t *currentnode, mxml_node_t *topnode, const char *nodename, const char *attributename, char *value, int descend, char *dest, int destsize); char * get_nodetext(mxml_node_t *node, char *buffer, int buflen);