logplus/logPlus/variantfactory.cpp
2025-10-29 17:23:30 +08:00

136 lines
5.1 KiB
C++

/****************************************************************************
**
** Copyright (C) 2006 Trolltech ASA. All rights reserved.
**
** This file is part of the documentation of Qt. It was originally
** published as part of Qt Quarterly.
**
** This file may be used under the terms of the GNU General Public License
** version 2.0 as published by the Free Software Foundation or under the
** terms of the Qt Commercial License Agreement. The respective license
** texts for these are provided with the open source and commercial
** editions of Qt.
**
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://www.trolltech.com/products/qt/licensing.html or contact the
** sales department at sales@trolltech.com.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/
#include "variantfactory.h"
#include "variantmanager.h"
#include "fileedit.h"
VariantFactory::~VariantFactory()
{
QList<FileEdit *> editors = theEditorToProperty.keys();
QListIterator<FileEdit *> it(editors);
while (it.hasNext())
delete it.next();
}
void VariantFactory::connectPropertyManager(QtVariantPropertyManager *manager)
{
connect(manager, SIGNAL(valueChanged(QtProperty *, const QVariant &)),
this, SLOT(slotPropertyChanged(QtProperty *, const QVariant &)));
connect(manager, SIGNAL(attributeChanged(QtProperty *, const QString &, const QVariant &)),
this, SLOT(slotPropertyAttributeChanged(QtProperty *, const QString &, const QVariant &)));
QtVariantEditorFactory::connectPropertyManager(manager);
}
QWidget *VariantFactory::createEditor(QtVariantPropertyManager *manager,
QtProperty *property, QWidget *parent)
{
if (manager->propertyType(property) == VariantManager::filePathTypeId()) {
FileEdit *editor = new FileEdit(parent);
editor->setFilePath(manager->value(property).toString());
editor->setFilter(manager->attributeValue(property, QLatin1String("filter")).toString());
theCreatedEditors[property].append(editor);
theEditorToProperty[editor] = property;
connect(editor, SIGNAL(filePathChanged(const QString &)),
this, SLOT(slotSetValue(const QString &)));
connect(editor, SIGNAL(destroyed(QObject *)),
this, SLOT(slotEditorDestroyed(QObject *)));
return editor;
}
return QtVariantEditorFactory::createEditor(manager, property, parent);
}
void VariantFactory::disconnectPropertyManager(QtVariantPropertyManager *manager)
{
disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QVariant &)),
this, SLOT(slotPropertyChanged(QtProperty *, const QVariant &)));
disconnect(manager, SIGNAL(attributeChanged(QtProperty *, const QString &, const QVariant &)),
this, SLOT(slotPropertyAttributeChanged(QtProperty *, const QString &, const QVariant &)));
QtVariantEditorFactory::disconnectPropertyManager(manager);
}
void VariantFactory::slotPropertyChanged(QtProperty *property,
const QVariant &value)
{
if (!theCreatedEditors.contains(property))
return;
QList<FileEdit *> editors = theCreatedEditors[property];
QListIterator<FileEdit *> itEditor(editors);
while (itEditor.hasNext())
itEditor.next()->setFilePath(value.toString());
}
void VariantFactory::slotPropertyAttributeChanged(QtProperty *property,
const QString &attribute, const QVariant &value)
{
if (!theCreatedEditors.contains(property))
return;
if (attribute != QLatin1String("filter"))
return;
QList<FileEdit *> editors = theCreatedEditors[property];
QListIterator<FileEdit *> itEditor(editors);
while (itEditor.hasNext())
itEditor.next()->setFilter(value.toString());
}
void VariantFactory::slotSetValue(const QString &value)
{
QObject *object = sender();
QMap<FileEdit *, QtProperty *>::ConstIterator itEditor =
theEditorToProperty.constBegin();
while (itEditor != theEditorToProperty.constEnd()) {
if (itEditor.key() == object) {
QtProperty *property = itEditor.value();
QtVariantPropertyManager *manager = propertyManager(property);
if (!manager)
return;
manager->setValue(property, value);
return;
}
itEditor++;
}
}
void VariantFactory::slotEditorDestroyed(QObject *object)
{
QMap<FileEdit *, QtProperty *>::ConstIterator itEditor =
theEditorToProperty.constBegin();
while (itEditor != theEditorToProperty.constEnd()) {
if (itEditor.key() == object) {
FileEdit *editor = itEditor.key();
QtProperty *property = itEditor.value();
theEditorToProperty.remove(editor);
theCreatedEditors[property].removeAll(editor);
if (theCreatedEditors[property].isEmpty())
theCreatedEditors.remove(property);
return;
}
itEditor++;
}
}