Add image container to draw background, more adjustment to design

This commit is contained in:
Jeremy Soller 2023-10-06 13:37:38 -06:00
parent 7cb1c89474
commit 66fdd2525d
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
5 changed files with 193 additions and 28 deletions

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
*.png filter=lfs diff=lfs merge=lfs -text

3
res/background.png Normal file
View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d5b3b5384bc5ad9c9f733507db02097b4fbcc017fffac565775ba3d7eb77577c
size 4468456

150
src/image_container.rs Normal file
View file

@ -0,0 +1,150 @@
use cosmic::iced::widget::{image::Handle, Container};
use cosmic::iced_core::event::{self, Event};
use cosmic::iced_core::layout;
use cosmic::iced_core::mouse;
use cosmic::iced_core::overlay;
use cosmic::iced_core::renderer;
use cosmic::iced_core::widget::{Operation, Tree};
use cosmic::iced_core::{Clipboard, Element, Layout, Length, Rectangle, Shell, Widget};
use cosmic::iced_renderer::core::widget::OperationOutputWrapper;
pub use cosmic::iced_style::container::{Appearance, StyleSheet};
pub struct ImageContainer<'a, Message, Renderer>
where
Renderer: cosmic::iced_core::Renderer + cosmic::iced_core::image::Renderer<Handle = Handle>,
Renderer::Theme: StyleSheet,
{
container: Container<'a, Message, Renderer>,
image_opt: Option<Handle>,
}
impl<'a, Message, Renderer> ImageContainer<'a, Message, Renderer>
where
Renderer: cosmic::iced_core::Renderer + cosmic::iced_core::image::Renderer<Handle = Handle>,
Renderer::Theme: StyleSheet,
{
pub fn new(container: Container<'a, Message, Renderer>) -> Self {
Self {
container,
image_opt: None,
}
}
pub fn image(mut self, image: Handle) -> Self {
self.image_opt = Some(image);
self
}
}
impl<'a, Message, Renderer> Widget<Message, Renderer> for ImageContainer<'a, Message, Renderer>
where
Renderer: cosmic::iced_core::Renderer + cosmic::iced_core::image::Renderer<Handle = Handle>,
Renderer::Theme: StyleSheet,
{
fn children(&self) -> Vec<Tree> {
self.container.children()
}
fn diff(&mut self, tree: &mut Tree) {
self.container.diff(tree)
}
fn width(&self) -> Length {
Widget::width(&self.container)
}
fn height(&self) -> Length {
Widget::height(&self.container)
}
fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> layout::Node {
self.container.layout(renderer, limits)
}
fn operate(
&self,
tree: &mut Tree,
layout: Layout<'_>,
renderer: &Renderer,
operation: &mut dyn Operation<OperationOutputWrapper<Message>>,
) {
self.container.operate(tree, layout, renderer, operation)
}
fn on_event(
&mut self,
tree: &mut Tree,
event: Event,
layout: Layout<'_>,
cursor: mouse::Cursor,
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
self.container.on_event(
tree, event, layout, cursor, renderer, clipboard, shell, viewport,
)
}
fn mouse_interaction(
&self,
tree: &Tree,
layout: Layout<'_>,
cursor: mouse::Cursor,
viewport: &Rectangle,
renderer: &Renderer,
) -> mouse::Interaction {
self.container
.mouse_interaction(tree, layout, cursor, viewport, renderer)
}
fn draw(
&self,
tree: &Tree,
renderer: &mut Renderer,
theme: &Renderer::Theme,
renderer_style: &renderer::Style,
layout: Layout<'_>,
cursor: mouse::Cursor,
viewport: &Rectangle,
) {
match &self.image_opt {
Some(image) => renderer.draw(image.clone(), layout.bounds()),
None => {}
}
self.container.draw(
tree,
renderer,
theme,
renderer_style,
layout,
cursor,
viewport,
)
}
fn overlay<'b>(
&'b mut self,
tree: &'b mut Tree,
layout: Layout<'_>,
renderer: &Renderer,
) -> Option<overlay::Element<'b, Message, Renderer>> {
self.container.overlay(tree, layout, renderer)
}
}
impl<'a, Message, Renderer> From<ImageContainer<'a, Message, Renderer>>
for Element<'a, Message, Renderer>
where
Message: 'a,
Renderer:
'a + cosmic::iced_core::Renderer + cosmic::iced_core::image::Renderer<Handle = Handle>,
Renderer::Theme: StyleSheet,
{
fn from(container: ImageContainer<'a, Message, Renderer>) -> Element<'a, Message, Renderer> {
Element::new(container)
}
}

View file

@ -45,9 +45,13 @@ pub fn main(current_user: pwd::Passwd) -> Result<(), Box<dyn std::error::Error>>
None
};
//TODO: use background config
let background = widget::image::Handle::from_memory(include_bytes!("../res/background.png"));
let flags = Flags {
current_user,
icon_opt,
background,
};
let settings = Settings::default()
@ -141,6 +145,7 @@ impl pam_client::ConversationHandler for Conversation {
pub struct Flags {
current_user: pwd::Passwd,
icon_opt: Option<widget::image::Handle>,
background: widget::image::Handle,
}
/// Messages that are used specifically by our [`App`].
@ -223,6 +228,12 @@ impl cosmic::Application for App {
OutputEvent::Created(_output_info_opt) => {
log::info!("output {}: created", output.id());
//TODO: COVER ALL OUTPUTS AFTER FIXING FOCUS BUG
if !self.surface_ids.is_empty() {
log::error!("COVER ALL OUTPUTS AFTER FIXING FOCUS BUG");
return Command::none();
}
let surface_id = self.next_surface_id;
self.next_surface_id.0 += 1;
@ -446,6 +457,7 @@ impl cosmic::Application for App {
.width(Length::Fill)
};
crate::image_container::ImageContainer::new(
widget::container(
widget::cosmic_container::container(
iced::widget::row![left_element, right_element]
@ -471,11 +483,9 @@ impl cosmic::Application for App {
.height(Length::Fill)
.align_x(alignment::Horizontal::Center)
.align_y(alignment::Vertical::Top)
.style(cosmic::theme::Container::Custom(Box::new(|_| {
let mut appearance = widget::container::Appearance::default();
appearance.background = Some(iced::Background::Color(iced::Color::BLACK));
appearance
})))
.style(cosmic::theme::Container::Transparent),
)
.image(self.flags.background.clone())
.into()
}

View file

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-only
mod greeter;
mod image_container;
mod locker;
fn main() -> Result<(), Box<dyn std::error::Error>> {