This commit is contained in:
Imbus 2024-05-04 10:44:26 +02:00
commit 1f9eee77ce
9 changed files with 3352 additions and 0 deletions

3
.gitignore vendored Executable file
View file

@ -0,0 +1,3 @@
/target
*.tar.gz
*.minisig

3126
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

15
Cargo.toml Executable file
View file

@ -0,0 +1,15 @@
[package]
name = "iced_demo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[profile.release]
lto = true
opt-level = 3
strip = true
panic = "abort"
[dependencies]
iced = "0.12.1"

BIN
iced_demo Executable file

Binary file not shown.

9
makefile Normal file
View file

@ -0,0 +1,9 @@
PROJECT = $(shell basename $(CURDIR))
GITHASH = $(shell git rev-parse --short HEAD)
release:
cargo build --release
cp target/release/$(PROJECT) $(PROJECT)
strip $(PROJECT)
tar -czf $(PROJECT)_$(GITHASH).tar.gz $(PROJECT)
minisign -Sm $(PROJECT).tar.gz

84
src/main.rs Executable file
View file

@ -0,0 +1,84 @@
use iced::theme::{self, Theme};
use iced::widget::{button, column, row, text};
use iced::widget::{text_input, TextInput};
use iced::{Alignment, Color, Element, Length, Sandbox, Settings};
mod my_theme;
use my_theme::{get_theme, FromHexColor, OneDark};
mod search_bar;
use search_bar::*;
mod message;
use message::*;
pub fn main() -> iced::Result {
Counter::run(Settings::default())
}
struct AppSettings {
entries_per_page: u32,
}
struct Counter {
theme: Theme,
value: i32,
input_val: String,
current_tab: Tab,
app_settings: AppSettings,
}
impl Sandbox for Counter {
type Message = Message;
fn new() -> Self {
Self {
value: 0,
input_val: String::from("0"),
theme: get_theme(),
current_tab: Tab::Content,
app_settings: AppSettings {
entries_per_page: 10,
},
}
}
fn title(&self) -> String {
String::from("Counter - Iced")
}
fn update(&mut self, message: Message) {
match message {
Message::InputChanged(value) => {
self.input_val = value.clone();
if let Ok(value) = value.parse::<i32>() {
self.value = value;
}
}
Message::SwitchTab(tab) => {
self.current_tab = tab;
}
_ => {}
}
}
fn view(&self) -> Element<Message> {
column![
row![text::Text::new("TFTool").size(50)],
row![tabs(&self)],
match self.current_tab {
Tab::Content => search_bar(&self),
Tab::Settings => text::Text::new("Settings").into(),
}
]
.width(Length::Fill)
.padding([55, 0])
.align_items(Alignment::Center)
.into()
// row![TextInput::new("Search", &self.input_val).on_input(Message::InputChanged)].into()
}
fn theme(&self) -> Theme {
self.theme.clone()
}
}

16
src/message.rs Executable file
View file

@ -0,0 +1,16 @@
// #[derive(Debug, Clone)]
// pub enum SearchMessage {
// InputSubmitted,
// }
#[derive(Debug, Clone)]
pub enum Tab {
Content,
Settings,
}
#[derive(Debug, Clone)]
pub enum Message {
InputChanged(String),
SwitchTab(Tab),
}

63
src/my_theme.rs Executable file
View file

@ -0,0 +1,63 @@
use iced::{theme, Color, Theme};
pub trait FromHexColor {
fn from_hex_str(hex: &str) -> Option<Box<Self>>;
fn from_hex(hex: u32) -> Self;
}
impl FromHexColor for Color {
fn from_hex_str(hex: &str) -> Option<Box<Self>> {
match u32::from_str_radix(hex.trim_start_matches('#'), 16) {
Ok(hex) => Some(Box::new(Self::from_hex(hex))),
Err(_) => None,
}
}
fn from_hex(hex: u32) -> Self {
let r = ((hex >> 16) & 0xFF) as f32 / 255f32;
let g = ((hex >> 8) & 0xFF) as f32 / 255f32;
let b = (hex & 0xFF) as f32 / 255f32;
let a = ((hex >> 24) & 0xFF) as f32 / 255f32;
Color::from_rgba(r, g, b, a)
}
}
#[repr(u32)]
pub enum OneDark {
Black = 0x282c34,
Red = 0xe06c75,
Green = 0x98c379,
Yellow = 0xe5c07b,
Blue = 0x61afef,
Purple = 0xc678dd,
Cyan = 0x56b6c2,
// White = 0xdcdfe4,
White = 0xabb2bf,
}
/// One Dark:
// Black 40; 44; 52 #282c34
// White 171; 178; 191 #abb2bf
// Light Red 224; 108; 117 #e06c75
// Dark Red 190; 80; 70 #be5046
// Green 152; 195; 121 #98c379
// Light Yellow 229; 192; 123 #e5c07b
// Dark Yellow 209; 154; 102 #d19a66
// Blue 97; 175; 239 #61afef
// Magenta 198; 120; 221 #c678dd
// Cyan 86; 182; 194 #56b6c2
// Gutter Grey 76; 82; 99 #4b5263
// Comment Grey 92; 99; 112 #5c6370
pub fn get_theme() -> Theme {
Theme::custom(
"Wellwell".to_string(),
theme::Palette {
background: Color::from_hex(OneDark::Black as u32),
primary: Color::from_hex(OneDark::Blue as u32),
text: Color::from_hex(0xabb2bf),
success: Color::from_hex(0x98c379),
danger: Color::from_hex(0xe06c75),
},
)
}

36
src/search_bar.rs Executable file
View file

@ -0,0 +1,36 @@
use iced::{
application::StyleSheet,
theme,
widget::{button, row, text_input, TextInput},
Element, Length, Padding,
};
use crate::*;
use crate::{message::Message::*, Counter};
pub fn search_bar(state: &Counter) -> Element<Message> {
row![TextInput::new("Search", &state.input_val)
.on_input(Message::InputChanged)
.width(300)]
.into()
}
fn menu_tab_button<'a>(label: &'a str, tab: Tab) -> Element<'a, Message> {
button(label)
.on_press(SwitchTab(tab))
.padding(Padding::from([10, 20]))
.width(Length::FillPortion(1))
.into()
}
pub fn tabs(state: &Counter) -> Element<Message> {
row![
menu_tab_button("Content", Tab::Content),
menu_tab_button("Settings", Tab::Settings),
]
.padding(10)
.spacing(20)
.width(300)
.height(Length::Shrink)
.into()
}