Skip to content

Commit c44bba4

Browse files
"Added UI Buttons for reordering"
1 parent c1b755f commit c44bba4

6 files changed

Lines changed: 486 additions & 73 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,5 @@ build.ninja
6666

6767
## Python
6868
__pycache__/
69-
*.pyc
69+
*.pyc
70+
/GeneralsMD/Code/Tools/WorldBuilder/res/RCa20376

GeneralsMD/Code/GameEngine/Include/GameLogic/Scripts.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ class ScriptGroup : public MemoryPoolObject, public Snapshot
147147

148148
void addScript(Script *pScr, Int ndx);
149149
void deleteScript(Script *pScr);
150+
void removeScript(Script* pScr);
150151

151152
static void WriteGroupDataChunk(DataChunkOutput &chunkWriter, ScriptGroup *pGroup);
152153
static Bool ParseGroupDataChunk(DataChunkInput &file, DataChunkInfo *info, void *userData);
@@ -1280,8 +1281,13 @@ class ScriptList : public MemoryPoolObject, public Snapshot
12801281
static Bool ParseScriptListDataChunk(DataChunkInput &file, DataChunkInfo *info, void *userData);
12811282

12821283
void addGroup(ScriptGroup *pGrp, Int ndx);
1284+
void updateParentIndicesAfterInsert(int insertPos);
1285+
void updateParentIndicesAfterDelete(int deletedPos);
12831286
void addScript(Script *pScr, Int ndx);
12841287
void deleteScript(Script *pScr);
1288+
void removeScript(Script* pScr);
1289+
void insertGroup(ScriptGroup* pGrp, ScriptGroup* insertAfter);
1290+
void unlinkGroup(ScriptGroup* pGrp);
12851291
void deleteGroup(ScriptGroup *pGrp);
12861292

12871293
void discard();

GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/Scripts.cpp

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,19 +420,45 @@ void ScriptList::discard()
420420
deleteInstance(this);
421421
}
422422

423+
void ScriptList::updateParentIndicesAfterDelete(int deletedPos)
424+
{
425+
ScriptGroup* g = m_firstGroup;
426+
while (g)
427+
{
428+
int parent = g->getParentIndex();
429+
if (parent > deletedPos)
430+
{
431+
g->setParentIndex(parent - 1);
432+
}
433+
g = g->getNext();
434+
}
435+
}
436+
437+
void ScriptList::updateParentIndicesAfterInsert(int insertPos)
438+
{
439+
for (ScriptGroup* g = m_firstGroup; g; g = g->getNext())
440+
{
441+
Int p = g->getParentIndex();
442+
if (p >= insertPos)
443+
g->setParentIndex(p + 1);
444+
}
445+
}
446+
423447
/**
424448
Add a script group to the current list of groups. Offset to position ndx.
425449
*/
426450
void ScriptList::addGroup(ScriptGroup *pGrp, Int ndx)
427451
{
428452
ScriptGroup *pPrev = nullptr;
429453
ScriptGroup *pCur = m_firstGroup;
454+
Int originalNdx = ndx;
430455
DEBUG_ASSERTCRASH(pGrp->getNext()==nullptr, ("Adding already linked group."));
431456
while (ndx && pCur) {
432457
pPrev = pCur;
433458
pCur = pCur->getNext();
434459
ndx--;
435460
}
461+
int insertPos = originalNdx - ndx;
436462
if (pPrev) {
437463
// Weave into prev link.
438464
pGrp->setNextGroup(pPrev->getNext());
@@ -442,6 +468,7 @@ void ScriptList::addGroup(ScriptGroup *pGrp, Int ndx)
442468
pGrp->setNextGroup(m_firstGroup);
443469
m_firstGroup = pGrp;
444470
}
471+
updateParentIndicesAfterInsert(insertPos);
445472
}
446473

