Skip to content

Commit 5835e95

Browse files
committed
refactor: 重构目录结构
1 parent 044b46a commit 5835e95

File tree

9 files changed

+142
-91
lines changed

9 files changed

+142
-91
lines changed

crates/project_graph/src/stage.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
pub mod camera;
22
pub mod context;
3+
pub mod elements;
34
pub mod render_context;
4-
pub mod structs;
55

66
use camera::Camera;
77
use context::StageContext;
8-
use eframe::egui::{self};
9-
use structs::EntityTrait;
108

11-
use crate::stage::render_context::RenderContext;
9+
use crate::stage::{
10+
elements::{Element, ElementTrait, entities::EntityTrait},
11+
render_context::RenderContext,
12+
};
1213

1314
/// egui 和画布之间的桥梁
1415
/// 负责坐标系转换、事件处理等
@@ -34,7 +35,10 @@ impl Stage {
3435
let screen_center = rect.center();
3536
let mut visible_count = 0;
3637

37-
for entity in self.context.entities().values() {
38+
for element in self.context.elements().values() {
39+
let entity = match element {
40+
Element::Entity(e) => e,
41+
};
3842
// 剔除
3943
if !rect.contains(entity.position()) {
4044
continue;
@@ -52,7 +56,7 @@ impl Stage {
5256
.show(ui.ctx(), |ui| {
5357
entity.ui(
5458
ui,
55-
&mut RenderContext {
59+
&RenderContext {
5660
zoom: self.camera.zoom(),
5761
},
5862
);

crates/project_graph/src/stage/context.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,46 @@ use std::collections::HashMap;
33
use egui::Pos2;
44
use nanoid::nanoid;
55

6-
use crate::stage::structs::{Entity, EntityTrait, Text};
6+
use crate::stage::elements::{
7+
Element, ElementTrait,
8+
entities::{Entity, text::Text},
9+
};
710

811
pub struct StageContext {
9-
entities: HashMap<String, Entity>,
12+
elements: HashMap<String, Element>,
1013
}
1114

1215
impl StageContext {
1316
pub fn new() -> Self {
1417
StageContext {
15-
entities: HashMap::new(),
18+
elements: HashMap::new(),
1619
}
1720
}
1821
pub fn random() -> Self {
19-
let mut entities: HashMap<String, Entity> = HashMap::new();
22+
let mut elements: HashMap<String, Element> = HashMap::new();
2023
for i in 0..1000 {
2124
let id = nanoid!();
22-
entities.insert(
25+
elements.insert(
2326
id.clone(),
24-
Text::new(
27+
Entity::from(Text::new(
2528
id,
2629
Pos2::new(
2730
rand::random::<f32>() * 2000.0 - 1000.0,
2831
rand::random::<f32>() * 2000.0 - 1000.0,
2932
),
3033
format!("节点 {}", i),
31-
)
34+
))
3235
.into(),
3336
);
3437
}
35-
StageContext { entities }
38+
StageContext { elements }
3639
}
3740

38-
pub fn entities(&self) -> &HashMap<String, Entity> {
39-
&self.entities
41+
pub fn elements(&self) -> &HashMap<String, Element> {
42+
&self.elements
4043
}
4144

42-
pub fn add(&mut self, entity: Entity) {
43-
self.entities.insert(entity.id().to_string(), entity);
45+
pub fn add(&mut self, element: Element) {
46+
self.elements.insert(element.id().to_string(), element);
4447
}
4548
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
pub mod connections;
2+
pub mod containers;
3+
pub mod entities;
4+
5+
use enum_dispatch::enum_dispatch;
6+
7+
use crate::stage::{elements::entities::Entity, render_context::RenderContext};
8+
9+
/// 元素,以前称做舞台对象
10+
/// 所有可以被渲染的东西都应该实现这个 trait
11+
#[enum_dispatch]
12+
pub trait ElementTrait {
13+
/// 原则上应该是一个 nanoid
14+
fn id(&self) -> &str;
15+
/// 渲染函数
16+
fn ui(&self, ui: &mut egui::Ui, rc: &RenderContext);
17+
}
18+
19+
#[enum_dispatch(ElementTrait)]
20+
#[derive(knus::Decode, Debug, Clone)]
21+
pub enum Element {
22+
Entity(Entity),
23+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
use crate::stage::elements::ElementTrait;
2+
3+
/// 连接关系,连接节点端口的线段
4+
/// 不能被包含,不能被连接
5+
pub trait ConnectionTrait: ElementTrait {
6+
/// 起点端口 id
7+
fn from_port_id(&self) -> &str;
8+
/// 终点端口 id
9+
fn to_port_id(&self) -> &str;
10+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
use crate::stage::elements::ElementTrait;
2+
3+
/// 包含关系,包含多个节点的关系
4+
/// 可以被包含,可以被连接
5+
pub trait ContainerTrait: ElementTrait {
6+
/// 包含的节点 id 列表
7+
fn contained_node_ids(&self) -> Vec<&str>;
8+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
pub mod text;
2+
3+
use egui::Pos2;
4+
use enum_dispatch::enum_dispatch;
5+
6+
use crate::stage::elements::ElementTrait;
7+
8+
/// 实体,有位置以及零个或多个端口且可以独立存在的物体
9+
#[enum_dispatch]
10+
pub trait EntityTrait: ElementTrait {
11+
/// 位置
12+
fn position(&self) -> Pos2;
13+
}
14+
15+
#[enum_dispatch(ElementTrait, EntityTrait)]
16+
#[derive(knus::Decode, Debug, Clone)]
17+
pub enum Entity {
18+
Text(text::Text),
19+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use egui::Pos2;
2+
use nanoid::nanoid;
3+
4+
use crate::{
5+
stage::{
6+
elements::{ElementTrait, entities::EntityTrait},
7+
render_context::RenderContext,
8+
},
9+
utils::kdl::KdlPos2,
10+
};
11+
12+
#[derive(knus::Decode, Debug, Clone)]
13+
pub struct Text {
14+
#[knus(argument, default = nanoid!())]
15+
id: String,
16+
#[knus(child, default = KdlPos2 { x: 0.0, y: 0.0 })]
17+
pos: KdlPos2,
18+
#[knus(child, unwrap(argument), default = String::new())]
19+
val: String,
20+
}
21+
impl Text {
22+
pub fn new(id: String, pos: Pos2, val: String) -> Self {
23+
Text {
24+
id,
25+
pos: pos.into(),
26+
val,
27+
}
28+
}
29+
}
30+
impl ElementTrait for Text {
31+
fn id(&self) -> &str {
32+
&self.id
33+
}
34+
fn ui(&self, ui: &mut egui::Ui, rc: &RenderContext) {
35+
let response = egui::Frame::new()
36+
.fill(egui::Color32::from_rgba_unmultiplied(255, 255, 255, 25))
37+
.corner_radius(16.0 * rc.zoom)
38+
.inner_margin(egui::Margin::symmetric(12, 10) * rc.zoom)
39+
.show(ui, |ui| {
40+
ui.add(
41+
egui::Label::new(egui::RichText::new(&self.val).size(16.0 * rc.zoom))
42+
.wrap_mode(egui::TextWrapMode::Extend),
43+
);
44+
})
45+
.response;
46+
}
47+
}
48+
impl EntityTrait for Text {
49+
fn position(&self) -> Pos2 {
50+
self.pos.into()
51+
}
52+
}

crates/project_graph/src/stage/structs.rs

Lines changed: 0 additions & 68 deletions
This file was deleted.

crates/project_graph/src/terminal.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use egui::Margin;
22

33
use crate::stage::{
44
Stage,
5-
structs::{Entity, EntityTrait},
5+
elements::{Element, ElementTrait},
66
};
77

88
pub struct Terminal {
@@ -78,12 +78,12 @@ impl Terminal {
7878
if !modifiers.shift && !modifiers.ctrl && !modifiers.alt {
7979
self.history
8080
.push(HistoryItem::In(self.input.clone().trim().to_string()));
81-
match knus::parse::<Vec<Entity>>("terminal_input.kdl", &self.input) {
81+
match knus::parse::<Vec<Element>>("terminal_input.kdl", &self.input) {
8282
Ok(doc) => {
83-
for entity in doc {
84-
stage.context.add(entity.clone());
83+
for element in doc {
84+
stage.context.add(element.clone());
8585
self.history
86-
.push(HistoryItem::Out(entity.id().to_string()));
86+
.push(HistoryItem::Out(element.id().to_string()));
8787
}
8888
}
8989
Err(e) => {

0 commit comments

Comments
 (0)