81 lines
2.9 KiB
C++
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
|