Created CelestiaWatcher class for synchronizing CelestiaCore and UI state.

ver1_5_1
Chris Laurel 2002-03-27 04:41:23 +00:00
parent a09d8264c4
commit bdb5c65932
4 changed files with 111 additions and 12 deletions

View File

@ -20,6 +20,7 @@
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cassert>
#include <celengine/gl.h>
#include <celmath/vecmath.h>
#include <celmath/quaternion.h>
@ -51,6 +52,12 @@ static const float KeyRotationAccel = degToRad(120.0f);
static const float RotationBraking = 10.0f;
static const float RotationDecay = 2.0f;
enum
{
LabelFlags = 1,
RenderFlags = 2
};
static void warning(string s)
{
@ -517,6 +524,7 @@ void CelestiaCore::charEntered(char c)
{
case '\001': // Ctrl+A
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowAtmospheres);
notifyWatchers(RenderFlags);
break;
case '\n':
@ -526,10 +534,12 @@ void CelestiaCore::charEntered(char c)
case '\014': // Ctrl+L
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowNightMaps);
notifyWatchers(RenderFlags);
break;
case '\005': // Ctrl+E
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowEclipseShadows);
notifyWatchers(RenderFlags);
break;
case '\020': // Ctrl+P
@ -539,6 +549,7 @@ void CelestiaCore::charEntered(char c)
case '\023': // Ctrl+S
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowStarsAsPoints);
notifyWatchers(RenderFlags);
break;
case '\026': // Ctrl+V
@ -553,6 +564,7 @@ void CelestiaCore::charEntered(char c)
case '\030': // Ctrl+X
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowSmoothLines);
notifyWatchers(RenderFlags);
break;
case '\033': // Escape
@ -608,6 +620,7 @@ void CelestiaCore::charEntered(char c)
case '/':
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowDiagrams);
notifyWatchers(RenderFlags);
break;
case '0':
@ -628,14 +641,17 @@ void CelestiaCore::charEntered(char c)
case ';':
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowCelestialSphere);
notifyWatchers(RenderFlags);
break;
case '=':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::ConstellationLabels);
notifyWatchers(LabelFlags);
break;
case 'B':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::StarLabels);
notifyWatchers(LabelFlags);
break;
case 'C':
@ -649,6 +665,7 @@ void CelestiaCore::charEntered(char c)
case 'E':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::GalaxyLabels);
notifyWatchers(LabelFlags);
break;
case 'F':
@ -665,6 +682,7 @@ void CelestiaCore::charEntered(char c)
case 'I':
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowCloudMaps);
notifyWatchers(RenderFlags);
break;
case 'J':
@ -681,18 +699,22 @@ void CelestiaCore::charEntered(char c)
case 'M':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::MoonLabels);
notifyWatchers(LabelFlags);
break;
case 'N':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::SpacecraftLabels);
notifyWatchers(LabelFlags);
break;
case 'O':
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowOrbits);
notifyWatchers(RenderFlags);
break;
case 'P':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::PlanetLabels);
notifyWatchers(LabelFlags);
break;
case 'Q':
@ -719,6 +741,7 @@ void CelestiaCore::charEntered(char c)
case 'U':
renderer->setRenderFlags(renderer->getRenderFlags() ^ Renderer::ShowGalaxies);
notifyWatchers(RenderFlags);
break;
case 'V':
@ -727,6 +750,7 @@ void CelestiaCore::charEntered(char c)
case 'W':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::AsteroidLabels);
notifyWatchers(LabelFlags);
break;
case 'X':
@ -1846,3 +1870,51 @@ bool CelestiaCore::isRecording()
{
return recording;
}
void CelestiaCore::addWatcher(CelestiaWatcher* watcher)
{
assert(watcher != NULL);
watchers.insert(watchers.end(), watcher);
}
void CelestiaCore::removeWatcher(CelestiaWatcher* watcher)
{
vector<CelestiaWatcher*>::iterator iter =
find(watchers.begin(), watchers.end(), watcher);
if (iter != watchers.end())
watchers.erase(iter);
}
void CelestiaCore::notifyWatchers(int property)
{
for (vector<CelestiaWatcher*>::iterator iter = watchers.begin();
iter != watchers.end(); iter++)
{
if (property == RenderFlags)
(*iter)->renderFlagsChanged();
else if (property == LabelFlags)
(*iter)->labelFlagsChanged();
}
}
CelestiaWatcher::CelestiaWatcher(CelestiaCore* _appCore) :
appCore(_appCore)
{
if (appCore != NULL)
appCore->addWatcher(this);
}
CelestiaWatcher::~CelestiaWatcher()
{
if (appCore != NULL)
appCore->removeWatcher(this);
}
void CelestiaWatcher::renderFlagsChanged()
{
}
void CelestiaWatcher::labelFlagsChanged()
{
}

