diff --git a/api/sixtyfps-cpp/include/sixtyfps.h b/api/sixtyfps-cpp/include/sixtyfps.h index ee3dfeb5b..40f1716f3 100644 --- a/api/sixtyfps-cpp/include/sixtyfps.h +++ b/api/sixtyfps-cpp/include/sixtyfps.h @@ -362,13 +362,13 @@ struct IntModel : Model /// A Model backed by a SharedArray template -class SharedArrayModel : public Model +class VectorModel : public Model { - SharedArray data; + std::vector data; public: - SharedArrayModel() = default; - SharedArrayModel(SharedArray array) : data(std::move(array)) { } + VectorModel() = default; + VectorModel(std::vector array) : data(std::move(array)) { } int row_count() const override { return data.size(); } ModelData row_data(int i) const override { return data[i]; } void set_row_data(int i, const ModelData &value) override @@ -377,12 +377,19 @@ public: this->row_changed(i); } - // Append a new row with the given value + /// Append a new row with the given value void push_back(const ModelData &value) { data.push_back(value); this->row_added(data.size() - 1, 1); } + + /// Remove the row at the given index from the model + void erase(int index) { + data.erase(data.begin() + index); + this->row_removed(index, 1); + } + }; template @@ -409,7 +416,12 @@ class Repeater data[index].state = State::Dirty; } void row_removed(int index, int count) override { + is_dirty = true; data.erase(data.begin() + index, data.begin() + index + count); + for (std::size_t i = index; i < data.size(); ++i) { + // all the indexes are dirty + data[i].state = State::Dirty; + } } }; diff --git a/tests/cases/models/model.60 b/tests/cases/models/model.60 index e27acfe8f..6ec3d48a8 100644 --- a/tests/cases/models/model.60 +++ b/tests/cases/models/model.60 @@ -28,6 +28,7 @@ TestCase := Rectangle { property clicked_score; property clicked_name; property clicked_internal_state; + property clicked_index; for person[i] in model: TouchArea { x: i*10px; @@ -42,6 +43,7 @@ TestCase := Rectangle { clicked_internal_state = internal_state; clicked_score = score; clicked_name = text; + clicked_index = i; } } } @@ -73,6 +75,7 @@ instance.set_model(Some(another_model.clone())); sixtyfps::testing::send_mouse_click(instance, 25., 5.); assert_eq!(instance.get_clicked_score(), 333000); assert_eq!(instance.get_clicked_internal_state(), 1); +assert_eq!(instance.get_clicked_index(), 2); sixtyfps::testing::send_mouse_click(instance, 15., 5.); assert_eq!(instance.get_clicked_score(), 222000); @@ -91,6 +94,15 @@ sixtyfps::testing::send_mouse_click(instance, 15., 5.); assert_eq!(instance.get_clicked_score(), 555000); assert_eq!(instance.get_clicked_name(), sixtyfps::SharedString::from("idyllic")); assert_eq!(instance.get_clicked_internal_state(), 2); +assert_eq!(instance.get_clicked_index(), 1); + +another_model.remove(1); +sixtyfps::testing::send_mouse_click(instance, 15., 5.); +assert_eq!(instance.get_clicked_score(), 333000); +assert_eq!(instance.get_clicked_name(), sixtyfps::SharedString::from("world")); +assert_eq!(instance.get_clicked_internal_state(), 2); +assert_eq!(instance.get_clicked_index(), 1); + ``` ```cpp @@ -106,16 +118,17 @@ assert_eq(instance.get_clicked_score(), 789000); assert_eq(instance.get_clicked_internal_state(), 1); using ModelData = std::tuple; -sixtyfps::SharedArray array; +std::vector array; array.push_back(ModelData{"a1", "hello", 111.}); array.push_back(ModelData{"a2", "cruel", 222.}); array.push_back(ModelData{"a3", "world", 333.}); -auto another_model = std::make_shared>(array); +auto another_model = std::make_shared>(std::move(array)); instance.set_model(another_model); sixtyfps::testing::send_mouse_click(instance, 25., 5.); assert_eq(instance.get_clicked_score(), 333000); assert_eq(instance.get_clicked_internal_state(), 1); +assert_eq(instance.get_clicked_index(), 2); sixtyfps::testing::send_mouse_click(instance, 15., 5.); assert_eq(instance.get_clicked_score(), 222000); @@ -133,6 +146,16 @@ sixtyfps::testing::send_mouse_click(instance, 15., 5.); assert_eq(instance.get_clicked_score(), 555000); assert_eq(instance.get_clicked_name(), "idyllic"); assert_eq(instance.get_clicked_internal_state(), 2); +assert_eq(instance.get_clicked_index(), 1); + +another_model->erase(1); +sixtyfps::testing::send_mouse_click(instance, 15., 5.); +assert_eq(instance.get_clicked_score(), 333000); +assert_eq(instance.get_clicked_name(), "world"); +assert_eq(instance.get_clicked_internal_state(), 2); +assert_eq(instance.get_clicked_index(), 1); + + ``` */ \ No newline at end of file diff --git a/tests/cases/models/write_to_model.60 b/tests/cases/models/write_to_model.60 index 6d38acdaf..3e067ee1b 100644 --- a/tests/cases/models/write_to_model.60 +++ b/tests/cases/models/write_to_model.60 @@ -75,11 +75,11 @@ sixtyfps::testing::send_mouse_click(instance, 15., 5.); assert_eq(instance.get_clicked_score(), 791); using ModelData = std::tuple; -sixtyfps::SharedArray array; +std::vector array; array.push_back(ModelData{"a1", "hello", 111.}); array.push_back(ModelData{"a2", "cruel", 222.}); array.push_back(ModelData{"a3", "world", 333.}); -auto another_model = std::make_shared>(array); +auto another_model = std::make_shared>(std::move(array)); instance.set_model(another_model); sixtyfps::testing::send_mouse_click(instance, 25., 5.);