summaryrefslogtreecommitdiff
path: root/indra/newview/lltoolview.cpp
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/newview/lltoolview.cpp
Print done when done.
Diffstat (limited to 'indra/newview/lltoolview.cpp')
-rw-r--r--indra/newview/lltoolview.cpp175
1 files changed, 175 insertions, 0 deletions
diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp
new file mode 100644
index 0000000000..49e5896ab7
--- /dev/null
+++ b/indra/newview/lltoolview.cpp
@@ -0,0 +1,175 @@
+/**
+ * @file lltoolview.cpp
+ * @brief A UI contains for tool palette tools
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltoolview.h"
+
+#include "llfontgl.h"
+#include "llrect.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llpanel.h"
+#include "lltool.h"
+#include "lltoolmgr.h"
+#include "lltextbox.h"
+#include "llresmgr.h"
+
+
+LLToolContainer::LLToolContainer(LLToolView* parent)
+: mParent(parent),
+ mButton(NULL),
+ mPanel(NULL),
+ mTool(NULL)
+{ }
+
+
+LLToolContainer::~LLToolContainer()
+{
+ // mParent is a pointer to the tool view
+ // mButton is owned by the tool view
+ // mPanel is owned by the tool view
+ delete mTool;
+ mTool = NULL;
+}
+
+
+LLToolView::LLToolView(const std::string& name, const LLRect& rect)
+: LLView(name, rect, MOUSE_OPAQUE),
+ mButtonCount(0)
+{
+}
+
+
+LLToolView::~LLToolView()
+{
+ mContainList.deleteAllData();
+}
+
+//XUI: translate
+void LLToolView::addTool(const LLString& icon_off, const LLString& icon_on, LLPanel* panel, LLTool* tool, LLView* hoverView, const char* label)
+{
+ llassert(tool);
+
+ LLToolContainer* contain = new LLToolContainer(this);
+
+ LLRect btn_rect = getButtonRect(mButtonCount);
+
+ contain->mButton = new LLButton("ToolBtn",
+ btn_rect,
+ icon_off,
+ icon_on,
+ "",
+ &LLToolView::onClickToolButton,
+ contain,
+ LLFontGL::sSansSerif);
+
+ contain->mPanel = panel;
+ contain->mTool = tool;
+
+ addChild(contain->mButton);
+ mButtonCount++;
+
+ const S32 LABEL_TOP_SPACING = 0;
+ const LLFontGL* font = gResMgr->getRes( LLFONT_SANSSERIF_SMALL );
+ S32 label_width = font->getWidth( label );
+ LLRect label_rect;
+ label_rect.setLeftTopAndSize(
+ btn_rect.mLeft + btn_rect.getWidth() / 2 - label_width / 2,
+ btn_rect.mBottom - LABEL_TOP_SPACING,
+ label_width,
+ llfloor(font->getLineHeight()));
+ addChild( new LLTextBox( "tool label", label_rect, label, font ) );
+
+ // Can optionally ignore panel
+ if (contain->mPanel)
+ {
+ contain->mPanel->setBackgroundVisible( FALSE );
+ contain->mPanel->setBorderVisible( FALSE );
+ addChild(contain->mPanel);
+ }
+
+ mContainList.addData(contain);
+}
+
+
+LLRect LLToolView::getButtonRect(S32 button_index)
+{
+ const S32 HPAD = 7;
+ const S32 VPAD = 7;
+ const S32 TOOL_SIZE = 32;
+ const S32 HORIZ_SPACING = TOOL_SIZE + 5;
+ const S32 VERT_SPACING = TOOL_SIZE + 14;
+
+ S32 tools_per_row = mRect.getWidth() / HORIZ_SPACING;
+
+ S32 row = button_index / tools_per_row;
+ S32 column = button_index % tools_per_row;
+
+ // Build the rectangle, recalling the origin is at lower left
+ // and we want the icons to build down from the top.
+ LLRect rect;
+ rect.setLeftTopAndSize( HPAD + (column * HORIZ_SPACING),
+ -VPAD + getRect().getHeight() - (row * VERT_SPACING),
+ TOOL_SIZE,
+ TOOL_SIZE
+ );
+
+ return rect;
+}
+
+
+void LLToolView::draw()
+{
+ // turn off highlighting for all containers
+ // and hide all option panels except for the selected one.
+ LLTool* selected = gCurrentToolset->getSelectedTool();
+ for( LLToolContainer* contain = mContainList.getFirstData();
+ contain != NULL;
+ contain = mContainList.getNextData()
+ )
+ {
+ BOOL state = (contain->mTool == selected);
+ contain->mButton->setToggleState( state );
+ if (contain->mPanel)
+ {
+ contain->mPanel->setVisible( state );
+ }
+ }
+
+ // Draw children normally
+ LLView::draw();
+}
+
+// protected
+LLToolContainer* LLToolView::findToolContainer( LLTool *tool )
+{
+ // Find the container for this tool
+ llassert( tool );
+ for( LLToolContainer* contain = mContainList.getFirstData(); contain; contain = mContainList.getNextData() )
+ {
+ if( contain->mTool == tool )
+ {
+ return contain;
+ }
+ }
+ llerrs << "LLToolView::findToolContainer - tool not found" << llendl;
+ return NULL;
+}
+
+// static
+void LLToolView::onClickToolButton(void* userdata)
+{
+ LLToolContainer* clicked = (LLToolContainer*) userdata;
+
+ // Switch to this one
+ gCurrentToolset->selectTool( clicked->mTool );
+ gToolMgr->useSelectedTool( gCurrentToolset );
+}
+