Просмотр исходного кода

tools: use Entry* in sprite importer

Daniele Bartolini 5 лет назад
Родитель
Сommit
602992f8e3
2 измененных файлов с 177 добавлено и 278 удалено
  1. 16 16
      tools/level_editor/project.vala
  2. 161 262
      tools/level_editor/sprite_import_dialog.vala

+ 16 - 16
tools/level_editor/project.vala

@@ -471,14 +471,14 @@ public class Project
 
 		int width     = (int)sid._pixbuf.width;
 		int height    = (int)sid._pixbuf.height;
-		int num_h     = (int)sid.cells_h.value;
-		int num_v     = (int)sid.cells_v.value;
-		int cell_w    = (int)sid.cell_w.value;
-		int cell_h    = (int)sid.cell_h.value;
-		int offset_x  = (int)sid.offset_x.value;
-		int offset_y  = (int)sid.offset_y.value;
-		int spacing_x = (int)sid.spacing_x.value;
-		int spacing_y = (int)sid.spacing_y.value;
+		int num_h     = (int)sid.cells_hv.value.x;
+		int num_v     = (int)sid.cells_hv.value.y;
+		int cell_w    = (int)sid.cell_wh.value.x;
+		int cell_h    = (int)sid.cell_wh.value.y;
+		int offset_x  = (int)sid.offset_xy.value.x;
+		int offset_y  = (int)sid.offset_xy.value.y;
+		int spacing_x = (int)sid.spacing_xy.value.x;
+		int spacing_y = (int)sid.spacing_xy.value.y;
 		double layer  = sid.layer.value;
 		double depth  = sid.depth.value;
 
@@ -486,17 +486,17 @@ public class Project
 
 		bool collision_enabled         = sid.collision_enabled.active;
 		string shape_active_name       = (string)sid.shape.visible_child_name;
-		int circle_collision_center_x  = (int)sid.circle_collision_center_x.value;
-		int circle_collision_center_y  = (int)sid.circle_collision_center_y.value;
+		int circle_collision_center_x  = (int)sid.circle_collision_center_xy.value.x;
+		int circle_collision_center_y  = (int)sid.circle_collision_center_xy.value.y;
 		int circle_collision_radius    = (int)sid.circle_collision_radius.value;
-		int capsule_collision_center_x = (int)sid.capsule_collision_center_x.value;
-		int capsule_collision_center_y = (int)sid.capsule_collision_center_y.value;
+		int capsule_collision_center_x = (int)sid.capsule_collision_center_xy.value.x;
+		int capsule_collision_center_y = (int)sid.capsule_collision_center_xy.value.y;
 		int capsule_collision_radius   = (int)sid.capsule_collision_radius.value;
 		int capsule_collision_height   = (int)sid.capsule_collision_height.value;
-		int collision_x                = (int)sid.collision_x.value;
-		int collision_y                = (int)sid.collision_y.value;
-		int collision_w                = (int)sid.collision_w.value;
-		int collision_h                = (int)sid.collision_h.value;
+		int collision_x                = (int)sid.collision_xy.value.x;
+		int collision_y                = (int)sid.collision_xy.value.y;
+		int collision_w                = (int)sid.collision_wh.value.x;
+		int collision_h                = (int)sid.collision_wh.value.y;
 		string actor_class             = (string)sid.actor_class.value;
 		bool lock_rotation_y           = sid.lock_rotation_y.active;
 		double mass                    = (double)sid.mass.value;

+ 161 - 262
tools/level_editor/sprite_import_dialog.vala

@@ -89,7 +89,7 @@ Vector2 sprite_cell_pivot_xy(int cell_w, int cell_h, int pivot)
 	return Vector2(pivot_x, pivot_y);
 }
 
