summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatermap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llfloatermap.cpp')
-rw-r--r--indra/newview/llfloatermap.cpp208
1 files changed, 166 insertions, 42 deletions
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 3b1e4c7ac7..d18f127f85 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -32,94 +32,218 @@
#include "llviewerprecompiledheaders.h"
+// self include
#include "llfloatermap.h"
+// Library includes
+#include "llfloaterreg.h"
+#include "llfontgl.h"
+#include "llglheaders.h"
+
+// Viewer includes
#include "llagent.h"
-#include "llcolorscheme.h"
#include "llviewercontrol.h"
-#include "lldraghandle.h"
#include "llnetmap.h"
-#include "llregionhandle.h"
-#include "llresizebar.h"
-#include "lluictrlfactory.h"
-
-LLFloaterMap::LLFloaterMap(const LLSD& key)
- :
- LLFloater(std::string("minimap")),
- mPanelMap(NULL)
+#include "lltracker.h"
+#include "llviewercamera.h"
+#include "lldraghandle.h"
+#include "lltextbox.h"
+#include "llviewermenu.h"
+
+//
+// Constants
+//
+const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f;
+
+//
+// Member functions
+//
+
+LLFloaterMap::LLFloaterMap(const LLSD& key)
+ : LLFloater(key),
+ mPopupMenu(NULL),
+ mTextBoxEast(NULL),
+ mTextBoxNorth(NULL),
+ mTextBoxWest(NULL),
+ mTextBoxSouth(NULL),
+ mTextBoxSouthEast(NULL),
+ mTextBoxNorthEast(NULL),
+ mTextBoxNorthWest(NULL),
+ mTextBoxSouthWest(NULL),
+ mMap(NULL)
{
- LLCallbackMap::map_t factory_map;
- factory_map["mini_mapview"] = LLCallbackMap(createPanelMiniMap, this);
- LLUICtrlFactory::getInstance()->buildFloater(this, "floater_mini_map.xml", &factory_map, FALSE);
+ //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_map.xml", FALSE);
}
-
-// static
-void* LLFloaterMap::createPanelMiniMap(void* data)
+LLFloaterMap::~LLFloaterMap()
{
- LLFloaterMap* self = (LLFloaterMap*)data;
- self->mPanelMap = new LLNetMap("Mapview");
- return self->mPanelMap;
}
BOOL LLFloaterMap::postBuild()
{
- // Send the drag handle to the back, but make sure close stays on top
+ mMap = getChild<LLNetMap>("Net Map");
+ mMap->setScale(gSavedSettings.getF32("MiniMapScale"));
+ mMap->setToolTipMsg(getString("ToolTipMsg"));
+ sendChildToBack(mMap);
+
+ mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");
+ mTextBoxEast = getChild<LLTextBox> ("floater_map_east");
+ mTextBoxWest = getChild<LLTextBox> ("floater_map_west");
+ mTextBoxSouth = getChild<LLTextBox> ("floater_map_south");
+ mTextBoxSouthEast = getChild<LLTextBox> ("floater_map_southeast");
+ mTextBoxNorthEast = getChild<LLTextBox> ("floater_map_northeast");
+ mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");
+ mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+
+ registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2));
+ registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2));
+
+ mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ if (mPopupMenu && !LLTracker::isTracking(0))
+ {
+ mPopupMenu->setItemEnabled ("Stop Tracking", false);
+ }
+
+ updateMinorDirections();
+
+ // Get the drag handle all the way in back
sendChildToBack(getDragHandle());
- sendChildToFront(getChild<LLButton>("llfloater_close_btn"));
+
setIsChrome(TRUE);
+
+ // keep onscreen
+ gFloaterView->adjustToFitScreen(this, FALSE);
+
return TRUE;
}
-
-LLFloaterMap::~LLFloaterMap()
+BOOL LLFloaterMap::handleDoubleClick( S32 x, S32 y, MASK mask )
{
+ LLFloaterReg::showInstance("world_map");
+ return TRUE;
}
+BOOL LLFloaterMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mPopupMenu)
+ {
+ mPopupMenu->buildDrawLabels();
+ mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, mPopupMenu, x, y);
+ }
+ return TRUE;
+}
-// virtual
-void LLFloaterMap::onOpen()
+void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
{
- gFloaterView->adjustToFitScreen(this, FALSE);
+ // Rotation is in radians.
+ // Rotation of 0 means x = 1, y = 0 on the unit circle.
- gSavedSettings.setBOOL("ShowMiniMap", TRUE);
-}
+ F32 map_half_height = (F32)(getRect().getHeight() / 2);
+ F32 map_half_width = (F32)(getRect().getWidth() / 2);
+ F32 text_half_height = (F32)(text_box->getRect().getHeight() / 2);
+ F32 text_half_width = (F32)(text_box->getRect().getWidth() / 2);
+ F32 radius = llmin( map_half_height - text_half_height, map_half_width - text_half_width );
+ // Inset by a little to account for position display.
+ radius -= 8.f;
-// virtual
-void LLFloaterMap::onClose(bool app_quitting)
-{
- LLFloater::setVisible(FALSE);
+ text_box->setOrigin(
+ llround(map_half_width - text_half_width + radius * cos( rotation )),
+ llround(map_half_height - text_half_height + radius * sin( rotation )) );
+}
- if (!app_quitting)
+void LLFloaterMap::updateMinorDirections()
+{
+ if (mTextBoxNorthEast == NULL)
{
- gSavedSettings.setBOOL("ShowMiniMap", FALSE);
+ return;
}
-}
-BOOL LLFloaterMap::canClose()
-{
- return !LLApp::isExiting();
-}
+ // Hide minor directions if they cover too much of the map
+ bool show_minors = mTextBoxNorthEast->getRect().getHeight() < MAP_MINOR_DIR_THRESHOLD *
+ llmin(getRect().getWidth(), getRect().getHeight());
+ mTextBoxNorthEast->setVisible(show_minors);
+ mTextBoxNorthWest->setVisible(show_minors);
+ mTextBoxSouthWest->setVisible(show_minors);
+ mTextBoxSouthEast->setVisible(show_minors);
+}
// virtual
void LLFloaterMap::draw()
{
+ F32 rotation = 0;
+
+ static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+ if( rotate_map )
+ {
+ // rotate subsequent draws to agent rotation
+ rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
+ }
+
+ setDirectionPos( mTextBoxEast, rotation );
+ setDirectionPos( mTextBoxNorth, rotation + F_PI_BY_TWO );
+ setDirectionPos( mTextBoxWest, rotation + F_PI );
+ setDirectionPos( mTextBoxSouth, rotation + F_PI + F_PI_BY_TWO );
+
+ setDirectionPos( mTextBoxNorthEast, rotation + F_PI_BY_TWO / 2);
+ setDirectionPos( mTextBoxNorthWest, rotation + F_PI_BY_TWO + F_PI_BY_TWO / 2);
+ setDirectionPos( mTextBoxSouthWest, rotation + F_PI + F_PI_BY_TWO / 2);
+ setDirectionPos( mTextBoxSouthEast, rotation + F_PI + F_PI_BY_TWO + F_PI_BY_TWO / 2);
+
// Note: we can't just gAgent.check cameraMouselook() because the transition states are wrong.
if( gAgent.cameraMouselook())
{
setMouseOpaque(FALSE);
getDragHandle()->setMouseOpaque(FALSE);
-
- drawChild(mPanelMap);
}
else
{
setMouseOpaque(TRUE);
getDragHandle()->setMouseOpaque(TRUE);
+ }
+
+ if (LLTracker::isTracking(0))
+ {
+ mPopupMenu->setItemEnabled ("Stop Tracking", true);
+ }
+
+ LLFloater::draw();
+}
+
+void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLFloater::reshape(width, height, called_from_parent);
+ updateMinorDirections();
+}
+
+void LLFloaterMap::handleZoom(const LLSD& userdata)
+{
+ std::string level = userdata.asString();
+
+ F32 scale = 0.0f;
+ if (level == std::string("close"))
+ scale = LLNetMap::MAP_SCALE_MAX;
+ else if (level == std::string("medium"))
+ scale = LLNetMap::MAP_SCALE_MID;
+ else if (level == std::string("far"))
+ scale = LLNetMap::MAP_SCALE_MIN;
+ if (scale != 0.0f)
+ {
+ gSavedSettings.setF32("MiniMapScale", scale );
+ mMap->setScale(scale);
+ }
+}
- LLFloater::draw();
+void LLFloaterMap::handleStopTracking (const LLSD& userdata)
+{
+ if (mPopupMenu)
+ {
+ mPopupMenu->setItemEnabled ("Stop Tracking", false);
+ LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
}
}