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));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|