CelestiaSettings.mm
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:30k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. //  CelestiaSettings.mm
  3. //  celestia
  4. //
  5. //  Created by Hank Ramsey on Fri Oct 29 2004.
  6. //  Copyright (C) 2001-9, the Celestia Development Team
  7. //
  8. #import "CelestiaSettings.h"
  9. #import "NSString_ObjCPlusPlus.h"
  10. #import "CelestiaController.h"
  11. #import "CelestiaAppCore.h"
  12. #include "celestiacore.h"
  13. #include "celestia.h"
  14. #include "render.h"
  15. class MacOSXWatcher : public CelestiaWatcher
  16. {
  17.     private:
  18.         CelestiaSettings *control;
  19.     public:
  20.     
  21.         MacOSXWatcher(CelestiaCore* _appCore, CelestiaSettings* _control) : CelestiaWatcher(*_appCore), control(_control)
  22.         {};
  23.             
  24.     public:
  25.     void notifyChange(CelestiaCore* core, int i)
  26.     {
  27.         if ( 0 == i & (
  28.         CelestiaCore::LabelFlagsChanged 
  29.         | CelestiaCore::RenderFlagsChanged 
  30.         | CelestiaCore::VerbosityLevelChanged 
  31.         | CelestiaCore::TimeZoneChanged       
  32.         | CelestiaCore::AmbientLightChanged   
  33.         | CelestiaCore::FaintestChanged       
  34.         )) { return; } 
  35.         [control validateItems];
  36.     };
  37. };
  38. @implementation CelestiaSettings
  39.         static CelestiaCore *appCore;
  40. #define CS_DefaultsName @"Celestia-1.4.0"
  41. #define CS_NUM_PREV_VERSIONS 1
  42. #define CS_AppDefaults @"defaults"
  43. #define TAGDEF(tag,key) key, [NSNumber numberWithInt: tag], 
  44. static NSString *CS_PREV_VERSIONS[CS_NUM_PREV_VERSIONS] = {
  45.     @"Celestia-1.3.2"
  46. };
  47. CelestiaSettings* sharedInstance;
  48. +(CelestiaSettings*) shared
  49. {
  50.     // class method to get single shared instance
  51.     if (sharedInstance == nil) {
  52.         sharedInstance = [[CelestiaSettings alloc]init];
  53.     }
  54.     return sharedInstance;
  55. }
  56. static CelestiaController *control;
  57. static NSMutableDictionary* tagMap;
  58. -(CelestiaSettings*)init
  59. {
  60.     if (sharedInstance != nil) {
  61.         [[super init] release];
  62.         return sharedInstance;
  63.     }
  64.     self = [super init];
  65.     tagMap = [[ NSMutableDictionary dictionaryWithCapacity: 100 ] retain];
  66.     appCore = (CelestiaCore*) [[CelestiaAppCore sharedAppCore] appCore];
  67.     tagDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
  68. //        TAGDEF(101,@"time")
  69. //        TAGDEF(999,@"timeScale")
  70.         TAGDEF(300,@"fullScreenMode")
  71.         // render flags
  72.         TAGDEF(400,@"showStars")
  73.         TAGDEF(401,@"showPlanets")
  74.         TAGDEF(402,@"showGalaxies")
  75.         TAGDEF(430,@"showGlobulars")
  76.         TAGDEF(417,@"showNebulae")
  77.         TAGDEF(403,@"showDiagrams")
  78.         TAGDEF(413,@"showBoundaries")
  79.         TAGDEF(404,@"showCloudMaps")
  80.         TAGDEF(407,@"showNightMaps")
  81.         TAGDEF(408,@"showAtmospheres")
  82.         TAGDEF(415,@"showCometTails")
  83.         TAGDEF(416,@"showMarkers")
  84.         TAGDEF(405,@"showOrbits")
  85. // TAGDEF(999,@"showPartialTrajectories")
  86.         TAGDEF(409,@"showSmoothLines")
  87.         TAGDEF(410,@"showEclipseShadows")
  88.         TAGDEF(412,@"showRingShadows")
  89.         TAGDEF(419,@"showCloudShadows")
  90. //        TAGDEF(411,@"showStarsAsPoints")
  91.         TAGDEF(414,@"showAutoMag")
  92.         TAGDEF(406,@"showCelestialSphere")
  93.         TAGDEF(420,@"showEclipticGrid")
  94.         TAGDEF(421,@"showHorizonGrid")
  95.         TAGDEF(422,@"showGalacticGrid")
  96.         // object labels
  97.         TAGDEF(500,@"showStarLabels")
  98.         TAGDEF(501,@"showPlanetLabels")
  99.         TAGDEF(502,@"showMoonLabels")
  100.         TAGDEF(503,@"showConstellationLabels")
  101.         TAGDEF(504,@"showGalaxyLabels")
  102.         TAGDEF(514,@"showGlobularLabels")
  103.         TAGDEF(505,@"showAsteroidLabels")
  104.         TAGDEF(506,@"showSpacecraftLabels")
  105.         TAGDEF(507,@"showLocationLabels")
  106.         TAGDEF(508,@"showCometLabels")
  107.         TAGDEF(509,@"showNebulaLabels")
  108.         TAGDEF(510,@"showOpenClusterLabels")
  109.         TAGDEF(511,@"showLatinConstellationLabels")
  110.         TAGDEF(512,@"showDwarfPlanetLabels")
  111.         TAGDEF(513,@"showMinorMoonLabels")
  112.         // popups
  113.         TAGDEF(600,@"altSurface")
  114.         TAGDEF(610,@"hudDetail")
  115.         TAGDEF(620,@"starStyle")
  116.         TAGDEF(630,@"renderPath")
  117.         TAGDEF(640,@"resolution")
  118.         TAGDEF(650,@"timeZone")
  119.         TAGDEF(660,@"dateFormat")
  120.         // orbits
  121. //        TAGDEF(999,@"minimumOrbitSize")
  122.         TAGDEF(700,@"showPlanetOrbits")
  123.         TAGDEF(701,@"showMoonOrbits")
  124.         TAGDEF(702,@"showAsteroidOrbits")
  125.         TAGDEF(704,@"showSpacecraftOrbits")
  126.         TAGDEF(703,@"showCometOrbits")
  127.         TAGDEF(705,@"showStellarOrbits")
  128.         TAGDEF(706,@"showDwarfPlanetOrbits")
  129.         TAGDEF(707,@"showMinorMoonOrbits")
  130.         // feature labels
  131.         TAGDEF(903,@"minimumFeatureSize")
  132.         TAGDEF(800,@"showCityLabels")
  133.         TAGDEF(801,@"showObservatoryLabels")
  134.         TAGDEF(802,@"showLandingSiteLabels")
  135.         TAGDEF(803,@"showCraterLabels")
  136.         TAGDEF(804,@"showVallisLabels")
  137.         TAGDEF(805,@"showMonsLabels")
  138.         TAGDEF(806,@"showPlanumLabels")
  139.         TAGDEF(807,@"showChasmaLabels")
  140.         TAGDEF(808,@"showPateraLabels")
  141.         TAGDEF(809,@"showMareLabels")
  142.         TAGDEF(810,@"showRupesLabels")
  143.         TAGDEF(811,@"showTesseraLabels")
  144.         TAGDEF(812,@"showRegioLabels")
  145.         TAGDEF(813,@"showChaosLabels")
  146.         TAGDEF(814,@"showTerraLabels")
  147.         TAGDEF(815,@"showAstrumLabels")
  148.         TAGDEF(816,@"showCoronaLabels")
  149.         TAGDEF(817,@"showDorsumLabels")
  150.         TAGDEF(818,@"showFossaLabels")
  151.         TAGDEF(819,@"showCatenaLabels")
  152.         TAGDEF(820,@"showMensaLabels")
  153.         TAGDEF(821,@"showRimaLabels")
  154.         TAGDEF(822,@"showUndaeLabels")
  155.         TAGDEF(824,@"showReticulumLabels")
  156.         TAGDEF(825,@"showPlanitiaLabels")
  157.         TAGDEF(826,@"showLineaLabels")
  158.         TAGDEF(827,@"showFluctusLabels")
  159.         TAGDEF(828,@"showFarrumLabels")
  160.         TAGDEF(829,@"showEruptiveCenterLabels")
  161.         TAGDEF(831,@"showOtherLabels")
  162.         // stars
  163. //        TAGDEF(999,@"distanceLimit")
  164.         TAGDEF(900,@"ambientLightLevel")
  165. //        TAGDEF(901,@"brightnessBias")
  166.         TAGDEF(902,@"faintestVisible")
  167.         TAGDEF(904,@"galaxyBrightness")
  168. //        TAGDEF(999,@"saturationMagnitude")
  169.         nil];
  170.     keyArray = [[tagDict allValues] retain];
  171.     NSDictionary *volatileTagDict = [NSDictionary dictionaryWithObjectsAndKeys:
  172.         TAGDEF(1000,@"showBodyAxes")
  173.         TAGDEF(1001,@"showFrameAxes")
  174.         TAGDEF(1002,@"showSunDirection")
  175.         TAGDEF(1003,@"showVelocityVector")
  176.         TAGDEF(1004,@"showPlanetographicGrid")
  177.         TAGDEF(1005,@"showTerminator")
  178.         nil];
  179.     [tagDict addEntriesFromDictionary: volatileTagDict];
  180.     return self;
  181. }
  182. -(void) setControl: (id) _control
  183. {
  184.     control = _control;
  185. }
  186. - (NSDictionary *) defaultsDictionary
  187. {
  188. NSMutableDictionary* theDictionary = [NSMutableDictionary dictionaryWithCapacity: [keyArray count]];
  189. NSEnumerator* keys = [ keyArray objectEnumerator];
  190.         id key;
  191. while ( nil != (key = [keys nextObject]) )
  192. {
  193. //                NSLog([NSString stringWithFormat: @"default dict entry %@ %@", key, [self valueForKey: key]]);
  194. [ theDictionary setObject: [self valueForKey: key] forKey: key];
  195. }
  196. return theDictionary;
  197. }
  198. -(NSDictionary*) findUserDefaults
  199. {
  200. NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
  201.     NSDictionary *appDefaults = [self findAppDefaults];
  202. NSDictionary* dict = [defs objectForKey: CS_DefaultsName ];
  203.     if (dict == nil )
  204.     {
  205.         // Scan for older versions
  206.         int i = 0;
  207.         for (; i < CS_NUM_PREV_VERSIONS; ++i)
  208.         {
  209.             if ((dict = [defs objectForKey:CS_PREV_VERSIONS[i]]))
  210.                 break;
  211.         }
  212.         if (dict)
  213.         {
  214.             [self upgradeUserDefaults: dict fromVersion: CS_PREV_VERSIONS[i]];
  215.         }
  216.         else
  217.         {
  218.             dict = appDefaults;
  219.         }
  220.     }
  221.     if (appDefaults)
  222.         [defs registerDefaults: [NSDictionary dictionaryWithObject: appDefaults forKey: CS_DefaultsName]];
  223.     return dict;
  224. }
  225. -(NSDictionary *) findAppDefaults
  226. {
  227.     NSDictionary *appDefaults = nil;
  228.     NSString *appDefaultsFile = [[NSBundle mainBundle] pathForResource:CS_AppDefaults ofType:@"plist"];
  229.     if (appDefaultsFile)
  230.     {
  231.         appDefaults = [NSDictionary dictionaryWithContentsOfFile: appDefaultsFile];
  232.     }
  233.     return appDefaults ? [appDefaults objectForKey: CS_DefaultsName] : nil;
  234. }
  235. -(void) loadUserDefaults 
  236. {
  237. id key;
  238. NSDictionary* defaultsDictionary = [self findUserDefaults ];
  239. if ( defaultsDictionary == nil ) return;
  240. NSEnumerator* keys = [ defaultsDictionary keyEnumerator];
  241. while ( nil != (key = [keys nextObject]) )
  242. {
  243. #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
  244. [self setValue: [defaultsDictionary objectForKey: key] forKey: key];
  245. #else
  246. [self takeValue: [defaultsDictionary objectForKey: key] forKey: key];
  247. #endif
  248. }
  249. }
  250. -(void) loadAppDefaults
  251. {
  252.     NSUserDefaults *userDefaults = nil;
  253.     NSDictionary *appDefaults = [self findAppDefaults];
  254.     if (appDefaults)
  255.     {
  256.         // Replace previous settings with defaults, but
  257.         // preserves favorites
  258.         userDefaults = [NSUserDefaults standardUserDefaults];
  259.         [userDefaults setObject: appDefaults forKey: CS_DefaultsName];
  260.         [userDefaults synchronize];
  261.         [self loadUserDefaults];
  262.     }
  263. }
  264. -(void) storeUserDefaults 
  265. {
  266. //        NSLog(@"storing user defaults");
  267. NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
  268. [defs setObject: [self defaultsDictionary] forKey: CS_DefaultsName];
  269. [defs synchronize];
  270. //        NSLog(@"stored user defaults");
  271. }
  272. -(void) upgradeUserDefaults: (NSDictionary *)dict fromVersion: (NSString *)old
  273. {
  274.     NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
  275.     [defs setObject: dict forKey: CS_DefaultsName];
  276.     [defs removeObjectForKey: old];
  277.     [defs synchronize];
  278. }
  279. -(id) valueForTag: (int) tag { 
  280.     return [self valueForKey: [tagDict objectForKey: [NSNumber numberWithInt: tag] ] ];
  281. }
  282. -(void) takeValue: (id) value forTag: (int) tag 
  283. {
  284.     id key = [tagDict objectForKey: [NSNumber numberWithInt: tag] ];
  285.     if (key!= nil)
  286.     {
  287. #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
  288.         [self setValue: value forKey: key ];
  289. #else
  290.         [self takeValue: value forKey: key ];
  291. #endif
  292.     }
  293. }
  294. #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
  295. - (id)valueForUndefinedKey: (NSString *) key
  296. {
  297. #ifdef DEBUG
  298.     if ( key ) NSLog(@"unbound value for %@", key);
  299. #endif
  300.     return nil;
  301. }
  302. - (void)setValue: (id) value forUndefinedKey: (NSString *) key
  303. {
  304. #ifdef DEBUG
  305.     NSLog(@"unbound key set for %@", key);
  306. #endif
  307. }
  308. - (void)setNilValueForKey: (NSString *) key
  309. {
  310. #ifdef DEBUG
  311.     NSLog(@"nil value for %@", key);
  312. #endif
  313. }
  314. #else
  315. -(id)handleQueryWithUnboundKey: (NSString*) key
  316. {
  317. #ifdef DEBUG
  318.     if ( key ) NSLog(@"unbound key query for %@", key);
  319. #endif
  320.     return nil;
  321. }
  322. -(void)handleTakeValue: (id) value forUnboundKey: (NSString*) key
  323. {
  324. #ifdef DEBUG
  325.     NSLog(@"unbound key set for %@", key);
  326. #endif
  327. }
  328. -(void)unableToSetNilForKey: (NSString*) key
  329. {
  330. #ifdef DEBUG
  331.     NSLog(@"nil key for %@", key);
  332. #endif
  333. }
  334. #endif
  335. // Time Settings
  336. -(double) time { return appCore->getSimulation()->getTime(); }
  337. -(void) setTime: (double) value { appCore->getSimulation()->setTime(value); }
  338. -(double) timeScale { return appCore->getSimulation()->getTimeScale(); }
  339. -(void) setTimeScale: (double) value { appCore->getSimulation()->setTimeScale(value); }
  340. -(BOOL) synchTime { return appCore->getSimulation()->getSyncTime(); }
  341. -(void) setSynchTime: (BOOL) value { appCore->getSimulation()->setSyncTime(value); }
  342. // Gaze Settings
  343. -(float) fieldOfView { return appCore->getSimulation()->getObserver().getFOV(); }
  344. -(void)  setFieldOfView: (float) value { appCore->getSimulation()->getObserver().setFOV(value); }
  345. // Observer Settings
  346. // Cruise Settings
  347. // Velocity
  348. // AngularVelocity
  349. -(int) setValue: (BOOL) value forBit: (int) bit inSet: (int) set
  350. {
  351.     int result = value
  352.         ? ((bit&set) ? set : (set|bit) )
  353.         : ((bit&set) ?  (set^bit) : set);
  354. //    NSLog([NSString stringWithFormat: @"setValue %d forBit: %d inSet: %d = %d",value,bit,set,result]);
  355. //    NSLog([NSString stringWithFormat: @"bit was: %d bit is: %d ",(set&bit),(result&bit)]);
  356.     return result;
  357. }
  358. // Visibility Settings
  359. #define RENDERMETHODS(flag)  -(BOOL) show##flag { return (appCore->getRenderer()->getRenderFlags()&Renderer::Show##flag) != 0; } -(void) setShow##flag: (BOOL) value  { appCore->getRenderer()->setRenderFlags( [self setValue: value forBit: Renderer::Show##flag inSet: appCore->getRenderer()->getRenderFlags() ] ); } 
  360. RENDERMETHODS(Stars)
  361. RENDERMETHODS(Planets)
  362. RENDERMETHODS(Galaxies)
  363. RENDERMETHODS(Globulars)
  364. RENDERMETHODS(Nebulae)
  365. RENDERMETHODS(OpenClusters)
  366. RENDERMETHODS(Diagrams)
  367. RENDERMETHODS(Boundaries)
  368. RENDERMETHODS(CloudMaps)
  369. RENDERMETHODS(NightMaps)
  370. RENDERMETHODS(Atmospheres)
  371. RENDERMETHODS(CometTails)
  372. RENDERMETHODS(Markers)
  373. RENDERMETHODS(Orbits)
  374. RENDERMETHODS(PartialTrajectories)
  375. RENDERMETHODS(SmoothLines)
  376. RENDERMETHODS(EclipseShadows)
  377. RENDERMETHODS(RingShadows)
  378. RENDERMETHODS(CloudShadows)
  379. RENDERMETHODS(AutoMag)
  380. RENDERMETHODS(CelestialSphere)
  381. RENDERMETHODS(EclipticGrid)
  382. RENDERMETHODS(HorizonGrid)
  383. RENDERMETHODS(GalacticGrid)
  384. // Label Settings
  385. #define LABELMETHODS(flag)  -(BOOL) show##flag##Labels { return (appCore->getRenderer()->getLabelMode()&Renderer::flag##Labels) != 0; } -(void) setShow##flag##Labels : (BOOL) value  { appCore->getRenderer()->setLabelMode( [self setValue: value forBit: Renderer::flag##Labels inSet: appCore->getRenderer()->getLabelMode()] ); } 
  386. LABELMETHODS(Star)
  387. LABELMETHODS(Planet)
  388. LABELMETHODS(Moon)
  389. LABELMETHODS(Constellation)
  390. LABELMETHODS(Galaxy)
  391. LABELMETHODS(Globular)
  392. LABELMETHODS(Nebula)
  393. LABELMETHODS(OpenCluster)
  394. LABELMETHODS(Asteroid)
  395. LABELMETHODS(Spacecraft)
  396. LABELMETHODS(Location)
  397. LABELMETHODS(Comet)
  398. LABELMETHODS(DwarfPlanet)
  399. LABELMETHODS(MinorMoon)
  400. -(BOOL) showLatinConstellationLabels {
  401.     return (appCore->getRenderer()->getLabelMode() & Renderer::I18nConstellationLabels) == 0;
  402. }
  403. -(void) setShowLatinConstellationLabels : (BOOL) value {
  404.     appCore->getRenderer()->setLabelMode( [self setValue: (!value) forBit:  Renderer::I18nConstellationLabels inSet: appCore->getRenderer()->getLabelMode()] );
  405. }
  406. // Orbit Settings
  407. #define ORBITMETHODS(flag)  -(BOOL) show##flag##Orbits { return (appCore->getRenderer()->getOrbitMask()&Body::flag) != 0; } -(void) setShow##flag##Orbits: (BOOL) value  { appCore->getRenderer()->setOrbitMask([self setValue: value forBit: Body::flag inSet: appCore->getRenderer()->getOrbitMask()]); } 
  408. ORBITMETHODS(Planet)
  409. ORBITMETHODS(Moon)
  410. ORBITMETHODS(Asteroid)
  411. ORBITMETHODS(Spacecraft)
  412. ORBITMETHODS(Comet)
  413. ORBITMETHODS(Stellar)
  414. ORBITMETHODS(DwarfPlanet)
  415. ORBITMETHODS(MinorMoon)
  416. -(float) minimumOrbitSize { return appCore->getRenderer()->getMinimumOrbitSize(); }
  417. -(void)  setMinimumOrbitSize: (float) value { appCore->getRenderer()->setMinimumOrbitSize(value); }
  418. // Feature Settings
  419. #define FEATUREMETHODS(flag)  -(BOOL) show##flag##Labels { return (appCore->getSimulation()->getObserver().getLocationFilter()&Location::flag) != 0; } -(void) setShow##flag##Labels: (BOOL) value  { appCore->getSimulation()->getObserver().setLocationFilter([self setValue: value forBit: Location::flag inSet: appCore->getSimulation()->getObserver().getLocationFilter()]); } 
  420. FEATUREMETHODS(City)
  421. FEATUREMETHODS(Observatory)
  422. FEATUREMETHODS(LandingSite)
  423. FEATUREMETHODS(Crater)
  424. FEATUREMETHODS(Vallis)
  425. FEATUREMETHODS(Mons)
  426. FEATUREMETHODS(Planum)
  427. FEATUREMETHODS(Chasma)
  428. FEATUREMETHODS(Patera)
  429. FEATUREMETHODS(Mare)
  430. FEATUREMETHODS(Rupes)
  431. FEATUREMETHODS(Tessera)
  432. FEATUREMETHODS(Regio)
  433. FEATUREMETHODS(Chaos)
  434. FEATUREMETHODS(Terra)
  435. FEATUREMETHODS(Astrum)
  436. FEATUREMETHODS(Corona)
  437. FEATUREMETHODS(Dorsum)
  438. FEATUREMETHODS(Fossa)
  439. FEATUREMETHODS(Catena)
  440. FEATUREMETHODS(Mensa)
  441. FEATUREMETHODS(Rima)
  442. FEATUREMETHODS(Undae)
  443. FEATUREMETHODS(Reticulum)
  444. FEATUREMETHODS(Planitia)
  445. FEATUREMETHODS(Linea)
  446. FEATUREMETHODS(Fluctus)
  447. FEATUREMETHODS(Farrum)
  448. FEATUREMETHODS(EruptiveCenter)
  449. FEATUREMETHODS(Other)
  450. -(float) minimumFeatureSize { return appCore->getRenderer()->getMinimumFeatureSize(); }
  451. -(void)  setMinimumFeatureSize: (float) value { appCore->getRenderer()->setMinimumFeatureSize(value); }
  452. // Refmark Settings
  453. -(BOOL) showBodyAxes
  454. {
  455.     return appCore->referenceMarkEnabled("body axes");
  456. }
  457. -(void) setShowBodyAxes: (BOOL) value
  458. {
  459.     appCore->toggleReferenceMark("body axes");
  460. }
  461. -(BOOL) showFrameAxes
  462. {
  463.     return appCore->referenceMarkEnabled("frame axes");
  464. }
  465. -(void) setShowFrameAxes: (BOOL) value
  466. {
  467.     appCore->toggleReferenceMark("frame axes");
  468. }
  469. -(BOOL) showSunDirection
  470. {
  471.     return appCore->referenceMarkEnabled("sun direction");
  472. }
  473. -(void) setShowSunDirection: (BOOL) value
  474. {
  475.     appCore->toggleReferenceMark("sun direction");
  476. }
  477. -(BOOL) showVelocityVector
  478. {
  479.     return appCore->referenceMarkEnabled("velocity vector");
  480. }
  481. -(void) setShowVelocityVector: (BOOL) value
  482. {
  483.     appCore->toggleReferenceMark("velocity vector");
  484. }
  485. -(BOOL) showPlanetographicGrid
  486. {
  487.     return appCore->referenceMarkEnabled("planetographic grid");
  488. }
  489. -(void) setShowPlanetographicGrid: (BOOL) value
  490. {
  491.     appCore->toggleReferenceMark("planetographic grid");
  492. }
  493. -(BOOL) showTerminator
  494. {
  495.     return appCore->referenceMarkEnabled("terminator");
  496. }
  497. -(void) setShowTerminator: (BOOL) value
  498. {
  499.     appCore->toggleReferenceMark("terminator");
  500. }
  501. // Lighting Settings
  502. -(float) ambientLightLevel { return appCore->getRenderer()->getAmbientLightLevel(); }
  503. -(void)  setAmbientLightLevel: (float) value { appCore->getRenderer()->setAmbientLightLevel(value); }
  504. -(float) galaxyBrightness { return Galaxy::getLightGain(); }
  505. -(void)  setGalaxyBrightness: (float) value { Galaxy::setLightGain(value); }
  506. // Star Settings
  507. -(float) distanceLimit { return appCore->getRenderer()->getDistanceLimit(); }
  508. -(void)  setDistanceLimit: (float) value { appCore->getRenderer()->setDistanceLimit(value); }
  509. -(float) faintestVisible 
  510. //    return appCore->getSimulation()->getFaintestVisible(); 
  511.     if ((appCore->getRenderer()->getRenderFlags() & Renderer::ShowAutoMag) == 0)
  512.     {
  513.         return appCore->getSimulation()->getFaintestVisible();
  514.     }
  515.     else
  516.     {
  517.         return appCore->getRenderer()->getFaintestAM45deg();
  518.     }                
  519. }
  520. -(void)  setFaintestVisible: (float) value 
  521. {
  522.     if ((appCore->getRenderer()->getRenderFlags() & Renderer::ShowAutoMag) == 0)
  523.     {
  524.         appCore->setFaintest(value);
  525.     }
  526.     else
  527.     {
  528.         appCore->getRenderer()->setFaintestAM45deg(value);
  529.         appCore->setFaintestAutoMag();
  530.     }                
  531. }
  532. -(int)  starStyle { return appCore->getRenderer()->getStarStyle(); }
  533. -(void) setStarStyle: (int) value { appCore->getRenderer()->setStarStyle((Renderer::StarStyle)value); }
  534. // Texture Settings
  535. -(int)  resolution { return appCore->getRenderer()->getResolution(); }
  536. -(void) setResolution: (int) value { appCore->getRenderer()->setResolution(value); }
  537. // Overlay Settings
  538. -(int)  hudDetail { return appCore->getHudDetail(); }
  539. -(void) setHudDetail: (int) value { appCore->setHudDetail(value); }
  540. // Time settings
  541. // Timezone values are inverted to maintain backward compatibility
  542. -(int)  timeZone { return appCore->getTimeZoneBias()==0 ? 1 : 0; }
  543. -(void) setTimeZone: (int) value
  544. {
  545.     appCore->setTimeZoneBias(0==value ? 1 : 0);
  546. }
  547. -(int)  dateFormat { return appCore->getDateFormat(); }
  548. -(void) setDateFormat: (int) value { appCore->setDateFormat((astro::Date::Format)value); }
  549. // Other Settings
  550. -(int)  renderPath { return appCore->getRenderer()->getGLContext()->getRenderPath(); }
  551. -(void) setRenderPath: (int) value { appCore->getRenderer()->getGLContext()->setRenderPath((GLContext::GLRenderPath)value); }
  552. -(int)  fullScreenMode { return [[control valueForKey: @"isFullScreen"] intValue]; }
  553. -(void) setFullScreenMode: (int) value
  554. {
  555. #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
  556.     [control setValue: [NSNumber numberWithBool: (value != 0)] forKey: @"isFullScreen"];
  557. #else
  558.     [control takeValue: [NSNumber numberWithBool: (value != 0)] forKey: @"isFullScreen"];
  559. #endif
  560. }
  561. // Alt Surface Setting
  562. - (int) altSurface
  563. {
  564.     // return alternate surface index
  565.     string displayedSurfName = appCore->getSimulation()->getActiveObserver()->getDisplayedSurface();
  566.     CelestiaSelection *sel = [[[CelestiaAppCore sharedAppCore] simulation] selection];
  567.     if ([sel body])
  568.     {
  569.         NSArray *surfaces = [[sel body] alternateSurfaceNames];
  570.         if ( surfaces && [surfaces count] > 0 )
  571.         {
  572.             NSString *displayedSurfStr = [NSString stringWithStdString: displayedSurfName];
  573.             unsigned index = [surfaces indexOfObject: displayedSurfStr];
  574.             if (index != NSNotFound)
  575.                 return index+1;
  576.         }
  577.     }
  578.     return 0;
  579. }
  580. - (void) setAltSurface: (int) index
  581. {
  582.     // Handle the alternate surface submenu
  583.     CelestiaSelection *sel = [[[CelestiaAppCore sharedAppCore] simulation] selection];
  584.     if ([sel body])
  585.     {
  586.         if ( index == 0 )
  587.         {
  588.             appCore->getSimulation()->getActiveObserver()->setDisplayedSurface(string(""));
  589.             return;
  590.         }
  591.         NSArray *surfaces = [[sel body] alternateSurfaceNames];
  592.         if ( surfaces && [surfaces count] > 0 )
  593.         {
  594.             string surfName;
  595.             index--;
  596.             if (index >= 0 && (unsigned)index < [surfaces count])
  597.                 surfName = [[surfaces objectAtIndex: index] stdString];
  598.             appCore->getSimulation()->getActiveObserver()->setDisplayedSurface(surfName);
  599.         }
  600.     }
  601. }
  602. // GUI Tag Methods ----------------------------------------------------------
  603. - (void) selectPopUpButtonItem: (id) item withIndex: (int) index
  604. {
  605.     id item2 = [ tagMap objectForKey: [NSNumber numberWithInt: ([item tag]-index) ]];
  606.     if ([item2 isKindOfClass: [NSPopUpButton class]])
  607.     {
  608.         int popUpIndex = [item2 indexOfItemWithTag: [item tag]];
  609.         if (popUpIndex >= 0)
  610.             [item2 selectItemAtIndex: popUpIndex];
  611.     }
  612. }
  613. - (void) actionForItem: (id) item
  614. {
  615.     int tag = [item tag];
  616.     id value;
  617.     if ( tag <= 128 ) tag = [self tagForKey: tag ]; // handle menu item for setting; obsolete?
  618.     if ( tag <= 128 ) { appCore->charEntered(tag); return; }
  619.     switch ( tag/100)
  620.     {
  621.         case 4: case 5: case 7: case 8: case 10: // 400, 500, 700, 800, 1000
  622.             [self takeValue: [NSNumber numberWithInt: (1-[[self valueForTag: tag] intValue])] forTag: tag ];
  623.         break;
  624.         case 6: // 600
  625.             value = [NSNumber numberWithInt: tag%10 ];
  626.             [self takeValue: value forTag: (tag/10)*10 ];
  627.             [self selectPopUpButtonItem: item withIndex: tag%10];
  628.             //[self setPopUpButtonWithTag: ((tag/10)*10) toIndex: [value intValue]];
  629.             if ([[tagDict objectForKey:[NSNumber numberWithInt:((tag/10)*10)]] isEqualToString: @"renderPath"])
  630.             {
  631.                 value = [self valueForTag: (tag/10)*10];
  632.                 if ([value intValue] != (tag%10))
  633.                     [[control valueForKey:@"renderPanelController"] performSelector:@selector(displayRenderPathWarning:) withObject:[item title]];
  634.                 else
  635.                     [[control valueForKey:@"renderPanelController"] performSelector:@selector(hideRenderPathWarning)];
  636.             }
  637.         break;
  638.         case 9: // 900
  639.             [self takeValue: [NSNumber numberWithFloat: [item floatValue]] forTag: tag];
  640.         break;
  641.     }
  642. }
  643. - (BOOL) validateButton: (id) item atIndex: (int) index withValue: (int) value 
  644. {
  645.     if ( (index==0) && [item isKindOfClass: [NSPopUpButton class] ] )
  646.     {
  647.         NSEnumerator* items = [ [item itemArray] objectEnumerator ];
  648.         id menuItem;
  649.         while (menuItem = [items nextObject])
  650.         {
  651.             if ( [menuItem tag] == ([item tag]+value) )
  652.             {
  653.                 [item selectItem: menuItem];
  654.                 break;
  655.             }
  656.         }
  657.     }
  658.     else
  659.         [item setState:  (value == index) ? NSOnState: NSOffState ];
  660.     return YES;
  661. }
  662. - (BOOL) validateItem: (id) item
  663. {
  664.     int tag = [item tag];
  665.     if ( tag <= 128 ) tag = [self tagForKey: tag ];
  666.     if ( tag == 32 ) 
  667.     {
  668. //        [item setState:  (fabs(appCore->getSimulation()->getTimeScale()) == 0.0 ) ? NSOnState : NSOffState ]; 
  669.     }
  670.     else if ( tag <= 128 ) 
  671.     {
  672.         [item setState: NSOffState ];
  673.     }
  674.     else 
  675.     {
  676.         switch ( tag/100)
  677.         {
  678. case 4: case 5: case 7: case 8: case 10:
  679. // 400s, 500s, 700s, 800s, 1000s (checkboxes)
  680.             [item setState: [[self valueForTag: tag] intValue] ? NSOnState : NSOffState ];
  681. break;
  682. case 6:
  683. // 600s (popups)
  684.             if ( tag >= 600 && tag < 610 ) // altSurface menu
  685.             {
  686.                 int index = tag-600;
  687.                 [item setState:  ([self altSurface] == index ) ? NSOnState: NSOffState ];            
  688.             } 
  689.             else
  690.                 [self validateButton: item atIndex: tag%10 withValue: [[self valueForTag: tag-(tag%10)] intValue] ];
  691. break;
  692. case 9:
  693. // 900s (floats)
  694.             [item setFloatValue: [[self valueForTag: tag] floatValue] ];                
  695. break;
  696.         }
  697.     }
  698.     return YES;
  699. }
  700. - (void) defineKeyForItem: (id) item
  701. {
  702.     int tag = [item tag];
  703.     if ( tag != 0 )
  704.     {
  705.         NSNumber* itemKey = [NSNumber numberWithInt: tag ];
  706.         if ( [ tagMap objectForKey: itemKey ] == 0 )
  707.         {
  708.             [tagMap setObject: item forKey: itemKey];
  709.         }
  710.     }
  711. }
  712. - (int) tagForKey: (int) key
  713. {
  714.     int tag;
  715.     switch (key)
  716.     {
  717.             case 112: tag = 501; break;  // LabelPlanets
  718.             case 109: tag = 502; break;  // LabelMoons
  719.             case 119: tag = 505; break;  // LabelAsteroids
  720.             case  98: tag = 500; break;  // LabelStars
  721.             case 101: tag = 504; break;  // LabelGalaxies
  722.             case 110: tag = 506; break;  // LabelSpacecraft
  723.             case  87: tag = 508; break;  // LabelComets
  724.             case  61: tag = 503; break;  // LabelConstellations
  725.             case 105: tag = 404; break;  // CloudMaps
  726.             case   1: tag = 408; break;  // Atmospheres
  727.             case  12: tag = 407; break;  // NightMaps
  728.             case   5: tag = 410; break;  // EclipseShadows
  729.             case 111: tag = 405; break;  // Orbits
  730.             case 117: tag = 402; break;  // Galaxies
  731.             case  47: tag = 403; break;  // Diagrams
  732.             case   2: tag = 413; break;  // Boundaries
  733.             case  59: tag = 406; break;  // CelestialSphere
  734.             case  25: tag = 414; break;  // AutoMag
  735.             case  20: tag = 415; break;  // CometTails
  736.             case  11: tag = 416; break;  // Markers
  737. //            case  19: tag = 411; break;  // StarsAsPoints
  738.             case  24: tag = 409; break;  // SmoothLines
  739.             default : tag = key; break; // Special or not a setting
  740.     }
  741.     return tag;
  742. }
  743. - (void) validateItemForTag: (int) tag
  744. {
  745.     if ( tag <= 128 ) tag = [self tagForKey: tag ];
  746.     id item = [ tagMap objectForKey: [NSNumber numberWithInt: tag ]];
  747.     if ( [item isKindOfClass: [NSMenuItem class]] ) return; // auto-validated
  748.     if ( item != 0 )
  749.     {
  750.         [ self validateItem: item ];
  751.     }
  752. }
  753. - (void) validateItems
  754. {
  755.     id obj;
  756.     NSEnumerator* enumerator = [[tagMap allKeys] objectEnumerator];
  757.     while ((obj = [enumerator nextObject]) != nil)
  758.     {
  759.         [self validateItemForTag: [obj intValue]];
  760.     }
  761. }
  762. - (BOOL)     validateMenuItem: (id) item
  763. {
  764. //    if ( [startupCondition condition] == 0 ) return NO;
  765.     if ( [item tag] == 0 )
  766.     {
  767.         return [item isEnabled];
  768.     }
  769.     else
  770.     {
  771.         return [self validateItem: item ];
  772.     }
  773. }
  774. - (IBAction) activateMenuItem: (id) item
  775. {
  776.     int tag = [item tag];
  777.     if ( tag != 0 )
  778.     {
  779.         if ( tag < 0 ) // simulate key press and hold
  780.         {
  781.             [control keyPress: -tag hold: 2];
  782.         } 
  783.         else 
  784.         {
  785.             [self actionForItem: item ];
  786.         }
  787.         [self validateItemForTag: tag];
  788.     }
  789. }
  790. - (IBAction) activateSwitchButton: (id) item
  791. {
  792.     int tag = [item tag];
  793.     if ( tag != 0 )
  794.     {
  795.         [self actionForItem: item];
  796.         [control forceDisplay]; 
  797.     }
  798. }
  799. - (IBAction) activateMatrixButton: (id) item
  800. {
  801.     item = [item selectedCell];
  802.     int tag = [item tag];
  803.     if ( tag != 0 )
  804.     {
  805.         [self actionForItem: item];
  806.     }
  807. }
  808. - (void) scanForKeys: (id) item
  809. {
  810. //    NSLog(@"scanning item %@n", [item description]);
  811.     if ( [item isKindOfClass: [NSTabViewItem class]] )
  812.     {
  813. //  NSLog(@"scanning viewitemn");
  814.         item = [item view];
  815.         [ self scanForKeys: item ];
  816.         return;
  817.     }
  818.     if ([item isKindOfClass: [NSMenuItem class]] && [item tag] != 0)
  819.         {
  820. //  NSLog(@"scanning menuItemn");
  821.             [self defineKeyForItem: item];
  822.             [item setTarget: self];
  823.             [item setAction: @selector(activateMenuItem:)];
  824.             return; 
  825.         }
  826.     else if ([item isKindOfClass: [NSSlider class]] && [item tag] != 0)
  827.         {
  828. //            NSLog(@"scanning celln");
  829.             [self defineKeyForItem: item];
  830.             [item setTarget: self];
  831.             [item setAction: @selector(activateSwitchButton:)];
  832.             return; 
  833.         }
  834.     if ( [item isKindOfClass: [NSTabView class]] )
  835.     {
  836. //  NSLog(@"scanning tabviewn");
  837.         item = [ [item tabViewItems] objectEnumerator ];
  838.     }
  839.     else if ( [item isKindOfClass: [NSPopUpButton class]] )
  840.     {
  841.         [self defineKeyForItem: item];
  842. //  NSLog(@"scanning popupbuttonn");
  843.         item = [ [item itemArray] objectEnumerator ];
  844.     }
  845.     else if ([item isKindOfClass: [NSControl class]] && [item tag] != 0)
  846.         {
  847. //  NSLog(@"scanning controln");
  848.             [self defineKeyForItem: item];
  849.             [item setTarget: self];
  850.             [item setAction: @selector(activateSwitchButton:)];
  851.             return; 
  852.         }
  853.     else if ( [item isKindOfClass: [NSMatrix class]] )
  854.     {
  855. //  NSLog(@"scanning matrixn");
  856.         item = [ [item cells] objectEnumerator ];
  857.     }
  858.     else if ( [item isKindOfClass: [NSView class]] )
  859.     {
  860. //  NSLog(@"scanning viewn");
  861. //        NSLog(@"subviews items = %@n", [item subviews]);
  862.         item = [ [item subviews] objectEnumerator ];
  863. //        NSLog(@"view items = %@n", item);
  864.     }
  865.     if ( [item isKindOfClass: [NSEnumerator class] ] )
  866.     {
  867. //  NSLog(@"scanning arrayn");
  868.         id subitem;
  869.         while(subitem = [item nextObject])
  870.         {
  871. //            NSLog(@"scanning array  itemn");
  872.             [ self scanForKeys: subitem ];
  873.         }
  874.         return;
  875.     }
  876.     if ([item isKindOfClass: [NSCell class]] && [item tag] != 0)
  877.         {
  878. //  NSLog(@"scanning celln");
  879.             [self defineKeyForItem: item];
  880.             [item setTarget: self];
  881.             [item setAction: @selector(activateMatrixButton:)];
  882.             return; 
  883.         }
  884.     if ( [item isKindOfClass: [NSWindow class]] )
  885.     {
  886. //        NSLog(@"scanning windown");
  887.         item = [item contentView ];
  888.         [ self scanForKeys: item ];
  889.         return;
  890.     }
  891. }
  892. @end