@@ -1289,14 +1289,16 @@ void GOODFFrame::OnOrganTreeRightClicked(wxTreeEvent& event) {
12891289}
12901290
12911291void 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}
0 commit comments