Skip to content

Commit

Permalink
tools: actor components's translation/rotation lock
Browse files Browse the repository at this point in the history
Part-of: #181
  • Loading branch information
dbartolini committed Oct 18, 2024
1 parent 2d1c64a commit edf5042
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 10 deletions.
42 changes: 32 additions & 10 deletions tools/level_editor/properties_view.vala
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,8 @@ public class ActorPropertyGrid : PropertyGrid
private EntryText _collision_filter;
private EntryDouble _mass;
private EntryText _material;
private CheckBox3 _lock_translation;
private CheckBox3 _lock_rotation;

public ActorPropertyGrid(Database db)
{
Expand All @@ -419,11 +421,25 @@ public class ActorPropertyGrid : PropertyGrid
_material.sensitive = false;
_mass = new EntryDouble(1.0, 0.0, double.MAX);
_mass.value_changed.connect(on_value_changed);
_lock_translation = new CheckBox3();
_lock_translation.value_changed.connect(on_value_changed);
_lock_rotation = new CheckBox3();
_lock_rotation.value_changed.connect(on_value_changed);

add_row("Class", _class);
add_row("Collision Filter", _collision_filter);
add_row("Material", _material);
add_row("Mass", _mass);
add_row("Lock Translation", _lock_translation);
add_row("Lock Rotation", _lock_rotation);
}

private bool get_component_property_bool_optional(Unit unit, Guid component_id, string key)
{
return unit.get_component_property(component_id, key) != null
? (bool)unit.get_component_property_bool(component_id, key)
: false
;
}

private void on_value_changed()
Expand All @@ -433,23 +449,29 @@ public class ActorPropertyGrid : PropertyGrid
unit.set_component_property_string(_component_id, "data.collision_filter", _collision_filter.text);
unit.set_component_property_string(_component_id, "data.material", _material.text);
unit.set_component_property_double(_component_id, "data.mass", _mass.value);
unit.set_component_property_bool (_component_id, "data.lock_rotation_x", (bool)unit.get_component_property_bool(_component_id, "data.lock_rotation_x"));
unit.set_component_property_bool (_component_id, "data.lock_rotation_y", (bool)unit.get_component_property_bool(_component_id, "data.lock_rotation_y"));
unit.set_component_property_bool (_component_id, "data.lock_rotation_z", (bool)unit.get_component_property_bool(_component_id, "data.lock_rotation_z"));
unit.set_component_property_bool (_component_id, "data.lock_translation_x", (bool)unit.get_component_property_bool(_component_id, "data.lock_translation_x"));
unit.set_component_property_bool (_component_id, "data.lock_translation_y", (bool)unit.get_component_property_bool(_component_id, "data.lock_translation_y"));
unit.set_component_property_bool (_component_id, "data.lock_translation_z", (bool)unit.get_component_property_bool(_component_id, "data.lock_translation_z"));
unit.set_component_property_bool (_component_id, "data.lock_translation_x", _lock_translation._x.value);
unit.set_component_property_bool (_component_id, "data.lock_translation_y", _lock_translation._y.value);
unit.set_component_property_bool (_component_id, "data.lock_translation_z", _lock_translation._z.value);
unit.set_component_property_bool (_component_id, "data.lock_rotation_x", _lock_rotation._x.value);
unit.set_component_property_bool (_component_id, "data.lock_rotation_y", _lock_rotation._y.value);
unit.set_component_property_bool (_component_id, "data.lock_rotation_z", _lock_rotation._z.value);

_db.add_restore_point((int)ActionType.SET_ACTOR, new Guid?[] { _id, _component_id });
}

public override void update()
{
Unit unit = new Unit(_db, _id);
_class.value = unit.get_component_property_string(_component_id, "data.class");
_collision_filter.text = unit.get_component_property_string(_component_id, "data.collision_filter");
_material.text = unit.get_component_property_string(_component_id, "data.material");
_mass.value = unit.get_component_property_double(_component_id, "data.mass");
_class.value = unit.get_component_property_string(_component_id, "data.class");
_collision_filter.text = unit.get_component_property_string(_component_id, "data.collision_filter");
_material.text = unit.get_component_property_string(_component_id, "data.material");
_mass.value = unit.get_component_property_double(_component_id, "data.mass");
_lock_translation._x.value = get_component_property_bool_optional(unit, _component_id, "data.lock_translation_x");
_lock_translation._y.value = get_component_property_bool_optional(unit, _component_id, "data.lock_translation_y");
_lock_translation._z.value = get_component_property_bool_optional(unit, _component_id, "data.lock_translation_z");
_lock_rotation._x.value = get_component_property_bool_optional(unit, _component_id, "data.lock_rotation_x");
_lock_rotation._y.value = get_component_property_bool_optional(unit, _component_id, "data.lock_rotation_y");
_lock_rotation._z.value = get_component_property_bool_optional(unit, _component_id, "data.lock_rotation_z");
}
}

Expand Down
77 changes: 77 additions & 0 deletions tools/widgets/check_box3.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (c) 2012-2024 Daniele Bartolini et al.
* SPDX-License-Identifier: GPL-3.0-or-later
*/

namespace Crown
{
public class CheckBox3 : Gtk.Box
{
// Data
public bool _stop_emit;

// Widgets
public CheckBox _x;
public CheckBox _y;
public CheckBox _z;
public Gtk.Label _x_label;
public Gtk.Label _y_label;
public Gtk.Label _z_label;
public Gtk.Box _x_box;
public Gtk.Box _y_box;
public Gtk.Box _z_box;

// Signals
public signal void value_changed();

public CheckBox3()
{
Object(orientation: Gtk.Orientation.HORIZONTAL, spacing: 4);

// Data
_stop_emit = false;

// Widgets
_x = new CheckBox();
_y = new CheckBox();
_z = new CheckBox();

_x.value_changed.connect(on_value_changed);
_y.value_changed.connect(on_value_changed);
_z.value_changed.connect(on_value_changed);

_x_label = new Gtk.Label("X");
_x_label.get_style_context().add_class("axis");
_x_label.get_style_context().add_class("x");
_y_label = new Gtk.Label("Y");
_y_label.get_style_context().add_class("axis");
_y_label.get_style_context().add_class("y");
_z_label = new Gtk.Label("Z");
_z_label.get_style_context().add_class("axis");
_z_label.get_style_context().add_class("z");

_x_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
_x_box.pack_start(_x_label, false);
_x_box.pack_start(_x, true);

_y_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
_y_box.pack_start(_y_label, false);
_y_box.pack_start(_y, true);

_z_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
_z_box.pack_start(_z_label, false);
_z_box.pack_start(_z, true);

this.pack_start(_x_box, true);
this.pack_start(_y_box, true);
this.pack_start(_z_box, true);
}

private void on_value_changed()
{
if (!_stop_emit)
value_changed();
}
}

} /* namespace Crown */

0 comments on commit edf5042

Please sign in to comment.