Files
Renderive/YSGraphic_Core/Axis/Axis_p.h
T
2026-07-24 10:54:44 +08:00

81 lines
2.9 KiB
C++

#pragma once
#include <cmath>
#include "Abs_Axis_p.h"
#include "Axis.h"
namespace YSG {
struct Axis_Render_State : Abs_Axis_Render_State {};
struct Axis_Input_Data : Abs_Axis_Input_Data {};
struct Axis_Private : Typed_Render_Data_Base<Abs_Axis_Private, Axis, Axis_Render_State, Axis_Input_Data> {
friend class Axis;
bool useWheel = false;
bool useDrag = false;
protected:
bool select_test(const QPointF& pos) override {
return true;
}
void wheelEvent(QWheelEvent* event) override {
if (useWheel) {
Render_Edit_Lease<Axis_Private, Axis_Render_State> edit(this);
const double delta = event->angleDelta().y();
double wheelSteps = delta / 120.0;
double factor = std::pow(0.8, wheelSteps);
double cursor_coord = pixel_to_coord(event->position().x(), SRC::Edit);
double new_coordLength = edit->coord_length * factor;
double new_coordStart = cursor_coord - new_coordLength * (cursor_coord - edit->coord_start) / edit->coord_length;
edit->coord_start = new_coordStart;
edit->coord_length = new_coordLength;
}
}
bool dragging = false;
QPoint startGlobalPos, startPos;
double startCoordValue;
double pixelPreCoord;
void mousePressEvent(QMouseEvent* event) override {
if (!useDrag)
return;
if (event->button() != Qt::LeftButton)
return;
if (dragging)
return;
dragging = true;
startGlobalPos = QCursor::pos();
startPos = event->pos();
Render_State_Lease<Axis_Private, Axis_Render_State> state(this);
startCoordValue = state->coord_start;
pixelPreCoord = state->coord_length / static_cast<double>(state->pixel_size);
}
void mouseMoveEvent(QMouseEvent* event) override {
if (!useDrag)
return;
if (!(event->buttons() & Qt::LeftButton))
return;
if (!dragging)
return;
Render_Edit_Lease<Axis_Private, Axis_Render_State> edit(this);
QPoint delt = startGlobalPos - QCursor::pos();
auto coordDelt = pixelPreCoord * (edit->orientation == Qt::Horizontal ? delt.x() : delt.y());
edit->coord_start = startCoordValue + coordDelt;
}
void mouseReleaseEvent(QMouseEvent* event) override {
if (!useDrag)
return;
if (event->button() != Qt::LeftButton)
return;
if (!dragging)
return;
dragging = false;
}
};
template <typename That>
void Axis::BuilderT<That>::set(Axis* ret) {
Abs_Axis::BuilderT<That>::set(ret);
Axis_Private* pd = ret->d();
Axis_Render_State* sc = reinterpret_cast<Axis_Render_State*>(pd->state(State_Edit));
PROP_RT(int, number_precision)
PROP_RT(double, coord_start)
PROP_RT(double, coord_length)
pd->useWheel = useWheel;
pd->useDrag = useDrag;
}
} // namespace YSG