working scissor proof of concept

This commit is contained in:
Aleksander
2025-09-24 21:53:43 +02:00
parent 8d41d8bbd1
commit 8f75d451e4
11 changed files with 175 additions and 146 deletions

View File

@@ -5,7 +5,7 @@ use slotmap::Key;
use taffy::AvailableSpace;
use crate::{
drawing::{self, Boundary},
drawing::{self, Boundary, PrimitiveExtent},
event::CallbackDataCommon,
globals::Globals,
i18n::{I18n, Translation},
@@ -118,12 +118,14 @@ impl WidgetObj for WidgetLabel {
buffer.set_size(&mut font_system, Some(boundary.size.x), Some(boundary.size.y));
}
state.primitives.push(drawing::RenderPrimitive {
boundary,
depth: state.depth,
payload: drawing::PrimitivePayload::Text(self.buffer.clone()),
transform: state.transform_stack.get().transform,
});
state.primitives.push(drawing::RenderPrimitive::Text(
PrimitiveExtent {
boundary,
depth: state.depth,
transform: state.transform_stack.get().transform,
},
self.buffer.clone(),
));
}
fn measure(

View File

@@ -4,7 +4,7 @@ use super::drawing::RenderPrimitive;
use crate::{
any::AnyTrait,
drawing,
drawing::{self, PrimitiveExtent},
event::{
self, CallbackData, CallbackDataCommon, CallbackMetadata, Event, EventAlterables, EventListenerKind,
EventListenerVec, MouseWheelEvent,
@@ -244,34 +244,38 @@ impl WidgetState {
// Horizontal handle
if enabled_horiz && info.handle_size.x < 1.0 {
state.primitives.push(drawing::RenderPrimitive {
boundary: drawing::Boundary::from_pos_size(
Vec2::new(
transform.pos.x + transform.dim.x * (1.0 - info.handle_size.x) * self.data.scrolling.x,
transform.pos.y + transform.dim.y - thickness - margin,
state.primitives.push(drawing::RenderPrimitive::Rectangle(
PrimitiveExtent {
boundary: drawing::Boundary::from_pos_size(
Vec2::new(
transform.pos.x + transform.dim.x * (1.0 - info.handle_size.x) * self.data.scrolling.x,
transform.pos.y + transform.dim.y - thickness - margin,
),
Vec2::new(transform.dim.x * info.handle_size.x, thickness),
),
Vec2::new(transform.dim.x * info.handle_size.x, thickness),
),
depth: state.depth,
transform: transform.transform,
payload: drawing::PrimitivePayload::Rectangle(rect_params),
});
depth: state.depth,
transform: transform.transform,
},
rect_params,
));
}
// Vertical handle
if enabled_vert && info.handle_size.y < 1.0 {
state.primitives.push(drawing::RenderPrimitive {
boundary: drawing::Boundary::from_pos_size(
Vec2::new(
transform.pos.x + transform.dim.x - thickness - margin,
transform.pos.y + transform.dim.y * (1.0 - info.handle_size.y) * self.data.scrolling.y,
state.primitives.push(drawing::RenderPrimitive::Rectangle(
PrimitiveExtent {
boundary: drawing::Boundary::from_pos_size(
Vec2::new(
transform.pos.x + transform.dim.x - thickness - margin,
transform.pos.y + transform.dim.y * (1.0 - info.handle_size.y) * self.data.scrolling.y,
),
Vec2::new(thickness, transform.dim.y * info.handle_size.y),
),
Vec2::new(thickness, transform.dim.y * info.handle_size.y),
),
depth: state.depth,
transform: transform.transform,
payload: drawing::PrimitivePayload::Rectangle(rect_params),
});
depth: state.depth,
transform: transform.transform,
},
rect_params,
));
}
}

View File

@@ -1,7 +1,7 @@
use slotmap::Key;
use crate::{
drawing::{self, GradientMode},
drawing::{self, GradientMode, PrimitiveExtent},
layout::WidgetID,
widget::util::WLength,
};
@@ -43,19 +43,21 @@ impl WidgetObj for WidgetRectangle {
WLength::Percent(percent) => (f32::min(boundary.size.x, boundary.size.y) * percent / 2.0) as u8,
};
state.primitives.push(drawing::RenderPrimitive {
boundary,
depth: state.depth,
transform: state.transform_stack.get().transform,
payload: drawing::PrimitivePayload::Rectangle(drawing::Rectangle {
state.primitives.push(drawing::RenderPrimitive::Rectangle(
PrimitiveExtent {
boundary,
depth: state.depth,
transform: state.transform_stack.get().transform,
},
drawing::Rectangle {
color: self.params.color,
color2: self.params.color2,
gradient: self.params.gradient,
border: self.params.border,
border_color: self.params.border_color,
round_units,
}),
});
},
));
}
fn get_id(&self) -> WidgetID {

View File

@@ -4,7 +4,7 @@ use cosmic_text::{Attrs, Buffer, Color, Shaping, Weight};
use slotmap::Key;
use crate::{
drawing::{self},
drawing::{self, PrimitiveExtent},
layout::WidgetID,
renderer_vk::text::{
DEFAULT_METRICS, FONT_SYSTEM,
@@ -55,12 +55,14 @@ impl WidgetObj for WidgetSprite {
snap_to_physical_pixel: true,
};
state.primitives.push(drawing::RenderPrimitive {
boundary,
depth: state.depth,
payload: drawing::PrimitivePayload::Sprite(Some(glyph)),
transform: state.transform_stack.get().transform,
});
state.primitives.push(drawing::RenderPrimitive::Sprite(
PrimitiveExtent {
boundary,
depth: state.depth,
transform: state.transform_stack.get().transform,
},
Some(glyph),
));
} else {
// Source not set or not available, display error text
let mut buffer = Buffer::new_empty(DEFAULT_METRICS);
@@ -73,13 +75,16 @@ impl WidgetObj for WidgetSprite {
// set text last in order to avoid expensive re-shaping
buffer.set_text("Error", &attrs, Shaping::Basic);
}
state.primitives.push(drawing::RenderPrimitive {
boundary,
depth: state.depth,
payload: drawing::PrimitivePayload::Text(Rc::new(RefCell::new(buffer))),
transform: state.transform_stack.get().transform,
});
}
state.primitives.push(drawing::RenderPrimitive::Text(
PrimitiveExtent {
boundary,
depth: state.depth,
transform: state.transform_stack.get().transform,
},
Rc::new(RefCell::new(buffer)),
))
};
}
fn measure(