1
0
Fork 0

Make map widget zoom a real property, so it persists between opening and closing the dialog.

This commit is contained in:
James Turner 2011-09-18 12:53:40 +01:00
parent e1d5a52a3a
commit 66a3a7f164
3 changed files with 28 additions and 16 deletions

View file

@ -8,6 +8,7 @@
#include <algorithm> // for std::sort
#include <plib/puAux.h>
#include <simgear/sg_inlines.h>
#include <simgear/route/waypoint.hxx>
#include <simgear/sg_inlines.h>
#include <simgear/misc/strutils.hxx>
@ -383,7 +384,6 @@ MapWidget::MapWidget(int x, int y, int maxX, int maxY) :
_route = static_cast<FGRouteMgr*>(globals->get_subsystem("route-manager"));
_gps = fgGetNode("/instrumentation/gps");
_zoom = 6;
_width = maxX - x;
_height = maxY - y;
_hasPanned = false;
@ -402,6 +402,11 @@ MapWidget::~MapWidget()
void MapWidget::setProperty(SGPropertyNode_ptr prop)
{
_root = prop;
int zoom = _root->getBoolValue("zoom", -1);
if (zoom < 0) {
_root->setIntValue("zoom", 6); // default zoom
}
_root->setBoolValue("centre-on-aircraft", true);
_root->setBoolValue("draw-data", false);
_root->setBoolValue("magnetic-headings", true);
@ -501,24 +506,29 @@ void MapWidget::pan(const SGVec2d& delta)
_projectionCenter = unproject(-delta);
}
int MapWidget::zoom() const
{
int z = _root->getIntValue("zoom");
SG_CLAMP_RANGE(z, 0, MAX_ZOOM);
return z;
}
void MapWidget::zoomIn()
{
if (_zoom <= 0) {
if (zoom() <= 0) {
return;
}
--_zoom;
SG_LOG(SG_GENERAL, SG_INFO, "zoom is now:" << _zoom);
_root->setIntValue("zoom", zoom() - 1);
}
void MapWidget::zoomOut()
{
if (_zoom >= MAX_ZOOM) {
if (zoom() >= MAX_ZOOM) {
return;
}
++_zoom;
SG_LOG(SG_GENERAL, SG_INFO, "zoom is now:" << _zoom);
_root->setIntValue("zoom", zoom() + 1);
}
void MapWidget::draw(int dx, int dy)
@ -532,8 +542,7 @@ void MapWidget::draw(int dx, int dy)
_root->setBoolValue("centre-on-aircraft", false);
_hasPanned = false;
}
else
if (_root->getBoolValue("centre-on-aircraft")) {
else if (_root->getBoolValue("centre-on-aircraft")) {
_projectionCenter = _aircraft;
}
@ -547,6 +556,7 @@ void MapWidget::draw(int dx, int dy)
_upHeading = 0.0;
}
_cachedZoom = zoom();
SGGeod topLeft = unproject(SGVec2d(_width/2, _height/2));
// compute draw range, including a fudge factor for ILSs and other 'long'
// symbols
@ -1028,7 +1038,7 @@ void MapWidget::drawFix(FGFix* fix)
glColor3f(0.0, 0.0, 0.0);
circleAt(pos, 3, 6);
if (_zoom > SHOW_DETAIL_ZOOM) {
if (_cachedZoom > SHOW_DETAIL_ZOOM) {
return; // hide fix labels beyond a certain zoom level
}
@ -1126,7 +1136,7 @@ void MapWidget::drawAirport(FGAirport* apt)
// draw tower location
SGVec2d towerPos = project(apt->getTowerLocation());
if (_zoom <= SHOW_DETAIL_ZOOM) {
if (_cachedZoom <= SHOW_DETAIL_ZOOM) {
glColor3f(1.0, 1.0, 1.0);
glLineWidth(1.0);
@ -1152,7 +1162,7 @@ void MapWidget::drawAirport(FGAirport* apt)
d->setAnchor(towerPos);
}
if (_zoom > SHOW_DETAIL_ZOOM) {
if (_cachedZoom > SHOW_DETAIL_ZOOM) {
return;
}
@ -1318,7 +1328,7 @@ void MapWidget::drawTraffic()
return;
}
if (_zoom > SHOW_DETAIL_ZOOM) {
if (_cachedZoom > SHOW_DETAIL_ZOOM) {
return;
}
@ -1477,7 +1487,7 @@ SGGeod MapWidget::unproject(const SGVec2d& p) const
double MapWidget::currentScale() const
{
return 1.0 / pow(2.0, _zoom);
return 1.0 / pow(2.0, _cachedZoom);
}
void MapWidget::circleAt(const SGVec2d& center, int nSides, double r)

View file

@ -32,6 +32,8 @@ public:
void setProperty(SGPropertyNode_ptr prop);
private:
int zoom() const;
void handlePan(int x, int y);
void pan(const SGVec2d& delta);
@ -82,7 +84,7 @@ private:
void drawLegendBox(const SGVec2d& pos, const std::string& t);
int _width, _height;
int _zoom;
int _cachedZoom;
double _drawRangeNm;
double _upHeading; // true heading corresponding to +ve y-axis
bool _magneticHeadings;

View file

@ -961,7 +961,7 @@ FGDialog::setupObject (puObject *object, SGPropertyNode *props)
SGPropertyNode_ptr node = fgGetNode(propname, true);
if (type == "map") {
// mapWidget binds to a sub-tree of properties, and
// ignroes the puValue mechanism, so special case things here
// ignores the puValue mechanism, so special case things here
MapWidget* mw = static_cast<MapWidget*>(object);
mw->setProperty(node);
} else {