Skip to content

Commit 3153b8b

Browse files
committed
Move editor envelope creation into action, select after adding
Fully implement the editor action to add a new envelope using `CEditorActionEnvelopeAdd` to improve encapsulation. Automatically select the newly added envelope in the envelope editor for convenience. Also restore the previously selected envelope when undoing the change.
1 parent 4f10512 commit 3153b8b

File tree

4 files changed

+31
-34
lines changed

4 files changed

+31
-34
lines changed

src/game/editor/editor.cpp

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5192,7 +5192,6 @@ void CEditor::RenderEnvelopeEditor(CUIRect View)
51925192
static int s_ActiveChannels = 0xf;
51935193
{
51945194
CUIRect Button;
5195-
std::shared_ptr<CEnvelope> pNewEnv = nullptr;
51965195

51975196
// redo button
51985197
ToolBar.VSplitRight(25.0f, &ToolBar, &Button);
@@ -5215,26 +5214,26 @@ void CEditor::RenderEnvelopeEditor(CUIRect View)
52155214
static int s_NewSoundButton = 0;
52165215
if(DoButton_Editor(&s_NewSoundButton, "Sound+", 0, &Button, BUTTONFLAG_LEFT, "Create a new sound envelope."))
52175216
{
5218-
m_Map.OnModify();
5219-
pNewEnv = m_Map.NewEnvelope(CEnvelope::EType::SOUND);
5217+
m_EnvelopeEditorHistory.Execute(std::make_shared<CEditorActionEnvelopeAdd>(this, CEnvelope::EType::SOUND));
5218+
pEnvelope = m_Map.m_vpEnvelopes[m_SelectedEnvelope];
52205219
}
52215220

52225221
ToolBar.VSplitRight(5.0f, &ToolBar, nullptr);
52235222
ToolBar.VSplitRight(50.0f, &ToolBar, &Button);
52245223
static int s_New4dButton = 0;
52255224
if(DoButton_Editor(&s_New4dButton, "Color+", 0, &Button, BUTTONFLAG_LEFT, "Create a new color envelope."))
52265225
{
5227-
m_Map.OnModify();
5228-
pNewEnv = m_Map.NewEnvelope(CEnvelope::EType::COLOR);
5226+
m_EnvelopeEditorHistory.Execute(std::make_shared<CEditorActionEnvelopeAdd>(this, CEnvelope::EType::COLOR));
5227+
pEnvelope = m_Map.m_vpEnvelopes[m_SelectedEnvelope];
52295228
}
52305229

52315230
ToolBar.VSplitRight(5.0f, &ToolBar, nullptr);
52325231
ToolBar.VSplitRight(50.0f, &ToolBar, &Button);
52335232
static int s_New2dButton = 0;
52345233
if(DoButton_Editor(&s_New2dButton, "Pos.+", 0, &Button, BUTTONFLAG_LEFT, "Create a new position envelope."))
52355234
{
5236-
m_Map.OnModify();
5237-
pNewEnv = m_Map.NewEnvelope(CEnvelope::EType::POSITION);
5235+
m_EnvelopeEditorHistory.Execute(std::make_shared<CEditorActionEnvelopeAdd>(this, CEnvelope::EType::POSITION));
5236+
pEnvelope = m_Map.m_vpEnvelopes[m_SelectedEnvelope];
52385237
}
52395238

52405239
if(m_SelectedEnvelope >= 0)
@@ -5323,22 +5322,6 @@ void CEditor::RenderEnvelopeEditor(CUIRect View)
53235322
ToolBar.VSplitRight(7.0f, &ToolBar, nullptr);
53245323
}
53255324

5326-
if(pNewEnv) // add the default points
5327-
{
5328-
if(pNewEnv->GetChannels() == 4)
5329-
{
5330-
pNewEnv->AddPoint(CFixedTime::FromSeconds(0.0f), {f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f)});
5331-
pNewEnv->AddPoint(CFixedTime::FromSeconds(1.0f), {f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f)});
5332-
}
5333-
else
5334-
{
5335-
pNewEnv->AddPoint(CFixedTime::FromSeconds(0.0f), {0, 0, 0, 0});
5336-
pNewEnv->AddPoint(CFixedTime::FromSeconds(1.0f), {0, 0, 0, 0});
5337-
}
5338-
5339-
m_EnvelopeEditorHistory.RecordAction(std::make_shared<CEditorActionEnvelopeAdd>(this, pNewEnv));
5340-
}
5341-
53425325
CUIRect Shifter, Inc, Dec;
53435326
ToolBar.VSplitLeft(60.0f, &Shifter, &ToolBar);
53445327
Shifter.VSplitRight(15.0f, &Shifter, &Inc);

