Started work on layers undo/redo, and implemented undo action for moving bookmark list items
This commit is contained in:
parent
974985ffcd
commit
cba5c3abc9
12 changed files with 199 additions and 30 deletions
|
|
@ -9,13 +9,6 @@ void DrawingProgramLayer::draw(SkCanvas* canvas, const DrawData& drawData) const
|
|||
p.obj->draw(canvas, drawData);
|
||||
}
|
||||
|
||||
DrawingProgramLayerInitData DrawingProgramLayer::get_init_data() const {
|
||||
DrawingProgramLayerInitData toRet;
|
||||
for(auto& p : *components)
|
||||
toRet.components.emplace_back(p.obj->get_data_copy());
|
||||
return toRet;
|
||||
}
|
||||
|
||||
void DrawingProgramLayer::set_component_list_callbacks(DrawingProgramLayerListItem& layerListItem, DrawingProgramLayerManager& layerMan) {
|
||||
auto insertCallback = [&](const CanvasComponentContainer::ObjInfoIterator& c) {
|
||||
c->obj->objInfo = c;
|
||||
|
|
|
|||
|
|
@ -6,8 +6,9 @@
|
|||
class DrawingProgramLayerListItem;
|
||||
class DrawingProgramLayerManager;
|
||||
|
||||
struct DrawingProgramLayerInitData {
|
||||
std::vector<std::shared_ptr<CanvasComponentContainer::CopyData>> components;
|
||||
struct DrawingProgramComponentUndoData {
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
std::unique_ptr<CanvasComponentContainer::CopyData> copyData;
|
||||
};
|
||||
|
||||
class DrawingProgramLayer {
|
||||
|
|
@ -17,7 +18,6 @@ class DrawingProgramLayer {
|
|||
void get_flattened_component_list(std::vector<CanvasComponentContainer::ObjInfo*>& objList) const;
|
||||
void set_to_erase();
|
||||
void scale_up(const WorldScalar& scaleUpAmount);
|
||||
DrawingProgramLayerInitData get_init_data() const;
|
||||
|
||||
CanvasComponentContainer::NetListOwnerPtr components;
|
||||
|
||||
|
|
|
|||
|
|
@ -7,10 +7,6 @@
|
|||
class DrawingProgramLayerListItem;
|
||||
class DrawingProgramLayerManager;
|
||||
|
||||
struct DrawingProgramLayerFolderInitData {
|
||||
std::vector<DrawingProgramLayerFolderInitData> folderList;
|
||||
};
|
||||
|
||||
class DrawingProgramLayerFolder {
|
||||
public:
|
||||
void draw(SkCanvas* canvas, const DrawData& drawData) const;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,54 @@ DrawingProgramLayerListItem::DrawingProgramLayerListItem(NetworkingObjects::NetO
|
|||
displayData = netObjMan.make_obj<DisplayData>();
|
||||
}
|
||||
|
||||
DrawingProgramLayerListItem::DrawingProgramLayerListItem(World& w, const DrawingProgramLayerListItemUndoData& initData) {
|
||||
if(initData.folderData) {
|
||||
auto& initFolderList = initData.folderData.value();
|
||||
folderData = std::make_unique<DrawingProgramLayerFolder>();
|
||||
folderData->folderList = w.netObjMan.make_obj<NetworkingObjects::NetObjOrderedList<DrawingProgramLayerListItem>>();
|
||||
for(auto& initFolder : initFolderList) {
|
||||
auto it = folderData->folderList->emplace_back_direct(folderData->folderList, w, initFolder);
|
||||
w.undo.register_new_netid_to_existing_undoid(initFolder.undoID, it->obj.get_net_id());
|
||||
}
|
||||
}
|
||||
else {
|
||||
auto& initComponentList = initData.layerData.value();
|
||||
layerData = std::make_unique<DrawingProgramLayer>();
|
||||
layerData->components = w.netObjMan.make_obj<CanvasComponentContainer::NetList>();
|
||||
for(auto& initComponent : initComponentList) {
|
||||
auto it = layerData->components->emplace_back_direct(layerData->components, w.netObjMan, *initComponent.copyData);
|
||||
w.undo.register_new_netid_to_existing_undoid(initComponent.undoID, it->obj.get_net_id());
|
||||
}
|
||||
}
|
||||
nameData = w.netObjMan.make_obj<NameData>();
|
||||
nameData->name = initData.metaInfo.name;
|
||||
displayData = w.netObjMan.make_obj<DisplayData>();
|
||||
displayData->alpha = initData.metaInfo.alpha;
|
||||
displayData->blendMode = initData.metaInfo.blendMode;
|
||||
}
|
||||
|
||||
DrawingProgramLayerListItemUndoData DrawingProgramLayerListItem::get_undo_data(WorldUndoManager& u) const {
|
||||
DrawingProgramLayerListItemUndoData toRet;
|
||||
toRet.metaInfo.name = nameData->name;
|
||||
toRet.metaInfo.blendMode = displayData->blendMode;
|
||||
toRet.metaInfo.alpha = displayData->alpha;
|
||||
if(folderData) {
|
||||
toRet.folderData = std::vector<DrawingProgramLayerListItemUndoData>();
|
||||
auto& folderListToRet = toRet.folderData.value();
|
||||
for(auto& f : *folderData->folderList) {
|
||||
folderListToRet.emplace_back(f.obj->get_undo_data(u));
|
||||
folderListToRet.back().undoID = u.get_undoid_from_netid(f.obj.get_net_id());
|
||||
}
|
||||
}
|
||||
else {
|
||||
toRet.layerData = std::vector<DrawingProgramComponentUndoData>();
|
||||
auto& layerListToRet = toRet.layerData.value();
|
||||
for(auto& c : *layerData->components)
|
||||
layerListToRet.emplace_back(u.get_undoid_from_netid(c.obj.get_net_id()), c.obj->get_data_copy());
|
||||
}
|
||||
return toRet;
|
||||
}
|
||||
|
||||
void DrawingProgramLayerListItem::reassign_netobj_ids_call() {
|
||||
if(folderData)
|
||||
folderData->folderList.reassign_ids();
|
||||
|
|
|
|||
|
|
@ -13,23 +13,25 @@ class DrawingProgramLayer;
|
|||
class World;
|
||||
class DrawingProgramLayerManager;
|
||||
|
||||
struct DrawingProgramLayerListItemMetaInfoInitData {
|
||||
struct DrawingProgramLayerListItemMetaInfoUndoData {
|
||||
std::string name;
|
||||
float alpha = 1.0f;
|
||||
SerializedBlendMode blendMode = SerializedBlendMode::SRC_OVER;
|
||||
};
|
||||
|
||||
struct DrawingProgramLayerListItemInitData {
|
||||
DrawingProgramLayerListItemMetaInfoInitData metaInfo;
|
||||
std::optional<DrawingProgramLayerFolderInitData> folderData;
|
||||
std::optional<DrawingProgramLayerInitData> layerData;
|
||||
struct DrawingProgramLayerListItemUndoData {
|
||||
WorldUndoManager::UndoObjectID undoID;
|
||||
DrawingProgramLayerListItemMetaInfoUndoData metaInfo;
|
||||
std::optional<std::vector<DrawingProgramLayerListItemUndoData>> folderData;
|
||||
std::optional<std::vector<DrawingProgramComponentUndoData>> layerData;
|
||||
};
|
||||
|
||||
class DrawingProgramLayerListItem {
|
||||
public:
|
||||
DrawingProgramLayerListItem();
|
||||
DrawingProgramLayerListItem(NetworkingObjects::NetObjManager& netObjMan, const std::string& initName, bool isFolder);
|
||||
DrawingProgramLayerListItem(NetworkingObjects::NetObjManager& netObjMan, const DrawingProgramLayerListItemInitData& initData);
|
||||
DrawingProgramLayerListItem(World& w, const DrawingProgramLayerListItemUndoData& undoData);
|
||||
DrawingProgramLayerListItemUndoData get_undo_data(WorldUndoManager& u) const;
|
||||
bool is_folder() const;
|
||||
DrawingProgramLayerFolder& get_folder() const;
|
||||
DrawingProgramLayer& get_layer() const;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue