initial import
[picodrive.git] / platform / uiq3 / Dialogs.cpp
diff --git a/platform/uiq3/Dialogs.cpp b/platform/uiq3/Dialogs.cpp
new file mode 100644 (file)
index 0000000..60b8685
--- /dev/null
@@ -0,0 +1,324 @@
+/*******************************************************************\r
+ *\r
+ *     File:           Dialogs.cpp\r
+ *\r
+ *     Author:         Peter van Sebille (peter@yipton.net)\r
+ *\r
+ *  Modified/adapted for picodriveN by notaz, 2006\r
+ *\r
+ *  (c) Copyright 2006, notaz\r
+ *     (c) Copyright 2002, Peter van Sebille\r
+ *     All Rights Reserved\r
+ *\r
+ *******************************************************************/\r
+\r
+#include "Dialogs.h"\r
+#include "Engine.h"\r
+#include "picodrive.hrh"\r
+#include <picodrive.rsg>\r
+\r
+#include "version.h"\r
+#include "CSimpleTextParser.h"\r
+#include <txtrich.h>                           // CRichText\r
+#include <eikrted.h>                           // CEikRichTextEditor\r
+#include <qikvertoptionbuttonlist.h> // CEikHorOptionButtonList\r
+#include <eikopbut.h>   // CEikOptionButton\r
+#include <eikedwin.h>   // CEikEdwin\r
+#include <QuartzKeys.h> // EQuartzKeyTwoWayDown\r
+\r
+#include <QikCommand.h>\r
+\r
+\r
+/************************************************\r
+ *\r
+ * config Dialog\r
+ *\r
+ ************************************************/\r
+\r
+CPicoConfigDialog::CPicoConfigDialog(TPicoConfig &cfg) : config(cfg)\r
+{\r
+}\r
+\r
+void CPicoConfigDialog::PostLayoutDynInitL()\r
+{\r
+       CEikHorOptionButtonList *buttons_rot   = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
+       CEikHorOptionButtonList *buttons_disp  = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
+       CEikCheckBox            *chkbox_altrend= (CEikCheckBox*)            Control( ECtlOptUseAltRend );\r
+       CEikCheckBox            *chkbox_acctmng= (CEikCheckBox*)            Control( ECtlOptUseAccTiming );\r
+       CEikCheckBox            *chkbox_sram   = (CEikCheckBox*)            Control( ECtlOptUseSRAM );\r
+       CEikCheckBox            *chkbox_fps    = (CEikCheckBox*)            Control( ECtlOptShowFPS );\r
+       CEikCheckBox            *chkbox_sound  = (CEikCheckBox*)            Control( ECtlOptEnableSound );\r
+       CEikCheckBox            *chkbox_z80    = (CEikCheckBox*)            Control( ECtlOptEmulateZ80 );\r
+       CEikCheckBox            *chkbox_ym2612 = (CEikCheckBox*)            Control( ECtlOptEmulateYM2612 );\r
+       CEikCheckBox            *chkbox_sn76496= (CEikCheckBox*)            Control( ECtlOptEmulateSN76496 );\r
+       CEikChoiceListBase      *combo_sndq    = (CEikChoiceListBase*)      Control( ECtlOptSndQuality );\r
+       CEikCheckBox            *chkbox_6bpad  = (CEikCheckBox*)            Control( ECtlOpt6ButtonPad );\r
+       CEikCheckBox            *chkbox_gzipst = (CEikCheckBox*)            Control( ECtlOptGzipStates );\r
+       CEikCheckBox            *chkbox_accsprt= (CEikCheckBox*)            Control( ECtlOptUseAccSprites );\r
+       CEikChoiceListBase      *combo_region  = (CEikChoiceListBase*)      Control( ECtlOptRegion );\r
+       CEikOptionButton        *opt_fit2      = (CEikOptionButton*)        buttons_disp->ComponentControl( TPicoConfig::PMFit2 );\r
+\r
+       buttons_rot ->SetButtonById(ECtlOptRotation0 + config.iScreenRotation);\r
+       buttons_disp->SetButtonById(ECtlOptScreenModeCenter + config.iScreenMode);\r
+       chkbox_sram   ->SetState(config.iFlags & 1     ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_fps    ->SetState(config.iFlags & 2     ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_sound  ->SetState(config.iFlags & 4     ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_gzipst ->SetState(config.iFlags & 0x80  ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_z80    ->SetState(config.iPicoOpt & 4   ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_ym2612 ->SetState(config.iPicoOpt & 1   ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_sn76496->SetState(config.iPicoOpt & 2   ? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_altrend->SetState(config.iPicoOpt & 0x10? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_6bpad  ->SetState(config.iPicoOpt & 0x20? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_acctmng->SetState(config.iPicoOpt & 0x40? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+       chkbox_accsprt->SetState(config.iPicoOpt & 0x80? CEikButtonBase::ESet : CEikButtonBase::EClear);\r
+\r
+       // dim "fit2" if we are not in 0 or 180 mode\r
+       if(config.iScreenRotation != TPicoConfig::PRot0 && config.iScreenRotation != TPicoConfig::PRot180) opt_fit2->SetDimmed(ETrue);\r
+       // dim some stuff for alternative renderer\r
+       if(config.iPicoOpt & 0x10) {\r
+               // dim accurate sprites\r
+               chkbox_accsprt->SetState(CEikButtonBase::EClear);\r
+               chkbox_accsprt->SetDimmed(ETrue);\r
+               // dim fit\r
+               if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180)\r
+                       ((CEikOptionButton*)(buttons_disp->ComponentControl(TPicoConfig::PMFit)))->SetDimmed(ETrue);\r
+       }\r
+\r
+       TInt sel = (config.iPicoOpt&8) ? 5 : 0;\r
+       sel+= (config.iFlags>>3)&7;\r
+       if (sel >= 10) sel = 0;\r
+       combo_sndq->SetCurrentItem(sel);\r
+       switch(config.PicoRegion) {\r
+               case 1: sel = 4; break;\r
+               case 2: sel = 3; break;\r
+               case 4: sel = 2; break;\r
+               case 8: sel = 1; break;\r
+               default:sel = 0; // auto\r
+       }\r
+       combo_region->SetCurrentItem(sel);\r
+}\r
+\r
+TBool CPicoConfigDialog::OkToExitL(TInt aButtonId)\r
+{\r
+       if(aButtonId != EEikBidOk) return ETrue;\r
+\r
+       CEikHorOptionButtonList *buttons_rot   = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
+       CEikHorOptionButtonList *buttons_disp  = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
+       CEikCheckBox            *chkbox_altrend= (CEikCheckBox*)            Control( ECtlOptUseAltRend );\r
+       CEikCheckBox            *chkbox_acctmng= (CEikCheckBox*)            Control( ECtlOptUseAccTiming );\r
+       CEikCheckBox            *chkbox_sram   = (CEikCheckBox*)            Control( ECtlOptUseSRAM );\r
+       CEikCheckBox            *chkbox_fps    = (CEikCheckBox*)            Control( ECtlOptShowFPS );\r
+       CEikCheckBox            *chkbox_sound  = (CEikCheckBox*)            Control( ECtlOptEnableSound );\r
+       CEikCheckBox            *chkbox_z80    = (CEikCheckBox*)            Control( ECtlOptEmulateZ80 );\r
+       CEikCheckBox            *chkbox_ym2612 = (CEikCheckBox*)            Control( ECtlOptEmulateYM2612 );\r
+       CEikCheckBox            *chkbox_sn76496= (CEikCheckBox*)            Control( ECtlOptEmulateSN76496 );\r
+       CEikChoiceListBase      *combo_sndq    = (CEikChoiceListBase*)      Control( ECtlOptSndQuality );\r
+       CEikCheckBox            *chkbox_6bpad  = (CEikCheckBox*)            Control( ECtlOpt6ButtonPad );\r
+       CEikCheckBox            *chkbox_gzipst = (CEikCheckBox*)            Control( ECtlOptGzipStates );\r
+       CEikCheckBox            *chkbox_accsprt= (CEikCheckBox*)            Control( ECtlOptUseAccSprites );\r
+       CEikChoiceListBase      *combo_region  = (CEikChoiceListBase*)      Control( ECtlOptRegion );\r
+\r
+       config.iScreenRotation = (TPicoConfig::TPicoScreenRotation) (buttons_rot->LabeledButtonId() - ECtlOptRotation0);\r
+       config.iScreenMode = (TPicoConfig::TPicoScreenMode) (buttons_disp->LabeledButtonId() - ECtlOptScreenModeCenter);\r
+\r
+       if(chkbox_sram   ->State() == CEikButtonBase::ESet) config.iFlags |= 1;     else config.iFlags   &= ~1;\r
+       if(chkbox_fps    ->State() == CEikButtonBase::ESet) config.iFlags |= 2;     else config.iFlags   &= ~2;\r
+       if(chkbox_sound  ->State() == CEikButtonBase::ESet) config.iFlags |= 4;     else config.iFlags   &= ~4;\r
+       if(chkbox_gzipst ->State() == CEikButtonBase::ESet) config.iFlags |= 0x80;  else config.iFlags   &= ~0x80;\r
+       if(chkbox_z80    ->State() == CEikButtonBase::ESet) config.iPicoOpt |= 4;   else config.iPicoOpt &= ~4;\r
+       if(chkbox_ym2612 ->State() == CEikButtonBase::ESet) config.iPicoOpt |= 1;   else config.iPicoOpt &= ~1;\r
+       if(chkbox_sn76496->State() == CEikButtonBase::ESet) config.iPicoOpt |= 2;   else config.iPicoOpt &= ~2;\r
+       if(chkbox_altrend->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x10;else config.iPicoOpt &= ~0x10;\r
+       if(chkbox_6bpad  ->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x20;else config.iPicoOpt &= ~0x20;\r
+       if(chkbox_acctmng->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x40;else config.iPicoOpt &= ~0x40;\r
+       if(chkbox_accsprt->State() == CEikButtonBase::ESet) config.iPicoOpt |= 0x80;else config.iPicoOpt &= ~0x80;\r
+\r
+       TInt sel = combo_sndq->CurrentItem();\r
+       if(sel >= 5) { config.iPicoOpt |= 8; sel-=5; } else config.iPicoOpt &= ~8;\r
+       config.iFlags &= ~0x38;\r
+       config.iFlags |= (sel<<3)&0x38;\r
+\r
+       switch(combo_region->CurrentItem()) {\r
+               case 4: config.PicoRegion = 1; break;\r
+               case 3: config.PicoRegion = 2; break;\r
+               case 2: config.PicoRegion = 4; break;\r
+               case 1: config.PicoRegion = 8; break;\r
+               default:config.PicoRegion = 0; // auto\r
+       }\r
+\r
+       return ETrue;\r
+}\r
+\r
+// simple GUI stuff needs lots of code\r
+void CPicoConfigDialog::HandleControlStateChangeL(TInt aControlId)\r
+{\r
+       if(aControlId == ECtlOptEnableSound) {\r
+               CEikCheckBox *chkbox_sound  = (CEikCheckBox*) Control( ECtlOptEnableSound );\r
+               CEikCheckBox *chkbox_z80    = (CEikCheckBox*) Control( ECtlOptEmulateZ80 );\r
+               CEikCheckBox *chkbox_ym2612 = (CEikCheckBox*) Control( ECtlOptEmulateYM2612 );\r
+               CEikCheckBox *chkbox_sn76496= (CEikCheckBox*) Control( ECtlOptEmulateSN76496 );\r
+\r
+               if(chkbox_sound->State() == CEikButtonBase::ESet) {\r
+                       // check all sound chips too, but only if they all are not set\r
+                       if((chkbox_z80->State() | chkbox_ym2612->State() | chkbox_sn76496->State()) == CEikButtonBase::EClear) { // (==0)\r
+                               chkbox_z80    ->SetState(CEikButtonBase::ESet);\r
+                               chkbox_ym2612 ->SetState(CEikButtonBase::ESet);\r
+                               chkbox_sn76496->SetState(CEikButtonBase::ESet);\r
+                               chkbox_z80    ->DrawDeferred();\r
+                               chkbox_ym2612 ->DrawDeferred();\r
+                               chkbox_sn76496->DrawDeferred();\r
+                       }\r
+               } else {\r
+                       // clear everything, but only if everything is set\r
+                       if((chkbox_z80->State() & chkbox_ym2612->State() & chkbox_sn76496->State()) == CEikButtonBase::ESet) { // (==1)\r
+                               chkbox_z80    ->SetState(CEikButtonBase::EClear);\r
+                               chkbox_ym2612 ->SetState(CEikButtonBase::EClear);\r
+                               chkbox_sn76496->SetState(CEikButtonBase::EClear);\r
+                               chkbox_z80    ->DrawDeferred();\r
+                               chkbox_ym2612 ->DrawDeferred();\r
+                               chkbox_sn76496->DrawDeferred();\r
+                       }\r
+               }\r
+       } else if(aControlId == ECtlOptUseAltRend || aControlId == ECtlOptRotation) {\r
+               CEikCheckBox            *chkbox_altrend= (CEikCheckBox*)            Control( ECtlOptUseAltRend );\r
+               CEikCheckBox            *chkbox_accsprt= (CEikCheckBox*)            Control( ECtlOptUseAccSprites );\r
+               CEikHorOptionButtonList *buttons_rot   = (CEikHorOptionButtonList*) Control( ECtlOptRotation );\r
+               CEikHorOptionButtonList *buttons_disp  = (CEikHorOptionButtonList*) Control( ECtlOptScreenMode );\r
+               CEikOptionButton        *opt_fit       = (CEikOptionButton*)        buttons_disp->ComponentControl( TPicoConfig::PMFit );\r
+               CEikOptionButton        *opt_fit2      = (CEikOptionButton*)        buttons_disp->ComponentControl( TPicoConfig::PMFit2 );\r
+\r
+               TBool dimmed = chkbox_altrend->State() == CEikButtonBase::ESet;\r
+               // show/hide more stuff for alternative renderer\r
+               chkbox_accsprt->SetDimmed(dimmed);\r
+               if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {\r
+                       opt_fit->SetDimmed(dimmed);\r
+                       if(dimmed && buttons_disp->LabeledButtonId() == ECtlOptScreenModeFit)\r
+                               buttons_disp->SetButtonById(ECtlOptScreenModeFit2);\r
+               }\r
+               else opt_fit->SetDimmed(EFalse);\r
+               chkbox_accsprt->DrawDeferred();\r
+               buttons_disp->DrawDeferred();\r
+\r
+               if(buttons_rot->LabeledButtonId() == ECtlOptRotation0 || buttons_rot->LabeledButtonId() == ECtlOptRotation180) {\r
+                       opt_fit2->SetDimmed(EFalse);\r
+               } else {\r
+                       if(opt_fit2->State() == CEikButtonBase::ESet) {\r
+                               buttons_disp->SetButtonById(ECtlOptScreenModeFit);\r
+                               buttons_disp->DrawDeferred();\r
+                       }\r
+                       opt_fit2->SetDimmed(ETrue);\r
+               }\r
+               opt_fit2->DrawDeferred();\r
+       }\r
+}\r
+\r
+\r
+/************************************************\r
+ *\r
+ * About Dialog\r
+ *\r
+ ************************************************/\r
+\r
+void CAboutDialog::PostLayoutDynInitL()\r
+{\r
+       TBuf<16>        versionText;\r
+       TBuf<512>       text;\r
+\r
+       #if (KPicoBuildNumber != 0)\r
+               versionText.Format(_L("%d.%d%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber, KPicoBuildNumber);\r
+       #else\r
+               versionText.Format(_L("%d.%d"), KPicoMajorVersionNumber, KPicoMinorVersionNumber);\r
+       #endif\r
+\r
+       CEikRichTextEditor* richTextEd = LocateControlByUniqueHandle<CEikRichTextEditor>(ECtlPicoAboutText);\r
+       User::LeaveIfNull(richTextEd);\r
+\r
+       HBufC *aboutFormat = CEikonEnv::Static()->AllocReadResourceLC(R_PICO_TEXT_ABOUT);\r
+       CSimpleTextFormatParser *parser = CSimpleTextFormatParser::NewLC();\r
+\r
+       text.Format(*aboutFormat, &versionText);\r
+       parser->ParseL(text, *richTextEd->RichText());\r
+\r
+       richTextEd->UpdateAllFieldsL(); // Updates all the fields in the document\r
+\r
+       CleanupStack::PopAndDestroy(parser);\r
+       CleanupStack::PopAndDestroy(aboutFormat);\r
+}\r
+\r
+/*************************************************************\r
+*\r
+* Credits dialog\r
+*\r
+**************************************************************/\r
+\r
+void CCreditsDialog::PreLayoutDynInitL()\r
+{\r
+       CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
+       User::LeaveIfNull(edwin);\r
+\r
+       CDesCArrayFlat* desArray = CEikonEnv::Static()->ReadDesCArrayResourceL(R_PICO_TBUF_CREDITS);\r
+       CleanupStack::PushL(desArray);\r
+\r
+       edwin->SetTextLimit(2048); // to prevent stupid "too big" warning\r
+       TInt count = desArray->Count();\r
+       for (TInt i = 0; i < count; i++)\r
+       {\r
+               edwin->Text()->InsertL(edwin->TextLength(), desArray->operator[](i));\r
+               edwin->Text()->InsertL(edwin->TextLength(), CEditableText::ELineBreak);\r
+       }\r
+       CleanupStack::PopAndDestroy(desArray);\r
+}\r
+\r
+TKeyResponse CCreditsDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)\r
+{\r
+       if (aType == EEventKey)\r
+       {\r
+               CEikEdwin *edwin = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
+               User::LeaveIfNull(edwin);\r
+\r
+               if (aKeyEvent.iCode == EQuartzKeyTwoWayDown)\r
+               {\r
+                       edwin->MoveDisplayL(TCursorPosition::EFLineDown);\r
+                       edwin->UpdateScrollBarsL();\r
+                       return EKeyWasConsumed;\r
+               }\r
+               else if (aKeyEvent.iCode == EQuartzKeyTwoWayUp)\r
+               {\r
+                       edwin->MoveDisplayL(TCursorPosition::EFLineUp);\r
+                       edwin->UpdateScrollBarsL();\r
+                       return EKeyWasConsumed;\r
+               }\r
+       }\r
+       return CQikSimpleDialog::OfferKeyEventL(aKeyEvent, aType);\r
+}\r
+\r
+/*************************************************************\r
+*\r
+* Debug dialog\r
+*\r
+**************************************************************/\r
+\r
+CDebugDialog::CDebugDialog(char *t)\r
+{\r
+       Mem::Copy(iText, t, 1024);\r
+       iText[1023] = 0;\r
+}\r
+\r
+void CDebugDialog::PreLayoutDynInitL()\r
+{\r
+       char *p = iText, *line = iText;\r
+       TBool end=0;\r
+       TBuf<128> tbuf;\r
+       CEikEdwin *editor = LocateControlByUniqueHandle<CEikEdwin>(ECtlPicoCreditsText);\r
+\r
+       while(!end) {\r
+               while(*p && *p != '\r' && *p != '\n') p++;\r
+               if(!*p) end=1;\r
+               *p = 0;\r
+               TPtrC8 ptr((TUint8*) line);\r
+               tbuf.Copy(ptr);\r
+               editor->Text()->InsertL(editor->TextLength(), tbuf);\r
+               editor->Text()->InsertL(editor->TextLength(), CEditableText::ELineBreak);\r
+               line = ++p;\r
+       }\r
+}\r