View File

@ -26,6 +26,8 @@
#include "moviecapture.h"
class CelestiaWatcher;
class CelestiaCore
{
public:
@ -150,6 +152,9 @@ class CelestiaCore
void setContextMenuCallback(ContextMenuFunc);
void addWatcher(CelestiaWatcher*);
void removeWatcher(CelestiaWatcher*);
class Alerter
{
public:
@ -164,6 +169,7 @@ class CelestiaCore
void setFaintest(float);
void renderOverlay();
void fatalError(const std::string&);
void notifyWatchers(int);
private:
CelestiaConfig* config;
@ -229,6 +235,21 @@ class CelestiaCore
Texture* logoTexture;
Alerter* alerter;
std::vector<CelestiaWatcher*> watchers;
};
class CelestiaWatcher
{
public:
CelestiaWatcher(CelestiaCore* _appCore);
virtual ~CelestiaWatcher();
virtual void renderFlagsChanged();
virtual void labelFlagsChanged();
private:
CelestiaCore* appCore;
};
#endif // _CELESTIACORE_H_

View File

@ -41,9 +41,6 @@ static BOOL APIENTRY ViewOptionsProc(HWND hDlg,
//Set dialog controls to reflect current label and render modes
Dlg->SetControls(hDlg);
//Start timer to maintain button states
SetTimer(hDlg, 1, 500, NULL);
return(TRUE);
}
break;
@ -106,7 +103,6 @@ static BOOL APIENTRY ViewOptionsProc(HWND hDlg,
{
if (Dlg != NULL && Dlg->parent != NULL)
{
KillTimer(hDlg, 1);
SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
reinterpret_cast<LPARAM>(Dlg));
}
@ -117,9 +113,7 @@ static BOOL APIENTRY ViewOptionsProc(HWND hDlg,
{
if (Dlg != NULL && Dlg->parent != NULL)
{
KillTimer(hDlg, 1);
//Reset render flags, label mode, and hud detail to initial values
// Reset render flags, label mode, and hud detail to initial values
Dlg->RestoreSettings(hDlg);
SendMessage(Dlg->parent, WM_COMMAND, IDCLOSE,
@ -130,10 +124,6 @@ static BOOL APIENTRY ViewOptionsProc(HWND hDlg,
}
break;
}
case WM_TIMER:
if((Dlg != NULL) && (Dlg->parent != NULL) && (wParam == 1))
Dlg->SetControls(hDlg);
break;
case WM_DESTROY:
if (Dlg != NULL && Dlg->parent != NULL)
@ -151,6 +141,7 @@ static BOOL APIENTRY ViewOptionsProc(HWND hDlg,
ViewOptionsDialog::ViewOptionsDialog(HINSTANCE appInstance,
HWND _parent,
CelestiaCore* _appCore) :
CelestiaWatcher(_appCore),
appCore(_appCore),
parent(_parent)
{
@ -215,3 +206,15 @@ void ViewOptionsDialog::RestoreSettings(HWND hDlg)
appCore->getRenderer()->setLabelMode(initialLabelMode);
appCore->setHudDetail(initialHudDetail);
}
void ViewOptionsDialog::renderFlagsChanged()
{
if (parent != NULL)
SetControls(hwnd);
}
void ViewOptionsDialog::labelFlagsChanged()
{
if (parent != NULL)
SetControls(hwnd);
}

View File

@ -14,7 +14,7 @@
#include "celestiacore.h"
class ViewOptionsDialog
class ViewOptionsDialog : public CelestiaWatcher
{
public:
ViewOptionsDialog(HINSTANCE, HWND, CelestiaCore*);
@ -22,6 +22,9 @@ class ViewOptionsDialog
void SetControls(HWND);
void RestoreSettings(HWND);
virtual void renderFlagsChanged();
virtual void labelFlagsChanged();
public:
CelestiaCore* appCore;
HWND parent;