#include #include "palmdefs.h" #include "start.h" #include "forms.h" #include "skin.h" #include "globals.h" static Int16 SkinsFormCompare(SkinInfoType *a, SkinInfoType *b, SortRecordInfoPtr, SortRecordInfoPtr, MemHandle) { return StrCompare(a->nameP, b->nameP); } static void SkinsFormInit(Boolean bDraw) { MemHandle skins = NULL; SkinInfoType *skinsInfo; UInt16 numSkins = 0; FormPtr frmP; ListType *listP; MemHandle items = NULL; ControlType *cck1P; DmSearchStateType stateInfo; UInt16 cardNo; LocalID dbID; Err errInfo; Char nameP[32]; itemsText = NULL; // parse and save skins Err err = DmGetNextDatabaseByTypeCreator(true, &stateInfo, 'skin', appFileCreator, false, &cardNo, &dbID); while (!err && dbID) { errInfo = DmDatabaseInfo (cardNo, dbID, nameP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (!errInfo) { if (!skins) skins = MemHandleNew(sizeof(SkinInfoType)); else MemHandleResize(skins, MemHandleSize(skins) + sizeof(SkinInfoType)); skinsInfo = (SkinInfoType *)MemHandleLock(skins); StrCopy(skinsInfo[numSkins].nameP, nameP); skinsInfo[numSkins].cardNo = cardNo; skinsInfo[numSkins].dbID = dbID; MemHandleUnlock(skins); numSkins++; } err = DmGetNextDatabaseByTypeCreator(false, &stateInfo, 'skin', appFileCreator, false, &cardNo, &dbID); } Int16 selected = -1; cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox); CtlSetValue(cck1P, gPrefs->soundClick); listP = (ListType *)GetObjectPtr(SkinsSkinList); skinsInfo = (SkinInfoType *)MemHandleLock(skins); SysQSort(skinsInfo, numSkins, sizeof(SkinInfoType), (CmpFuncPtr)SkinsFormCompare, 0); // create itemsText (TODO: create a custom draw function) for (UInt16 index=0; index < numSkins; index++) { if (!items) items = MemHandleNew(sizeof(Char *)); else MemHandleResize(items, MemHandleSize(items) + sizeof(Char *)); itemsText = (Char **)MemHandleLock(items); itemsText[index] = skinsInfo[index].nameP; MemHandleUnlock(items); if ( gPrefs->skin.cardNo == skinsInfo[index].cardNo && gPrefs->skin.dbID == skinsInfo[index].dbID && StrCompare(gPrefs->skin.nameP, skinsInfo[index].nameP) == 0) selected = index; } // save globals and set list itemsText = (Char **)MemHandleLock(items); itemsList = (void *)skinsInfo; itemsType = ITEM_TYPE_SKIN; LstSetListChoices (listP, itemsText, numSkins); LstSetSelection(listP, selected); // bDraw = true -> draw whole from // bDraw = false -> redraw list if (bDraw) { frmP = FrmGetActiveForm(); FrmDrawForm(frmP); } else { WinScreenLock(winLockCopy); LstDrawList(listP); WinScreenUnlock(); // LstSetSelection(listP, 0); } } static void SkinsFormExit(Boolean bSave) { MemHandle skins; MemHandle items; SkinInfoType *skinsInfo; ListType *listP; Int16 selected; listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); if (bSave && selected == -1) { // may never occured... FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); return; } skinsInfo = (SkinInfoType *)itemsList; skins = MemPtrRecoverHandle(skinsInfo); items = MemPtrRecoverHandle(itemsText); itemsText = NULL; itemsList = NULL; itemsType = ITEM_TYPE_UNKNOWN; if (bSave) { ControlType *cck1P; StrCopy(gPrefs->skin.nameP, skinsInfo[selected].nameP); gPrefs->skin.cardNo = skinsInfo[selected].cardNo; gPrefs->skin.dbID = skinsInfo[selected].dbID; /* DmOpenRef skinDB = SknOpenSkin(); UInt32 depth = SknGetDepth(skinDB); SknCloseSkin(skinDB); if (depth != 8 && depth != 16) depth = 8; if (depth == 16 && !OPTIONS_TST(kOptMode16Bit)) { FrmCustomAlert(FrmInfoAlert, "You can only use 8bit skin on your device.", 0, 0); gPrefs->skin.cardNo = cardNo; gPrefs->skin.dbID = dbID; } */ cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox); gPrefs->soundClick = CtlGetValue(cck1P); } FrmReturnToMain(); MemHandleUnlock(items); MemHandleUnlock(skins); MemHandleFree(items); MemHandleFree(skins); if (bSave) SknApplySkin(); } static void SkinsFormBeam() { SkinInfoType *skinsInfo; ListType *listP; Int16 selected; Err err; listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); if (selected == -1) { // may never occured... FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); return; } skinsInfo = (SkinInfoType *)itemsList; err = SendDatabase(0, skinsInfo[selected].dbID, "skin.pdb", "\nScummVM Skin"); // if (err) // FrmCustomAlert(FrmErrorAlert, "Unable to beam this skin.",0,0); } static void SkinsFormDelete() { MemHandle skins; MemHandle items; SkinInfoType *skinsInfo; ListType *listP; Int16 selected; listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); if (selected == -1) { // may never occured... FrmCustomAlert(FrmInfoAlert, "You didn't select a skin.", 0, 0); return; } skinsInfo = (SkinInfoType *)itemsList; skins = MemPtrRecoverHandle(skinsInfo); items = MemPtrRecoverHandle(itemsText); if ( gPrefs->skin.cardNo == skinsInfo[selected].cardNo && gPrefs->skin.dbID == skinsInfo[selected].dbID && StrCompare(gPrefs->skin.nameP, skinsInfo[selected].nameP) == 0) { FrmCustomAlert(FrmInfoAlert, "You cannot delete the active skin.",0,0); return; } else { Err err = DmDeleteDatabase(0, skinsInfo[selected].dbID); if (!err) { itemsText = NULL; itemsList = NULL; itemsType = ITEM_TYPE_UNKNOWN; MemHandleUnlock(items); MemHandleUnlock(skins); MemHandleFree(items); MemHandleFree(skins); SkinsFormInit(false); } else { FrmCustomAlert(FrmErrorAlert, "Skin deletion failed.",0,0); } } } Boolean SkinsFormHandleEvent(EventPtr eventP) { Boolean handled = false; switch (eventP->eType) { case frmOpenEvent: SkinsFormInit(true); handled = true; break; case frmCloseEvent: SkinsFormExit(false); handled = true; break; case ctlSelectEvent: switch (eventP->data.ctlSelect.controlID) { case SkinsOKButton: SkinsFormExit(true); break; case SkinsCancelButton: SkinsFormExit(false); break; case SkinsBeamButton: SkinsFormBeam(); break; case SkinsDeleteButton: SkinsFormDelete(); break; } handled = true; break; default: break; } return handled; }