Files
2026-08-16 18:24:52 +07:00

202 lines
5.9 KiB
C++

// This file is part of VSTGUI. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
#pragma once
#include "../../lib/vstguifwd.h"
#include "../uidescriptionfwd.h"
#include "../../lib/ccolor.h"
#include "uidesclist.h"
#include <variant>
//------------------------------------------------------------------------
namespace VSTGUI {
namespace Detail {
//------------------------------------------------------------------------
namespace MainNodeNames {
static constexpr IdStringPtr kBitmap = "bitmaps";
static constexpr IdStringPtr kFont = "fonts";
static constexpr IdStringPtr kColor = "colors";
static constexpr IdStringPtr kControlTag = "control-tags";
static constexpr IdStringPtr kVariable = "variables";
static constexpr IdStringPtr kTemplate = "template";
static constexpr IdStringPtr kCustom = "custom";
static constexpr IdStringPtr kGradient = "gradients";
} // MainNodeNames
//-----------------------------------------------------------------------------
class UINode : public NonAtomicReferenceCounted
{
public:
using DataStorage = std::string;
UINode (const std::string& name, const SharedPointer<UIAttributes>& attributes = {},
bool needsFastChildNameAttributeLookup = false);
UINode (const std::string& name, const SharedPointer<UIDescList>& children,
const SharedPointer<UIAttributes>& attributes = {});
UINode (const UINode& n);
~UINode () noexcept override;
const std::string& getName () const { return name; }
DataStorage& getData () { return data; }
const DataStorage& getData () const { return data; }
void setData (DataStorage&& newData);
const SharedPointer<UIAttributes>& getAttributes () const { return attributes; }
UIDescList& getChildren () const { return *children; }
bool hasChildren () const;
void childAttributeChanged (UINode* child, const char* attributeName,
const char* oldAttributeValue);
enum
{
kNoExport = 1 << 0
};
bool noExport () const { return hasBit (flags, kNoExport); }
void noExport (bool state) { setBit (flags, kNoExport, state); }
bool operator== (const UINode& n) const { return name == n.name; }
void sortChildren ();
virtual void freePlatformResources () {}
protected:
std::string name;
DataStorage data;
SharedPointer<UIAttributes> attributes;
SharedPointer<UIDescList> children;
int32_t flags;
};
//-----------------------------------------------------------------------------
class UICommentNode : public UINode
{
public:
explicit UICommentNode (const std::string& comment);
};
//-----------------------------------------------------------------------------
class UIVariableNode : public UINode
{
public:
UIVariableNode (const std::string& name, const SharedPointer<UIAttributes>& attributes);
enum Type
{
kNumber,
kString,
kUnknown
};
Type getType () const;
double getNumber () const;
const std::string& getString () const;
protected:
Type type;
double number;
};
//-----------------------------------------------------------------------------
class UIControlTagNode : public UINode
{
public:
UIControlTagNode (const std::string& name, const SharedPointer<UIAttributes>& attributes);
int32_t getTag ();
void setTag (int32_t newTag);
const std::string* getTagString () const;
void setTagString (const std::string& str);
protected:
int32_t tag;
};
//-----------------------------------------------------------------------------
class UIBitmapNode : public UINode
{
public:
UIBitmapNode (const std::string& name, const SharedPointer<UIAttributes>& attributes);
CBitmap* getBitmap (const std::string& pathHint);
void setBitmap (UTF8StringPtr bitmapName);
void setMultiFrameDesc (const CMultiFrameBitmapDescription* desc);
void setNinePartTiledOffset (const CRect* offsets);
void invalidBitmap ();
bool getFilterProcessed () const { return filterProcessed; }
void setFilterProcessed () { filterProcessed = true; }
bool getScaledBitmapsAdded () const { return scaledBitmapsAdded; }
void setScaledBitmapsAdded () { scaledBitmapsAdded = true; }
void createXMLData (const std::string& pathHint);
void removeXMLData ();
bool hasXMLData () const;
void freePlatformResources () override;
protected:
~UIBitmapNode () noexcept override;
using BitmapVariant =
std::variant<uint32_t, CNinePartTiledDescription, CMultiFrameBitmapDescription>;
CBitmap* createBitmap (const std::string& str, const BitmapVariant& variant) const;
PlatformBitmapPtr createBitmapFromDataNode () const;
static bool imagesEqual (IPlatformBitmap* b1, IPlatformBitmap* b2);
UINode* dataNode () const;
CBitmap* bitmap;
bool filterProcessed;
bool scaledBitmapsAdded;
};
//-----------------------------------------------------------------------------
class UIFontNode : public UINode
{
public:
UIFontNode (const std::string& name, const SharedPointer<UIAttributes>& attributes);
CFontRef getFont ();
void setFont (CFontRef newFont);
void setAlternativeFontNames (UTF8StringPtr fontNames);
bool getAlternativeFontNames (std::string& fontNames);
void freePlatformResources () override;
protected:
~UIFontNode () noexcept override;
CFontRef font;
};
//-----------------------------------------------------------------------------
class UIColorNode : public UINode
{
public:
UIColorNode (const std::string& name, const SharedPointer<UIAttributes>& attributes);
const CColor& getColor () const { return color; }
void setColor (const CColor& newColor);
protected:
CColor color;
};
//-----------------------------------------------------------------------------
class UIGradientNode : public UINode
{
public:
UIGradientNode (const std::string& name, const SharedPointer<UIAttributes>& attributes);
CGradient* getGradient ();
void setGradient (CGradient* g);
void freePlatformResources () override;
protected:
SharedPointer<CGradient> gradient;
};
//------------------------------------------------------------------------
} // Detail
} // VSTGUI