-Gtk.Label label_with_alignment(string text, Gtk.Align align)
+Gtk.Label label_with_alignment(string text, Gtk.Align align = Gtk.Align.END)
 {
 	var l = new Label(text);
 	l.halign = align;
@@ -105,15 +105,11 @@ public class SpriteImportDialog : Gtk.Dialog
 	public Gtk.DrawingArea _preview;
 
 	public Gtk.Label resolution;
-	public Gtk.SpinButton cells_h;
-	public Gtk.SpinButton cells_v;
+	public EntryVector2 cells_hv;
 	public Gtk.CheckButton cell_wh_auto;
-	public Gtk.SpinButton cell_w;
-	public Gtk.SpinButton cell_h;
-	public Gtk.SpinButton offset_x;
-	public Gtk.SpinButton offset_y;
-	public Gtk.SpinButton spacing_x;
-	public Gtk.SpinButton spacing_y;
+	public EntryVector2 cell_wh;
+	public EntryVector2 offset_xy;
+	public EntryVector2 spacing_xy;
 	public Gtk.ComboBoxText pivot;
 	public EntryDouble layer;
 	public EntryDouble depth;
@@ -123,21 +119,17 @@ public class SpriteImportDialog : Gtk.Dialog
 	public Gtk.StackSwitcher shape_switcher;
 	public Gtk.Stack shape;
 
-	public Gtk.SpinButton circle_collision_center_x;
-	public Gtk.SpinButton circle_collision_center_y;
-	public Gtk.SpinButton circle_collision_radius;
+	public EntryVector2 circle_collision_center_xy;
+	public EntryDouble circle_collision_radius;
 
-	public Gtk.SpinButton capsule_collision_center_x;
-	public Gtk.SpinButton capsule_collision_center_y;
-	public Gtk.SpinButton capsule_collision_height;
-	public Gtk.SpinButton capsule_collision_radius;
+	public EntryVector2 capsule_collision_center_xy;
+	public EntryDouble capsule_collision_height;
+	public EntryDouble capsule_collision_radius;
 
-	public Gtk.SpinButton collision_x;
-	public Gtk.SpinButton collision_y;
-	public Gtk.SpinButton collision_w;
-	public Gtk.SpinButton collision_h;
+	public EntryVector2 collision_xy;
+	public EntryVector2 collision_wh;
 	public ComboBoxMap actor_class;
-	public Gtk.SpinButton mass;
+	public EntryDouble mass;
 	public Gtk.CheckButton lock_rotation_y;
 
 	// Widgets
@@ -191,13 +183,13 @@ public class SpriteImportDialog : Gtk.Dialog
 				cr.paint();
 
 				// Pivot is relative to the top-left corner of the cell
-				Vector2 pivot = sprite_cell_pivot_xy((int)cell_w.value
-					, (int)cell_h.value
+				Vector2 pivot = sprite_cell_pivot_xy((int)cell_wh.value.x
+					, (int)cell_wh.value.y
 					, (int)pivot.active
 					);
 
-				int num_v = (int)cells_v.value;
-				int num_h = (int)cells_h.value;
+				int num_v = (int)cells_hv.value.y;
+				int num_h = (int)cells_hv.value.x;
 
 				for (int h = 0; h < num_v; ++h)
 				{
@@ -205,20 +197,20 @@ public class SpriteImportDialog : Gtk.Dialog
 					{
 						Vector2 cell = sprite_cell_xy(h
 							, w
-							, (int)offset_x.value
-							, (int)offset_y.value
-							, (int)cell_w.value
-							, (int)cell_h.value
-							, (int)spacing_x.value
-							, (int)spacing_y.value
+							, (int)offset_xy.value.x
+							, (int)offset_xy.value.y
+							, (int)cell_wh.value.x
+							, (int)cell_wh.value.y
+							, (int)spacing_xy.value.x
+							, (int)spacing_xy.value.y
 							);
 
 						int x0 = (int)cell.x;
 						int y0 = (int)cell.y;
-						int x1 = x0+(int)cell_w.value;
+						int x1 = x0+(int)cell_wh.value.x;
 						int y1 = y0;
 						int x2 = x1;
-						int y2 = y0+(int)cell_h.value;
+						int y2 = y0+(int)cell_wh.value.y;
 						int x3 = x0;
 						int y3 = y2;
 						// https://www.cairographics.org/FAQ/#sharp_lines
@@ -258,18 +250,18 @@ public class SpriteImportDialog : Gtk.Dialog
 
 				Vector2 cell = sprite_cell_xy(0
 					, 0
-					, (int)offset_x.value
-					, (int)offset_y.value
-					, (int)cell_w.value
-					, (int)cell_h.value
-					, (int)spacing_x.value
-					, (int)spacing_y.value
+					, (int)offset_xy.value.x
+					, (int)offset_xy.value.y
+					, (int)cell_wh.value.x
+					, (int)cell_wh.value.y
+					, (int)spacing_xy.value.x
+					, (int)spacing_xy.value.y
 					);
 
 				int x0 = (int)cell.x;
 				int y0 = (int)cell.y;
-				int x1 = x0+(int)cell_w.value;
-				int y2 = y0+(int)cell_h.value;
+				int x1 = x0+(int)cell_wh.value.x;
+				int y2 = y0+(int)cell_wh.value.y;
 
 				// Draw checkered background
 				cr.save();
@@ -294,16 +286,16 @@ public class SpriteImportDialog : Gtk.Dialog
 
 				// Draw collision
 				if (shape.visible_child_name == "square_collider") {
-					cr.rectangle(collision_x.value, collision_y.value, collision_w.value, collision_h.value);
+					cr.rectangle(collision_xy.value.x, collision_xy.value.y, collision_wh.value.x, collision_wh.value.y);
 					cr.set_source_rgba(0.3, 0.3, 0.3, 0.6);
 					cr.fill();
 				} else if (shape.visible_child_name == "circle_collider") {
-					cr.arc(circle_collision_center_x.value, circle_collision_center_y.value, circle_collision_radius.value, 0, 2*Math.PI);
+					cr.arc(circle_collision_center_xy.value.x, circle_collision_center_xy.value.y, circle_collision_radius.value, 0, 2*Math.PI);
 					cr.set_source_rgba(0.3, 0.3, 0.3, 0.6);
 					cr.fill();
 				} else if (shape.visible_child_name == "capsule_collider") {
-					double x = capsule_collision_center_x.value;
-					double y = capsule_collision_center_y.value;
+					double x = capsule_collision_center_xy.value.x;
+					double y = capsule_collision_center_xy.value.y;
 					double radius = capsule_collision_radius.value;
 					double height = capsule_collision_height.value - 2*radius;
 					cr.arc(x - height/2, y, radius, Math.PI/2, 3*Math.PI/2);
@@ -319,33 +311,18 @@ public class SpriteImportDialog : Gtk.Dialog
 		resolution = new Gtk.Label(_pixbuf.width.to_string() + " × " + _pixbuf.height.to_string());
 		resolution.halign = Gtk.Align.START;
 
-		cells_h = new Gtk.SpinButton.with_range(1.0, 256.0, 1.0);
-		cells_h.value = 4;
-		cells_v = new Gtk.SpinButton.with_range(1.0, 256.0, 1.0);
-		cells_v.value = 4;
+		cells_hv = new EntryVector2(Vector2(4.0, 4.0), Vector2(1.0, 1.0), Vector2(256.0, 256.0));
 		cell_wh_auto = new Gtk.CheckButton();
 		cell_wh_auto.active = true;
-		cell_w = new Gtk.SpinButton.with_range(1.0, double.MAX, 1.0);
-		cell_w.value = _pixbuf.width / cells_h.value;
-		cell_w.sensitive = !cell_wh_auto.active;
-		cell_h = new Gtk.SpinButton.with_range(1.0, double.MAX, 1.0);
-		cell_h.value = _pixbuf.height / cells_v.value;
-		cell_h.sensitive = !cell_wh_auto.active;
-		offset_x = new Gtk.SpinButton.with_range(0, double.MAX, 1.0);
-		offset_y = new Gtk.SpinButton.with_range(0, double.MAX, 1.0);
-		spacing_x = new Gtk.SpinButton.with_range(0, double.MAX, 1.0);
-		spacing_y = new Gtk.SpinButton.with_range(0, double.MAX, 1.0);
+		cell_wh = new EntryVector2(Vector2(_pixbuf.width / cells_hv.value.x, _pixbuf.height / cells_hv.value.y), Vector2(1.0, 1.0), Vector2(double.MAX, double.MAX));
+		cell_wh.sensitive = !cell_wh_auto.active;
+		offset_xy = new EntryVector2(Vector2(0.0, 0.0), Vector2(0.0, 0.0), Vector2(double.MAX, double.MAX));
+		spacing_xy = new EntryVector2(Vector2(0.0, 0.0), Vector2(0.0, 0.0), Vector2(double.MAX, double.MAX));
 
 		collision_enabled = new Gtk.CheckButton();
 		collision_enabled.active = true;
-		collision_x = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		collision_x.value = 0;
-		collision_y = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		collision_y.value = 0;
-		collision_w = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		collision_w.value = 32;
-		collision_h = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		collision_h.value = 32;
+		collision_xy = new EntryVector2(Vector2(0.0, 0.0), Vector2(-double.MAX, -double.MAX), Vector2(double.MAX, double.MAX));
+		collision_wh = new EntryVector2(Vector2(32.0, 32.0), Vector2(-double.MAX, -double.MAX), Vector2(double.MAX, double.MAX));
 		actor_class = new ComboBoxMap();
 		actor_class.append("static", "static");
 		actor_class.append("dynamic", "dynamic");
@@ -354,100 +331,55 @@ public class SpriteImportDialog : Gtk.Dialog
 		actor_class.value = "static";
 		lock_rotation_y = new Gtk.CheckButton();
 		lock_rotation_y.active = true;
-		mass = new Gtk.SpinButton.with_range(0, double.MAX, 1.0);
-		mass.value = 10;
-
-
-		circle_collision_center_x = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		circle_collision_center_x.value = cell_w.value/2.0;
-		circle_collision_center_y = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		circle_collision_center_y.value = cell_h.value/2.0;;
-		circle_collision_radius = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		circle_collision_radius.value = 32;
-
-		capsule_collision_center_x = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		capsule_collision_center_x.value = cell_w.value/2.0;
-		capsule_collision_center_y = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		capsule_collision_center_y.value = cell_h.value/2.0;;
-		capsule_collision_radius = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		capsule_collision_radius.value = 32;
-		capsule_collision_height = new Gtk.SpinButton.with_range(-double.MAX, double.MAX, 1.0);
-		capsule_collision_height.value = 64;
-
-		cells_h.value_changed.connect (() => {
-			if (cell_wh_auto.active)
-			{
-				cell_w.value = _pixbuf.width / cells_h.value;
-				cell_h.value = _pixbuf.height / cells_v.value;
-			}
-			_drawing_area.queue_draw();
-			_preview.queue_draw();
-		});
+		mass = new EntryDouble(10.0, 0.0, double.MAX);
 
-		cells_v.value_changed.connect(() => {
-			if (cell_wh_auto.active)
-			{
-				cell_w.value = _pixbuf.width / cells_h.value;
-				cell_h.value = _pixbuf.height / cells_v.value;
-			}
-			_drawing_area.queue_draw();
-			_preview.queue_draw();
-		});
+		circle_collision_center_xy = new EntryVector2(Vector2(cell_wh.value.x/2.0, cell_wh.value.y/2.0), Vector2(-double.MAX, -double.MAX), Vector2(double.MAX, double.MAX));
+		circle_collision_radius = new EntryDouble(32.0, 0.0, double.MAX);
 
-		cell_wh_auto.toggled.connect(() => {
-			cell_w.sensitive = !cell_wh_auto.active;
-			cell_h.sensitive = !cell_wh_auto.active;
-			cell_w.value = _pixbuf.width / cells_h.value;
-			cell_h.value = _pixbuf.height / cells_v.value;
-			_drawing_area.queue_draw();
-			_preview.queue_draw();
-		});
+		capsule_collision_center_xy = new EntryVector2(Vector2(cell_wh.value.x/2.0, cell_wh.value.y/2.0), Vector2(-double.MAX, -double.MAX), Vector2(double.MAX, double.MAX));
+		capsule_collision_radius = new EntryDouble(32.0, -double.MAX, double.MAX);
+		capsule_collision_height = new EntryDouble(64.0, 0.0, double.MAX);
 
-		cell_w.value_changed.connect (() => {
-			circle_collision_center_x.value = cell_w.value/2.0;
-			capsule_collision_center_x.value = cell_w.value/2.0;
-			_drawing_area.queue_draw();
-			_preview.queue_draw();
-		});
+		cells_hv.value_changed.connect (() => {
+			if (cell_wh_auto.active)
+				cell_wh.value = Vector2(_pixbuf.width / cells_hv.value.x, _pixbuf.height / cells_hv.value.y);
 
-		cell_h.value_changed.connect(() => {
-			circle_collision_center_y.value = cell_h.value/2.0;
-			capsule_collision_center_y.value = cell_h.value/2.0;
 			_drawing_area.queue_draw();
 			_preview.queue_draw();
 		});
 
-		offset_x.value_changed.connect(() => {
+		cell_wh_auto.toggled.connect(() => {
+			cell_wh.sensitive = !cell_wh_auto.active;
+			cell_wh.value = Vector2(_pixbuf.width / cells_hv.value.x, _pixbuf.height / cells_hv.value.y);
+
 			_drawing_area.queue_draw();
 			_preview.queue_draw();
 		});
 
-		offset_y.value_changed.connect(() => {
+		cell_wh.value_changed.connect (() => {
+			circle_collision_center_xy.value = Vector2(cell_wh.value.x/2.0, cell_wh.value.y/2.0);
+			capsule_collision_center_xy.value = Vector2(cell_wh.value.x/2.0, cell_wh.value.y/2.0);
 			_drawing_area.queue_draw();
 			_preview.queue_draw();
 		});
 
-		spacing_x.value_changed.connect(() => {
+		offset_xy.value_changed.connect(() => {
 			_drawing_area.queue_draw();
 			_preview.queue_draw();
 		});
 
-		spacing_y.value_changed.connect(() => {
+		spacing_xy.value_changed.connect(() => {
 			_drawing_area.queue_draw();
 			_preview.queue_draw();
 		});
 
 		collision_enabled.toggled.connect(() => {
-			collision_x.sensitive = !collision_x.sensitive;
-			collision_y.sensitive = !collision_y.sensitive;
-			collision_w.sensitive = !collision_w.sensitive;
-			collision_h.sensitive = !collision_h.sensitive;
+			collision_xy.sensitive = !collision_xy.sensitive;
+			collision_wh.sensitive = !collision_wh.sensitive;
 			shape_switcher.sensitive = !shape_switcher.sensitive;
-			circle_collision_center_x.sensitive = !circle_collision_center_x.sensitive;
-			circle_collision_center_y.sensitive = !circle_collision_center_y.sensitive;
+			circle_collision_center_xy.sensitive = !circle_collision_center_xy.sensitive;
 			circle_collision_radius.sensitive = !circle_collision_radius.sensitive;
-			capsule_collision_center_x.sensitive = !capsule_collision_center_x.sensitive;
-			capsule_collision_center_y.sensitive = !capsule_collision_center_y.sensitive;
+			capsule_collision_center_xy.sensitive = !capsule_collision_center_xy.sensitive;
 			capsule_collision_radius.sensitive = !capsule_collision_radius.sensitive;
 			capsule_collision_height.sensitive = !capsule_collision_height.sensitive;
 			actor_class.sensitive = !actor_class.sensitive;
@@ -455,27 +387,15 @@ public class SpriteImportDialog : Gtk.Dialog
 			lock_rotation_y.sensitive = !lock_rotation_y.sensitive;
 		});
 
-		collision_x.value_changed.connect(() => {
-			_preview.queue_draw();
-		});
-
-		collision_y.value_changed.connect(() => {
-			_preview.queue_draw();
-		});
-
-		collision_w.value_changed.connect(() => {
-			_preview.queue_draw();
-		});
-
-		collision_h.value_changed.connect(() => {
+		collision_xy.value_changed.connect(() => {
 			_preview.queue_draw();
 		});
 
-		circle_collision_center_x.value_changed.connect(() => {
+		collision_wh.value_changed.connect(() => {
 			_preview.queue_draw();
 		});
 
-		circle_collision_center_y.value_changed.connect(() => {
+		circle_collision_center_xy.value_changed.connect(() => {
 			_preview.queue_draw();
 		});
 
@@ -483,11 +403,7 @@ public class SpriteImportDialog : Gtk.Dialog
 			_preview.queue_draw();
 		});
 
-		capsule_collision_center_x.value_changed.connect(() => {
-			_preview.queue_draw();
-		});
-
-		capsule_collision_center_y.value_changed.connect(() => {
+		capsule_collision_center_xy.value_changed.connect(() => {
 			_preview.queue_draw();
 		});
 
@@ -520,86 +436,77 @@ public class SpriteImportDialog : Gtk.Dialog
 		depth = new EntryDouble(0.0, 0.0, 9999.0);
 
 		Gtk.Grid grid = new Gtk.Grid();
-		grid.attach(label_with_alignment("Resolution", Gtk.Align.END),   0,  0, 1, 1);
-		grid.attach(label_with_alignment("Cells H", Gtk.Align.END),      0,  1, 1, 1);
-		grid.attach(label_with_alignment("Cells V", Gtk.Align.END),      0,  2, 1, 1);
-		grid.attach(label_with_alignment("Cell WH auto", Gtk.Align.END), 0,  3, 1, 1);
-		grid.attach(label_with_alignment("Cell W", Gtk.Align.END),       0,  4, 1, 1);
-		grid.attach(label_with_alignment("Cell H", Gtk.Align.END),       0,  5, 1, 1);
-		grid.attach(label_with_alignment("Offset X", Gtk.Align.END),     0,  6, 1, 1);
-		grid.attach(label_with_alignment("Offset Y", Gtk.Align.END),     0,  7, 1, 1);
-		grid.attach(label_with_alignment("Spacing X", Gtk.Align.END),    0,  8, 1, 1);
-		grid.attach(label_with_alignment("Spacing Y", Gtk.Align.END),    0,  9, 1, 1);
-		grid.attach(label_with_alignment("Pivot", Gtk.Align.END),        0, 10, 1, 1);
-		grid.attach(label_with_alignment("Layer", Gtk.Align.END),        0, 11, 1, 1);
-		grid.attach(label_with_alignment("Depth", Gtk.Align.END),        0, 12, 1, 1);
-
-		grid.attach(label_with_alignment("Collision", Gtk.Align.END),    0, 13, 1, 1);
-		grid.attach(label_with_alignment("Class", Gtk.Align.END),    0, 14, 1, 1);
-		grid.attach(label_with_alignment("Mass", Gtk.Align.END),    0, 15, 1, 1);
-		grid.attach(label_with_alignment("Lock Rotation", Gtk.Align.END),    0, 16, 1, 1);
-
-		grid.attach(resolution,   1,  0, 1, 1);
-		grid.attach(cells_h,      1,  1, 1, 1);
-		grid.attach(cells_v,      1,  2, 1, 1);
-		grid.attach(cell_wh_auto, 1,  3, 1, 1);
-		grid.attach(cell_w,       1,  4, 1, 1);
-		grid.attach(cell_h,       1,  5, 1, 1);
-		grid.attach(offset_x,     1,  6, 1, 1);
-		grid.attach(offset_y,     1,  7, 1, 1);
-		grid.attach(spacing_x,    1,  8, 1, 1);
-		grid.attach(spacing_y,    1,  9, 1, 1);
-		grid.attach(pivot,        1, 10, 1, 1);
-		grid.attach(layer,        1, 11, 1, 1);
-		grid.attach(depth,        1, 12, 1, 1);
-
-		grid.attach(collision_enabled, 1, 13, 1, 1);
-		grid.attach(actor_class,       1, 14, 1, 1);
-		grid.attach(mass,              1, 15, 1, 1);
-		grid.attach(lock_rotation_y,   1, 16, 1, 1);
-		shape = new Gtk.Stack();
+		grid.attach(label_with_alignment("Resolution"),    0,  0, 1, 1);
+		grid.attach(label_with_alignment("Cells"),         0,  1, 1, 1);
+		grid.attach(label_with_alignment("Auto Size"),     0,  2, 1, 1);
+		grid.attach(label_with_alignment("Cell"),          0,  3, 1, 1);
+		grid.attach(label_with_alignment("Offset"),        0,  4, 1, 1);
+		grid.attach(label_with_alignment("Spacing"),       0,  5, 1, 1);
+		grid.attach(label_with_alignment("Pivot"),         0,  6, 1, 1);
+		grid.attach(label_with_alignment("Layer"),         0,  7, 1, 1);
+		grid.attach(label_with_alignment("Depth"),         0,  8, 1, 1);
+		grid.attach(label_with_alignment("Collision"),     0,  9, 1, 1);
+		grid.attach(label_with_alignment("Class"),         0, 10, 1, 1);
+		grid.attach(label_with_alignment("Mass"),          0, 11, 1, 1);
+		grid.attach(label_with_alignment("Lock Rotation"), 0, 12, 1, 1);
+
+		grid.attach(resolution,        1,  0, 1, 1);
+		grid.attach(cells_hv,          1,  1, 1, 1);
+		grid.attach(cell_wh_auto,      1,  2, 1, 1);
+		grid.attach(cell_wh,           1,  3, 1, 1);
+		grid.attach(offset_xy,         1,  4, 1, 1);
+		grid.attach(spacing_xy,        1,  5, 1, 1);
+		grid.attach(pivot,             1,  6, 1, 1);
+		grid.attach(layer,             1,  7, 1, 1);
+		grid.attach(depth,             1,  8, 1, 1);
+		grid.attach(collision_enabled, 1,  9, 1, 1);
+		grid.attach(actor_class,       1, 10, 1, 1);
+		grid.attach(mass,              1, 11, 1, 1);
+		grid.attach(lock_rotation_y,   1, 12, 1, 1);
+
 		Gtk.Grid square_grid = new Gtk.Grid();
-		square_grid.attach(label_with_alignment("Collision X", Gtk.Align.END),  0, 0, 1, 1);
-		square_grid.attach(label_with_alignment("Collision Y", Gtk.Align.END),  0, 1, 1, 1);
-		square_grid.attach(label_with_alignment("Collision W", Gtk.Align.END),  0, 2, 1, 1);
-		square_grid.attach(label_with_alignment("Collision H", Gtk.Align.END),  0, 3, 1, 1);
-		square_grid.attach(collision_x,       1, 0, 1, 1);
-		square_grid.attach(collision_y,       1, 1, 1, 1);
-		square_grid.attach(collision_w,       1, 2, 1, 1);
-		square_grid.attach(collision_h,       1, 3, 1, 1);
+		square_grid.attach(label_with_alignment("Collision XY"), 0, 0, 1, 1);
+		square_grid.attach(label_with_alignment("Collision WH"), 0, 1, 1, 1);
+		square_grid.attach(collision_xy,                         1, 0, 1, 1);
+		square_grid.attach(collision_wh,                         1, 1, 1, 1);
+		collision_xy.hexpand = true;
+		collision_wh.hexpand = true;
 		square_grid.row_spacing = 6;
 		square_grid.column_spacing = 12;
 
 		Gtk.Grid circle_grid = new Gtk.Grid();
-		circle_grid.attach(label_with_alignment("Collision X", Gtk.Align.END),  0, 0, 1, 1);
-		circle_grid.attach(label_with_alignment("Collision Y", Gtk.Align.END),  0, 1, 1, 1);
-		circle_grid.attach(label_with_alignment("Radius", Gtk.Align.END),  0, 2, 1, 1);
-		circle_grid.attach(circle_collision_center_x, 1, 0, 1, 1);
-		circle_grid.attach(circle_collision_center_y, 1, 1, 1, 1);
-		circle_grid.attach(circle_collision_radius, 1, 2, 1, 1);
+		circle_grid.attach(label_with_alignment("Collision XY"), 0, 0, 1, 1);
+		circle_grid.attach(label_with_alignment("Radius"),       0, 1, 1, 1);
+		circle_grid.attach(circle_collision_center_xy,           1, 0, 1, 1);
+		circle_grid.attach(circle_collision_radius,              1, 1, 1, 1);
+		circle_collision_center_xy.hexpand = true;
+		circle_collision_radius.hexpand = true;
 		circle_grid.row_spacing = 6;
 		circle_grid.column_spacing = 12;
 
 		Gtk.Grid capsule_grid = new Gtk.Grid();
-		capsule_grid.attach(label_with_alignment("Collision X", Gtk.Align.END),  0, 0, 1, 1);
-		capsule_grid.attach(label_with_alignment("Collision Y", Gtk.Align.END),  0, 1, 1, 1);
-		capsule_grid.attach(label_with_alignment("Radius", Gtk.Align.END),  0, 2, 1, 1);
-		capsule_grid.attach(label_with_alignment("Height", Gtk.Align.END),  0, 3, 1, 1);
-		capsule_grid.attach(capsule_collision_center_x, 1, 0, 1, 1);
-		capsule_grid.attach(capsule_collision_center_y, 1, 1, 1, 1);
-		capsule_grid.attach(capsule_collision_radius, 1, 2, 1, 1);
-		capsule_grid.attach(capsule_collision_height, 1, 3, 1, 1);
+		capsule_grid.attach(label_with_alignment("Collision XY"), 0, 0, 1, 1);
+		capsule_grid.attach(label_with_alignment("Radius"),       0, 1, 1, 1);
+		capsule_grid.attach(label_with_alignment("Height"),       0, 2, 1, 1);
+		capsule_grid.attach(capsule_collision_center_xy,          1, 0, 1, 1);
+		capsule_grid.attach(capsule_collision_radius,             1, 1, 1, 1);
+		capsule_grid.attach(capsule_collision_height,             1, 2, 1, 1);
+		capsule_collision_center_xy.hexpand = true;
+		capsule_collision_radius.hexpand = true;
+		capsule_collision_height.hexpand = true;
 		capsule_grid.row_spacing = 6;
 		capsule_grid.column_spacing = 12;
 
-		shape.add_titled(square_grid, "square_collider", "Square Collider");
-		shape.add_titled(circle_grid, "circle_collider", "Circle Collider");
-		shape.add_titled(capsule_grid, "capsule_collider", "Capsule Collider");
+		shape = new Gtk.Stack();
+		shape.add_titled(square_grid, "square_collider", "Square");
+		shape.add_titled(circle_grid, "circle_collider", "Circle");
+		shape.add_titled(capsule_grid, "capsule_collider", "Capsule");
 		shape_switcher = new Gtk.StackSwitcher();
 		shape_switcher.set_stack(shape);
-		grid.attach(shape_switcher, 1, 17, 1, 1);
-		grid.attach(shape, 1, 18, 1, 5);
 
+		grid.attach(label_with_alignment("Collider"), 0, 13, 1, 1);
+		grid.attach(shape_switcher,                   1, 13, 1, 1);
+		grid.attach(shape,                            1, 14, 1, 1);
 		grid.row_spacing = 6;
 		grid.column_spacing = 12;
 
@@ -633,61 +540,53 @@ public class SpriteImportDialog : Gtk.Dialog
 	public void load(Hashtable importer_settings)
 	{
 		// Load settings
-		cells_h.value                    = (double)importer_settings["num_h"];
-		cells_v.value                    = (double)importer_settings["num_v"];
-		cell_w.value                     = (double)importer_settings["cell_w"];
-		cell_h.value                     = (double)importer_settings["cell_h"];
-		offset_x.value                   = (double)importer_settings["offset_x"];
-		offset_y.value                   = (double)importer_settings["offset_y"];
-		spacing_x.value                  = (double)importer_settings["spacing_x"];
-		spacing_y.value                  = (double)importer_settings["spacing_y"];
-		layer.value                      = (double)importer_settings["layer"];
-		depth.value                      = (double)importer_settings["depth"];
-		pivot.active                     = (int)(double)importer_settings["pivot"];
-		collision_enabled.active         = (bool)importer_settings["collision_enabled"];
-		collision_x.value                = (double)importer_settings["collision_x"];
-		collision_y.value                = (double)importer_settings["collision_y"];
-		collision_w.value                = (double)importer_settings["collision_w"];
-		collision_h.value                = (double)importer_settings["collision_h"];
-
-		circle_collision_center_x.value  = importer_settings.has_key("circle_collision_center_x") ? (double)importer_settings["circle_collision_center_x"] : cell_w.value/2.0;
-		circle_collision_center_y.value  = importer_settings.has_key("circle_collision_center_y") ? (double)importer_settings["circle_collision_center_y"] : cell_h.value/2.0;
+		cells_hv.value           = Vector2((double)importer_settings["num_h"], (double)importer_settings["num_v"]);
+		cell_wh.value            = Vector2((double)importer_settings["cell_w"], (double)importer_settings["cell_h"]);
+		offset_xy.value          = Vector2((double)importer_settings["offset_x"], (double)importer_settings["offset_y"]);
+		spacing_xy.value         = Vector2((double)importer_settings["spacing_x"], (double)importer_settings["spacing_y"]);
+		layer.value              = (double)importer_settings["layer"];
+		depth.value              = (double)importer_settings["depth"];
+		pivot.active             = (int)(double)importer_settings["pivot"];
+		collision_enabled.active = (bool)importer_settings["collision_enabled"];
+		collision_xy.value       = Vector2((double)importer_settings["collision_x"], (double)importer_settings["collision_y"]);
+		collision_wh.value       = Vector2((double)importer_settings["collision_w"], (double)importer_settings["collision_h"]);
+
+		circle_collision_center_xy.value = Vector2(importer_settings.has_key("circle_collision_center_x") ? (double)importer_settings["circle_collision_center_x"] : cell_wh.value.x/2.0, importer_settings.has_key("circle_collision_center_y") ? (double)importer_settings["circle_collision_center_y"] : cell_wh.value.y/2.0);
 		circle_collision_radius.value    = importer_settings.has_key("circle_collision_radius") ? (double)importer_settings["circle_collision_radius"] : 32;
 
-		capsule_collision_center_x.value = importer_settings.has_key("capsule_collision_center_x") ? (double)importer_settings["capsule_collision_center_x"] : cell_w.value/2.0;
-		capsule_collision_center_y.value = importer_settings.has_key("capsule_collision_center_y") ? (double)importer_settings["capsule_collision_center_y"] : cell_h.value/2.0;
-		capsule_collision_radius.value   = importer_settings.has_key("capsule_collision_radius") ? (double)importer_settings["capsule_collision_radius"] : 32;
-		capsule_collision_height.value   = importer_settings.has_key("capsule_collision_height") ? (double)importer_settings["capsule_collision_height"] : 64;
+		capsule_collision_center_xy.value = Vector2(importer_settings.has_key("capsule_collision_center_x") ? (double)importer_settings["capsule_collision_center_x"] : cell_wh.value.x/2.0, importer_settings.has_key("capsule_collision_center_y") ? (double)importer_settings["capsule_collision_center_y"] : cell_wh.value.y/2.0);
+		capsule_collision_radius.value    = importer_settings.has_key("capsule_collision_radius") ? (double)importer_settings["capsule_collision_radius"] : 32;
+		capsule_collision_height.value    = importer_settings.has_key("capsule_collision_height") ? (double)importer_settings["capsule_collision_height"] : 64;
 
-		shape.visible_child_name         = importer_settings.has_key("shape_active_name") ? (string)importer_settings["shape_active_name"] : "square_collider";
-		actor_class.value                = importer_settings.has_key("actor_class") ? (string)importer_settings["actor_class"] : "static";
-		lock_rotation_y.active			 = importer_settings.has_key("lock_rotation_y") ? (bool)importer_settings["lock_rotation_y"] : true;
-		mass.value						 = importer_settings.has_key("mass") ? (double)importer_settings["mass"] : 10.0;
+		shape.visible_child_name          = importer_settings.has_key("shape_active_name") ? (string)importer_settings["shape_active_name"] : "square_collider";
+		actor_class.value                 = importer_settings.has_key("actor_class") ? (string)importer_settings["actor_class"] : "static";
+		lock_rotation_y.active			  = importer_settings.has_key("lock_rotation_y") ? (bool)importer_settings["lock_rotation_y"] : true;
+		mass.value						  = importer_settings.has_key("mass") ? (double)importer_settings["mass"] : 10.0;
 	}
 
 	public void save(Hashtable importer_settings)
 	{
-		importer_settings["num_h"]                      = cells_h.value;
-		importer_settings["num_v"]                      = cells_v.value;
-		importer_settings["cell_w"]                     = cell_w.value;
-		importer_settings["cell_h"]                     = cell_h.value;
-		importer_settings["offset_x"]                   = offset_x.value;
-		importer_settings["offset_y"]                   = offset_y.value;
-		importer_settings["spacing_x"]                  = spacing_x.value;
-		importer_settings["spacing_y"]                  = spacing_y.value;
+		importer_settings["num_h"]                      = cells_hv.value.x;
+		importer_settings["num_v"]                      = cells_hv.value.y;
+		importer_settings["cell_w"]                     = cell_wh.value.x;
+		importer_settings["cell_h"]                     = cell_wh.value.y;
+		importer_settings["offset_x"]                   = offset_xy.value.x;
+		importer_settings["offset_y"]                   = offset_xy.value.y;
+		importer_settings["spacing_x"]                  = spacing_xy.value.x;
+		importer_settings["spacing_y"]                  = spacing_xy.value.y;
 		importer_settings["layer"]                      = layer.value;
 		importer_settings["depth"]                      = depth.value;
 		importer_settings["pivot"]                      = pivot.active;
 		importer_settings["collision_enabled"]          = collision_enabled.active;
-		importer_settings["collision_x"]                = collision_x.value;
-		importer_settings["collision_y"]                = collision_y.value;
-		importer_settings["collision_w"]                = collision_w.value;
-		importer_settings["collision_h"]                = collision_h.value;
-		importer_settings["circle_collision_center_x"]  = circle_collision_center_x.value;
-		importer_settings["circle_collision_center_y"]  = circle_collision_center_y.value;
+		importer_settings["collision_x"]                = collision_xy.value.x;
+		importer_settings["collision_y"]                = collision_xy.value.y;
+		importer_settings["collision_w"]                = collision_wh.value.x;
+		importer_settings["collision_h"]                = collision_wh.value.y;
+		importer_settings["circle_collision_center_x"]  = circle_collision_center_xy.value.x;
+		importer_settings["circle_collision_center_y"]  = circle_collision_center_xy.value.y;
 		importer_settings["circle_collision_radius"]    = circle_collision_radius.value;
-		importer_settings["capsule_collision_center_x"] = capsule_collision_center_x.value;
-		importer_settings["capsule_collision_center_y"] = capsule_collision_center_y.value;
+		importer_settings["capsule_collision_center_x"] = capsule_collision_center_xy.value.x;
+		importer_settings["capsule_collision_center_y"] = capsule_collision_center_xy.value.y;
 		importer_settings["capsule_collision_radius"]   = capsule_collision_radius.value;
 		importer_settings["capsule_collision_height"]   = capsule_collision_height.value;
 		importer_settings["shape_active_name"]          = shape.visible_child_name;