Initial
This commit is contained in:
parent
edeaa38113
commit
c1c96a783c
4 changed files with 3938 additions and 0 deletions
3787
Cargo.lock
generated
Normal file
3787
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
15
Cargo.toml
Normal file
15
Cargo.toml
Normal file
|
@ -0,0 +1,15 @@
|
|||
[package]
|
||||
name = "SolutionTM"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# This application was created and tested with Rust version 1.81.0-nightly
|
||||
|
||||
[dependencies]
|
||||
|
||||
# The tag referes to latest revision as of 2024-06-10.
|
||||
# Use 'branch = "master"' for the latest version or check:
|
||||
# https://github.com/iced-rs/iced/commits/master/
|
||||
[dependencies.iced]
|
||||
git = "https://github.com/iced-rs/iced.git"
|
||||
rev = "06ff17fcf87495663a295d1548df1c2ac03dafbd"
|
106
src/main.rs
Normal file
106
src/main.rs
Normal file
|
@ -0,0 +1,106 @@
|
|||
mod race;
|
||||
use race::Race;
|
||||
|
||||
use iced::widget::{button, column, combo_box, row, text, Column, ComboBox, Text};
|
||||
use iced::{Alignment, Padding};
|
||||
|
||||
/// Represents the state of our application and handles
|
||||
/// message matching and updating the state accordingly.
|
||||
struct State {
|
||||
races: combo_box::State<Race>,
|
||||
selected_race: Option<Race>,
|
||||
text: String,
|
||||
counter_value: i32,
|
||||
}
|
||||
|
||||
// Default is expected by iced::run.
|
||||
// We need to manually implement this since combo_box is not derive(Default)
|
||||
impl Default for State {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
// Represents the messages that can be sent to the "component"
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum Command {
|
||||
/// Increment the counter
|
||||
Increment,
|
||||
/// Decrement the counter
|
||||
Decrement,
|
||||
/// User selected an option in the combo box
|
||||
Selected(Race),
|
||||
/// User hovered over an option in the combo box
|
||||
OptionHovered(Race),
|
||||
/// User closed the combo box
|
||||
Closed,
|
||||
}
|
||||
|
||||
impl State {
|
||||
// Constructor for the state, nothing special here.
|
||||
fn new() -> Self {
|
||||
Self {
|
||||
races: combo_box::State::new(Race::ALL.to_vec()),
|
||||
selected_race: None,
|
||||
text: String::from("Hello, World!"),
|
||||
counter_value: 10,
|
||||
}
|
||||
}
|
||||
|
||||
// On each update, we recieve a command and update the state accordingly.
|
||||
fn update(&mut self, command: Command) {
|
||||
match command {
|
||||
Command::Increment => self.counter_value += 1,
|
||||
Command::Decrement => self.counter_value -= 1,
|
||||
Command::Selected(race) => self.selected_race = Some(race),
|
||||
Command::OptionHovered(race) => println!("Hovered over {}.", race.to_string()),
|
||||
Command::Closed => self.selected_race = None,
|
||||
}
|
||||
}
|
||||
|
||||
// Called every frame to render the user interface.
|
||||
// Changes to the state are reflected here.
|
||||
fn view(&self) -> Column<Command> {
|
||||
// Our combo box
|
||||
let combo_box: ComboBox<Race, Command> = combo_box::ComboBox::new(
|
||||
&self.races,
|
||||
"Pick a race",
|
||||
self.selected_race.as_ref(),
|
||||
Command::Selected,
|
||||
)
|
||||
.on_option_hovered(Command::OptionHovered)
|
||||
.on_close(Command::Closed)
|
||||
.width(250);
|
||||
|
||||
// Counter value
|
||||
let counter_value: Text = Text::new(self.counter_value.to_string())
|
||||
.size(50)
|
||||
.width(50)
|
||||
.horizontal_alignment(iced::alignment::Horizontal::Center);
|
||||
|
||||
// Row containig the buttons and the counter value
|
||||
let counter_row = row![
|
||||
button("Increment").on_press(Command::Increment),
|
||||
counter_value,
|
||||
button("Decrement").on_press(Command::Decrement),
|
||||
]
|
||||
.spacing(10)
|
||||
.align_items(Alignment::Start);
|
||||
|
||||
// Finally return a combination of the components
|
||||
column![counter_row, combo_box, text(&self.text)]
|
||||
.padding(Padding::new(self.counter_value as f32))
|
||||
.align_items(Alignment::Start)
|
||||
.spacing(10)
|
||||
.width(iced::Length::Fill)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Iced::run is an entry point for the application.
|
||||
// It may fail so we match on the result.
|
||||
match iced::run("Test Example", State::update, State::view) {
|
||||
Ok(_) => {}
|
||||
Err(error) => eprintln!("Error: {}", error),
|
||||
}
|
||||
}
|
30
src/race.rs
Normal file
30
src/race.rs
Normal file
|
@ -0,0 +1,30 @@
|
|||
// This file is just an enum of different races along with some implementations for it.
|
||||
|
||||
/// Different races that a player can choose from
|
||||
#[repr(u8)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum Race {
|
||||
Elf,
|
||||
Human,
|
||||
Orc,
|
||||
}
|
||||
|
||||
// There is a crate that can generate this with a macro. It's called strum.
|
||||
impl Race {
|
||||
pub const ALL: [Race; 3] = [Race::Elf, Race::Human, Race::Orc];
|
||||
|
||||
pub fn to_string(&self) -> &str {
|
||||
match self {
|
||||
Race::Elf => "Elf",
|
||||
Race::Human => "Human",
|
||||
Race::Orc => "Orc",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We use this in the user interface
|
||||
impl std::fmt::Display for Race {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "{}", self.to_string())
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue