1 /*******************************************************************
\r
5 * Author: Peter van Sebille (peter@yipton.net)
\r
7 * Modified/adapted for picodriveN by notaz, 2006
\r
9 * (c) Copyright 2006, notaz
\r
10 * (c) Copyright 2002, Peter van Sebille
\r
11 * All Rights Reserved
\r
13 *******************************************************************/
\r
15 #include "Dialogs.h"
\r
17 #include "picodrive.hrh"
\r
18 #include "rsc/picodrive.rsg"
\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
29 #include <qikcommand.h>
\r
30 #include "../common/emu.h"
\r
33 /************************************************
\r
37 ************************************************/
\r
39 CPicoConfigDialog::CPicoConfigDialog(_currentConfig_t &cfg) : config(cfg)
\r
43 void CPicoConfigDialog::PostLayoutDynInitL()
\r
45 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );
\r
46 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );
\r
47 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );
\r
48 // CEikCheckBox *chkbox_acctmng= (CEikCheckBox*) Control( ECtlOptUseAccTiming );
\r
49 CEikCheckBox *chkbox_sram = (CEikCheckBox*) Control( ECtlOptUseSRAM );
\r
50 CEikCheckBox *chkbox_fps = (CEikCheckBox*) Control( ECtlOptShowFPS );
\r
51 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );
\r
52 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );
\r
53 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );
\r
54 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );
\r
55 CEikChoiceListBase *combo_sndq = (CEikChoiceListBase*) Control( ECtlOptSndQuality );
\r
56 CEikCheckBox *chkbox_6bpad = (CEikCheckBox*) Control( ECtlOpt6ButtonPad );
\r
57 CEikCheckBox *chkbox_gzipst = (CEikCheckBox*) Control( ECtlOptGzipStates );
\r
58 // CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );
\r
59 CEikChoiceListBase *combo_region = (CEikChoiceListBase*) Control( ECtlOptRegion );
\r
60 CEikOptionButton *opt_fit2 = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit2 );
\r
61 CEikCheckBox *chkbox_cdda = (CEikCheckBox*) Control( ECtlOptCDcdda );
\r
62 CEikCheckBox *chkbox_pcm = (CEikCheckBox*) Control( ECtlOptCDpcm );
\r
63 CEikCheckBox *chkbox_ramcart= (CEikCheckBox*) Control( ECtlOptCDramcart );
\r
64 CEikCheckBox *chkbox_sclrot = (CEikCheckBox*) Control( ECtlOptCDscalerot );
\r
65 CEikCheckBox *chkbox_bsync = (CEikCheckBox*) Control( ECtlOptCDbettersync );
\r
67 buttons_rot ->SetButtonById(ECtlOptRotation0 + config.rotation);
\r
68 buttons_disp->SetButtonById(ECtlOptScreenModeCenter + config.scaling);
\r
69 chkbox_sram ->SetState(config.EmuOpt & 1 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
70 chkbox_fps ->SetState(config.EmuOpt & 2 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
71 chkbox_sound ->SetState(config.EmuOpt & 4 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
72 chkbox_gzipst ->SetState(config.EmuOpt & 8 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
73 chkbox_z80 ->SetState(config.s_PicoOpt& 4 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
74 chkbox_ym2612 ->SetState(config.s_PicoOpt& 1 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
75 chkbox_sn76496->SetState(config.s_PicoOpt& 2 ? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
76 chkbox_altrend->SetState(config.s_PicoOpt& 0x10? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
77 chkbox_6bpad ->SetState(config.s_PicoOpt& 0x20? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
78 // chkbox_acctmng->SetState(config.s_PicoOpt& 0x40? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
79 // chkbox_accsprt->SetState(config.s_PicoOpt& 0x80? CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
80 chkbox_cdda ->SetState(config.s_PicoOpt&0x0800?CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
81 chkbox_pcm ->SetState(config.s_PicoOpt&0x0400?CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
82 chkbox_ramcart->SetState(config.s_PicoOpt&0x8000?CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
83 chkbox_sclrot ->SetState(config.s_PicoOpt&0x1000?CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
84 chkbox_bsync ->SetState(config.s_PicoOpt&0x2000?CEikButtonBase::ESet : CEikButtonBase::EClear);
\r
86 // dim "fit2" if we are not in 0 or 180 mode
\r
87 if (config.rotation != TPicoConfig::PRot0 && config.rotation != TPicoConfig::PRot180)
\r
88 opt_fit2->SetDimmed(ETrue);
\r
89 // dim some stuff for alternative renderer
\r
90 if (config.s_PicoOpt & 0x10) {
\r
91 // dim accurate sprites
\r
92 //chkbox_accsprt->SetState(CEikButtonBase::EClear);
\r
93 //chkbox_accsprt->SetDimmed(ETrue);
\r
95 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180)
\r
96 ((CEikOptionButton*)(buttons_disp->ComponentControl(TPicoConfig::PMFit)))->SetDimmed(ETrue);
\r
100 switch (config.s_PsndRate) {
\r
101 case 11025: sel = 1; break;
\r
102 case 16000: sel = 2; break;
\r
103 case 22050: sel = 3; break;
\r
104 case 44100: sel = 4; break;
\r
106 sel += (config.s_PicoOpt&8) ? 5 : 0;
\r
107 if (sel >= 10) sel = 0;
\r
108 combo_sndq->SetCurrentItem(sel);
\r
110 switch(config.s_PicoRegion) {
\r
111 case 1: sel = 4; break;
\r
112 case 2: sel = 3; break;
\r
113 case 4: sel = 2; break;
\r
114 case 8: sel = 1; break;
\r
115 default:sel = 0; // auto
\r
117 combo_region->SetCurrentItem(sel);
\r
120 TBool CPicoConfigDialog::OkToExitL(TInt aButtonId)
\r
122 if(aButtonId != EEikBidOk) return ETrue;
\r
124 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );
\r
125 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );
\r
126 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );
\r
127 // CEikCheckBox *chkbox_acctmng= (CEikCheckBox*) Control( ECtlOptUseAccTiming );
\r
128 CEikCheckBox *chkbox_sram = (CEikCheckBox*) Control( ECtlOptUseSRAM );
\r
129 CEikCheckBox *chkbox_fps = (CEikCheckBox*) Control( ECtlOptShowFPS );
\r
130 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );
\r
131 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );
\r
132 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );
\r
133 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );
\r
134 CEikChoiceListBase *combo_sndq = (CEikChoiceListBase*) Control( ECtlOptSndQuality );
\r
135 CEikCheckBox *chkbox_6bpad = (CEikCheckBox*) Control( ECtlOpt6ButtonPad );
\r
136 CEikCheckBox *chkbox_gzipst = (CEikCheckBox*) Control( ECtlOptGzipStates );
\r
137 // CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );
\r
138 CEikChoiceListBase *combo_region = (CEikChoiceListBase*) Control( ECtlOptRegion );
\r
139 CEikCheckBox *chkbox_cdda = (CEikCheckBox*) Control( ECtlOptCDcdda );
\r
140 CEikCheckBox *chkbox_pcm = (CEikCheckBox*) Control( ECtlOptCDpcm );
\r
141 CEikCheckBox *chkbox_ramcart= (CEikCheckBox*) Control( ECtlOptCDramcart );
\r
142 CEikCheckBox *chkbox_sclrot = (CEikCheckBox*) Control( ECtlOptCDscalerot );
\r
143 CEikCheckBox *chkbox_bsync = (CEikCheckBox*) Control( ECtlOptCDbettersync );
\r
145 config.rotation = (TPicoConfig::TPicoScreenRotation) (buttons_rot->LabeledButtonId() - ECtlOptRotation0);
\r
146 config.scaling = (TPicoConfig::TPicoScreenMode) (buttons_disp->LabeledButtonId() - ECtlOptScreenModeCenter);
\r
148 if(chkbox_sram ->State() == CEikButtonBase::ESet) config.EmuOpt |= 1; else config.EmuOpt &= ~1;
\r
149 if(chkbox_fps ->State() == CEikButtonBase::ESet) config.EmuOpt |= 2; else config.EmuOpt &= ~2;
\r
150 if(chkbox_sound ->State() == CEikButtonBase::ESet) config.EmuOpt |= 4; else config.EmuOpt &= ~4;
\r
151 if(chkbox_gzipst ->State() == CEikButtonBase::ESet) config.EmuOpt |= 8; else config.EmuOpt &= ~8;
\r
152 if(chkbox_z80 ->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 4; else config.s_PicoOpt&= ~4;
\r
153 if(chkbox_ym2612 ->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 1; else config.s_PicoOpt&= ~1;
\r
154 if(chkbox_sn76496->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 2; else config.s_PicoOpt&= ~2;
\r
155 if(chkbox_altrend->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x10;else config.s_PicoOpt&= ~0x10;
\r
156 if(chkbox_6bpad ->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x20;else config.s_PicoOpt&= ~0x20;
\r
157 // if(chkbox_acctmng->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x40;else config.s_PicoOpt&= ~0x40;
\r
158 // if(chkbox_accsprt->State() == CEikButtonBase::ESet) config.s_PicoOpt|= 0x80;else config.s_PicoOpt&= ~0x80;
\r
159 if(chkbox_cdda ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x0800; else config.s_PicoOpt&= ~0x0800;
\r
160 if(chkbox_pcm ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x0400; else config.s_PicoOpt&= ~0x0400;
\r
161 if(chkbox_ramcart->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x8000; else config.s_PicoOpt&= ~0x8000;
\r
162 if(chkbox_sclrot ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x1000; else config.s_PicoOpt&= ~0x1000;
\r
163 if(chkbox_bsync ->State() == CEikButtonBase::ESet) config.s_PicoOpt |= 0x2000; else config.s_PicoOpt&= ~0x2000;
\r
165 TInt sel = combo_sndq->CurrentItem();
\r
166 if(sel >= 5) { config.s_PicoOpt |= 8; sel-=5; } else config.s_PicoOpt &= ~8;
\r
168 default:config.s_PsndRate = 8000; break;
\r
169 case 1: config.s_PsndRate = 11025; break;
\r
170 case 2: config.s_PsndRate = 16000; break;
\r
171 case 3: config.s_PsndRate = 22050; break;
\r
172 case 4: config.s_PsndRate = 44100; break;
\r
175 switch (combo_region->CurrentItem()) {
\r
176 case 4: config.s_PicoRegion = 1; break;
\r
177 case 3: config.s_PicoRegion = 2; break;
\r
178 case 2: config.s_PicoRegion = 4; break;
\r
179 case 1: config.s_PicoRegion = 8; break;
\r
180 default:config.s_PicoRegion = 0; // auto
\r
186 // simple GUI stuff needs lots of code
\r
187 void CPicoConfigDialog::HandleControlStateChangeL(TInt aControlId)
\r
189 if (aControlId == ECtlOptEnableSound)
\r
191 CEikCheckBox *chkbox_sound = (CEikCheckBox*) Control( ECtlOptEnableSound );
\r
192 CEikCheckBox *chkbox_z80 = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );
\r
193 CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );
\r
194 CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );
\r
196 if(chkbox_sound->State() == CEikButtonBase::ESet) {
\r
197 // check all sound chips too, but only if they all are not set
\r
198 if((chkbox_z80->State() | chkbox_ym2612->State() | chkbox_sn76496->State()) == CEikButtonBase::EClear) { // (==0)
\r
199 chkbox_z80 ->SetState(CEikButtonBase::ESet);
\r
200 chkbox_ym2612 ->SetState(CEikButtonBase::ESet);
\r
201 chkbox_sn76496->SetState(CEikButtonBase::ESet);
\r
202 chkbox_z80 ->DrawDeferred();
\r
203 chkbox_ym2612 ->DrawDeferred();
\r
204 chkbox_sn76496->DrawDeferred();
\r
207 // clear everything, but only if everything is set
\r
208 if((chkbox_z80->State() & chkbox_ym2612->State() & chkbox_sn76496->State()) == CEikButtonBase::ESet) { // (==1)
\r
209 chkbox_z80 ->SetState(CEikButtonBase::EClear);
\r
210 chkbox_ym2612 ->SetState(CEikButtonBase::EClear);
\r
211 chkbox_sn76496->SetState(CEikButtonBase::EClear);
\r
212 chkbox_z80 ->DrawDeferred();
\r
213 chkbox_ym2612 ->DrawDeferred();
\r
214 chkbox_sn76496->DrawDeferred();
\r
218 else if(aControlId == ECtlOptUseAltRend || aControlId == ECtlOptRotation)
\r
220 CEikCheckBox *chkbox_altrend= (CEikCheckBox*) Control( ECtlOptUseAltRend );
\r
221 // CEikCheckBox *chkbox_accsprt= (CEikCheckBox*) Control( ECtlOptUseAccSprites );
\r
222 CEikHorOptionButtonList *buttons_rot = (CEikHorOptionButtonList*) Control( ECtlOptRotation );
\r
223 CEikHorOptionButtonList *buttons_disp = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );
\r
224 CEikOptionButton *opt_fit = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit );
\r
225 CEikOptionButton *opt_fit2 = (CEikOptionButton*) buttons_disp->ComponentControl( TPicoConfig::PMFit2 );
\r
227 TBool dimmed = chkbox_altrend->State() == CEikButtonBase::ESet;
\r
228 // show/hide more stuff for alternative renderer
\r
229 // chkbox_accsprt->SetDimmed(dimmed);
\r
230 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {
\r
231 opt_fit->SetDimmed(dimmed);
\r
232 if(dimmed && buttons_disp->LabeledButtonId() == ECtlOptScreenModeFit)
\r
233 buttons_disp->SetButtonById(ECtlOptScreenModeFit2);
\r
235 else opt_fit->SetDimmed(EFalse);
\r
236 // chkbox_accsprt->DrawDeferred();
\r
237 buttons_disp->DrawDeferred();
\r
239 if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {
\r
240 opt_fit2->SetDimmed(EFalse);
\r
242 if(opt_fit2->State() == CEikButtonBase::ESet) {
\r
243 buttons_disp->SetButtonById(ECtlOptScreenModeFit);
\r
244 buttons_disp->DrawDeferred();
\r
246 opt_fit2->SetDimmed(ETrue);
\r
248 opt_fit2->DrawDeferred();
\r
253 /************************************************
\r
257 ************************************************/
\r
259 void CAboutDialog::PostLayoutDynInitL()
\r
261 TBuf<16> versionText;
\r
264 #if (KPicoBuildNumber != 0)
\r
265 versionText.Format(_L("%d.%d%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber, KPicoBuildNumber);
\r
267 versionText.Format(_L("%d.%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber);
\r
270 CEikRichTextEditor* richTextEd = LocateControlByUniqueHandle<CEikRichTextEditor>(ECtlPicoAboutText);
\r
271 User::LeaveIfNull(richTextEd);
\r
273 HBufC *aboutFormat = CEikonEnv::Static()->AllocReadResourceLC(R_PICO_TEXT_ABOUT);
\r
274 CSimpleTextFormatParser *parser = CSimpleTextFormatParser::NewLC();
\r
276 text.Format(*aboutFormat, &versionText);
\r
277 parser->ParseL(text, *richTextEd->RichText());
\r
279 richTextEd->UpdateAllFieldsL(); // Updates all the fields in the document
\r
281 CleanupStack::PopAndDestroy(parser);
\r
282 CleanupStack::PopAndDestroy(aboutFormat);
\r
285 /*************************************************************
\r
289 **************************************************************/
\r
291 void CCreditsDialog::PreLayoutDynInitL()
\r
293 CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);
\r
294 User::LeaveIfNull(edwin);
\r
296 CDesCArrayFlat* desArray = CEikonEnv::Static()->ReadDesCArrayResourceL(R_PICO_TBUF_CREDITS);
\r
297 CleanupStack::PushL(desArray);
\r
299 edwin->SetTextLimit(2048); // to prevent stupid "too big" warning
\r
300 TInt count = desArray->Count();
\r
301 for (TInt i = 0; i < count; i++)
\r
303 edwin->Text()->InsertL(edwin->TextLength(), desArray->operator[](i));
\r
304 edwin->Text()->InsertL(edwin->TextLength(), CEditableText::ELineBreak);
\r
306 CleanupStack::PopAndDestroy(desArray);
\r
309 TKeyResponse CCreditsDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
\r
311 if (aType == EEventKey)
\r
313 CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);
\r
314 User::LeaveIfNull(edwin);
\r
316 if (aKeyEvent.iCode == EQuartzKeyTwoWayDown)
\r
318 edwin->MoveDisplayL(TCursorPosition::EFLineDown);
\r
319 edwin->UpdateScrollBarsL();
\r
320 return EKeyWasConsumed;
\r
322 else if (aKeyEvent.iCode == EQuartzKeyTwoWayUp)
\r
324 edwin->MoveDisplayL(TCursorPosition::EFLineUp);
\r
325 edwin->UpdateScrollBarsL();
\r
326 return EKeyWasConsumed;
\r
329 return CQikSimpleDialog::OfferKeyEventL(aKeyEvent, aType);
\r
332 /*************************************************************
\r
336 **************************************************************/
\r
338 CDebugDialog::CDebugDialog(char *t)
\r
340 Mem::Copy(iText, t, 1024);
\r
344 void CDebugDialog::PreLayoutDynInitL()
\r
346 char *p = iText, *line = iText;
\r
349 CEikEdwin *editor = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);
\r
352 while(*p && *p != '\r' && *p != '\n') p++;
\r
355 TPtrC8 ptr((TUint8*) line);
\r
357 editor->Text()->InsertL(editor->TextLength(), tbuf);
\r
358 editor->Text()->InsertL(editor->TextLength(), CEditableText::ELineBreak);
\r