Skip to content

Commit

Permalink
Implement mouse input handling
Browse files Browse the repository at this point in the history
Handle parametrized events for Animation, Behavior, BoolVar, Button and
 Timer classes.
Fix how image position is interpreted.
Throw in case of duplicated properties while parsing objects.
Implement some more missing methods.
  • Loading branch information
Dove6 committed Aug 14, 2024
1 parent 6e2ff77 commit d232a1f
Show file tree
Hide file tree
Showing 16 changed files with 861 additions and 350 deletions.
6 changes: 3 additions & 3 deletions pixlib/src/graphics_plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -291,10 +291,10 @@ pub fn update_images(
sprite.flip_x = false;
sprite.flip_y = false;
sprite.anchor = Anchor::TopLeft;
let base_position = image.get_position().unwrap();
let position = image.get_position().unwrap();
*transform = Transform::from_xyz(
base_position.0 as f32 + image_definition.offset_px.0 as f32,
base_position.1 as f32 + image_definition.offset_px.1 as f32,
position.0 as f32,
position.1 as f32,
image.get_priority().unwrap() as f32
+ (*script_index as f32) / 100f32
+ (*object_index as f32) / 100000f32,
Expand Down
22 changes: 13 additions & 9 deletions pixlib/src/inputs_plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,21 @@ pub fn queue_mouse_input(
.single()
.cursor_position()
.unwrap_or(Vec2::new(0f32, 0f32));
in_events.push_back(MouseEvent::MovedTo {
x: cursor_position.x as isize,
y: cursor_position.y as isize,
});
if buttons.just_pressed(MouseButton::Left) {
in_events.push_back(MouseEvent::LeftButtonPressed {
x: cursor_position.x as u32,
y: cursor_position.y as u32,
});
in_events.push_back(MouseEvent::LeftButtonPressed);
}
if buttons.pressed(MouseButton::Right) {
in_events.push_back(MouseEvent::RightButtonPressed {
x: cursor_position.x as u32,
y: cursor_position.y as u32,
});
if buttons.just_pressed(MouseButton::Right) {
in_events.push_back(MouseEvent::RightButtonPressed);
}
if buttons.just_released(MouseButton::Left) {
in_events.push_back(MouseEvent::LeftButtonReleased);
}
if buttons.just_released(MouseButton::Right) {
in_events.push_back(MouseEvent::RightButtonReleased);
}
}

Expand Down
13 changes: 8 additions & 5 deletions pixlib/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,14 @@ fn main() {
})
.insert_non_send_resource(InsertedDiskResource(inserted_disk))
.insert_resource(ChosenScene::default())
.insert_non_send_resource(ScriptRunner(CnvRunner::new(
layered_fs,
Arc::new(GamePaths::default()),
runner_issue_manager,
)))
.insert_non_send_resource(ScriptRunner(
CnvRunner::try_new(
layered_fs,
Arc::new(GamePaths::default()),
runner_issue_manager,
)
.unwrap(),
))
.insert_resource(ObjectBuilderIssueManager(issue_manager))
.init_state::<AppState>()
.add_systems(Startup, setup)
Expand Down
276 changes: 176 additions & 100 deletions pixlib_parser/src/classes/animation.rs

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion pixlib_parser/src/classes/behavior.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ impl EventHandler for BehaviorEventHandlers {
match name {
"ONDONE" => self.on_done.as_ref(),
"ONINIT" => self.on_init.as_ref(),
"ONSIGNAL" => self.on_signal.get(argument.unwrap_or("")),
"ONSIGNAL" => argument
.and_then(|a| self.on_signal.get(a))
.or(self.on_signal.get("")),
_ => None,
}
}
Expand Down
95 changes: 58 additions & 37 deletions pixlib_parser/src/classes/bool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ pub struct BoolVarProperties {
pub to_ini: Option<bool>, // TOINI
pub value: Option<bool>, // VALUE

pub on_brutal_changed: Option<Arc<ParsedScript>>, // ONBRUTALCHANGED signal
pub on_changed: Option<Arc<ParsedScript>>, // ONCHANGED signal
pub on_done: Option<Arc<ParsedScript>>, // ONDONE signal
pub on_init: Option<Arc<ParsedScript>>, // ONINIT signal
pub on_net_changed: Option<Arc<ParsedScript>>, // ONNETCHANGED signal
pub on_signal: Option<Arc<ParsedScript>>, // ONSIGNAL signal
pub on_brutal_changed: HashMap<String, Arc<ParsedScript>>, // ONBRUTALCHANGED signal
pub on_changed: HashMap<String, Arc<ParsedScript>>, // ONCHANGED signal
pub on_done: Option<Arc<ParsedScript>>, // ONDONE signal
pub on_init: Option<Arc<ParsedScript>>, // ONINIT signal
pub on_net_changed: HashMap<String, Arc<ParsedScript>>, // ONNETCHANGED signal
pub on_signal: HashMap<String, Arc<ParsedScript>>, // ONSIGNAL signal
}

#[derive(Debug, Clone, Default)]
Expand All @@ -33,23 +33,31 @@ struct BoolVarState {

#[derive(Debug, Clone)]
struct BoolVarEventHandlers {
pub on_brutal_changed: Option<Arc<ParsedScript>>, // ONBRUTALCHANGED signal
pub on_changed: Option<Arc<ParsedScript>>, // ONCHANGED signal
pub on_done: Option<Arc<ParsedScript>>, // ONDONE signal
pub on_init: Option<Arc<ParsedScript>>, // ONINIT signal
pub on_net_changed: Option<Arc<ParsedScript>>, // ONNETCHANGED signal
pub on_signal: Option<Arc<ParsedScript>>, // ONSIGNAL signal
pub on_brutal_changed: HashMap<String, Arc<ParsedScript>>, // ONBRUTALCHANGED signal
pub on_changed: HashMap<String, Arc<ParsedScript>>, // ONCHANGED signal
pub on_done: Option<Arc<ParsedScript>>, // ONDONE signal
pub on_init: Option<Arc<ParsedScript>>, // ONINIT signal
pub on_net_changed: HashMap<String, Arc<ParsedScript>>, // ONNETCHANGED signal
pub on_signal: HashMap<String, Arc<ParsedScript>>, // ONSIGNAL signal
}

impl EventHandler for BoolVarEventHandlers {
fn get(&self, name: &str, _argument: Option<&str>) -> Option<&Arc<ParsedScript>> {
fn get(&self, name: &str, argument: Option<&str>) -> Option<&Arc<ParsedScript>> {
match name {
"ONBRUTALCHANGED" => self.on_brutal_changed.as_ref(),
"ONCHANGED" => self.on_changed.as_ref(),
"ONBRUTALCHANGED" => argument
.and_then(|a| self.on_brutal_changed.get(a))
.or(self.on_brutal_changed.get("")),
"ONCHANGED" => argument
.and_then(|a| self.on_changed.get(a))
.or(self.on_changed.get("")),
"ONDONE" => self.on_done.as_ref(),
"ONINIT" => self.on_init.as_ref(),
"ONNETCHANGED" => self.on_net_changed.as_ref(),
"ONSIGNAL" => self.on_signal.as_ref(),
"ONNETCHANGED" => argument
.and_then(|a| self.on_net_changed.get(a))
.or(self.on_net_changed.get("")),
"ONSIGNAL" => argument
.and_then(|a| self.on_signal.get(a))
.or(self.on_signal.get("")),
_ => None,
}
}
Expand Down Expand Up @@ -196,16 +204,23 @@ impl CnvType for BoolVar {
.and_then(discard_if_empty)
.map(parse_bool)
.transpose()?;
let on_brutal_changed = properties
.remove("ONBRUTALCHANGED")
.and_then(discard_if_empty)
.map(parse_event_handler)
.transpose()?;
let on_changed = properties
.remove("ONCHANGED")
.and_then(discard_if_empty)
.map(parse_event_handler)
.transpose()?;
let mut on_brutal_changed = HashMap::new();
for (k, v) in properties.iter() {
if k == "ONBRUTALCHANGED" {
on_brutal_changed.insert(String::from(""), parse_event_handler(v.to_owned())?);
} else if let Some(argument) = k.strip_prefix("ONBRUTALCHANGED^") {
on_brutal_changed
.insert(String::from(argument), parse_event_handler(v.to_owned())?);
}
}
let mut on_changed = HashMap::new();
for (k, v) in properties.iter() {
if k == "ONCHANGED" {
on_changed.insert(String::from(""), parse_event_handler(v.to_owned())?);
} else if let Some(argument) = k.strip_prefix("ONCHANGED^") {
on_changed.insert(String::from(argument), parse_event_handler(v.to_owned())?);
}
}
let on_done = properties
.remove("ONDONE")
.and_then(discard_if_empty)
Expand All @@ -216,16 +231,22 @@ impl CnvType for BoolVar {
.and_then(discard_if_empty)
.map(parse_event_handler)
.transpose()?;
let on_net_changed = properties
.remove("ONNETCHANGED")
.and_then(discard_if_empty)
.map(parse_event_handler)
.transpose()?;
let on_signal = properties
.remove("ONSIGNAL")
.and_then(discard_if_empty)
.map(parse_event_handler)
.transpose()?;
let mut on_net_changed = HashMap::new();
for (k, v) in properties.iter() {
if k == "ONNETCHANGED" {
on_net_changed.insert(String::from(""), parse_event_handler(v.to_owned())?);
} else if let Some(argument) = k.strip_prefix("ONNETCHANGED^") {
on_net_changed.insert(String::from(argument), parse_event_handler(v.to_owned())?);
}
}
let mut on_signal = HashMap::new();
for (k, v) in properties.iter() {
if k == "ONSIGNAL" {
on_signal.insert(String::from(""), parse_event_handler(v.to_owned())?);
} else if let Some(argument) = k.strip_prefix("ONSIGNAL^") {
on_signal.insert(String::from(argument), parse_event_handler(v.to_owned())?);
}
}
Ok(CnvContent::Bool(Self::from_initial_properties(
parent,
BoolVarProperties {
Expand Down
36 changes: 26 additions & 10 deletions pixlib_parser/src/classes/button.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ pub struct ButtonProperties {
pub on_init: Option<Arc<ParsedScript>>, // ONINIT signal
pub on_paused: Option<Arc<ParsedScript>>, // ONPAUSED signal
pub on_released: Option<Arc<ParsedScript>>, // ONRELEASED signal
pub on_signal: Option<Arc<ParsedScript>>, // ONSIGNAL signal
pub on_signal: HashMap<String, Arc<ParsedScript>>, // ONSIGNAL signal
pub on_start_dragging: Option<Arc<ParsedScript>>, // ONSTARTDRAGGING signal
}

Expand All @@ -49,6 +49,9 @@ pub struct ButtonState {
pub graphics_on_click: Option<String>,
pub priority: isize,
pub rect: Option<Rect>,

// deduced from methods
pub is_visible: bool,
}

#[derive(Debug, Clone)]
Expand All @@ -63,12 +66,12 @@ pub struct ButtonEventHandlers {
pub on_init: Option<Arc<ParsedScript>>, // ONINIT signal
pub on_paused: Option<Arc<ParsedScript>>, // ONPAUSED signal
pub on_released: Option<Arc<ParsedScript>>, // ONRELEASED signal
pub on_signal: Option<Arc<ParsedScript>>, // ONSIGNAL signal
pub on_signal: HashMap<String, Arc<ParsedScript>>, // ONSIGNAL signal
pub on_start_dragging: Option<Arc<ParsedScript>>, // ONSTARTDRAGGING signal
}

impl EventHandler for ButtonEventHandlers {
fn get(&self, name: &str, _argument: Option<&str>) -> Option<&Arc<ParsedScript>> {
fn get(&self, name: &str, argument: Option<&str>) -> Option<&Arc<ParsedScript>> {
match name {
"ONACTION" => self.on_action.as_ref(),
"ONCLICKED" => self.on_clicked.as_ref(),
Expand All @@ -80,7 +83,9 @@ impl EventHandler for ButtonEventHandlers {
"ONINIT" => self.on_init.as_ref(),
"ONPAUSED" => self.on_paused.as_ref(),
"ONRELEASED" => self.on_released.as_ref(),
"ONSIGNAL" => self.on_signal.as_ref(),
"ONSIGNAL" => argument
.and_then(|a| self.on_signal.get(a))
.or(self.on_signal.get("")),
"ONSTARTDRAGGING" => self.on_start_dragging.as_ref(),
_ => None,
}
Expand All @@ -102,17 +107,19 @@ pub struct Button {

impl Button {
pub fn from_initial_properties(parent: Arc<CnvObject>, props: ButtonProperties) -> Self {
let is_enabled = props.enable.unwrap_or(true);
Self {
parent,
state: RefCell::new(ButtonState {
is_enabled: props.enable.unwrap_or_default(),
is_enabled,
is_accented: props.accent.unwrap_or_default(),
is_draggable: props.draggable.unwrap_or_default(),
graphics_normal: props.gfx_standard,
graphics_on_hover: props.gfx_on_move,
graphics_on_click: props.gfx_on_click,
priority: props.priority.unwrap_or_default() as isize,
rect: props.rect,
is_visible: is_enabled,
}),
event_handlers: ButtonEventHandlers {
on_action: props.on_action,
Expand All @@ -134,6 +141,12 @@ impl Button {
sound_on_click: props.snd_on_click,
}
}

// custom

pub fn update(&self, context: RunnerContext) -> RunnerResult<()> {
Ok(())
}
}

impl CnvType for Button {
Expand Down Expand Up @@ -296,11 +309,14 @@ impl CnvType for Button {
.and_then(discard_if_empty)
.map(parse_event_handler)
.transpose()?;
let on_signal = properties
.remove("ONSIGNAL")
.and_then(discard_if_empty)
.map(parse_event_handler)
.transpose()?;
let mut on_signal = HashMap::new();
for (k, v) in properties.iter() {
if k == "ONSIGNAL" {
on_signal.insert(String::from(""), parse_event_handler(v.to_owned())?);
} else if let Some(argument) = k.strip_prefix("ONSIGNAL^") {
on_signal.insert(String::from(argument), parse_event_handler(v.to_owned())?);
}
}
let on_start_dragging = properties
.remove("ONSTARTDRAGGING")
.and_then(discard_if_empty)
Expand Down
Loading

0 comments on commit d232a1f

Please sign in to comment.