You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Sandbox/Plugins/EditorCommon/QPropertyTree/PropertyTreeModel.h

209 lines
6.4 KiB
C++

/**
* wWidgets - Lightweight UI Toolkit.
* Copyright (C) 2009-2011 Evgeny Andreeshchev <eugene.andreeshchev@gmail.com>
* Alexander Kotliar <alexander.kotliar@gmail.com>
*
* This code is distributed under the MIT License:
* http://www.opensource.org/licenses/MIT
*/
// Modifications copyright Amazon.com, Inc. or its affiliates.
#ifndef CRYINCLUDE_EDITORCOMMON_QPROPERTYTREE_PROPERTYTREEMODEL_H
#define CRYINCLUDE_EDITORCOMMON_QPROPERTYTREE_PROPERTYTREEMODEL_H
#pragma once
#if !defined(Q_MOC_RUN)
#include <map>
#include "PropertyRow.h"
#include "PropertyTreeOperator.h"
#include "Serialization/Pointers.h"
#endif
using std::vector;
using std::map;
struct TreeSelection : vector<TreePath>
{
bool operator==(const TreeSelection& rhs){
if(size() != rhs.size())
return false;
for(int i = 0; i < int(size()); ++i)
if((*this)[i] != rhs[i])
return false;
return true;
}
};
struct PropertyDefaultDerivedTypeValue
{
string registeredName;
Serialization::SharedPtr<PropertyRow> root;
Serialization::IClassFactory* factory;
int factoryIndex;
std::string label;
PropertyDefaultDerivedTypeValue()
: factoryIndex(-1)
, factory(0)
{
}
};
struct PropertyDefaultTypeValue
{
Serialization::TypeID type;
string registedName;
Serialization::SharedPtr<PropertyRow> root;
Serialization::IClassFactory* factory;
int factoryIndex;
std::string label;
PropertyDefaultTypeValue()
: factoryIndex(-1)
, factory(0)
{
}
};
// ---------------------------------------------------------------------------
class PropertyTreeModel : public QObject
{
Q_OBJECT
public:
class LockedUpdate : public Serialization::RefCounter{
public:
LockedUpdate(PropertyTreeModel* model)
: model_(model)
, apply_(false)
{}
void requestUpdate(const PropertyRows& rows, bool apply) {
for (size_t i = 0; i < rows.size(); ++i) {
PropertyRow* row = rows[i];
if (std::find(rows_.begin(), rows_.end(), row) == rows_.end())
rows_.push_back(row);
}
if (apply)
apply_ = true;
}
void dismissUpdate(){ rows_.clear(); }
~LockedUpdate(){
model_->updateLock_ = 0;
if(!rows_.empty())
model_->signalUpdated(rows_, apply_);
}
protected:
PropertyTreeModel* model_;
PropertyRows rows_;
bool apply_;
};
typedef Serialization::SharedPtr<LockedUpdate> UpdateLock;
typedef TreeSelection Selection;
PropertyTreeModel();
~PropertyTreeModel();
void clear();
bool canUndo() const{ return !undoOperators_.empty(); }
void undo();
bool canRedo() const{ return !redoOperators_.empty(); }
void redo();
void clearUndo();
TreePath pathFromRow(PropertyRow* node);
PropertyRow* rowFromPath(const TreePath& path);
void setFocusedRow(PropertyRow* row) { focusedRow_ = pathFromRow(row); }
PropertyRow* focusedRow() { return rowFromPath(focusedRow_); }
const Selection& selection() const{ return selection_; }
void setSelection(const Selection& selection);
void setRoot(PropertyRow* root) { root_ = root; }
PropertyRow* root() { return root_; }
const PropertyRow* root() const { return root_; }
void Serialize(Serialization::IArchive& ar, QPropertyTree* tree);
UpdateLock lockUpdate();
void requestUpdate(const PropertyRows& rows, bool needApply);
void dismissUpdate();
void selectRow(PropertyRow* row, bool selected, bool exclusive = true);
void deselectAll();
void rowAboutToBeChanged(PropertyRow* row);
void callRowCallback(PropertyRow* row);
void rowChanged(PropertyRow* row, bool apply = true); // be careful: it can destroy 'row'
void setUndoEnabled(bool enabled) { undoEnabled_ = enabled; }
void setFullUndo(bool fullUndo) { fullUndo_ = fullUndo; }
void setExpandLevels(int levels) { expandLevels_ = levels; }
int expandLevels() const{ return expandLevels_; }
void onUpdated(const PropertyRows& rows, bool needApply);
// for defaultArchive
const Serialization::StringList& typeStringList(const Serialization::TypeID& baseType) const;
bool defaultTypeRegistered(const char* typeName) const;
void addDefaultType(PropertyRow* propertyRow, const char* typeName);
PropertyRow* defaultType(const char* typeName) const;
bool defaultTypeRegistered(const Serialization::TypeID& baseType, const char* derivedRegisteredName) const;
void addDefaultType(const Serialization::TypeID& baseType, const PropertyDefaultDerivedTypeValue& value);
const PropertyDefaultDerivedTypeValue* defaultType(const Serialization::TypeID& baseType, int index) const;
ConstStringList* constStrings() { return &constStrings_; }
signals:
void signalUpdated(const PropertyRows& rows, bool needApply);
void signalPushUndo(PropertyTreeOperator* op, bool* result);
void signalPushRedo(PropertyTreeOperator* op, bool* result);
void signalUndoRedoStackChanged(bool undosAvailable, bool redosAvailable);
private:
void applyOperator(PropertyTreeOperator* op);
void pushUndo(const PropertyTreeOperator& op);
void pushRedo(const PropertyTreeOperator& op);
void clearObjectReferences();
PropertyTreeOperator getCurrentStateTreeOperator(PropertyRow* row);
TreePath focusedRow_;
Selection selection_;
Serialization::SharedPtr<PropertyRow> root_;
UpdateLock updateLock_;
typedef std::map<string, Serialization::SharedPtr<PropertyRow> > DefaultTypes;
DefaultTypes defaultTypes_;
typedef vector<PropertyDefaultDerivedTypeValue> DerivedTypes;
struct BaseClass{
Serialization::TypeID type;
std::string name;
Serialization::StringList strings;
DerivedTypes types;
};
typedef map<Serialization::TypeID, BaseClass> DefaultTypesPoly;
DefaultTypesPoly defaultTypesPoly_;
int expandLevels_;
bool undoEnabled_;
bool fullUndo_;
std::vector<PropertyTreeOperator> undoOperators_;
std::vector<PropertyTreeOperator> redoOperators_;
ConstStringList constStrings_;
friend class TreeImpl;
};
bool Serialize(Serialization::IArchive& ar, TreeSelection &selection, const char* name, const char* label);
// vim:ts=4 sw=4:
#endif // CRYINCLUDE_EDITORCOMMON_QPROPERTYTREE_PROPERTYTREEMODEL_H