final adjustments for Giz release
[picodrive.git] / platform / uiq3 / Dialogs.cpp
CommitLineData
cc68a136 1/*******************************************************************\r
2 *\r
3 * File: Dialogs.cpp\r
4 *\r
5 * Author: Peter van Sebille (peter@yipton.net)\r
6 *\r
7 * Modified/adapted for picodriveN by notaz, 2006\r
8 *\r
9 * (c) Copyright 2006, notaz\r
10 * (c) Copyright 2002, Peter van Sebille\r
11 * All Rights Reserved\r
12 *\r
13 *******************************************************************/\r
14\r
15#include "Dialogs.h"\r
16#include "Engine.h"\r
17#include "picodrive.hrh"\r
18#include <picodrive.rsg>\r
19\r
20#include "version.h"\r
21#include "CSimpleTextParser.h"\r
22#include <txtrich.h> // CRichText\r
23#include <eikrted.h> // CEikRichTextEditor\r
24#include <qikvertoptionbuttonlist.h> // CEikHorOptionButtonList\r
25#include <eikopbut.h> // CEikOptionButton\r
26#include <eikedwin.h> // CEikEdwin\r
27#include <QuartzKeys.h> // EQuartzKeyTwoWayDown\r
28\r
29#include <QikCommand.h>\r
30\r
31\r
32/************************************************\r
33 *\r
34 * config Dialog\r
35 *\r
36 ************************************************/\r
37\r
38CPicoConfigDialog::CPicoConfigDialog(TPicoConfig &cfg) : config(cfg)\r
39{\r
40}\r
41\r
42void CPicoConfigDialog::PostLayoutDynInitL()\r
43{\r
44 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
45 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
46 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );\r
47 CEikCheckBox *chkbox_acctmng= (CEikCheckBox*) Control( ECtlOptUseAccTiming );\r
48 CEikCheckBox *chkbox_sram = (CEikCheckBox*) Control( ECtlOptUseSRAM );\r
49 CEikCheckBox *chkbox_fps = (CEikCheckBox*) Control( ECtlOptShowFPS );\r
50 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );\r
51 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );\r
52 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );\r
53 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );\r
54 CEikChoiceListBase *combo_sndq = (CEikChoiceListBase*) Control( ECtlOptSndQuality );\r
55 CEikCheckBox *chkbox_6bpad = (CEikCheckBox*) Control( ECtlOpt6ButtonPad );\r
56 CEikCheckBox *chkbox_gzipst = (CEikCheckBox*) Control( ECtlOptGzipStates );\r
57 CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );\r
58 CEikChoiceListBase *combo_region = (CEikChoiceListBase*) Control( ECtlOptRegion );\r
59 CEikOptionButton *opt_fit2 = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit2 );\r
60\r
61 buttons_rot ->SetButtonById(ECtlOptRotation0 + config.iScreenRotation);\r
62 buttons_disp->SetButtonById(ECtlOptScreenModeCenter + config.iScreenMode);\r
63 chkbox_sram ->SetState(config.iFlags & 1 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
64 chkbox_fps ->SetState(config.iFlags & 2 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
65 chkbox_sound ->SetState(config.iFlags & 4 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
66 chkbox_gzipst ->SetState(config.iFlags & 0x80 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
67 chkbox_z80 ->SetState(config.iPicoOpt & 4 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
68 chkbox_ym2612 ->SetState(config.iPicoOpt & 1 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
69 chkbox_sn76496->SetState(config.iPicoOpt & 2 ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
70 chkbox_altrend->SetState(config.iPicoOpt & 0x10? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
71 chkbox_6bpad ->SetState(config.iPicoOpt & 0x20? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
72 chkbox_acctmng->SetState(config.iPicoOpt & 0x40? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
73 chkbox_accsprt->SetState(config.iPicoOpt & 0x80? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
74\r
75 // dim "fit2" if we are not in 0 or 180 mode\r
76 if(config.iScreenRotation != TPicoConfig::PRot0 && config.iScreenRotation != TPicoConfig::PRot180) opt_fit2->SetDimmed(ETrue);\r
77 // dim some stuff for alternative renderer\r
78 if(config.iPicoOpt & 0x10) {\r
79 // dim accurate sprites\r
80 chkbox_accsprt->SetState(CEikButtonBase::EClear);\r
81 chkbox_accsprt->SetDimmed(ETrue);\r
82 // dim fit\r
83 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180)\r
84 ((CEikOptionButton*)(buttons_disp->ComponentControl(TPicoConfig::PMFit)))->SetDimmed(ETrue);\r
85 }\r
86\r
87 TInt sel = (config.iPicoOpt&8) ? 5 : 0;\r
88 sel+= (config.iFlags>>3)&7;\r
89 if (sel >= 10) sel = 0;\r
90 combo_sndq->SetCurrentItem(sel);\r
91 switch(config.PicoRegion) {\r
92 case 1: sel = 4; break;\r
93 case 2: sel = 3; break;\r
94 case 4: sel = 2; break;\r
95 case 8: sel = 1; break;\r
96 default:sel = 0; // auto\r
97 }\r
98 combo_region->SetCurrentItem(sel);\r
99}\r
100\r
101TBool CPicoConfigDialog::OkToExitL(TInt aButtonId)\r
102{\r
103 if(aButtonId != EEikBidOk) return ETrue;\r
104\r
105 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
106 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
107 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );\r
108 CEikCheckBox *chkbox_acctmng= (CEikCheckBox*) Control( ECtlOptUseAccTiming );\r
109 CEikCheckBox *chkbox_sram = (CEikCheckBox*) Control( ECtlOptUseSRAM );\r
110 CEikCheckBox *chkbox_fps = (CEikCheckBox*) Control( ECtlOptShowFPS );\r
111 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );\r
112 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );\r
113 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );\r
114 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );\r
115 CEikChoiceListBase *combo_sndq = (CEikChoiceListBase*) Control( ECtlOptSndQuality );\r
116 CEikCheckBox *chkbox_6bpad = (CEikCheckBox*) Control( ECtlOpt6ButtonPad );\r
117 CEikCheckBox *chkbox_gzipst = (CEikCheckBox*) Control( ECtlOptGzipStates );\r
118 CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );\r
119 CEikChoiceListBase *combo_region = (CEikChoiceListBase*) Control( ECtlOptRegion );\r
120\r
121 config.iScreenRotation = (TPicoConfig::TPicoScreenRotation) (buttons_rot->LabeledButtonId() - ECtlOptRotation0);\r
122 config.iScreenMode = (TPicoConfig::TPicoScreenMode) (buttons_disp->LabeledButtonId() - ECtlOptScreenModeCenter);\r
123\r
124 if(chkbox_sram ->State() == CEikButtonBase::ESet) config.iFlags |= 1; else config.iFlags &= ~1;\r
125 if(chkbox_fps ->State() == CEikButtonBase::ESet) config.iFlags |= 2; else config.iFlags &= ~2;\r
126 if(chkbox_sound ->State() == CEikButtonBase::ESet) config.iFlags |= 4; else config.iFlags &= ~4;\r
127 if(chkbox_gzipst ->State() == CEikButtonBase::ESet) config.iFlags |= 0x80; else config.iFlags &= ~0x80;\r
128 if(chkbox_z80 ->State() == CEikButtonBase::ESet) config.iPicoOpt |= 4; else config.iPicoOpt &= ~4;\r
129 if(chkbox_ym2612 ->State() == CEikButtonBase::ESet) config.iPicoOpt |= 1; else config.iPicoOpt &= ~1;\r
130 if(chkbox_sn76496->State() == CEikButtonBase::ESet) config.iPicoOpt |= 2; else config.iPicoOpt &= ~2;\r
131 if(chkbox_altrend->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x10;else config.iPicoOpt &= ~0x10;\r
132 if(chkbox_6bpad ->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x20;else config.iPicoOpt &= ~0x20;\r
133 if(chkbox_acctmng->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x40;else config.iPicoOpt &= ~0x40;\r
134 if(chkbox_accsprt->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x80;else config.iPicoOpt &= ~0x80;\r
135\r
136 TInt sel = combo_sndq->CurrentItem();\r
137 if(sel >= 5) { config.iPicoOpt |= 8; sel-=5; } else config.iPicoOpt &= ~8;\r
138 config.iFlags &= ~0x38;\r
139 config.iFlags |= (sel<<3)&0x38;\r
140\r
141 switch(combo_region->CurrentItem()) {\r
142 case 4: config.PicoRegion = 1; break;\r
143 case 3: config.PicoRegion = 2; break;\r
144 case 2: config.PicoRegion = 4; break;\r
145 case 1: config.PicoRegion = 8; break;\r
146 default:config.PicoRegion = 0; // auto\r
147 }\r
148\r
149 return ETrue;\r
150}\r
151\r
152// simple GUI stuff needs lots of code\r
153void CPicoConfigDialog::HandleControlStateChangeL(TInt aControlId)\r
154{\r
155 if(aControlId == ECtlOptEnableSound) {\r
156 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );\r
157 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );\r
158 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );\r
159 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );\r
160\r
161 if(chkbox_sound->State() == CEikButtonBase::ESet) {\r
162 // check all sound chips too, but only if they all are not set\r
163 if((chkbox_z80->State() | chkbox_ym2612->State() | chkbox_sn76496->State()) == CEikButtonBase::EClear) { // (==0)\r
164 chkbox_z80 ->SetState(CEikButtonBase::ESet);\r
165 chkbox_ym2612 ->SetState(CEikButtonBase::ESet);\r
166 chkbox_sn76496->SetState(CEikButtonBase::ESet);\r
167 chkbox_z80 ->DrawDeferred();\r
168 chkbox_ym2612 ->DrawDeferred();\r
169 chkbox_sn76496->DrawDeferred();\r
170 }\r
171 } else {\r
172 // clear everything, but only if everything is set\r
173 if((chkbox_z80->State() & chkbox_ym2612->State() & chkbox_sn76496->State()) == CEikButtonBase::ESet) { // (==1)\r
174 chkbox_z80 ->SetState(CEikButtonBase::EClear);\r
175 chkbox_ym2612 ->SetState(CEikButtonBase::EClear);\r
176 chkbox_sn76496->SetState(CEikButtonBase::EClear);\r
177 chkbox_z80 ->DrawDeferred();\r
178 chkbox_ym2612 ->DrawDeferred();\r
179 chkbox_sn76496->DrawDeferred();\r
180 }\r
181 }\r
182 } else if(aControlId == ECtlOptUseAltRend || aControlId == ECtlOptRotation) {\r
183 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );\r
184 CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );\r
185 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
186 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
187 CEikOptionButton *opt_fit = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit );\r
188 CEikOptionButton *opt_fit2 = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit2 );\r
189\r
190 TBool dimmed = chkbox_altrend->State() == CEikButtonBase::ESet;\r
191 // show/hide more stuff for alternative renderer\r
192 chkbox_accsprt->SetDimmed(dimmed);\r
193 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {\r
194 opt_fit->SetDimmed(dimmed);\r
195 if(dimmed && buttons_disp->LabeledButtonId() == ECtlOptScreenModeFit)\r
196 buttons_disp->SetButtonById(ECtlOptScreenModeFit2);\r
197 }\r
198 else opt_fit->SetDimmed(EFalse);\r
199 chkbox_accsprt->DrawDeferred();\r
200 buttons_disp->DrawDeferred();\r
201\r
202 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {\r
203 opt_fit2->SetDimmed(EFalse);\r
204 } else {\r
205 if(opt_fit2->State() == CEikButtonBase::ESet) {\r
206 buttons_disp->SetButtonById(ECtlOptScreenModeFit);\r
207 buttons_disp->DrawDeferred();\r
208 }\r
209 opt_fit2->SetDimmed(ETrue);\r
210 }\r
211 opt_fit2->DrawDeferred();\r
212 }\r
213}\r
214\r
215\r
216/************************************************\r
217 *\r
218 * About Dialog\r
219 *\r
220 ************************************************/\r
221\r
222void CAboutDialog::PostLayoutDynInitL()\r
223{\r
224 TBuf<16> versionText;\r
225 TBuf<512> text;\r
226\r
227 #if (KPicoBuildNumber != 0)\r
228 versionText.Format(_L("%d.%d%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber, KPicoBuildNumber);\r
229 #else\r
230 versionText.Format(_L("%d.%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber);\r
231 #endif\r
232\r
233 CEikRichTextEditor* richTextEd = LocateControlByUniqueHandle<CEikRichTextEditor>(ECtlPicoAboutText);\r
234 User::LeaveIfNull(richTextEd);\r
235\r
236 HBufC *aboutFormat = CEikonEnv::Static()->AllocReadResourceLC(R_PICO_TEXT_ABOUT);\r
237 CSimpleTextFormatParser *parser = CSimpleTextFormatParser::NewLC();\r
238\r
239 text.Format(*aboutFormat, &versionText);\r
240 parser->ParseL(text, *richTextEd->RichText());\r
241\r
242 richTextEd->UpdateAllFieldsL(); // Updates all the fields in the document\r
243\r
244 CleanupStack::PopAndDestroy(parser);\r
245 CleanupStack::PopAndDestroy(aboutFormat);\r
246}\r
247\r
248/*************************************************************\r
249*\r
250* Credits dialog\r
251*\r
252**************************************************************/\r
253\r
254void CCreditsDialog::PreLayoutDynInitL()\r
255{\r
256 CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
257 User::LeaveIfNull(edwin);\r
258\r
259 CDesCArrayFlat* desArray = CEikonEnv::Static()->ReadDesCArrayResourceL(R_PICO_TBUF_CREDITS);\r
260 CleanupStack::PushL(desArray);\r
261\r
262 edwin->SetTextLimit(2048); // to prevent stupid "too big" warning\r
263 TInt count = desArray->Count();\r
264 for (TInt i = 0; i < count; i++)\r
265 {\r
266 edwin->Text()->InsertL(edwin->TextLength(), desArray->operator[](i));\r
267 edwin->Text()->InsertL(edwin->TextLength(), CEditableText::ELineBreak);\r
268 }\r
269 CleanupStack::PopAndDestroy(desArray);\r
270}\r
271\r
272TKeyResponse CCreditsDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)\r
273{\r
274 if (aType == EEventKey)\r
275 {\r
276 CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
277 User::LeaveIfNull(edwin);\r
278\r
279 if (aKeyEvent.iCode == EQuartzKeyTwoWayDown)\r
280 {\r
281 edwin->MoveDisplayL(TCursorPosition::EFLineDown);\r
282 edwin->UpdateScrollBarsL();\r
283 return EKeyWasConsumed;\r
284 }\r
285 else if (aKeyEvent.iCode == EQuartzKeyTwoWayUp)\r
286 {\r
287 edwin->MoveDisplayL(TCursorPosition::EFLineUp);\r
288 edwin->UpdateScrollBarsL();\r
289 return EKeyWasConsumed;\r
290 }\r
291 }\r
292 return CQikSimpleDialog::OfferKeyEventL(aKeyEvent, aType);\r
293}\r
294\r
295/*************************************************************\r
296*\r
297* Debug dialog\r
298*\r
299**************************************************************/\r
300\r
301CDebugDialog::CDebugDialog(char *t)\r
302{\r
303 Mem::Copy(iText, t, 1024);\r
304 iText[1023] = 0;\r
305}\r
306\r
307void CDebugDialog::PreLayoutDynInitL()\r
308{\r
309 char *p = iText, *line = iText;\r
310 TBool end=0;\r
311 TBuf<128> tbuf;\r
312 CEikEdwin *editor = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
313\r
314 while(!end) {\r
315 while(*p && *p != '\r' && *p != '\n') p++;\r
316 if(!*p) end=1;\r
317 *p = 0;\r
318 TPtrC8 ptr((TUint8*) line);\r
319 tbuf.Copy(ptr);\r
320 editor->Text()->InsertL(editor->TextLength(), tbuf);\r
321 editor->Text()->InsertL(editor->TextLength(), CEditableText::ELineBreak);\r
322 line = ++p;\r
323 }\r
324}\r