50 std::weak_ptr<SetValueCommand> pw_command;
59 EXPECT_EQ(pw_command.use_count(), 1);
62 EXPECT_EQ(item->data<
int>(), 42);
65 EXPECT_EQ(stack.
index(), 0);
66 EXPECT_EQ(stack.
count(), 0);
67 EXPECT_EQ(command->isObsolete(),
false);
68 EXPECT_FALSE(std::get<bool>(command->result()));
72 EXPECT_EQ(pw_command.use_count(), 2);
75 EXPECT_EQ(item->data<
int>(), 43);
78 EXPECT_EQ(stack.
index(), 1);
79 EXPECT_EQ(stack.
count(), 1);
80 EXPECT_EQ(command->isObsolete(),
false);
81 EXPECT_TRUE(std::get<bool>(command->result()));
85 EXPECT_EQ(item->data<
int>(), 42);
88 EXPECT_EQ(stack.
index(), 0);
89 EXPECT_EQ(stack.
count(), 1);
90 EXPECT_EQ(command->isObsolete(),
false);
91 EXPECT_TRUE(std::get<bool>(command->result()));
95 EXPECT_EQ(item->data<
int>(), 43);
98 EXPECT_EQ(stack.
index(), 1);
99 EXPECT_EQ(stack.
count(), 1);
100 EXPECT_EQ(command->isObsolete(),
false);
101 EXPECT_TRUE(std::get<bool>(command->result()));
104 EXPECT_EQ(pw_command.use_count(), 1);
105 if (
auto command = pw_command.lock()) {
106 EXPECT_EQ(command->isObsolete(),
false);
107 EXPECT_TRUE(std::get<bool>(command->result()));
121 std::weak_ptr<SetValueCommand> pw_command;
129 pw_command = command;
130 EXPECT_EQ(pw_command.use_count(), 1);
133 EXPECT_EQ(item->data<
int>(), 42);
136 EXPECT_EQ(stack.
index(), 0);
137 EXPECT_EQ(stack.
count(), 0);
138 EXPECT_EQ(command->isObsolete(),
false);
139 EXPECT_FALSE(std::get<bool>(command->result()));
143 EXPECT_EQ(pw_command.use_count(), 1);
146 EXPECT_EQ(item->data<
int>(), 42);
149 EXPECT_EQ(stack.
index(), 0);
150 EXPECT_EQ(stack.
count(), 0);
151 EXPECT_EQ(command->isObsolete(),
true);
152 EXPECT_FALSE(std::get<bool>(command->result()));
155 EXPECT_EQ(pw_command.use_count(), 0);
156 EXPECT_EQ(pw_command.lock(),
nullptr);
164 EXPECT_TRUE(model.
undoStack() ==
nullptr);
169 EXPECT_TRUE(stack !=
nullptr);
172 EXPECT_TRUE(stack->isActive());
173 EXPECT_FALSE(stack->canRedo());
174 EXPECT_FALSE(stack->canUndo());
175 EXPECT_EQ(stack->index(), 0);
187 EXPECT_TRUE(item !=
nullptr);
190 EXPECT_EQ(stack->index(), 1);
191 EXPECT_EQ(stack->count(), 1);
192 EXPECT_FALSE(stack->canRedo());
193 EXPECT_TRUE(stack->canUndo());
198 EXPECT_EQ(stack->index(), 0);
199 EXPECT_EQ(stack->count(), 1);
200 EXPECT_TRUE(stack->canRedo());
201 EXPECT_FALSE(stack->canUndo());
207 EXPECT_EQ(stack->index(), 1);
208 EXPECT_FALSE(stack->canRedo());
209 EXPECT_TRUE(stack->canUndo());
213 EXPECT_EQ(stack->index(), 0);
214 EXPECT_FALSE(stack->canRedo());
215 EXPECT_FALSE(stack->canUndo());
231 EXPECT_EQ(stack->index(), 1);
232 EXPECT_EQ(stack->count(), 1);
242 EXPECT_EQ(restored_property_item->identifier(), original_id);
260 EXPECT_EQ(stack->count(), 3);
261 EXPECT_EQ(stack->index(), 3);
263 EXPECT_EQ(parent->childrenCount(), 2);
268 EXPECT_EQ(stack->count(), 3);
269 EXPECT_EQ(stack->index(), 1);
271 EXPECT_EQ(parent->childrenCount(), 0);
275 EXPECT_EQ(stack->count(), 3);
276 EXPECT_EQ(stack->index(), 2);
278 EXPECT_EQ(parent->childrenCount(), 1);
293 EXPECT_FALSE(model.
data(item, role).isValid());
296 QVariant value(42.0);
297 model.
setData(item, value, role);
298 EXPECT_EQ(model.
data(item, role), value);
300 EXPECT_EQ(stack->index(), 2);
306 EXPECT_EQ(stack->index(), 1);
307 EXPECT_FALSE(model.
data(item, role).isValid());
310 model.
setData(item, QVariant::fromValue(42.0), role);
311 model.
setData(item, QVariant::fromValue(43.0), role);
312 model.
setData(item, QVariant::fromValue(44.0), role);
313 EXPECT_EQ(stack->index(), 4);
314 EXPECT_EQ(model.
data(item, role).value<
double>(), 44.0);
317 EXPECT_EQ(model.
data(item, role).value<
double>(), 42.0);
320 EXPECT_EQ(model.
data(item, role).value<
double>(), 44.0);
328 const QVariant value(42.0);
336 EXPECT_FALSE(model.
data(item, role).isValid());
339 item->setData(value, role);
340 EXPECT_EQ(item->data<QVariant>(role), value);
342 EXPECT_EQ(stack->index(), 2);
348 EXPECT_EQ(stack->index(), 1);
349 EXPECT_FALSE(model.
data(item, role).isValid());
362 EXPECT_EQ(stack->index(), 0);
368 EXPECT_EQ(stack->index(), 0);
384 EXPECT_FALSE(model.
data(item, role).isValid());
387 QVariant value(42.0);
388 model.
setData(item, value, role);
389 EXPECT_EQ(model.
data(item, role), value);
391 EXPECT_EQ(stack->index(), 2);
398 EXPECT_EQ(stack->index(), 0);
404 EXPECT_EQ(stack->index(), 2);
407 EXPECT_EQ(model.
data(item, role).value<
double>(), 42.0);
415 const QVariant data(42);
425 EXPECT_EQ(stack->count(), 2);
426 EXPECT_EQ(stack->index(), 2);
429 EXPECT_EQ(item->data<QVariant>(role), data);
434 EXPECT_EQ(stack->count(), 3);
435 EXPECT_EQ(stack->index(), 3);
440 EXPECT_EQ(stack->count(), 3);
441 EXPECT_EQ(stack->index(), 2);
444 EXPECT_EQ(model.
data(item, role).value<
double>(), 42.0);
453 const QVariant data1(42);
454 const QVariant data2 = QVariant::fromValue(std::string(
"abc"));
463 parent->setData(data1, role1);
467 EXPECT_EQ(stack->count(), 4);
468 EXPECT_EQ(stack->index(), 4);
472 EXPECT_EQ(stack->count(), 5);
473 EXPECT_EQ(stack->index(), 5);
478 EXPECT_EQ(stack->count(), 5);
479 EXPECT_EQ(stack->index(), 4);
487 EXPECT_EQ(parent_at->data<QVariant>(role1), data1);
488 EXPECT_EQ(child_at->data<QVariant>(role2), data2);
508 EXPECT_EQ(stack->count(), 3);
509 EXPECT_EQ(stack->index(), 3);
518 EXPECT_EQ(parent_id, parent_id2);
519 EXPECT_EQ(child_id, child_id2);
527 auto pool = std::make_shared<ItemPool>();
548 EXPECT_EQ(stack->count(), 3);
549 EXPECT_EQ(stack->index(), 3);
553 EXPECT_EQ(stack->count(), 4);
554 EXPECT_EQ(stack->index(), 4);
558 EXPECT_TRUE(pool->item_for_key(id_parent) ==
nullptr);
559 EXPECT_TRUE(pool->item_for_key(id_layer0) ==
nullptr);
560 EXPECT_TRUE(pool->item_for_key(id_layer1) ==
nullptr);
564 EXPECT_EQ(stack->count(), 4);
565 EXPECT_EQ(stack->index(), 3);
573 EXPECT_EQ(parent_at->identifier(), id_parent);
574 EXPECT_EQ(layer0_at->identifier(), id_layer0);
575 EXPECT_EQ(layer1_at->identifier(), id_layer1);
580 std::vector<SessionItem*> expected = {layer0_at, layer1_at};
588 auto pool = std::make_shared<ItemPool>();
605 model.
moveItem(layer0, multilayer1, {
"", 0});
608 std::vector<SessionItem*> expected = {layer0};
609 EXPECT_EQ(multilayer0->children().size(), 0);
610 EXPECT_EQ(multilayer1->
children(), expected);
611 EXPECT_EQ(pool->item_for_key(id_layer0), layer0);
615 EXPECT_EQ(multilayer0->children(), expected);
616 EXPECT_EQ(multilayer1->
children().size(), 0);
617 EXPECT_EQ(pool->item_for_key(id_layer0), layer0);
625 auto pool = std::make_shared<ItemPool>();
642 model.
moveItem(layer0, multilayer1, {
"", 0});
645 std::vector<SessionItem*> expected = {layer0};
646 EXPECT_EQ(multilayer0->children().size(), 0);
647 EXPECT_EQ(multilayer1->
children(), expected);
648 EXPECT_EQ(pool->item_for_key(id_layer0), layer0);
657 auto layer0_at = pool->item_for_key(id_layer0);
658 auto multilayer1_at = pool->item_for_key(id_multilayer1);
660 expected = {layer0_at};
661 EXPECT_EQ(multilayer0->children().size(), 0);
662 EXPECT_EQ(multilayer1_at->children(), expected);
667 EXPECT_EQ(multilayer0->children(), expected);
668 EXPECT_EQ(multilayer1_at->children().size(), 0);
676 auto pool = std::make_shared<ItemPool>();
707 EXPECT_EQ(stack->count(), 8);
708 EXPECT_EQ(stack->index(), 8);
718 EXPECT_EQ(stack->count(), 11);
719 EXPECT_EQ(stack->index(), 11);
727 auto multilayer0_r = pool->item_for_key(id_multilayer0);
728 auto layer0_r = pool->item_for_key(id_layer0);
729 auto layer1_r = pool->item_for_key(id_layer1);
730 auto layer2_r = pool->item_for_key(id_layer2);
731 auto multilayer1_r = pool->item_for_key(id_multilayer1);
732 auto layer3_r = pool->item_for_key(id_layer3);
733 auto layer4_r = pool->item_for_key(id_layer4);
734 auto layer5_r = pool->item_for_key(id_layer5);
737 std::vector<SessionItem*> expected = {layer0_r, layer1_r, layer2_r};
738 EXPECT_EQ(multilayer0_r->children(), expected);
740 expected = {layer3_r, layer4_r, layer5_r};
741 EXPECT_EQ(multilayer1_r->children(), expected);
748 auto pool = std::make_shared<ItemPool>();
753 const double expected_thickness = 55.0;
768 EXPECT_EQ(pool->item_for_key(layer_copy->
identifier()), layer_copy);
785 const QVariant data(42);
797 EXPECT_EQ(stack->count(), 1);
798 EXPECT_EQ(stack->index(), 1);
801 EXPECT_EQ(item->data<QVariant>(role), data);
806 EXPECT_EQ(stack->count(), 1);
807 EXPECT_EQ(stack->index(), 0);
812 EXPECT_EQ(stack->count(), 1);
813 EXPECT_EQ(stack->index(), 1);
816 EXPECT_EQ(model.
data(item, role).value<
double>(), 42.0);
826 auto pool = std::make_shared<ItemPool>();
834 graphItem->setDataItem(dataItem);
836 auto data_item_identifier = dataItem->
identifier();
837 auto graph_item_identifier = graphItem->
identifier();
843 EXPECT_EQ(graphItem->dataItem(), dataItem);
846 EXPECT_EQ(pool->item_for_key(data_item_identifier), dataItem);
847 EXPECT_EQ(pool->item_for_key(graph_item_identifier), graphItem);
854 EXPECT_EQ(graphItem->dataItem(),
nullptr);
868 EXPECT_EQ(restoredDataItem->identifier(), data_item_identifier);
869 EXPECT_EQ(pool->item_for_key(data_item_identifier), restoredDataItem);
876 EXPECT_EQ(restoredGraphItem->identifier(), graph_item_identifier);
877 EXPECT_EQ(restoredGraphItem->dataItem(),
nullptr);
883 EXPECT_EQ(restoredGraphItem->dataItem(), restoredDataItem);
901 const std::vector<double> expected_values = {1.0, 2.0, 3.0};
902 const std::vector<double> expected_centers = {0.5, 1.5, 2.5};
904 dataItem->setValues(expected_values);
917 EXPECT_EQ(restoredDataItem->binCenters(), expected_centers);
918 EXPECT_EQ(restoredDataItem->binValues(), expected_values);
Represents one-dimensional data (axis and values).
T * setAxis(Args &&... args)
Inserts axis of given type.
Item to represent fixed bin axis.
One-dimensional graph representation of Data1DItem.
Item to carry concrete editable entity (e.g.
The main object representing an editable/displayable/serializable entity.
std::string identifier() const
Returns unique identifier.
void registerTag(const TagInfo &tagInfo, bool set_as_default=false)
Registers tag to hold items under given name.
bool setData(const T &value, int role=ItemDataRole::DATA, bool direct=false)
Sets data for a given role.
int childrenCount() const
Returns total number of children in all tags.
std::vector< SessionItem * > children() const
Returns vector of children formed from all chidlren from all tags.
T property(const std::string &tag) const
Returns data stored in property item.
model_type modelType() const
Returns item's model type.
void setProperty(const std::string &tag, const T &value)
Sets value to property item.
Main class to hold hierarchy of SessionItem objects.
T * topItem() const
Returns top item of the given type.
bool setData(SessionItem *item, const Variant &value, int role)
Sets the data for given item.
void setUndoRedoEnabled(bool value)
Sets undo/redo either enabled or disabled. By default undo/redo is disabled.
void moveItem(SessionItem *item, SessionItem *new_parent, const TagRow &tagrow)
Move item from it's current parent to a new parent under given tag and row.
SessionItem * copyItem(const SessionItem *item, SessionItem *parent, const TagRow &tagrow={})
Copy item and insert it in parent's tag and row. Item could belong to any model/parent.
SessionItem * rootItem() const
Returns root item of the model.
T * insertItem(SessionItem *parent=nullptr, const TagRow &tagrow={})
Inserts item into given parent under given tagrow.
UndoStackInterface * undoStack() const
Returns command stack to perform undo/redo.
Variant data(SessionItem *item, int role) const
Returns the data for given item and role.
void removeItem(SessionItem *parent, const TagRow &tagrow)
Removes given row from parent.
static TagInfo universalTag(std::string name, std::vector< std::string > modelTypes={})
Constructs universal tag intended for unlimited amount of various items.
virtual bool canUndo() const =0
virtual int index() const =0
virtual void beginMacro(const std::string &name)=0
virtual int count() const =0
virtual bool canRedo() const =0
virtual void endMacro()=0
Default undo stack implementation.
bool canRedo() const override
int index() const override
void execute(std::shared_ptr< AbstractItemCommand > command) override
Executes the command, then pushes it in the stack for possible undo.
bool canUndo() const override
int count() const override
Represents a layer, with thickness and color, and possibly populated with particles.
static const std::string P_THICKNESS
Represents multilayer with collection of layers.
static const std::string T_LAYERS
void removeRow(QGridLayout *layout, int row, bool deleteWidgets=true)
Removes row from grid layout (important: doesn't change row count).
const model_type PropertyType
const model_type BaseType
const int DATA
main data role
const int DISPLAY
display name
MVVM_MODEL_EXPORT SessionItem * ChildAt(const SessionItem *parent, int index)
Returns child at given index of parent.
materialitems.h Collection of materials to populate MaterialModel.
std::string identifier_type
const ModelView::model_type MultiLayerItemType
TEST_F(UndoStackTest, commandTimeOfLife)
Checking time of life of the command during undo/redo.