/*************************************************************************** * This file is part of the Lime Report project * * Copyright (C) 2015 by Alexander Arin * * arin_a@bk.ru * * * ** GNU General Public License Usage ** * * * This library is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ** GNU Lesser General Public License ** * * * This library is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation, either version 3 of the * * License, or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public * * License along with this library. * * If not, see . * * * * 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 General Public License for more details. * ****************************************************************************/ #include "lrobjectpropitem.h" #include "lrobjectitemmodel.h" #ifdef INSPECT_BASEDESIGN #include "lrbasedesignintf.h" #endif #include namespace LimeReport { bool lesThen(ObjectPropItem* v1, ObjectPropItem* v2){ return v1->displayName().compare(v2->displayName())<0; } ObjectPropItem::ObjectPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, ObjectPropItem *parent, bool isClass) :m_object(object), m_name(name), m_displayName(displayName), m_haveValue(false), m_parent(parent), m_colorIndex(-1), m_readonly(true), m_model(0), m_isClass(isClass), m_changingValue(false), m_translatePropperty(true) { if (parent) setModel(parent->model()); m_index=QModelIndex(); //if (objects) foreach(QObject* item, *objects) m_objects.append(item); m_objects = objects; #ifdef INSPECT_BASEDESIGN BaseDesignIntf * item = dynamic_cast(object); if (item){ connect(item,SIGNAL(propertyChanged(QString,QVariant,QVariant)),this,SLOT(slotPropertyChanged(QString,QVariant,QVariant))); connect(item,SIGNAL(propertyObjectNameChanged(QString,QString)),this,SLOT(slotPropertyObjectName(QString,QString))); } #endif } ObjectPropItem::ObjectPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly) :m_object(object), m_name(name), m_displayName(displayName), m_value(value), m_haveValue(true), m_parent(parent), m_colorIndex(-1), m_readonly(readonly), m_model(0), m_isClass(false), m_changingValue(false), m_translatePropperty(true) { if (parent) setModel(parent->model()); m_index=QModelIndex(); //if (objects) foreach(QObject* item, *objects) m_objects.append(item); m_objects = objects; #ifdef INSPECT_BASEDESIGN BaseDesignIntf * item = dynamic_cast(object); if (item){ connect(item,SIGNAL(propertyChanged(QString,QVariant,QVariant)),this,SLOT(slotPropertyChanged(QString,QVariant,QVariant))); connect(item,SIGNAL(propertyObjectNameChanged(QString,QString)),this,SLOT(slotPropertyObjectName(QString,QString))); } #endif } ObjectPropItem::~ObjectPropItem(){ qDeleteAll(m_childItems); } int ObjectPropItem::childCount(){ return m_childItems.count(); } void ObjectPropItem::appendItem(ObjectPropItem *item){ m_childItems.append(item); if (m_parent && (!item->isClass())) m_parent->m_globalPropList.append(item); } void ObjectPropItem::sortItem() { qSort(m_childItems.begin(), m_childItems.end(), lesThen); } QVariant ObjectPropItem::propertyValue() const { return m_value; } void ObjectPropItem::setPropertyValue(QVariant value){ m_value=value; LimeReport::QObjectPropertyModel *itemModel=dynamic_cast(model()); if (itemModel){ itemModel->itemDataChanged(modelIndex()); foreach(ObjectPropItem*item, children()){ if (item->modelIndex().isValid()) itemModel->itemDataChanged(item->modelIndex()); } } } QString ObjectPropItem::displayName() const { return isTranslateProperty() ? m_displayName : propertyName(); } int ObjectPropItem::row(){ if (m_parent) return m_parent->m_childItems.indexOf(const_cast(this)); return 0; } ObjectPropItem * ObjectPropItem::child(int row){ return m_childItems[row]; } void ObjectPropItem::setColorIndex(int value) { m_colorIndex=value; for (int i=0;isetColorIndex(value); } } #ifdef INSPECT_BASEDESIGN void ObjectPropItem::slotPropertyChanged(const QString &name, QVariant, QVariant newValue) { if (name.compare(propertyName(),Qt::CaseInsensitive)==0 && !isValueChanging()){ setPropertyValue(newValue); } } void ObjectPropItem::slotPropertyObjectName(const QString &oldValue, const QString &newValue) { Q_UNUSED(oldValue) if (propertyName().compare("objectName",Qt::CaseInsensitive)==0 && !isValueChanging()){ setPropertyValue(newValue); } } #endif void ObjectPropItem::setValueToObject(const QString &propertyName, QVariant propertyValue) { object()->setProperty(propertyName.toLatin1(),propertyValue); if (objects()){ foreach (QObject* item, *objects()) { if (item->metaObject()->indexOfProperty(propertyName.toLatin1())!=-1) item->setProperty(propertyName.toLatin1(), propertyValue); } } } bool ObjectPropItem::isTranslateProperty() const { return m_translatePropperty; } void ObjectPropItem::setTranslateProperty(bool translatePropperty) { m_translatePropperty = translatePropperty; } ObjectPropItem * ObjectPropItem::findChild(const QString &name) { foreach(ObjectPropItem* item,m_childItems){ if (item->propertyName()==name) return item; } return 0; } ObjectPropItem *ObjectPropItem::findPropertyItem(const QString &propertyName) { foreach(ObjectPropItem* item,m_globalPropList){ if (item->propertyName()==propertyName) return item; } return 0; } void ObjectPropItem::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const { editor->setGeometry(option.rect); } void ObjectPropItem::updatePropertyValue() { m_model->setData(m_index,m_object->property(m_name.toLatin1())); } bool ObjectPropItem::paint(QPainter *, const StyleOptionViewItem &, const QModelIndex &) { return false; } QString ObjectPropItem::displayValue() const { return m_value.toString(); } }