lots of small changes

This commit is contained in:
Erik Faye-Lund 2008-02-04 23:36:04 +00:00
parent ac84834e1b
commit 9331176838
5 changed files with 126 additions and 131 deletions

98
synceditdata.h Normal file
View 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;
};

View File

@ -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));

View File

@ -218,6 +218,10 @@
> >
</File> </File>
<File <File
RelativePath=".\synceditdata.h"
>
</File>
<File
RelativePath=".\trackview.h" RelativePath=".\trackview.h"
> >
</File> </File>

View 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;

View File

@ -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;