Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

winviewoptsdlg.cpp

Go to the documentation of this file.
00001 // winviewoptsdlg.cpp
00002 // 
00003 // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
00004 //
00005 // View Options dialog for Windows.
00006 //
00007 // This program is free software; you can redistribute it and/or
00008 // modify it under the terms of the GNU General Public License
00009 // as published by the Free Software Foundation; either version 2
00010 // of the License, or (at your option) any later version.
00011 
00012 #include <windows.h>
00013 #include <commctrl.h>
00014 #include "winviewoptsdlg.h"
00015 #include "..\celengine\render.h"
00016 
00017 #include "res/resource.h"
00018 
00019 using namespace std;
00020 
00021 static const int DistanceSliderRange = 10000;
00022 static const float MinDistanceLimit = 1.0f;
00023 static const float MaxDistanceLimit = 1.0e6f;
00024 
00025 static BOOL APIENTRY ViewOptionsProc(HWND hDlg,
00026                                      UINT message,
00027                                      UINT wParam,
00028                                      LONG lParam)
00029 {
00030     ViewOptionsDialog* Dlg = reinterpret_cast<ViewOptionsDialog*>(GetWindowLong(hDlg, DWL_USER));
00031 
00032     switch (message)
00033     {
00034     case WM_INITDIALOG:
00035         {
00036             ViewOptionsDialog* Dlg = reinterpret_cast<ViewOptionsDialog*>(lParam);
00037             if (Dlg == NULL)
00038                 return EndDialog(hDlg, 0);
00039             SetWindowLong(hDlg, DWL_USER, lParam);
00040 
00041             //Read labelMode, renderFlags and hud detail
00042             Dlg->initialRenderFlags = Dlg->appCore->getRenderer()->getRenderFlags();
00043             Dlg->initialLabelMode = Dlg->appCore->getRenderer()->getLabelMode();
00044             Dlg->initialHudDetail = Dlg->appCore->getHudDetail();
00045 
00046             //Set dialog controls to reflect current label and render modes
00047             Dlg->SetControls(hDlg);
00048 
00049             return(TRUE);
00050         }
00051         break;
00052 
00053     case WM_COMMAND:
00054     {
00055         Renderer* renderer = Dlg->appCore->getRenderer();
00056         uint32 renderFlags = renderer->getRenderFlags();
00057         uint32 labelMode = renderer->getLabelMode();
00058         uint32 orbitMask = renderer->getOrbitMask();
00059 
00060         switch (LOWORD(wParam))
00061         {
00062         case IDC_SHOWATMOSPHERES:
00063             renderer->setRenderFlags(renderFlags ^ Renderer::ShowAtmospheres);
00064             break;
00065         case IDC_SHOWCELESTIALGRID:
00066             renderer->setRenderFlags(renderFlags ^ Renderer::ShowCelestialSphere);
00067             break;
00068         case IDC_SHOWCLOUDS:
00069             renderer->setRenderFlags(renderFlags ^ Renderer::ShowCloudMaps);
00070             break;
00071         case IDC_SHOWCONSTELLATIONS:
00072             renderer->setRenderFlags(renderFlags ^ Renderer::ShowDiagrams);
00073             break;
00074         case IDC_SHOWECLIPSESHADOWS:
00075             renderer->setRenderFlags(renderFlags ^ Renderer::ShowEclipseShadows);
00076             break;
00077         case IDC_SHOWGALAXIES:
00078             renderer->setRenderFlags(renderFlags ^ Renderer::ShowGalaxies);
00079             break;
00080         case IDC_SHOWNEBULAE:
00081             renderer->setRenderFlags(renderFlags ^ Renderer::ShowNebulae);
00082             break;
00083         case IDC_SHOWNIGHTSIDELIGHTS:
00084             renderer->setRenderFlags(renderFlags ^ Renderer::ShowNightMaps);
00085             break;
00086         case IDC_SHOWORBITS:
00087             renderer->setRenderFlags(renderFlags ^ Renderer::ShowOrbits);
00088             break;
00089         case IDC_PLANETORBITS:
00090             renderer->setOrbitMask(orbitMask ^ Body::Planet);
00091             break;
00092         case IDC_MOONORBITS:
00093             renderer->setOrbitMask(orbitMask ^ Body::Moon);
00094             break;
00095         case IDC_ASTEROIDORBITS:
00096             renderer->setOrbitMask(orbitMask ^ Body::Asteroid);
00097             break;
00098         case IDC_COMETORBITS:
00099             renderer->setOrbitMask(orbitMask ^ Body::Comet);
00100             break;
00101         case IDC_SPACECRAFTORBITS:
00102             renderer->setOrbitMask(orbitMask ^ Body::Spacecraft);
00103             break;
00104         case IDC_SHOWPLANETS:
00105             renderer->setRenderFlags(renderFlags ^ Renderer::ShowPlanets);
00106             break;
00107         case IDC_SHOWSTARS:
00108             renderer->setRenderFlags(renderFlags ^ Renderer::ShowStars);
00109             break;
00110         case IDC_SHOWCONSTELLATIONBORDERS:
00111             renderer->setRenderFlags(renderFlags ^ Renderer::ShowBoundaries);
00112             break;
00113         case IDC_SHOWRINGSHADOWS:
00114             renderer->setRenderFlags(renderFlags ^ Renderer::ShowRingShadows);
00115             break;
00116         case IDC_SHOWCOMETTAILS:
00117             renderer->setRenderFlags(renderFlags ^ Renderer::ShowCometTails);
00118             break;
00119         case IDC_SHOWMARKERS:
00120             renderer->setRenderFlags(renderFlags ^ Renderer::ShowMarkers);
00121             break;
00122         case IDC_LABELCONSTELLATIONS:
00123             renderer->setLabelMode(labelMode ^ Renderer::ConstellationLabels);
00124             break;
00125         case IDC_LABELGALAXIES:
00126             renderer->setLabelMode(labelMode ^ Renderer::GalaxyLabels);
00127             break;
00128                 case IDC_LABELNEBULAE:
00129                         renderer->setLabelMode(labelMode ^ Renderer::NebulaLabels);
00130                         break;
00131                 case IDC_LABELOPENCLUSTERS:
00132                         renderer->setLabelMode(labelMode ^ Renderer::OpenClusterLabels);
00133                         break;
00134         case IDC_LABELPLANETS:
00135             renderer->setLabelMode(labelMode ^ Renderer::PlanetLabels);
00136             break;
00137         case IDC_LABELMOONS:
00138             renderer->setLabelMode(labelMode ^ Renderer::MoonLabels);
00139             break;
00140         case IDC_LABELSTARS:
00141             renderer->setLabelMode(labelMode ^ Renderer::StarLabels);
00142             break;
00143         case IDC_LABELASTEROIDS:
00144             renderer->setLabelMode(labelMode ^ Renderer::AsteroidLabels);
00145             break;
00146         case IDC_LABELCOMETS:
00147             renderer->setLabelMode(labelMode ^ Renderer::CometLabels);
00148             break;
00149         case IDC_LABELSPACECRAFT:
00150             renderer->setLabelMode(labelMode ^ Renderer::SpacecraftLabels);
00151             break;
00152         case IDC_INFOTEXT0:
00153             Dlg->appCore->setHudDetail(0);
00154             break;
00155         case IDC_INFOTEXT1:
00156             Dlg->appCore->setHudDetail(1);
00157             break;
00158         case IDC_INFOTEXT2:
00159             Dlg->appCore->setHudDetail(2);
00160             break;
00161         case IDOK:
00162             if (Dlg != NULL && Dlg->parent != NULL)
00163             {
00164                 SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
00165                             reinterpret_cast<LPARAM>(Dlg));
00166             }
00167             EndDialog(hDlg, 0);
00168             return TRUE;
00169         case IDCANCEL:
00170             if (Dlg != NULL && Dlg->parent != NULL)
00171             {
00172                 // Reset render flags, label mode, and hud detail to
00173                 // initial values
00174                 Dlg->RestoreSettings(hDlg);
00175                 SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
00176                             reinterpret_cast<LPARAM>(Dlg));
00177             }
00178             EndDialog(hDlg, 0);
00179             return TRUE;
00180         }
00181         break;
00182     }
00183 
00184     case WM_DESTROY:
00185         if (Dlg != NULL && Dlg->parent != NULL)
00186         {
00187             SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
00188                         reinterpret_cast<LPARAM>(Dlg));
00189         }
00190         return TRUE;
00191 
00192     case WM_HSCROLL:
00193         {
00194             WORD sbValue = LOWORD(wParam);
00195             switch (sbValue)
00196             {
00197             case SB_THUMBTRACK:
00198                 // case SB_ENDSCROLL:
00199                 {
00200                     char val[16];
00201                     HWND hwnd = GetDlgItem(hDlg, IDC_EDIT_FILTER_DISTANCE);
00202                     float logDistanceLimit = (float) HIWORD(wParam) /
00203                         (float) DistanceSliderRange;
00204                     float distanceLimit = (float) pow(MaxDistanceLimit, 
00205                                                  logDistanceLimit);
00206                     sprintf(val, "%d", (int) distanceLimit);
00207                     SetWindowText(hwnd, val);
00208                     Dlg->appCore->getRenderer()->setDistanceLimit(distanceLimit);
00209                     break;
00210                 }
00211 
00212             default:
00213                 cout << "Slider msg: " << sbValue << '\n';
00214                 break;
00215 #if 0
00216             case SB_THUMBPOSITION:
00217                 {
00218                     browser->nStars = (int)HIWORD(wParam);
00219                     RefreshItems(hDlg, browser);
00220                     break;
00221                 }
00222 #endif
00223             }
00224         }
00225     }
00226 
00227     return FALSE;
00228 }
00229 
00230 
00231 ViewOptionsDialog::ViewOptionsDialog(HINSTANCE appInstance,
00232                                      HWND _parent,
00233                                      CelestiaCore* _appCore) :
00234     CelestiaWatcher(*_appCore),
00235     appCore(_appCore),
00236     parent(_parent)
00237 {
00238     hwnd = CreateDialogParam(appInstance,
00239                              MAKEINTRESOURCE(IDD_VIEWOPTIONS),
00240                              parent,
00241                              ViewOptionsProc,
00242                              reinterpret_cast<LONG>(this));
00243 }
00244 
00245 
00246 static void dlgCheck(HWND hDlg, WORD item, uint32 flags, uint32 f)
00247 {
00248     SendDlgItemMessage(hDlg, item, BM_SETCHECK,
00249                        ((flags & f) != 0) ? BST_CHECKED : BST_UNCHECKED, 0);
00250 }
00251 
00252 void ViewOptionsDialog::SetControls(HWND hDlg)
00253 {
00254     int renderFlags = appCore->getRenderer()->getRenderFlags();
00255     int labelMode = appCore->getRenderer()->getLabelMode();
00256     int hudDetail = appCore->getHudDetail();
00257     int orbitMask = appCore->getRenderer()->getOrbitMask();
00258 
00259     //Set checkboxes and radiobuttons
00260     SendDlgItemMessage(hDlg, IDC_SHOWATMOSPHERES, BM_SETCHECK,
00261         (renderFlags & Renderer::ShowAtmospheres)? BST_CHECKED:BST_UNCHECKED, 0);
00262     SendDlgItemMessage(hDlg, IDC_SHOWCELESTIALGRID, BM_SETCHECK,
00263         (renderFlags & Renderer::ShowCelestialSphere)? BST_CHECKED:BST_UNCHECKED, 0);
00264     SendDlgItemMessage(hDlg, IDC_SHOWCLOUDS, BM_SETCHECK,
00265         (renderFlags & Renderer::ShowCloudMaps)? BST_CHECKED:BST_UNCHECKED, 0);
00266     SendDlgItemMessage(hDlg, IDC_SHOWCONSTELLATIONS, BM_SETCHECK,
00267         (renderFlags & Renderer::ShowDiagrams)? BST_CHECKED:BST_UNCHECKED, 0);
00268     SendDlgItemMessage(hDlg, IDC_SHOWECLIPSESHADOWS, BM_SETCHECK,
00269         (renderFlags & Renderer::ShowEclipseShadows)? BST_CHECKED:BST_UNCHECKED, 0);
00270     SendDlgItemMessage(hDlg, IDC_SHOWGALAXIES, BM_SETCHECK,
00271         (renderFlags & Renderer::ShowGalaxies)? BST_CHECKED:BST_UNCHECKED, 0);
00272     SendDlgItemMessage(hDlg, IDC_SHOWNEBULAE, BM_SETCHECK,
00273         (renderFlags & Renderer::ShowNebulae)? BST_CHECKED:BST_UNCHECKED, 0);
00274     SendDlgItemMessage(hDlg, IDC_SHOWNIGHTSIDELIGHTS, BM_SETCHECK,
00275         (renderFlags & Renderer::ShowNightMaps)? BST_CHECKED:BST_UNCHECKED, 0);
00276     dlgCheck(hDlg, IDC_SHOWORBITS,       renderFlags, Renderer::ShowOrbits);
00277     dlgCheck(hDlg, IDC_PLANETORBITS,     orbitMask,   Body::Planet);
00278     dlgCheck(hDlg, IDC_MOONORBITS,       orbitMask,   Body::Moon);
00279     dlgCheck(hDlg, IDC_ASTEROIDORBITS,   orbitMask,   Body::Asteroid);
00280     dlgCheck(hDlg, IDC_COMETORBITS,      orbitMask,   Body::Comet);
00281     dlgCheck(hDlg, IDC_SPACECRAFTORBITS, orbitMask,   Body::Spacecraft);
00282     SendDlgItemMessage(hDlg, IDC_SHOWPLANETS, BM_SETCHECK,
00283         (renderFlags & Renderer::ShowPlanets)? BST_CHECKED:BST_UNCHECKED, 0);
00284     SendDlgItemMessage(hDlg, IDC_SHOWSTARS, BM_SETCHECK,
00285         (renderFlags & Renderer::ShowStars)? BST_CHECKED:BST_UNCHECKED, 0);
00286     SendDlgItemMessage(hDlg, IDC_SHOWCONSTELLATIONBORDERS, BM_SETCHECK,
00287         (renderFlags & Renderer::ShowBoundaries)? BST_CHECKED:BST_UNCHECKED, 0);
00288     SendDlgItemMessage(hDlg, IDC_SHOWRINGSHADOWS, BM_SETCHECK,
00289         (renderFlags & Renderer::ShowRingShadows)? BST_CHECKED:BST_UNCHECKED, 0);
00290     SendDlgItemMessage(hDlg, IDC_SHOWCOMETTAILS, BM_SETCHECK,
00291         (renderFlags & Renderer::ShowCometTails)? BST_CHECKED:BST_UNCHECKED, 0);
00292     SendDlgItemMessage(hDlg, IDC_SHOWMARKERS, BM_SETCHECK,
00293         (renderFlags & Renderer::ShowMarkers)? BST_CHECKED:BST_UNCHECKED, 0);
00294 
00295     dlgCheck(hDlg, IDC_LABELCONSTELLATIONS, labelMode, Renderer::ConstellationLabels);
00296     dlgCheck(hDlg, IDC_LABELGALAXIES,   labelMode, Renderer::GalaxyLabels);
00297         dlgCheck(hDlg, IDC_LABELNEBULAE,    labelMode, Renderer::NebulaLabels);
00298         dlgCheck(hDlg, IDC_LABELOPENCLUSTERS, labelMode, Renderer::OpenClusterLabels);
00299     dlgCheck(hDlg, IDC_LABELSTARS,      labelMode, Renderer::StarLabels);
00300     dlgCheck(hDlg, IDC_LABELPLANETS,    labelMode, Renderer::PlanetLabels);
00301     dlgCheck(hDlg, IDC_LABELMOONS,      labelMode, Renderer::MoonLabels);
00302     dlgCheck(hDlg, IDC_LABELASTEROIDS,  labelMode, Renderer::AsteroidLabels);
00303     dlgCheck(hDlg, IDC_LABELCOMETS,     labelMode, Renderer::CometLabels);
00304     dlgCheck(hDlg, IDC_LABELSPACECRAFT, labelMode, Renderer::SpacecraftLabels);
00305 
00306     CheckRadioButton(hDlg, IDC_INFOTEXT0, IDC_INFOTEXT2, IDC_INFOTEXT0 + hudDetail);
00307 
00308     // Set up distance slider
00309     SendDlgItemMessage(hDlg,
00310                        IDC_SLIDER_FILTER_DISTANCE,
00311                        TBM_SETRANGE,
00312                        (WPARAM)TRUE,
00313                        (LPARAM) MAKELONG(0, DistanceSliderRange));
00314     float distanceLimit = appCore->getRenderer()->getDistanceLimit();
00315     float logDistanceLimit = (float) (log(distanceLimit) / 
00316                                       log(MaxDistanceLimit));
00317     SendDlgItemMessage(hDlg,
00318                        IDC_SLIDER_FILTER_DISTANCE,
00319                        TBM_SETPOS,
00320                        (WPARAM) TRUE,
00321                        (LPARAM) (logDistanceLimit * DistanceSliderRange));
00322 
00323     char val[16];
00324     HWND hwnd = GetDlgItem(hDlg, IDC_EDIT_FILTER_DISTANCE);
00325     sprintf(val, "%d", (int) distanceLimit);
00326     SetWindowText(hwnd, val);
00327 }
00328 
00329 
00330 void ViewOptionsDialog::RestoreSettings(HWND hDlg)
00331 {
00332     appCore->getRenderer()->setRenderFlags(initialRenderFlags);
00333     appCore->getRenderer()->setLabelMode(initialLabelMode);
00334     appCore->setHudDetail(initialHudDetail);
00335 }
00336 
00337 void ViewOptionsDialog::notifyChange(CelestiaCore*, int)
00338 {
00339     if (parent != NULL)
00340         SetControls(hwnd);
00341 }

Generated on Sat Jan 14 22:30:32 2006 for Celestia by  doxygen 1.4.1