short get_level_number_from_user( void) { short index, item_hit, level_number, maximum_level_number; DialogPtr dialog; struct entry_point entry; boolean done= FALSE; index = 0; maximum_level_number= 0; while (get_indexed_entry_point(&entry, &index, _single_player_entry_point | _multiplayer_carnage_entry_point | _multiplayer_cooperative_entry_point)) maximum_level_number++; dialog = myGetNewDialog(dlogLEVEL_NUMBER, NULL, (WindowPtr) -1, 0); assert(dialog); psprintf(temporary, "%d", maximum_level_number); ParamText((StringPtr)temporary, (StringPtr)"", (StringPtr)"", (StringPtr)""); SelIText(dialog, iLEVEL_NUMBER, 0, SHORT_MAX); while(!done) { do { ModalDialog(get_general_filter_upp(), &item_hit); } while (item_hit>iCANCEL); level_number= extract_number_from_text_item(dialog, iLEVEL_NUMBER); switch(item_hit) { case iOK: if(level_number<=0 || level_number>maximum_level_number) { SelIText(dialog, iLEVEL_NUMBER, 0, SHORT_MAX); SysBeep(-1); } else { level_number-= 1; /* Make it zero based */ done= TRUE; } break; case iCANCEL: done= TRUE; level_number= NONE; break; default: halt(); break; } } DisposeDialog(dialog); return level_number; }
GDHandle display_device_dialog( GDSpecPtr device_spec) { GDHandle device= BestDevice(device_spec); if (device) { DialogPtr dialog= myGetNewDialog(dlogDEVICE, NULL, (WindowPtr) -1, 0); ModalFilterUPP device_dialog_filter_upp= NewModalFilterProc(device_dialog_filter_proc); short item_hit; assert(dialog); assert(device_dialog_filter_upp); /* setup globals */ device_dialog_globals.device_spec= *device_spec; device_dialog_globals.device= device; /* setup and show dialog */ device_dialog_instantiate_proc(dialog); ShowWindow(dialog); do { boolean reinstantiate= FALSE; ModalDialog(device_dialog_filter_upp, &item_hit); switch(item_hit) { case iCOLORS: device_dialog_globals.device_spec.flags|= deviceIsColor; reinstantiate= TRUE; break; case iGRAYS: device_dialog_globals.device_spec.flags&= ~deviceIsColor; reinstantiate= TRUE; break; case iDEVICE_AREA: reinstantiate= TRUE; break; case iOK: *device_spec= device_dialog_globals.device_spec; device= device_dialog_globals.device; break; } if (reinstantiate) device_dialog_instantiate_proc(dialog); } while (item_hit!=iOK && item_hit!=iCANCEL); DisposeDialog(dialog); DisposeRoutineDescriptor(device_dialog_filter_upp); } return device; }
// True for OK, false for cancel bool Configure_ChaseCam(ChaseCamData &Data) { short ItemType; Rect Bounds; DialogPtr Dialog = myGetNewDialog(ChaseCam_Dialog, NULL, (WindowPtr)(-1), 0); assert(Dialog); ControlHandle Behind_CHdl; GetDialogItem(Dialog, Behind_Item, &ItemType, (Handle *)&Behind_CHdl, &Bounds); SetFloat(Behind_CHdl,Data.Behind/FLOAT_WORLD_ONE); ControlHandle Upward_CHdl; GetDialogItem(Dialog, Upward_Item, &ItemType, (Handle *)&Upward_CHdl, &Bounds); SetFloat(Upward_CHdl,Data.Upward/FLOAT_WORLD_ONE); ControlHandle Rightward_CHdl; GetDialogItem(Dialog, Rightward_Item, &ItemType, (Handle *)&Rightward_CHdl, &Bounds); SetFloat(Rightward_CHdl,Data.Rightward/FLOAT_WORLD_ONE); MacCheckbox PassThruWall_CB(Dialog, PassThruWall_Item, TEST_FLAG(Data.Flags,_ChaseCam_ThroughWalls)); MacCheckbox NeverActive_CB(Dialog, NeverActive_Item, TEST_FLAG(Data.Flags,_ChaseCam_NeverActive)); MacCheckbox OnWhenEntering_CB(Dialog, OnWhenEntering_Item, TEST_FLAG(Data.Flags,_ChaseCam_OnWhenEntering)); ControlHandle Damping_CHdl; GetDialogItem(Dialog, Damping_Item, &ItemType, (Handle *)&Damping_CHdl, &Bounds); SetFloat(Damping_CHdl,Data.Damping); ControlHandle Spring_CHdl; GetDialogItem(Dialog, Spring_Item, &ItemType, (Handle *)&Spring_CHdl, &Bounds); SetFloat(Spring_CHdl,Data.Spring); ControlHandle Opacity_CHdl; GetDialogItem(Dialog, CC_Opacity_Item, &ItemType, (Handle *)&Opacity_CHdl, &Bounds); SetFloat(Opacity_CHdl,Data.Opacity); // Where to make the color picker Point Center = {-1,-1}; RGBColor NewColor; // Get void color from OpenGL-parameters data OGL_ConfigureData& OGLData = Get_OGL_ConfigureData(); MacCheckbox VoidColorOnOff_CB(Dialog, VoidColorOnOff_Item, TEST_FLAG(OGLData.Flags,OGL_Flag_VoidColor)); // Reveal it #if USE_SHEETS SetThemeWindowBackground(GetDialogWindow(Dialog), kThemeBrushSheetBackgroundTransparent, false); ShowSheetWindow(GetDialogWindow(Dialog), ActiveNonFloatingWindow()); #else SelectWindow(GetDialogWindow(Dialog)); ShowWindow(GetDialogWindow(Dialog)); #endif bool WillQuit = false; bool IsOK = false; short New_Behind = 0, New_Upward = 0, New_Rightward = 0; float FloatTemp = 0; bool BadValue; float New_Damping, New_Spring, New_Opacity; while(!WillQuit) { short ItemHit; ModalDialog(NULL, &ItemHit); switch(ItemHit) { case OK_Item: // Check before quitting BadValue = false; // Now doing roundoff correctly // Using a modification of AlexJLS's corrected version if (GetFloat(Behind_CHdl,FloatTemp)) New_Behind = FloatRoundoff(WORLD_ONE * FloatTemp); else BadValue = true; if (GetFloat(Upward_CHdl,FloatTemp)) New_Upward = FloatRoundoff(WORLD_ONE * FloatTemp); else BadValue = true; if (GetFloat(Rightward_CHdl,FloatTemp)) New_Rightward = FloatRoundoff(WORLD_ONE * FloatTemp); else BadValue = true; if (GetFloat(Damping_CHdl,FloatTemp)) { // Simple validation of the damping factor New_Damping = PIN(FloatTemp,-1,1); if (New_Damping != FloatTemp) { BadValue = true; SetFloat(Damping_CHdl,New_Damping); } } else BadValue = true; if (GetFloat(Spring_CHdl,FloatTemp)) { New_Spring = FloatTemp; } else BadValue = true; if (GetFloat(Opacity_CHdl,FloatTemp)) { New_Opacity = PIN(FloatTemp,0,1); if (New_Opacity != FloatTemp) { BadValue = true; SetFloat(Opacity_CHdl,New_Opacity); } } else BadValue = true; // Do validation: will the chase cam be unstable? if (!BadValue) { if (New_Spring >= 0) { // Oscillatory case float NewDampSq = New_Damping*New_Damping; BadValue = ((NewDampSq + New_Spring) >= 1); if (BadValue) { New_Spring = 1 - NewDampSq; SetFloat(Spring_CHdl,New_Spring); } } else { // Overdamped case float NewDampAbs = fabs(New_Damping); BadValue = ((NewDampAbs + sqrt(-New_Spring)) >= 1); if (BadValue) { float Temp = 1 - NewDampAbs; New_Spring = - Temp*Temp; SetFloat(Spring_CHdl,New_Spring); } } } if (BadValue) { SysBeep(30); break; } IsOK = true; WillQuit = true; break; case Cancel_Item: IsOK = false; WillQuit = true; break; case VoidColorSelect_Item: // Need to set color here so the preview can work properly if (GetColor(Center,"\pWhat color for the void?",&OGLData.VoidColor,&NewColor)) OGLData.VoidColor = NewColor; break; default: if (PassThruWall_CB.ToggleIfHit(ItemHit)) break; if (NeverActive_CB.ToggleIfHit(ItemHit)) break; if (OnWhenEntering_CB.ToggleIfHit(ItemHit)) break; if (VoidColorOnOff_CB.ToggleIfHit(ItemHit)) break; break; } } if (IsOK) { Data.Behind = New_Behind; Data.Upward = New_Upward; Data.Rightward = New_Rightward; SET_FLAG(Data.Flags,_ChaseCam_ThroughWalls,PassThruWall_CB.GetState()); SET_FLAG(Data.Flags,_ChaseCam_NeverActive,NeverActive_CB.GetState()); SET_FLAG(Data.Flags,_ChaseCam_OnWhenEntering,OnWhenEntering_CB.GetState()); SET_FLAG(OGLData.Flags,OGL_Flag_VoidColor,VoidColorOnOff_CB.GetState()); Data.Damping = New_Damping; Data.Spring = New_Spring; Data.Opacity = New_Opacity; } // Clean up #if USE_SHEETS HideSheetWindow(GetDialogWindow(Dialog)); #else HideWindow(GetDialogWindow(Dialog)); #endif DisposeDialog(Dialog); return IsOK; }