201 lines
4.6 KiB
C++
201 lines
4.6 KiB
C++
// 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();
|
||
}
|