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
|
#endif
|
||||||
|
|
||||||
SyncData syncData;
|
SyncEditData syncData;
|
||||||
SyncTrack &camXTrack = syncData.getTrack(_T("cam.x"));
|
SyncTrack &camXTrack = syncData.getTrack(_T("cam.x"));
|
||||||
SyncTrack &camYTrack = syncData.getTrack(_T("cam.y"));
|
SyncTrack &camYTrack = syncData.getTrack(_T("cam.y"));
|
||||||
SyncTrack &camZTrack = syncData.getTrack(_T("cam.z"));
|
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];
|
char temp[256];
|
||||||
sprintf(temp, "gen %02d", i);
|
sprintf(temp, "gen %02d", i);
|
||||||
SyncTrack &temp2 = syncData.getTrack(temp);
|
SyncTrack &temp2 = syncData.getTrack(temp);
|
||||||
} */
|
}
|
||||||
|
|
||||||
camXTrack.setKeyFrame(1, SyncTrack::KeyFrame(2.0f));
|
camXTrack.setKeyFrame(1, SyncTrack::KeyFrame(2.0f));
|
||||||
camXTrack.setKeyFrame(4, SyncTrack::KeyFrame(3.0f));
|
camXTrack.setKeyFrame(4, SyncTrack::KeyFrame(3.0f));
|
||||||
|
|||||||
@ -218,6 +218,10 @@
|
|||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
|
RelativePath=".\synceditdata.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
RelativePath=".\trackview.h"
|
RelativePath=".\trackview.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
|||||||
@ -346,7 +346,7 @@ void TrackView::copy()
|
|||||||
{
|
{
|
||||||
for (int track = selectLeft; track <= selectRight; ++track)
|
for (int track = selectLeft; track <= selectRight; ++track)
|
||||||
{
|
{
|
||||||
const SyncTrack &t = syncDataEdit.getSyncData()->getTrack(track);
|
const SyncTrack &t = syncData->getTrack(track);
|
||||||
char temp[128];
|
char temp[128];
|
||||||
if (t.isKeyFrame(row)) sprintf(temp, "%.2f\t", t.getKeyFrame(row)->value);
|
if (t.isKeyFrame(row)) sprintf(temp, "%.2f\t", t.getKeyFrame(row)->value);
|
||||||
else sprintf(temp, "--- \t");
|
else sprintf(temp, "--- \t");
|
||||||
@ -455,8 +455,8 @@ void TrackView::setScrollPos(int newScrollPosX, int newScrollPosY)
|
|||||||
scrollPosY = newScrollPosY;
|
scrollPosY = newScrollPosY;
|
||||||
|
|
||||||
scrollWindow(scrollX, scrollY);
|
scrollWindow(scrollX, scrollY);
|
||||||
setupScrollBars();
|
|
||||||
}
|
}
|
||||||
|
setupScrollBars();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackView::setEditRow(int newEditRow)
|
void TrackView::setEditRow(int newEditRow)
|
||||||
@ -470,6 +470,7 @@ void TrackView::setEditRow(int newEditRow)
|
|||||||
bool selecting = GetKeyState(VK_SHIFT) < 0 ? true : false;
|
bool selecting = GetKeyState(VK_SHIFT) < 0 ? true : false;
|
||||||
if (selecting)
|
if (selecting)
|
||||||
{
|
{
|
||||||
|
selectActive = true;
|
||||||
selectStopRow = editRow;
|
selectStopRow = editRow;
|
||||||
invalidateRange(selectStartTrack, selectStopTrack, oldEditRow, editRow);
|
invalidateRange(selectStartTrack, selectStopTrack, oldEditRow, editRow);
|
||||||
}
|
}
|
||||||
@ -496,7 +497,12 @@ void TrackView::setEditTrack(int newEditTrack)
|
|||||||
editTrack = min(editTrack, getTrackCount() - 1);
|
editTrack = min(editTrack, getTrackCount() - 1);
|
||||||
|
|
||||||
bool selecting = GetKeyState(VK_SHIFT) < 0 ? true : false;
|
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)
|
else if (selectActive)
|
||||||
{
|
{
|
||||||
// leave select mode
|
// leave select mode
|
||||||
@ -619,22 +625,11 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
|||||||
{
|
{
|
||||||
selectStartTrack = selectStopTrack = editTrack;
|
selectStartTrack = selectStopTrack = editTrack;
|
||||||
selectStartRow = selectStopRow = editRow;
|
selectStartRow = selectStopRow = editRow;
|
||||||
selectActive = true;
|
// selectActive = true;
|
||||||
|
// printf("select active\n");
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -646,11 +641,11 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
|||||||
{
|
{
|
||||||
if (editString.size() > 0)
|
if (editString.size() > 0)
|
||||||
{
|
{
|
||||||
SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
|
SyncEditData::EditCommand *cmd = new SyncEditData::EditCommand(
|
||||||
editTrack, editRow,
|
editTrack, editRow,
|
||||||
true, float(_tstof(editString.c_str()))
|
true, float(_tstof(editString.c_str()))
|
||||||
);
|
);
|
||||||
syncDataEdit.exec(cmd);
|
syncData->exec(cmd);
|
||||||
|
|
||||||
editString.clear();
|
editString.clear();
|
||||||
invalidatePos(editTrack, editRow);
|
invalidatePos(editTrack, editRow);
|
||||||
@ -661,11 +656,11 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
|||||||
|
|
||||||
case VK_DELETE:
|
case VK_DELETE:
|
||||||
{
|
{
|
||||||
SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
|
SyncEditData::EditCommand *cmd = new SyncEditData::EditCommand(
|
||||||
editTrack, editRow,
|
editTrack, editRow,
|
||||||
false, 0.0f
|
false, 0.0f
|
||||||
);
|
);
|
||||||
syncDataEdit.exec(cmd);
|
syncData->exec(cmd);
|
||||||
invalidatePos(editTrack, editRow);
|
invalidatePos(editTrack, editRow);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -772,13 +767,13 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
case WM_PASTE: paste(); break;
|
case WM_PASTE: paste(); break;
|
||||||
|
|
||||||
case WM_UNDO:
|
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.
|
// unfortunately, we don't know how much to invalidate... so we'll just invalidate it all.
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_REDO:
|
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.
|
// unfortunately, we don't know how much to invalidate... so we'll just invalidate it all.
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
break;
|
break;
|
||||||
|
|||||||
110
trackview.h
110
trackview.h
@ -1,113 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "syncdata.h"
|
#include "synceditdata.h"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stack>
|
#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
|
// custom messages
|
||||||
#define WM_REDO (WM_USER + 1)
|
#define WM_REDO (WM_USER + 1)
|
||||||
|
|
||||||
@ -120,8 +18,8 @@ public:
|
|||||||
HWND create(HINSTANCE hInstance, HWND hwndParent);
|
HWND create(HINSTANCE hInstance, HWND hwndParent);
|
||||||
HWND getWin(){ return hwnd; }
|
HWND getWin(){ return hwnd; }
|
||||||
|
|
||||||
void setSyncData(SyncData *syncData) { this->syncDataEdit.setSyncData(syncData); }
|
void setSyncData(SyncEditData *syncData) { this->syncData = syncData; }
|
||||||
SyncData *getSyncData() { return syncDataEdit.getSyncData(); }
|
SyncEditData *getSyncData() { return syncData; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// some nasty hackery to forward the window messages
|
// some nasty hackery to forward the window messages
|
||||||
@ -226,7 +124,7 @@ private:
|
|||||||
int windowWidth, windowHeight;
|
int windowWidth, windowHeight;
|
||||||
int windowRows, windowTracks;
|
int windowRows, windowTracks;
|
||||||
|
|
||||||
SyncDataEdit syncDataEdit;
|
SyncEditData *syncData;
|
||||||
|
|
||||||
std::basic_string<TCHAR> editString;
|
std::basic_string<TCHAR> editString;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user