Skip to content

Commit ef0f762

Browse files
author
larspalo
committed
Implemented possibility to move/re-order Gui Elements within the same panel.
1 parent fef00a2 commit ef0f762

File tree

3 files changed

+105
-2
lines changed

3 files changed

+105
-2
lines changed

src/GOODFFrame.cpp

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,14 +1289,16 @@ void GOODFFrame::OnOrganTreeRightClicked(wxTreeEvent& event) {
12891289
}
12901290

12911291
void GOODFFrame::OnOrganTreeLeftDrag(wxTreeEvent& event) {
1292-
// Only allow dragging if item is a switch, manual, windchestgroup, rank, stop
1292+
// Only allow dragging if item is a switch, manual, windchestgroup, rank, stop, gui element
12931293
wxTreeItemId sourceItem = event.GetItem();
12941294
wxTreeItemId sourceParent = m_organTreeCtrl->GetItemParent(sourceItem);
1295+
wxTreeItemId sourceGrandParent = m_organTreeCtrl->GetItemParent(sourceParent);
12951296
if ((sourceParent == tree_switches && m_organTreeCtrl->GetChildrenCount(tree_switches, false) > 1) ||
12961297
(sourceParent == tree_manuals && m_organTreeCtrl->GetChildrenCount(tree_manuals, false) > 1) ||
12971298
(sourceParent == tree_windchestgrps && m_organTreeCtrl->GetChildrenCount(tree_windchestgrps, false) > 1) ||
12981299
(sourceParent == tree_ranks && m_organTreeCtrl->GetChildrenCount(tree_ranks, false) > 1) ||
1299-
(m_organTreeCtrl->GetItemText(sourceParent) == wxT("Stops") && m_organTreeCtrl->GetItemText(m_organTreeCtrl->GetNextSibling(sourceParent)) == wxT("Couplers"))
1300+
(m_organTreeCtrl->GetItemText(sourceParent) == wxT("Stops") && m_organTreeCtrl->GetItemText(m_organTreeCtrl->GetNextSibling(sourceParent)) == wxT("Couplers")) ||
1301+
(m_organTreeCtrl->GetItemParent(sourceGrandParent) == tree_panels && m_organTreeCtrl->GetItemText(sourceParent) == wxT("GUI Elements") && m_organTreeCtrl->GetChildrenCount(sourceParent, false) > 1)
13001302
) {
13011303
m_draggedItem = sourceItem;
13021304
event.Allow();
@@ -1713,6 +1715,93 @@ void GOODFFrame::OnOrganTreeDragCompleted(wxTreeEvent& event) {
17131715
m_organTreeCtrl->SelectItem(newPos);
17141716
}
17151717
}
1718+
} else if (m_organTreeCtrl->GetItemText(srcParent) == wxT("GUI Elements") && m_organTreeCtrl->GetItemParent(srcGrandParent) == tree_panels && m_organTreeCtrl->GetItemText(dstParent) == wxT("GUI Elements") && dstGrandParent == srcGrandParent) {
1719+
// the target is another gui element in the same panel so just test if the move really should happen
1720+
if (m_organTreeCtrl->GetNextSibling(dstItem) == srcItem) {
1721+
return;
1722+
}
1723+
1724+
int targetIndex = 0;
1725+
int sourceIndex = 0;
1726+
int numChildrens = m_organTreeCtrl->GetChildrenCount(srcParent, false);
1727+
wxTreeItemIdValue cookie;
1728+
for (int i = 0; i < numChildrens; i++) {
1729+
wxTreeItemId currentId;
1730+
if (i == 0)
1731+
currentId = m_organTreeCtrl->GetFirstChild(srcParent, cookie);
1732+
else
1733+
currentId = m_organTreeCtrl->GetNextChild(srcParent, cookie);
1734+
if (dstItem == currentId) {
1735+
// this is the target we're looking for
1736+
targetIndex = i;
1737+
}
1738+
if (srcItem == currentId) {
1739+
sourceIndex = i;
1740+
}
1741+
}
1742+
if (targetIndex < numChildrens) {
1743+
targetIndex += 1;
1744+
}
1745+
1746+
// Okay, so now we need to get what panel we're actually dealing with
1747+
int panelIndex = -1;
1748+
int numPanels = m_organTreeCtrl->GetChildrenCount(tree_panels, false);
1749+
wxTreeItemIdValue panelCookie;
1750+
for (int i = 0; i < numPanels; i++) {
1751+
wxTreeItemId currentPanel;
1752+
if (i == 0)
1753+
currentPanel = m_organTreeCtrl->GetFirstChild(tree_panels, panelCookie);
1754+
else
1755+
currentPanel = m_organTreeCtrl->GetNextChild(tree_panels, panelCookie);
1756+
1757+
if (currentPanel == srcGrandParent) {
1758+
panelIndex = i;
1759+
break;
1760+
}
1761+
}
1762+
1763+
wxTreeItemId newPos = m_organTreeCtrl->InsertItem(srcParent, dstItem, m_organTreeCtrl->GetItemText(srcItem));
1764+
m_organTreeCtrl->Delete(srcItem);
1765+
m_organ->getOrganPanelAt(panelIndex)->moveGuiElement(sourceIndex, targetIndex);
1766+
m_organTreeCtrl->SelectItem(newPos);
1767+
} else if (m_organTreeCtrl->GetItemText(srcParent) == wxT("GUI Elements") && m_organTreeCtrl->GetItemParent(srcGrandParent) == tree_panels && dstItem == srcParent) {
1768+
// We should make it the first child of the panel in question, first get what child it is
1769+
int sourceIndex = 0;
1770+
int numChildrens = m_organTreeCtrl->GetChildrenCount(srcParent, false);
1771+
wxTreeItemIdValue cookie;
1772+
for (int i = 0; i < numChildrens; i++) {
1773+
wxTreeItemId currentId;
1774+
if (i == 0)
1775+
currentId = m_organTreeCtrl->GetFirstChild(srcParent, cookie);
1776+
else
1777+
currentId = m_organTreeCtrl->GetNextChild(srcParent, cookie);
1778+
1779+
if (srcItem == currentId) {
1780+
sourceIndex = i;
1781+
}
1782+
}
1783+
1784+
// Okay, so now we need to get what panel we're actually dealing with
1785+
int panelIndex = -1;
1786+
int numPanels = m_organTreeCtrl->GetChildrenCount(tree_panels, false);
1787+
wxTreeItemIdValue panelCookie;
1788+
for (int i = 0; i < numPanels; i++) {
1789+
wxTreeItemId currentPanel;
1790+
if (i == 0)
1791+
currentPanel = m_organTreeCtrl->GetFirstChild(tree_panels, panelCookie);
1792+
else
1793+
currentPanel = m_organTreeCtrl->GetNextChild(tree_panels, panelCookie);
1794+
1795+
if (currentPanel == srcGrandParent) {
1796+
panelIndex = i;
1797+
break;
1798+
}
1799+
}
1800+
1801+
wxTreeItemId newPos = m_organTreeCtrl->InsertItem(srcParent, 0, m_organTreeCtrl->GetItemText(srcItem));
1802+
m_organTreeCtrl->Delete(srcItem);
1803+
m_organ->getOrganPanelAt(panelIndex)->moveGuiElement(sourceIndex, 0);
1804+
m_organTreeCtrl->SelectItem(newPos);
17161805
}
17171806

