very primitive column layout

This commit is contained in:
TheOddGarlic 2022-04-28 11:45:33 +03:00
parent f491fce00b
commit 69c4cd9386
4 changed files with 64 additions and 4 deletions

View file

@ -8,6 +8,7 @@
use abletk::plugin::QuitPlugin;
use abletk::prelude::*;
use abletk::widget::Column;
#[launch]
fn launch() -> _ {
@ -15,8 +16,9 @@ fn launch() -> _ {
.apply_plugin(QuitPlugin)
.add_window(Window::builder(
Row::new()
.add(Label::new("Hello, AbleTK! ")
.add(Label::new("Hello, ")
.color(rgb!(0xFF00FFFF)))
.add(Label::new("Hello, World!")
.color(rgb!(0x64CAFEFF)))))
.add(Column::new()
.add(Label::new("World!"))
.add(Label::new("AbleTK!")))))
}

56
src/widget/column.rs Executable file
View file

@ -0,0 +1,56 @@
/*
* Copyright (C) 2022 Umut İnan Erdoğan <umutinanerdogan@pm.me>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
use crate::{layout::position::Position, widget::Widget};
use abletk_common::Renderer;
pub struct Column {
widgets: Vec<Box<dyn Widget>>,
}
impl Widget for Column {
fn draw(&self, renderer: &mut Renderer) {
self.widgets.iter().for_each(|widget| {
let pos = widget.position(renderer);
renderer.position_at(
renderer.position().0 + pos.x(),
renderer.position().1 + pos.y()
);
widget.draw(renderer);
renderer.position_at(
renderer.position().0,
renderer.position().1 + pos.height()
);
});
}
fn position(&self, renderer: &mut Renderer) -> Position {
let (width, height) = self.widgets.iter()
.map(|widget| widget.position(renderer))
.map(|pos| (pos.width(), pos.height()))
.fold((0, 0), |accum, item| (
if item.0 > accum.0 { item.0 } else { accum.0 },
accum.1 + item.1
));
Position::new(0, 0, width, height)
}
}
impl Column {
pub fn new() -> Self {
Self {
widgets: Vec::new(),
}
}
pub fn add<T: Widget + 'static>(mut self, widget: T) -> Self {
self.widgets.push(Box::new(widget));
self
}
}

View file

@ -30,7 +30,7 @@ impl Label {
pub fn new<S: Into<String>>(text: S) -> Self {
Self {
text: text.into(),
color: rgb!(0xFFFFFFFF),
color: rgb!(0x000000FF),
}
}

View file

@ -6,10 +6,12 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
mod column;
mod label;
mod row;
use abletk_common::Renderer;
pub use column::*;
pub use label::*;
pub use row::*;