iced: Add tab_text helper widget
This commit is contained in:
parent
73d7f3779f
commit
d07a4de805
2 changed files with 129 additions and 3 deletions
|
|
@ -28,6 +28,8 @@ use iced_tiny_skia::{
|
|||
};
|
||||
pub type Element<'a, Message> = cosmic::iced::Element<'a, Message, IcedRenderer>;
|
||||
|
||||
pub mod tab_text;
|
||||
|
||||
use ordered_float::OrderedFloat;
|
||||
use smithay::{
|
||||
backend::{
|
||||
|
|
@ -284,10 +286,8 @@ impl<P: Program + Send + 'static> IcedElementInternal<P> {
|
|||
&mut NullClipboard,
|
||||
&mut self.debug,
|
||||
)
|
||||
.1
|
||||
.map(|command| command.actions());
|
||||
.1;
|
||||
|
||||
let actions = actions.unwrap_or_default();
|
||||
actions
|
||||
.into_iter()
|
||||
.filter_map(|action| {
|
||||
126
src/utils/iced/tab_text.rs
Normal file
126
src/utils/iced/tab_text.rs
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
use cosmic::{
|
||||
iced::Element,
|
||||
iced_core::{
|
||||
layout::{Layout, Limits, Node},
|
||||
renderer,
|
||||
widget::{Tree, Widget},
|
||||
Length, Point, Rectangle, Size,
|
||||
},
|
||||
iced_widget::text::StyleSheet as TextStyleSheet,
|
||||
};
|
||||
|
||||
pub struct TabText<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: cosmic::iced_core::Renderer,
|
||||
Renderer::Theme: TextStyleSheet,
|
||||
{
|
||||
text: Element<'a, Message, Renderer>,
|
||||
height: Length,
|
||||
width: Length,
|
||||
}
|
||||
|
||||
pub fn tab_text<'a, Message, Renderer>(
|
||||
text: impl Into<Element<'a, Message, Renderer>>,
|
||||
) -> TabText<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: cosmic::iced_core::Renderer,
|
||||
Renderer::Theme: TextStyleSheet,
|
||||
{
|
||||
TabText::new(text)
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> TabText<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: cosmic::iced_core::Renderer,
|
||||
Renderer::Theme: TextStyleSheet,
|
||||
{
|
||||
pub fn new(text: impl Into<Element<'a, Message, Renderer>>) -> Self {
|
||||
TabText {
|
||||
width: Length::Shrink,
|
||||
height: Length::Shrink,
|
||||
text: text.into(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn width(mut self, width: impl Into<Length>) -> Self {
|
||||
let width = width.into();
|
||||
self.width = width;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn height(mut self, height: impl Into<Length>) -> Self {
|
||||
let height = height.into();
|
||||
self.height = height;
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> Widget<Message, Renderer> for TabText<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: cosmic::iced_core::Renderer,
|
||||
Renderer::Theme: TextStyleSheet,
|
||||
{
|
||||
fn width(&self) -> Length {
|
||||
self.width
|
||||
}
|
||||
fn height(&self) -> Length {
|
||||
self.height
|
||||
}
|
||||
|
||||
fn children(&self) -> Vec<Tree> {
|
||||
vec![Tree::new(&self.text)]
|
||||
}
|
||||
|
||||
fn diff(&mut self, tree: &mut Tree) {
|
||||
tree.diff_children(std::slice::from_mut(&mut self.text))
|
||||
}
|
||||
|
||||
fn layout(&self, renderer: &Renderer, limits: &Limits) -> Node {
|
||||
let limits = limits.width(self.width).height(self.height);
|
||||
let child_limits = Limits::new(
|
||||
Size::new(limits.min().width, limits.min().height),
|
||||
Size::new(limits.max().width * 2., limits.max().height),
|
||||
);
|
||||
let content = self.text.as_widget().layout(renderer, &child_limits);
|
||||
let size = limits.resolve(content.size());
|
||||
|
||||
Node::with_children(size, vec![content])
|
||||
}
|
||||
|
||||
fn draw(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
theme: &Renderer::Theme,
|
||||
style: &renderer::Style,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
_viewport: &Rectangle,
|
||||
) {
|
||||
let bounds = layout.bounds();
|
||||
let content_layout = layout.children().next().unwrap();
|
||||
|
||||
renderer.with_layer(bounds, |renderer| {
|
||||
self.text.as_widget().draw(
|
||||
&tree.children[0],
|
||||
renderer,
|
||||
theme,
|
||||
style,
|
||||
content_layout,
|
||||
cursor_position,
|
||||
&bounds,
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> for TabText<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: cosmic::iced_core::Renderer + 'a,
|
||||
Renderer::Theme: TextStyleSheet,
|
||||
Message: 'a,
|
||||
{
|
||||
fn into(self) -> Element<'a, Message, Renderer> {
|
||||
Element::new(self)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue