Skip to content

Commit

Permalink
Move appearance
Browse files Browse the repository at this point in the history
  • Loading branch information
Orchaldir committed Nov 10, 2023
1 parent b2ee1e7 commit a1b40ba
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 143 deletions.
6 changes: 3 additions & 3 deletions resources/templates/appearance_edit.html.tera
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<img id="preview" src="/appearance/preview/back.svg" alt="Back Preview" width="75%"/>
</div>
<div class="editor">
<form id="appearanceForm" action="/appearance/{{ id }}/preview" method="post">
<form id="appearanceForm" action="/appearance/preview/{{ id }}" method="post">
<ul>
<li>
<b>Appearance:</b> {{ macros::add_select(name="appearance.type", options=[ "HeadOnly","Humanoid" ], selected=appearance.type, update=true) }}
Expand Down Expand Up @@ -1118,9 +1118,9 @@
</ul>
</li>
</ul>
<button formaction="/appearance/{{ id }}/update" formmethod="post">Submit</button>
<button formaction="/appearance/update/{{ id }}" formmethod="post">Submit</button>
</form>
<p><a href="/character/{{ id }}">Back</a></p>
<p><a href="/character/details/{{ id }}">Back</a></p>
</div>
</div>
{% endblock content %}
2 changes: 1 addition & 1 deletion resources/templates/character/all.html.tera
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<div class="grid-item">
<a href="/character/details/{{ c.0 }}">
<div class="content">{{ c.1 }}</div>
<img src = "/appearance/{{ c.0 }}/front.svg" alt="Character {{ c.0 }}"/>
<img src = "/appearance/render/{{ c.0 }}/front.svg" alt="Character {{ c.0 }}"/>
</a>
</div>
{% endfor %}
Expand Down
6 changes: 3 additions & 3 deletions resources/templates/character/details.html.tera
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
</div>
<p><h2>Appearance</h2></p>
<center>
<img src = "/appearance/{{ id }}/front.svg" alt="Front View of the Character" width="25%"/>
<img src = "/appearance/{{ id }}/back.svg" alt="Back View of the Character" width="25%"/>
<img src = "/appearance/render/{{ id }}/front.svg" alt="Front View of the Character" width="25%"/>
<img src = "/appearance/render/{{ id }}/back.svg" alt="Back View of the Character" width="25%"/>
</center>
<div class="text">
<p><a href="/appearance/{{ id }}/edit">Edit Appearance</a></p>
<p><a href="/appearance/edit/{{ id }}">Edit Appearance</a></p>
<p><a href="/character/all">Back</a></p>
</div>
</div>
Expand Down
40 changes: 0 additions & 40 deletions rpg_tools_editor/src/appearance.rs

This file was deleted.

105 changes: 9 additions & 96 deletions rpg_tools_editor/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@ extern crate macro_core;
#[macro_use]
extern crate rocket;

use crate::appearance::{apply_update_to_appearance, render_to_svg, RawSvg};
use crate::io::read;
use crate::route::appearance::{
edit_appearance, get_appearance_back, get_appearance_front, get_preview_back,
get_preview_front, update_appearance, update_appearance_preview,
};
use crate::route::character::{
add_character, edit_character, get_all_characters, get_character_details,
save_and_show_character, update_character, CHARACTER_FILE,
add_character, edit_character, get_all_characters, get_character_details, update_character,
CHARACTER_FILE,
};
use crate::route::race::{
add_race, edit_race, get_all_races, get_race_details, update_race, RACES_FILE,
Expand All @@ -17,7 +20,7 @@ use rocket::State;
use rocket_dyn_templates::{context, Template};
use rpg_tools_core::model::character::appearance::Appearance;
use rpg_tools_core::model::character::manager::CharacterMgr;
use rpg_tools_core::model::character::{Character, CharacterId};
use rpg_tools_core::model::character::Character;
use rpg_tools_core::model::race::manager::RaceMgr;
use rpg_tools_core::model::race::Race;
use rpg_tools_core::model::RpgData;
Expand All @@ -26,7 +29,6 @@ use rpg_tools_rendering::rendering::config::RenderConfig;
use std::path::Path;
use std::sync::Mutex;

pub mod appearance;
pub mod io;
pub mod parser;
pub mod route;
Expand All @@ -49,95 +51,6 @@ fn home(data: &State<EditorData>) -> Template {
)
}

