0ad/source/gui/ObjectBases/IGUITextOwner.h
wraitii 8b08f4ae7a Change GUI settings to explicitly be member variables.
Completes work starting in D2313 / a33fd55e81:
- Make C++ mistakes where values can be changed without messages being
sent easier to notice / harder to do.
- Make the IGUISetting interface more flexible, allowing custom settings
implementing their own logic. This is used to clean up hotkey code
introduced in 33af6da5e1.

Side effects:
- FromJSVal_Vector clears the vector being passed in. I have some vague
memory of not doing that in D24 / 2bae30c454 as an optimisation, but it
seems more like a footgun to me.
- Most usage of SetSettingFromString is replaced by direct method calls,
as we can generally cast to the proper GUI object type. Where we can't,
it is kept as a poor's man virtual dispatch.
- It moves a few member variables elsewhere, e.g. TextOwner now gets its
own member variable settings.

Differential Revision: https://code.wildfiregames.com/D3892
This was SVN commit r25392.
2021-05-06 08:22:37 +00:00

128 lines
3.1 KiB
C++

/* Copyright (C) 2021 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* 0 A.D. is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
*/
/*
GUI Object Base - Text Owner
--Overview--
Interface class that enhance the IGUIObject with
cached CGUIStrings. This class is not at all needed,
and many controls that will use CGUIStrings might
not use this, but does help for regular usage such
as a text-box, a button, a radio button etc.
*/
#ifndef INCLUDED_IGUITEXTOWNER
#define INCLUDED_IGUITEXTOWNER
#include "gui/CGUISetting.h"
#include "gui/SettingTypes/EAlign.h"
#include "maths/Rect.h"
#include <vector>
struct CGUIColor;
struct SGUIMessage;
class CGUIText;
class CGUIString;
class IGUIObject;
class CStrW;
class CVector2D;
/**
* Framework for handling Output text.
*/
class IGUITextOwner
{
NONCOPYABLE(IGUITextOwner);
public:
IGUITextOwner(IGUIObject& pObject);
virtual ~IGUITextOwner();
/**
* Adds a text object.
*/
CGUIText& AddText();
/**
* Adds a text generated by the given arguments.
*/
CGUIText& AddText(const CGUIString& Text, const CStrW& Font, const float& Width, const float& BufferZone);
/**
* @see IGUIObject#HandleMessage()
*/
virtual void HandleMessage(SGUIMessage& Message);
/**
* @see IGUIObject#UpdateCachedSize()
*/
virtual void UpdateCachedSize();
/**
* Draws the Text.
*
* @param index Index value of text. Mostly this will be 0
* @param color
* @param pos Position
* @param z Z value
* @param clipping Clipping rectangle, don't even add a parameter
* to get no clipping.
*/
virtual void DrawText(size_t index, const CGUIColor& color, const CVector2D& pos, float z, const CRect& clipping = CRect());
protected:
/**
* Setup texts. Functions that sets up all texts when changes have been made.
*/
virtual void SetupText() = 0;
/**
* Regenerate the text in case it is invalid. Should only be called when inevitable.
*/
virtual void UpdateText();
/**
* Whether the cached text is currently valid (if not then SetupText will be called by Draw)
*/
bool m_GeneratedTextsValid;
/**
* Texts that are generated and ready to be rendered.
*/
std::vector<CGUIText> m_GeneratedTexts;
/**
* Calculate the position for the text, based on the alignment.
*/
void CalculateTextPosition(CRect& ObjSize, CVector2D& TextPos, CGUIText& Text);
CGUISimpleSetting<EAlign> m_TextAlign;
CGUISimpleSetting<EVAlign> m_TextVAlign;
private:
/**
* Reference to the IGUIObject.
* Private, because we don't want to inherit it in multiple classes.
*/
IGUIObject& m_pObject;
};
#endif // INCLUDED_IGUITEXTOWNER