1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: PhtselMenu.h 4 5 Copyright (C)2009-2012 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev:$ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_SAMPLE_DEMOS_PHTSEL_PHTSEL_MENU_H_ 17 #define NN_SAMPLE_DEMOS_PHTSEL_PHTSEL_MENU_H_ 18 19 #include "Menu.h" 20 21 #include <nn/phtsel.h> 22 23 #pragma diag_suppress 2530 // Suppress padding warnings 24 #pragma diag_suppress 1301 // Suppress padding warnings 25 26 //////////////////////////////////////////////////////////////////////////////////////////////// 27 /// Date/time definition item 28 /// 29 //////////////////////////////////////////////////////////////////////////////////////////////// 30 class DateTimeItem : public ItemBase 31 { 32 public: 33 typedef nn::phtsel::DateTimeConvert value_type; 34 35 public: DateTimeItem(const char * pName)36 DateTimeItem( const char* pName ) 37 : ItemBase(pName, 1, true) 38 , m_nParamSelect(0) 39 { 40 m_nParams[Param_Year ] = 0; 41 m_nParams[Param_Month] = 1; 42 m_nParams[Param_Day ] = 1; 43 m_nParams[Param_Hour ] = 0; 44 m_nParams[Param_Min ] = 0; 45 m_nParams[Param_Sec ] = 0; 46 } 47 48 /// Manipulate individual items Proc(const PadEx & padEx)49 virtual void Proc( const PadEx& padEx ) 50 { 51 ItemBase::Proc(padEx); 52 53 if( !IsDetailEditMode() ) return; 54 55 const bit32 repeat = padEx.GetRepeat(); 56 57 // Select parameter 58 if ( (repeat & (nn::hid::BUTTON_LEFT)) ) 59 { 60 --m_nParamSelect; 61 if( m_nParamSelect < 0 ) m_nParamSelect = Param_Num-1; 62 } 63 else if ( (repeat & (nn::hid::BUTTON_RIGHT)) ) 64 { 65 ++m_nParamSelect; 66 if( m_nParamSelect >= Param_Num ) m_nParamSelect = 0; 67 } 68 69 // Change value 70 if ( (repeat & (nn::hid::BUTTON_UP | nn::hid::BUTTON_DOWN)) ) 71 { 72 s32 inc = ((repeat & nn::hid::BUTTON_UP) ? 1 : 0) - ((repeat & nn::hid::BUTTON_DOWN) ? 1 : 0); 73 m_nParams[m_nParamSelect] += inc; 74 75 // Check value range 76 s32 minParams[Param_Num]; 77 s32 maxParams[Param_Num]; 78 { 79 nn::phtsel::DateTimeConvert::GetMinSeconds().ConvertToParam( 80 &minParams[Param_Year ], 81 &minParams[Param_Month], 82 &minParams[Param_Day ], 83 &minParams[Param_Hour ], 84 &minParams[Param_Min ], 85 &minParams[Param_Sec ] 86 ); 87 nn::phtsel::DateTimeConvert::GetMaxSeconds().ConvertToParam( 88 &maxParams[Param_Year ], 89 &maxParams[Param_Month], 90 &maxParams[Param_Day ], 91 &maxParams[Param_Hour ], 92 &maxParams[Param_Min ], 93 &maxParams[Param_Sec ] 94 ); 95 } 96 97 for( s32 i=0; i<Param_Num; ++i ) 98 { 99 if( m_nParams[i] < minParams[i] ) m_nParams[i] = maxParams[i]; 100 else if( m_nParams[i] > maxParams[i] ) m_nParams[i] = minParams[i]; 101 } 102 103 // Check whether day is valid 104 nn::phtsel::DateTimeConvert dtc; 105 while( 106 m_nParams[Param_Day] >= 1 && 107 !dtc.ConvertFromParam( 108 m_nParams[Param_Year ], 109 m_nParams[Param_Month], 110 m_nParams[Param_Day ], 111 m_nParams[Param_Hour ], 112 m_nParams[Param_Min ], 113 m_nParams[Param_Sec ] 114 ) 115 ) 116 { 117 if( inc > 0 && m_nParamSelect == Param_Day ){ 118 m_nParams[Param_Day] = 1; 119 break; 120 } 121 else{ 122 --m_nParams[Param_Day]; 123 } 124 } 125 } 126 } 127 128 /// Render Draw(demo::RenderSystemDrawing & df,s32 x,s32 y,bool bSelectItem)129 virtual void Draw( demo::RenderSystemDrawing& df, s32 x, s32 y, bool bSelectItem ) const 130 { 131 DrawItemNameCommon( df, x, y, bSelectItem ); 132 df.SetColor(1.0f, 1.0f, 1.0f); 133 134 s32 x2 = x+160; 135 DrawParam( df, x2, y, "%04d", Param_Year ); x2 += 8*4; 136 df.DrawText( x2, y, "-" ); x2 += 8; 137 DrawParam( df, x2, y, "%02d", Param_Month ); x2 += 8*2; 138 df.DrawText( x2, y, "-" ); x2 += 8; 139 DrawParam( df, x2, y, "%02d", Param_Day ); x2 += 8*2; 140 141 x2 += 8; 142 143 DrawParam( df, x2, y, "%02d", Param_Hour ); x2 += 8*2; 144 df.DrawText( x2, y, ":" ); x2 += 8; 145 DrawParam( df, x2, y, "%02d", Param_Min ); x2 += 8*2; 146 df.DrawText( x2, y, ":" ); x2 += 8; 147 DrawParam( df, x2, y, "%02d", Param_Sec ); x2 += 8*2; 148 } 149 150 //============================== 151 152 /// Get value GetSelectValue()153 value_type GetSelectValue() const 154 { 155 value_type ret; 156 bool bSuccess = ret.ConvertFromParam( 157 m_nParams[Param_Year ], 158 m_nParams[Param_Month], 159 m_nParams[Param_Day ], 160 m_nParams[Param_Hour ], 161 m_nParams[Param_Min ], 162 m_nParams[Param_Sec ] 163 ); 164 if( !bSuccess ) 165 { 166 NN_LOG("bad DateTime.\n"); 167 ret.SetSeconds(0); 168 } 169 return ret; 170 } 171 172 /// Set selection from value SetSelectValue(const value_type & value)173 void SetSelectValue( const value_type& value ) 174 { 175 value.ConvertToParam( 176 &m_nParams[Param_Year ], 177 &m_nParams[Param_Month], 178 &m_nParams[Param_Day ], 179 &m_nParams[Param_Hour ], 180 &m_nParams[Param_Min ], 181 &m_nParams[Param_Sec ] 182 ); 183 } 184 185 private: 186 enum Param 187 { 188 Param_Year , 189 Param_Month, 190 Param_Day , 191 Param_Hour , 192 Param_Min , 193 Param_Sec , 194 195 Param_Num 196 }; 197 private: DrawParam(demo::RenderSystemDrawing & df,s32 x,s32 y,const char * format,Param param)198 void DrawParam( demo::RenderSystemDrawing& df, s32 x, s32 y, const char* format, Param param ) const 199 { 200 if( IsDetailEditMode() && m_nParamSelect == param ){ 201 df.SetColor(1.0f, 0.5f, 0.1f); 202 } 203 df.DrawText( x, y, format, m_nParams[param] ); 204 df.SetColor(1.0f, 1.0f, 1.0f); 205 } 206 private: 207 s32 m_nParamSelect; 208 s32 m_nParams[Param_Num]; 209 }; 210 211 //////////////////////////////////////////////////////////////////////////////////////////////// 212 /// Game title 213 /// 214 //////////////////////////////////////////////////////////////////////////////////////////////// 215 class TitleIdItem : public ItemBase 216 { 217 public: 218 typedef u32 value_type; 219 static const s32 cIdMaxNum = nn::phtsel::PhtselInput::TITLE_UNIQUE_ID_MAX_NUM; 220 221 public: TitleIdItem(const char * pName)222 TitleIdItem( const char* pName ) 223 : ItemBase(pName, cIdMaxNum, true) 224 , m_nDigitSelect(0) 225 { 226 ResetValueAll(); 227 } 228 229 /// Manipulate individual items Proc(const PadEx & padEx)230 virtual void Proc( const PadEx& padEx ) 231 { 232 if( !IsDetailEditMode() ) 233 { 234 ItemBase::Proc(padEx); 235 return; 236 } 237 238 const bit32 repeat = padEx.GetRepeat(); 239 240 // Select digit 241 if ( (repeat & (nn::hid::BUTTON_LEFT)) ) 242 { 243 --m_nDigitSelect; 244 if( m_nDigitSelect < 0 ) m_nDigitSelect = cDigitNum-1; 245 } 246 else if ( (repeat & (nn::hid::BUTTON_RIGHT)) ) 247 { 248 ++m_nDigitSelect; 249 if( m_nDigitSelect >= cDigitNum ) m_nDigitSelect = 0; 250 } 251 252 // Change value 253 if ( (repeat & (nn::hid::BUTTON_UP | nn::hid::BUTTON_DOWN)) ) 254 { 255 const s32 inc = ((repeat & nn::hid::BUTTON_UP) ? 1 : 0) - ((repeat & nn::hid::BUTTON_DOWN) ? 1 : 0); 256 257 const s32 digit = cDigitNum-1 - m_nDigitSelect; 258 value_type value = GetSelectValue(); 259 s32 digitValue = (value >> (4*digit)) % 16; 260 261 digitValue += inc; 262 if( digitValue > 15 ) digitValue = 0; 263 else if( digitValue < 0 ) digitValue = 15; 264 265 digitValue <<= (4*digit); 266 value &= ~static_cast<value_type>(15 << (4*digit)); 267 value |= static_cast<value_type>(digitValue); 268 269 m_aValue[GetSelectIndex()] = value; 270 } 271 } 272 273 /// Render Draw(demo::RenderSystemDrawing & df,s32 x,s32 y,bool bSelectItem)274 virtual void Draw( demo::RenderSystemDrawing& df, s32 x, s32 y, bool bSelectItem ) const 275 { 276 DrawItemNameCommon( df, x, y, bSelectItem ); 277 278 s32 x2 = x+160; 279 df.DrawText( x2, y, "%3d/%3d:", GetSelectIndex()+1, GetValueNum() ); 280 x2 += 8*8; 281 282 df.SetColor(1.0f, 1.0f, 1.0f); 283 284 value_type value = GetSelectValue(); 285 s32 nShift = 4*(cDigitNum-1); 286 for( s32 i=0; i<cDigitNum && nShift>=0; ++i ) 287 { 288 if( IsDetailEditMode() && i == m_nDigitSelect ){ 289 df.SetColor(1.0f, 0.5f, 0.1f); 290 } 291 else{ 292 df.SetColor(1.0f, 1.0f, 1.0f); 293 } 294 295 value_type n = (value >> nShift) % 16; 296 df.DrawText( x2, y, "%X", n ); 297 x2 += 8; 298 nShift -= 4; 299 } 300 } 301 302 //============================== 303 304 /// Get value GetValue(s32 idx)305 value_type GetValue( s32 idx ) const 306 { 307 NN_ASSERT( idx>=0 && idx<GetValueNum() ); 308 return m_aValue[idx]; 309 } 310 311 /// Get selected value GetSelectValue()312 value_type GetSelectValue() const 313 { 314 return GetValue( GetSelectIndex() ); 315 } 316 317 /// Initialize ResetValueAll()318 void ResetValueAll() 319 { 320 std::memset(m_aValue, 0, sizeof(m_aValue)); 321 SetSelectIndex(0); 322 } 323 324 private: 325 static const s32 cDigitNum = 5; 326 327 private: 328 value_type m_aValue[cIdMaxNum]; 329 s32 m_nDigitSelect; 330 }; 331 332 #pragma diag_default 1301 // End suppressing padding warnings 333 #pragma diag_default 2530 // End suppressing padding warnings 334 335 /* NN_SAMPLE_DEMOS_PHTSEL_PHTSEL_MENU_H_ */ 336 #endif 337 338 /*---------------------------------------------------------------------------* 339 End of file 340 *---------------------------------------------------------------------------*/ 341