#[get("/appearance/<id>/front.svg")]
fn get_front(state: &State<EditorData>, id: usize) -> Option<RawSvg> {
let data = state.data.lock().expect("lock shared data");
data.character_manager
.get(CharacterId::new(id))
.map(|character| render_to_svg(&state.config, character.appearance(), true))
}

#[get("/appearance/<id>/back.svg")]
fn get_back(state: &State<EditorData>, id: usize) -> Option<RawSvg> {
let data = state.data.lock().expect("lock shared data");
data.character_manager
.get(CharacterId::new(id))
.map(|character| render_to_svg(&state.config, character.appearance(), false))
}

#[get("/appearance/preview/front.svg")]
fn get_preview_front(state: &State<EditorData>) -> RawSvg {
let preview = state.preview.lock().expect("lock shared preview");
render_to_svg(&state.config, &preview, true)
}

#[get("/appearance/preview/back.svg")]
fn get_preview_back(state: &State<EditorData>) -> RawSvg {
let preview = state.preview.lock().expect("lock shared preview");
render_to_svg(&state.config, &preview, false)
}

#[get("/appearance/<id>/edit")]
fn edit_appearance(state: &State<EditorData>, id: usize) -> Option<Template> {
let data = state.data.lock().expect("lock shared data");
let mut preview = state.preview.lock().expect("lock shared preview");

data.character_manager
.get(CharacterId::new(id))
.map(|character| {
*preview = *character.appearance();

edit_appearance_template(character, &preview)
})
}

#[post("/appearance/<id>/update", data = "<update>")]
fn update_appearance(data: &State<EditorData>, id: usize, update: String) -> Option<Template> {
let mut data = data.data.lock().expect("lock shared data");

println!("Update appearance of character {} with {:?}", id, update);

data.character_manager
.get_mut(CharacterId::new(id))
.map(|character| {
character.set_appearance(apply_update_to_appearance(&update));
character
});

save_and_show_character(&data, id)
}

#[post("/appearance/<id>/preview", data = "<update>")]
fn update_appearance_preview(
state: &State<EditorData>,
id: usize,
update: String,
) -> Option<Template> {
let data = state.data.lock().expect("lock shared data");
let mut preview = state.preview.lock().expect("lock shared preview");

println!("Preview appearance of character {} with {:?}", id, update);

data.character_manager
.get(CharacterId::new(id))
.map(|character| {
*preview = apply_update_to_appearance(&update);

edit_appearance_template(character, &preview)
})
}

fn edit_appearance_template(character: &Character, appearance: &Appearance) -> Template {
Template::render(
"appearance_edit",
context! {
id: character.id().id(),
name: character.name(),
appearance: appearance,
},
)
}

