90 lines
2.3 KiB
C++
90 lines
2.3 KiB
C++
|
|
#include "QCPSizeHandleManager.h"
|
|||
|
|
|
|||
|
|
QCPSizeHandleManager::QCPSizeHandleManager(QCustomPlot *parentPlot)
|
|||
|
|
: QCPLayerable(parentPlot)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QCPSizeHandleManager::~QCPSizeHandleManager()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QCPSizeHandleManager::addItem(QCPAbstractItem *item, bool showHandlesLines)
|
|||
|
|
{
|
|||
|
|
if (!item || mHandles.contains(item))
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if (item->positions().size() < 2) // 要改变item的大小,最起码要两个位置
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
QList<QCPSizeHandle *> handles;
|
|||
|
|
foreach (auto *position, item->positions()) {
|
|||
|
|
handles.push_back(addHandleToPosition(position));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ControlItemData data;
|
|||
|
|
data.showHandlesLines = showHandlesLines;
|
|||
|
|
data.handles = handles;
|
|||
|
|
mHandles.insert(item, data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QCPSizeHandleManager::handleItemMove(QCPAbstractItem *item, const QPointF &delta)
|
|||
|
|
{
|
|||
|
|
if (!item)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
auto positions = item->positions();
|
|||
|
|
foreach (auto *position, positions)
|
|||
|
|
position->setPixelPosition(position->pixelPosition() + delta);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QCPSizeHandleManager::handleItemResize(QCPSizeHandle *sizeHandle, const QPointF &delta)
|
|||
|
|
{
|
|||
|
|
if (!sizeHandle)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
auto *parentPosition = static_cast<QCPItemPosition *>(sizeHandle->position->parentAnchor());
|
|||
|
|
if (!parentPosition)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
parentPosition->setPixelPosition(parentPosition->pixelPosition() + delta);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QCPSizeHandle *QCPSizeHandleManager::addHandleToPosition(QCPItemPosition *position)
|
|||
|
|
{
|
|||
|
|
auto *handle = new QCPSizeHandle(mParentPlot);
|
|||
|
|
handle->position->setParentAnchor(position); // 设置QCPSizeHandle的父锚点为position
|
|||
|
|
handle->setVisible(false);
|
|||
|
|
handle->setLayer(QLatin1String("overlay"));
|
|||
|
|
return handle;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QCPSizeHandleManager::applyDefaultAntialiasingHint(QCPPainter *painter) const
|
|||
|
|
{
|
|||
|
|
applyAntialiasingHint(painter, mAntialiased, QCP::aeOther);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QCPSizeHandleManager::draw(QCPPainter *painter)
|
|||
|
|
{
|
|||
|
|
QMapIterator<QCPAbstractItem *, ControlItemData> i(mHandles);
|
|||
|
|
while (i.hasNext()) {
|
|||
|
|
i.next();
|
|||
|
|
auto data = i.value();
|
|||
|
|
if (!data.showHandlesLines)
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
painter->setPen(data.connectHandlePen);
|
|||
|
|
QVector<QPointF> lines;
|
|||
|
|
foreach (auto *handle, data.handles)
|
|||
|
|
lines.push_back(handle->position->pixelPosition());
|
|||
|
|
painter->drawLines(lines);
|
|||
|
|
// painter->drawPolyline(QPolygonF(lines));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|