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

206 lines
8.8 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 "iuidescription.h"
#include "uidescriptionfwd.h"
#include <list>
#include <string>
#include <memory>
namespace VSTGUI {
namespace Detail { class UINode; }
//-----------------------------------------------------------------------------
/// @brief XML description parser and view creator
/// @ingroup new_in_4_0
//-----------------------------------------------------------------------------
class UIDescription : public NonAtomicReferenceCounted, public IUIDescription
{
using UINode = Detail::UINode;
protected:
enum SaveFlagBits
{
WriteWindowsResourceFileBit = 0,
WriteImagesIntoUIDescFileBit,
DoNotVerifyImageDataBit,
WriteAsXmlBit,
LastSaveFlagBit,
};
public:
UIDescription (const CResourceDescription& uidescFile, IViewFactory* viewFactory = nullptr);
UIDescription (IContentProvider* contentProvider, IViewFactory* viewFactory = nullptr);
~UIDescription () noexcept override;
virtual bool parse ();
using AttributeSaveFilterFunc = bool (*) (CView* view, const std::string& name);
enum SaveFlags {
kWriteWindowsResourceFile = 1 << WriteWindowsResourceFileBit,
kWriteImagesIntoUIDescFile = 1 << WriteImagesIntoUIDescFileBit,
kDoNotVerifyImageData = 1 << DoNotVerifyImageDataBit,
kWriteAsXML = 1 << WriteAsXmlBit,
kWriteImagesIntoXMLFile [[deprecated("use kWriteImagesIntoUIDescFile")]] = kWriteImagesIntoUIDescFile,
kDoNotVerifyImageXMLData [[deprecated("use kDoNotVerifyImageData")]] = kDoNotVerifyImageData,
};
virtual bool save (UTF8StringPtr filename, int32_t flags = kWriteWindowsResourceFile,
AttributeSaveFilterFunc func = nullptr);
virtual bool saveWindowsRCFile (UTF8StringPtr filename);
bool storeViews (const std::list<CView*>& views, OutputStream& stream,
SharedPointer<UIAttributes> customData = {}) const;
bool restoreViews (InputStream& stream, std::list<SharedPointer<CView> >& views, UIAttributes** customData = nullptr);
UTF8StringPtr getFilePath () const;
void setFilePath (UTF8StringPtr path);
void setSharedResources (const SharedPointer<UIDescription>& resources);
const SharedPointer<UIDescription>& getSharedResources () const;
const UIAttributes* getViewAttributes (UTF8StringPtr name) const;
void setController (IController* controller) const;
CView* createView (UTF8StringPtr name, IController* controller) const override;
CBitmap* getBitmap (UTF8StringPtr name) const override;
CFontRef getFont (UTF8StringPtr name) const override;
bool getColor (UTF8StringPtr name, CColor& color) const override;
CGradient* getGradient (UTF8StringPtr name) const override;
int32_t getTagForName (UTF8StringPtr name) const override;
IControlListener* getControlListener (UTF8StringPtr name) const override;
IController* getController () const override;
const IViewFactory* getViewFactory () const override;
UTF8StringPtr lookupColorName (const CColor& color) const override;
UTF8StringPtr lookupFontName (const CFontRef font) const override;
UTF8StringPtr lookupBitmapName (const CBitmap* bitmap) const override;
UTF8StringPtr lookupGradientName (const CGradient* gradient) const override;
UTF8StringPtr lookupControlTagName (const int32_t tag) const override;
bool getVariable (UTF8StringPtr name, double& value) const override;
bool getVariable (UTF8StringPtr name, std::string& value) const override;
void collectTemplateViewNames (std::list<const std::string*>& names) const override;
void collectColorNames (std::list<const std::string*>& names) const override;
void collectFontNames (std::list<const std::string*>& names) const override;
void collectBitmapNames (std::list<const std::string*>& names) const override;
void collectGradientNames (std::list<const std::string*>& names) const override;
void collectControlTagNames (std::list<const std::string*>& names) const override;
void changeColorName (UTF8StringPtr oldName, UTF8StringPtr newName);
void changeTagName (UTF8StringPtr oldName, UTF8StringPtr newName);
void changeFontName (UTF8StringPtr oldName, UTF8StringPtr newName);
void changeBitmapName (UTF8StringPtr oldName, UTF8StringPtr newName);
void changeGradientName (UTF8StringPtr oldName, UTF8StringPtr newName);
void changeColor (UTF8StringPtr name, const CColor& newColor);
void changeFont (UTF8StringPtr name, CFontRef newFont);
void changeGradient (UTF8StringPtr name, CGradient* newGradient);
void changeBitmap (UTF8StringPtr name, UTF8StringPtr newName, const CRect* nineparttiledOffset = nullptr);
void changeMultiFrameBitmap (UTF8StringPtr name, UTF8StringPtr newName,
const CMultiFrameBitmapDescription* = nullptr);
void changeBitmapFilters (UTF8StringPtr bitmapName, const std::list<SharedPointer<UIAttributes> >& filters);
void collectBitmapFilters (UTF8StringPtr bitmapName, std::list<SharedPointer<UIAttributes> >& filters) const;
void removeColor (UTF8StringPtr name);
void removeTag (UTF8StringPtr name);
void removeFont (UTF8StringPtr name);
void removeBitmap (UTF8StringPtr name);
void removeGradient (UTF8StringPtr name);
void changeAlternativeFontNames (UTF8StringPtr name, UTF8StringPtr alternativeFonts);
bool getAlternativeFontNames (UTF8StringPtr name, std::string& alternativeFonts) const;
bool hasColorName (UTF8StringPtr name) const;
bool hasTagName (UTF8StringPtr name) const;
bool hasFontName (UTF8StringPtr name) const;
bool hasBitmapName (UTF8StringPtr name) const;
bool hasGradientName (UTF8StringPtr name) const;
void updateViewDescription (UTF8StringPtr name, CView* view);
bool getTemplateNameFromView (CView* view, std::string& templateName) const;
bool addNewTemplate (UTF8StringPtr name, const SharedPointer<UIAttributes>& attr);
bool removeTemplate (UTF8StringPtr name);
bool changeTemplateName (UTF8StringPtr name, UTF8StringPtr newName);
bool duplicateTemplate (UTF8StringPtr name, UTF8StringPtr duplicateName);
bool setCustomAttributes (UTF8StringPtr name, const SharedPointer<UIAttributes>& attr) override;
SharedPointer<UIAttributes> getCustomAttributes (UTF8StringPtr name) const override;
SharedPointer<UIAttributes> getCustomAttributes (UTF8StringPtr name, bool create);
bool getControlTagString (UTF8StringPtr tagName, std::string& tagString) const;
bool changeControlTagString (UTF8StringPtr tagName, const std::string& newTagString, bool create = false);
bool calculateStringValue (UTF8StringPtr str, double& result) const;
void registerListener (UIDescriptionListener* listener);
void unregisterListener (UIDescriptionListener* listener);
void setBitmapCreator (IBitmapCreator* bitmapCreator);
void setBitmapCreator2 (IBitmapCreator2* bitmapCreator);
using FocusDrawing = FocusDrawingSettings;
FocusDrawing getFocusDrawingSettings () const;
void setFocusDrawingSettings (const FocusDrawing& fd);
void freePlatformResources ();
static CViewAttributeID kTemplateNameAttributeID;
SharedPointer<UINode> getRootNode () const; // for testing
protected:
void addDefaultNodes ();
bool saveToStream (OutputStream& stream, int32_t flags, AttributeSaveFilterFunc func);
bool parsed () const;
void setContentProvider (IContentProvider* provider);
const CResourceDescription& getUIDescFile () const;
private:
void postParsing ();
CView* createViewFromNode (UINode* node) const;
UINode* getBaseNode (UTF8StringPtr name, bool create = true) const;
UINode* findChildNodeByNameAttribute (UINode* node, UTF8StringPtr nameAttribute) const;
UINode* findNodeForView (CView* view) const;
bool updateAttributesForView (UINode* node, CView* view, bool deep = true);
void removeNode (UTF8StringPtr name, IdStringPtr mainNodeName);
template<typename NodeType, typename ObjType, typename CompareFunction> UTF8StringPtr lookupName (const ObjType& obj, IdStringPtr mainNodeName, CompareFunction compare) const;
template<typename NodeType> void changeNodeName (UTF8StringPtr oldName, UTF8StringPtr newName, IdStringPtr mainNodeName);
template<typename NodeType> void collectNamesFromNode (IdStringPtr mainNodeName, std::list<const std::string*>& names) const;
struct Impl;
std::unique_ptr<Impl> impl;
};
//-----------------------------------------------------------------------------
static constexpr auto kTemplateAttributeMinSize = "minSize";
static constexpr auto kTemplateAttributeMaxSize = "maxSize";
//-----------------------------------------------------------------------------
class IBitmapCreator
{
public:
virtual ~IBitmapCreator () noexcept = default;
virtual PlatformBitmapPtr createBitmap (const UIAttributes& attributes) = 0;
};
//-----------------------------------------------------------------------------
class IBitmapCreator2
{
public:
virtual ~IBitmapCreator2 () noexcept = default;
virtual SharedPointer<CBitmap> createBitmap (const UIAttributes& attributes,
const IUIDescription* desc) = 0;
};
} // VSTGUI