#[rocket::main]
async fn main() -> Result<()> {
if let Err(e) = rocket::build()
Expand All @@ -161,8 +74,8 @@ async fn main() -> Result<()> {
get_preview_front,
get_preview_back,
update_appearance_preview,
get_front,
get_back,
get_appearance_front,
get_appearance_back,
get_all_races,
get_race_details,
add_race,
Expand Down
134 changes: 134 additions & 0 deletions rpg_tools_editor/src/route/appearance.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
use crate::parser::UrlParser;
use crate::route::character::save_and_show_character;
use crate::EditorData;
use rocket::State;
use rocket_dyn_templates::{context, Template};
use rpg_tools_core::model::character::appearance::Appearance;
use rpg_tools_core::model::character::{Character, CharacterId};
use rpg_tools_rendering::math::aabb2d::AABB;
use rpg_tools_rendering::renderer::svg::SvgBuilder;
use rpg_tools_rendering::renderer::Renderer;
use rpg_tools_rendering::rendering::character::{
calculate_character_size, render_character_from_back, render_character_from_front,
};
use rpg_tools_rendering::rendering::config::example::create_border_options;
use rpg_tools_rendering::rendering::config::RenderConfig;
use url_encoded_data::UrlEncodedData;

#[get("/appearance/render/<id>/front.svg")]
pub fn get_appearance_front(state: &State<EditorData>, id: usize) -> Option<RawSvg> {
let data = state.data.lock().expect("lock shared data");
data.character_manager
.get(CharacterId::new(id))
.map(|character| render_to_svg(&state.config, character.appearance(), true))
}

#[get("/appearance/render/<id>/back.svg")]
pub fn get_appearance_back(state: &State<EditorData>, id: usize) -> Option<RawSvg> {
let data = state.data.lock().expect("lock shared data");
data.character_manager
.get(CharacterId::new(id))
.map(|character| render_to_svg(&state.config, character.appearance(), false))
}

#[get("/appearance/preview/front.svg")]
pub fn get_preview_front(state: &State<EditorData>) -> RawSvg {
let preview = state.preview.lock().expect("lock shared preview");
render_to_svg(&state.config, &preview, true)
}

#[get("/appearance/preview/back.svg")]
pub fn get_preview_back(state: &State<EditorData>) -> RawSvg {
let preview = state.preview.lock().expect("lock shared preview");
render_to_svg(&state.config, &preview, false)
}

#[get("/appearance/edit/<id>")]
pub fn edit_appearance(state: &State<EditorData>, id: usize) -> Option<Template> {
let data = state.data.lock().expect("lock shared data");
let mut preview = state.preview.lock().expect("lock shared preview");

data.character_manager
.get(CharacterId::new(id))
.map(|character| {
*preview = *character.appearance();

edit_appearance_template(character, &preview)
})
}

#[post("/appearance/update/<id>", data = "<update>")]
pub fn update_appearance(data: &State<EditorData>, id: usize, update: String) -> Option<Template> {
let mut data = data.data.lock().expect("lock shared data");

println!("Update appearance of character {} with {:?}", id, update);

data.character_manager
.get_mut(CharacterId::new(id))
.map(|character| {
character.set_appearance(apply_update_to_appearance(&update));
character
});

save_and_show_character(&data, id)
}

#[post("/appearance/preview/<id>", data = "<update>")]
pub fn update_appearance_preview(
state: &State<EditorData>,
id: usize,
update: String,
) -> Option<Template> {
let data = state.data.lock().expect("lock shared data");
let mut preview = state.preview.lock().expect("lock shared preview");

println!("Preview appearance of character {} with {:?}", id, update);

data.character_manager
.get(CharacterId::new(id))
.map(|character| {
*preview = apply_update_to_appearance(&update);

edit_appearance_template(character, &preview)
})
}

fn edit_appearance_template(character: &Character, appearance: &Appearance) -> Template {
Template::render(
"appearance_edit",
context! {
id: character.id().id(),
name: character.name(),
appearance: appearance,
},
)
}

pub fn apply_update_to_appearance(update: &str) -> Appearance {
let data = UrlEncodedData::parse_str(update);
let parser = UrlParser::new(data);

Appearance::parse(&parser, "appearance", "")
}

#[derive(Responder)]
#[response(status = 200, content_type = "image/svg+xml")]
pub struct RawSvg(String);

pub fn render_to_svg(config: &RenderConfig, appearance: &Appearance, front: bool) -> RawSvg {
let size = calculate_character_size(config, appearance);
let aabb = AABB::with_size(size);
let options = create_border_options();
let mut svg_builder = SvgBuilder::new(size);

svg_builder.render_rectangle(&aabb, &options);

if front {
render_character_from_front(&mut svg_builder, config, &aabb, appearance);
} else {
render_character_from_back(&mut svg_builder, config, &aabb, appearance);
}

let svg = svg_builder.finish();
RawSvg(svg.export())
}
1 change: 1 addition & 0 deletions rpg_tools_editor/src/route/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod appearance;
pub mod character;
pub mod race;

0 comments on commit a1b40ba

Please sign in to comment.