diff --git a/synceditdata.h b/synceditdata.h new file mode 100644 index 0000000..6b99b10 --- /dev/null +++ b/synceditdata.h @@ -0,0 +1,98 @@ +#pragma once + +#include "syncdata.h" +#include + +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 undoStack; + std::stack redoStack; +}; diff --git a/synctracker2.cpp b/synctracker2.cpp index a27bff5..04bb678 100644 --- a/synctracker2.cpp +++ b/synctracker2.cpp @@ -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)); diff --git a/synctracker2.vcproj b/synctracker2.vcproj index 62afbe8..1ce3262 100644 --- a/synctracker2.vcproj +++ b/synctracker2.vcproj @@ -218,6 +218,10 @@ > + + diff --git a/trackview.cpp b/trackview.cpp index 8e5687a..f52a6fc 100644 --- a/trackview.cpp +++ b/trackview.cpp @@ -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; diff --git a/trackview.h b/trackview.h index 68ee643..1373907 100644 --- a/trackview.h +++ b/trackview.h @@ -1,113 +1,11 @@ #pragma once -#include "syncdata.h" +#include "synceditdata.h" #include #include #include -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 undoStack; - std::stack 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 editString;