Property browser for tool Rotation.

--HG--
branch : feature
This commit is contained in:
Roman Telezhynskyi 2016-05-18 14:32:51 +03:00
parent 84a56545ea
commit 291c19d5a2
4 changed files with 185 additions and 20 deletions

View file

@ -490,7 +490,6 @@ void VToolOptionsPropertyBrowser::AddPropertyObjectName(Tool *i, const QString &
AddProperty(itemName, AttrName); AddProperty(itemName, AttrName);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template<class Tool> template<class Tool>
void VToolOptionsPropertyBrowser::AddPropertyPointName1(Tool *i, const QString &propertyName) void VToolOptionsPropertyBrowser::AddPropertyPointName1(Tool *i, const QString &propertyName)
@ -511,6 +510,17 @@ void VToolOptionsPropertyBrowser::AddPropertyPointName2(Tool *i, const QString &
AddProperty(itemName, AttrName2); AddProperty(itemName, AttrName2);
} }
//---------------------------------------------------------------------------------------------------------------------
template<class Tool>
void VToolOptionsPropertyBrowser::AddPropertyOperationSuffix(Tool *i, const QString &propertyName, bool readOnly)
{
auto itemSuffix = new VStringProperty(propertyName);
itemSuffix->setClearButtonEnable(true);
itemSuffix->setValue(i->Suffix());
itemSuffix->setReadOnly(readOnly);
AddProperty(itemSuffix, AttrSuffix);
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template<class Tool> template<class Tool>
void VToolOptionsPropertyBrowser::AddPropertyCrossPoint(Tool *i, const QString &propertyName) void VToolOptionsPropertyBrowser::AddPropertyCrossPoint(Tool *i, const QString &propertyName)
@ -654,6 +664,43 @@ void VToolOptionsPropertyBrowser::SetPointName2(const QString &name)
} }
} }
//---------------------------------------------------------------------------------------------------------------------
template<class Tool>
void VToolOptionsPropertyBrowser::SetOperationSuffix(const QString &suffix)
{
if (Tool *item = qgraphicsitem_cast<Tool *>(currentItem))
{
if (suffix == item->Suffix())
{
return;
}
if (suffix.isEmpty())
{
idToProperty[AttrSuffix]->setValue(item->Suffix());
return;
}
QRegularExpression rx(NameRegExp());
const QVector<QString> names = item->GetNames(suffix);
for (int i=0; i < names.size(); ++i)
{
if (not rx.match(names.at(i)).hasMatch() || not VContainer::IsUnique(names.at(i)))
{
idToProperty[AttrSuffix]->setValue(item->Suffix());
}
else
{
item->SetSuffix(suffix);
}
}
}
else
{
qWarning()<<"Can't cast item";
}
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template<class Type> template<class Type>
Type VToolOptionsPropertyBrowser::GetCrossPoint(const QVariant &value) Type VToolOptionsPropertyBrowser::GetCrossPoint(const QVariant &value)
@ -1538,6 +1585,24 @@ void VToolOptionsPropertyBrowser::ChangeDataToolCurveIntersectAxis(VProperty *pr
void VToolOptionsPropertyBrowser::ChangeDataToolRotation(VProperty *property) void VToolOptionsPropertyBrowser::ChangeDataToolRotation(VProperty *property)
{ {
SCASSERT(property != nullptr) SCASSERT(property != nullptr)
QVariant value = property->data(VProperty::DPC_Data, Qt::DisplayRole);
const QString id = propertyToId[property];
VToolRotation *i = qgraphicsitem_cast<VToolRotation *>(currentItem);
SCASSERT(i != nullptr);
switch (PropertiesList().indexOf(id))
{
case 38: // AttrSuffix
SetOperationSuffix<VToolRotation>(value.toString());
break;
case 5: // AttrAngle
i->SetFormulaAngle(value.value<VFormula>());
break;
default:
qWarning()<<"Unknown property type. id = "<<id;
break;
}
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -1927,6 +1992,10 @@ void VToolOptionsPropertyBrowser::ShowOptionsToolRotation(QGraphicsItem *item)
{ {
VToolRotation *i = qgraphicsitem_cast<VToolRotation *>(item); VToolRotation *i = qgraphicsitem_cast<VToolRotation *>(item);
i->ShowVisualization(true); i->ShowVisualization(true);
formView->setTitle(tr("Tool rotation"));
AddPropertyOperationSuffix(i, tr("Suffix"));
AddPropertyFormula(tr("Angle"), i->GetFormulaAngle(), AttrAngle);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -2390,7 +2459,12 @@ void VToolOptionsPropertyBrowser::UpdateOptionsToolCurveIntersectAxis()
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VToolOptionsPropertyBrowser::UpdateOptionsToolRotation() void VToolOptionsPropertyBrowser::UpdateOptionsToolRotation()
{ {
VToolRotation *i = qgraphicsitem_cast<VToolRotation *>(currentItem);
idToProperty[AttrSuffix]->setValue(i->Suffix());
QVariant valueAngle;
valueAngle.setValue(i->GetFormulaAngle());
idToProperty[AttrAngle]->setValue(valueAngle);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -2433,6 +2507,7 @@ QStringList VToolOptionsPropertyBrowser::PropertiesList() const
<< AttrVCrossPoint /* 34 */ << AttrVCrossPoint /* 34 */
<< AttrHCrossPoint /* 35 */ << AttrHCrossPoint /* 35 */
<< AttrLength1 /* 36 */ << AttrLength1 /* 36 */
<< AttrLength2; /* 37 */ << AttrLength2 /* 37 */
<< AttrSuffix; /* 38 */
return attr; return attr;
} }

View file

@ -74,6 +74,9 @@ private:
template<class Tool> template<class Tool>
void SetPointName2(const QString &name); void SetPointName2(const QString &name);
template<class Tool>
void SetOperationSuffix(const QString &suffix);
template<class Type> template<class Type>
Type GetCrossPoint(const QVariant &value); Type GetCrossPoint(const QVariant &value);
@ -95,6 +98,9 @@ private:
template<class Tool> template<class Tool>
void AddPropertyPointName2(Tool *i, const QString &propertyName); void AddPropertyPointName2(Tool *i, const QString &propertyName);
template<class Tool>
void AddPropertyOperationSuffix(Tool *i, const QString &propertyName, bool readOnly = false);
template<class Tool> template<class Tool>
void AddPropertyCrossPoint(Tool *i, const QString &propertyName); void AddPropertyCrossPoint(Tool *i, const QString &propertyName);

View file

@ -39,6 +39,7 @@
#include "../vwidgets/vsimplepoint.h" #include "../vwidgets/vsimplepoint.h"
#include "../vwidgets/vsimplecurve.h" #include "../vwidgets/vsimplecurve.h"
#include "../../../undocommands/label/rotationmovelabel.h" #include "../../../undocommands/label/rotationmovelabel.h"
#include "../vpatterndb/vformula.h"
const QString VToolRotation::ToolType = QStringLiteral("rotation"); const QString VToolRotation::ToolType = QStringLiteral("rotation");
const QString VToolRotation::TagItem = QStringLiteral("item"); const QString VToolRotation::TagItem = QStringLiteral("item");
@ -53,7 +54,7 @@ VToolRotation::VToolRotation(VAbstractPattern *doc, VContainer *data, quint32 id
: VDrawTool(doc, data, id), : VDrawTool(doc, data, id),
QGraphicsItem(parent), QGraphicsItem(parent),
origPointId(origPointId), origPointId(origPointId),
angle(angle), formulaAngle(angle),
suffix(suffix), suffix(suffix),
source(source), source(source),
destination(destination), destination(destination),
@ -142,7 +143,7 @@ void VToolRotation::setDialog()
DialogRotation *dialogTool = qobject_cast<DialogRotation*>(dialog); DialogRotation *dialogTool = qobject_cast<DialogRotation*>(dialog);
SCASSERT(dialogTool != nullptr); SCASSERT(dialogTool != nullptr);
dialogTool->SetOrigPointId(origPointId); dialogTool->SetOrigPointId(origPointId);
dialogTool->SetAngle(angle); dialogTool->SetAngle(formulaAngle);
dialogTool->SetSuffix(suffix); dialogTool->SetSuffix(suffix);
} }
@ -350,6 +351,52 @@ void VToolRotation::ExtractData(VAbstractPattern *doc, const QDomElement &domEle
} }
} }
//---------------------------------------------------------------------------------------------------------------------
QVector<QString> VToolRotation::GetNames(const QString &suffix) const
{
QVector<QString> names;
for (int i = 0; i < source.size(); ++i)
{
const QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(source.at(i));
// This check helps to find missed objects in the switch
Q_STATIC_ASSERT_X(static_cast<int>(GOType::Unknown) == 7, "Not all objects were handled.");
#if defined(Q_CC_GNU)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wswitch-default"
#endif
switch(static_cast<GOType>(obj->getType()))
{
case GOType::Point:
{
const QSharedPointer<VPointF> point = VAbstractTool::data.GeometricObject<VPointF>(source.at(i));
names.append(point->name() + suffix);
break;
}
case GOType::Arc:
case GOType::EllipticalArc:
case GOType::Spline:
case GOType::SplinePath:
case GOType::CubicBezier:
case GOType::CubicBezierPath:
{
const QSharedPointer<VAbstractCurve> curve =
VAbstractTool::data.GeometricObject<VAbstractCurve>(source.at(i));
names.append(curve->name() + suffix);
break;
}
case GOType::Unknown:
break;
}
#if defined(Q_CC_GNU)
#pragma GCC diagnostic pop
#endif
}
return names;
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QString VToolRotation::getTagName() const QString VToolRotation::getTagName() const
{ {
@ -362,12 +409,43 @@ void VToolRotation::SetEnabled(bool enabled)
this->setEnabled(enabled); this->setEnabled(enabled);
} }
//---------------------------------------------------------------------------------------------------------------------
VFormula VToolRotation::GetFormulaAngle() const
{
VFormula fAngle(formulaAngle, getData());
fAngle.setCheckZero(false);
fAngle.setToolId(id);
fAngle.setPostfix(degreeSymbol);
return fAngle;
}
//---------------------------------------------------------------------------------------------------------------------
void VToolRotation::SetFormulaAngle(const VFormula &value)
{
if (value.error() == false)
{
formulaAngle = value.GetFormula(FormulaType::FromUser);
QSharedPointer<VGObject> obj = VAbstractTool::data.GetFakeGObject(id);
SaveOption(obj);
}
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QString VToolRotation::Suffix() const QString VToolRotation::Suffix() const
{ {
return suffix; return suffix;
} }
//---------------------------------------------------------------------------------------------------------------------
void VToolRotation::SetSuffix(const QString &suffix)
{
// Don't know if need check name here.
this->suffix = suffix;
QSharedPointer<VGObject> obj = VAbstractTool::data.GetFakeGObject(id);
SaveOption(obj);
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VToolRotation::GroupVisibility(quint32 object, bool visible) void VToolRotation::GroupVisibility(quint32 object, bool visible)
{ {
@ -620,7 +698,7 @@ void VToolRotation::SetVisualization()
visual->SetObjects(source); visual->SetObjects(source);
visual->SetOriginPointId(origPointId); visual->SetOriginPointId(origPointId);
visual->SetAngle(qApp->TrVars()->FormulaToUser(angle)); visual->SetAngle(qApp->TrVars()->FormulaToUser(formulaAngle));
visual->RefreshGeometry(); visual->RefreshGeometry();
} }
} }
@ -718,7 +796,7 @@ void VToolRotation::SaveDialog(QDomElement &domElement)
void VToolRotation::ReadToolAttributes(const QDomElement &domElement) void VToolRotation::ReadToolAttributes(const QDomElement &domElement)
{ {
origPointId = doc->GetParametrUInt(domElement, AttrCenter, NULL_ID_STR); origPointId = doc->GetParametrUInt(domElement, AttrCenter, NULL_ID_STR);
angle = doc->GetParametrString(domElement, AttrAngle, "0"); formulaAngle = doc->GetParametrString(domElement, AttrAngle, "0");
suffix = doc->GetParametrString(domElement, AttrSuffix); suffix = doc->GetParametrString(domElement, AttrSuffix);
} }
@ -729,7 +807,7 @@ void VToolRotation::SaveOptions(QDomElement &tag, QSharedPointer<VGObject> &obj)
doc->SetAttribute(tag, AttrType, ToolType); doc->SetAttribute(tag, AttrType, ToolType);
doc->SetAttribute(tag, AttrCenter, QString().setNum(origPointId)); doc->SetAttribute(tag, AttrCenter, QString().setNum(origPointId));
doc->SetAttribute(tag, AttrAngle, angle); doc->SetAttribute(tag, AttrAngle, formulaAngle);
doc->SetAttribute(tag, AttrSuffix, suffix); doc->SetAttribute(tag, AttrSuffix, suffix);
QDomElement tagObjects = doc->createElement(TagSource); QDomElement tagObjects = doc->createElement(TagSource);

View file

@ -40,6 +40,7 @@ struct DestinationItem
class VAbstractSimple; class VAbstractSimple;
class VSimpleCurve; class VSimpleCurve;
class VFormula;
class VToolRotation : public VDrawTool, public QGraphicsItem class VToolRotation : public VDrawTool, public QGraphicsItem
{ {
@ -52,12 +53,13 @@ public:
virtual void setDialog() Q_DECL_OVERRIDE; virtual void setDialog() Q_DECL_OVERRIDE;
static VToolRotation* Create(DialogTool *dialog, VMainGraphicsScene *scene, VAbstractPattern *doc, static VToolRotation* Create(DialogTool *dialog, VMainGraphicsScene *scene, VAbstractPattern *doc,
VContainer *data); VContainer *data);
static VToolRotation* Create(const quint32 _id, const quint32 &origin, QString &angle, const QString &suffix, static VToolRotation* Create(const quint32 _id, const quint32 &origin, QString &formulaAngle, const QString &suffix,
const QVector<quint32> &source, const QVector<DestinationItem> &destination, const QVector<quint32> &source, const QVector<DestinationItem> &destination,
VMainGraphicsScene *scene, VAbstractPattern *doc, VContainer *data, VMainGraphicsScene *scene, VAbstractPattern *doc, VContainer *data,
const Document &parse, const Source &typeCreation); const Document &parse, const Source &typeCreation);
static void ExtractData(VAbstractPattern *doc, const QDomElement &domElement, QVector<quint32> &source, static void ExtractData(VAbstractPattern *doc, const QDomElement &domElement, QVector<quint32> &source,
QVector<DestinationItem> &destination); QVector<DestinationItem> &destination);
QVector<QString> GetNames(const QString &suffix) const;
static const QString ToolType; static const QString ToolType;
static const QString TagItem; static const QString TagItem;
static const QString TagSource; static const QString TagSource;
@ -68,7 +70,11 @@ public:
void SetEnabled(bool enabled); void SetEnabled(bool enabled);
VFormula GetFormulaAngle() const;
void SetFormulaAngle(const VFormula &value);
QString Suffix() const; QString Suffix() const;
void SetSuffix(const QString &suffix);
virtual void GroupVisibility(quint32 object, bool visible) Q_DECL_OVERRIDE; virtual void GroupVisibility(quint32 object, bool visible) Q_DECL_OVERRIDE;
virtual void ShowVisualization(bool show) Q_DECL_OVERRIDE; virtual void ShowVisualization(bool show) Q_DECL_OVERRIDE;
@ -118,7 +124,7 @@ private slots:
private: private:
Q_DISABLE_COPY(VToolRotation) Q_DISABLE_COPY(VToolRotation)
quint32 origPointId; quint32 origPointId;
QString angle; QString formulaAngle;
QString suffix; QString suffix;
QVector<quint32> source; QVector<quint32> source;
@ -127,39 +133,39 @@ private:
QMap<quint32, VAbstractSimple *> rObjects; QMap<quint32, VAbstractSimple *> rObjects;
VToolRotation(VAbstractPattern *doc, VContainer *data, quint32 id, quint32 origPointId, VToolRotation(VAbstractPattern *doc, VContainer *data, quint32 id, quint32 origPointId,
const QString &angle, const QString &suffix, const QVector<quint32> &source, const QString &formulaAngle, const QString &suffix, const QVector<quint32> &source,
const QVector<DestinationItem> &destination, const Source &typeCreation, const QVector<DestinationItem> &destination, const Source &typeCreation,
QGraphicsItem *parent = nullptr); QGraphicsItem *parent = nullptr);
void UpdateNamePosition(quint32 id); void UpdateNamePosition(quint32 id);
static DestinationItem CreatePoint(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static DestinationItem CreatePoint(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data); const QString &suffix, VContainer *data);
template <class Item> template <class Item>
static DestinationItem CreateItem(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static DestinationItem CreateItem(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data); const QString &suffix, VContainer *data);
static DestinationItem CreateArc(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static DestinationItem CreateArc(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data); const QString &suffix, VContainer *data);
template <class Item> template <class Item>
static DestinationItem CreateCurve(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static DestinationItem CreateCurve(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data); const QString &suffix, VContainer *data);
template <class Item> template <class Item>
static DestinationItem CreateCurveWithSegments(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static DestinationItem CreateCurveWithSegments(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data); const QString &suffix, VContainer *data);
static void UpdatePoint(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static void UpdatePoint(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data, quint32 id, qreal mx, qreal my); const QString &suffix, VContainer *data, quint32 id, qreal mx, qreal my);
template <class Item> template <class Item>
static void UpdateItem(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static void UpdateItem(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data, quint32 id); const QString &suffix, VContainer *data, quint32 id);
static void UpdateArc(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static void UpdateArc(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data, quint32 id); const QString &suffix, VContainer *data, quint32 id);
template <class Item> template <class Item>
static void UpdateCurve(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static void UpdateCurve(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data, quint32 id); const QString &suffix, VContainer *data, quint32 id);
template <class Item> template <class Item>
static void UpdateCurveWithSegments(quint32 idTool, quint32 idItem, const QPointF &origin, qreal angle, static void UpdateCurveWithSegments(quint32 idTool, quint32 idItem, const QPointF &origin, qreal formulaAngle,
const QString &suffix, VContainer *data, quint32 id); const QString &suffix, VContainer *data, quint32 id);
template <typename T> template <typename T>