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