diff --git a/interface/src/ui/MetavoxelEditor.cpp b/interface/src/ui/MetavoxelEditor.cpp index c97832d791..e37669e907 100644 --- a/interface/src/ui/MetavoxelEditor.cpp +++ b/interface/src/ui/MetavoxelEditor.cpp @@ -45,12 +45,19 @@ MetavoxelEditor::MetavoxelEditor() : attributeGroup->setLayout(attributeLayout); attributeLayout->addWidget(_attributes = new QListWidget()); - connect(_attributes, SIGNAL(itemSelectionChanged()), SLOT(updateValueEditor())); + connect(_attributes, SIGNAL(itemSelectionChanged()), SLOT(selectedAttributeChanged())); + + QHBoxLayout* attributeButtonLayout = new QHBoxLayout(); + attributeLayout->addLayout(attributeButtonLayout); QPushButton* newAttribute = new QPushButton("New..."); - attributeLayout->addWidget(newAttribute); + attributeButtonLayout->addWidget(newAttribute); connect(newAttribute, SIGNAL(clicked()), SLOT(createNewAttribute())); + attributeButtonLayout->addWidget(_deleteAttribute = new QPushButton("Delete")); + _deleteAttribute->setEnabled(false); + connect(_deleteAttribute, SIGNAL(clicked()), SLOT(deleteSelectedAttribute())); + QFormLayout* formLayout = new QFormLayout(); topLayout->addLayout(formLayout); @@ -141,19 +148,20 @@ bool MetavoxelEditor::eventFilter(QObject* watched, QEvent* event) { return false; } -void MetavoxelEditor::updateValueEditor() { +void MetavoxelEditor::selectedAttributeChanged() { QString selected = getSelectedAttribute(); if (selected.isNull()) { + _deleteAttribute->setEnabled(false); _value->setVisible(false); return; } + AttributePointer attribute = AttributeRegistry::getInstance()->getAttribute(selected); + _value->setVisible(true); if (_valueArea->widget()) { delete _valueArea->widget(); } - - AttributePointer attribute = AttributeRegistry::getInstance()->getAttribute(selected); QWidget* editor = attribute->createEditor(); if (editor) { _valueArea->setWidget(editor); @@ -188,6 +196,10 @@ void MetavoxelEditor::createNewAttribute() { updateAttributes(nameText); } +void MetavoxelEditor::deleteSelectedAttribute() { + +} + void MetavoxelEditor::centerGridPosition() { const float CENTER_OFFSET = 0.625f; float eyePosition = (glm::inverse(getGridRotation()) * Application::getInstance()->getCamera()->getPosition()).z - diff --git a/interface/src/ui/MetavoxelEditor.h b/interface/src/ui/MetavoxelEditor.h index 9024837757..5e941f3540 100644 --- a/interface/src/ui/MetavoxelEditor.h +++ b/interface/src/ui/MetavoxelEditor.h @@ -17,6 +17,7 @@ class QComboBox; class QDoubleSpinBox; class QGroupBox; class QListWidget; +class QPushButton; class QScrollArea; /// Allows editing metavoxels. @@ -31,8 +32,9 @@ public: private slots: - void updateValueEditor(); + void selectedAttributeChanged(); void createNewAttribute(); + void deleteSelectedAttribute(); void centerGridPosition(); void alignGridPosition(); @@ -49,6 +51,7 @@ private: QVariant getValue() const; QListWidget* _attributes; + QPushButton* _deleteAttribute; QComboBox* _gridPlane; QDoubleSpinBox* _gridSpacing; QDoubleSpinBox* _gridPosition; diff --git a/libraries/metavoxels/src/AttributeRegistry.h b/libraries/metavoxels/src/AttributeRegistry.h index 56cff7eeb4..431fc59fe2 100644 --- a/libraries/metavoxels/src/AttributeRegistry.h +++ b/libraries/metavoxels/src/AttributeRegistry.h @@ -24,7 +24,7 @@ class QScriptValue; class Attribute; -typedef QSharedPointer AttributePointer; +typedef SharedObjectPointerTemplate AttributePointer; /// Maintains information about metavoxel attribute types. class AttributeRegistry { @@ -141,7 +141,7 @@ public: }; /// Represents a registered attribute. -class Attribute : public QObject { +class Attribute : public SharedObject { Q_OBJECT public: diff --git a/libraries/metavoxels/src/Bitstream.h b/libraries/metavoxels/src/Bitstream.h index cc776a742a..87ee66c661 100644 --- a/libraries/metavoxels/src/Bitstream.h +++ b/libraries/metavoxels/src/Bitstream.h @@ -31,7 +31,7 @@ class Bitstream; class OwnedAttributeValue; class TypeStreamer; -typedef QSharedPointer AttributePointer; +typedef SharedObjectPointerTemplate AttributePointer; /// Streams integer identifiers that conform to the following pattern: each ID encountered in the stream is either one that /// has been sent (received) before, or is one more than the highest previously encountered ID (starting at zero). This allows diff --git a/libraries/metavoxels/src/SharedObject.cpp b/libraries/metavoxels/src/SharedObject.cpp index f97e285bcf..0b93826aa5 100644 --- a/libraries/metavoxels/src/SharedObject.cpp +++ b/libraries/metavoxels/src/SharedObject.cpp @@ -72,62 +72,6 @@ bool SharedObject::equals(const SharedObject* other) const { return true; } -SharedObjectPointer::SharedObjectPointer(SharedObject* data) : _data(data) { - if (_data) { - _data->incrementReferenceCount(); - } -} - -SharedObjectPointer::SharedObjectPointer(const SharedObjectPointer& other) : _data(other._data) { - if (_data) { - _data->incrementReferenceCount(); - } -} - -SharedObjectPointer::~SharedObjectPointer() { - if (_data) { - _data->decrementReferenceCount(); - } -} - -void SharedObjectPointer::detach() { - if (_data && _data->getReferenceCount() > 1) { - _data->decrementReferenceCount(); - (_data = _data->clone())->incrementReferenceCount(); - } -} - -void SharedObjectPointer::reset() { - if (_data) { - _data->decrementReferenceCount(); - } - _data = NULL; -} - -SharedObjectPointer& SharedObjectPointer::operator=(SharedObject* data) { - if (_data) { - _data->decrementReferenceCount(); - } - if ((_data = data)) { - _data->incrementReferenceCount(); - } - return *this; -} - -SharedObjectPointer& SharedObjectPointer::operator=(const SharedObjectPointer& other) { - if (_data) { - _data->decrementReferenceCount(); - } - if ((_data = other._data)) { - _data->incrementReferenceCount(); - } - return *this; -} - -uint qHash(const SharedObjectPointer& pointer, uint seed) { - return qHash(pointer.data(), seed); -} - SharedObjectEditor::SharedObjectEditor(const QMetaObject* metaObject, QWidget* parent) : QWidget(parent) { QVBoxLayout* layout = new QVBoxLayout(); layout->setAlignment(Qt::AlignTop); diff --git a/libraries/metavoxels/src/SharedObject.h b/libraries/metavoxels/src/SharedObject.h index e439c4c7f0..fedbeb50d8 100644 --- a/libraries/metavoxels/src/SharedObject.h +++ b/libraries/metavoxels/src/SharedObject.h @@ -44,49 +44,99 @@ private: }; /// A pointer to a shared object. -class SharedObjectPointer { +template class SharedObjectPointerTemplate { public: - SharedObjectPointer(SharedObject* data = NULL); - SharedObjectPointer(const SharedObjectPointer& other); - ~SharedObjectPointer(); - - SharedObject* data() { return _data; } - const SharedObject* data() const { return _data; } - const SharedObject* constData() const { return _data; } + SharedObjectPointerTemplate(T* data = NULL); + SharedObjectPointerTemplate(const SharedObjectPointerTemplate& other); + ~SharedObjectPointerTemplate(); + T* data() const { return _data; } + void detach(); - void swap(SharedObjectPointer& other) { qSwap(_data, other._data); } + void swap(SharedObjectPointerTemplate& other) { qSwap(_data, other._data); } void reset(); - operator SharedObject*() { return _data; } - operator const SharedObject*() const { return _data; } - bool operator!() const { return !_data; } - - bool operator!=(const SharedObjectPointer& other) const { return _data != other._data; } - - SharedObject& operator*() { return *_data; } - const SharedObject& operator*() const { return *_data; } - - SharedObject* operator->() { return _data; } - const SharedObject* operator->() const { return _data; } - - SharedObjectPointer& operator=(SharedObject* data); - SharedObjectPointer& operator=(const SharedObjectPointer& other); - - bool operator==(const SharedObjectPointer& other) const { return _data == other._data; } - -private: + operator T*() const { return _data; } + T& operator*() const { return *_data; } + T* operator->() const { return _data; } - SharedObject* _data; + SharedObjectPointerTemplate& operator=(T* data); + SharedObjectPointerTemplate& operator=(const SharedObjectPointerTemplate& other); + + bool operator==(const SharedObjectPointerTemplate& other) const { return _data == other._data; } + bool operator!=(const SharedObjectPointerTemplate& other) const { return _data != other._data; } + +private: + + T* _data; }; -Q_DECLARE_METATYPE(SharedObjectPointer) +template inline SharedObjectPointerTemplate::SharedObjectPointerTemplate(T* data) : _data(data) { + if (_data) { + _data->incrementReferenceCount(); + } +} -uint qHash(const SharedObjectPointer& pointer, uint seed = 0); +template inline SharedObjectPointerTemplate::SharedObjectPointerTemplate(const SharedObjectPointerTemplate& other) : + _data(other._data) { + + if (_data) { + _data->incrementReferenceCount(); + } +} + +template inline SharedObjectPointerTemplate::~SharedObjectPointerTemplate() { + if (_data) { + _data->decrementReferenceCount(); + } +} + +template inline void SharedObjectPointerTemplate::detach() { + if (_data && _data->getReferenceCount() > 1) { + _data->decrementReferenceCount(); + (_data = _data->clone())->incrementReferenceCount(); + } +} + +template inline void SharedObjectPointerTemplate::reset() { + if (_data) { + _data->decrementReferenceCount(); + } + _data = NULL; +} + +template inline SharedObjectPointerTemplate& SharedObjectPointerTemplate::operator=(T* data) { + if (_data) { + _data->decrementReferenceCount(); + } + if ((_data = data)) { + _data->incrementReferenceCount(); + } + return *this; +} + +template inline SharedObjectPointerTemplate& SharedObjectPointerTemplate::operator=( + const SharedObjectPointerTemplate& other) { + if (_data) { + _data->decrementReferenceCount(); + } + if ((_data = other._data)) { + _data->incrementReferenceCount(); + } + return *this; +} + +template uint qHash(const SharedObjectPointerTemplate& pointer, uint seed = 0) { + return qHash(pointer.data(), seed); +} + +typedef SharedObjectPointerTemplate SharedObjectPointer; + +Q_DECLARE_METATYPE(SharedObjectPointer) /// Allows editing shared object instances. class SharedObjectEditor : public QWidget {