17181807
}

src/GoPanel.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,19 @@ void GoPanel::updateGuiElementsDisplayNames() {
585585
}
586586
}
587587

588+
void GoPanel::moveGuiElement(int sourceIndex, int toBeforeIndex) {
589+
auto theOneToMove = std::next(m_guiElements.begin(), sourceIndex);
590+
std::list<GUIElement*>::iterator it = m_guiElements.begin();
591+
592+
if (toBeforeIndex > (int) m_guiElements.size() - 1) {
593+
it = m_guiElements.end();
594+
} else {
595+
it = std::next(m_guiElements.begin(), toBeforeIndex);
596+
}
597+
598+
m_guiElements.splice(it, m_guiElements, theOneToMove);
599+
}
600+
588601
void GoPanel::updateButtonRowsAndCols() {
589602
for (GUIElement* e : m_guiElements) {
590603
GUIButton *btnElement = dynamic_cast<GUIButton*>(e);

src/GoPanel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class GoPanel {
8181
bool hasItemAsGuiElement(General *general);
8282
void removeItemFromPanel(General *general);
8383
void updateGuiElementsDisplayNames();
84+
void moveGuiElement(int sourceIndex, int toBeforeIndex);
8485
void updateButtonRowsAndCols();
8586
void applyButtonFontName();
8687
void applyButtonFontSize();

0 commit comments

Comments
 (0)