diff --git a/synctracker2.cpp b/synctracker2.cpp index 79d6e31..3e92063 100644 --- a/synctracker2.cpp +++ b/synctracker2.cpp @@ -46,8 +46,8 @@ static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA AppendMenu(fileMenu, MF_STRING, 3, "&Exit"); HMENU editMenu = CreatePopupMenu(); - AppendMenu(editMenu, MF_STRING, WM_USER+0, "&Undo\tCtrl+Z"); - AppendMenu(editMenu, MF_STRING, WM_USER+1, "&Redo\tShift+Ctrl+Z"); + AppendMenu(editMenu, MF_STRING, WM_UNDO, "&Undo\tCtrl+Z"); + AppendMenu(editMenu, MF_STRING, WM_REDO, "&Redo\tShift+Ctrl+Z"); AppendMenu(editMenu, MF_SEPARATOR, 0, NULL); AppendMenu(editMenu, MF_STRING, WM_CUT, "Cu&t\tCtrl+X"); AppendMenu(editMenu, MF_STRING, WM_COPY, "&Copy\tCtrl+C"); @@ -79,13 +79,20 @@ static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA break; case WM_COMMAND: - switch (wParam) + switch (LOWORD(wParam)) { case WM_COPY: /* PostMessage(m_hWnd, WM_COPY, 0, 0); */ /* HMMMM.... not working... */ printf("copy!\n"); break; + + // simply forward these + case WM_UNDO: + case WM_REDO: + SendMessage(trackViewWin, LOWORD(wParam), 0, 0); + break; + default: printf("cmd %d %d\n", wParam, lParam); } diff --git a/trackview.cpp b/trackview.cpp index 0169856..efa9f9a 100644 --- a/trackview.cpp +++ b/trackview.cpp @@ -487,16 +487,9 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags) case VK_PRIOR: setEditRow(editRow - windowRows / 2); break; case VK_NEXT: setEditRow(editRow + windowRows / 2); break; - case 'U': - if (true == ctrlDown && true == shiftDown) - { - if (!syncDataEdit.redo()) MessageBeep(0); - } - else if (true == ctrlDown) - { - if (!syncDataEdit.undo()) MessageBeep(0); - } - InvalidateRect(hwnd, NULL, TRUE); + case 'Z': + // simulate keyboard accelerators + SendMessage(GetParent(this->getWin()), WM_COMMAND, MAKEWPARAM(shiftDown ? WM_REDO : WM_UNDO, 1), 0); break; } } @@ -506,10 +499,9 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags) case VK_RETURN: { SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand( - editTrack, editRow, - float(atof(editString.c_str())) - ); - + editTrack, editRow, + true, float(atof(editString.c_str())) + ); syncDataEdit.exec(cmd); editString.clear(); @@ -519,8 +511,12 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags) case VK_DELETE: { - SyncTrack &track = getSyncData()->getTrack(editTrack); - track.deleteKeyFrame(editRow); + SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand( + editTrack, editRow, + false, 0.0f + ); + syncDataEdit.exec(cmd); + refreshCaret = true; } break; @@ -643,7 +639,19 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_COPY: printf("copy!\n"); break; - + + case WM_UNDO: + if (!syncDataEdit.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); + // unfortunately, we don't know how much to invalidate... so we'll just invalidate it all. + InvalidateRect(hwnd, NULL, TRUE); + break; + default: return DefWindowProc(hwnd, msg, wParam, lParam); } diff --git a/trackview.h b/trackview.h index d404ef2..fe0fff1 100644 --- a/trackview.h +++ b/trackview.h @@ -27,20 +27,27 @@ public: class EditCommand : public Command { public: - EditCommand(int track, int row, float value) : track(track), row(row), newVal(value) {} + 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; - track.setKeyFrame(row, newVal); + + // 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); } @@ -48,7 +55,7 @@ public: private: int track, row; float newVal, oldVal; - bool oldValExisting; + bool newValExisting, oldValExisting; }; void exec(Command *cmd) @@ -100,6 +107,10 @@ private: SyncData *syncData; }; + +// custom messages +#define WM_REDO (WM_USER + 1) + class TrackView { public: