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

624 lines
19 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 "iaction.h"
#if VSTGUI_LIVE_EDITING
#include "uiselection.h"
#include "../iviewfactory.h"
#include "../iuidescription.h"
#include "../../lib/ccolor.h"
#include "../../lib/cgradient.h"
#include <list>
#include <map>
#include <vector>
#include <string>
#include <functional>
namespace VSTGUI {
class UIViewFactory;
class IUIDescription;
class UIDescription;
class CViewContainer;
class CView;
//-----------------------------------------------------------------------------
class Action : public IAction
{
public:
using Func = std::function<void ()>;
Action (const std::string& name, Func&& perform, Func&& undo)
: name (name), performAction (std::move (perform)), undoAction (std::move (undo))
{
}
UTF8StringPtr getName () override { return name.data (); }
void perform () override { performAction (); }
void undo () override { undoAction (); }
private:
std::string name;
Func performAction;
Func undoAction;
};
//-----------------------------------------------------------------------------
template <class T>
class BaseSelectionOperation : public IAction, protected std::list<T>
{
public:
BaseSelectionOperation (UISelection* selection) : selection (selection) {}
protected:
SharedPointer<UISelection> selection;
};
//-----------------------------------------------------------------------------
class SizeToFitOperation : public BaseSelectionOperation<std::pair<SharedPointer<CView>, CRect> >
{
public:
SizeToFitOperation (UISelection* selection);
~SizeToFitOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
};
//-----------------------------------------------------------------------------
class UnembedViewOperation : public BaseSelectionOperation<SharedPointer<CView> >
{
public:
UnembedViewOperation (UISelection* selection, const IViewFactory* factory);
~UnembedViewOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
void collectSubviews (CViewContainer* container, bool deep);
const IViewFactory* factory;
SharedPointer<CViewContainer> containerView;
CViewContainer* parent;
};
//-----------------------------------------------------------------------------
class EmbedViewOperation : public BaseSelectionOperation<std::pair<SharedPointer<CView>, CRect> >
{
public:
EmbedViewOperation (UISelection* selection, CViewContainer* newContainer);
~EmbedViewOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<CViewContainer> newContainer;
CViewContainer* parent;
};
//-----------------------------------------------------------------------------
class ViewCopyOperation : public IAction, protected std::list<SharedPointer<CView> >
{
public:
ViewCopyOperation (UISelection* copySelection, UISelection* workingSelection, CViewContainer* parent, const CPoint& offset, IUIDescription* desc);
~ViewCopyOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<CViewContainer> parent;
SharedPointer<UISelection> copySelection;
SharedPointer<UISelection> workingSelection;
std::list<SharedPointer<CView> > oldSelectedViews;
};
//-----------------------------------------------------------------------------
class ViewSizeChangeOperation : public BaseSelectionOperation<std::pair<SharedPointer<CView>, CRect> >
{
public:
ViewSizeChangeOperation (UISelection* selection, bool sizing, bool autosizingEnabled);
~ViewSizeChangeOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
bool didChange ();
protected:
bool first;
bool sizing;
bool autosizing;
};
//----------------------------------------------------------------------------------------------------
struct DeleteOperationViewAndNext
{
DeleteOperationViewAndNext (CView* view, CView* nextView) : view (view), nextView (nextView) {}
DeleteOperationViewAndNext (const DeleteOperationViewAndNext& copy) : view (copy.view), nextView (copy.nextView) {}
SharedPointer<CView> view;
SharedPointer<CView> nextView;
};
//----------------------------------------------------------------------------------------------------
class DeleteOperation : public IAction, protected std::multimap<SharedPointer<CViewContainer>, DeleteOperationViewAndNext>
{
public:
DeleteOperation (UISelection* selection);
~DeleteOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UISelection> selection;
};
//-----------------------------------------------------------------------------
class InsertViewOperation : public IAction
{
public:
InsertViewOperation (CViewContainer* parent, CView* view, UISelection* selection);
~InsertViewOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<CViewContainer> parent;
SharedPointer<CView> view;
SharedPointer<UISelection> selection;
};
//-----------------------------------------------------------------------------
class TransformViewTypeOperation : public IAction
{
public:
TransformViewTypeOperation (UISelection* selection, CView* view, IdStringPtr viewClassName,
UIDescription* desc, const IViewFactory* factory);
~TransformViewTypeOperation () override;
UTF8StringPtr getName () override;
void exchangeSubViews (CViewContainer* src, CViewContainer* dst);
void perform () override;
void undo () override;
protected:
SharedPointer<CView> view;
CView* newView;
int32_t insertIndex;
SharedPointer<CViewContainer> parent;
SharedPointer<UISelection> selection;
const IViewFactory* factory;
SharedPointer<UIDescription> description;
};
//-----------------------------------------------------------------------------
class AttributeChangeAction : public IAction, protected std::map<SharedPointer<CView>, std::string>
{
public:
AttributeChangeAction (UIDescription* desc, UISelection* selection, const std::string& attrName, const std::string& attrValue);
~AttributeChangeAction () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
void updateSelection ();
UIDescription* desc;
SharedPointer<UISelection> selection;
std::string attrName;
std::string attrValue;
std::string name;
};
//----------------------------------------------------------------------------------------------------
class MultipleAttributeChangeAction : public IAction, public std::vector<std::pair<SharedPointer<CView>, std::string> >
{
public:
MultipleAttributeChangeAction (UIDescription* description, const std::list<CView*>& views, IViewCreator::AttrType attrType, UTF8StringPtr oldValue, UTF8StringPtr newValue);
UTF8StringPtr getName () override { return "multiple view attribute changes"; }
void perform () override;
void undo () override;
protected:
void setAttributeValue (UTF8StringPtr value);
static void collectAllSubViews (CView* view, std::list<CView*>& views);
void collectViewsWithAttributeValue (const IViewFactory* viewFactory, IUIDescription* desc,
CView* startView, IViewCreator::AttrType type,
const std::string& value);
SharedPointer<UIDescription> description;
std::string oldValue;
std::string newValue;
};
//----------------------------------------------------------------------------------------------------
class TagChangeAction : public IAction
{
public:
TagChangeAction (UIDescription* description, UTF8StringPtr name, UTF8StringPtr newTagString, bool remove, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
bool isAddTag () const { return isNewTag; }
protected:
SharedPointer<UIDescription> description;
std::string name;
std::string newTag;
std::string originalTag;
bool remove;
bool performOrUndo;
bool isNewTag;
};
//----------------------------------------------------------------------------------------------------
class TagNameChangeAction : public IAction
{
public:
TagNameChangeAction (UIDescription* description, UTF8StringPtr oldName, UTF8StringPtr newName, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string oldName;
std::string newName;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class ColorChangeAction : public IAction
{
public:
ColorChangeAction (UIDescription* description, UTF8StringPtr name, const CColor& color, bool remove, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
bool isAddColor () const { return isNewColor; }
protected:
SharedPointer<UIDescription> description;
std::string name;
CColor newColor;
CColor oldColor;
bool remove;
bool performOrUndo;
bool isNewColor;
};
//----------------------------------------------------------------------------------------------------
class ColorNameChangeAction : public IAction
{
public:
ColorNameChangeAction (UIDescription* description, UTF8StringPtr oldName, UTF8StringPtr newName, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string oldName;
std::string newName;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class BitmapChangeAction : public IAction
{
public:
BitmapChangeAction (UIDescription* description, UTF8StringPtr name, UTF8StringPtr path, bool remove, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
bool isAddBitmap () const { return isNewBitmap; }
protected:
SharedPointer<UIDescription> description;
std::string name;
std::string path;
std::string originalPath;
bool remove;
bool performOrUndo;
bool isNewBitmap;
};
//----------------------------------------------------------------------------------------------------
class BitmapNameChangeAction : public IAction
{
public:
BitmapNameChangeAction (UIDescription* description, UTF8StringPtr oldName, UTF8StringPtr newName, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string oldName;
std::string newName;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class NinePartTiledBitmapChangeAction : public IAction
{
public:
NinePartTiledBitmapChangeAction (UIDescription* description, UTF8StringPtr name, const CRect* rect, bool performOrUndo);
~NinePartTiledBitmapChangeAction () override;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string name;
CRect* oldRect;
CRect* newRect;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class MultiFrameBitmapChangeAction : public IAction
{
public:
MultiFrameBitmapChangeAction (UIDescription* description, UTF8StringPtr name,
const CMultiFrameBitmapDescription* desc, bool performOrUndo);
~MultiFrameBitmapChangeAction () override;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string name;
std::unique_ptr<CMultiFrameBitmapDescription> oldDesc;
std::unique_ptr<CMultiFrameBitmapDescription> newDesc;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class BitmapFilterChangeAction : public IAction
{
public:
BitmapFilterChangeAction (UIDescription* description, UTF8StringPtr bitmapName, const std::list<SharedPointer<UIAttributes> >& attributes, bool performOrUndo);
~BitmapFilterChangeAction () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string bitmapName;
std::list<SharedPointer<UIAttributes> > newAttributes;
std::list<SharedPointer<UIAttributes> > oldAttributes;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class GradientChangeAction : public IAction
{
public:
GradientChangeAction (UIDescription* description, UTF8StringPtr name, CGradient* gradient, bool remove, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
bool isAddGradient () const { return originalGradient == 0; }
protected:
SharedPointer<UIDescription> description;
std::string name;
SharedPointer<CGradient> gradient;
SharedPointer<CGradient> originalGradient;
bool remove;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class GradientNameChangeAction : public IAction
{
public:
GradientNameChangeAction (UIDescription* description, UTF8StringPtr oldName, UTF8StringPtr newName, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string oldName;
std::string newName;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class FontChangeAction : public IAction
{
public:
FontChangeAction (UIDescription* description, UTF8StringPtr name, CFontRef font, bool remove, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
bool isAddFont () const { return originalFont == 0; }
protected:
SharedPointer<UIDescription> description;
std::string name;
std::string alternativeNames;
SharedPointer<CFontDesc> font;
SharedPointer<CFontDesc> originalFont;
bool remove;
bool performOrUndo;
};
//----------------------------------------------------------------------------------------------------
class FontNameChangeAction : public IAction
{
public:
FontNameChangeAction (UIDescription* description, UTF8StringPtr oldName, UTF8StringPtr newName, bool performOrUndo);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string oldName;
std::string newName;
bool performOrUndo;
};
//-----------------------------------------------------------------------------
class AlternateFontChangeAction : public IAction
{
public:
AlternateFontChangeAction (UIDescription* description, UTF8StringPtr fontName, UTF8StringPtr newAlternateFontNames);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
std::string fontName;
std::string newAlternateFontNames;
std::string oldAlternateFontNames;
};
//-----------------------------------------------------------------------------
class HierarchyMoveViewOperation : public IAction
{
public:
HierarchyMoveViewOperation (CView* view, UISelection* selection, int32_t dir);
~HierarchyMoveViewOperation () override = default;
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<CView> view;
SharedPointer<CViewContainer> parent;
SharedPointer<UISelection> selection;
int32_t dir;
};
//-----------------------------------------------------------------------------
class TemplateNameChangeAction : public IAction
{
public:
TemplateNameChangeAction (UIDescription* description, IActionPerformer* actionPerformer, UTF8StringPtr oldName, UTF8StringPtr newName);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
IActionPerformer* actionPerformer;
std::string oldName;
std::string newName;
};
//-----------------------------------------------------------------------------
class CreateNewTemplateAction : public IAction
{
public:
CreateNewTemplateAction (UIDescription* description, IActionPerformer* actionPerformer, UTF8StringPtr name, UTF8StringPtr baseViewClassName);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
IActionPerformer* actionPerformer;
SharedPointer<CView> view;
std::string name;
std::string baseViewClassName;
};
//-----------------------------------------------------------------------------
class DuplicateTemplateAction : public IAction
{
public:
DuplicateTemplateAction (UIDescription* description, IActionPerformer* actionPerformer, UTF8StringPtr name, UTF8StringPtr dupName);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
IActionPerformer* actionPerformer;
SharedPointer<CView> view;
std::string name;
std::string dupName;
};
//-----------------------------------------------------------------------------
class DeleteTemplateAction : public IAction
{
public:
DeleteTemplateAction (UIDescription* description, IActionPerformer* actionPerformer, CView* view, UTF8StringPtr name);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
IActionPerformer* actionPerformer;
SharedPointer<CView> view;
SharedPointer<UIAttributes> attributes;
std::string name;
};
//-----------------------------------------------------------------------------
class ChangeFocusDrawingAction : public IAction
{
public:
ChangeFocusDrawingAction (UIDescription* description, const FocusDrawingSettings& newSettings);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
protected:
SharedPointer<UIDescription> description;
FocusDrawingSettings oldSettings;
FocusDrawingSettings newSettings;
};
//-----------------------------------------------------------------------------
class ChangeTemplateMinMaxAction : public IAction
{
public:
ChangeTemplateMinMaxAction (UIDescription* description, UTF8StringPtr templateName, CPoint minSize, CPoint maxSize);
UTF8StringPtr getName () override;
void perform () override;
void undo () override;
private:
void setMinMaxSize (CPoint minimum, CPoint maximum);
SharedPointer<UIDescription> description;
std::string templateName;
CPoint minSize;
CPoint maxSize;
CPoint oldMinSize;
CPoint oldMaxSize;
};
//-----------------------------------------------------------------------------
} // VSTGUI
#endif // VSTGUI_LIVE_EDITING