多选框和轴的问题解决了

This commit is contained in:
2026-08-02 20:33:53 +08:00
parent 7316f391d0
commit dacf92d7bc
2 changed files with 36 additions and 10 deletions
@@ -28,12 +28,16 @@ std::shared_ptr<Selection_Rectangle_Overlay> Selection_Rectangle_Overlay::Builde
return ret;
}
void Selection_Rectangle_Overlay::set_horizontal_axis(std::shared_ptr<Abs_Axis> axis) {
Render_Edit_Lease<Selection_Rectangle_Overlay_Private, Selection_Rectangle_Overlay_Render_State> edit(d());
Selection_Rectangle_Overlay_Private* pd = d();
Render_Edit_Lease<Selection_Rectangle_Overlay_Private, Selection_Rectangle_Overlay_Render_State> edit(pd);
edit->horizontal_axis = std::weak_ptr<Abs_Axis>(axis);
pd->invalidate_interaction_mapping();
}
void Selection_Rectangle_Overlay::set_vertical_axis(std::shared_ptr<Abs_Axis> axis) {
Render_Edit_Lease<Selection_Rectangle_Overlay_Private, Selection_Rectangle_Overlay_Render_State> edit(d());
Selection_Rectangle_Overlay_Private* pd = d();
Render_Edit_Lease<Selection_Rectangle_Overlay_Private, Selection_Rectangle_Overlay_Render_State> edit(pd);
edit->vertical_axis = std::weak_ptr<Abs_Axis>(axis);
pd->invalidate_interaction_mapping();
}
Font Selection_Rectangle_Overlay::label_font() {
return d()->edit_state_value(&Selection_Rectangle_Overlay_Render_State::label_font);
+30 -8
View File
@@ -2,6 +2,7 @@
#include <algorithm>
#include <atomic>
#include <cmath>
#include <mutex>
#include <string>
#include <vector>
#include "../Axis/Abs_Axis_p.h"
@@ -26,13 +27,29 @@ struct Selection_Rectangle_Overlay_Render_State : Render_State {
struct Selection_Rectangle_Overlay_Input_Data : Input_Data {};
struct Selection_Rectangle_Overlay_Private : Typed_Render_Data<Selection_Rectangle_Overlay, Selection_Rectangle_Overlay_Render_State, Selection_Rectangle_Overlay_Input_Data>, Hit_Testable, Pointer_Interactive, Key_Press_Interactive {
std::atomic_bool active{false};
bool select_test(const PointF& pos) override {
auto s = static_cast<Selection_Rectangle_Overlay_Render_State*>(state(Renderable_State_Role::Render));
auto horizontal_axis = s->horizontal_axis.lock();
auto vertical_axis = s->vertical_axis.lock();
if (!horizontal_axis || !vertical_axis)
std::mutex interaction_mapping_mutex;
Axis_Mapping_2D interaction_mapping_value{};
bool interaction_mapping_valid{};
bool interaction_mapping(Axis_Mapping_2D& mapping) {
std::lock_guard lock(interaction_mapping_mutex);
if (!interaction_mapping_valid)
return false;
mapping = interaction_mapping_value;
return true;
}
void publish_interaction_mapping(const Axis_Mapping_2D& mapping) {
std::lock_guard lock(interaction_mapping_mutex);
interaction_mapping_value = mapping;
interaction_mapping_valid = true;
}
void invalidate_interaction_mapping() {
std::lock_guard lock(interaction_mapping_mutex);
interaction_mapping_valid = false;
}
bool select_test(const PointF& pos) override {
Axis_Mapping_2D mapping;
if (!interaction_mapping(mapping))
return false;
Axis_Mapping_2D mapping = Axis_Render_Access::mapping(horizontal_axis.get(), vertical_axis.get());
PointF first = mapping.map(mapping.domain.coord_range.origin, mapping.value.coord_range.origin);
PointF second = mapping.map(mapping.domain.coord_range.target, mapping.value.coord_range.target);
double rx = std::min(first.x, second.x);
@@ -49,7 +66,9 @@ struct Selection_Rectangle_Overlay_Private : Typed_Render_Data<Selection_Rectang
auto vertical_axis = edit->vertical_axis.lock();
if (!horizontal_axis || !vertical_axis)
return;
Axis_Mapping_2D mapping = Axis_Render_Access::mapping(horizontal_axis.get(), vertical_axis.get());
Axis_Mapping_2D mapping;
if (!interaction_mapping(mapping))
return;
std::vector<RectF>& rect_list = edit->rects;
if (!static_cast<bool>(event.modifiers & Keyboard_Modifier::Ctrl)) {
rect_list.clear();
@@ -79,7 +98,9 @@ struct Selection_Rectangle_Overlay_Private : Typed_Render_Data<Selection_Rectang
auto vertical_axis = edit->vertical_axis.lock();
if (!horizontal_axis || !vertical_axis)
return;
Axis_Mapping_2D mapping = Axis_Render_Access::mapping(horizontal_axis.get(), vertical_axis.get());
Axis_Mapping_2D mapping;
if (!interaction_mapping(mapping))
return;
std::vector<RectF>& rect_list = edit->rects;
if (rect_list.empty())
return;
@@ -120,6 +141,7 @@ struct Selection_Rectangle_Overlay_Private : Typed_Render_Data<Selection_Rectang
if (!horizontal_axis || !vertical_axis)
return;
Axis_Mapping_2D mapping = Axis_Render_Access::mapping(horizontal_axis.get(), vertical_axis.get(), snapshot);
publish_interaction_mapping(mapping);
std::vector<RectF> draw_rect_list;
std::vector<RectF> coord_rect_list;
for (RectF r : s->rects) {