多选框和轴的问题解决了
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user