DiagramDesigner/pluginManager/source/genericPluginAdapter.cpp

201 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// genericPluginAdapter.cpp
#include "genericPluginAdapter.h"
#include "pluginCommon/ICanvasItem.h"
#include <QDebug>
#include <QPainterPath>
#include <QVariantMap>
GenericPluginAdapter::GenericPluginAdapter(ICanvasItem *pluginItem, QObject *parent)
: IPluginAdapter(parent)
, m_pluginItem(pluginItem)
{
if (!m_pluginItem) {
qWarning() << "GenericPluginAdapter: pluginItem is null!";
return;
}
connectSignals();
updateCache();
qDebug() << "GenericPluginAdapter created for plugin:" << m_pluginItem->typeId();
}
GenericPluginAdapter::~GenericPluginAdapter()
{
if (m_pluginItem) {
m_pluginItem->deleteLater();
}
}
QString GenericPluginAdapter::pluginType() const
{
return m_pluginItem ? m_pluginItem->typeId() : QString();
}
QRectF GenericPluginAdapter::bounds() const
{
return m_cachedBounds;
}
void GenericPluginAdapter::setBounds(const QRectF &bounds)
{
if (m_pluginItem && bounds.isValid()) {
m_pluginItem->setBounds(bounds);
}
}
void GenericPluginAdapter::paint(QPainter *painter, const QRectF &bounds)
{
if (m_pluginItem && painter) {
m_pluginItem->draw(painter, bounds);
}
}
QPainterPath GenericPluginAdapter::shape() const
{
// 返回简单的矩形路径
QPainterPath path;
path.addRect(m_cachedBounds);
return path;
}
QVariant GenericPluginAdapter::property(const QString &key) const
{
return m_pluginItem ? m_pluginItem->property(key) : QVariant();
}
void GenericPluginAdapter::setProperty(const QString &key, const QVariant &value)
{
if (m_pluginItem) {
m_pluginItem->setProperty(key, value);
}
}
void GenericPluginAdapter::move(const QPointF &delta)
{
if (m_pluginItem && !delta.isNull()) {
QRectF bounds = m_pluginItem->bounds();
bounds.translate(delta);
m_pluginItem->setBounds(bounds);
}
}
void GenericPluginAdapter::resize(const QRectF &newBounds)
{
setBounds(newBounds);
}
bool GenericPluginAdapter::isSelected() const
{
return m_selected;
}
void GenericPluginAdapter::setSelected(bool selected)
{
if (m_selected != selected) {
m_selected = selected;
emit selectionChanged(selected);
}
}
QVariantMap GenericPluginAdapter::saveState() const
{
QVariantMap state;
if (!m_pluginItem) {
return state;
}
// 保存基本信息
state["type"] = m_pluginItem->typeId();
state["selected"] = m_selected;
// 保存几何信息
QRectF bounds = m_pluginItem->bounds();
state["x"] = bounds.x();
state["y"] = bounds.y();
state["width"] = bounds.width();
state["height"] = bounds.height();
// 保存属性
QVariantMap properties;
// 这里可以保存插件的关键属性
// 例如properties["fillColor"] = m_pluginItem->property("fillColor");
state["properties"] = properties;
return state;
}
bool GenericPluginAdapter::loadState(const QVariantMap &state)
{
if (!m_pluginItem) {
return false;
}
// 加载几何信息
if (state.contains("x") && state.contains("y") &&
state.contains("width") && state.contains("height")) {
QRectF bounds(
state["x"].toReal(),
state["y"].toReal(),
state["width"].toReal(),
state["height"].toReal()
);
m_pluginItem->setBounds(bounds);
}
// 加载选择状态
if (state.contains("selected")) {
setSelected(state["selected"].toBool());
}
// 加载属性
if (state.contains("properties")) {
QVariantMap properties = state["properties"].toMap();
for (auto it = properties.begin(); it != properties.end(); ++it) {
m_pluginItem->setProperty(it.key(), it.value());
}
}
return true;
}
ICanvasItem* GenericPluginAdapter::pluginItem() const
{
return m_pluginItem;
}
void GenericPluginAdapter::updateCache()
{
if (m_pluginItem) {
m_cachedBounds = m_pluginItem->bounds();
}
}
void GenericPluginAdapter::connectSignals()
{
if (!m_pluginItem) {
return;
}
connect(m_pluginItem, &ICanvasItem::boundsChanged,
this, &GenericPluginAdapter::onPluginBoundsChanged);
connect(m_pluginItem, &ICanvasItem::propertyChanged,
this, &GenericPluginAdapter::onPluginPropertyChanged);
}
void GenericPluginAdapter::onPluginBoundsChanged(const QRectF &newBounds)
{
m_cachedBounds = newBounds;
emit boundsChanged(newBounds);
emit adapterChanged();
}
void GenericPluginAdapter::onPluginPropertyChanged(const QString &key, const QVariant &value)
{
emit propertyChanged(key, value);
emit adapterChanged();
}