Dialogs.cpp 17 KB

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