mirror of
https://github.com/unknownworlds/NS.git
synced 2024-11-30 00:10:59 +00:00
159 lines
6.2 KiB
C
159 lines
6.2 KiB
C
|
#ifndef UIMANAGER_H
|
||
|
#define UIMANAGER_H
|
||
|
|
||
|
// Main ideas:
|
||
|
// 1) The full UI is specified from a text file
|
||
|
// 2) Changing or adding UI components doesn't require changing the layout parser
|
||
|
// 3) Globals aren't needed in the client code, it can look up components by name when it needs them. This makes
|
||
|
// the code much neater and easier to maintain.
|
||
|
//
|
||
|
// Components are defined as a set of tags, many of them common for all components. A new UI component
|
||
|
// can define its own custom tags if it so desires.
|
||
|
//
|
||
|
|
||
|
#include "textrep/TRTag.h"
|
||
|
#include "textrep/TRDescription.h"
|
||
|
#include "vgui_InputSignal.h"
|
||
|
#include "ui/UIComponent.h"
|
||
|
|
||
|
class CSchemeManager;
|
||
|
|
||
|
using namespace vgui;
|
||
|
|
||
|
class UIComponent;
|
||
|
class UIFactory;
|
||
|
|
||
|
// Singleton or global?
|
||
|
class UIManager : public InputSignal
|
||
|
{
|
||
|
public:
|
||
|
// Only one way to construct. Not meaningful to use until Initialize() is called.
|
||
|
UIManager(UIFactory* inFactory);
|
||
|
|
||
|
// Make destructor virtual just in case this is subclassed someday
|
||
|
virtual ~UIManager(void);
|
||
|
|
||
|
void AddInputSignal(InputSignal* inInputSignal);
|
||
|
|
||
|
// Deletes all components that have been previously read in. Clients should not hold onto UI component
|
||
|
// pointers, because this function invalidates them. This will typically be called from within VGUI_Shutdown.
|
||
|
// It is also called at the beginning of Initialize(). Returns true if at least one component was deleted.
|
||
|
bool Clear(void);
|
||
|
|
||
|
// Find a component that has been created with the specified name. The text files lay out the components, this
|
||
|
// is how the mod finds them after they have been created. The calling code shouldn't keep around the pointer
|
||
|
// to the component, it should query it every tick in case it goes away.
|
||
|
UIComponent* GetComponentNamed(const string& inName);
|
||
|
const UIComponent* GetComponentNamed(const string& inName) const;
|
||
|
|
||
|
// Quick way to fetch the vgui component you're looking for. Returns null if type is wrong or it doesn't exist.
|
||
|
template <class T>
|
||
|
bool GetVGUIComponentNamed(const string& inName, T& outValue)
|
||
|
{
|
||
|
bool theSuccess = false;
|
||
|
T theReturnComponent = NULL;
|
||
|
outValue = NULL;
|
||
|
UIComponent* theComponent = this->GetComponentNamed(inName);
|
||
|
if(theComponent)
|
||
|
{
|
||
|
outValue = dynamic_cast<T>(theComponent->GetComponentPointer());
|
||
|
if(outValue)
|
||
|
{
|
||
|
theSuccess = true;
|
||
|
}
|
||
|
}
|
||
|
return theSuccess;
|
||
|
}
|
||
|
|
||
|
bool HideComponent(const string& inName);
|
||
|
void HideComponents();
|
||
|
|
||
|
// Load up all UI components specified by the text description. Any components that have already been loaded
|
||
|
// are cleared first. Returns false if the file couldn't be opened or no components could be built from the file.
|
||
|
// Typically this will be called once when the mod is initialized and never again.
|
||
|
bool Initialize(const TRDescriptionList& inDesc, CSchemeManager* inSchemeManager = NULL);
|
||
|
|
||
|
bool InMouseMode(void) const;
|
||
|
|
||
|
void NotifyGammaChange(float inGammaSlope);
|
||
|
|
||
|
// Saves the current UI layout back out the file that it was read in from. This is only meaningful after
|
||
|
// the layout has been edited by the player. Returns false if the file couldn't be opened, if a write fails.
|
||
|
// or if the manager is currently in edit mode.
|
||
|
bool Save(const string& outFilename, const string& outHeader);
|
||
|
|
||
|
// Sets the left mouse button action to
|
||
|
bool SetLMBActionAbsolute(const TRTag& inTag);
|
||
|
|
||
|
bool SetLMBActionRelative(const TRTag& inTag);
|
||
|
|
||
|
void SetMouseVisibility(bool inState);
|
||
|
|
||
|
bool SetRMBActionAbsolute(const TRTag& inTag);
|
||
|
|
||
|
bool SetRMBActionRelative(const TRTag& inTag);
|
||
|
|
||
|
void SetUsingVGUI(bool inState);
|
||
|
|
||
|
// Call to toggle editing current layout with the mouse. Starts in non-edit mode.
|
||
|
// Returns true if we were in edit mode and just left.
|
||
|
bool ToggleEditMode(void);
|
||
|
|
||
|
void ToggleMouse(void);
|
||
|
|
||
|
bool TranslateComponent(const string& inName, bool inAway);
|
||
|
|
||
|
bool UnhideComponent(const string& inName);
|
||
|
|
||
|
virtual void Update(float inCurrentTime);
|
||
|
|
||
|
// Called every time the hud is re-inited
|
||
|
virtual void VidInit(void);
|
||
|
|
||
|
// Input signal functions for graphical editing
|
||
|
virtual void cursorMoved(int x,int y,Panel* panel);
|
||
|
virtual void cursorEntered(Panel* panel);
|
||
|
virtual void cursorExited(Panel* panel);
|
||
|
virtual void mousePressed(MouseCode code,Panel* panel);
|
||
|
virtual void mouseDoublePressed(MouseCode code,Panel* panel);
|
||
|
virtual void mouseReleased(MouseCode code,Panel* panel);
|
||
|
virtual void mouseWheeled(int delta,Panel* panel);
|
||
|
virtual void keyPressed(KeyCode code,Panel* panel);
|
||
|
virtual void keyTyped(KeyCode code,Panel* panel);
|
||
|
virtual void keyReleased(KeyCode code,Panel* panel);
|
||
|
virtual void keyFocusTicked(Panel* panel);
|
||
|
|
||
|
private:
|
||
|
UIManager(void);
|
||
|
|
||
|
UIComponent* GetComponentFromPanel(Panel* inPanel);
|
||
|
void GetScreenCoords(int& ioLocalX, int& ioLocalY);
|
||
|
void SetEnabledState(bool inState);
|
||
|
void SetPanelPosition(Panel* inPanel, int inX, int inY);
|
||
|
void SetSchemeValues(const TRDescription& inDesc, UIComponent* inComponent, CSchemeManager* inManager);
|
||
|
|
||
|
void TranslateComponents(bool inAway);
|
||
|
void TranslateComponent(vgui::Panel* inPanel, bool inAway);
|
||
|
|
||
|
bool mEditMode;
|
||
|
bool mDraggingLMB;
|
||
|
bool mUsingVGUI;
|
||
|
|
||
|
int mLastMouseX, mLastMouseY;
|
||
|
int mLMBDownX, mLMBDownY;
|
||
|
Panel* mComponentMouseOver;
|
||
|
Cursor* mBlankCursor;
|
||
|
|
||
|
UIFactory* mFactory;
|
||
|
float mGammaSlope;
|
||
|
|
||
|
// List of text representations associated with UIComponents.
|
||
|
// These are all currently loaded in the game.
|
||
|
typedef vector<UIComponent*> UIComponentListType;
|
||
|
UIComponentListType mComponentList;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|