447474
/**
@@ -466,6 +493,107 @@ void ScriptList::addScript(Script *pScr, Int ndx)
466493
}
467494
}
468495

496+
void ScriptList::unlinkGroup(ScriptGroup* pGrp)
497+
{
498+
if (pGrp == nullptr) return;
499+
500+
int deletedPos = 0;
501+
ScriptGroup* pPrev = nullptr;
502+
ScriptGroup* pCur = m_firstGroup;
503+
while (pCur && pCur != pGrp)
504+
{
505+
pPrev = pCur;
506+
pCur = pCur->getNext();
507+
++deletedPos;
508+
}
509+
if (pCur == nullptr) return;
510+
511+
if (pPrev)
512+
pPrev->setNextGroup(pCur->getNext());
513+
else
514+
m_firstGroup = pCur->getNext();
515+
516+
pCur->setNextGroup(nullptr);
517+
518+
updateParentIndicesAfterDelete(deletedPos);
519+
}
520+
521+
void ScriptList::insertGroup(ScriptGroup* pGrp, ScriptGroup* insertAfter)
522+
{
523+
if (pGrp == nullptr) return;
524+
pGrp->setNextGroup(nullptr);
525+
526+
int insertPos = 0;
527+
if (insertAfter == nullptr)
528+
{
529+
insertPos = 0;
530+
}
531+
else
532+
{
533+
ScriptGroup* cur = m_firstGroup;
534+
while (cur && cur != insertAfter)
535+
{
536+
cur = cur->getNext();
537+
++insertPos;
538+
}
539+
if (cur == nullptr) return;
540+
++insertPos;
541+
}
542+
543+
if (insertAfter == nullptr)
544+
{
545+
pGrp->setNextGroup(m_firstGroup);
546+
m_firstGroup = pGrp;
547+
}
548+
else
549+
{
550+
pGrp->setNextGroup(insertAfter->getNext());
551+
insertAfter->setNextGroup(pGrp);
552+
}
553+
updateParentIndicesAfterInsert(insertPos);
554+
}
555+
556+
void ScriptList::removeScript(Script* pScr)
557+
{
558+
Script* pPrev = nullptr;
559+
Script* pCur = m_firstScript;
560+
while (pCur && pCur != pScr) {
561+
pPrev = pCur;
562+
pCur = pCur->getNext();
563+
}
564+
DEBUG_ASSERTCRASH(pCur, ("Couldn't find script."));
565+
if (pCur == nullptr) return;
566+
567+
if (pPrev) {
568+
pPrev->setNextScript(pCur->getNext());
569+
}
570+
else {
571+
m_firstScript = pCur->getNext();
572+
}
573+
pCur->setNextScript(nullptr);
574+
}
575+
576+
void ScriptGroup::removeScript(Script* pScr)
577+
{
578+
Script* pPrev = nullptr;
579+
Script* pCur = m_firstScript;
580+
while (pCur && pCur != pScr) {
581+
pPrev = pCur;
582+
pCur = pCur->getNext();
583+
}
584+
DEBUG_ASSERTCRASH(pCur, ("Couldn't find script."));
585+
if (pCur == nullptr) return;
586+
587+
if (pPrev) {
588+
pPrev->setNextScript(pCur->getNext());
589+
}
590+
else {
591+
m_firstScript = pCur->getNext();
592+
}
593+
// Detach but DO NOT delete instance (caller will re-insert or delete later).
594+
pCur->setNextScript(nullptr);
595+
}
596+
469597
/**
470598
Delete a script from the current list of scripts.
471599
*/

GeneralsMD/Code/Tools/WorldBuilder/include/ScriptDialog.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class ScriptDialog : public CDialog
7676
//{{AFX_VIRTUAL(ScriptDialog)
7777
protected:
7878
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
79+
virtual BOOL PreTranslateMessage(MSG* pMsg);
7980
//}}AFX_VIRTUAL
8081

8182
// Implementation
@@ -136,6 +137,8 @@ class ScriptDialog : public CDialog
136137
static Bool ParseTeamsDataChunk(DataChunkInput &file, DataChunkInfo *info, void *userData);
137138
static Bool ParsePlayersDataChunk(DataChunkInput &file, DataChunkInfo *info, void *userData);
138139

140+
void moveSelected(bool up);
141+
139142
protected:
140143

141144
// Generated message map functions
@@ -160,6 +163,9 @@ class ScriptDialog : public CDialog
160163
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
161164
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
162165
afx_msg void OnMove(int x, int y);
166+
167+
afx_msg void OnMoveUp();
168+
afx_msg void OnMoveDown();
163169
//}}AFX_MSG
164170
DECLARE_MESSAGE_MAP()
165171
};

GeneralsMD/Code/Tools/WorldBuilder/res/WorldBuilder.rc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,10 @@ BEGIN
942942
DEFPUSHBUTTON "OK",IDOK,403,7,50,14
943943
PUSHBUTTON "New &Script...",IDC_NEW_SCRIPT,403,62,50,14
944944
PUSHBUTTON "&Edit...",IDC_EDIT_SCRIPT,403,78,50,14
945+
946+
PUSHBUTTON "Up",IDC_MOVE_UP,403,118,25,14
947+
PUSHBUTTON "Down",IDC_MOVE_DOWN,428,118,25,14
948+
945949
PUSHBUTTON "&Copy Script",IDC_COPY_SCRIPT,403,136,50,14
946950
PUSHBUTTON "&Delete",IDC_DELETE,403,152,50,14
947951
PUSHBUTTON "Import Scripts...",IDC_LOAD,386,309,60,14

0 commit comments

Comments
 (0)