Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. different qundocommands changing the qUndoStack order
QtWS25 Last Chance

different qundocommands changing the qUndoStack order

Scheduled Pinned Locked Moved Unsolved General and Desktop
qundostack
2 Posts 2 Posters 479 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    E Offline
    Embitel_qt
    wrote on 5 Nov 2015, 06:14 last edited by
    #1

    im having two different QUndoCommands
    JobEntryCommand: which will be pushed to the QUndoStack on creating an item in the graphicsView. so its redo will create the item and redo will remove it from the graphicsview.

    JobEntryCommand::JobEntryCommand(JobFlowItem *item, JobContainerWidget *container, QUndoCommand *parent)
    : QUndoCommand(parent),m_pContainer(container)
    {
    m_JbItem = NULL;
    m_jobId = -1;

    if(item)
    {
        m_JbItem = item;
        m_structdata.JobName = m_JbItem->getParentJob()->GetJobName();
    
        m_structdata.level = m_JbItem->getItemLevel();
        m_structdata.ParentJobPath = m_JbItem->GetPath();
        m_structdata.ParentLevel = m_JbItem->getItemLevel()-1;
        m_structdata.ParentName = "";
        m_structdata.layoutIndex = m_pContainer->getItemIndex(m_JbItem) -1; //parent index
        m_structdata.JobId = m_JbItem->GetJobId();
    }
    

    }

    void JobEntryCommand::undo()
    {

    if(m_JbItem)
    {
    
        if(!m_pContainer->isItemPresentInContainer(m_JbItem))
        {
    
            m_JbItem = m_pContainer->getJobFromId(m_structdata.JobId);
    
    
        }
    
    
        m_structdata.JobName = m_JbItem->getParentJob()->GetJobName();
    
        m_structdata.level = m_JbItem->getItemLevel();
        m_structdata.ParentJobPath = m_JbItem->GetPath();
        m_structdata.ParentLevel = m_JbItem->getItemLevel()-1;
        m_structdata.ParentName = "";
        m_structdata.layoutIndex = m_pContainer->getItemIndex(m_JbItem) -1; //parent index
        m_structdata.JobId = m_JbItem->GetJobId();
    
        m_childList.clear();
        QList<JobFlowItem *> listItem = m_JbItem->getChildJobs();
    
        foreach (JobFlowItem *item, listItem) {
            m_childList << item->GetJobId();
    
        }
    
        if(!m_JbItem->isMacroGroup())
        {
    
            m_pContainer->removeJob(m_JbItem);
        }
        m_JbItem = NULL;
    }
    

    }

    void JobEntryCommand::redo()
    {

    QString jobPath = m_structdata.JobPath;
    QString jobName = m_structdata.JobName;
    int level = m_structdata.level;
    int layoutIndex = m_structdata.layoutIndex; //it will return  the parent index only for undo child
    QString name = m_structdata.ParentName;
    int jobId = m_structdata.JobId;
    
    
    
    
    if(level == 0)
        m_JbItem = m_pContainer->addJobToContainer(jobName,layoutIndex + 1,false,false,jobId,true);
    else
        m_JbItem = m_pContainer->createChildren(m_structdata.ParentJobPath,layoutIndex, m_structdata.ParentLevel,jobName,false,jobId,false,true);
    
    updateChildrens();
    

    }

    DeleteJobCommand : will be pushed when any item is deleted from the graphicsView. so its redo will remove the created item and undo will recreate the item.

    DeleteJobCommand::DeleteJobCommand( JobFlowItem *item, JobContainerWidget *container, int parentLevel, QUndoCommand *parent)
    : QUndoCommand(parent),m_ParentLevel(parentLevel)
    {

    m_pJobFlowItem = item;
    m_pContainer = container;
    m_key =0;
    
    
    
    m_structdata.JobName = m_pJobFlowItem->getParentJob()->GetJobName();
    
    m_structdata.level = m_pJobFlowItem->getItemLevel();
    m_structdata.ParentJobPath = m_pJobFlowItem->GetPath();
    m_structdata.ParentLevel = m_pJobFlowItem->getItemLevel()-1;
    m_structdata.ParentName = "";
    m_structdata.layoutIndex = m_pContainer->getItemIndex(m_pJobFlowItem) -1; //parent index
    m_structdata.JobId = m_pJobFlowItem->GetJobId();
    

    // m_childItemData.clear();

    m_macroGroup = m_pJobFlowItem->isMacroGroup();
    
    
    if(!m_macroGroup)
    {
        populateChildDetails(m_pJobFlowItem);
    
    }else
    {
        m_key = m_pContainer->getMacroGroupFromItem(m_pJobFlowItem);
    }
    

    }

    DeleteJobCommand::~DeleteJobCommand()
    {

    }

    void DeleteJobCommand::undo()
    {

    try
    {
        QString jobPath = m_structdata.JobPath;
        QString jobName = m_structdata.JobName;
        int level = m_structdata.level;
        int layoutIndex = m_structdata.layoutIndex; //it will return  the parent index only for undo child
        m_currentName = m_structdata.ParentName;
        int jobId = m_structdata.JobId;
    
    
        if(level == 0)
        {
            if(!m_macroGroup)
            {
                m_pJobFlowItem = m_pContainer->addJobToContainer(jobName,layoutIndex + 1,false,false,jobId,true);
    
            }else
            {
                m_pJobFlowItem = m_pContainer->createEntryInMacroTemplate(jobName, m_key,layoutIndex + 1);
                m_macroGroup = m_pJobFlowItem->isMacroGroup();
    
            }
    
    
    
        }
        else
        {
    
    
    
            // QModelIndex parentModal = m_pContainer->GetModelIndex(m_structdata.ParentJobPath);
    
            m_pJobFlowItem = m_pContainer->createChildren(m_structdata.ParentJobPath,layoutIndex, m_structdata.ParentLevel,jobName,false,jobId,false,true);
            m_currentName = m_pJobFlowItem->getParentJob()->GetJobName();
    
        }
    
    
        if(!m_macroGroup)
        {
            //Update the childrens after creation
            updateChildrens();
    
        }
        if(m_pJobFlowItem)
        {
    

    // qDebug()<<"On copy of the jobs";
    // m_pContainer->copyJobFiles(m_pJobFlowItem);
    }
    }
    catch(...)
    {
    qDebug("Crashed");
    }

    }

    void DeleteJobCommand::redo()
    {

    try
    {
        if(m_pJobFlowItem)
        {
            if(!m_pJobFlowItem->isMacroGroup())
            {
    
    
                if(!m_pContainer->isItemPresentInContainer(m_pJobFlowItem))
                {
    
                    m_pJobFlowItem = m_pContainer->getJobFromId(m_structdata.JobId);
    
    
                }
    
                m_structdata.JobName = m_pJobFlowItem->getParentJob()->GetJobName();
    
                m_structdata.level = m_pJobFlowItem->getItemLevel();
                m_structdata.ParentJobPath = m_pJobFlowItem->GetPath();
                m_structdata.ParentLevel = m_pJobFlowItem->getItemLevel()-1;
                m_structdata.ParentName = "";
                m_structdata.layoutIndex = m_pContainer->getItemIndex(m_pJobFlowItem) -1; //parent index
                m_structdata.JobId = m_pJobFlowItem->GetJobId();
    
                populateChildDetails(m_pJobFlowItem);
                m_pContainer->removeJob(m_pJobFlowItem);
            }else
                m_pContainer->removeMacroEntry(m_key,m_pJobFlowItem);
            m_pJobFlowItem = NULL;
        }
    }
    catch(...)
    {
        qDebug("Crashed");
    }
    

    }

    so when i start adding the item, the UndoStack is pushing the created item in the order what it created using JobEntryCommand. so redo on UndoStack work in the same order like

    On Create: Job1->Job2->Job3->Job4
    On Undo: Job4->Job3->Job2->Job1

    but when i deleted any item ex: Job4 the DeleteJobCommand is been pushed to the QUndoStack which in turn change the order of the stack the order will be

    ** On delete Job1->Job2->Job3 (Job4deleted)

    On redo: Job4->Job1->Job3->Job2**
    It is shuffling the items inside the stack in an unpredictable possibilities. it happens only if i add a DeleteJobCommand on a stack having JobEntryCommand.

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on 6 Nov 2015, 23:03 last edited by
      #2

      Hi and welcome to devnet,

      Are you sure that it happens on the stack and not the structure you use to store the jobs ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0

      1/2

      5 Nov 2015, 06:14

      • Login

      • Login or register to search.
      1 out of 2
      • First post
        1/2
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved