#ifndef TASKACTION_H #define TASKACTION_H #include #include #include #include class TaskTreeModel; class AttachmentsListModel; class TaskAction { friend class ChangesHistory; public: TaskAction(PTask task); virtual ~TaskAction(); PTask task() const; protected: PTask mTask; virtual bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel) = 0; virtual bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel) = 0; }; typedef QSharedPointer PTaskAction; class ChangesHistory { public: ChangesHistory(); ~ChangesHistory(); void setTaskTreeModel(TaskTreeModel* model); void setAttachmentsModel(AttachmentsListModel* model); TaskTreeModel* taskTreeModel() const; AttachmentsListModel* attachmentsModel() const; void add(PTaskAction action); void undo(); void redo(); bool canUndo() const; bool canRedo() const; static ChangesHistory& instance(); protected: TaskTreeModel* mTaskModel; AttachmentsListModel* mAttachmentsModel; QVector mActionList; int mRollbackCount; }; #define MAKE_ACTION(X) ChangesHistory::instance().add(PTaskAction(X)) class ImportAttachmentAction: public TaskAction { public: ImportAttachmentAction(PTask task, const QString& path, int index); ~ImportAttachmentAction(); PAttachment attachment() const; protected: QString mPath; PAttachment mAttachment; int mIndex; bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); }; class RenameAttachmentAction: public TaskAction { public: RenameAttachmentAction(PTask task, PAttachment attachment, const QString& newname); ~RenameAttachmentAction(); protected: PAttachment mAttachment; QString mNewName, mName; bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); }; class DeleteAttachmentAction: public TaskAction { public: DeleteAttachmentAction(PTask task, QModelIndexList& mil); ~DeleteAttachmentAction(); bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); protected: QModelIndexList mIndexList; QVector mAttachments; }; class NewTaskAction: public TaskAction { public: NewTaskAction(PTask parent, int index, const QString& title); ~NewTaskAction(); protected: PTask mParent; int mIndex; QString mTitle; bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool save(QDataStream& output); }; class RenameTaskAction: public TaskAction { public: RenameTaskAction(PTask task, const QString& newTitle); ~RenameTaskAction(); protected: QString mNewTitle, mTitle; bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool save(QDataStream &output); }; class MoveTaskAction: public TaskAction { public: MoveTaskAction(PTask task, PTask newParent, int newIndex); ~MoveTaskAction(); protected: int mIndex, mNewIndex; PTask mParent, mNewParent; bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); }; class IncreaseLevelAction: public TaskAction { public: IncreaseLevelAction(PTask task); ~IncreaseLevelAction(); protected: PTask mOldParent; int mOldIndex; bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); }; class DecreaseLevelAction: public TaskAction { public: DecreaseLevelAction(PTask task); ~DecreaseLevelAction(); protected: bool commit(TaskTreeModel *taskModel, AttachmentsListModel *attModel); bool rollback(TaskTreeModel *taskModel, AttachmentsListModel *attModel); }; class DeleteTaskAction: public TaskAction { public: DeleteTaskAction(PTask task); ~DeleteTaskAction(); protected: int mIndex; bool commit(TaskTreeModel* taskModel, AttachmentsListModel* attModel); bool rollback(TaskTreeModel* taskModel, AttachmentsListModel* attModel); }; #endif // TASKACTION_H