Changes: Adds LLUICtrlFactory::getBuiltFloater() to return LLFloater* when a floater has been built. In llviewermenu.cpp's LLShowFloater::handleEvent(): Return early if the floater_name is empty, otherwise if no anticipated floater is found, build one, unless one of the same name is already built, then bring it to focus. Documentation: In order to add simple codeless floaters, a general understanding of our XMLs is necessary... A simple codeless floater can be a few things, perhaps not limited to: media browsers, settings controls, and holders for inventory_panels. So how do you make them conform to the codeless standard? For the purpose of these examples, my floater file will always be floater_name.xml Let's start with a shortened xml menu entry: <menu_item_call label="Name!" name="name"> <on_click function="ShowFloater" userdata="floater_name.xml"/> </menu_item_call> Alright, that wasn't so hard, just remember the key in this is ShowFloater is the function and userdata is the filename. The next part is the actual floater, which isn't so different from making a complex floater.. There are two ways to do this, depending upon desired behavior: The first behavior is to have only one of the floater open at a time, the following short xml exemplifies this: <floater name="floater_name.xml" title="Name!"/> Having a floater with this behavior will cause the menu entry to bring it into focus. The other behavior is to allow more than one of the floater open at a time: <floater name="name" title="Name!"/> In this case, the menu entry will spawn a new version of the floater with every click, regardless of previous ones existing. Granted, these short <floater/>'s probably aren't but examples and will not likely stand alone.
116 lines
4.2 KiB
C++
116 lines
4.2 KiB
C++
/**
|
|
* @file lluictrlfactory.h
|
|
* @brief Factory class for creating UI controls
|
|
*
|
|
* $LicenseInfo:firstyear=2003&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2003-2009, Linden Research, Inc.
|
|
*
|
|
* Second Life Viewer Source Code
|
|
* The source code in this file ("Source Code") is provided by Linden Lab
|
|
* to you under the terms of the GNU General Public License, version 2.0
|
|
* ("GPL"), unless you have obtained a separate licensing agreement
|
|
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
|
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
|
*
|
|
* There are special exceptions to the terms and conditions of the GPL as
|
|
* it is applied to this Source Code. View the full text of the exception
|
|
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
|
* online at
|
|
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge
|
|
* that you have read and understood your obligations described above,
|
|
* and agree to abide by those obligations.
|
|
*
|
|
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
|
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
|
* COMPLETENESS OR PERFORMANCE.
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#ifndef LLUICTRLFACTORY_H
|
|
#define LLUICTRLFACTORY_H
|
|
|
|
#include <iosfwd>
|
|
#include <stack>
|
|
|
|
#include "llcallbackmap.h"
|
|
#include "llfloater.h"
|
|
#include "llinitparam.h"
|
|
|
|
class LLView;
|
|
class LLPanel;
|
|
|
|
class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
|
|
{
|
|
public:
|
|
LLUICtrlFactory();
|
|
// do not call! needs to be public so run-time can clean up the singleton
|
|
virtual ~LLUICtrlFactory();
|
|
|
|
void setupPaths();
|
|
|
|
void buildFloater(LLFloater* floaterp, const std::string &filename,
|
|
const LLCallbackMap::map_t* factory_map = NULL, BOOL open = TRUE);
|
|
void buildFloaterFromBuffer(LLFloater *floaterp, const std::string &buffer,
|
|
const LLCallbackMap::map_t *factory_map = NULL, BOOL open = TRUE);
|
|
BOOL buildPanel(LLPanel* panelp, const std::string &filename,
|
|
const LLCallbackMap::map_t* factory_map = NULL);
|
|
BOOL buildPanelFromBuffer(LLPanel *panelp, const std::string &buffer,
|
|
const LLCallbackMap::map_t* factory_map = NULL);
|
|
|
|
LLFloater* getBuiltFloater(const std::string name) const;
|
|
|
|
void removePanel(LLPanel* panelp) { mBuiltPanels.erase(panelp->getHandle()); }
|
|
void removeFloater(LLFloater* floaterp) { mBuiltFloaters.erase(floaterp->getHandle()); }
|
|
|
|
bool builtPanel(LLPanel* panelp) {return mBuiltPanels.find(panelp->getHandle()) != mBuiltPanels.end();}
|
|
|
|
class LLMenuGL *buildMenu(const std::string &filename, LLView* parentp);
|
|
class LLPieMenu *buildPieMenu(const std::string &filename, LLView* parentp);
|
|
|
|
// Does what you want for LLFloaters and LLPanels
|
|
// Returns 0 on success
|
|
S32 saveToXML(LLView* viewp, const std::string& filename);
|
|
|
|
// Rebuilds all currently built panels.
|
|
void rebuild();
|
|
|
|
static BOOL getAttributeColor(LLXMLNodePtr node, const std::string& name, LLColor4& color);
|
|
|
|
LLPanel* createFactoryPanel(const std::string& name);
|
|
|
|
virtual LLView* createCtrlWidget(LLPanel *parent, LLXMLNodePtr node);
|
|
virtual LLView* createWidget(LLPanel *parent, LLXMLNodePtr node);
|
|
|
|
static bool getLayeredXMLNode(const std::string &filename, LLXMLNodePtr& root);
|
|
static bool getLayeredXMLNodeFromBuffer(const std::string &buffer, LLXMLNodePtr& root);
|
|
|
|
static const std::vector<std::string>& getXUIPaths();
|
|
|
|
private:
|
|
bool getLayeredXMLNodeImpl(const std::string &filename, LLXMLNodePtr& root);
|
|
|
|
typedef std::map<LLHandle<LLPanel>, std::string> built_panel_t;
|
|
built_panel_t mBuiltPanels;
|
|
|
|
typedef std::map<LLHandle<LLFloater>, std::string> built_floater_t;
|
|
built_floater_t mBuiltFloaters;
|
|
|
|
std::deque<const LLCallbackMap::map_t*> mFactoryStack;
|
|
|
|
static std::vector<std::string> sXUIPaths;
|
|
|
|
LLPanel* mDummyPanel;
|
|
|
|
void buildFloaterInternal(LLFloater *floaterp, LLXMLNodePtr &root, const std::string &filename,
|
|
const LLCallbackMap::map_t *factory_map, BOOL open);
|
|
BOOL buildPanelInternal(LLPanel* panelp, LLXMLNodePtr &root, const std::string &filename,
|
|
const LLCallbackMap::map_t* factory_map = NULL);
|
|
};
|
|
|
|
|
|
#endif //LLUICTRLFACTORY_H
|