2012-01-21 21:57:41 +01:00
# include <fstream>
# include <sys/stat.h>
# include <dirent.h>
# include <time.h>
# include <wchar.h>
2012-05-11 00:20:18 +02:00
# include <network.h>
# include <errno.h>
2012-01-21 21:57:41 +01:00
2012-08-05 15:48:15 +02:00
# include "menu.hpp"
2012-06-16 19:03:23 +02:00
# include "types.h"
2012-01-21 21:57:41 +01:00
# include "fonts.h"
2012-08-05 15:48:15 +02:00
# include "banner/BannerWindow.hpp"
# include "channel/nand.hpp"
2012-12-27 02:08:16 +01:00
# include "channel/nand_save.hpp"
2012-08-05 15:48:15 +02:00
# include "gc/gc.hpp"
2013-12-21 18:02:36 +01:00
# include "hw/Gekko.h"
2012-08-05 15:48:15 +02:00
# include "gui/GameTDB.hpp"
2014-03-18 03:39:42 +01:00
# include "gui/WiiMovie.hpp"
2012-08-05 15:48:15 +02:00
# include "loader/alt_ios.h"
# include "loader/cios.h"
# include "loader/fs.h"
2012-08-11 14:27:38 +02:00
# include "loader/nk.h"
2012-01-21 21:57:41 +01:00
# include "loader/playlog.h"
2012-08-05 15:48:15 +02:00
# include "loader/wbfs.h"
# include "music/SoundHandler.hpp"
2013-09-06 01:52:21 +02:00
# include "network/FTP_Dir.hpp"
# include "network/ftp.h"
2012-08-05 15:48:15 +02:00
# include "network/gcard.h"
# include "unzip/U8Archive.h"
2016-04-02 17:46:06 +02:00
# include "sicksaxis-wrapper/sicksaxis-wrapper.h"
2012-01-21 21:57:41 +01:00
// Sounds
extern const u8 click_wav [ ] ;
extern const u32 click_wav_size ;
extern const u8 hover_wav [ ] ;
extern const u32 hover_wav_size ;
extern const u8 camera_wav [ ] ;
extern const u32 camera_wav_size ;
2014-03-17 18:38:32 +01:00
CMenu mainMenu ;
u8 CMenu : : downloadStack [ 8192 ] ATTRIBUTE_ALIGN ( 32 ) ;
const u32 CMenu : : downloadStackSize = 8192 ;
2012-10-13 18:57:03 +02:00
CMenu : : CMenu ( )
2012-01-21 21:57:41 +01:00
{
m_aa = 0 ;
m_thrdWorking = false ;
m_thrdStop = false ;
m_thrdProgress = 0.f ;
m_thrdStep = 0.f ;
m_thrdStepLen = 0.f ;
m_locked = false ;
m_favorites = false ;
m_thrdNetwork = false ;
m_mutex = 0 ;
m_showtimer = 0 ;
m_gameSoundThread = LWP_THREAD_NULL ;
2012-11-04 15:13:42 +01:00
m_soundThrdBusy = false ;
2012-01-21 21:57:41 +01:00
m_numCFVersions = 0 ;
m_bgCrossFade = 0 ;
m_bnrSndVol = 0 ;
2012-07-10 14:02:06 +02:00
m_bnr_settings = true ;
2012-01-21 21:57:41 +01:00
m_directLaunch = false ;
m_exit = false ;
m_reload = false ;
m_gamesound_changed = false ;
2012-08-16 00:33:54 +02:00
m_video_playing = false ;
2012-09-07 20:13:04 +02:00
m_base_font = NULL ;
2012-01-21 21:57:41 +01:00
m_base_font_size = 0 ;
2012-09-07 20:13:04 +02:00
m_wbf1_font = NULL ;
m_wbf2_font = NULL ;
2016-04-02 18:00:47 +02:00
m_current_view = COVERFLOW_WII ;
2012-04-08 17:54:34 +02:00
m_Emulator_boot = false ;
2012-11-29 21:30:05 +01:00
m_prevBg = NULL ;
2012-11-16 23:00:20 +01:00
m_nextBg = NULL ;
2012-11-16 23:40:20 +01:00
m_lqBg = NULL ;
2012-12-08 17:17:35 +01:00
m_use_sd_logging = false ;
m_use_wifi_gecko = false ;
init_network = false ;
2013-04-08 23:45:13 +02:00
m_use_source = true ;
2013-09-12 15:04:50 +02:00
m_sourceflow = false ;
2016-04-03 02:51:40 +02:00
m_numPlugins = 0 ;
2013-07-29 23:06:50 +02:00
m_clearCats = true ;
m_catStartPage = 1 ;
2013-08-13 15:12:40 +02:00
m_combined_view = false ;
2013-08-05 22:58:26 +02:00
/* Explorer stuff */
m_txt_view = false ;
m_txt_path = NULL ;
2013-08-08 20:21:11 +02:00
/* download stuff */
m_file = NULL ;
2013-08-09 16:52:17 +02:00
m_buffer = NULL ;
2013-08-08 20:21:11 +02:00
m_filesize = 0 ;
2013-08-14 21:11:38 +02:00
/* thread stuff */
m_thrdPtr = LWP_THREAD_NULL ;
m_thrdInstalling = false ;
m_thrdUpdated = false ;
m_thrdDone = false ;
m_thrdWritten = 0 ;
m_thrdTotal = 0 ;
2013-09-06 01:52:21 +02:00
/* ftp stuff */
m_ftp_inited = false ;
m_init_ftp = false ;
2013-09-15 23:22:19 +02:00
/* screensaver */
no_input_time = 0 ;
2013-10-19 17:31:08 +02:00
/* Autoboot stuff */
m_source_autoboot = false ;
2012-01-21 21:57:41 +01:00
}
2016-04-03 02:51:40 +02:00
static vector < string > INI_List ;
static void GrabINIFiles ( char * FullPath )
{
//Just push back
INI_List . push_back ( FullPath ) ;
}
2012-10-13 18:57:03 +02:00
void CMenu : : init ( )
2012-01-21 21:57:41 +01:00
{
2012-10-15 21:16:14 +02:00
SoundHandle . Init ( ) ;
m_gameSound . SetVoice ( 1 ) ;
2012-01-21 21:57:41 +01:00
/* Clear Playlog */
Playlog_Delete ( ) ;
2016-04-03 03:03:39 +02:00
const char * drive = " empty " ;
const char * check = " empty " ;
struct stat dummy ;
for ( int i = SD ; i < = USB8 ; i + + ) //Find the first partition with apps/wiiflow folder
{
2016-04-30 16:19:30 +02:00
if ( DeviceHandle . IsInserted ( i ) & & DeviceHandle . GetFSType ( i ) ! = PART_FS_WBFS & & stat ( fmt ( " %s:/%s " , DeviceName [ i ] , APPS_DIR ) , & dummy ) = = 0 )
2012-01-21 21:57:41 +01:00
{
drive = DeviceName [ i ] ;
break ;
}
2016-04-03 03:03:39 +02:00
}
2012-11-12 21:12:00 +01:00
loadDefaultFont ( ) ;
2012-01-21 21:57:41 +01:00
if ( drive = = check ) // Should not happen
{
_buildMenus ( ) ;
2016-04-03 03:03:39 +02:00
error ( _fmt ( " errboot4 " , L " No apps/wiiflow directory found! " ) ) ;
2012-01-21 21:57:41 +01:00
m_exit = true ;
return ;
}
2016-04-03 03:03:39 +02:00
2012-11-18 14:40:26 +01:00
/* Handle apps dir first, so handling wiiflow.ini does not fail */
2016-04-30 16:19:30 +02:00
m_appDir = fmt ( " %s:/%s " , drive , APPS_DIR ) ;
2012-11-18 14:40:26 +01:00
gprintf ( " Wiiflow boot.dol Location: %s \n " , m_appDir . c_str ( ) ) ;
fsop_MakeFolder ( m_appDir . c_str ( ) ) ;
2016-04-03 03:03:39 +02:00
/* Load/Create wiiflow.ini so we can get settings to start Gecko, FTP, and Network*/
2012-11-18 14:40:26 +01:00
m_cfg . load ( fmt ( " %s/ " CFG_FILENAME , m_appDir . c_str ( ) ) ) ;
2012-12-08 17:17:35 +01:00
/* Check if we want WiFi Gecko */
m_use_wifi_gecko = m_cfg . getBool ( " DEBUG " , " wifi_gecko " , false ) ;
WiFiDebugger . SetBuffer ( m_use_wifi_gecko ) ;
/* Check if we want SD Gecko */
m_use_sd_logging = m_cfg . getBool ( " DEBUG " , " sd_write_log " , false ) ;
LogToSD_SetBuffer ( m_use_sd_logging ) ;
2013-09-06 01:52:21 +02:00
/* Check if we want FTP */
m_init_ftp = m_cfg . getBool ( FTP_DOMAIN , " auto_start " , false ) ;
ftp_allow_active = m_cfg . getBool ( FTP_DOMAIN , " allow_active_mode " , false ) ;
ftp_server_port = min ( 65535u , m_cfg . getUInt ( FTP_DOMAIN , " server_port " , 21 ) ) ;
set_ftp_password ( m_cfg . getString ( FTP_DOMAIN , " password " , " " ) . c_str ( ) ) ;
2012-12-08 17:17:35 +01:00
/* Init Network if wanted */
2013-09-06 01:52:21 +02:00
init_network = ( m_cfg . getBool ( " GENERAL " , " async_network " ) | | has_enabled_providers ( ) | | m_use_wifi_gecko | | m_init_ftp ) ;
2012-12-21 20:51:22 +01:00
_netInit ( ) ;
2016-04-03 03:03:39 +02:00
/* Try to find/make the wiiflow data directory */
2012-01-21 21:57:41 +01:00
bool onUSB = m_cfg . getBool ( " GENERAL " , " data_on_usb " , strncmp ( drive , " usb " , 3 ) = = 0 ) ;
drive = check ; //reset the drive variable for the check
2016-04-03 03:03:39 +02:00
//check for wiiflow data directory on USB or SD based on data_on_usb
2012-11-18 14:40:26 +01:00
if ( onUSB )
2012-01-21 21:57:41 +01:00
{
2012-11-18 14:40:26 +01:00
for ( u8 i = USB1 ; i < = USB8 ; i + + ) //Look for first partition with a wiiflow folder in root
{
2016-04-30 16:19:30 +02:00
if ( DeviceHandle . IsInserted ( i ) & & DeviceHandle . GetFSType ( i ) ! = PART_FS_WBFS & & stat ( fmt ( " %s:/%s " , DeviceName [ i ] , APP_DATA_DIR ) , & dummy ) = = 0 )
2012-01-21 21:57:41 +01:00
{
drive = DeviceName [ i ] ;
break ;
}
2012-11-18 14:40:26 +01:00
}
2012-01-21 21:57:41 +01:00
}
2016-04-30 16:19:30 +02:00
if ( ! onUSB & & DeviceHandle . IsInserted ( SD ) & & stat ( fmt ( " %s:/%s " , DeviceName [ SD ] , APP_DATA_DIR ) , & dummy ) = = 0 )
2012-11-18 14:40:26 +01:00
drive = DeviceName [ SD ] ;
2016-04-03 03:03:39 +02:00
if ( drive = = check ) //if wiiflow data directory not found then check just for a USB partition or SD card
2012-11-18 14:40:26 +01:00
{
2016-04-03 03:03:39 +02:00
if ( onUSB )
2012-11-18 14:40:26 +01:00
{
2016-04-03 03:03:39 +02:00
for ( u8 i = USB1 ; i < = USB8 ; i + + )
2012-01-21 21:57:41 +01:00
{
2016-04-03 03:03:39 +02:00
if ( DeviceHandle . IsInserted ( i ) & & DeviceHandle . GetFSType ( i ) ! = PART_FS_WBFS )
2012-01-21 21:57:41 +01:00
drive = DeviceName [ i ] ;
break ;
}
2016-04-03 03:03:39 +02:00
if ( drive = = check ) //if no available USB partition then force SD
2012-01-21 21:57:41 +01:00
{
2016-04-03 03:03:39 +02:00
_buildMenus ( ) ;
error ( _fmt ( " errboot5 " , L " data_on_usb=yes and No available usb partitions for data! \n Using SD. " ) ) ;
drive = DeviceName [ SD ] ;
2012-01-21 21:57:41 +01:00
}
2012-11-18 14:40:26 +01:00
}
2012-01-21 21:57:41 +01:00
else
2016-04-03 03:03:39 +02:00
{
if ( DeviceHandle . IsInserted ( SD ) )
drive = DeviceName [ SD ] ;
else
drive = DeviceName [ USB1 ] ; //if no SD insterted then force USB. may set this to the wf boot.dol partition
2012-01-21 21:57:41 +01:00
}
}
2016-04-30 16:19:30 +02:00
m_dataDir = fmt ( " %s:/%s " , drive , APP_DATA_DIR ) ;
2016-04-03 03:03:39 +02:00
gprintf ( " Data Directory: %s \n " , m_dataDir . c_str ( ) ) ;
snprintf ( m_app_update_drive , sizeof ( m_app_update_drive ) , " %s:/ " , drive ) ;
/* Our Wii game dir */
memset ( wii_games_dir , 0 , 64 ) ;
strncpy ( wii_games_dir , m_cfg . getString ( WII_DOMAIN , " wii_games_dir " , GAMES_DIR ) . c_str ( ) , 64 ) ;
if ( strncmp ( wii_games_dir , " %s:/ " , 4 ) ! = 0 )
strcpy ( wii_games_dir , GAMES_DIR ) ;
gprintf ( " Wii Games Directory: %s \n " , wii_games_dir ) ;
2016-04-03 02:31:02 +02:00
/* GameCube stuff */
m_devo_installed = DEVO_Installed ( m_dataDir . c_str ( ) ) ;
m_nintendont_installed = Nintendont_Installed ( ) ;
2016-04-21 02:05:28 +02:00
m_show_gc = ! m_cfg . getBool ( GC_DOMAIN , " disable " , ( ( m_devo_installed | | m_nintendont_installed ) = = false ) ) ;
2016-04-03 02:31:02 +02:00
memset ( gc_games_dir , 0 , 64 ) ;
strncpy ( gc_games_dir , m_cfg . getString ( GC_DOMAIN , " gc_games_dir " , DF_GC_GAMES_DIR ) . c_str ( ) , 64 ) ;
if ( strncmp ( gc_games_dir , " %s:/ " , 4 ) ! = 0 )
strcpy ( gc_games_dir , DF_GC_GAMES_DIR ) ;
gprintf ( " GameCube Games Directory: %s \n " , gc_games_dir ) ;
2016-04-25 02:04:38 +02:00
2012-11-18 14:40:26 +01:00
/* Load cIOS Map */
2012-07-20 14:30:18 +02:00
_installed_cios . clear ( ) ;
2013-12-21 18:02:36 +01:00
if ( ! neek2o ( ) & & ! Sys_DolphinMode ( ) )
2012-07-20 22:12:25 +02:00
_load_installed_cioses ( ) ;
else
2012-08-11 14:27:38 +02:00
_installed_cios [ CurrentIOS . Version ] = CurrentIOS . Version ;
2016-04-30 16:19:30 +02:00
2012-12-03 21:32:05 +01:00
/* Path Settings */
2012-11-18 14:40:26 +01:00
m_dol = fmt ( " %s/boot.dol " , m_appDir . c_str ( ) ) ;
m_ver = fmt ( " %s/versions " , m_appDir . c_str ( ) ) ;
m_app_update_zip = fmt ( " %s/update.zip " , m_appDir . c_str ( ) ) ;
m_data_update_zip = fmt ( " %s/update.zip " , m_dataDir . c_str ( ) ) ;
2013-11-19 16:27:52 +01:00
m_imgsDir = fmt ( " %s/imgs " , m_appDir . c_str ( ) ) ;
m_binsDir = fmt ( " %s/bins " , m_appDir . c_str ( ) ) ;
2013-09-12 15:04:50 +02:00
m_sourceDir = m_cfg . getString ( " GENERAL " , " dir_Source " , fmt ( " %s/source_menu " , m_dataDir . c_str ( ) ) ) ;
2012-11-18 14:40:26 +01:00
m_customBnrDir = m_cfg . getString ( " GENERAL " , " dir_custom_banners " , fmt ( " %s/custom_banners " , m_dataDir . c_str ( ) ) ) ;
m_pluginsDir = m_cfg . getString ( " GENERAL " , " dir_plugins " , fmt ( " %s/plugins " , m_dataDir . c_str ( ) ) ) ;
m_cacheDir = m_cfg . getString ( " GENERAL " , " dir_cache " , fmt ( " %s/cache " , m_dataDir . c_str ( ) ) ) ;
m_listCacheDir = m_cfg . getString ( " GENERAL " , " dir_list_cache " , fmt ( " %s/lists " , m_cacheDir . c_str ( ) ) ) ;
m_bnrCacheDir = m_cfg . getString ( " GENERAL " , " dir_banner_cache " , fmt ( " %s/banners " , m_cacheDir . c_str ( ) ) ) ;
m_txtCheatDir = m_cfg . getString ( " GENERAL " , " dir_txtcheat " , fmt ( " %s/codes " , m_dataDir . c_str ( ) ) ) ;
m_cheatDir = m_cfg . getString ( " GENERAL " , " dir_cheat " , fmt ( " %s/gct " , m_txtCheatDir . c_str ( ) ) ) ;
m_wipDir = m_cfg . getString ( " GENERAL " , " dir_wip " , fmt ( " %s/wip " , m_txtCheatDir . c_str ( ) ) ) ;
m_settingsDir = m_cfg . getString ( " GENERAL " , " dir_settings " , fmt ( " %s/settings " , m_dataDir . c_str ( ) ) ) ;
m_languagesDir = m_cfg . getString ( " GENERAL " , " dir_languages " , fmt ( " %s/languages " , m_dataDir . c_str ( ) ) ) ;
m_boxPicDir = m_cfg . getString ( " GENERAL " , " dir_box_covers " , fmt ( " %s/boxcovers " , m_dataDir . c_str ( ) ) ) ;
m_picDir = m_cfg . getString ( " GENERAL " , " dir_flat_covers " , fmt ( " %s/covers " , m_dataDir . c_str ( ) ) ) ;
2016-04-30 16:19:30 +02:00
m_themeDir = m_cfg . getString ( " GENERAL " , " dir_themes_lite " , fmt ( " %s/themes_lite " , m_dataDir . c_str ( ) ) ) ;
2012-11-18 14:40:26 +01:00
m_musicDir = m_cfg . getString ( " GENERAL " , " dir_music " , fmt ( " %s/music " , m_dataDir . c_str ( ) ) ) ;
m_videoDir = m_cfg . getString ( " GENERAL " , " dir_trailers " , fmt ( " %s/trailers " , m_dataDir . c_str ( ) ) ) ;
m_fanartDir = m_cfg . getString ( " GENERAL " , " dir_fanart " , fmt ( " %s/fanart " , m_dataDir . c_str ( ) ) ) ;
m_screenshotDir = m_cfg . getString ( " GENERAL " , " dir_screenshot " , fmt ( " %s/screenshots " , m_dataDir . c_str ( ) ) ) ;
m_helpDir = m_cfg . getString ( " GENERAL " , " dir_help " , fmt ( " %s/help " , m_dataDir . c_str ( ) ) ) ;
2016-04-11 22:29:09 +02:00
2012-11-18 14:40:26 +01:00
/* Create our Folder Structure */
fsop_MakeFolder ( m_dataDir . c_str ( ) ) ; //D'OH!
2012-07-05 18:18:23 +02:00
2013-09-12 15:04:50 +02:00
fsop_MakeFolder ( m_sourceDir . c_str ( ) ) ;
2012-11-18 14:40:26 +01:00
fsop_MakeFolder ( m_customBnrDir . c_str ( ) ) ;
fsop_MakeFolder ( m_pluginsDir . c_str ( ) ) ;
2012-07-05 18:18:23 +02:00
2012-11-18 14:40:26 +01:00
fsop_MakeFolder ( m_cacheDir . c_str ( ) ) ;
fsop_MakeFolder ( m_listCacheDir . c_str ( ) ) ;
fsop_MakeFolder ( m_bnrCacheDir . c_str ( ) ) ;
2012-07-05 18:18:23 +02:00
2012-11-18 14:40:26 +01:00
fsop_MakeFolder ( m_txtCheatDir . c_str ( ) ) ;
fsop_MakeFolder ( m_cheatDir . c_str ( ) ) ;
fsop_MakeFolder ( m_wipDir . c_str ( ) ) ;
2012-07-05 18:18:23 +02:00
2012-11-18 14:40:26 +01:00
fsop_MakeFolder ( m_settingsDir . c_str ( ) ) ;
fsop_MakeFolder ( m_languagesDir . c_str ( ) ) ;
fsop_MakeFolder ( m_boxPicDir . c_str ( ) ) ;
fsop_MakeFolder ( m_picDir . c_str ( ) ) ;
fsop_MakeFolder ( m_themeDir . c_str ( ) ) ;
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
fsop_MakeFolder ( fmt ( " %s/coverflows " , m_themeDir . c_str ( ) ) ) ;
2012-11-18 14:40:26 +01:00
fsop_MakeFolder ( m_musicDir . c_str ( ) ) ;
fsop_MakeFolder ( m_videoDir . c_str ( ) ) ;
fsop_MakeFolder ( m_fanartDir . c_str ( ) ) ;
fsop_MakeFolder ( m_screenshotDir . c_str ( ) ) ;
fsop_MakeFolder ( m_helpDir . c_str ( ) ) ;
2012-01-21 21:57:41 +01:00
2016-04-30 16:19:30 +02:00
/* Check to make sure wii games partition is ok */
const char * domain = _domainFromView ( ) ;
u8 partition = m_cfg . getInt ( domain , " partition " , 0 ) ;
if ( partition > USB8 | | ! DeviceHandle . IsInserted ( partition ) ) //if not ok then find wbfs folder or wbfs partition
{
m_cfg . remove ( domain , " partition " ) ;
for ( int i = SD ; i < = USB8 ; i + + ) // Find a usb partition with a wbfs folder or wbfs file system, else leave it blank (defaults to usb1 later)
{
if ( DeviceHandle . IsInserted ( i ) & & ( DeviceHandle . GetFSType ( i ) = = PART_FS_WBFS | | stat ( fmt ( GAMES_DIR , DeviceName [ i ] ) , & dummy ) = = 0 ) )
{
gprintf ( " Setting Wii games partition to: %i \n " , i ) ;
m_cfg . setInt ( domain , " partition " , i ) ;
break ;
}
}
}
2016-05-15 02:29:16 +02:00
/* Check emuNAND paths even if not being used */
m_current_view = COVERFLOW_CHANNEL ;
_validateEmuNand ( ) ;
m_current_view = COVERFLOW_WII ;
_validateEmuNand ( ) ;
2016-04-30 16:19:30 +02:00
/* Cache Reload Checks - Disabled for now
int ini_rev = m_cfg . getInt ( " GENERAL " , " ini_rev " , 0 ) ;
if ( ini_rev ! = SVN_REV_NUM )
fsop_deleteFolder ( m_listCacheDir . c_str ( ) ) ;
m_cfg . setInt ( " GENERAL " , " ini_rev " , SVN_REV_NUM ) ; */
CoverFlow . init ( m_base_font , m_base_font_size , m_vid . vid_50hz ( ) ) ;
2016-04-03 03:03:39 +02:00
//load categories and theme INI files
2012-05-04 14:30:43 +02:00
m_cat . load ( fmt ( " %s/ " CAT_FILENAME , m_settingsDir . c_str ( ) ) ) ;
2012-07-29 00:38:46 +02:00
string themeName = m_cfg . getString ( " GENERAL " , " theme " , " default " ) ;
2012-11-18 14:40:26 +01:00
m_themeDataDir = fmt ( " %s/%s " , m_themeDir . c_str ( ) , themeName . c_str ( ) ) ;
2012-05-04 14:30:43 +02:00
m_theme . load ( fmt ( " %s.ini " , m_themeDataDir . c_str ( ) ) ) ;
2016-04-30 16:19:30 +02:00
m_coverflow . load ( fmt ( " %s/coverflows/%s.ini " , m_themeDir . c_str ( ) , themeName . c_str ( ) ) ) ;
if ( ! m_coverflow . loaded ( ) )
m_coverflow . load ( fmt ( " %s/coverflows/default.ini " , m_themeDir . c_str ( ) ) ) ;
2016-04-03 02:51:40 +02:00
2016-04-03 03:03:39 +02:00
/*Get plugin ini files if plugin view enabled*/
2016-04-03 02:51:40 +02:00
if ( ! m_cfg . getBool ( PLUGIN_DOMAIN , " disable " , false ) )
{
2016-04-03 03:03:39 +02:00
m_plugin . init ( m_pluginsDir ) ;
2016-04-03 02:51:40 +02:00
Config m_plugin_cfg ;
INI_List . clear ( ) ;
GetFiles ( m_pluginsDir . c_str ( ) , stringToVector ( " .ini " , ' | ' ) , GrabINIFiles , false , 1 ) ;
for ( vector < string > : : const_iterator iniFile = INI_List . begin ( ) ; iniFile ! = INI_List . end ( ) ; + + iniFile )
{
if ( iniFile - > find ( " scummvm.ini " ) ! = string : : npos )
continue ;
m_plugin_cfg . load ( iniFile - > c_str ( ) ) ;
if ( m_plugin_cfg . loaded ( ) )
{
m_plugin . AddPlugin ( m_plugin_cfg ) ;
m_numPlugins + + ;
}
m_plugin_cfg . unload ( ) ;
}
m_plugin . EndAdd ( ) ;
}
2016-04-03 03:03:39 +02:00
/*Set wiiflow language*/
2013-08-08 20:21:11 +02:00
const char * defLang = " Default " ;
2012-01-21 21:57:41 +01:00
switch ( CONF_GetLanguage ( ) )
{
case CONF_LANG_JAPANESE :
2013-08-08 20:21:11 +02:00
defLang = " japanese " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_GERMAN :
2013-08-08 20:21:11 +02:00
defLang = " german " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_FRENCH :
2013-08-08 20:21:11 +02:00
defLang = " french " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_SPANISH :
2013-08-08 20:21:11 +02:00
defLang = " spanish " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_ITALIAN :
2013-08-08 20:21:11 +02:00
defLang = " italian " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_DUTCH :
2013-08-08 20:21:11 +02:00
defLang = " dutch " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_SIMP_CHINESE :
2013-08-08 20:21:11 +02:00
defLang = " chinese_s " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_TRAD_CHINESE :
2013-08-08 20:21:11 +02:00
defLang = " chinese_t " ;
2012-01-21 21:57:41 +01:00
break ;
case CONF_LANG_KOREAN :
2013-08-08 20:21:11 +02:00
defLang = " korean " ;
2012-01-21 21:57:41 +01:00
break ;
}
if ( CONF_GetArea ( ) = = CONF_AREA_BRA )
2013-08-08 20:21:11 +02:00
defLang = " brazilian " ;
2012-01-21 21:57:41 +01:00
2013-08-08 20:21:11 +02:00
m_curLanguage = m_cfg . getString ( " GENERAL " , " language " , defLang ) ;
if ( ! m_loc . load ( fmt ( " %s/%s.ini " , m_languagesDir . c_str ( ) , m_curLanguage . c_str ( ) ) ) )
2012-01-21 21:57:41 +01:00
{
2013-08-08 20:21:11 +02:00
m_curLanguage = " Default " ;
m_cfg . setString ( " GENERAL " , " language " , m_curLanguage . c_str ( ) ) ;
m_loc . unload ( ) ;
2012-01-21 21:57:41 +01:00
}
2012-10-03 23:34:37 +02:00
2012-10-04 13:37:53 +02:00
m_gameList . Init ( m_settingsDir . c_str ( ) , m_loc . getString ( m_curLanguage , " gametdb_code " , " EN " ) . c_str ( ) ) ;
2012-01-21 21:57:41 +01:00
m_aa = 3 ;
CColor pShadowColor = m_theme . getColor ( " GENERAL " , " pointer_shadow_color " , CColor ( 0x3F000000 ) ) ;
float pShadowX = m_theme . getFloat ( " GENERAL " , " pointer_shadow_x " , 3.f ) ;
float pShadowY = m_theme . getFloat ( " GENERAL " , " pointer_shadow_y " , 3.f ) ;
bool pShadowBlur = m_theme . getBool ( " GENERAL " , " pointer_shadow_blur " , false ) ;
for ( int chan = WPAD_MAX_WIIMOTES - 2 ; chan > = 0 ; chan - - )
{
2012-05-04 14:30:43 +02:00
m_cursor [ chan ] . init ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , m_theme . getString ( " GENERAL " , fmt ( " pointer%i " , chan + 1 ) ) . c_str ( ) ) ,
2012-01-21 21:57:41 +01:00
m_vid . wide ( ) , pShadowColor , pShadowX , pShadowY , pShadowBlur , chan ) ;
WPAD_SetVRes ( chan , m_vid . width ( ) + m_cursor [ chan ] . width ( ) , m_vid . height ( ) + m_cursor [ chan ] . height ( ) ) ;
}
2012-07-12 17:53:04 +02:00
2012-11-11 19:28:03 +01:00
m_btnMgr . init ( ) ;
2012-11-18 14:40:26 +01:00
MusicPlayer . Init ( m_cfg , m_musicDir , fmt ( " %s/music " , m_themeDataDir . c_str ( ) ) ) ;
2012-09-29 13:41:47 +02:00
m_music_info = m_cfg . getBool ( " GENERAL " , " display_music_info " , true ) ;
2012-01-21 21:57:41 +01:00
_buildMenus ( ) ;
m_locked = m_cfg . getString ( " GENERAL " , " parent_code " , " " ) . size ( ) > = 4 ;
2012-04-29 20:44:13 +02:00
m_btnMgr . setRumble ( m_cfg . getBool ( " GENERAL " , " rumble " , true ) ) ;
2016-04-30 16:19:30 +02:00
if ( m_cfg . getString ( " GENERAL " , " returnto " , " WFLA " ) = = " DWFA " )
m_cfg . setString ( " GENERAL " , " returnto " , " WFLA " ) ;
2012-01-21 21:57:41 +01:00
int exit_to = m_cfg . getInt ( " GENERAL " , " exit_to " , 0 ) ;
2012-09-22 15:47:52 +02:00
if ( exit_to = = EXIT_TO_BOOTMII & & ( ! DeviceHandle . IsInserted ( SD ) | |
2016-04-30 16:19:30 +02:00
stat ( fmt ( " %s:/bootmii/armboot.bin " , DeviceName [ SD ] ) , & dummy ) ! = 0 | |
stat ( fmt ( " %s:/bootmii/ppcboot.elf " , DeviceName [ SD ] ) , & dummy ) ! = 0 ) )
2012-01-21 21:57:41 +01:00
exit_to = EXIT_TO_HBC ;
Sys_ExitTo ( exit_to ) ;
LWP_MutexInit ( & m_mutex , 0 ) ;
2012-11-11 19:28:03 +01:00
CoverFlow . setSoundVolume ( m_cfg . getInt ( " GENERAL " , " sound_volume_coverflow " , 255 ) ) ;
2012-01-21 21:57:41 +01:00
m_btnMgr . setSoundVolume ( m_cfg . getInt ( " GENERAL " , " sound_volume_gui " , 255 ) ) ;
m_bnrSndVol = m_cfg . getInt ( " GENERAL " , " sound_volume_bnr " , 255 ) ;
2012-07-10 14:02:06 +02:00
m_bnr_settings = m_cfg . getBool ( " GENERAL " , " banner_in_settings " , true ) ;
2012-02-18 14:51:55 +01:00
m_cfg . setString ( " GAMERCARD " , " gamercards " , " wiinnertag|dutag " ) ;
m_cfg . getString ( " GAMERCARD " , " wiinnertag_url " , WIINNERTAG_URL ) ;
m_cfg . getString ( " GAMERCARD " , " wiinnertag_key " , " " ) ;
m_cfg . getString ( " GAMERCARD " , " dutag_url " , DUTAG_URL ) ;
m_cfg . getString ( " GAMERCARD " , " dutag_key " , " " ) ;
if ( m_cfg . getBool ( " GAMERCARD " , " gamercards_enable " , false ) )
2012-01-21 21:57:41 +01:00
{
2012-05-06 14:03:43 +02:00
vector < string > gamercards = stringToVector ( m_cfg . getString ( " GAMERCARD " , " gamercards " ) , ' | ' ) ;
2012-02-18 14:51:55 +01:00
if ( gamercards . size ( ) = = 0 )
{
gamercards . push_back ( " wiinnertag " ) ;
gamercards . push_back ( " dutag " ) ;
}
2012-01-21 21:57:41 +01:00
2012-05-06 14:03:43 +02:00
for ( vector < string > : : iterator itr = gamercards . begin ( ) ; itr ! = gamercards . end ( ) ; itr + + )
2012-02-18 14:51:55 +01:00
{
gprintf ( " Found gamercard provider: %s \n " , ( * itr ) . c_str ( ) ) ;
register_card_provider (
2012-05-04 14:30:43 +02:00
m_cfg . getString ( " GAMERCARD " , fmt ( " %s_url " , ( * itr ) . c_str ( ) ) ) . c_str ( ) ,
m_cfg . getString ( " GAMERCARD " , fmt ( " %s_key " , ( * itr ) . c_str ( ) ) ) . c_str ( )
2012-02-18 14:51:55 +01:00
) ;
}
2012-01-21 21:57:41 +01:00
}
}
2012-05-22 22:08:56 +02:00
bool cleaned_up = false ;
2012-08-24 20:01:40 +02:00
void CMenu : : cleanup ( )
2012-01-21 21:57:41 +01:00
{
2012-05-22 22:08:56 +02:00
if ( cleaned_up )
return ;
2012-09-16 15:41:31 +02:00
//gprintf("MEM1_freesize(): %i\nMEM2_freesize(): %i\n", MEM1_freesize(), MEM2_freesize());
m_btnMgr . hide ( m_mainLblCurMusic ) ;
2012-07-08 15:35:59 +02:00
_cleanupDefaultFont ( ) ;
2013-09-21 16:03:45 +02:00
CoverFlow . shutdown ( ) ; /* possibly plugin flow crash so cleanup early */
2012-10-13 18:57:03 +02:00
m_banner . DeleteBanner ( ) ;
2012-05-16 23:52:14 +02:00
m_plugin . Cleanup ( ) ;
2013-09-12 15:04:50 +02:00
m_source . unload ( ) ;
2012-01-21 21:57:41 +01:00
_stopSounds ( ) ;
2012-11-03 20:16:03 +01:00
_Theme_Cleanup ( ) ;
2012-09-22 15:47:52 +02:00
MusicPlayer . Cleanup ( ) ;
2012-11-03 20:16:03 +01:00
m_gameSound . FreeMemory ( ) ;
2012-10-15 21:16:14 +02:00
SoundHandle . Cleanup ( ) ;
2012-01-21 21:57:41 +01:00
soundDeinit ( ) ;
2012-05-09 20:47:25 +02:00
2012-08-13 18:30:34 +02:00
m_vid . cleanup ( ) ;
2012-07-21 19:05:58 +02:00
2012-07-08 15:35:59 +02:00
wiiLightOff ( ) ;
LWP_MutexDestroy ( m_mutex ) ;
m_mutex = 0 ;
2012-05-13 17:13:33 +02:00
2012-05-22 22:08:56 +02:00
cleaned_up = true ;
2012-09-16 15:41:31 +02:00
//gprintf(" \nMemory cleaned up\n");
2012-07-18 16:09:28 +02:00
gprintf ( " MEM1_freesize(): %i \n MEM2_freesize(): %i \n " , MEM1_freesize ( ) , MEM2_freesize ( ) ) ;
2012-05-12 19:14:25 +02:00
}
2012-11-03 20:16:03 +01:00
void CMenu : : _Theme_Cleanup ( void )
{
2012-11-04 20:22:02 +01:00
/* Backgrounds */
2012-12-28 15:19:40 +01:00
TexHandle . Cleanup ( theme . bg ) ;
2012-11-29 21:30:05 +01:00
m_prevBg = NULL ;
2012-11-16 23:00:20 +01:00
m_nextBg = NULL ;
2012-12-28 15:19:40 +01:00
TexHandle . Cleanup ( m_curBg ) ;
2012-11-16 23:40:20 +01:00
m_lqBg = NULL ;
2012-11-04 20:22:02 +01:00
/* Buttons */
2012-12-28 15:19:40 +01:00
TexHandle . Cleanup ( theme . btnTexL ) ;
TexHandle . Cleanup ( theme . btnTexR ) ;
TexHandle . Cleanup ( theme . btnTexC ) ;
TexHandle . Cleanup ( theme . btnTexLS ) ;
TexHandle . Cleanup ( theme . btnTexRS ) ;
TexHandle . Cleanup ( theme . btnTexCS ) ;
TexHandle . Cleanup ( theme . btnAUOn ) ;
TexHandle . Cleanup ( theme . btnAUOns ) ;
TexHandle . Cleanup ( theme . btnAUOff ) ;
TexHandle . Cleanup ( theme . btnAUOffs ) ;
TexHandle . Cleanup ( theme . btnENOn ) ;
TexHandle . Cleanup ( theme . btnENOns ) ;
TexHandle . Cleanup ( theme . btnENOff ) ;
TexHandle . Cleanup ( theme . btnENOffs ) ;
TexHandle . Cleanup ( theme . btnJAOn ) ;
TexHandle . Cleanup ( theme . btnJAOns ) ;
TexHandle . Cleanup ( theme . btnJAOff ) ;
TexHandle . Cleanup ( theme . btnJAOffs ) ;
TexHandle . Cleanup ( theme . btnFROn ) ;
TexHandle . Cleanup ( theme . btnFROns ) ;
TexHandle . Cleanup ( theme . btnFROff ) ;
TexHandle . Cleanup ( theme . btnFROffs ) ;
TexHandle . Cleanup ( theme . btnDEOn ) ;
TexHandle . Cleanup ( theme . btnDEOns ) ;
TexHandle . Cleanup ( theme . btnDEOff ) ;
TexHandle . Cleanup ( theme . btnDEOffs ) ;
TexHandle . Cleanup ( theme . btnESOn ) ;
TexHandle . Cleanup ( theme . btnESOns ) ;
TexHandle . Cleanup ( theme . btnESOff ) ;
TexHandle . Cleanup ( theme . btnESOffs ) ;
TexHandle . Cleanup ( theme . btnITOn ) ;
TexHandle . Cleanup ( theme . btnITOns ) ;
TexHandle . Cleanup ( theme . btnITOff ) ;
TexHandle . Cleanup ( theme . btnITOffs ) ;
TexHandle . Cleanup ( theme . btnNLOn ) ;
TexHandle . Cleanup ( theme . btnNLOns ) ;
TexHandle . Cleanup ( theme . btnNLOff ) ;
TexHandle . Cleanup ( theme . btnNLOffs ) ;
TexHandle . Cleanup ( theme . btnPTOn ) ;
TexHandle . Cleanup ( theme . btnPTOns ) ;
TexHandle . Cleanup ( theme . btnPTOff ) ;
TexHandle . Cleanup ( theme . btnPTOffs ) ;
TexHandle . Cleanup ( theme . btnRUOn ) ;
TexHandle . Cleanup ( theme . btnRUOns ) ;
TexHandle . Cleanup ( theme . btnRUOff ) ;
TexHandle . Cleanup ( theme . btnRUOffs ) ;
TexHandle . Cleanup ( theme . btnKOOn ) ;
TexHandle . Cleanup ( theme . btnKOOns ) ;
TexHandle . Cleanup ( theme . btnKOOff ) ;
TexHandle . Cleanup ( theme . btnKOOffs ) ;
TexHandle . Cleanup ( theme . btnZHCNOn ) ;
TexHandle . Cleanup ( theme . btnZHCNOns ) ;
TexHandle . Cleanup ( theme . btnZHCNOff ) ;
TexHandle . Cleanup ( theme . btnZHCNOffs ) ;
TexHandle . Cleanup ( theme . btnTexPlus ) ;
TexHandle . Cleanup ( theme . btnTexPlusS ) ;
TexHandle . Cleanup ( theme . btnTexMinus ) ;
TexHandle . Cleanup ( theme . btnTexMinusS ) ;
2012-11-04 20:22:02 +01:00
/* Checkboxes */
2012-12-28 15:19:40 +01:00
TexHandle . Cleanup ( theme . checkboxoff ) ;
TexHandle . Cleanup ( theme . checkboxoffs ) ;
TexHandle . Cleanup ( theme . checkboxon ) ;
TexHandle . Cleanup ( theme . checkboxons ) ;
TexHandle . Cleanup ( theme . checkboxHid ) ;
TexHandle . Cleanup ( theme . checkboxHids ) ;
TexHandle . Cleanup ( theme . checkboxReq ) ;
TexHandle . Cleanup ( theme . checkboxReqs ) ;
2012-11-04 20:22:02 +01:00
/* Progress Bars */
2012-12-28 15:19:40 +01:00
TexHandle . Cleanup ( theme . pbarTexL ) ;
TexHandle . Cleanup ( theme . pbarTexR ) ;
TexHandle . Cleanup ( theme . pbarTexC ) ;
TexHandle . Cleanup ( theme . pbarTexLS ) ;
TexHandle . Cleanup ( theme . pbarTexRS ) ;
TexHandle . Cleanup ( theme . pbarTexCS ) ;
2012-11-04 20:22:02 +01:00
/* Other Theme Stuff */
2012-11-03 20:16:03 +01:00
for ( TexSet : : iterator texture = theme . texSet . begin ( ) ; texture ! = theme . texSet . end ( ) ; + + texture )
2012-12-28 15:19:40 +01:00
TexHandle . Cleanup ( texture - > second ) ;
2013-09-02 00:31:46 +02:00
for ( vector < SFont > : : iterator font = theme . fontSet . begin ( ) ; font ! = theme . fontSet . end ( ) ; + + font )
font - > ClearData ( ) ;
2012-11-03 20:16:03 +01:00
for ( SoundSet : : iterator sound = theme . soundSet . begin ( ) ; sound ! = theme . soundSet . end ( ) ; + + sound )
sound - > second - > FreeMemory ( ) ;
theme . texSet . clear ( ) ;
theme . fontSet . clear ( ) ;
theme . soundSet . clear ( ) ;
2016-04-30 16:19:30 +02:00
m_theme . unload ( ) ;
m_coverflow . unload ( ) ;
2012-11-03 20:16:03 +01:00
}
2012-12-08 17:17:35 +01:00
void CMenu : : _netInit ( void )
2012-05-12 19:14:25 +02:00
{
2012-12-22 21:57:23 +01:00
if ( networkInit | | ! init_network | | m_exit )
2012-12-08 17:17:35 +01:00
return ;
_initAsyncNetwork ( ) ;
while ( net_get_status ( ) = = - EBUSY )
usleep ( 100 ) ;
2013-09-06 01:52:21 +02:00
if ( m_init_ftp )
m_ftp_inited = ftp_startThread ( ) ;
2012-01-21 21:57:41 +01:00
}
void CMenu : : _setAA ( int aa )
{
switch ( aa )
{
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 8 :
m_aa = aa ;
break ;
case 7 :
m_aa = 6 ;
break ;
default :
m_aa = 0 ;
}
}
2012-11-03 20:16:03 +01:00
void CMenu : : _loadCFCfg ( )
2012-01-21 21:57:41 +01:00
{
const char * domain = " _COVERFLOW " ;
//gprintf("Preparing to load sounds from %s\n", m_themeDataDir.c_str());
2013-04-21 13:59:58 +02:00
CoverFlow . setCachePath ( m_cacheDir . c_str ( ) , ! m_cfg . getBool ( " GENERAL " , " keep_png " , true ) ,
m_cfg . getBool ( " GENERAL " , " compress_cache " , false ) , m_cfg . getBool ( PLUGIN_DOMAIN , " subfolder_cache " , true ) ) ;
2012-11-11 19:28:03 +01:00
CoverFlow . setBufferSize ( m_cfg . getInt ( " GENERAL " , " cover_buffer " , 20 ) ) ;
2012-01-21 21:57:41 +01:00
// Coverflow Sounds
2012-11-11 19:28:03 +01:00
CoverFlow . setSounds (
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
new GuiSound ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , m_theme . getString ( domain , " sound_flip " ) . c_str ( ) ) ) ,
_sound ( theme . soundSet , m_theme . getString ( domain , " sound_hover " , " " ) . c_str ( ) , hover_wav , hover_wav_size , " default_btn_hover " , false ) ,
_sound ( theme . soundSet , m_theme . getString ( domain , " sound_select " , " " ) . c_str ( ) , click_wav , click_wav_size , " default_btn_click " , false ) ,
new GuiSound ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , m_theme . getString ( domain , " sound_cancel " ) . c_str ( ) ) )
2012-01-21 21:57:41 +01:00
) ;
2016-04-30 16:19:30 +02:00
2012-01-21 21:57:41 +01:00
// Textures
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
string texLoading = fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , m_theme . getString ( domain , " loading_cover_box " ) . c_str ( ) ) ;
string texNoCover = fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , m_theme . getString ( domain , " missing_cover_box " ) . c_str ( ) ) ;
string texLoadingFlat = fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , m_theme . getString ( domain , " loading_cover_flat " ) . c_str ( ) ) ;
string texNoCoverFlat = fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , m_theme . getString ( domain , " missing_cover_flat " ) . c_str ( ) ) ;
2012-11-11 19:28:03 +01:00
CoverFlow . setTextures ( texLoading , texLoadingFlat , texNoCover , texNoCoverFlat ) ;
2012-01-21 21:57:41 +01:00
// Font
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
CoverFlow . setFont ( _font ( domain , " font " , TITLEFONT ) , m_theme . getColor ( domain , " font_color " , CColor ( 0xFFFFFFFF ) ) ) ;
2012-01-21 21:57:41 +01:00
}
Vector3D CMenu : : _getCFV3D ( const string & domain , const string & key , const Vector3D & def , bool otherScrnFmt )
{
string key169 ( key ) ;
string key43 ( key ) ;
key43 + = " _4_3 " ;
if ( m_vid . wide ( ) = = otherScrnFmt )
swap ( key169 , key43 ) ;
2016-04-30 16:19:30 +02:00
if ( m_coverflow . has ( domain , key169 ) )
2012-01-21 21:57:41 +01:00
{
2016-04-30 16:19:30 +02:00
Vector3D v ( m_coverflow . getVector3D ( domain , key169 ) ) ;
m_coverflow . getVector3D ( domain , key43 , v ) ;
2012-01-21 21:57:41 +01:00
return v ;
}
2016-04-30 16:19:30 +02:00
return m_coverflow . getVector3D ( domain , key169 , m_coverflow . getVector3D ( domain , key43 , def ) ) ;
2012-01-21 21:57:41 +01:00
}
int CMenu : : _getCFInt ( const string & domain , const string & key , int def , bool otherScrnFmt )
{
string key169 ( key ) ;
string key43 ( key ) ;
key43 + = " _4_3 " ;
if ( m_vid . wide ( ) = = otherScrnFmt )
swap ( key169 , key43 ) ;
2016-04-30 16:19:30 +02:00
if ( m_coverflow . has ( domain , key169 ) )
2012-01-21 21:57:41 +01:00
{
2016-04-30 16:19:30 +02:00
int v = m_coverflow . getInt ( domain , key169 ) ;
m_coverflow . getInt ( domain , key43 , v ) ;
2012-01-21 21:57:41 +01:00
return v ;
}
2016-04-30 16:19:30 +02:00
return m_coverflow . getInt ( domain , key169 , m_coverflow . getInt ( domain , key43 , def ) ) ;
2012-01-21 21:57:41 +01:00
}
float CMenu : : _getCFFloat ( const string & domain , const string & key , float def , bool otherScrnFmt )
{
string key169 ( key ) ;
string key43 ( key ) ;
key43 + = " _4_3 " ;
if ( m_vid . wide ( ) = = otherScrnFmt )
swap ( key169 , key43 ) ;
2016-04-30 16:19:30 +02:00
if ( m_coverflow . has ( domain , key169 ) )
2012-01-21 21:57:41 +01:00
{
2016-04-30 16:19:30 +02:00
float v = m_coverflow . getFloat ( domain , key169 ) ;
m_coverflow . getFloat ( domain , key43 , v ) ;
2012-01-21 21:57:41 +01:00
return v ;
}
2016-04-30 16:19:30 +02:00
return m_coverflow . getFloat ( domain , key169 , m_coverflow . getFloat ( domain , key43 , def ) ) ;
2012-01-21 21:57:41 +01:00
}
void CMenu : : _loadCFLayout ( int version , bool forceAA , bool otherScrnFmt )
{
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
string domain = fmt ( " %s_%i " , cf_domain , version ) ;
2016-04-30 16:19:30 +02:00
string domainSel = fmt ( " %s_%i_S " , cf_domain , version ) ;
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
bool smallflow = ( strcmp ( cf_domain , " _SMALLFLOW " ) = = 0 ) ;
bool shortflow = ( strcmp ( cf_domain , " _SHORTFLOW " ) = = 0 ) ;
bool sideflow = ( strcmp ( cf_domain , " _SIDEFLOW " ) = = 0 ) ;
2012-01-21 21:57:41 +01:00
bool sf = otherScrnFmt ;
2016-04-30 16:19:30 +02:00
int max_fsaa = m_coverflow . getInt ( domain , " max_fsaa " , 3 ) ;
2012-04-08 17:54:34 +02:00
_setAA ( forceAA ? max_fsaa : min ( max_fsaa , m_cfg . getInt ( " GENERAL " , " max_fsaa " , 3 ) ) ) ;
2012-01-21 21:57:41 +01:00
2016-04-30 16:19:30 +02:00
CoverFlow . setTextureQuality ( m_coverflow . getFloat ( domain , " tex_lod_bias " , - 3.f ) ,
m_coverflow . getInt ( domain , " tex_aniso " , 2 ) ,
m_coverflow . getBool ( domain , " tex_edge_lod " , true ) ) ;
2012-01-21 21:57:41 +01:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
CoverFlow . setRange ( _getCFInt ( domain , " rows " , ( smallflow ? 5 : 1 ) , sf ) , _getCFInt ( domain , " columns " , 11 , sf ) ) ;
2012-01-21 21:57:41 +01:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCameraPos ( false ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFV3D ( domain , " camera_pos " , Vector3D ( 0.f , 0.f , 5.f ) , sf ) ,
_getCFV3D ( domain , " camera_aim " , Vector3D ( 0.f , 0.f , 0.f ) , sf ) ) ;
2012-01-21 21:57:41 +01:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCameraPos ( true ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFV3D ( domainSel , " camera_pos " , Vector3D ( 0.f , 0.f , 5.f ) , sf ) ,
_getCFV3D ( domainSel , " camera_aim " , Vector3D ( 0.f , 0.f , 0.f ) , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCameraOsc ( false ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFV3D ( domain , " camera_osc_speed " , Vector3D ( 2.f , 0.f , 0.f ) , sf ) ,
_getCFV3D ( domain , " camera_osc_amp " , Vector3D ( 0.1f , 0.f , 0.f ) , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCameraOsc ( true ,
2012-04-08 17:54:34 +02:00
_getCFV3D ( domainSel , " camera_osc_speed " , Vector3D ( ) , sf ) ,
_getCFV3D ( domainSel , " camera_osc_amp " , Vector3D ( ) , sf ) ) ;
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
float def_cvr_posX = smallflow ? 1.f : 1.6f ;
float def_cvr_posY = smallflow ? - 0.8f : - 1.f ;
float def_cvr_posX1 = sideflow ? .10f : 0.f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverPos ( false ,
2012-04-08 17:54:34 +02:00
_getCFV3D ( domain , " left_pos " , Vector3D ( - def_cvr_posX , def_cvr_posY , 0.f ) , sf ) ,
_getCFV3D ( domain , " right_pos " , Vector3D ( def_cvr_posX , def_cvr_posY , 0.f ) , sf ) ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFV3D ( domain , " center_pos " , Vector3D ( def_cvr_posX1 , def_cvr_posY , 1.f ) , sf ) ,
2012-04-08 17:54:34 +02:00
_getCFV3D ( domain , " row_center_pos " , Vector3D ( 0.f , def_cvr_posY , 0.f ) , sf ) ) ;
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
if ( smallflow )
CoverFlow . setCoverPos ( true ,
_getCFV3D ( domainSel , " left_pos " , Vector3D ( - 4.05f , - 0.6f , - 1.f ) , sf ) ,
_getCFV3D ( domainSel , " right_pos " , Vector3D ( 3.35f , - 0.6f , - 1.f ) , sf ) ,
_getCFV3D ( domainSel , " center_pos " , Vector3D ( - 0.5f , - 0.8f , 2.6f ) , sf ) ,
_getCFV3D ( domainSel , " row_center_pos " , Vector3D ( - 3.05f , - 0.6f , - 1.f ) , sf ) ) ;
else
CoverFlow . setCoverPos ( true ,
_getCFV3D ( domainSel , " left_pos " , Vector3D ( - 4.7f , - 1.f , 0.f ) , sf ) ,
_getCFV3D ( domainSel , " right_pos " , Vector3D ( 4.7f , - 1.f , 0.f ) , sf ) ,
_getCFV3D ( domainSel , " center_pos " , Vector3D ( - 0.6f , - 1.f , 2.6f ) , sf ) ,
_getCFV3D ( domainSel , " row_center_pos " , Vector3D ( 0.f , 0.f , 0.f ) , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverAngleOsc ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " cover_osc_speed " , Vector3D ( 2.f , 2.f , 0.f ) ) ,
m_coverflow . getVector3D ( domain , " cover_osc_amp " , Vector3D ( 5.f , 10.f , 0.f ) ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverAngleOsc ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " cover_osc_speed " , Vector3D ( 2.1f , 2.1f , 0.f ) ) ,
m_coverflow . getVector3D ( domainSel , " cover_osc_amp " , Vector3D ( 2.f , 5.f , 0.f ) ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverPosOsc ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " cover_pos_osc_speed " ) ,
m_coverflow . getVector3D ( domain , " cover_pos_osc_amp " ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverPosOsc ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " cover_pos_osc_speed " ) ,
m_coverflow . getVector3D ( domainSel , " cover_pos_osc_amp " ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
float spacerX = smallflow ? 1.f : 0.35f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setSpacers ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " left_spacer " , Vector3D ( - spacerX , 0.f , 0.f ) ) ,
m_coverflow . getVector3D ( domain , " right_spacer " , Vector3D ( spacerX , 0.f , 0.f ) ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setSpacers ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " left_spacer " , Vector3D ( - spacerX , 0.f , 0.f ) ) ,
m_coverflow . getVector3D ( domainSel , " right_spacer " , Vector3D ( spacerX , 0.f , 0.f ) ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setDeltaAngles ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " left_delta_angle " ) ,
m_coverflow . getVector3D ( domain , " right_delta_angle " ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setDeltaAngles ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " left_delta_angle " ) ,
m_coverflow . getVector3D ( domainSel , " right_delta_angle " ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
float angleY = smallflow ? 0.f : 70.f ;
float angleZ = sideflow ? 90.f : 0.f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setAngles ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " left_angle " , Vector3D ( 0.f , angleY , 0.f ) ) ,
m_coverflow . getVector3D ( domain , " right_angle " , Vector3D ( 0.f , - angleY , 0.f ) ) ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
m_coverflow . getVector3D ( domain , " center_angle " , Vector3D ( 0.f , 0.f , angleZ ) ) ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " row_center_angle " ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
angleY = smallflow ? 0.f : 90.f ;
float angleY1 = smallflow ? 0.f : 360.f ;
float angleX = smallflow ? 0.f : - 45.f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setAngles ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " left_angle " , Vector3D ( angleX , angleY , 0.f ) ) ,
m_coverflow . getVector3D ( domainSel , " right_angle " , Vector3D ( angleX , - angleY , 0.f ) ) ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
m_coverflow . getVector3D ( domainSel , " center_angle " , Vector3D ( 0.f , angleY1 , angleZ ) ) ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " row_center_angle " ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
angleX = smallflow ? 0.f : 20.f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setTitleAngles ( false ,
2012-04-08 17:54:34 +02:00
_getCFFloat ( domain , " text_left_angle " , - angleX , sf ) ,
_getCFFloat ( domain , " text_right_angle " , angleX , sf ) ,
2012-01-21 21:57:41 +01:00
_getCFFloat ( domain , " text_center_angle " , 0.f , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setTitleAngles ( true ,
2012-04-08 17:54:34 +02:00
_getCFFloat ( domainSel , " text_left_angle " , - angleX , sf ) ,
_getCFFloat ( domainSel , " text_right_angle " , angleX , sf ) ,
2012-01-21 21:57:41 +01:00
_getCFFloat ( domainSel , " text_center_angle " , 0.f , sf ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
def_cvr_posX = smallflow ? 2.f : 1.f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setTitlePos ( false ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFV3D ( domain , " text_left_pos " , Vector3D ( - def_cvr_posX , 0.8f , 2.6f ) , sf ) ,
_getCFV3D ( domain , " text_right_pos " , Vector3D ( def_cvr_posX , 0.8f , 2.6f ) , sf ) ,
_getCFV3D ( domain , " text_center_pos " , Vector3D ( 0.f , 0.8f , 2.6f ) , sf ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
def_cvr_posX = smallflow ? .6f : 2.1f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setTitlePos ( true ,
2012-01-21 21:57:41 +01:00
_getCFV3D ( domainSel , " text_left_pos " , Vector3D ( - 4.f , 0.f , 1.3f ) , sf ) ,
_getCFV3D ( domainSel , " text_right_pos " , Vector3D ( 4.f , 0.f , 1.3f ) , sf ) ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFV3D ( domainSel , " text_center_pos " , Vector3D ( def_cvr_posX , 1.f , 1.6f ) , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setTitleWidth ( false ,
2012-01-21 21:57:41 +01:00
_getCFFloat ( domain , " text_side_wrap_width " , 500.f , sf ) ,
_getCFFloat ( domain , " text_center_wrap_width " , 500.f , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setTitleWidth ( true ,
2012-01-21 21:57:41 +01:00
_getCFFloat ( domainSel , " text_side_wrap_width " , 500.f , sf ) ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFFloat ( domainSel , " text_center_wrap_width " , 390.f , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setTitleStyle ( false ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_textStyle ( domain . c_str ( ) , " text_side_style " , FTGX_ALIGN_MIDDLE | FTGX_JUSTIFY_CENTER , true ) ,
_textStyle ( domain . c_str ( ) , " text_center_style " , FTGX_ALIGN_MIDDLE | FTGX_JUSTIFY_CENTER , true ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setTitleStyle ( true ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_textStyle ( domainSel . c_str ( ) , " text_side_style " , FTGX_ALIGN_MIDDLE | FTGX_JUSTIFY_CENTER , true ) ,
_textStyle ( domainSel . c_str ( ) , " text_center_style " , FTGX_ALIGN_TOP | FTGX_JUSTIFY_RIGHT , true ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setColors ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getColor ( domain , " color_beg " , 0xCFFFFFFF ) ,
m_coverflow . getColor ( domain , " color_end " , 0x3FFFFFFF ) ,
m_coverflow . getColor ( domain , " color_off " , 0x7FFFFFFF ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setColors ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getColor ( domainSel , " color_beg " , 0x7FFFFFFF ) ,
m_coverflow . getColor ( domainSel , " color_end " , 0x1FFFFFFF ) ,
m_coverflow . getColor ( domain , " color_off " , 0x7FFFFFFF ) ) ; // Mouse not used once a selection has been made
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
CoverFlow . setMirrorAlpha ( m_coverflow . getFloat ( domain , " mirror_alpha " , 0.15f ) , m_coverflow . getFloat ( domain , " title_mirror_alpha " , 0.03f ) ) ; // Doesn't depend on selection
2012-04-08 17:54:34 +02:00
2016-04-30 16:19:30 +02:00
CoverFlow . setMirrorBlur ( m_coverflow . getBool ( domain , " mirror_blur " , true ) ) ; // Doesn't depend on selection
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setShadowColors ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getColor ( domain , " color_shadow_center " , 0x00000000 ) ,
m_coverflow . getColor ( domain , " color_shadow_beg " , 0x00000000 ) ,
m_coverflow . getColor ( domain , " color_shadow_end " , 0x00000000 ) ,
m_coverflow . getColor ( domain , " color_shadow_off " , 0x00000000 ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setShadowColors ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getColor ( domainSel , " color_shadow_center " , 0x0000007F ) ,
m_coverflow . getColor ( domainSel , " color_shadow_beg " , 0x0000007F ) ,
m_coverflow . getColor ( domainSel , " color_shadow_end " , 0x0000007F ) ,
m_coverflow . getColor ( domainSel , " color_shadow_off " , 0x0000007F ) ) ;
2012-04-08 17:54:34 +02:00
2016-04-30 16:19:30 +02:00
CoverFlow . setShadowPos ( m_coverflow . getFloat ( domain , " shadow_scale " , 1.1f ) ,
m_coverflow . getFloat ( domain , " shadow_x " ) ,
m_coverflow . getFloat ( domain , " shadow_y " ) ) ;
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
float spacerY = smallflow ? 0.60f : 2.f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setRowSpacers ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " top_spacer " , Vector3D ( 0.f , spacerY , 0.f ) ) ,
m_coverflow . getVector3D ( domain , " bottom_spacer " , Vector3D ( 0.f , - spacerY , 0.f ) ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setRowSpacers ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " top_spacer " , Vector3D ( 0.f , spacerY , 0.f ) ) ,
m_coverflow . getVector3D ( domainSel , " bottom_spacer " , Vector3D ( 0.f , - spacerY , 0.f ) ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setRowDeltaAngles ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " top_delta_angle " ) ,
m_coverflow . getVector3D ( domain , " bottom_delta_angle " ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setRowDeltaAngles ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " top_delta_angle " ) ,
m_coverflow . getVector3D ( domainSel , " bottom_delta_angle " ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setRowAngles ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " top_angle " ) ,
m_coverflow . getVector3D ( domain , " bottom_angle " ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setRowAngles ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " top_angle " ) ,
m_coverflow . getVector3D ( domainSel , " bottom_angle " ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
Vector3D def_cvr_scale = smallflow ? Vector3D ( 0.66f , 0.25f , 1.f )
: ( shortflow ? Vector3D ( 1.f , 0.66f , 1.f )
: Vector3D ( 1.f , 1.f , 1.f ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverScale ( false ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domain , " left_scale " , def_cvr_scale ) ,
m_coverflow . getVector3D ( domain , " right_scale " , def_cvr_scale ) ,
m_coverflow . getVector3D ( domain , " center_scale " , def_cvr_scale ) ,
m_coverflow . getVector3D ( domain , " row_center_scale " , def_cvr_scale ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverScale ( true ,
2016-04-30 16:19:30 +02:00
m_coverflow . getVector3D ( domainSel , " left_scale " , def_cvr_scale ) ,
m_coverflow . getVector3D ( domainSel , " right_scale " , def_cvr_scale ) ,
m_coverflow . getVector3D ( domainSel , " center_scale " , def_cvr_scale ) ,
m_coverflow . getVector3D ( domainSel , " row_center_scale " , def_cvr_scale ) ) ;
2012-04-08 17:54:34 +02:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
float flipX = smallflow ? 360.f : 180.f ;
2012-11-11 19:28:03 +01:00
CoverFlow . setCoverFlipping (
2012-04-08 17:54:34 +02:00
_getCFV3D ( domainSel , " flip_pos " , Vector3D ( ) , sf ) ,
_getCFV3D ( domainSel , " flip_angle " , Vector3D ( 0.f , flipX , 0.f ) , sf ) ,
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
_getCFV3D ( domainSel , " flip_scale " , Vector3D ( 1.f , 1.f , 1.f ) , sf ) ) ;
2012-04-08 17:54:34 +02:00
2012-11-11 19:28:03 +01:00
CoverFlow . setBlur (
2016-04-30 16:19:30 +02:00
m_coverflow . getInt ( domain , " blur_resolution " , 1 ) ,
m_coverflow . getInt ( domain , " blur_radius " , 2 ) ,
m_coverflow . getFloat ( domain , " blur_factor " , 1.f ) ) ;
2012-01-21 21:57:41 +01:00
}
void CMenu : : _buildMenus ( void )
{
// Default fonts
2013-09-02 00:31:46 +02:00
theme . btnFont = _font ( " GENERAL " , " button_font " , BUTTONFONT ) ;
2012-01-21 21:57:41 +01:00
theme . btnFontColor = m_theme . getColor ( " GENERAL " , " button_font_color " , 0xD0BFDFFF ) ;
2013-09-02 00:31:46 +02:00
theme . lblFont = _font ( " GENERAL " , " label_font " , LABELFONT ) ;
2012-01-21 21:57:41 +01:00
theme . lblFontColor = m_theme . getColor ( " GENERAL " , " label_font_color " , 0xD0BFDFFF ) ;
2013-09-02 00:31:46 +02:00
theme . titleFont = _font ( " GENERAL " , " title_font " , TITLEFONT ) ;
2012-02-10 19:45:42 +01:00
theme . titleFontColor = m_theme . getColor ( " GENERAL " , " title_font_color " , 0xFFFFFFFF ) ;
2012-09-02 22:05:35 +02:00
2013-09-02 00:31:46 +02:00
theme . txtFont = _font ( " GENERAL " , " text_font " , TEXTFONT ) ;
2012-01-21 21:57:41 +01:00
theme . txtFontColor = m_theme . getColor ( " GENERAL " , " text_font_color " , 0xFFFFFFFF ) ;
2012-09-02 22:05:35 +02:00
2012-01-21 21:57:41 +01:00
// Default Sounds
2016-04-30 16:19:30 +02:00
theme . clickSound = _sound ( theme . soundSet , m_theme . getString ( " GENERAL " , " click_sound " , " " ) . c_str ( ) , click_wav , click_wav_size , " default_btn_click " , false ) ;
theme . hoverSound = _sound ( theme . soundSet , m_theme . getString ( " GENERAL " , " hover_sound " , " " ) . c_str ( ) , hover_wav , hover_wav_size , " default_btn_hover " , false ) ;
theme . cameraSound = _sound ( theme . soundSet , m_theme . getString ( " GENERAL " , " camera_sound " , " " ) . c_str ( ) , camera_wav , camera_wav_size , " default_camera " , false ) ;
2012-09-02 22:05:35 +02:00
2012-01-21 21:57:41 +01:00
// Default textures
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexL , fmt ( " %s/butleft.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexL = _texture ( " GENERAL " , " button_texture_left " , theme . btnTexL ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexR , fmt ( " %s/butright.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexR = _texture ( " GENERAL " , " button_texture_right " , theme . btnTexR ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexC , fmt ( " %s/butcenter.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexC = _texture ( " GENERAL " , " button_texture_center " , theme . btnTexC ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexLS , fmt ( " %s/butsleft.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexLS = _texture ( " GENERAL " , " button_texture_left_selected " , theme . btnTexLS ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexRS , fmt ( " %s/butsright.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexRS = _texture ( " GENERAL " , " button_texture_right_selected " , theme . btnTexRS ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexCS , fmt ( " %s/butscenter.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexCS = _texture ( " GENERAL " , " button_texture_center_selected " , theme . btnTexCS ) ;
2012-02-17 17:46:05 +01:00
2013-01-19 13:33:52 +01:00
/* Language Buttons */
2013-11-19 16:27:52 +01:00
u32 img_buf_size = 0 ;
u8 * img_buf = fsop_ReadFile ( fmt ( " %s/butauon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnAUOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnAUOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnAUOn = _texture ( " GENERAL " , " button_au_on " , theme . btnAUOn ) ;
theme . btnAUOff = _texture ( " GENERAL " , " button_au_off " , theme . btnAUOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butauons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnAUOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnAUOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnAUOns = _texture ( " GENERAL " , " button_au_on_selected " , theme . btnAUOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnAUOffs = _texture ( " GENERAL " , " button_au_off_selected " , theme . btnAUOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butenon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnENOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnENOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnENOn = _texture ( " GENERAL " , " button_en_on " , theme . btnENOn ) ;
theme . btnENOff = _texture ( " GENERAL " , " button_en_off " , theme . btnENOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butenons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnENOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnENOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnENOns = _texture ( " GENERAL " , " button_en_on_selected " , theme . btnENOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnENOffs = _texture ( " GENERAL " , " button_en_off_selected " , theme . btnENOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butjaon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnJAOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnJAOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnJAOn = _texture ( " GENERAL " , " button_ja_on " , theme . btnJAOn ) ;
theme . btnJAOff = _texture ( " GENERAL " , " button_ja_off " , theme . btnJAOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butjaons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnJAOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnJAOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnJAOns = _texture ( " GENERAL " , " button_ja_on_selected " , theme . btnJAOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnJAOffs = _texture ( " GENERAL " , " button_ja_off_selected " , theme . btnJAOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butfron.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnFROn , img_buf ) ;
TexHandle . fromPNG ( theme . btnFROff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnFROn = _texture ( " GENERAL " , " button_fr_on " , theme . btnFROn ) ;
theme . btnFROff = _texture ( " GENERAL " , " button_fr_off " , theme . btnFROff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butfrons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnFROns , img_buf ) ;
TexHandle . fromPNG ( theme . btnFROffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnFROns = _texture ( " GENERAL " , " button_fr_on_selected " , theme . btnFROns ) ;
2012-11-03 20:16:03 +01:00
theme . btnFROffs = _texture ( " GENERAL " , " button_fr_off_selected " , theme . btnFROffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butdeon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnDEOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnDEOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnDEOn = _texture ( " GENERAL " , " button_de_on " , theme . btnDEOn ) ;
theme . btnDEOff = _texture ( " GENERAL " , " button_de_off " , theme . btnDEOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butdeons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnDEOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnDEOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnDEOns = _texture ( " GENERAL " , " button_de_on_selected " , theme . btnDEOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnDEOffs = _texture ( " GENERAL " , " button_de_off_selected " , theme . btnDEOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/buteson.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnESOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnESOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnESOn = _texture ( " GENERAL " , " button_es_on " , theme . btnESOn ) ;
theme . btnESOff = _texture ( " GENERAL " , " button_es_off " , theme . btnESOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butesons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnESOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnESOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnESOns = _texture ( " GENERAL " , " button_es_on_selected " , theme . btnESOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnESOffs = _texture ( " GENERAL " , " button_es_off_selected " , theme . btnESOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butiton.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnITOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnITOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnITOn = _texture ( " GENERAL " , " button_it_on " , theme . btnITOn ) ;
theme . btnITOff = _texture ( " GENERAL " , " button_it_off " , theme . btnITOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butitons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnITOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnITOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnITOns = _texture ( " GENERAL " , " button_it_on_selected " , theme . btnITOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnITOffs = _texture ( " GENERAL " , " button_it_off_selected " , theme . btnITOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butnlon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnNLOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnNLOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnNLOn = _texture ( " GENERAL " , " button_nl_on " , theme . btnNLOn ) ;
theme . btnNLOff = _texture ( " GENERAL " , " button_nl_off " , theme . btnNLOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butnlons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnNLOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnNLOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnNLOns = _texture ( " GENERAL " , " button_nl_on_selected " , theme . btnNLOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnNLOffs = _texture ( " GENERAL " , " button_nl_off_selected " , theme . btnNLOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butpton.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnPTOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnPTOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnPTOn = _texture ( " GENERAL " , " button_pt_on " , theme . btnPTOn ) ;
theme . btnPTOff = _texture ( " GENERAL " , " button_pt_off " , theme . btnPTOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butptons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnPTOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnPTOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnPTOns = _texture ( " GENERAL " , " button_pt_on_selected " , theme . btnPTOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnPTOffs = _texture ( " GENERAL " , " button_pt_off_selected " , theme . btnPTOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butruon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnRUOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnRUOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnRUOn = _texture ( " GENERAL " , " button_ru_on " , theme . btnRUOn ) ;
theme . btnRUOff = _texture ( " GENERAL " , " button_ru_off " , theme . btnRUOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butruons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnRUOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnRUOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnRUOns = _texture ( " GENERAL " , " button_ru_on_selected " , theme . btnRUOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnRUOffs = _texture ( " GENERAL " , " button_ru_off_selected " , theme . btnRUOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butkoon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnKOOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnKOOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnKOOn = _texture ( " GENERAL " , " button_ko_on " , theme . btnKOOn ) ;
theme . btnKOOff = _texture ( " GENERAL " , " button_ko_off " , theme . btnKOOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butkoons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnKOOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnKOOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnKOOns = _texture ( " GENERAL " , " button_ko_on_selected " , theme . btnKOOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnKOOffs = _texture ( " GENERAL " , " button_ko_off_selected " , theme . btnKOOffs ) ;
2012-02-15 21:18:15 +01:00
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butzhcnon.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnZHCNOn , img_buf ) ;
TexHandle . fromPNG ( theme . btnZHCNOff , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
2012-11-03 20:16:03 +01:00
theme . btnZHCNOn = _texture ( " GENERAL " , " button_zhcn_on " , theme . btnZHCNOn ) ;
theme . btnZHCNOff = _texture ( " GENERAL " , " button_zhcn_off " , theme . btnZHCNOff ) ;
2013-11-19 16:27:52 +01:00
img_buf = fsop_ReadFile ( fmt ( " %s/butzhcnons.png " , m_imgsDir . c_str ( ) ) , & img_buf_size ) ;
if ( img_buf ! = NULL )
{
TexHandle . fromPNG ( theme . btnZHCNOns , img_buf ) ;
TexHandle . fromPNG ( theme . btnZHCNOffs , img_buf , GX_TF_RGBA8 , 0 , 0 , true ) ;
MEM2_free ( img_buf ) ;
}
theme . btnZHCNOns = _texture ( " GENERAL " , " button_zhcn_on_selected " , theme . btnZHCNOns ) ;
2012-11-03 20:16:03 +01:00
theme . btnZHCNOffs = _texture ( " GENERAL " , " button_zhcn_off_selected " , theme . btnZHCNOffs ) ;
2012-10-13 18:57:03 +02:00
2013-01-19 13:33:52 +01:00
/* Default textures */
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxoff , fmt ( " %s/checkbox.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxoff = _texture ( " GENERAL " , " checkbox_off " , theme . checkboxoff ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxoffs , fmt ( " %s/checkbox.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxoffs = _texture ( " GENERAL " , " checkbox_off_selected " , theme . checkboxoffs ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxon , fmt ( " %s/checkboxs.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxon = _texture ( " GENERAL " , " checkbox_on " , theme . checkboxon ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxons , fmt ( " %s/checkboxs.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxons = _texture ( " GENERAL " , " checkbox_on_selected " , theme . checkboxons ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxHid , fmt ( " %s/checkboxhid.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxHid = _texture ( " GENERAL " , " checkbox_Hid " , theme . checkboxHid ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxHids , fmt ( " %s/checkboxhid.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxHids = _texture ( " GENERAL " , " checkbox_Hid_selected " , theme . checkboxHids ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxReq , fmt ( " %s/checkboxreq.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxReq = _texture ( " GENERAL " , " checkbox_Req " , theme . checkboxReq ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . checkboxReqs , fmt ( " %s/checkboxreq.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . checkboxReqs = _texture ( " GENERAL " , " checkbox_Req_selected " , theme . checkboxReqs ) ;
2012-04-08 16:48:50 +02:00
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . pbarTexL , fmt ( " %s/pbarleft.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . pbarTexL = _texture ( " GENERAL " , " progressbar_texture_left " , theme . pbarTexL ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . pbarTexR , fmt ( " %s/pbarright.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . pbarTexR = _texture ( " GENERAL " , " progressbar_texture_right " , theme . pbarTexR ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . pbarTexC , fmt ( " %s/pbarcenter.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . pbarTexC = _texture ( " GENERAL " , " progressbar_texture_center " , theme . pbarTexC ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . pbarTexLS , fmt ( " %s/pbarlefts.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . pbarTexLS = _texture ( " GENERAL " , " progressbar_texture_left_selected " , theme . pbarTexLS ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . pbarTexRS , fmt ( " %s/pbarrights.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . pbarTexRS = _texture ( " GENERAL " , " progressbar_texture_right_selected " , theme . pbarTexRS ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . pbarTexCS , fmt ( " %s/pbarcenters.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . pbarTexCS = _texture ( " GENERAL " , " progressbar_texture_center_selected " , theme . pbarTexCS ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexPlus , fmt ( " %s/btnplus.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexPlus = _texture ( " GENERAL " , " plus_button_texture " , theme . btnTexPlus ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexPlusS , fmt ( " %s/btnpluss.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexPlusS = _texture ( " GENERAL " , " plus_button_texture_selected " , theme . btnTexPlusS ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexMinus , fmt ( " %s/btnminus.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexMinus = _texture ( " GENERAL " , " minus_button_texture " , theme . btnTexMinus ) ;
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . btnTexMinusS , fmt ( " %s/btnminuss.png " , m_imgsDir . c_str ( ) ) ) ;
2012-11-03 20:16:03 +01:00
theme . btnTexMinusS = _texture ( " GENERAL " , " minus_button_texture_selected " , theme . btnTexMinusS ) ;
2012-09-02 22:05:35 +02:00
2012-01-21 21:57:41 +01:00
// Default background
2013-11-19 16:27:52 +01:00
TexHandle . fromImageFile ( theme . bg , fmt ( " %s/background.jpg " , m_imgsDir . c_str ( ) ) ) ;
TexHandle . fromImageFile ( m_mainBgLQ , fmt ( " %s/background.jpg " , m_imgsDir . c_str ( ) ) , GX_TF_CMPR , 64 , 64 ) ;
2012-01-21 21:57:41 +01:00
m_gameBgLQ = m_mainBgLQ ;
// Build menus
2012-11-03 20:16:03 +01:00
_initMainMenu ( ) ;
_initErrorMenu ( ) ;
2013-08-14 18:11:26 +02:00
_initWad ( ) ;
2013-09-07 19:49:49 +02:00
_initFTP ( ) ;
2013-08-14 18:11:26 +02:00
_initWBFSMenu ( ) ;
2012-11-03 20:16:03 +01:00
_initConfigAdvMenu ( ) ;
_initConfigSndMenu ( ) ;
_initConfig4Menu ( ) ;
_initConfigScreenMenu ( ) ;
_initConfig3Menu ( ) ;
_initConfigMenu ( ) ;
_initGameMenu ( ) ;
_initDownloadMenu ( ) ;
_initCodeMenu ( ) ;
_initAboutMenu ( ) ;
_initCFThemeMenu ( ) ;
_initGameSettingsMenu ( ) ;
_initCheatSettingsMenu ( ) ;
2013-08-08 20:21:11 +02:00
_initLangSettingsMenu ( ) ;
2012-11-03 20:16:03 +01:00
_initSourceMenu ( ) ;
2013-09-12 15:04:50 +02:00
_initCfgSrc ( ) ;
2012-11-03 20:16:03 +01:00
_initPluginSettingsMenu ( ) ;
_initCategorySettingsMenu ( ) ;
_initSystemMenu ( ) ;
_initGameInfoMenu ( ) ;
_initNandEmuMenu ( ) ;
_initHomeAndExitToMenu ( ) ;
2013-06-27 19:14:11 +02:00
_initCoverBanner ( ) ;
2013-06-28 00:16:30 +02:00
_initExplorer ( ) ;
2012-12-21 20:51:22 +01:00
_initBoot ( ) ;
2013-08-17 15:21:43 +02:00
_initPathsMenu ( ) ;
2012-11-03 20:16:03 +01:00
_loadCFCfg ( ) ;
2012-01-21 21:57:41 +01:00
}
typedef struct
{
string ext ;
u32 min ;
u32 max ;
u32 def ;
u32 res ;
} FontHolder ;
2013-09-02 00:31:46 +02:00
SFont CMenu : : _font ( const char * domain , const char * key , u32 fontSize , u32 lineSpacing , u32 weight , u32 index , const char * genKey )
2012-01-21 21:57:41 +01:00
{
2013-09-02 00:31:46 +02:00
string filename ;
2012-01-21 21:57:41 +01:00
bool general = strncmp ( domain , " GENERAL " , 7 ) = = 0 ;
FontHolder fonts [ 3 ] = { { " _size " , 6u , 300u , fontSize , 0 } , { " _line_height " , 6u , 300u , lineSpacing , 0 } , { " _weight " , 1u , 32u , weight , 0 } } ;
if ( ! general )
filename = m_theme . getString ( domain , key ) ;
if ( filename . empty ( ) )
filename = m_theme . getString ( " GENERAL " , genKey , genKey ) ;
bool useDefault = filename = = genKey ;
for ( u32 i = 0 ; i < 3 ; i + + )
{
string defValue = genKey ;
defValue + = fonts [ i ] . ext ;
string value = key ;
value + = fonts [ i ] . ext ;
if ( ! general )
fonts [ i ] . res = ( u32 ) m_theme . getInt ( domain , value ) ;
if ( fonts [ i ] . res < = 0 )
fonts [ i ] . res = ( u32 ) m_theme . getInt ( " GENERAL " , defValue ) ;
2013-06-29 16:48:02 +02:00
fonts [ i ] . res = min ( max ( fonts [ i ] . min , fonts [ i ] . res < = 0 ? fonts [ i ] . def : fonts [ i ] . res ) , fonts [ i ] . max ) ;
2012-01-21 21:57:41 +01:00
}
2013-06-29 16:48:02 +02:00
/* ONLY return the font if spacing and weight are the same */
2013-09-02 00:31:46 +02:00
std : : vector < SFont > : : iterator font_itr ;
for ( font_itr = theme . fontSet . begin ( ) ; font_itr ! = theme . fontSet . end ( ) ; + + font_itr )
{
if ( strncmp ( filename . c_str ( ) , font_itr - > name , 127 ) = = 0 & & font_itr - > fSize = = fonts [ 0 ] . res & &
font_itr - > lineSpacing = = fonts [ 1 ] . res & & font_itr - > weight & & fonts [ 2 ] . res )
break ;
}
if ( font_itr ! = theme . fontSet . end ( ) ) return * font_itr ;
2012-01-21 21:57:41 +01:00
// TTF not found in memory, load it to create a new font
SFont retFont ;
2013-09-02 00:31:46 +02:00
if ( ! useDefault & & retFont . fromFile ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , filename . c_str ( ) ) , fonts [ 0 ] . res , fonts [ 1 ] . res , fonts [ 2 ] . res , index , filename . c_str ( ) ) )
2012-01-21 21:57:41 +01:00
{
// Theme Font
2013-09-02 00:31:46 +02:00
theme . fontSet . push_back ( retFont ) ;
2012-01-21 21:57:41 +01:00
return retFont ;
}
2012-11-03 20:16:03 +01:00
/* Fallback to default font */
2013-09-02 00:31:46 +02:00
if ( retFont . fromBuffer ( m_base_font , m_base_font_size , fonts [ 0 ] . res , fonts [ 1 ] . res , fonts [ 2 ] . res , index , filename . c_str ( ) ) )
2012-01-21 21:57:41 +01:00
{
// Default font
2013-09-02 00:31:46 +02:00
theme . fontSet . push_back ( retFont ) ;
2012-01-21 21:57:41 +01:00
return retFont ;
}
return retFont ;
}
2012-12-28 15:19:40 +01:00
vector < TexData > CMenu : : _textures ( const char * domain , const char * key )
2012-01-21 21:57:41 +01:00
{
2012-12-28 15:19:40 +01:00
vector < TexData > textures ;
2012-01-21 21:57:41 +01:00
if ( m_theme . loaded ( ) )
{
2012-05-06 14:03:43 +02:00
vector < string > filenames = m_theme . getStrings ( domain , key ) ;
2012-01-21 21:57:41 +01:00
if ( filenames . size ( ) > 0 )
{
2012-05-06 14:03:43 +02:00
for ( vector < string > : : iterator itr = filenames . begin ( ) ; itr ! = filenames . end ( ) ; itr + + )
2012-01-21 21:57:41 +01:00
{
2012-11-03 20:16:03 +01:00
const string & filename = * itr ;
TexSet : : iterator i = theme . texSet . find ( filename ) ;
if ( i ! = theme . texSet . end ( ) )
2012-01-21 21:57:41 +01:00
textures . push_back ( i - > second ) ;
2016-04-03 02:51:40 +02:00
TexData themetex ;
if ( TexHandle . fromImageFile ( themetex , fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , filename . c_str ( ) ) ) = = TE_OK )
2012-01-21 21:57:41 +01:00
{
2016-04-03 02:51:40 +02:00
theme . texSet [ filename ] = themetex ;
textures . push_back ( themetex ) ;
2012-01-21 21:57:41 +01:00
}
}
}
}
return textures ;
}
2012-12-28 15:19:40 +01:00
TexData CMenu : : _texture ( const char * domain , const char * key , TexData & def , bool freeDef )
2012-01-21 21:57:41 +01:00
{
string filename ;
2012-11-03 20:16:03 +01:00
if ( m_theme . loaded ( ) )
2012-01-21 21:57:41 +01:00
{
2012-11-03 20:16:03 +01:00
/* Load from theme */
2012-01-21 21:57:41 +01:00
filename = m_theme . getString ( domain , key ) ;
2012-11-03 20:16:03 +01:00
if ( ! filename . empty ( ) )
2012-01-21 21:57:41 +01:00
{
2012-11-03 20:16:03 +01:00
TexSet : : iterator i = theme . texSet . find ( filename ) ;
if ( i ! = theme . texSet . end ( ) )
2012-01-21 21:57:41 +01:00
return i - > second ;
2012-11-03 20:16:03 +01:00
/* Load from image file */
2016-04-03 02:51:40 +02:00
TexData themetex ;
if ( TexHandle . fromImageFile ( themetex , fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , filename . c_str ( ) ) ) = = TE_OK )
2012-01-21 21:57:41 +01:00
{
2012-11-03 20:16:03 +01:00
if ( freeDef & & def . data ! = NULL )
{
free ( def . data ) ;
def . data = NULL ;
}
2016-04-03 02:51:40 +02:00
theme . texSet [ filename ] = themetex ;
return themetex ;
2012-01-21 21:57:41 +01:00
}
}
}
2012-11-03 20:16:03 +01:00
/* Fallback to default */
theme . texSet [ filename ] = def ;
2012-01-21 21:57:41 +01:00
return def ;
}
// Only for loading defaults and GENERAL domains!!
2016-04-30 16:19:30 +02:00
GuiSound * CMenu : : _sound ( CMenu : : SoundSet & soundSet , const char * filename , const u8 * snd , u32 len , const char * name , bool isAllocated )
2012-01-21 21:57:41 +01:00
{
2012-11-04 20:22:02 +01:00
if ( filename = = NULL | | filename [ 0 ] = = ' \0 ' )
2012-11-04 15:13:42 +01:00
filename = name ;
2012-01-21 21:57:41 +01:00
2012-11-04 20:22:02 +01:00
CMenu : : SoundSet : : iterator i = soundSet . find ( upperCase ( name ) ) ;
2012-11-04 15:13:42 +01:00
if ( i = = soundSet . end ( ) )
2012-01-21 21:57:41 +01:00
{
2013-06-29 18:54:21 +02:00
if ( filename ! = name & & fsop_FileExist ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , filename ) ) )
{
u32 size = 0 ;
u8 * mem = fsop_ReadFile ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , filename ) , & size ) ;
soundSet [ upperCase ( filename ) ] = new GuiSound ( mem , size , filename , true ) ;
}
2012-01-21 21:57:41 +01:00
else
2012-11-04 15:13:42 +01:00
soundSet [ upperCase ( filename ) ] = new GuiSound ( snd , len , filename , isAllocated ) ;
return soundSet [ upperCase ( filename ) ] ;
2012-01-21 21:57:41 +01:00
}
return i - > second ;
}
//For buttons and labels only!!
2012-11-04 15:13:42 +01:00
GuiSound * CMenu : : _sound ( CMenu : : SoundSet & soundSet , const char * domain , const char * key , const char * name )
2012-01-21 21:57:41 +01:00
{
2012-11-04 15:13:42 +01:00
const char * filename = m_theme . getString ( domain , key ) . c_str ( ) ;
2012-11-04 20:22:02 +01:00
if ( filename = = NULL | | filename [ 0 ] = = ' \0 ' )
2012-01-21 21:57:41 +01:00
{
2012-11-04 15:13:42 +01:00
if ( strrchr ( name , ' / ' ) ! = NULL )
name = strrchr ( name , ' / ' ) + 1 ;
return soundSet [ upperCase ( name ) ] ; // General/Default are already cached!
2012-01-21 21:57:41 +01:00
}
2012-11-04 15:13:42 +01:00
SoundSet : : iterator i = soundSet . find ( upperCase ( filename ) ) ;
if ( i = = soundSet . end ( ) )
2012-01-21 21:57:41 +01:00
{
2013-06-29 18:54:21 +02:00
if ( fsop_FileExist ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , filename ) ) )
{
u32 size = 0 ;
u8 * mem = fsop_ReadFile ( fmt ( " %s/%s " , m_themeDataDir . c_str ( ) , filename ) , & size ) ;
soundSet [ upperCase ( filename ) ] = new GuiSound ( mem , size , filename , true ) ;
}
else
soundSet [ upperCase ( filename ) ] = new GuiSound ( ) ;
2012-11-04 15:13:42 +01:00
return soundSet [ upperCase ( filename ) ] ;
2012-01-21 21:57:41 +01:00
}
return i - > second ;
}
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
u16 CMenu : : _textStyle ( const char * domain , const char * key , u16 def , bool coverflow )
2012-01-21 21:57:41 +01:00
{
u16 textStyle = 0 ;
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
string style ;
if ( coverflow )
style = m_coverflow . getString ( domain , key ) ;
else
style = m_theme . getString ( domain , key ) ;
2012-01-21 21:57:41 +01:00
if ( style . empty ( ) ) return def ;
if ( style . find_first_of ( " Cc " ) ! = string : : npos )
textStyle | = FTGX_JUSTIFY_CENTER ;
else if ( style . find_first_of ( " Rr " ) ! = string : : npos )
textStyle | = FTGX_JUSTIFY_RIGHT ;
else
textStyle | = FTGX_JUSTIFY_LEFT ;
if ( style . find_first_of ( " Mm " ) ! = string : : npos )
textStyle | = FTGX_ALIGN_MIDDLE ;
else if ( style . find_first_of ( " Bb " ) ! = string : : npos )
textStyle | = FTGX_ALIGN_BOTTOM ;
else
textStyle | = FTGX_ALIGN_TOP ;
return textStyle ;
}
2012-11-03 20:16:03 +01:00
s16 CMenu : : _addButton ( const char * domain , SFont font , const wstringEx & text , int x , int y , u32 width , u32 height , const CColor & color )
2012-01-21 21:57:41 +01:00
{
SButtonTextureSet btnTexSet ;
CColor c ( color ) ;
c = m_theme . getColor ( domain , " color " , c ) ;
2012-05-25 16:21:43 +02:00
x = m_theme . getInt ( domain , " x " , x ) ;
y = m_theme . getInt ( domain , " y " , y ) ;
2012-01-21 21:57:41 +01:00
width = m_theme . getInt ( domain , " width " , width ) ;
height = m_theme . getInt ( domain , " height " , height ) ;
2012-11-03 20:16:03 +01:00
btnTexSet . left = _texture ( domain , " texture_left " , theme . btnTexL , false ) ;
btnTexSet . right = _texture ( domain , " texture_right " , theme . btnTexR , false ) ;
btnTexSet . center = _texture ( domain , " texture_center " , theme . btnTexC , false ) ;
btnTexSet . leftSel = _texture ( domain , " texture_left_selected " , theme . btnTexLS , false ) ;
btnTexSet . rightSel = _texture ( domain , " texture_right_selected " , theme . btnTexRS , false ) ;
btnTexSet . centerSel = _texture ( domain , " texture_center_selected " , theme . btnTexCS , false ) ;
2013-09-02 00:31:46 +02:00
font = _font ( domain , " font " , BUTTONFONT ) ;
2012-11-03 20:16:03 +01:00
GuiSound * clickSound = _sound ( theme . soundSet , domain , " click_sound " , theme . clickSound - > GetName ( ) ) ;
GuiSound * hoverSound = _sound ( theme . soundSet , domain , " hover_sound " , theme . hoverSound - > GetName ( ) ) ;
2012-02-12 02:43:31 +01:00
return m_btnMgr . addButton ( font , text , x , y , width , height , c , btnTexSet , clickSound , hoverSound ) ;
}
2012-12-28 15:19:40 +01:00
s16 CMenu : : _addPicButton ( const char * domain , TexData & texNormal , TexData & texSelected , int x , int y , u32 width , u32 height )
2012-01-21 21:57:41 +01:00
{
x = m_theme . getInt ( domain , " x " , x ) ;
y = m_theme . getInt ( domain , " y " , y ) ;
width = m_theme . getInt ( domain , " width " , width ) ;
height = m_theme . getInt ( domain , " height " , height ) ;
2012-12-28 15:19:40 +01:00
TexData tex1 = _texture ( domain , " texture_normal " , texNormal , false ) ;
TexData tex2 = _texture ( domain , " texture_selected " , texSelected , false ) ;
2012-11-03 20:16:03 +01:00
GuiSound * clickSound = _sound ( theme . soundSet , domain , " click_sound " , theme . clickSound - > GetName ( ) ) ;
GuiSound * hoverSound = _sound ( theme . soundSet , domain , " hover_sound " , theme . hoverSound - > GetName ( ) ) ;
2012-01-21 21:57:41 +01:00
return m_btnMgr . addPicButton ( tex1 , tex2 , x , y , width , height , clickSound , hoverSound ) ;
}
2012-11-03 20:16:03 +01:00
s16 CMenu : : _addTitle ( const char * domain , SFont font , const wstringEx & text , int x , int y , u32 width , u32 height , const CColor & color , s16 style )
2012-02-10 19:45:42 +01:00
{
CColor c ( color ) ;
c = m_theme . getColor ( domain , " color " , c ) ;
x = m_theme . getInt ( domain , " x " , x ) ;
y = m_theme . getInt ( domain , " y " , y ) ;
width = m_theme . getInt ( domain , " width " , width ) ;
height = m_theme . getInt ( domain , " height " , height ) ;
2013-09-02 00:31:46 +02:00
font = _font ( domain , " font " , TITLEFONT ) ;
2012-02-10 19:45:42 +01:00
style = _textStyle ( domain , " style " , style ) ;
return m_btnMgr . addLabel ( font , text , x , y , width , height , c , style ) ;
}
2012-11-03 20:16:03 +01:00
s16 CMenu : : _addText ( const char * domain , SFont font , const wstringEx & text , int x , int y , u32 width , u32 height , const CColor & color , s16 style )
2012-02-10 19:45:42 +01:00
{
CColor c ( color ) ;
c = m_theme . getColor ( domain , " color " , c ) ;
x = m_theme . getInt ( domain , " x " , x ) ;
y = m_theme . getInt ( domain , " y " , y ) ;
width = m_theme . getInt ( domain , " width " , width ) ;
height = m_theme . getInt ( domain , " height " , height ) ;
2013-09-02 00:31:46 +02:00
font = _font ( domain , " font " , TEXTFONT ) ;
2012-02-10 19:45:42 +01:00
style = _textStyle ( domain , " style " , style ) ;
return m_btnMgr . addLabel ( font , text , x , y , width , height , c , style ) ;
}
2012-11-03 20:16:03 +01:00
s16 CMenu : : _addLabel ( const char * domain , SFont font , const wstringEx & text , int x , int y , u32 width , u32 height , const CColor & color , s16 style )
2012-01-21 21:57:41 +01:00
{
CColor c ( color ) ;
c = m_theme . getColor ( domain , " color " , c ) ;
x = m_theme . getInt ( domain , " x " , x ) ;
y = m_theme . getInt ( domain , " y " , y ) ;
width = m_theme . getInt ( domain , " width " , width ) ;
height = m_theme . getInt ( domain , " height " , height ) ;
2013-09-02 00:31:46 +02:00
font = _font ( domain , " font " , LABELFONT ) ;
2012-01-21 21:57:41 +01:00
style = _textStyle ( domain , " style " , style ) ;
return m_btnMgr . addLabel ( font , text , x , y , width , height , c , style ) ;
}
2012-12-28 15:19:40 +01:00
s16 CMenu : : _addLabel ( const char * domain , SFont font , const wstringEx & text , int x , int y , u32 width , u32 height , const CColor & color , s16 style , TexData & bg )
2012-01-21 21:57:41 +01:00
{
CColor c ( color ) ;
c = m_theme . getColor ( domain , " color " , c ) ;
x = m_theme . getInt ( domain , " x " , x ) ;
y = m_theme . getInt ( domain , " y " , y ) ;
width = m_theme . getInt ( domain , " width " , width ) ;
height = m_theme . getInt ( domain , " height " , height ) ;
2013-09-02 00:31:46 +02:00
font = _font ( domain , " font " , BUTTONFONT ) ;
2012-12-28 15:19:40 +01:00
TexData texBg = _texture ( domain , " background_texture " , bg , false ) ;
2012-01-21 21:57:41 +01:00
style = _textStyle ( domain , " style " , style ) ;
return m_btnMgr . addLabel ( font , text , x , y , width , height , c , style , texBg ) ;
}
2012-11-03 20:16:03 +01:00
s16 CMenu : : _addProgressBar ( const char * domain , int x , int y , u32 width , u32 height )
2012-01-21 21:57:41 +01:00
{
SButtonTextureSet btnTexSet ;
x = m_theme . getInt ( domain , " x " , x ) ;
y = m_theme . getInt ( domain , " y " , y ) ;
width = m_theme . getInt ( domain , " width " , width ) ;
height = m_theme . getInt ( domain , " height " , height ) ;
2012-11-03 20:16:03 +01:00
btnTexSet . left = _texture ( domain , " texture_left " , theme . pbarTexL , false ) ;
btnTexSet . right = _texture ( domain , " texture_right " , theme . pbarTexR , false ) ;
btnTexSet . center = _texture ( domain , " texture_center " , theme . pbarTexC , false ) ;
btnTexSet . leftSel = _texture ( domain , " texture_left_selected " , theme . pbarTexLS , false ) ;
btnTexSet . rightSel = _texture ( domain , " texture_right_selected " , theme . pbarTexRS , false ) ;
btnTexSet . centerSel = _texture ( domain , " texture_center_selected " , theme . pbarTexCS , false ) ;
2012-01-21 21:57:41 +01:00
return m_btnMgr . addProgressBar ( x , y , width , height , btnTexSet ) ;
}
2012-09-13 16:54:17 +02:00
void CMenu : : _setHideAnim ( s16 id , const char * domain , int dx , int dy , float scaleX , float scaleY )
2012-01-21 21:57:41 +01:00
{
dx = m_theme . getInt ( domain , " effect_x " , dx ) ;
dy = m_theme . getInt ( domain , " effect_y " , dy ) ;
scaleX = m_theme . getFloat ( domain , " effect_scale_x " , scaleX ) ;
scaleY = m_theme . getFloat ( domain , " effect_scale_y " , scaleY ) ;
m_btnMgr . hide ( id , dx , dy , scaleX , scaleY , true ) ;
}
2012-11-03 20:16:03 +01:00
void CMenu : : _addUserLabels ( s16 * ids , u32 size , const char * domain )
2012-01-21 21:57:41 +01:00
{
2012-11-03 20:16:03 +01:00
_addUserLabels ( ids , 0 , size , domain ) ;
2012-01-21 21:57:41 +01:00
}
2012-11-03 20:16:03 +01:00
void CMenu : : _addUserLabels ( s16 * ids , u32 start , u32 size , const char * domain )
2012-01-21 21:57:41 +01:00
{
2012-07-05 15:15:23 +02:00
for ( u32 i = start ; i < start + size ; + + i )
2012-01-21 21:57:41 +01:00
{
2012-11-18 14:40:26 +01:00
string dom ( fmt ( " %s/USER%i " , domain , i + 1 ) ) ;
2012-01-21 21:57:41 +01:00
if ( m_theme . hasDomain ( dom ) )
{
2012-12-28 15:19:40 +01:00
TexData emptyTex ;
2012-11-03 20:16:03 +01:00
ids [ i ] = _addLabel ( dom . c_str ( ) , theme . lblFont , L " " , 40 , 200 , 64 , 64 , CColor ( 0xFFFFFFFF ) , 0 , emptyTex ) ;
2012-01-21 21:57:41 +01:00
_setHideAnim ( ids [ i ] , dom . c_str ( ) , - 50 , 0 , 0.f , 0.f ) ;
}
else
2012-09-13 16:54:17 +02:00
ids [ i ] = - 1 ;
2012-01-21 21:57:41 +01:00
}
}
void CMenu : : _initCF ( void )
{
2016-04-02 18:47:18 +02:00
Config dump ;
2012-01-21 21:57:41 +01:00
const char * domain = _domainFromView ( ) ;
2013-01-21 00:30:28 +01:00
2012-11-11 19:28:03 +01:00
CoverFlow . clear ( ) ;
CoverFlow . reserve ( m_gameList . size ( ) ) ;
2012-01-21 21:57:41 +01:00
2013-01-21 00:30:28 +01:00
bool dumpGameLst = m_cfg . getBool ( domain , " dump_list " , true ) ;
2012-05-14 07:37:10 +02:00
if ( dumpGameLst ) dump . load ( fmt ( " %s/ " TITLES_DUMP_FILENAME , m_settingsDir . c_str ( ) ) ) ;
m_gcfg1 . load ( fmt ( " %s/ " GAME_SETTINGS1_FILENAME , m_settingsDir . c_str ( ) ) ) ;
2013-01-21 00:30:28 +01:00
2013-09-04 22:58:22 +02:00
const vector < bool > & EnabledPlugins = m_plugin . GetEnabledPlugins ( m_cfg , & enabledPluginsCount ) ;
2013-01-21 00:30:28 +01:00
2012-11-03 20:16:03 +01:00
for ( vector < dir_discHdr > : : iterator element = m_gameList . begin ( ) ; element ! = m_gameList . end ( ) ; + + element )
2012-01-21 21:57:41 +01:00
{
2013-10-09 18:05:29 +02:00
char tmp [ MAX_FAT_PATH ] ;
memset ( tmp , 0 , MAX_FAT_PATH ) ;
const char * id = NULL ;
2012-11-03 20:16:03 +01:00
u64 chantitle = TITLE_ID ( element - > settings [ 0 ] , element - > settings [ 1 ] ) ;
2013-09-12 15:04:50 +02:00
if ( m_sourceflow )
{
2013-10-09 18:05:29 +02:00
char srctmp [ 63 ] = " source/ " ;
memcpy ( tmp , srctmp , 63 ) ;
wcstombs ( srctmp , element - > title , 63 ) ;
strcat ( tmp , srctmp ) ;
id = tmp ;
2013-09-12 15:04:50 +02:00
}
else if ( element - > type = = TYPE_HOMEBREW )
2013-03-28 14:02:50 +01:00
id = strrchr ( element - > path , ' / ' ) + 1 ;
2012-11-03 20:16:03 +01:00
else if ( element - > type = = TYPE_PLUGIN )
2012-06-16 19:03:23 +02:00
{
2013-10-09 18:05:29 +02:00
if ( strstr ( element - > path , " :/ " ) ! = NULL )
2012-06-14 22:59:18 +02:00
{
2013-10-09 18:05:29 +02:00
if ( * ( strchr ( element - > path , ' / ' ) + 1 ) ! = ' \0 ' )
strcat ( tmp , strchr ( element - > path , ' / ' ) + 1 ) ;
else
strcat ( tmp , element - > path ) ;
if ( strchr ( tmp , ' / ' ) ! = NULL )
* ( strchr ( tmp , ' / ' ) + 1 ) = ' \0 ' ;
2012-05-22 17:38:39 +02:00
}
2013-10-09 18:05:29 +02:00
strcat ( tmp , fmt ( " %ls " , element - > title ) ) ;
id = tmp ;
2012-05-05 22:07:54 +02:00
}
2012-06-16 19:03:23 +02:00
else
{
2012-11-03 20:16:03 +01:00
if ( element - > type = = TYPE_CHANNEL & & chantitle = = HBC_108 )
strncpy ( element - > id , " JODI " , 6 ) ;
id = element - > id ;
2013-03-27 23:46:18 +01:00
if ( element - > type = = TYPE_GC_GAME & & element - > settings [ 0 ] = = 1 ) /* disc 2 */
2013-10-09 18:05:29 +02:00
{
strcat ( tmp , fmt ( " %.6s_2 " , element - > id ) ) ;
id = tmp ;
}
2012-06-16 19:03:23 +02:00
}
if ( ( ! m_favorites | | m_gcfg1 . getBool ( " FAVORITES " , id , false ) )
2016-04-02 18:47:18 +02:00
& & ( ! m_locked | | ! m_gcfg1 . getBool ( " ADULTONLY " , id , false ) ) )
2012-01-21 21:57:41 +01:00
{
2012-09-13 23:11:41 +02:00
string catDomain ;
2012-11-03 20:16:03 +01:00
switch ( element - > type )
2012-01-21 21:57:41 +01:00
{
2012-09-13 23:11:41 +02:00
case TYPE_CHANNEL :
2016-04-02 18:47:18 +02:00
catDomain = " CHANNELS " ;
2012-09-13 23:11:41 +02:00
break ;
case TYPE_HOMEBREW :
2013-09-12 15:04:50 +02:00
case TYPE_SOURCE :
2013-01-15 14:54:33 +01:00
catDomain = " HOMEBREW " ;
2012-09-13 23:11:41 +02:00
break ;
case TYPE_GC_GAME :
2016-04-02 18:47:18 +02:00
catDomain = " GAMECUBE " ;
2012-09-13 23:11:41 +02:00
break ;
2013-01-15 14:54:33 +01:00
case TYPE_WII_GAME :
2016-04-02 18:47:18 +02:00
catDomain = " WII " ;
2012-09-13 23:11:41 +02:00
break ;
default :
2013-01-15 14:54:33 +01:00
catDomain = ( m_plugin . GetPluginName ( m_plugin . GetPluginPosition ( element - > settings [ 0 ] ) ) ) . toUTF8 ( ) ;
}
const char * requiredCats = m_cat . getString ( " GENERAL " , " required_categories " ) . c_str ( ) ;
const char * selectedCats = m_cat . getString ( " GENERAL " , " selected_categories " ) . c_str ( ) ;
const char * hiddenCats = m_cat . getString ( " GENERAL " , " hidden_categories " ) . c_str ( ) ;
2012-09-13 23:11:41 +02:00
u8 numReqCats = strlen ( requiredCats ) ;
u8 numSelCats = strlen ( selectedCats ) ;
u8 numHidCats = strlen ( hiddenCats ) ;
if ( numReqCats ! = 0 | | numSelCats ! = 0 | | numHidCats ! = 0 ) // if all 0 skip checking cats and show all games
{
const char * idCats = m_cat . getString ( catDomain , id ) . c_str ( ) ;
u8 numIdCats = strlen ( idCats ) ;
- Categories update.
- now you can have as many categories as you want.
- copied the idea of selected, hidden, and required categories from USB Loader GX. Thanks Cyan. Checkmark = selected, X = Hidden, and + = Required.
- redid categories.ini layout and renamed it categories_v4.ini so you can copy and paste settings from the old one to the new one. Each view (USB,DML,EMU,NAND,HOMEBREW) has it's own numcategories, category names, and category settings. All games are now seperated based on the view. Don't forget to add 1 to numcategories for the show All mode.
- Replaced All checkbox with CLEAR button which clears all checkboxes so no category is selected and all games will be shown.
- Added features to the Game Selected Categories Menu. Now the title is the title of the current game. You can now press plus(+) and minus(-) on wiimote to go to the next or previous games without going back to previous screen making it easier to setup categories for your games.
- note: all changes will not be saved in categories_v4.ini unless you exit wiiflow or launch a game.
2012-08-31 19:51:49 +02:00
bool inaCat = false ;
bool inHiddenCat = false ;
int reqMatch = 0 ;
2012-09-13 23:11:41 +02:00
if ( numIdCats ! = 0 )
2012-03-26 16:29:57 +02:00
{
2012-09-13 23:11:41 +02:00
for ( u8 j = 0 ; j < numIdCats ; + + j )
- Categories update.
- now you can have as many categories as you want.
- copied the idea of selected, hidden, and required categories from USB Loader GX. Thanks Cyan. Checkmark = selected, X = Hidden, and + = Required.
- redid categories.ini layout and renamed it categories_v4.ini so you can copy and paste settings from the old one to the new one. Each view (USB,DML,EMU,NAND,HOMEBREW) has it's own numcategories, category names, and category settings. All games are now seperated based on the view. Don't forget to add 1 to numcategories for the show All mode.
- Replaced All checkbox with CLEAR button which clears all checkboxes so no category is selected and all games will be shown.
- Added features to the Game Selected Categories Menu. Now the title is the title of the current game. You can now press plus(+) and minus(-) on wiimote to go to the next or previous games without going back to previous screen making it easier to setup categories for your games.
- note: all changes will not be saved in categories_v4.ini unless you exit wiiflow or launch a game.
2012-08-31 19:51:49 +02:00
{
2012-09-13 23:11:41 +02:00
int k = ( static_cast < int > ( idCats [ j ] ) ) - 32 ;
if ( k < = 0 )
continue ;
bool match = false ;
if ( numReqCats ! = 0 )
{
for ( u8 l = 0 ; l < numReqCats ; + + l )
{
if ( k = = ( static_cast < int > ( requiredCats [ l ] ) - 32 ) )
{
match = true ;
reqMatch + + ;
inaCat = true ;
}
}
}
if ( match )
continue ;
if ( numSelCats ! = 0 )
{
for ( u8 l = 0 ; l < numSelCats ; + + l )
{
if ( k = = ( static_cast < int > ( selectedCats [ l ] ) - 32 ) )
{
match = true ;
inaCat = true ;
}
}
}
if ( match )
continue ;
if ( numHidCats ! = 0 )
{
for ( u8 l = 0 ; l < numHidCats ; + + l )
{
if ( k = = ( static_cast < int > ( hiddenCats [ l ] ) - 32 ) )
inHiddenCat = true ;
}
}
- Categories update.
- now you can have as many categories as you want.
- copied the idea of selected, hidden, and required categories from USB Loader GX. Thanks Cyan. Checkmark = selected, X = Hidden, and + = Required.
- redid categories.ini layout and renamed it categories_v4.ini so you can copy and paste settings from the old one to the new one. Each view (USB,DML,EMU,NAND,HOMEBREW) has it's own numcategories, category names, and category settings. All games are now seperated based on the view. Don't forget to add 1 to numcategories for the show All mode.
- Replaced All checkbox with CLEAR button which clears all checkboxes so no category is selected and all games will be shown.
- Added features to the Game Selected Categories Menu. Now the title is the title of the current game. You can now press plus(+) and minus(-) on wiimote to go to the next or previous games without going back to previous screen making it easier to setup categories for your games.
- note: all changes will not be saved in categories_v4.ini unless you exit wiiflow or launch a game.
2012-08-31 19:51:49 +02:00
}
}
//continue; means don't add game to list (don't show)
if ( inHiddenCat )
continue ;
2012-09-13 23:11:41 +02:00
if ( numReqCats ! = reqMatch )
- Categories update.
- now you can have as many categories as you want.
- copied the idea of selected, hidden, and required categories from USB Loader GX. Thanks Cyan. Checkmark = selected, X = Hidden, and + = Required.
- redid categories.ini layout and renamed it categories_v4.ini so you can copy and paste settings from the old one to the new one. Each view (USB,DML,EMU,NAND,HOMEBREW) has it's own numcategories, category names, and category settings. All games are now seperated based on the view. Don't forget to add 1 to numcategories for the show All mode.
- Replaced All checkbox with CLEAR button which clears all checkboxes so no category is selected and all games will be shown.
- Added features to the Game Selected Categories Menu. Now the title is the title of the current game. You can now press plus(+) and minus(-) on wiimote to go to the next or previous games without going back to previous screen making it easier to setup categories for your games.
- note: all changes will not be saved in categories_v4.ini unless you exit wiiflow or launch a game.
2012-08-31 19:51:49 +02:00
continue ;
if ( ! inaCat )
{
2012-09-13 23:11:41 +02:00
if ( numHidCats = = 0 )
2012-05-16 18:21:03 +02:00
continue ;
2012-09-13 23:11:41 +02:00
else if ( numSelCats > 0 )
2013-03-27 23:46:18 +01:00
continue ;
2012-03-26 16:29:57 +02:00
}
2012-01-21 21:57:41 +01:00
}
int playcount = m_gcfg1 . getInt ( " PLAYCOUNT " , id , 0 ) ;
unsigned int lastPlayed = m_gcfg1 . getUInt ( " LASTPLAYED " , id , 0 ) ;
2012-05-14 07:37:10 +02:00
if ( dumpGameLst )
2012-11-03 20:16:03 +01:00
dump . setWString ( domain , id , element - > title ) ;
2013-03-28 14:02:50 +01:00
if ( element - > type = = TYPE_PLUGIN & & EnabledPlugins . size ( ) > 0 )
2012-04-26 20:43:05 +02:00
{
2013-03-28 14:02:50 +01:00
for ( u8 j = 0 ; j < EnabledPlugins . size ( ) ; j + + )
2012-05-05 22:07:54 +02:00
{
2013-03-28 14:02:50 +01:00
if ( EnabledPlugins . at ( j ) = = true & & element - > settings [ 0 ] = = m_plugin . getPluginMagic ( j ) )
2012-05-05 22:07:54 +02:00
{
2013-03-28 14:02:50 +01:00
CoverFlow . addItem ( & ( * element ) , playcount , lastPlayed ) ;
break ;
2012-05-05 22:07:54 +02:00
}
}
2012-04-26 20:43:05 +02:00
}
2012-06-14 22:59:18 +02:00
else
2013-03-28 14:02:50 +01:00
CoverFlow . addItem ( & ( * element ) , playcount , lastPlayed ) ;
2012-01-21 21:57:41 +01:00
}
}
m_gcfg1 . unload ( ) ;
2016-04-02 18:47:18 +02:00
if ( dumpGameLst )
2012-01-21 21:57:41 +01:00
{
2012-05-14 07:37:10 +02:00
dump . save ( true ) ;
2012-01-21 21:57:41 +01:00
m_cfg . setBool ( domain , " dump_list " , false ) ;
}
2012-11-11 19:28:03 +01:00
CoverFlow . setBoxMode ( m_cfg . getBool ( " GENERAL " , " box_mode " , true ) ) ;
CoverFlow . setCompression ( m_cfg . getBool ( " GENERAL " , " allow_texture_compression " , true ) ) ;
CoverFlow . setBufferSize ( m_cfg . getInt ( " GENERAL " , " cover_buffer " , 20 ) ) ;
CoverFlow . setSorting ( ( Sorting ) m_cfg . getInt ( domain , " sort " , 0 ) ) ;
CoverFlow . setHQcover ( m_cfg . getBool ( " GENERAL " , " cover_use_hq " , false ) ) ;
2013-11-19 16:27:52 +01:00
CoverFlow . start ( m_imgsDir ) ;
2016-04-03 02:51:40 +02:00
2012-12-28 15:19:40 +01:00
if ( ! CoverFlow . empty ( ) )
{
2016-05-19 01:15:19 +02:00
bool path = m_sourceflow | | m_current_view = = COVERFLOW_PLUGIN | | m_current_view = = COVERFLOW_HOMEBREW ;
if ( m_current_view = = COVERFLOW_MAX | | ! CoverFlow . findId ( m_cfg . getString ( domain , " current_item " ) . c_str ( ) , true , path ) )
2012-12-28 15:19:40 +01:00
CoverFlow . defaultLoad ( ) ;
CoverFlow . startCoverLoader ( ) ;
}
2012-01-21 21:57:41 +01:00
}
2012-09-09 20:35:15 +02:00
void CMenu : : _mainLoopCommon ( bool withCF , bool adjusting )
2012-01-21 21:57:41 +01:00
{
2012-06-01 08:43:37 +02:00
if ( withCF )
2012-11-11 19:28:03 +01:00
CoverFlow . tick ( ) ;
2012-01-21 21:57:41 +01:00
m_btnMgr . tick ( ) ;
m_fa . tick ( ) ;
2012-11-11 19:28:03 +01:00
m_fa . hideCover ( ) ? CoverFlow . hideCover ( ) : CoverFlow . showCover ( ) ;
CoverFlow . setFanartPlaying ( m_fa . isLoaded ( ) ) ;
2016-04-30 16:19:30 +02:00
CoverFlow . setFanartTextColor ( m_fa . getTextColor ( m_coverflow . getColor ( " _COVERFLOW " , " font_color " , CColor ( 0xFFFFFFFF ) ) ) ) ;
2012-01-21 21:57:41 +01:00
2012-11-11 19:28:03 +01:00
m_vid . prepare ( ) ;
2012-11-16 23:00:20 +01:00
m_vid . setup2DProjection ( false , true ) ;
2012-01-21 21:57:41 +01:00
_updateBg ( ) ;
2012-11-11 19:28:03 +01:00
if ( CoverFlow . getRenderTex ( ) )
CoverFlow . RenderTex ( ) ;
2012-11-29 21:30:05 +01:00
if ( withCF & & m_lqBg ! = NULL )
2012-11-11 19:28:03 +01:00
CoverFlow . makeEffectTexture ( m_lqBg ) ;
2012-06-01 08:43:37 +02:00
if ( withCF & & m_aa > 0 )
2012-01-21 21:57:41 +01:00
{
m_vid . setAA ( m_aa , true ) ;
2012-06-01 08:43:37 +02:00
for ( int i = 0 ; i < m_aa ; + + i )
2012-01-21 21:57:41 +01:00
{
m_vid . prepareAAPass ( i ) ;
m_vid . setup2DProjection ( false , true ) ;
_drawBg ( ) ;
m_fa . draw ( false ) ;
2012-11-11 19:28:03 +01:00
CoverFlow . draw ( ) ;
2012-01-21 21:57:41 +01:00
m_vid . setup2DProjection ( false , true ) ;
2012-11-11 19:28:03 +01:00
CoverFlow . drawEffect ( ) ;
2012-10-13 18:57:03 +02:00
if ( ! m_banner . GetSelectedGame ( ) )
2012-11-11 19:28:03 +01:00
CoverFlow . drawText ( adjusting ) ;
2012-01-21 21:57:41 +01:00
m_vid . renderAAPass ( i ) ;
}
m_vid . setup2DProjection ( ) ;
m_vid . drawAAScene ( ) ;
}
else
{
2012-11-16 23:00:20 +01:00
m_vid . setup2DProjection ( ) ;
2012-01-21 21:57:41 +01:00
_drawBg ( ) ;
m_fa . draw ( false ) ;
2012-06-01 08:43:37 +02:00
if ( withCF )
2012-01-21 21:57:41 +01:00
{
2012-11-11 19:28:03 +01:00
CoverFlow . draw ( ) ;
2012-01-21 21:57:41 +01:00
m_vid . setup2DProjection ( ) ;
2012-11-11 19:28:03 +01:00
CoverFlow . drawEffect ( ) ;
2012-10-13 18:57:03 +02:00
if ( ! m_banner . GetSelectedGame ( ) )
2012-11-11 19:28:03 +01:00
CoverFlow . drawText ( adjusting ) ;
2012-01-21 21:57:41 +01:00
}
}
2014-03-18 03:39:42 +01:00
if ( m_gameSelected )
{
if ( m_fa . isLoaded ( ) )
m_fa . draw ( ) ;
else if ( m_video_playing )
{
if ( movie . Frame ! = NULL )
{
DrawTexturePos ( movie . Frame ) ;
movie . Frame - > thread = false ;
}
}
else if ( m_banner . GetSelectedGame ( ) & & ( ! m_banner . GetInGameSettings ( ) | | ( m_banner . GetInGameSettings ( ) & & m_bnr_settings ) ) )
m_banner . Draw ( ) ;
}
2012-01-21 21:57:41 +01:00
m_btnMgr . draw ( ) ;
ScanInput ( ) ;
2012-07-26 00:12:17 +02:00
if ( ! m_vid . showingWaitMessage ( ) )
2013-09-15 23:22:19 +02:00
{
2013-10-03 13:50:34 +02:00
if ( ! m_cfg . getBool ( " GENERAL " , " screensaver_disabled " , false ) )
m_vid . screensaver ( NoInputTime ( ) , m_cfg . getInt ( " GENERAL " , " screensaver_idle_seconds " , 60 ) ) ;
2012-07-26 00:12:17 +02:00
m_vid . render ( ) ;
2013-09-15 23:22:19 +02:00
}
2012-09-09 20:35:15 +02:00
if ( Sys_Exiting ( ) )
exitHandler ( BUTTON_CALLBACK ) ;
2012-06-01 08:43:37 +02:00
2012-11-04 15:13:42 +01:00
if ( withCF & & m_gameSelected & & m_gamesound_changed & & ! m_soundThrdBusy & & ! m_gameSound . IsPlaying ( ) & & MusicPlayer . GetVolume ( ) = = 0 )
2012-01-21 21:57:41 +01:00
{
2012-04-27 21:05:38 +02:00
CheckGameSoundThread ( ) ;
2012-08-16 00:33:54 +02:00
m_gameSound . Play ( m_bnrSndVol ) ;
2012-01-21 21:57:41 +01:00
m_gamesound_changed = false ;
}
2012-05-18 20:13:49 +02:00
else if ( ! m_gameSelected )
2012-08-16 00:33:54 +02:00
m_gameSound . Stop ( ) ;
2012-01-21 21:57:41 +01:00
2012-09-22 15:47:52 +02:00
MusicPlayer . Tick ( m_video_playing | | ( m_gameSelected & &
2012-08-16 00:33:54 +02:00
m_gameSound . IsLoaded ( ) ) | | m_gameSound . IsPlaying ( ) ) ;
2012-06-01 08:43:37 +02:00
2012-09-29 13:41:47 +02:00
if ( MusicPlayer . SongChanged ( ) & & m_music_info )
2012-09-16 15:41:31 +02:00
{
2012-09-22 15:47:52 +02:00
m_btnMgr . setText ( m_mainLblCurMusic , MusicPlayer . GetFileName ( ) , true ) ;
2012-09-16 15:41:31 +02:00
m_btnMgr . show ( m_mainLblCurMusic ) ;
2012-09-22 15:47:52 +02:00
MusicPlayer . DisplayTime = time ( NULL ) ;
2012-09-16 15:41:31 +02:00
}
2012-09-22 15:47:52 +02:00
else if ( MusicPlayer . DisplayTime > 0 & & time ( NULL ) - MusicPlayer . DisplayTime > 3 )
2012-09-16 15:41:31 +02:00
{
2012-09-22 15:47:52 +02:00
MusicPlayer . DisplayTime = 0 ;
2012-09-16 15:41:31 +02:00
m_btnMgr . hide ( m_mainLblCurMusic ) ;
2013-02-23 18:41:26 +01:00
if ( MusicPlayer . OneSong ) m_music_info = false ;
2012-09-16 15:41:31 +02:00
}
2012-01-21 21:57:41 +01:00
//Take Screenshot
2013-03-31 01:57:42 +01:00
if ( WBTN_Z_PRESSED | | GBTN_Z_PRESSED )
2012-01-21 21:57:41 +01:00
{
time_t rawtime ;
2012-06-01 08:43:37 +02:00
struct tm * timeinfo ;
2012-01-21 21:57:41 +01:00
char buffer [ 80 ] ;
time ( & rawtime ) ;
timeinfo = localtime ( & rawtime ) ;
strftime ( buffer , 80 , " %b-%d-20%y-%Hh%Mm%Ss.png " , timeinfo ) ;
gprintf ( " Screenshot taken and saved to: %s/%s \n " , m_screenshotDir . c_str ( ) , buffer ) ;
2012-05-04 14:30:43 +02:00
m_vid . TakeScreenshot ( fmt ( " %s/%s " , m_screenshotDir . c_str ( ) , buffer ) ) ;
2012-11-03 20:16:03 +01:00
if ( theme . cameraSound ! = NULL )
theme . cameraSound - > Play ( 255 ) ;
2012-01-21 21:57:41 +01:00
}
2012-06-01 08:43:37 +02:00
# ifdef SHOWMEM
2013-08-31 21:53:19 +02:00
m_btnMgr . setText ( m_mem1FreeSize , wfmt ( L " Mem1 lo Free:%u, Mem1 Free:%u, Mem2 Free:%u " ,
MEM1_lo_freesize ( ) , MEM1_freesize ( ) , MEM2_freesize ( ) ) , true ) ;
2012-06-01 08:43:37 +02:00
# endif
# ifdef SHOWMEMGECKO
mem1 = MEM1_freesize ( ) ;
mem2 = MEM2_freesize ( ) ;
if ( mem1 ! = mem1old )
{
mem1old = mem1 ;
gprintf ( " Mem1 Free: %u \n " , mem1 ) ;
}
if ( mem2 ! = mem2old )
{
mem2old = mem2 ;
gprintf ( " Mem2 Free: %u \n " , mem2 ) ;
2014-03-18 03:39:42 +01:00
}
2012-06-01 08:43:37 +02:00
# endif
2012-01-21 21:57:41 +01:00
}
2016-04-11 22:29:09 +02:00
void CMenu : : _setBg ( const TexData & bgTex , const TexData & bglqTex )
2012-01-21 21:57:41 +01:00
{
2012-11-29 21:30:05 +01:00
/* Not setting same bg again */
2016-04-11 22:29:09 +02:00
if ( m_nextBg = = & bgTex )
2012-11-03 20:16:03 +01:00
return ;
2016-04-11 22:29:09 +02:00
m_lqBg = & bglqTex ;
2012-11-29 21:30:05 +01:00
/* before setting new next bg set previous */
if ( m_nextBg ! = NULL )
m_prevBg = m_nextBg ;
2016-04-11 22:29:09 +02:00
m_nextBg = & bgTex ;
2012-01-21 21:57:41 +01:00
m_bgCrossFade = 0xFF ;
}
void CMenu : : _updateBg ( void )
{
2012-11-29 21:30:05 +01:00
if ( m_bgCrossFade = = 0 )
return ;
m_bgCrossFade = max ( 0 , ( int ) m_bgCrossFade - 14 ) ;
2012-01-21 21:57:41 +01:00
Mtx modelViewMtx ;
GXTexObj texObj ;
GXTexObj texObj2 ;
2012-11-29 21:30:05 +01:00
/* last pass so remove previous bg */
if ( m_bgCrossFade = = 0 )
m_prevBg = NULL ;
2012-01-21 21:57:41 +01:00
GX_ClearVtxDesc ( ) ;
2012-11-29 21:30:05 +01:00
GX_SetNumTevStages ( m_prevBg = = NULL ? 1 : 2 ) ;
2012-01-21 21:57:41 +01:00
GX_SetNumChans ( 0 ) ;
GX_SetVtxDesc ( GX_VA_POS , GX_DIRECT ) ;
GX_SetVtxAttrFmt ( GX_VTXFMT0 , GX_VA_POS , GX_POS_XYZ , GX_F32 , 0 ) ;
GX_SetVtxDesc ( GX_VA_TEX0 , GX_DIRECT ) ;
GX_SetVtxAttrFmt ( GX_VTXFMT0 , GX_VA_TEX0 , GX_TEX_ST , GX_F32 , 0 ) ;
2012-11-29 21:30:05 +01:00
GX_SetNumTexGens ( m_prevBg = = NULL ? 1 : 2 ) ;
2012-01-21 21:57:41 +01:00
GX_SetTexCoordGen ( GX_TEXCOORD0 , GX_TG_MTX2x4 , GX_TG_TEX0 , GX_IDENTITY ) ;
GX_SetTexCoordGen ( GX_TEXCOORD1 , GX_TG_MTX2x4 , GX_TG_TEX0 , GX_IDENTITY ) ;
GX_SetTevKColor ( GX_KCOLOR0 , CColor ( m_bgCrossFade , 0xFF - m_bgCrossFade , 0 , 0 ) ) ;
GX_SetTevKColorSel ( GX_TEVSTAGE0 , GX_TEV_KCSEL_K0_R ) ;
GX_SetTevColorIn ( GX_TEVSTAGE0 , GX_CC_TEXC , GX_CC_ZERO , GX_CC_KONST , GX_CC_ZERO ) ;
GX_SetTevAlphaIn ( GX_TEVSTAGE0 , GX_CA_ZERO , GX_CA_ZERO , GX_CA_ZERO , GX_CA_ZERO ) ;
GX_SetTevColorOp ( GX_TEVSTAGE0 , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE , GX_TEVPREV ) ;
GX_SetTevAlphaOp ( GX_TEVSTAGE0 , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE , GX_TEVPREV ) ;
GX_SetTevOrder ( GX_TEVSTAGE0 , GX_TEXCOORD0 , GX_TEXMAP0 , GX_COLORNULL ) ;
GX_SetTevKColorSel ( GX_TEVSTAGE1 , GX_TEV_KCSEL_K0_G ) ;
GX_SetTevColorIn ( GX_TEVSTAGE1 , GX_CC_TEXC , GX_CC_ZERO , GX_CC_KONST , GX_CC_CPREV ) ;
GX_SetTevAlphaIn ( GX_TEVSTAGE1 , GX_CA_ZERO , GX_CA_ZERO , GX_CA_ZERO , GX_CA_ZERO ) ;
GX_SetTevColorOp ( GX_TEVSTAGE1 , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE , GX_TEVPREV ) ;
GX_SetTevAlphaOp ( GX_TEVSTAGE1 , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE , GX_TEVPREV ) ;
GX_SetTevOrder ( GX_TEVSTAGE1 , GX_TEXCOORD1 , GX_TEXMAP1 , GX_COLORNULL ) ;
GX_SetBlendMode ( GX_BM_NONE , GX_BL_SRCALPHA , GX_BL_INVSRCALPHA , GX_LO_CLEAR ) ;
GX_SetAlphaUpdate ( GX_FALSE ) ;
GX_SetCullMode ( GX_CULL_NONE ) ;
GX_SetZMode ( GX_DISABLE , GX_ALWAYS , GX_FALSE ) ;
guMtxIdentity ( modelViewMtx ) ;
GX_LoadPosMtxImm ( modelViewMtx , GX_PNMTX0 ) ;
2012-11-16 23:00:20 +01:00
if ( m_nextBg ! = NULL & & m_nextBg - > data ! = NULL )
{
GX_InitTexObj ( & texObj , m_nextBg - > data , m_nextBg - > width , m_nextBg - > height , m_nextBg - > format , GX_CLAMP , GX_CLAMP , GX_FALSE ) ;
GX_LoadTexObj ( & texObj , GX_TEXMAP0 ) ;
}
2012-11-29 21:30:05 +01:00
if ( m_prevBg ! = NULL & & m_prevBg - > data ! = NULL )
2012-01-21 21:57:41 +01:00
{
2012-11-29 21:30:05 +01:00
GX_InitTexObj ( & texObj2 , m_prevBg - > data , m_prevBg - > width , m_prevBg - > height , m_prevBg - > format , GX_CLAMP , GX_CLAMP , GX_FALSE ) ;
2012-01-21 21:57:41 +01:00
GX_LoadTexObj ( & texObj2 , GX_TEXMAP1 ) ;
}
GX_Begin ( GX_QUADS , GX_VTXFMT0 , 4 ) ;
GX_Position3f32 ( 0.f , 0.f , 0.f ) ;
GX_TexCoord2f32 ( 0.f , 0.f ) ;
GX_Position3f32 ( 640.f , 0.f , 0.f ) ;
GX_TexCoord2f32 ( 1.f , 0.f ) ;
GX_Position3f32 ( 640.f , 480.f , 0.f ) ;
GX_TexCoord2f32 ( 1.f , 1.f ) ;
GX_Position3f32 ( 0.f , 480.f , 0.f ) ;
GX_TexCoord2f32 ( 0.f , 1.f ) ;
GX_End ( ) ;
GX_SetNumTevStages ( 1 ) ;
m_curBg . width = 640 ;
m_curBg . height = 480 ;
m_curBg . format = GX_TF_RGBA8 ;
m_curBg . maxLOD = 0 ;
m_vid . renderToTexture ( m_curBg , true ) ;
}
void CMenu : : _drawBg ( void )
{
Mtx modelViewMtx ;
GXTexObj texObj ;
GX_ClearVtxDesc ( ) ;
GX_SetNumTevStages ( 1 ) ;
GX_SetNumChans ( 0 ) ;
GX_SetVtxDesc ( GX_VA_POS , GX_DIRECT ) ;
GX_SetVtxAttrFmt ( GX_VTXFMT0 , GX_VA_POS , GX_POS_XYZ , GX_F32 , 0 ) ;
GX_SetVtxDesc ( GX_VA_TEX0 , GX_DIRECT ) ;
GX_SetVtxAttrFmt ( GX_VTXFMT0 , GX_VA_TEX0 , GX_TEX_ST , GX_F32 , 0 ) ;
GX_SetNumTexGens ( 1 ) ;
GX_SetTevColorIn ( GX_TEVSTAGE0 , GX_CC_ZERO , GX_CC_ZERO , GX_CC_ZERO , GX_CC_TEXC ) ;
GX_SetTevAlphaIn ( GX_TEVSTAGE0 , GX_CA_ZERO , GX_CA_ZERO , GX_CA_ZERO , GX_CA_ZERO ) ;
GX_SetTevColorOp ( GX_TEVSTAGE0 , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE , GX_TEVPREV ) ;
GX_SetTevAlphaOp ( GX_TEVSTAGE0 , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE , GX_TEVPREV ) ;
GX_SetTexCoordGen ( GX_TEXCOORD0 , GX_TG_MTX2x4 , GX_TG_TEX0 , GX_IDENTITY ) ;
GX_SetTevOrder ( GX_TEVSTAGE0 , GX_TEXCOORD0 , GX_TEXMAP0 , GX_COLORNULL ) ;
GX_SetBlendMode ( GX_BM_NONE , GX_BL_SRCALPHA , GX_BL_INVSRCALPHA , GX_LO_CLEAR ) ;
GX_SetAlphaUpdate ( GX_FALSE ) ;
GX_SetCullMode ( GX_CULL_NONE ) ;
GX_SetZMode ( GX_DISABLE , GX_ALWAYS , GX_FALSE ) ;
guMtxIdentity ( modelViewMtx ) ;
GX_LoadPosMtxImm ( modelViewMtx , GX_PNMTX0 ) ;
2012-11-03 20:16:03 +01:00
GX_InitTexObj ( & texObj , m_curBg . data , m_curBg . width , m_curBg . height , m_curBg . format , GX_CLAMP , GX_CLAMP , GX_FALSE ) ;
2012-01-21 21:57:41 +01:00
GX_LoadTexObj ( & texObj , GX_TEXMAP0 ) ;
GX_Begin ( GX_QUADS , GX_VTXFMT0 , 4 ) ;
GX_Position3f32 ( 0.f , 0.f , 0.f ) ;
GX_TexCoord2f32 ( 0.f , 0.f ) ;
GX_Position3f32 ( 640.f , 0.f , 0.f ) ;
GX_TexCoord2f32 ( 1.f , 0.f ) ;
GX_Position3f32 ( 640.f , 480.f , 0.f ) ;
GX_TexCoord2f32 ( 1.f , 1.f ) ;
GX_Position3f32 ( 0.f , 480.f , 0.f ) ;
GX_TexCoord2f32 ( 0.f , 1.f ) ;
GX_End ( ) ;
}
void CMenu : : _updateText ( void )
{
2013-08-04 18:53:15 +02:00
_textSource ( ) ;
_textPluginSettings ( ) ;
_textCategorySettings ( ) ;
_textCheatSettings ( ) ;
_textSystem ( ) ;
2012-01-21 21:57:41 +01:00
_textMain ( ) ;
_textConfig ( ) ;
_textConfig3 ( ) ;
_textConfigScreen ( ) ;
_textConfig4 ( ) ;
_textConfigAdv ( ) ;
2013-08-04 18:53:15 +02:00
_textConfigSnd ( ) ;
2012-01-21 21:57:41 +01:00
_textGame ( ) ;
2013-08-04 18:53:15 +02:00
_textDownload ( ) ;
2012-01-21 21:57:41 +01:00
_textCode ( ) ;
_textWBFS ( ) ;
_textGameSettings ( ) ;
2013-08-08 20:21:11 +02:00
_textLangSettings ( ) ;
2013-08-04 18:53:15 +02:00
_textNandEmu ( ) ;
_textHome ( ) ;
_textExitTo ( ) ;
_textBoot ( ) ;
_textCoverBanner ( ) ;
_textExplorer ( ) ;
_textWad ( ) ;
2013-09-06 01:52:21 +02:00
_textFTP ( ) ;
2012-01-21 21:57:41 +01:00
}
const wstringEx CMenu : : _fmt ( const char * key , const wchar_t * def )
{
wstringEx ws = m_loc . getWString ( m_curLanguage , key , def ) ;
if ( checkFmt ( def , ws ) ) return ws ;
return def ;
}
bool CMenu : : _loadChannelList ( void )
{
2013-08-13 15:12:40 +02:00
m_gameList . clear ( ) ;
2016-04-21 02:05:28 +02:00
string emuPath ; //set via _FindEmuPart and used throughout wiiflow code
string cacheDir ; //left empty for real nand and not used
int emuPartition = - 1 ; //left at -1 for real nand
2016-04-06 00:42:32 +02:00
NANDemuView = ( neek2o ( ) | | m_cfg . getBool ( CHANNEL_DOMAIN , " emu_nand " , false ) ) ;
2012-12-22 17:47:02 +01:00
if ( NANDemuView )
2012-09-10 00:38:42 +02:00
{
2016-04-21 02:05:28 +02:00
emuPartition = _FindEmuPart ( emuPath , false ) ; //check if exist & has sysconf, settings.txt, & RFL_DB.dat
2016-04-25 02:04:38 +02:00
//if(emuPartition < 0)
//emuPartition = _FindEmuPart(emuPath, true);//check if exist without those files
2012-09-10 00:38:42 +02:00
if ( emuPartition < 0 )
2016-04-21 02:05:28 +02:00
return false ; // emu nand not found - menu_main will ask user to extract nand, disable emunand, or change partition
/* copy real NAND sysconf, settings.txt, & RFL_DB.dat if you want to, they are replaced if they already exist */
NandHandle . PreNandCfg ( m_cfg . getBool ( CHANNEL_DOMAIN , " real_nand_miis " , false ) ,
m_cfg . getBool ( CHANNEL_DOMAIN , " real_nand_config " , false ) ) ;
2012-12-22 17:47:02 +01:00
currentPartition = emuPartition ;
2012-10-21 17:28:00 +02:00
cacheDir = fmt ( " %s/%s_channels.db " , m_listCacheDir . c_str ( ) , DeviceName [ currentPartition ] ) ;
2012-12-22 17:47:02 +01:00
}
2016-04-21 02:05:28 +02:00
bool updateCache = m_cfg . getBool ( CHANNEL_DOMAIN , " update_cache " ) ; //real nand doesn't update because cacheDir is left empty
2016-04-06 00:42:32 +02:00
/* CreateList checks if cacheDir is empty if so then doesn't update/create cache .db file */
2012-10-21 17:28:00 +02:00
vector < string > NullVector ;
2013-01-15 14:54:33 +01:00
m_gameList . CreateList ( COVERFLOW_CHANNEL , currentPartition , std : : string ( ) ,
2012-10-21 17:28:00 +02:00
NullVector , cacheDir , updateCache ) ;
2013-01-15 14:54:33 +01:00
m_cfg . remove ( CHANNEL_DOMAIN , " update_cache " ) ;
return true ;
2012-01-21 21:57:41 +01:00
}
bool CMenu : : _loadList ( void )
{
2012-11-11 19:28:03 +01:00
CoverFlow . clear ( ) ;
2013-01-15 14:54:33 +01:00
m_gameList . clear ( ) ;
2013-08-13 15:12:40 +02:00
vector < dir_discHdr > combinedList ;
2012-12-22 17:47:02 +01:00
NANDemuView = false ;
2013-01-15 14:54:33 +01:00
gprintf ( " Creating Gamelist \n " ) ;
2012-01-30 00:11:43 +01:00
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
if ( m_current_view = = COVERFLOW_PLUGIN | | ( m_combined_view & & m_cfg . getBool ( PLUGIN_DOMAIN , " source " ) ) )
2013-01-15 14:54:33 +01:00
{
2013-04-17 00:25:56 +02:00
m_current_view = COVERFLOW_PLUGIN ;
2016-04-03 02:51:40 +02:00
_loadPluginList ( ) ;
2013-08-13 15:12:40 +02:00
if ( m_combined_view )
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
combinedList . push_back ( * tmp_itr ) ;
2013-01-15 14:54:33 +01:00
}
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
if ( m_current_view = = COVERFLOW_WII | | ( m_combined_view & & m_cfg . getBool ( WII_DOMAIN , " source " ) ) )
2013-06-13 22:25:07 +02:00
{
2016-04-02 18:00:47 +02:00
m_current_view = COVERFLOW_WII ;
2016-04-03 02:51:40 +02:00
_loadWiiList ( ) ;
2013-08-13 15:12:40 +02:00
if ( m_combined_view )
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
combinedList . push_back ( * tmp_itr ) ;
2013-06-13 22:25:07 +02:00
}
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
if ( m_current_view = = COVERFLOW_CHANNEL | | ( m_combined_view & & m_cfg . getBool ( CHANNEL_DOMAIN , " source " ) ) )
2013-01-15 14:54:33 +01:00
{
m_current_view = COVERFLOW_CHANNEL ;
_loadChannelList ( ) ;
2013-08-13 15:12:40 +02:00
if ( m_combined_view )
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
combinedList . push_back ( * tmp_itr ) ;
2013-01-15 14:54:33 +01:00
}
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
if ( m_current_view = = COVERFLOW_GAMECUBE | | ( m_combined_view & & m_cfg . getBool ( GC_DOMAIN , " source " ) ) )
2013-01-15 14:54:33 +01:00
{
2016-04-02 18:00:47 +02:00
m_current_view = COVERFLOW_GAMECUBE ;
2016-04-03 02:51:40 +02:00
_loadGamecubeList ( ) ;
2013-08-13 15:12:40 +02:00
if ( m_combined_view )
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
combinedList . push_back ( * tmp_itr ) ;
2013-01-15 14:54:33 +01:00
}
- PHASE 2 (finally!)
- New Coverflow theme format. no more emuflow, coverflow, brewflow. now we have coverflow, shortflow, sideflow, and smallflow.
- coverflow is the normal coverflow.
- shortflow is automatically used for plugins if all selected plugins require a short CD style cover such as GB, GBC, GBA, and playstation. if there's more let me know and i can add them.
- sideflow is automatically used for plugins if all selected plugins require a cover on its side such as SNES and Nintendo 64.
- smallflow is used if smallbox is set for homebrew and sourceflow.
- no more need for emuflow= with a source btn in the source menu. it is done automatically now using the plugins magic#
- each flow has its own number of modes/layouts. so now coveflow can have 8, smallfow 1, sideflow, 6, and shortflow 4 or whatever you want.
- adjust coverflow works with no problems. just choose the view first before entering the adjust coverflow menu.
- other minor code changes here and there.
- remember themes are now in themes_lite and the coverflow part is seperated and put in the coverflows folder with the same name as the theme or you can use a default coverflow named default.ini for all themes.
2016-05-11 19:58:36 +02:00
if ( m_current_view = = COVERFLOW_HOMEBREW | | ( m_combined_view & & m_cfg . getBool ( HOMEBREW_DOMAIN , " source " ) ) )
2013-01-15 14:54:33 +01:00
{
m_current_view = COVERFLOW_HOMEBREW ;
2013-04-17 00:25:56 +02:00
_loadHomebrewList ( ) ;
2013-08-13 15:12:40 +02:00
if ( m_combined_view )
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
combinedList . push_back ( * tmp_itr ) ;
2012-01-21 21:57:41 +01:00
}
2013-08-13 15:12:40 +02:00
if ( m_combined_view )
{
2013-01-15 14:54:33 +01:00
m_current_view = COVERFLOW_MAX ;
2013-08-13 15:12:40 +02:00
m_gameList . clear ( ) ;
for ( vector < dir_discHdr > : : iterator tmp_itr = combinedList . begin ( ) ; tmp_itr ! = combinedList . end ( ) ; tmp_itr + + )
m_gameList . push_back ( * tmp_itr ) ;
combinedList . clear ( ) ;
}
2012-01-21 21:57:41 +01:00
2013-03-28 14:02:50 +01:00
gprintf ( " Games found: %i \n " , m_gameList . size ( ) ) ;
2013-01-15 14:54:33 +01:00
return m_gameList . size ( ) > 0 ? true : false ;
2012-01-21 21:57:41 +01:00
}
2016-04-03 02:51:40 +02:00
bool CMenu : : _loadWiiList ( void )
2012-01-21 21:57:41 +01:00
{
2012-11-04 20:22:02 +01:00
currentPartition = m_cfg . getInt ( WII_DOMAIN , " partition " , USB1 ) ;
2012-09-22 15:47:52 +02:00
if ( ! DeviceHandle . IsInserted ( currentPartition ) )
2012-01-21 21:57:41 +01:00
return false ;
2013-08-13 15:12:40 +02:00
m_gameList . clear ( ) ;
2012-09-22 15:47:52 +02:00
DeviceHandle . OpenWBFS ( currentPartition ) ;
2013-08-06 23:31:25 +02:00
string gameDir ( fmt ( wii_games_dir , DeviceName [ currentPartition ] ) ) ;
2012-10-04 17:25:35 +02:00
string cacheDir ( fmt ( " %s/%s_wii.db " , m_listCacheDir . c_str ( ) , DeviceName [ currentPartition ] ) ) ;
2012-11-04 20:22:02 +01:00
bool updateCache = m_cfg . getBool ( WII_DOMAIN , " update_cache " ) ;
2016-04-02 18:00:47 +02:00
m_gameList . CreateList ( COVERFLOW_WII , currentPartition , gameDir , stringToVector ( " .wbfs|.iso " , ' | ' ) , cacheDir , updateCache ) ;
2012-09-22 15:47:52 +02:00
WBFS_Close ( ) ;
2013-01-15 14:54:33 +01:00
m_cfg . remove ( WII_DOMAIN , " update_cache " ) ;
return true ;
2012-01-21 21:57:41 +01:00
}
bool CMenu : : _loadHomebrewList ( )
{
2012-11-04 20:22:02 +01:00
currentPartition = m_cfg . getInt ( HOMEBREW_DOMAIN , " partition " , SD ) ;
2012-09-22 15:47:52 +02:00
if ( ! DeviceHandle . IsInserted ( currentPartition ) )
2012-01-21 21:57:41 +01:00
return false ;
2013-08-13 15:12:40 +02:00
m_gameList . clear ( ) ;
2012-10-03 23:34:37 +02:00
string gameDir ( fmt ( HOMEBREW_DIR , DeviceName [ currentPartition ] ) ) ;
2012-10-04 17:25:35 +02:00
string cacheDir ( fmt ( " %s/%s_homebrew.db " , m_listCacheDir . c_str ( ) , DeviceName [ currentPartition ] ) ) ;
2012-11-04 20:22:02 +01:00
bool updateCache = m_cfg . getBool ( HOMEBREW_DOMAIN , " update_cache " ) ;
2013-01-15 14:54:33 +01:00
m_gameList . CreateList ( COVERFLOW_HOMEBREW , currentPartition , gameDir , stringToVector ( " .dol|.elf " , ' | ' ) , cacheDir , updateCache ) ;
m_cfg . remove ( HOMEBREW_DOMAIN , " update_cache " ) ;
return true ;
2012-01-21 21:57:41 +01:00
}
2016-04-03 02:51:40 +02:00
bool CMenu : : _loadGamecubeList ( )
2012-01-21 22:15:45 +01:00
{
2012-11-04 20:22:02 +01:00
currentPartition = m_cfg . getInt ( GC_DOMAIN , " partition " , USB1 ) ;
2012-09-22 15:47:52 +02:00
if ( ! DeviceHandle . IsInserted ( currentPartition ) )
2012-01-21 22:15:45 +01:00
return false ;
2013-08-13 15:12:40 +02:00
m_gameList . clear ( ) ;
2016-04-03 02:31:02 +02:00
string gameDir ( fmt ( gc_games_dir , DeviceName [ currentPartition ] ) ) ;
2012-10-04 17:25:35 +02:00
string cacheDir ( fmt ( " %s/%s_gamecube.db " , m_listCacheDir . c_str ( ) , DeviceName [ currentPartition ] ) ) ;
2012-11-04 20:22:02 +01:00
bool updateCache = m_cfg . getBool ( GC_DOMAIN , " update_cache " ) ;
2016-04-03 03:12:11 +02:00
m_gameList . CreateList ( COVERFLOW_GAMECUBE , currentPartition , gameDir , stringToVector ( " .iso|root " , ' | ' ) , cacheDir , updateCache ) ;
2013-01-15 14:54:33 +01:00
m_cfg . remove ( GC_DOMAIN , " update_cache " ) ;
return true ;
2012-01-21 22:15:45 +01:00
}
2016-04-03 02:51:40 +02:00
bool CMenu : : _loadPluginList ( )
2012-04-08 17:54:34 +02:00
{
2012-11-04 20:22:02 +01:00
currentPartition = m_cfg . getInt ( PLUGIN_DOMAIN , " partition " , SD ) ;
2012-09-22 15:47:52 +02:00
if ( ! DeviceHandle . IsInserted ( currentPartition ) )
2012-04-08 17:54:34 +02:00
return false ;
2013-01-15 14:54:33 +01:00
2016-05-19 01:15:19 +02:00
bool addGamecube = false ;
bool addWii = false ;
bool addChannel = false ;
2012-11-04 20:22:02 +01:00
bool updateCache = m_cfg . getBool ( PLUGIN_DOMAIN , " update_cache " ) ;
2016-04-03 02:51:40 +02:00
vector < dir_discHdr > pluginList ;
2012-04-10 15:37:57 +02:00
2016-04-03 02:51:40 +02:00
for ( u8 i = 0 ; i < m_numPlugins ; + + i )
2012-04-10 01:19:08 +02:00
{
2013-01-15 14:54:33 +01:00
m_gameList . clear ( ) ;
2016-04-03 02:51:40 +02:00
u32 Magic = m_plugin . getPluginMagic ( i ) ;
strncpy ( m_plugin . PluginMagicWord , fmt ( " %08x " , Magic ) , 8 ) ;
if ( ! m_cfg . getBool ( PLUGIN_ENABLED , m_plugin . PluginMagicWord , true ) )
2012-04-10 01:19:08 +02:00
continue ;
2016-04-03 02:51:40 +02:00
string romDir = m_plugin . GetRomDir ( i ) ;
if ( romDir . find ( " scummvm.ini " ) = = string : : npos )
2012-04-10 01:19:08 +02:00
{
2016-05-19 01:15:19 +02:00
if ( string ( m_plugin . PluginMagicWord ) = = " 4e47434d " )
{
addGamecube = true ;
continue ;
}
if ( string ( m_plugin . PluginMagicWord ) = = " 4e574949 " )
{
addWii = true ;
continue ;
}
if ( string ( m_plugin . PluginMagicWord ) = = " 4e414e44 " )
{
addChannel = true ;
continue ;
}
2016-04-03 02:51:40 +02:00
string gameDir ( fmt ( " %s:/%s " , DeviceName [ currentPartition ] , m_plugin . GetRomDir ( i ) ) ) ;
string cacheDir ( fmt ( " %s/%s_%s.db " , m_listCacheDir . c_str ( ) , DeviceName [ currentPartition ] , m_plugin . PluginMagicWord ) ) ;
vector < string > FileTypes = stringToVector ( m_plugin . GetFileTypes ( i ) , ' | ' ) ;
m_gameList . Color = m_plugin . GetCaseColor ( i ) ;
m_gameList . Magic = Magic ;
m_gameList . CreateList ( COVERFLOW_PLUGIN , currentPartition , gameDir , FileTypes , cacheDir , updateCache ) ;
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
pluginList . push_back ( * tmp_itr ) ;
}
else
{
Config scummvm ;
vector < dir_discHdr > scummvmList ;
scummvm . load ( fmt ( " %s/%s " , m_pluginsDir . c_str ( ) , " scummvm.ini " ) ) ;
scummvmList = m_plugin . ParseScummvmINI ( scummvm , DeviceName [ currentPartition ] , Magic ) ;
for ( vector < dir_discHdr > : : iterator tmp_itr = scummvmList . begin ( ) ; tmp_itr ! = scummvmList . end ( ) ; tmp_itr + + )
pluginList . push_back ( * tmp_itr ) ;
2012-04-10 01:19:08 +02:00
}
}
2012-04-10 15:37:57 +02:00
m_gameList . clear ( ) ;
2016-05-19 01:15:19 +02:00
if ( addGamecube )
{
m_current_view = COVERFLOW_GAMECUBE ;
_loadGamecubeList ( ) ;
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
pluginList . push_back ( * tmp_itr ) ;
}
if ( addWii )
{
m_current_view = COVERFLOW_WII ;
_loadWiiList ( ) ;
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
pluginList . push_back ( * tmp_itr ) ;
}
if ( addChannel )
{
m_current_view = COVERFLOW_CHANNEL ;
_loadChannelList ( ) ;
for ( vector < dir_discHdr > : : iterator tmp_itr = m_gameList . begin ( ) ; tmp_itr ! = m_gameList . end ( ) ; tmp_itr + + )
pluginList . push_back ( * tmp_itr ) ;
}
m_current_view = COVERFLOW_PLUGIN ;
m_gameList . clear ( ) ;
2016-04-03 02:51:40 +02:00
for ( vector < dir_discHdr > : : iterator tmp_itr = pluginList . begin ( ) ; tmp_itr ! = pluginList . end ( ) ; tmp_itr + + )
2012-10-04 13:37:53 +02:00
{
tmp_itr - > index = m_gameList . size ( ) ;
2012-04-10 15:37:57 +02:00
m_gameList . push_back ( * tmp_itr ) ;
2012-10-04 13:37:53 +02:00
}
2016-04-03 02:51:40 +02:00
pluginList . clear ( ) ;
2013-01-15 14:54:33 +01:00
m_cfg . remove ( PLUGIN_DOMAIN , " update_cache " ) ;
return true ;
2012-04-08 17:54:34 +02:00
}
2012-01-21 21:57:41 +01:00
void CMenu : : _stopSounds ( void )
{
// Fade out sounds
int fade_rate = m_cfg . getInt ( " GENERAL " , " music_fade_rate " , 8 ) ;
2012-09-22 15:47:52 +02:00
if ( ! MusicPlayer . IsStopped ( ) )
2012-01-21 21:57:41 +01:00
{
2012-09-22 15:47:52 +02:00
while ( MusicPlayer . GetVolume ( ) > 0 | | m_gameSound . GetVolume ( ) > 0 )
2012-01-21 21:57:41 +01:00
{
2012-09-22 15:47:52 +02:00
MusicPlayer . Tick ( true ) ;
2012-08-16 00:33:54 +02:00
if ( m_gameSound . GetVolume ( ) > 0 )
m_gameSound . SetVolume ( m_gameSound . GetVolume ( ) < fade_rate ? 0 : m_gameSound . GetVolume ( ) - fade_rate ) ;
2012-06-14 17:27:57 +02:00
VIDEO_WaitVSync ( ) ;
2012-01-21 21:57:41 +01:00
}
}
m_btnMgr . stopSounds ( ) ;
2012-11-11 19:28:03 +01:00
CoverFlow . stopSound ( ) ;
2012-08-16 00:33:54 +02:00
m_gameSound . Stop ( ) ;
2012-01-21 21:57:41 +01:00
}
2012-11-04 00:46:21 +01:00
bool CMenu : : _loadFile ( u8 * & buffer , u32 & size , const char * path , const char * file )
2012-01-21 21:57:41 +01:00
{
2013-06-30 20:40:49 +02:00
u32 fileSize = 0 ;
u8 * fileBuf = fsop_ReadFile ( file = = NULL ? path : fmt ( " %s/%s " , path , file ) , & fileSize ) ;
if ( fileBuf = = NULL )
2012-05-13 17:13:33 +02:00
return false ;
2012-01-21 21:57:41 +01:00
2012-11-03 20:16:03 +01:00
if ( buffer ! = NULL )
free ( buffer ) ;
2012-01-21 21:57:41 +01:00
buffer = fileBuf ;
2012-11-03 20:16:03 +01:00
size = fileSize ;
2012-01-21 21:57:41 +01:00
return true ;
}
void CMenu : : _load_installed_cioses ( )
{
gprintf ( " Loading cIOS map \n " ) ;
_installed_cios [ 0 ] = 1 ;
2012-07-20 14:30:18 +02:00
for ( u8 slot = 200 ; slot < 254 ; slot + + )
2012-07-16 16:05:57 +02:00
{
2012-07-20 14:30:18 +02:00
u8 base = 1 ;
2012-08-11 14:27:38 +02:00
if ( IOS_D2X ( slot , & base ) )
2012-01-21 21:57:41 +01:00
{
2012-07-20 14:30:18 +02:00
gprintf ( " Found d2x base %u in slot %u \n " , base , slot ) ;
_installed_cios [ slot ] = base ;
}
2012-08-24 00:29:15 +02:00
else if ( CustomIOS ( IOS_GetType ( slot ) ) )
2012-07-20 14:30:18 +02:00
{
gprintf ( " Found cIOS in slot %u \n " , slot ) ;
2012-07-20 22:12:25 +02:00
_installed_cios [ slot ] = slot ;
2012-01-21 21:57:41 +01:00
}
2012-05-13 17:13:33 +02:00
}
2012-01-21 21:57:41 +01:00
}
2012-01-30 15:29:40 +01:00
void CMenu : : _hideWaitMessage ( )
2012-01-21 21:57:41 +01:00
{
2012-01-30 15:29:40 +01:00
m_vid . hideWaitMessage ( ) ;
2012-01-21 21:57:41 +01:00
}
void CMenu : : _showWaitMessage ( )
{
2012-11-03 20:16:03 +01:00
m_vid . waitMessage ( _textures ( " GENERAL " , " waitmessage " ) , m_theme . getFloat ( " GENERAL " , " waitmessage_delay " , 0.f ) ) ;
2012-01-21 21:57:41 +01:00
}
typedef struct map_entry
{
char filename [ 8 ] ;
u8 sha1 [ 20 ] ;
2013-01-01 18:42:46 +01:00
} ATTRIBUTE_PACKED map_entry_t ;
2012-01-21 21:57:41 +01:00
2012-11-12 21:12:00 +01:00
void CMenu : : loadDefaultFont ( void )
2012-01-21 21:57:41 +01:00
{
2012-11-12 21:12:00 +01:00
if ( m_base_font ! = NULL )
return ;
u32 size = 0 ;
2012-01-21 21:57:41 +01:00
bool retry = false ;
2012-11-12 21:12:00 +01:00
bool korean = ( CONF_GetLanguage ( ) = = CONF_LANG_KOREAN ) ;
char ISFS_Filename [ 32 ] ATTRIBUTE_ALIGN ( 32 ) ;
2012-05-13 17:13:33 +02:00
2012-01-21 21:57:41 +01:00
// Read content.map from ISFS
2012-11-12 21:12:00 +01:00
strcpy ( ISFS_Filename , " /shared1/content.map " ) ;
u8 * content = ISFS_GetFile ( ISFS_Filename , & size , - 1 ) ;
2012-05-13 19:25:26 +02:00
if ( content = = NULL )
return ;
2012-11-12 21:12:00 +01:00
u32 items = size / sizeof ( map_entry_t ) ;
2012-01-21 21:57:41 +01:00
//gprintf("Open content.map, size %d, items %d\n", size, items);
2012-11-12 21:12:00 +01:00
map_entry_t * cm = ( map_entry_t * ) content ;
2012-01-21 21:57:41 +01:00
2012-11-12 21:12:00 +01:00
retry :
2012-01-21 21:57:41 +01:00
bool kor_font = ( korean & & ! retry ) | | ( ! korean & & retry ) ;
2012-11-12 21:12:00 +01:00
for ( u32 i = 0 ; i < items ; i + + )
2012-01-21 21:57:41 +01:00
{
2012-11-12 21:12:00 +01:00
if ( m_base_font ! = NULL & & m_wbf1_font ! = NULL & & m_wbf2_font ! = NULL )
break ;
if ( memcmp ( cm [ i ] . sha1 , kor_font ? WIIFONT_HASH_KOR : WIIFONT_HASH , 20 ) = = 0 & & m_base_font = = NULL )
2012-01-21 21:57:41 +01:00
{
2012-11-12 21:12:00 +01:00
sprintf ( ISFS_Filename , " /shared1/%.8s.app " , cm [ i ] . filename ) ; //who cares about the few ticks more?
u8 * u8_font_archive = ISFS_GetFile ( ISFS_Filename , & size , - 1 ) ;
2012-07-03 18:26:49 +02:00
if ( u8_font_archive ! = NULL )
2012-01-21 21:57:41 +01:00
{
const u8 * font_file = u8_get_file_by_index ( u8_font_archive , 1 , & size ) ; // There is only one file in that app
//gprintf("Extracted font: %d\n", size);
2012-09-20 14:40:47 +02:00
m_base_font = ( u8 * ) MEM1_lo_alloc ( size ) ;
2012-09-07 20:13:04 +02:00
memcpy ( m_base_font , font_file , size ) ;
DCFlushRange ( m_base_font , size ) ;
m_base_font_size = size ;
2012-07-27 19:26:49 +02:00
free ( u8_font_archive ) ;
2012-01-21 21:57:41 +01:00
}
}
2012-11-12 21:12:00 +01:00
else if ( memcmp ( cm [ i ] . sha1 , WFB_HASH , 20 ) = = 0 & & m_wbf1_font = = NULL & & m_wbf2_font = = NULL )
2012-07-03 18:26:49 +02:00
{
2012-11-12 21:12:00 +01:00
sprintf ( ISFS_Filename , " /shared1/%.8s.app " , cm [ i ] . filename ) ; //who cares about the few ticks more?
u8 * u8_font_archive = ISFS_GetFile ( ISFS_Filename , & size , - 1 ) ;
2012-07-03 18:26:49 +02:00
if ( u8_font_archive ! = NULL )
{
const u8 * font_file1 = u8_get_file ( u8_font_archive , " wbf1.brfna " , & size ) ;
2012-09-07 20:13:04 +02:00
m_wbf1_font = ( u8 * ) MEM1_lo_alloc ( size ) ;
memcpy ( m_wbf1_font , font_file1 , size ) ;
DCFlushRange ( m_wbf1_font , size ) ;
2012-07-03 18:26:49 +02:00
const u8 * font_file2 = u8_get_file ( u8_font_archive , " wbf2.brfna " , & size ) ;
2012-09-07 20:13:04 +02:00
m_wbf2_font = ( u8 * ) MEM1_lo_alloc ( size ) ;
memcpy ( m_wbf2_font , font_file2 , size ) ;
DCFlushRange ( m_wbf2_font , size ) ;
2012-07-03 18:26:49 +02:00
2012-07-27 19:26:49 +02:00
free ( u8_font_archive ) ;
2012-07-03 18:26:49 +02:00
}
}
2012-01-21 21:57:41 +01:00
}
2012-11-12 21:12:00 +01:00
if ( ! retry & & m_base_font = = NULL )
2012-01-21 21:57:41 +01:00
{
retry = true ;
goto retry ;
}
2012-07-27 19:26:49 +02:00
free ( content ) ;
2012-01-21 21:57:41 +01:00
}
void CMenu : : _cleanupDefaultFont ( )
{
2012-09-07 20:13:04 +02:00
MEM1_lo_free ( m_base_font ) ;
2012-11-12 21:12:00 +01:00
m_base_font = NULL ;
2012-01-21 21:57:41 +01:00
m_base_font_size = 0 ;
2012-09-07 20:13:04 +02:00
MEM1_lo_free ( m_wbf1_font ) ;
2012-11-12 21:12:00 +01:00
m_wbf1_font = NULL ;
2012-09-07 20:13:04 +02:00
MEM1_lo_free ( m_wbf2_font ) ;
2012-11-12 21:12:00 +01:00
m_wbf2_font = NULL ;
2012-01-21 21:57:41 +01:00
}
2012-12-27 21:22:40 +01:00
const char * CMenu : : _getId ( )
2012-09-11 14:01:07 +02:00
{
2013-09-19 01:59:14 +02:00
char tmp [ MAX_FAT_PATH ] ;
memset ( tmp , 0 , MAX_FAT_PATH ) ;
2012-12-27 21:22:40 +01:00
const char * id = NULL ;
2013-01-21 00:30:28 +01:00
const dir_discHdr * hdr = CoverFlow . getHdr ( ) ;
2012-12-28 18:18:49 +01:00
if ( hdr - > type = = TYPE_HOMEBREW )
2012-12-27 21:22:40 +01:00
id = strrchr ( hdr - > path , ' / ' ) + 1 ;
2012-12-28 18:18:49 +01:00
else if ( hdr - > type = = TYPE_PLUGIN )
{
2013-09-19 01:59:14 +02:00
if ( strstr ( hdr - > path , " :/ " ) ! = NULL )
2012-12-28 18:18:49 +01:00
{
2013-09-19 01:59:14 +02:00
if ( * ( strchr ( hdr - > path , ' / ' ) + 1 ) ! = ' \0 ' )
strcat ( tmp , strchr ( hdr - > path , ' / ' ) + 1 ) ;
else
strcat ( tmp , hdr - > path ) ;
if ( strchr ( tmp , ' / ' ) ! = NULL )
* ( strchr ( tmp , ' / ' ) + 1 ) = ' \0 ' ;
2012-12-28 18:18:49 +01:00
}
strcat ( tmp , fmt ( " %ls " , hdr - > title ) ) ;
id = tmp ;
}
2012-09-11 14:01:07 +02:00
else
2013-03-28 14:02:50 +01:00
{
id = hdr - > id ;
if ( hdr - > type = = TYPE_GC_GAME & & hdr - > settings [ 0 ] = = 1 ) /* disc 2 */
{
strcat ( tmp , fmt ( " %.6s_2 " , hdr - > id ) ) ;
id = tmp ;
}
}
2012-09-11 14:01:07 +02:00
return id ;
}
2012-01-21 21:57:41 +01:00
const char * CMenu : : _domainFromView ( )
{
2013-09-12 15:04:50 +02:00
if ( m_sourceflow )
return " SOURCEFLOW " ;
2012-01-21 21:57:41 +01:00
switch ( m_current_view )
{
case COVERFLOW_CHANNEL :
2012-11-04 20:22:02 +01:00
return CHANNEL_DOMAIN ;
2012-01-21 21:57:41 +01:00
case COVERFLOW_HOMEBREW :
2012-11-04 20:22:02 +01:00
return HOMEBREW_DOMAIN ;
2016-04-02 18:00:47 +02:00
case COVERFLOW_GAMECUBE :
2012-11-04 20:22:02 +01:00
return GC_DOMAIN ;
2012-10-03 23:34:37 +02:00
case COVERFLOW_PLUGIN :
2012-11-04 20:22:02 +01:00
return PLUGIN_DOMAIN ;
2012-01-21 21:57:41 +01:00
default :
2012-11-04 20:22:02 +01:00
return WII_DOMAIN ;
2012-01-21 21:57:41 +01:00
}
return " NULL " ;
}
void CMenu : : UpdateCache ( u32 view )
{
if ( view = = COVERFLOW_MAX )
{
2016-04-02 18:00:47 +02:00
UpdateCache ( COVERFLOW_WII ) ;
2012-01-21 21:57:41 +01:00
UpdateCache ( COVERFLOW_HOMEBREW ) ;
2016-04-02 18:00:47 +02:00
UpdateCache ( COVERFLOW_GAMECUBE ) ;
2012-10-03 23:34:37 +02:00
UpdateCache ( COVERFLOW_PLUGIN ) ;
2012-01-21 21:57:41 +01:00
UpdateCache ( COVERFLOW_CHANNEL ) ;
return ;
}
2013-08-06 23:31:25 +02:00
switch ( view )
{
case COVERFLOW_CHANNEL :
m_cfg . setBool ( CHANNEL_DOMAIN , " update_cache " , true ) ;
break ;
case COVERFLOW_HOMEBREW :
m_cfg . setBool ( HOMEBREW_DOMAIN , " update_cache " , true ) ;
break ;
2016-04-02 18:00:47 +02:00
case COVERFLOW_GAMECUBE :
2013-08-06 23:31:25 +02:00
m_cfg . setBool ( GC_DOMAIN , " update_cache " , true ) ;
break ;
case COVERFLOW_PLUGIN :
m_cfg . setBool ( PLUGIN_DOMAIN , " update_cache " , true ) ;
break ;
default :
m_cfg . setBool ( WII_DOMAIN , " update_cache " , true ) ;
}
2012-01-22 05:23:45 +01:00
}
2012-01-28 09:40:19 +01:00
2012-11-01 17:39:42 +01:00
void CMenu : : RemoveCover ( const char * id )
2012-02-05 01:07:07 +01:00
{
2012-11-01 17:39:42 +01:00
const char * CoverPath = NULL ;
if ( id = = NULL )
return ;
CoverPath = fmt ( " %s/%s.png " , m_boxPicDir . c_str ( ) , id ) ;
fsop_deleteFile ( CoverPath ) ;
CoverPath = fmt ( " %s/%s.png " , m_picDir . c_str ( ) , id ) ;
fsop_deleteFile ( CoverPath ) ;
2012-12-27 21:22:40 +01:00
CoverPath = fmt ( " %s/%s.wfc " , m_cacheDir . c_str ( ) , id ) ;
2012-11-01 17:39:42 +01:00
fsop_deleteFile ( CoverPath ) ;
2012-04-26 20:43:05 +02:00
}
2012-09-05 17:52:32 +02:00
2012-11-12 21:12:00 +01:00
void CMenu : : TempLoadIOS ( int IOS )
2012-09-05 17:52:32 +02:00
{
/* Only temp reload in IOS58 mode */
2012-09-20 18:09:32 +02:00
if ( useMainIOS | | neek2o ( ) | | Sys_DolphinMode ( ) )
2012-09-05 17:52:32 +02:00
return ;
if ( IOS = = IOS_TYPE_NORMAL_IOS )
IOS = 58 ;
else if ( IOS = = 0 )
IOS = mainIOS ;
if ( CurrentIOS . Version ! = IOS )
{
loadIOS ( IOS , true ) ;
2012-12-27 21:22:40 +01:00
Sys_Init ( ) ;
2012-09-05 17:52:32 +02:00
Open_Inputs ( ) ;
for ( int chan = WPAD_MAX_WIIMOTES - 2 ; chan > = 0 ; chan - - )
WPAD_SetVRes ( chan , m_vid . width ( ) + m_cursor [ chan ] . width ( ) , m_vid . height ( ) + m_cursor [ chan ] . height ( ) ) ;
2012-12-21 20:51:22 +01:00
_netInit ( ) ;
2012-09-05 17:52:32 +02:00
}
}
2013-03-28 14:02:50 +01:00
const char * CMenu : : getBlankCoverPath ( const dir_discHdr * element )
{
const char * blankCoverKey = NULL ;
switch ( element - > type )
{
case TYPE_CHANNEL :
blankCoverKey = " channels " ;
break ;
case TYPE_HOMEBREW :
blankCoverKey = " homebrew " ;
break ;
case TYPE_GC_GAME :
blankCoverKey = " gamecube " ;
break ;
case TYPE_PLUGIN :
2016-04-03 02:51:40 +02:00
strncpy ( m_plugin . PluginMagicWord , fmt ( " %08x " , element - > settings [ 0 ] ) , 8 ) ;
blankCoverKey = m_plugin . PluginMagicWord ;
2013-03-28 14:02:50 +01:00
break ;
default :
blankCoverKey = " wii " ;
}
2013-04-04 16:20:54 +02:00
return fmt ( " %s/%s " , m_boxPicDir . c_str ( ) , m_theme . getString ( " BLANK_COVERS " , blankCoverKey , fmt ( " %s.jpg " , blankCoverKey ) ) . c_str ( ) ) ;
2013-03-28 14:02:50 +01:00
}
const char * CMenu : : getBoxPath ( const dir_discHdr * element )
{
if ( element - > type = = TYPE_PLUGIN )
{
const char * tempname = element - > path ;
if ( strchr ( element - > path , ' / ' ) ! = NULL )
tempname = strrchr ( element - > path , ' / ' ) + 1 ;
const char * coverFolder = m_plugin . GetCoverFolderName ( element - > settings [ 0 ] ) ;
if ( strlen ( coverFolder ) > 0 )
return fmt ( " %s/%s/%s.png " , m_boxPicDir . c_str ( ) , coverFolder , tempname ) ;
else
return fmt ( " %s/%s.png " , m_boxPicDir . c_str ( ) , tempname ) ;
}
else if ( element - > type = = TYPE_HOMEBREW )
return fmt ( " %s/%s.png " , m_boxPicDir . c_str ( ) , strrchr ( element - > path , ' / ' ) + 1 ) ;
2016-04-04 22:18:16 +02:00
else if ( element - > type = = TYPE_SOURCE ) //sourceflow
2013-09-12 15:04:50 +02:00
{
2013-09-13 17:38:23 +02:00
const char * m_sflowDir = m_cfg . getString ( " GENERAL " , " dir_Source " , fmt ( " %s/source_menu " , m_dataDir . c_str ( ) ) ) . c_str ( ) ;
const char * coverImg = strrchr ( element - > path , ' / ' ) + 1 ;
if ( coverImg = = NULL | | m_cfg . getBool ( " SOURCEFLOW " , " smallbox " ) )
2013-09-12 15:04:50 +02:00
return NULL ;
2013-09-13 17:38:23 +02:00
return fmt ( " %s/full_covers/%s " , m_sflowDir , coverImg ) ;
2013-09-12 15:04:50 +02:00
}
2013-03-28 14:02:50 +01:00
return fmt ( " %s/%s.png " , m_boxPicDir . c_str ( ) , element - > id ) ;
}
const char * CMenu : : getFrontPath ( const dir_discHdr * element )
{
if ( element - > type = = TYPE_PLUGIN )
{
const char * tempname = element - > path ;
if ( strchr ( element - > path , ' / ' ) ! = NULL )
tempname = strrchr ( element - > path , ' / ' ) + 1 ;
const char * coverFolder = m_plugin . GetCoverFolderName ( element - > settings [ 0 ] ) ;
if ( strlen ( coverFolder ) > 0 )
return fmt ( " %s/%s/%s.png " , m_picDir . c_str ( ) , coverFolder , tempname ) ;
else
return fmt ( " %s/%s.png " , m_picDir . c_str ( ) , tempname ) ;
}
else if ( element - > type = = TYPE_HOMEBREW )
return fmt ( " %s/icon.png " , element - > path ) ;
2016-04-04 22:18:16 +02:00
else if ( element - > type = = TYPE_SOURCE ) //sourceflow
2013-09-12 15:04:50 +02:00
{
2013-09-13 17:38:23 +02:00
const char * m_sflowDir = m_cfg . getString ( " GENERAL " , " dir_Source " , fmt ( " %s/source_menu " , m_dataDir . c_str ( ) ) ) . c_str ( ) ;
const char * coverImg = strrchr ( element - > path , ' / ' ) + 1 ;
if ( coverImg = = NULL )
return NULL ;
const char * coverPath = fmt ( " %s/front_covers/%s " , m_sflowDir , coverImg ) ;
if ( m_cfg . getBool ( " SOURCEFLOW " , " smallbox " ) | | ! fsop_FileExist ( coverPath ) )
2013-09-12 15:04:50 +02:00
{
2013-10-06 14:51:45 +02:00
coverPath = fmt ( " %s/small_covers/%s " , m_sflowDir , coverImg ) ;
2013-09-13 17:38:23 +02:00
if ( ! fsop_FileExist ( coverPath ) )
return element - > path ;
2013-09-12 15:04:50 +02:00
}
2013-09-13 17:38:23 +02:00
return coverPath ;
2013-09-12 15:04:50 +02:00
}
2013-03-28 14:02:50 +01:00
return fmt ( " %s/%s.png " , m_picDir . c_str ( ) , element - > id ) ;
}