Add example for customized window decorations
Signed-off-by: Yureka <yuka@yuka.dev>
This commit is contained in:
parent
a74b6e3a9b
commit
ab509dd88e
1 changed files with 79 additions and 0 deletions
79
examples/customized-window-decorations.rs
Normal file
79
examples/customized-window-decorations.rs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
use cosmic::iced::{Color, Rectangle, Size};
|
||||
use cosmic::widget;
|
||||
use cosmic::widget::canvas;
|
||||
use cosmic_comp::hooks::{Decorations, Hooks};
|
||||
use cosmic_comp::shell::element::stack::{
|
||||
DefaultDecorations as DefaultStackDecorations, TAB_HEIGHT,
|
||||
};
|
||||
use cosmic_comp::shell::element::window::{
|
||||
DefaultDecorations as DefaultWindowDecorations, SSD_HEIGHT,
|
||||
};
|
||||
use std::sync::Arc;
|
||||
|
||||
/// The struct implementing Decorations hook
|
||||
#[derive(Debug)]
|
||||
struct AddIndicator<Lower> {
|
||||
lower: Lower,
|
||||
height: i32,
|
||||
}
|
||||
|
||||
/// An iced program drawing a circle, which we'll add to the window decorations
|
||||
struct Circle {
|
||||
radius: f32,
|
||||
color: Color,
|
||||
}
|
||||
|
||||
impl<Message, Theme, Renderer: cosmic::iced_renderer::geometry::Renderer>
|
||||
canvas::Program<Message, Theme, Renderer> for Circle
|
||||
{
|
||||
type State = ();
|
||||
|
||||
fn draw(
|
||||
&self,
|
||||
_state: &(),
|
||||
renderer: &Renderer,
|
||||
_theme: &Theme,
|
||||
bounds: Rectangle,
|
||||
_cursor: cosmic::iced::mouse::Cursor,
|
||||
) -> Vec<Renderer::Geometry> {
|
||||
let bounds = bounds.size();
|
||||
let min = bounds.height.min(bounds.width);
|
||||
let mut frame = canvas::Frame::new(renderer, Size::new(min, min));
|
||||
let circle = canvas::Path::circle(frame.center(), self.radius);
|
||||
frame.fill(&circle, self.color);
|
||||
vec![frame.into_geometry()]
|
||||
}
|
||||
}
|
||||
|
||||
impl<Internal, Message: std::clone::Clone + 'static, Lower: Decorations<Internal, Message>>
|
||||
Decorations<Internal, Message> for AddIndicator<Lower>
|
||||
{
|
||||
fn view(&self, window: &Internal) -> cosmic::Element<'_, Message> {
|
||||
let orig = self.lower.view(window);
|
||||
widget::row()
|
||||
.push(
|
||||
widget::column()
|
||||
.push(canvas(Circle {
|
||||
radius: (self.height as f32 / 2.) * 0.8,
|
||||
color: Color::new(1.0, 0.0, 0.0, 1.0),
|
||||
}))
|
||||
.width(self.height as f32),
|
||||
)
|
||||
.push(orig)
|
||||
.into()
|
||||
}
|
||||
}
|
||||
|
||||
/// The customized cosmic-comp entrypoint
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
cosmic_comp::run(Hooks {
|
||||
window_decorations: Some(Arc::new(AddIndicator {
|
||||
height: SSD_HEIGHT,
|
||||
lower: DefaultWindowDecorations,
|
||||
})),
|
||||
stack_decorations: Some(Arc::new(AddIndicator {
|
||||
height: TAB_HEIGHT,
|
||||
lower: DefaultStackDecorations,
|
||||
})),
|
||||
})
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue