/*---------------------------------------------------------------------------* Project: TwlIPL File: SelectCountry.c Copyright 2007 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: 2007-11-19#$ $Rev: 215 $ $Author: yosiokat $ *---------------------------------------------------------------------------*/ #include #include "misc.h" #include "MachineSetting.h" // define data------------------------------------------ #define CANCEL_BUTTON_TOP_X ( 2 * 8 ) #define CANCEL_BUTTON_TOP_Y ( 21 * 8 ) #define CANCEL_BUTTON_BOTTOM_X ( (CANCEL_BUTTON_TOP_X + 8 ) * 8 ) #define CANCEL_BUTTON_BOTTOM_Y ( (CANCEL_BUTTON_TOP_Y + 2 ) * 8 ) #define MENU_DISPLAY_SIZE 7 // スクロールバー関係 #define BAR_ZERO_X 230 #define BAR_ZERO_Y 48 #define BAR_HEIGHT_MAX 107 #define BAR_HEIGHT_MIN SQUARE_SIZE #define BAR_WIDTH SQUARE_SIZE #define BAR_BUTTON_HEIGHT SQUARE_SIZE #define BAR_BUTTON_WIDTH SQUARE_SIZE #define SQUARE_SIZE 11 #define BAR_LOOSENESS 2 #define BAR_OFFSET 2 // 表示に"■"テキストを使っているので、タッチ座標を補正する目的のOFFSET // ボタン長押しでのカーソル自動移動関係 #define START_AUTOMOVE_COUNT 30 #define AUTOMOVE_INTERVAL 5 // extern data------------------------------------------ // function's prototype declaration--------------------- // global variable ------------------------------------- // static variable ------------------------------------- static TWLCountryCode s_countryCode; // 国コード static TWLRegion s_regionCode; // リージョン static u16 s_list_start, s_list_end; static u16 s_menu_display_start; static const u16 *s_pStrCountry[MENU_DISPLAY_SIZE]; static int list_size; static int bar_height; static double dots_per_item; // const data ----------------------------------------- extern const u16 *const s_pStrCountryName[]; extern const u32 region_country_mapping[TWL_REGION_MAX]; static MenuPos s_countryPos[MENU_DISPLAY_SIZE] = { { TRUE, 4 * 8, 6 * 8 }, { TRUE, 4 * 8, 8 * 8 }, { TRUE, 4 * 8, 10 * 8 }, { TRUE, 4 * 8, 12 * 8 }, { TRUE, 4 * 8, 14 * 8 }, { TRUE, 4 * 8, 16 * 8 }, { TRUE, 4 * 8, 18 * 8 }, }; static MenuParam countrySel = { MENU_DISPLAY_SIZE, TXT_COLOR_BLACK, TXT_COLOR_GREEN, TXT_COLOR_RED, &s_countryPos[ 0 ], (const u16 **)&s_pStrCountry, }; //====================================================== // function's description //====================================================== // スクロールメニューの初期化 static void InitScrollMenuList( void ) { int l; // メニューに表示する国名リスト全体の最初と最後をマッピングデータから取得 s_list_start = (u16)(region_country_mapping[s_regionCode] >> 16); s_list_end = (u16)(region_country_mapping[s_regionCode]); if(s_list_start > s_list_end) OS_Panic("selectCountry.c:s_list_start>s_list_end!"); list_size = s_list_end - s_list_start + 1; // 画面に表示する最大項目数よりも、国名リストが小さいか? countrySel.num = (MENU_DISPLAY_SIZE < list_size) ? MENU_DISPLAY_SIZE : list_size ; // 設定されていた国名コードがリスト範囲に入っていなければデフォルト値にする if(s_countryCode < s_list_start || s_list_end < s_countryCode) { s_countryCode = (TWLCountryCode)s_list_start; } // 実際に表示する範囲の調整 s_menu_display_start = s_countryCode; if(s_countryCode + countrySel.num - 1 > s_list_end) { s_menu_display_start = (u16)(s_list_end + 1 - countrySel.num); } // 実際に表示する国名のみリスト化 for(l=0; l= TWL_REGION_MAX ) ) { s_regionCode = (TWLRegion)TWL_DEFAULT_REGION; }else { s_regionCode = (TWLRegion)TSD_GetRegion(); } if( !SYSM_IsValidTSD() || ( TSD_GetCountry() >= TWL_COUNTRY_MAX ) ) { s_countryCode = (TWLCountryCode)0; }else { s_countryCode = TSD_GetCountry(); } // スクロールメニューの初期化 InitScrollMenuList(); DrawMenu( (u16)(s_countryCode - s_menu_display_start), &countrySel ); SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 ); GX_SetVisiblePlane ( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1); GXS_SetVisiblePlane( GX_PLANEMASK_BG0 ); GX_DispOn(); GXS_DispOn(); } // キー入力によるカーソル移動の処理 static void MoveCursorByKey( void ) { BOOL pad_cont = FALSE; static int pad_count = 0; if( pad.cont & PAD_KEY_DOWN ) { // カーソルの移動 if(pad_count == 0 || (pad_count>=START_AUTOMOVE_COUNT && pad_count%AUTOMOVE_INTERVAL==0)) if( s_countryCode < s_list_end ) s_countryCode++; pad_cont = TRUE; } if( pad.cont & PAD_KEY_UP ) { if(pad_count == 0 || (pad_count>=START_AUTOMOVE_COUNT && pad_count%AUTOMOVE_INTERVAL==0)) if( s_countryCode > s_list_start ) s_countryCode--; pad_cont = TRUE; } if( pad_cont ) pad_count++; else pad_count = 0; pad_cont = FALSE; // キー入力後、表示される項目の調整 if( s_countryCode < s_menu_display_start ) s_menu_display_start = s_countryCode; else if( s_menu_display_start + countrySel.num - 1 < s_countryCode ) s_menu_display_start = (u16)(s_countryCode - countrySel.num + 1); } // 簡易スクロールバーのボタンによるスクロール static void MoveCursorByScrollBarButton( void ) { static int tpd_count = 0; BOOL tpd_cont = FALSE; if(tpd.disp.touch) { if( WithinRangeTP(BAR_ZERO_X,BAR_ZERO_Y+BAR_HEIGHT_MAX+BAR_OFFSET,BAR_ZERO_X+BAR_BUTTON_WIDTH,BAR_ZERO_Y+BAR_HEIGHT_MAX+BAR_OFFSET+BAR_BUTTON_HEIGHT,&tpd.disp) ) {//down if(tpd_count == 0 || (tpd_count>=START_AUTOMOVE_COUNT && tpd_count%AUTOMOVE_INTERVAL==0)) if( s_countryCode < s_list_end ) s_menu_display_start++; tpd_cont = TRUE; } if( WithinRangeTP(BAR_ZERO_X,BAR_ZERO_Y-BAR_BUTTON_HEIGHT+BAR_OFFSET,BAR_ZERO_X+BAR_BUTTON_WIDTH,BAR_ZERO_Y+BAR_OFFSET,&tpd.disp) ) {//up if(tpd_count == 0 || (tpd_count>=START_AUTOMOVE_COUNT && tpd_count%AUTOMOVE_INTERVAL==0)) if( s_countryCode > s_list_start ) s_menu_display_start--; tpd_cont = TRUE; } } if( tpd_cont ) tpd_count++; else tpd_count = 0; tpd_cont = FALSE; } // 簡易スクロールバーによるスクロール static void MoveCursorByScrollBar( void ) { // 簡易スクロールバーのボタンによるスクロール MoveCursorByScrollBarButton(); // 簡易スクロールバーによるスクロール { static BOOL holding = FALSE; static int dy; int bar_top = (int)(BAR_ZERO_Y+dots_per_item * (s_menu_display_start - s_list_start)); if(tpd.disp.touch) { if(holding) { if ( tpd.disp.y - dy < bar_top - BAR_LOOSENESS) { bar_top = tpd.disp.y - dy + BAR_LOOSENESS; } else if ( tpd.disp.y - dy > bar_top + BAR_LOOSENESS) { bar_top = tpd.disp.y - dy - BAR_LOOSENESS; } s_menu_display_start = (u16)(((bar_top - BAR_ZERO_Y)/dots_per_item) + s_list_start); } else if(WithinRangeTP(BAR_ZERO_X, bar_top+BAR_OFFSET,BAR_ZERO_X + BAR_WIDTH,bar_top+BAR_OFFSET+bar_height,&tpd.disp)) { holding = TRUE; dy = tpd.disp.y - bar_top; } } else { holding = FALSE; } } // タッチパッドによるスクロール後、表示される項目の調整 if( s_menu_display_start + countrySel.num - 1 > s_list_end ) s_menu_display_start = (u16)(s_list_end - countrySel.num + 1); if( s_menu_display_start < s_list_start ) s_menu_display_start = s_list_start; if( s_countryCode < s_menu_display_start ) s_countryCode = (TWLCountryCode)s_menu_display_start; else if( s_menu_display_start + countrySel.num - 1 < s_countryCode ) s_countryCode = (TWLCountryCode)(s_menu_display_start + countrySel.num - 1); } // 国選択画面の描画処理 static void DrawCountryMain( void ) { int l; // 実際に表示する国名のみリスト化 for(l=0; l