From 06e4ecf4257e4dd0813087e1fcd642d7f0ce7713 Mon Sep 17 00:00:00 2001
From: Alec Deason <alec@tinycountry.com>
Date: Sun, 2 Jun 2019 14:12:19 -0700
Subject: [PATCH] Add support for ObjectGroup properties

---
 assets/tiled_object_groups.tmx | 24 ++++++++++++++++++++++++
 src/lib.rs                     |  7 +++++++
 tests/lib.rs                   | 11 +++++++++++
 3 files changed, 42 insertions(+)
 create mode 100644 assets/tiled_object_groups.tmx

diff --git a/assets/tiled_object_groups.tmx b/assets/tiled_object_groups.tmx
new file mode 100644
index 0000000..89d09b4
--- /dev/null
+++ b/assets/tiled_object_groups.tmx
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.2" tiledversion="1.2.3" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="4" nextobjectid="1">
+ <layer id="1" name="Tile Layer 1" width="10" height="10">
+  <data encoding="csv">
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0
+</data>
+ </layer>
+ <group id="2" name="group">
+  <objectgroup id="3" name="sub_layer">
+   <properties>
+    <property name="an object group property" type="bool" value="true"/>
+   </properties>
+  </objectgroup>
+ </group>
+</map>
diff --git a/src/lib.rs b/src/lib.rs
index 96f5e02..be48dd6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -743,6 +743,7 @@ pub struct ObjectGroup {
      * Layer index is not preset for tile collision boxes
      */
     pub layer_index: Option<u32>,
+    pub properties: Properties,
 }
 
 impl ObjectGroup {
@@ -763,11 +764,16 @@ impl ObjectGroup {
             TiledError::MalformedAttributes("object groups must have a name".to_string())
         );
         let mut objects = Vec::new();
+        let mut properties = HashMap::new();
         parse_tag!(parser, "objectgroup", {
             "object" => |attrs| {
                 objects.push(try!(Object::new(parser, attrs)));
                 Ok(())
             },
+            "properties" => |_| {
+                properties = try!(parse_properties(parser));
+                Ok(())
+            },
         });
         Ok(ObjectGroup {
             name: n.unwrap_or(String::new()),
@@ -776,6 +782,7 @@ impl ObjectGroup {
             objects: objects,
             colour: c,
             layer_index,
+            properties,
         })
     }
 }
diff --git a/tests/lib.rs b/tests/lib.rs
index 8e2c2c7..bf4b273 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -68,3 +68,14 @@ fn test_tile_property() {
     };
     assert_eq!("123", prop_value);
 }
+
+#[test]
+fn test_object_group_property() {
+    let r = read_from_file(&Path::new("assets/tiled_object_groups.tmx")).unwrap();
+    let prop_value: bool = if let Some(&PropertyValue::BoolValue(ref v)) = r.object_groups[0].properties.get("an object group property") {
+        *v
+    } else {
+        false
+    };
+    assert!(prop_value);
+}
-- 
GitLab