src/game/editor/editor_actions.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,23 +1431,26 @@ void CEditorCommandAction::Redo()
14311431

14321432
// ------------------------------------------------
14331433

1434-
CEditorActionEnvelopeAdd::CEditorActionEnvelopeAdd(CEditor *pEditor, const std::shared_ptr<CEnvelope> &pEnv) :
1435-
IEditorAction(pEditor), m_pEnv(pEnv)
1434+
CEditorActionEnvelopeAdd::CEditorActionEnvelopeAdd(CEditor *pEditor, CEnvelope::EType EnvelopeType) :
1435+
IEditorAction(pEditor),
1436+
m_EnvelopeType(EnvelopeType)
14361437
{
1437-
str_format(m_aDisplayText, sizeof(m_aDisplayText), "Add new %s envelope", pEnv->Type() == CEnvelope::EType::COLOR ? "color" : (pEnv->Type() == CEnvelope::EType::POSITION ? "position" : "sound"));
1438+
str_format(m_aDisplayText, sizeof(m_aDisplayText), "Add new %s envelope", EnvelopeType == CEnvelope::EType::COLOR ? "color" : (EnvelopeType == CEnvelope::EType::POSITION ? "position" : "sound"));
1439+
m_PreviousSelectedEnvelope = m_pEditor->m_SelectedEnvelope;
14381440
}
14391441

14401442
void CEditorActionEnvelopeAdd::Undo()
14411443
{
14421444
// Undo is removing the envelope, which was added at the back of the list
14431445
m_pEditor->m_Map.m_vpEnvelopes.pop_back();
1444-
m_pEditor->m_SelectedEnvelope = m_pEditor->m_Map.m_vpEnvelopes.size() - 1;
1446+
m_pEditor->m_Map.OnModify();
1447+
m_pEditor->m_SelectedEnvelope = m_PreviousSelectedEnvelope;
14451448
}
14461449

14471450
void CEditorActionEnvelopeAdd::Redo()
14481451
{
1449-
// Redo is adding back at the back the saved envelope
1450-
m_pEditor->m_Map.m_vpEnvelopes.push_back(m_pEnv);
1452+
// Redo is adding a new envelope at the back of the list
1453+
m_pEditor->m_Map.NewEnvelope(m_EnvelopeType);
14511454
m_pEditor->m_SelectedEnvelope = m_pEditor->m_Map.m_vpEnvelopes.size() - 1;
14521455
}
14531456

src/game/editor/editor_actions.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,13 +377,14 @@ class CEditorCommandAction : public IEditorAction
377377
class CEditorActionEnvelopeAdd : public IEditorAction
378378
{
379379
public:
380-
CEditorActionEnvelopeAdd(CEditor *pEditor, const std::shared_ptr<CEnvelope> &pEnv);
380+
CEditorActionEnvelopeAdd(CEditor *pEditor, CEnvelope::EType EnvelopeType);
381381

382382
void Undo() override;
383383
void Redo() override;
384384

385385
private:
386-
std::shared_ptr<CEnvelope> m_pEnv;
386+
CEnvelope::EType m_EnvelopeType;
387+
int m_PreviousSelectedEnvelope;
387388
};
388389

389390
class CEditorActionEnvelopeDelete : public IEditorAction

src/game/editor/mapitems/map.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,19 @@ void CEditorMap::ResetModifiedState()
4444
std::shared_ptr<CEnvelope> CEditorMap::NewEnvelope(CEnvelope::EType Type)
4545
{
4646
OnModify();
47-
std::shared_ptr<CEnvelope> pEnv = std::make_shared<CEnvelope>(Type);
48-
m_vpEnvelopes.push_back(pEnv);
49-
return pEnv;
47+
std::shared_ptr<CEnvelope> pEnvelope = std::make_shared<CEnvelope>(Type);
48+
if(Type == CEnvelope::EType::COLOR)
49+
{
50+
pEnvelope->AddPoint(CFixedTime::FromSeconds(0.0f), {f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f)});
51+
pEnvelope->AddPoint(CFixedTime::FromSeconds(1.0f), {f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f)});
52+
}
53+
else
54+
{
55+
pEnvelope->AddPoint(CFixedTime::FromSeconds(0.0f), {0, 0, 0, 0});
56+
pEnvelope->AddPoint(CFixedTime::FromSeconds(1.0f), {0, 0, 0, 0});
57+
}
58+
m_vpEnvelopes.push_back(pEnvelope);
59+
return pEnvelope;
5060
}
5161

5262
void CEditorMap::InsertEnvelope(int Index, std::shared_ptr<CEnvelope> &pEnvelope)

0 commit comments

Comments
 (0)