Files
create/src/Gui/propertyeditor/PropertyItem.h

799 lines
24 KiB
C++

/***************************************************************************
* Copyright (c) 2004 Werner Mayer <wmayer[at]users.sourceforge.net> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef PROPERTYEDITORITEM_H
#define PROPERTYEDITORITEM_H
#include <QObject>
#include <QPointer>
#include <QItemEditorFactory>
#include <vector>
#include <Base/Type.h>
#include <Base/Vector3D.h>
#include <Base/Matrix.h>
#include <Base/Placement.h>
#include <Base/Quantity.h>
#include <Base/UnitsApi.h>
#include <App/PropertyStandard.h>
#include <Gui/Widgets.h>
#include <Gui/ExpressionBinding.h>
Q_DECLARE_METATYPE(Base::Vector3f)
Q_DECLARE_METATYPE(Base::Vector3d)
Q_DECLARE_METATYPE(Base::Matrix4D)
Q_DECLARE_METATYPE(Base::Placement)
Q_DECLARE_METATYPE(Base::Quantity)
Q_DECLARE_METATYPE(QList<Base::Quantity>)
namespace Gui {
namespace Dialog { class TaskPlacement; }
namespace PropertyEditor {
class GuiExport PropertyItem : virtual public QObject, public Base::BaseClass, public ExpressionBinding
{
Q_OBJECT
TYPESYSTEM_HEADER();
public:
~PropertyItem();
/** Sets the current property objects. */
void setPropertyData( const std::vector<App::Property*>& );
void updateData();
const std::vector<App::Property*>& getPropertyData() const;
bool hasProperty(const App::Property*) const;
bool removeProperty(const App::Property*);
App::Property* getFirstProperty();
const App::Property* getFirstProperty() const;
/** Creates the appropriate editor for this item and sets the editor to the value of overrideValue(). */
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
virtual bool isSeparator() const { return false; }
/**override the bind functions to ensure we issue the propertyBound() call, which is then overloaded by
childs which like to be informed of a binding*/
virtual void bind(const App::Property& prop);
virtual void bind(const App::ObjectIdentifier& _path);
virtual void propertyBound() {};
void setParent(PropertyItem* parent);
PropertyItem *parent() const;
void appendChild(PropertyItem *child);
void removeChildren(int from, int to);
void setReadOnly(bool);
bool isReadOnly() const;
bool testStatus(App::Property::Status pos) const;
void setDecimals(int);
int decimals() const;
PropertyItem *child(int row);
int childCount() const;
int columnCount() const;
QString propertyName() const;
void setPropertyName(const QString&);
void setPropertyValue(const QString&);
QVariant data(int column, int role) const;
bool setData (const QVariant& value);
Qt::ItemFlags flags(int column) const;
int row() const;
void reset();
protected:
PropertyItem();
virtual QVariant decoration(const App::Property*) const;
virtual QVariant toolTip(const App::Property*) const;
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
virtual void initialize();
QString pythonIdentifier(const App::Property*) const;
private:
QString propName;
QVariant propData;
std::vector<App::Property*> propertyItems;
PropertyItem *parentItem;
QList<PropertyItem*> childItems;
bool readonly;
int precision;
bool cleared;
};
/**
* Change a string property.
* \author Werner Mayer
*/
class GuiExport PropertyStringItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyStringItem();
};
/**
* Change a font property.
* \author Werner Mayer
*/
class GuiExport PropertyFontItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyFontItem();
};
/**
* Dummy property to separate groups of properties.
* \author Werner Mayer
*/
class GuiExport PropertySeparatorItem : public PropertyItem
{
TYPESYSTEM_HEADER();
bool isSeparator() const { return true; }
QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
};
/**
* Change a number.
* \author Werner Mayer
*/
class GuiExport PropertyIntegerItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyIntegerItem();
};
/**
* Change a number with constraints.
* \author Werner Mayer
*/
class GuiExport PropertyIntegerConstraintItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyIntegerConstraintItem();
};
/**
* Change a floating point number.
* \author Werner Mayer
*/
class GuiExport PropertyFloatItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyFloatItem();
};
/**
* Change a Unit based floating point number.
* \author Juergen Riegel
*/
class GuiExport PropertyUnitItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
PropertyUnitItem();
};
/**
* Change a Unit based floating point number withing constraints.
* \author Stefan Troeger
*/
class GuiExport PropertyUnitConstraintItem: public PropertyUnitItem
{
TYPESYSTEM_HEADER();
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
protected:
PropertyUnitConstraintItem();
};
/**
* Change a floating point number with constraints.
* \author Werner Mayer
*/
class GuiExport PropertyFloatConstraintItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyFloatConstraintItem();
};
/**
* Change a floating point number.
* \author Werner Mayer
*/
class GuiExport PropertyAngleItem : public PropertyFloatItem
{
TYPESYSTEM_HEADER();
protected:
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant toString(const QVariant&) const;
protected:
PropertyAngleItem();
};
/**
* Edit properties of boolean type.
* \author Werner Mayer
*/
class GuiExport PropertyBoolItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyBoolItem();
};
/**
* Edit properties of vector type.
* \author Werner Mayer
*/
class PropertyFloatItem;
class GuiExport PropertyVectorItem: public PropertyItem
{
Q_OBJECT
Q_PROPERTY(double x READ x WRITE setX DESIGNABLE true USER true)
Q_PROPERTY(double y READ y WRITE setY DESIGNABLE true USER true)
Q_PROPERTY(double z READ z WRITE setZ DESIGNABLE true USER true)
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
double x() const;
void setX(double x);
double y() const;
void setY(double y);
double z() const;
void setZ(double z);
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyVectorItem();
virtual void propertyBound();
private:
PropertyFloatItem* m_x;
PropertyFloatItem* m_y;
PropertyFloatItem* m_z;
};
/**
* Edit properties of vector type which hold distances.
* \author Stefan Troeger
*/
class PropertyUnitItem;
class GuiExport PropertyVectorDistanceItem: public PropertyItem
{
Q_OBJECT
Q_PROPERTY(Base::Quantity x READ x WRITE setX DESIGNABLE true USER true)
Q_PROPERTY(Base::Quantity y READ y WRITE setY DESIGNABLE true USER true)
Q_PROPERTY(Base::Quantity z READ z WRITE setZ DESIGNABLE true USER true)
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
virtual void propertyBound();
Base::Quantity x() const;
void setX(Base::Quantity x);
Base::Quantity y() const;
void setY(Base::Quantity y);
Base::Quantity z() const;
void setZ(Base::Quantity z);
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
PropertyVectorDistanceItem();
private:
PropertyUnitItem* m_x;
PropertyUnitItem* m_y;
PropertyUnitItem* m_z;
};
class GuiExport PropertyMatrixItem: public PropertyItem
{
Q_OBJECT
Q_PROPERTY(double A11 READ getA11 WRITE setA11 DESIGNABLE true USER true)
Q_PROPERTY(double A12 READ getA12 WRITE setA12 DESIGNABLE true USER true)
Q_PROPERTY(double A13 READ getA13 WRITE setA13 DESIGNABLE true USER true)
Q_PROPERTY(double A14 READ getA14 WRITE setA14 DESIGNABLE true USER true)
Q_PROPERTY(double A21 READ getA21 WRITE setA21 DESIGNABLE true USER true)
Q_PROPERTY(double A22 READ getA22 WRITE setA22 DESIGNABLE true USER true)
Q_PROPERTY(double A23 READ getA23 WRITE setA23 DESIGNABLE true USER true)
Q_PROPERTY(double A24 READ getA24 WRITE setA24 DESIGNABLE true USER true)
Q_PROPERTY(double A31 READ getA31 WRITE setA31 DESIGNABLE true USER true)
Q_PROPERTY(double A32 READ getA32 WRITE setA32 DESIGNABLE true USER true)
Q_PROPERTY(double A33 READ getA33 WRITE setA33 DESIGNABLE true USER true)
Q_PROPERTY(double A34 READ getA34 WRITE setA34 DESIGNABLE true USER true)
Q_PROPERTY(double A41 READ getA41 WRITE setA41 DESIGNABLE true USER true)
Q_PROPERTY(double A42 READ getA42 WRITE setA42 DESIGNABLE true USER true)
Q_PROPERTY(double A43 READ getA43 WRITE setA43 DESIGNABLE true USER true)
Q_PROPERTY(double A44 READ getA44 WRITE setA44 DESIGNABLE true USER true)
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
double getA11() const;
void setA11(double A11);
double getA12() const;
void setA12(double A12);
double getA13() const;
void setA13(double A13);
double getA14() const;
void setA14(double A14);
double getA21() const;
void setA21(double A21);
double getA22() const;
void setA22(double A22);
double getA23() const;
void setA23(double A23);
double getA24() const;
void setA24(double A24);
double getA31() const;
void setA31(double A31);
double getA32() const;
void setA32(double A32);
double getA33() const;
void setA33(double A33);
double getA34() const;
void setA34(double A34);
double getA41() const;
void setA41(double A41);
double getA42() const;
void setA42(double A42);
double getA43() const;
void setA43(double A43);
double getA44() const;
void setA44(double A44);
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyMatrixItem();
virtual QVariant toolTip(const App::Property*) const;
private:
PropertyFloatItem* m_a11;
PropertyFloatItem* m_a12;
PropertyFloatItem* m_a13;
PropertyFloatItem* m_a14;
PropertyFloatItem* m_a21;
PropertyFloatItem* m_a22;
PropertyFloatItem* m_a23;
PropertyFloatItem* m_a24;
PropertyFloatItem* m_a31;
PropertyFloatItem* m_a32;
PropertyFloatItem* m_a33;
PropertyFloatItem* m_a34;
PropertyFloatItem* m_a41;
PropertyFloatItem* m_a42;
PropertyFloatItem* m_a43;
PropertyFloatItem* m_a44;
};
class PlacementEditor : public Gui::LabelButton
{
Q_OBJECT
public:
PlacementEditor(const QString& name, QWidget * parent = 0);
~PlacementEditor();
private Q_SLOTS:
void updateValue(const QVariant& v, bool, bool);
private:
void browse();
void showValue(const QVariant& d);
private:
QPointer<Gui::Dialog::TaskPlacement> _task;
QString propertyname;
};
/**
* Edit properties of placement type.
* \author Werner Mayer
*/
class GuiExport PropertyPlacementItem: public PropertyItem
{
Q_OBJECT
Q_PROPERTY(Base::Quantity Angle READ getAngle WRITE setAngle DESIGNABLE true USER true)
Q_PROPERTY(Base::Vector3d Axis READ getAxis WRITE setAxis DESIGNABLE true USER true)
Q_PROPERTY(Base::Vector3d Position READ getPosition WRITE setPosition DESIGNABLE true USER true)
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
virtual void propertyBound();
Base::Quantity getAngle() const;
void setAngle(Base::Quantity);
Base::Vector3d getAxis() const;
void setAxis(const Base::Vector3d&);
Base::Vector3d getPosition() const;
void setPosition(const Base::Vector3d&);
protected:
PropertyPlacementItem();
~PropertyPlacementItem();
virtual QVariant toolTip(const App::Property*) const;
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
private:
bool init_axis;
bool changed_value;
double rot_angle;
Base::Vector3d rot_axis;
PropertyUnitItem * m_a;
PropertyVectorItem* m_d;
PropertyVectorDistanceItem* m_p;
};
/**
* Edit properties of enum type.
* \author Werner Mayer
*/
class GuiExport PropertyEnumItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyEnumItem();
};
/**
* Edit properties of string list type.
* \author Werner Mayer
*/
class GuiExport PropertyStringListItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyStringListItem();
};
/**
* Edit properties of float list type.
* \author Werner Mayer
*/
class GuiExport PropertyFloatListItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyFloatListItem();
};
/**
* Edit properties of float list type.
* \author Werner Mayer
*/
class GuiExport PropertyIntegerListItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyIntegerListItem();
};
/**
* Change a color property.
* \author Werner Mayer
*/
class GuiExport PropertyColorItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant decoration(const App::Property*) const;
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyColorItem();
};
/**
* Change a file.
* \author Werner Mayer
*/
class GuiExport PropertyFileItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyFileItem();
virtual QVariant toolTip(const App::Property*) const;
};
/**
* Change a path.
* \author Werner Mayer
*/
class GuiExport PropertyPathItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyPathItem();
virtual QVariant toolTip(const App::Property*) const;
};
/**
* Show path of included file.
* \author Werner Mayer
*/
class GuiExport PropertyTransientFileItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyTransientFileItem();
virtual QVariant toolTip(const App::Property*) const;
};
class LinkSelection : public QObject
{
Q_OBJECT
public:
LinkSelection(const QStringList&);
~LinkSelection();
public Q_SLOTS:
void select();
private:
QStringList link;
};
class LinkLabel : public QLabel
{
Q_OBJECT
public:
LinkLabel (QWidget * parent = 0);
virtual ~LinkLabel();
void setPropertyLink(const QStringList& o);
QStringList propertyLink() const;
protected Q_SLOTS:
void onLinkActivated(const QString&);
Q_SIGNALS:
void linkChanged(const QStringList&);
private:
QStringList link;
};
/**
* Edit properties of link type.
* \author Werner Mayer
*/
class GuiExport PropertyLinkItem: public PropertyItem
{
TYPESYSTEM_HEADER();
virtual QWidget* createEditor(QWidget* parent, const QObject* receiver, const char* method) const;
virtual void setEditorData(QWidget *editor, const QVariant& data) const;
virtual QVariant editorData(QWidget *editor) const;
protected:
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
protected:
PropertyLinkItem();
};
class PropertyItemEditorFactory : public QItemEditorFactory
{
public:
PropertyItemEditorFactory();
virtual ~PropertyItemEditorFactory();
virtual QWidget * createEditor ( QVariant::Type type, QWidget * parent ) const;
virtual QByteArray valuePropertyName ( QVariant::Type type ) const;
};
} // namespace PropertyEditor
} // namespace Gui
#endif // PROPERTYEDITORITEM_H