Skip to content

Commit

Permalink
Merge pull request #4626 from pavltom/GUI_TreeView_Item_Ordering
Browse files Browse the repository at this point in the history
[Gui] Issue #3923 - Add arbitrary Tree View item ordering
  • Loading branch information
chennes committed Nov 11, 2021
2 parents bef1df4 + 345dcd5 commit c62239d
Show file tree
Hide file tree
Showing 16 changed files with 826 additions and 22 deletions.
115 changes: 115 additions & 0 deletions src/Gui/CommandView.cpp
Expand Up @@ -3684,6 +3684,116 @@ void StdTreeDrag::activated(int)
}
}

//===========================================================================
// Std_GroupMoveUp
//===========================================================================
DEF_STD_CMD_A(StdGroupMoveUp)

StdGroupMoveUp::StdGroupMoveUp()
: Command("Std_GroupMoveUp")
{
sGroup = QT_TR_NOOP("TreeView");
sMenuText = QT_TR_NOOP("Move up in group");
sToolTipText = QT_TR_NOOP("Move object one place higher in its group");
sStatusTip = sToolTipText;
sWhatsThis = "Std_GroupMoveUp";
sPixmap = "button_up";
sAccel = "Alt+Up";
eType = 0;
}

void StdGroupMoveUp::activated(int iMsg)
{
Q_UNUSED(iMsg);

TreeWidget *tree = TreeWidget::instance();
if (!tree) {
return;
}

std::vector<DocumentObjectItem *> selected;
if (!tree->getSelectedSiblingObjectItems(selected)) {
return;
}

DocumentObjectItem *previous;
if (!tree->allowMoveUpInGroup(selected, &previous)) {
return;
}

TreeWidget::moveSiblings(selected, previous, -1);
}

bool StdGroupMoveUp::isActive(void)
{
TreeWidget *tree = TreeWidget::instance();
if (!tree) {
return false;
}

std::vector<DocumentObjectItem *> selected;
if (!tree->getSelectedSiblingObjectItems(selected)) {
return false;
}

return tree->allowMoveUpInGroup(selected);
}

//===========================================================================
// Std_GroupMoveDown
//===========================================================================
DEF_STD_CMD_A(StdGroupMoveDown)

StdGroupMoveDown::StdGroupMoveDown()
: Command("Std_GroupMoveDown")
{
sGroup = QT_TR_NOOP("TreeView");
sMenuText = QT_TR_NOOP("Move down in group");
sToolTipText = QT_TR_NOOP("Move object one place lower in its group");
sStatusTip = sToolTipText;
sWhatsThis = "Std_GroupMoveDown";
sPixmap = "button_down";
sAccel = "Alt+Down";
eType = 0;
}

void StdGroupMoveDown::activated(int iMsg)
{
Q_UNUSED(iMsg);

TreeWidget *tree = TreeWidget::instance();
if (!tree) {
return;
}

std::vector<DocumentObjectItem *> selected;
if (!tree->getSelectedSiblingObjectItems(selected)) {
return;
}

DocumentObjectItem *next ;
if (!tree->allowMoveDownInGroup(selected, &next)) {
return;
}

TreeWidget::moveSiblings(selected, next, +1);
}

bool StdGroupMoveDown::isActive(void)
{
TreeWidget *tree = TreeWidget::instance();
if (!tree) {
return false;
}

std::vector<DocumentObjectItem *> selected;
if (!tree->getSelectedSiblingObjectItems(selected)) {
return false;
}

return tree->allowMoveDownInGroup(selected);
}

//======================================================================
// Std_TreeViewActions
//===========================================================================
Expand Down Expand Up @@ -3718,6 +3828,11 @@ class StdCmdTreeViewActions : public GroupCommand

addCommand(new StdTreeDrag(),cmds.size());
addCommand(new StdTreeSelection(),cmds.size());

addCommand();

addCommand(new StdGroupMoveUp());
addCommand(new StdGroupMoveDown());
};
virtual const char* className() const {return "StdCmdTreeViewActions";}
};
Expand Down
30 changes: 27 additions & 3 deletions src/Gui/Document.cpp
Expand Up @@ -727,6 +727,9 @@ void Document::slotNewObject(const App::DocumentObject& Obj)
activeView->getViewer()->addViewProvider(pcProvider);
}

// If no tree rank was assigned, do it now, otherwise keep the current one
pcProvider->TreeRank.setValue(pcProvider->TreeRank.getValue());

// adding to the tree
signalNewObject(*pcProvider);
pcProvider->pcDocument = this;
Expand Down Expand Up @@ -1429,13 +1432,29 @@ void Document::RestoreDocFile(Base::Reader &reader)
expanded = true;
}
}

int rank = 0;
if (localreader->hasAttribute("rank")) {
rank = localreader->getAttributeAsInteger("rank");
}

ViewProvider* pObj = getViewProviderByName(name.c_str());
if (pObj) // check if this feature has been registered
pObj->Restore(*localreader);
if (pObj && expanded) {
Gui::ViewProviderDocumentObject* vp = static_cast<Gui::ViewProviderDocumentObject*>(pObj);
this->signalExpandObject(*vp, TreeItemMode::ExpandItem,0,0);

ViewProviderDocumentObject *vpdo = dynamic_cast<ViewProviderDocumentObject *>(pObj);
if (vpdo) {
if (rank <= 0 ) {
// For backward compatibility, use object ID as tree rank
rank = vpdo->getObject()->getID();
}
vpdo->TreeRank.setValue(rank);

if (expanded) {
this->signalExpandObject(*vpdo, TreeItemMode::ExpandItem, 0, 0);
}
}

localreader->readEndElement("ViewProvider");
}
localreader->readEndElement("ViewProviderData");
Expand Down Expand Up @@ -1555,6 +1574,11 @@ void Document::SaveDocFile (Base::Writer &writer) const
if (obj->hasExtensions())
writer.Stream() << " Extensions=\"True\"";

ViewProviderDocumentObject *vpdo = dynamic_cast<ViewProviderDocumentObject *>(obj);
if (vpdo && vpdo->TreeRank.getValue()) {
writer.Stream() << " rank=\"" << vpdo->TreeRank.getValue() << "\"";
}

writer.Stream() << ">" << std::endl;
obj->Save(writer);
writer.Stream() << writer.ind() << "</ViewProvider>" << std::endl;
Expand Down

0 comments on commit c62239d

Please sign in to comment.