Skip to content

Commit

Permalink
Improve Node DataFrame;
Browse files Browse the repository at this point in the history
Support Node DataFrameMut;
  • Loading branch information
makscee committed Jan 22, 2025
1 parent ae82f97 commit ed193d4
Show file tree
Hide file tree
Showing 12 changed files with 158 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
(
[
Hollow(F(1.0)),
Hollow(F(2.0)),
Color(C("#2979FF")),
Alpha(F(0.1)),
Alpha(F(0.6)),
Repeat(
I(1000),
I(10),
List(
[
Rectangle(F(0.5)),
Expand Down
70 changes: 58 additions & 12 deletions macro-client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ pub fn node(_: TokenStream, item: TokenStream) -> TokenStream {
var_fields,
var_types,
data_fields,
data_fields_str,
data_types: _,
data_type_ident: _,
all_data_fields,
Expand All @@ -54,6 +55,14 @@ pub fn node(_: TokenStream, item: TokenStream) -> TokenStream {
&vec_box_link_fields_str,
&vec_box_link_types,
);
let no_children = option_link_fields.is_empty()
&& vec_link_fields.is_empty()
&& vec_box_link_fields.is_empty();
let has_body = if no_children && data_fields.is_empty() {
quote! {false}
} else {
quote! {true}
};
let nt = if all_data_fields.contains(&Ident::from_string("name").unwrap()) {
NodeType::Name
} else if !option_link_fields.is_empty() || !vec_box_link_fields.is_empty() {
Expand Down Expand Up @@ -111,7 +120,7 @@ pub fn node(_: TokenStream, item: TokenStream) -> TokenStream {
}
impl ToCstr for #struct_ident {
fn cstr(&self) -> Cstr {
self.to_string()
format!("[vd [s {self}]]")
}
}
impl GetVar for #struct_ident {
Expand Down Expand Up @@ -146,10 +155,31 @@ pub fn node(_: TokenStream, item: TokenStream) -> TokenStream {
}
}
}
fn get_all_vars(&self) -> Vec<(VarName, VarValue)> {
vec![#(
fn get_vars(&self) -> Vec<(VarName, VarValue)> {
vec![
#(
(VarName::#var_fields, VarValue::#var_types(self.#var_fields.clone()))
),*]
),*
]
}
fn get_all_vars(&self) -> Vec<(VarName, VarValue)> {
let mut vars = self.get_vars();
#(
if let Some(d) = &self.#option_link_fields {
vars.extend(d.get_all_vars());
}
)*
#(
for d in &self.#vec_link_fields {
vars.extend(d.get_all_vars());
}
)*
#(
for d in &self.#vec_box_link_fields {
vars.extend(d.get_all_vars());
}
)*
vars
}
}
impl StringData for #struct_ident {
Expand Down Expand Up @@ -182,27 +212,36 @@ pub fn node(_: TokenStream, item: TokenStream) -> TokenStream {
true
}
fn has_body(&self) -> bool {
true
#has_body
}
fn show_header(&self, context: &Context, ui: &mut Ui) {
ui.horizontal(|ui| {
for (var, value) in self.get_all_vars() {
if var != VarName::name {
if !#has_body {
ui.horizontal(|ui| {
for (var, value) in self.get_vars() {
value.show(Some(&var.cstr()), context, ui);
}
}
});
});
}
}
fn show_header_mut(&mut self, ui: &mut Ui) -> bool {
if #has_body {
return false;
}
let mut changed = false;
#(
changed |= self.#data_fields.show_mut(None, ui);
VarName::#var_fields.cstr().label(ui);
changed |= self.#var_fields.show_mut(None, ui);
)*
changed
}
fn show_body(&self, context: &Context, ui: &mut Ui) {
for (var, value) in self.get_vars() {
ui.horizontal(|ui| {
value.show(Some(&var.cstr()), context, ui);
});
}
#(
self.#data_fields.show(None, context, ui);
self.#data_fields.show(Some(#data_fields_str), context, ui);
)*
#(
if let Some(d) = &self.#option_link_fields {
Expand All @@ -212,6 +251,13 @@ pub fn node(_: TokenStream, item: TokenStream) -> TokenStream {
}
fn show_body_mut(&mut self, ui: &mut Ui) -> bool {
let mut changed = false;
#(
VarName::#var_fields.cstr().label(ui);
changed |= self.#var_fields.show_mut(None, ui);
)*
#(
changed |= self.#data_fields.show_mut(Some(#data_fields_str), ui);
)*
#(
if let Some(d) = &mut self.#option_link_fields {
changed |= d.show_mut(None, ui);
Expand Down
1 change: 1 addition & 0 deletions macro-server/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ pub fn node(_: TokenStream, item: TokenStream) -> TokenStream {
var_fields: _,
var_types: _,
data_fields: _,
data_fields_str: _,
data_types: _,
data_type_ident,
all_data_fields,
Expand Down
4 changes: 4 additions & 0 deletions schema/src/macro_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pub struct ParsedNodeFields {
pub var_fields: Vec<Ident>,
pub var_types: Vec<Type>,
pub data_fields: Vec<Ident>,
pub data_fields_str: Vec<String>,
pub data_types: Vec<Type>,
pub data_type_ident: proc_macro2::TokenStream,
pub all_data_fields: Vec<Ident>,
Expand All @@ -35,6 +36,7 @@ pub fn parse_node_fields(fields: &Fields) -> ParsedNodeFields {
let mut var_fields = Vec::default();
let mut var_types = Vec::default();
let mut data_fields = Vec::default();
let mut data_fields_str = Vec::default();
let mut data_types = Vec::default();
fn inner_type(type_path: &TypePath) -> Type {
match &type_path.path.segments.first().unwrap().arguments {
Expand Down Expand Up @@ -85,6 +87,7 @@ pub fn parse_node_fields(fields: &Fields) -> ParsedNodeFields {
var_fields.push(field_ident.clone());
var_types.push(ty.clone());
} else {
data_fields_str.push(field_ident.to_string());
data_fields.push(field_ident);
data_types.push(ty.clone());
}
Expand Down Expand Up @@ -114,6 +117,7 @@ pub fn parse_node_fields(fields: &Fields) -> ParsedNodeFields {
var_fields,
var_types,
data_fields,
data_fields_str,
data_types,
data_type_ident,
all_data_fields,
Expand Down
1 change: 1 addition & 0 deletions src/nodes/nodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ macro_schema::nodes!();
pub trait GetVar: GetNodeKind + Debug {
fn get_var(&self, var: VarName) -> Option<VarValue>;
fn set_var(&mut self, var: VarName, value: VarValue);
fn get_vars(&self) -> Vec<(VarName, VarValue)>;
fn get_all_vars(&self) -> Vec<(VarName, VarValue)>;
}

Expand Down
6 changes: 3 additions & 3 deletions src/plugins/match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ impl MatchPlugin {
g: m.g,
});
}
fn shop_slot_rect(i: usize, max: usize, rect: Rect, ui: &mut Ui) -> Rect {
let mut rect = rect.with_max_y(rect.max.y / 2.0);
fn shop_slot_rect(i: usize, max: usize, mut rect: Rect) -> Rect {
rect.set_height(rect.height() * 0.5);
let w = rect.width() / max as f32;
rect.set_width(w.at_most(rect.height()));
rect.translate(egui::vec2(w * i as f32, 0.0))
Expand Down Expand Up @@ -68,7 +68,7 @@ impl MatchPlugin {
};
let rep = unit.representation.as_ref().unwrap();
let context = Context::default().set_owner_node(unit).take();
let rect = Self::shop_slot_rect(i, shop_units.len(), rect, ui);
let rect = Self::shop_slot_rect(i, shop_units.len(), rect);
if ui.allocate_rect(rect, Sense::click()).clicked() {
ui.painter().rect_stroke(rect, ROUNDING, STROKE_YELLOW);
let unit = unit.clone();
Expand Down
6 changes: 3 additions & 3 deletions src/plugins/node_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ impl NodeStatePlugin {
);
for v in gv {
let kind = v.kind();
for (var, value) in v.get_all_vars() {
for (var, value) in v.get_vars() {
state.insert(t, 0.0, var, value, kind);
}
}
Expand All @@ -53,7 +53,7 @@ impl NodeStatePlugin {
if let Ok((gv, mut state)) = nodes.get_mut(entity) {
for v in gv {
let kind = v.kind();
for (var, value) in v.get_all_vars() {
for (var, value) in v.get_vars() {
state.insert(t, 0.0, var, value, kind);
}
}
Expand All @@ -67,7 +67,7 @@ impl NodeStatePlugin {
let mut entity = Some(entity);
while let Some((gv, p)) = entity.and_then(|e| nodes.get(e).ok()) {
for v in gv {
for (var, value) in v.get_all_vars() {
for (var, value) in v.get_vars() {
if !state.contains(var) {
state.insert(0.0, 0.0, var, value, v.kind());
}
Expand Down
20 changes: 20 additions & 0 deletions src/plugins/stdb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,25 @@ use spacetimedb_sdk::{DbContext, TableWithPrimaryKey};

use super::*;

fn on_subscription_applied() {
OperationsPlugin::add(|world| {
let mut unit = Unit::from_table(
NodeDomain::Alpha,
NodeDomain::Alpha.filter_by_kind(NodeKind::Unit)[0].id,
)
.unwrap();
for (var, value) in unit.get_all_vars() {
dbg!(var, value);
}
Window::new("Unit df", move |ui, _| {
ui.columns(2, |ui| {
unit.show(None, &Context::default().set_owner_node(&unit), &mut ui[0]);
unit.show_mut(None, &mut ui[1]);
});
})
.push(world);
});
}
pub fn db_subscriptions() {
info!("Apply stdb subscriptions");
let queries = [
Expand All @@ -17,6 +36,7 @@ pub fn db_subscriptions() {
e.event.on_success(|_| {
info!("Subscription applied");
});
on_subscription_applied();
})
.subscribe(queries);

Expand Down
7 changes: 6 additions & 1 deletion src/plugins/widgets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,12 @@ impl Plugin for WidgetsPlugin {
.and_then(in_state(GameState::Title).or_else(in_state(GameState::Meta))),
),
)
.add_systems(Update, cmd_test.run_if(input_pressed(KeyCode::SuperLeft)));
.add_systems(
Update,
cmd_test.run_if(
input_pressed(KeyCode::SuperLeft).and_then(input_pressed(KeyCode::ShiftLeft)),
),
);
}
}
}
Expand Down
Loading

0 comments on commit ed193d4

Please sign in to comment.