lots of small changes
This commit is contained in:
parent
ac84834e1b
commit
9331176838
98
synceditdata.h
Normal file
98
synceditdata.h
Normal file
@ -0,0 +1,98 @@
|
||||
#pragma once
|
||||
|
||||
#include "syncdata.h"
|
||||
#include <stack>
|
||||
|
||||
class SyncEditData : public SyncData
|
||||
{
|
||||
public:
|
||||
SyncEditData() : SyncData() {}
|
||||
|
||||
class Command
|
||||
{
|
||||
public:
|
||||
virtual ~Command() {}
|
||||
virtual void exec(SyncEditData *data) = 0;
|
||||
virtual void undo(SyncEditData *data) = 0;
|
||||
};
|
||||
|
||||
class EditCommand : public Command
|
||||
{
|
||||
public:
|
||||
EditCommand(int track, int row, bool existing, float value) : track(track), row(row), newValExisting(existing), newVal(value) {}
|
||||
~EditCommand() {}
|
||||
|
||||
virtual void exec(SyncEditData *data)
|
||||
{
|
||||
SyncTrack &track = data->getTrack(this->track);
|
||||
|
||||
// store old state
|
||||
oldValExisting = track.isKeyFrame(row);
|
||||
if (oldValExisting) oldVal = track.getKeyFrame(row)->value;
|
||||
|
||||
// update
|
||||
if (!newValExisting) track.deleteKeyFrame(row);
|
||||
else track.setKeyFrame(row, newVal);
|
||||
}
|
||||
|
||||
virtual void undo(SyncEditData *data)
|
||||
{
|
||||
SyncTrack &track = data->getTrack(this->track);
|
||||
|
||||
// un-update
|
||||
if (!oldValExisting) track.deleteKeyFrame(row);
|
||||
else track.setKeyFrame(row, oldVal);
|
||||
}
|
||||
|
||||
private:
|
||||
int track, row;
|
||||
float newVal, oldVal;
|
||||
bool newValExisting, oldValExisting;
|
||||
};
|
||||
|
||||
void exec(Command *cmd)
|
||||
{
|
||||
undoStack.push(cmd);
|
||||
cmd->exec(this);
|
||||
clearRedoStack();
|
||||
}
|
||||
|
||||
bool undo()
|
||||
{
|
||||
if (undoStack.size() == 0) return false;
|
||||
|
||||
Command *cmd = undoStack.top();
|
||||
undoStack.pop();
|
||||
|
||||
redoStack.push(cmd);
|
||||
cmd->undo(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool redo()
|
||||
{
|
||||
if (redoStack.size() == 0) return false;
|
||||
|
||||
Command *cmd = redoStack.top();
|
||||
redoStack.pop();
|
||||
|
||||
undoStack.push(cmd);
|
||||
cmd->exec(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
void clearRedoStack()
|
||||
{
|
||||
while (!redoStack.empty())
|
||||
{
|
||||
Command *cmd = redoStack.top();
|
||||
redoStack.pop();
|
||||
delete cmd;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
std::stack<Command*> undoStack;
|
||||
std::stack<Command*> redoStack;
|
||||
};
|
||||
@ -140,16 +140,16 @@ int _tmain(int argc, _TCHAR* argv[])
|
||||
} */
|
||||
#endif
|
||||
|
||||
SyncData syncData;
|
||||
SyncEditData syncData;
|
||||
SyncTrack &camXTrack = syncData.getTrack(_T("cam.x"));
|
||||
SyncTrack &camYTrack = syncData.getTrack(_T("cam.y"));
|
||||
SyncTrack &camZTrack = syncData.getTrack(_T("cam.z"));
|
||||
/* for (int i = 0; i < 1 << 16; ++i)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
{
|
||||
char temp[256];
|
||||
sprintf(temp, "gen %02d", i);
|
||||
SyncTrack &temp2 = syncData.getTrack(temp);
|
||||
} */
|
||||
}
|
||||
|
||||
camXTrack.setKeyFrame(1, SyncTrack::KeyFrame(2.0f));
|
||||
camXTrack.setKeyFrame(4, SyncTrack::KeyFrame(3.0f));
|
||||
|
||||
@ -218,6 +218,10 @@
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\synceditdata.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\trackview.h"
|
||||
>
|
||||
</File>
|
||||
|
||||
@ -346,7 +346,7 @@ void TrackView::copy()
|
||||
{
|
||||
for (int track = selectLeft; track <= selectRight; ++track)
|
||||
{
|
||||
const SyncTrack &t = syncDataEdit.getSyncData()->getTrack(track);
|
||||
const SyncTrack &t = syncData->getTrack(track);
|
||||
char temp[128];
|
||||
if (t.isKeyFrame(row)) sprintf(temp, "%.2f\t", t.getKeyFrame(row)->value);
|
||||
else sprintf(temp, "--- \t");
|
||||
@ -455,8 +455,8 @@ void TrackView::setScrollPos(int newScrollPosX, int newScrollPosY)
|
||||
scrollPosY = newScrollPosY;
|
||||
|
||||
scrollWindow(scrollX, scrollY);
|
||||
setupScrollBars();
|
||||
}
|
||||
setupScrollBars();
|
||||
}
|
||||
|
||||
void TrackView::setEditRow(int newEditRow)
|
||||
@ -470,6 +470,7 @@ void TrackView::setEditRow(int newEditRow)
|
||||
bool selecting = GetKeyState(VK_SHIFT) < 0 ? true : false;
|
||||
if (selecting)
|
||||
{
|
||||
selectActive = true;
|
||||
selectStopRow = editRow;
|
||||
invalidateRange(selectStartTrack, selectStopTrack, oldEditRow, editRow);
|
||||
}
|
||||
@ -496,7 +497,12 @@ void TrackView::setEditTrack(int newEditTrack)
|
||||
editTrack = min(editTrack, getTrackCount() - 1);
|
||||
|
||||
bool selecting = GetKeyState(VK_SHIFT) < 0 ? true : false;
|
||||
if (selecting) selectStopTrack = editTrack;
|
||||
if (selecting)
|
||||
{
|
||||
selectActive = true;
|
||||
selectStopTrack = editTrack;
|
||||
invalidateRange(oldEditTrack, editTrack, selectStartRow, selectStopRow);
|
||||
}
|
||||
else if (selectActive)
|
||||
{
|
||||
// leave select mode
|
||||
@ -619,22 +625,11 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
||||
{
|
||||
selectStartTrack = selectStopTrack = editTrack;
|
||||
selectStartRow = selectStopRow = editRow;
|
||||
selectActive = true;
|
||||
// selectActive = true;
|
||||
// printf("select active\n");
|
||||
}
|
||||
break;
|
||||
|
||||
// simulate keyboard accelerators
|
||||
case 'Z':
|
||||
if (ctrlDown) SendMessage(GetParent(this->getWin()), WM_COMMAND, MAKEWPARAM(shiftDown ? WM_REDO : WM_UNDO, 1), 0);
|
||||
break;
|
||||
case 'C':
|
||||
/* if (ctrlDown && !altDown && !shiftDown)
|
||||
{
|
||||
SendMessage(GetParent(this->getWin()), WM_COMMAND, MAKEWPARAM(WM_COPY, 1), 0);
|
||||
} */
|
||||
// printf("hit '%c', flags: %X\n", keyCode, flags);
|
||||
// if (ctrlDown) SendMessage(GetParent(this->getWin()), WM_COMMAND, MAKEWPARAM(shiftDown ? WM_REDO : WM_UNDO, 1), 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -646,11 +641,11 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
||||
{
|
||||
if (editString.size() > 0)
|
||||
{
|
||||
SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
|
||||
SyncEditData::EditCommand *cmd = new SyncEditData::EditCommand(
|
||||
editTrack, editRow,
|
||||
true, float(_tstof(editString.c_str()))
|
||||
);
|
||||
syncDataEdit.exec(cmd);
|
||||
syncData->exec(cmd);
|
||||
|
||||
editString.clear();
|
||||
invalidatePos(editTrack, editRow);
|
||||
@ -661,11 +656,11 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
||||
|
||||
case VK_DELETE:
|
||||
{
|
||||
SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
|
||||
SyncEditData::EditCommand *cmd = new SyncEditData::EditCommand(
|
||||
editTrack, editRow,
|
||||
false, 0.0f
|
||||
);
|
||||
syncDataEdit.exec(cmd);
|
||||
syncData->exec(cmd);
|
||||
invalidatePos(editTrack, editRow);
|
||||
}
|
||||
break;
|
||||
@ -772,13 +767,13 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
case WM_PASTE: paste(); break;
|
||||
|
||||
case WM_UNDO:
|
||||
if (!syncDataEdit.undo()) MessageBeep(0);
|
||||
if (!syncData->undo()) MessageBeep(0);
|
||||
// unfortunately, we don't know how much to invalidate... so we'll just invalidate it all.
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
|
||||
case WM_REDO:
|
||||
if (!syncDataEdit.redo()) MessageBeep(0);
|
||||
if (!syncData->redo()) MessageBeep(0);
|
||||
// unfortunately, we don't know how much to invalidate... so we'll just invalidate it all.
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
|
||||
110
trackview.h
110
trackview.h
@ -1,113 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "syncdata.h"
|
||||
#include "synceditdata.h"
|
||||
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <stack>
|
||||
|
||||
class SyncData;
|
||||
|
||||
class SyncDataEdit
|
||||
{
|
||||
public:
|
||||
SyncDataEdit() : syncData(NULL) {}
|
||||
|
||||
void setSyncData(SyncData *syncData) { this->syncData = syncData; }
|
||||
SyncData *getSyncData() { return syncData; }
|
||||
|
||||
class Command
|
||||
{
|
||||
public:
|
||||
virtual ~Command() {}
|
||||
virtual void exec(SyncDataEdit *data) = 0;
|
||||
virtual void undo(SyncDataEdit *data) = 0;
|
||||
};
|
||||
|
||||
class EditCommand : public Command
|
||||
{
|
||||
public:
|
||||
EditCommand(int track, int row, bool existing, float value) : track(track), row(row), newValExisting(existing), newVal(value) {}
|
||||
~EditCommand() {}
|
||||
|
||||
virtual void exec(SyncDataEdit *data)
|
||||
{
|
||||
SyncTrack &track = data->getSyncData()->getTrack(this->track);
|
||||
|
||||
// store old state
|
||||
oldValExisting = track.isKeyFrame(row);
|
||||
if (oldValExisting) oldVal = track.getKeyFrame(row)->value;
|
||||
|
||||
// update
|
||||
if (!newValExisting) track.deleteKeyFrame(row);
|
||||
else track.setKeyFrame(row, newVal);
|
||||
}
|
||||
|
||||
virtual void undo(SyncDataEdit *data)
|
||||
{
|
||||
SyncTrack &track = data->getSyncData()->getTrack(this->track);
|
||||
|
||||
// un-update
|
||||
if (!oldValExisting) track.deleteKeyFrame(row);
|
||||
else track.setKeyFrame(row, oldVal);
|
||||
}
|
||||
|
||||
private:
|
||||
int track, row;
|
||||
float newVal, oldVal;
|
||||
bool newValExisting, oldValExisting;
|
||||
};
|
||||
|
||||
void exec(Command *cmd)
|
||||
{
|
||||
undoStack.push(cmd);
|
||||
cmd->exec(this);
|
||||
clearRedoStack();
|
||||
}
|
||||
|
||||
bool undo()
|
||||
{
|
||||
if (undoStack.size() == 0) return false;
|
||||
|
||||
Command *cmd = undoStack.top();
|
||||
undoStack.pop();
|
||||
|
||||
redoStack.push(cmd);
|
||||
cmd->undo(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool redo()
|
||||
{
|
||||
if (redoStack.size() == 0) return false;
|
||||
|
||||
Command *cmd = redoStack.top();
|
||||
redoStack.pop();
|
||||
|
||||
undoStack.push(cmd);
|
||||
cmd->exec(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
void clearRedoStack()
|
||||
{
|
||||
while (!redoStack.empty())
|
||||
{
|
||||
Command *cmd = redoStack.top();
|
||||
redoStack.pop();
|
||||
delete cmd;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
std::stack<Command*> undoStack;
|
||||
std::stack<Command*> redoStack;
|
||||
|
||||
SyncData *syncData;
|
||||
};
|
||||
|
||||
|
||||
// custom messages
|
||||
#define WM_REDO (WM_USER + 1)
|
||||
|
||||
@ -120,8 +18,8 @@ public:
|
||||
HWND create(HINSTANCE hInstance, HWND hwndParent);
|
||||
HWND getWin(){ return hwnd; }
|
||||
|
||||
void setSyncData(SyncData *syncData) { this->syncDataEdit.setSyncData(syncData); }
|
||||
SyncData *getSyncData() { return syncDataEdit.getSyncData(); }
|
||||
void setSyncData(SyncEditData *syncData) { this->syncData = syncData; }
|
||||
SyncEditData *getSyncData() { return syncData; }
|
||||
|
||||
private:
|
||||
// some nasty hackery to forward the window messages
|
||||
@ -226,7 +124,7 @@ private:
|
||||
int windowWidth, windowHeight;
|
||||
int windowRows, windowTracks;
|
||||
|
||||
SyncDataEdit syncDataEdit;
|
||||
SyncEditData *syncData;
|
||||
|
||||
std::basic_string<TCHAR> editString;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user