fake accelerators

This commit is contained in:
Erik Faye-Lund 2008-01-18 16:35:54 +00:00
parent 8f9877f79b
commit 5150103d8c
3 changed files with 49 additions and 23 deletions

View File

@ -46,8 +46,8 @@ static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA
AppendMenu(fileMenu, MF_STRING, 3, "&Exit"); AppendMenu(fileMenu, MF_STRING, 3, "&Exit");
HMENU editMenu = CreatePopupMenu(); HMENU editMenu = CreatePopupMenu();
AppendMenu(editMenu, MF_STRING, WM_USER+0, "&Undo\tCtrl+Z"); AppendMenu(editMenu, MF_STRING, WM_UNDO, "&Undo\tCtrl+Z");
AppendMenu(editMenu, MF_STRING, WM_USER+1, "&Redo\tShift+Ctrl+Z"); AppendMenu(editMenu, MF_STRING, WM_REDO, "&Redo\tShift+Ctrl+Z");
AppendMenu(editMenu, MF_SEPARATOR, 0, NULL); AppendMenu(editMenu, MF_SEPARATOR, 0, NULL);
AppendMenu(editMenu, MF_STRING, WM_CUT, "Cu&t\tCtrl+X"); AppendMenu(editMenu, MF_STRING, WM_CUT, "Cu&t\tCtrl+X");
AppendMenu(editMenu, MF_STRING, WM_COPY, "&Copy\tCtrl+C"); 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; break;
case WM_COMMAND: case WM_COMMAND:
switch (wParam) switch (LOWORD(wParam))
{ {
case WM_COPY: case WM_COPY:
/* PostMessage(m_hWnd, WM_COPY, 0, 0); */ /* PostMessage(m_hWnd, WM_COPY, 0, 0); */
/* HMMMM.... not working... */ /* HMMMM.... not working... */
printf("copy!\n"); printf("copy!\n");
break; break;
// simply forward these
case WM_UNDO:
case WM_REDO:
SendMessage(trackViewWin, LOWORD(wParam), 0, 0);
break;
default: default:
printf("cmd %d %d\n", wParam, lParam); printf("cmd %d %d\n", wParam, lParam);
} }

View File

@ -487,16 +487,9 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
case VK_PRIOR: setEditRow(editRow - windowRows / 2); break; case VK_PRIOR: setEditRow(editRow - windowRows / 2); break;
case VK_NEXT: setEditRow(editRow + windowRows / 2); break; case VK_NEXT: setEditRow(editRow + windowRows / 2); break;
case 'U': case 'Z':
if (true == ctrlDown && true == shiftDown) // simulate keyboard accelerators
{ SendMessage(GetParent(this->getWin()), WM_COMMAND, MAKEWPARAM(shiftDown ? WM_REDO : WM_UNDO, 1), 0);
if (!syncDataEdit.redo()) MessageBeep(0);
}
else if (true == ctrlDown)
{
if (!syncDataEdit.undo()) MessageBeep(0);
}
InvalidateRect(hwnd, NULL, TRUE);
break; break;
} }
} }
@ -506,10 +499,9 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
case VK_RETURN: case VK_RETURN:
{ {
SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand( SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
editTrack, editRow, editTrack, editRow,
float(atof(editString.c_str())) true, float(atof(editString.c_str()))
); );
syncDataEdit.exec(cmd); syncDataEdit.exec(cmd);
editString.clear(); editString.clear();
@ -519,8 +511,12 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
case VK_DELETE: case VK_DELETE:
{ {
SyncTrack &track = getSyncData()->getTrack(editTrack); SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
track.deleteKeyFrame(editRow); editTrack, editRow,
false, 0.0f
);
syncDataEdit.exec(cmd);
refreshCaret = true; refreshCaret = true;
} }
break; break;
@ -643,7 +639,19 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
case WM_COPY: case WM_COPY:
printf("copy!\n"); printf("copy!\n");
break; 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: default:
return DefWindowProc(hwnd, msg, wParam, lParam); return DefWindowProc(hwnd, msg, wParam, lParam);
} }

View File

@ -27,20 +27,27 @@ public:
class EditCommand : public Command class EditCommand : public Command
{ {
public: 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() {} ~EditCommand() {}
virtual void exec(SyncDataEdit *data) virtual void exec(SyncDataEdit *data)
{ {
SyncTrack &track = data->getSyncData()->getTrack(this->track); SyncTrack &track = data->getSyncData()->getTrack(this->track);
// store old state
oldValExisting = track.isKeyFrame(row); oldValExisting = track.isKeyFrame(row);
if (oldValExisting) oldVal = track.getKeyFrame(row)->value; 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) virtual void undo(SyncDataEdit *data)
{ {
SyncTrack &track = data->getSyncData()->getTrack(this->track); SyncTrack &track = data->getSyncData()->getTrack(this->track);
// un-update
if (!oldValExisting) track.deleteKeyFrame(row); if (!oldValExisting) track.deleteKeyFrame(row);
else track.setKeyFrame(row, oldVal); else track.setKeyFrame(row, oldVal);
} }
@ -48,7 +55,7 @@ public:
private: private:
int track, row; int track, row;
float newVal, oldVal; float newVal, oldVal;
bool oldValExisting; bool newValExisting, oldValExisting;
}; };
void exec(Command *cmd) void exec(Command *cmd)
@ -100,6 +107,10 @@ private:
SyncData *syncData; SyncData *syncData;
}; };
// custom messages
#define WM_REDO (WM_USER + 1)
class TrackView class TrackView
{ {
public: public: