logplus/logPlus/QCPSizeHandleManager.cpp

90 lines
2.3 KiB
C++
Raw Normal View History

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