more. stuff.

This commit is contained in:
Erik Faye-Lund 2008-02-09 23:50:45 +00:00
parent 2a106f7949
commit d54d8587c9
4 changed files with 134 additions and 61 deletions

View File

@ -17,38 +17,87 @@ public:
virtual void undo(SyncEditData *data) = 0;
};
class InsertCommand : public Command
{
public:
InsertCommand(size_t track, size_t row, const SyncTrack::KeyFrame &key) : track(track), row(row), key(key) {}
~InsertCommand() {}
virtual void exec(SyncEditData *data)
{
SyncTrack &track = data->getTrack(this->track);
assert(!track.isKeyFrame(row));
track.setKeyFrame(row, key);
}
virtual void undo(SyncEditData *data)
{
SyncTrack &track = data->getTrack(this->track);
assert(track.isKeyFrame(row));
track.deleteKeyFrame(row);
}
private:
size_t track, row;
SyncTrack::KeyFrame key;
};
class DeleteCommand : public Command
{
public:
DeleteCommand(size_t track, size_t row) : track(track), row(row) {}
~DeleteCommand() {}
virtual void exec(SyncEditData *data)
{
SyncTrack &track = data->getTrack(this->track);
assert(track.isKeyFrame(row));
oldKey = *track.getKeyFrame(row);
track.deleteKeyFrame(row);
}
virtual void undo(SyncEditData *data)
{
SyncTrack &track = data->getTrack(this->track);
assert(!track.isKeyFrame(row));
track.setKeyFrame(row, oldKey);
}
private:
size_t track, row;
SyncTrack::KeyFrame oldKey;
};
class EditCommand : public Command
{
public:
EditCommand(size_t track, size_t row, bool existing, float value) : track(track), row(row), newValExisting(existing), newVal(value) {}
EditCommand(size_t track, size_t row, const SyncTrack::KeyFrame &key) : track(track), row(row), key(key) {}
~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;
// store old key
assert(track.isKeyFrame(row));
oldKey = *track.getKeyFrame(row);
// update
if (!newValExisting) track.deleteKeyFrame(row);
else track.setKeyFrame(row, newVal);
track.setKeyFrame(row, key);
}
virtual void undo(SyncEditData *data)
{
SyncTrack &track = data->getTrack(this->track);
// un-update
if (!oldValExisting) track.deleteKeyFrame(row);
else track.setKeyFrame(row, oldVal);
assert(track.isKeyFrame(row));
track.setKeyFrame(row, oldKey);
}
private:
size_t track, row;
float newVal, oldVal;
bool newValExisting, oldValExisting;
SyncTrack::KeyFrame oldKey, key;
};
class MultiCommand : public Command
@ -126,6 +175,28 @@ public:
}
}
void setKey(int track, int row, float val)
{
SyncTrack &t = getTrack(track);
SyncEditData::Command *cmd;
if (t.isKeyFrame(row))
{
cmd = new EditCommand(track, row, val);
}
else
{
cmd = new InsertCommand(track, row, val);
}
exec(cmd);
}
void deleteKey(int track, int row)
{
assert(getTrack(track).isKeyFrame(row));
Command *cmd = new DeleteCommand(track, row);
exec(cmd);
}
private:
std::stack<Command*> undoStack;

View File

@ -27,8 +27,8 @@ static LRESULT CALLBACK setRowsDialogProc(HWND hDlg, UINT message, WPARAM wParam
assert(NULL != rows);
/* create row-string */
char temp[256];
_snprintf(temp, 256, "%d", *rows);
TCHAR temp[256];
_sntprintf_s(temp, 256, _T("%d"), *rows);
/* set initial row count */
SetWindowText(GetDlgItem(hDlg, IDC_SETROWS_EDIT), temp);
@ -39,9 +39,9 @@ static LRESULT CALLBACK setRowsDialogProc(HWND hDlg, UINT message, WPARAM wParam
if (LOWORD(wParam) == IDOK)
{
/* get value */
char temp[256];
TCHAR temp[256];
GetWindowText(GetDlgItem(hDlg, IDC_SETROWS_EDIT), temp, 256);
int result = atoi(temp);
int result = _tstoi(temp);
/* update editor */
SendMessage(GetParent(hDlg), WM_SETROWS, 0, result);
@ -131,7 +131,7 @@ static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA
HINSTANCE hInstance = GetModuleHandle(NULL);
int rows = trackView->getRows();
INT_PTR result = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_SETROWS), hwnd, (DLGPROC)setRowsDialogProc, (LPARAM)&rows);
if (FAILED(result)) MessageBox(NULL, "unable to create dialog box", NULL, MB_OK);
if (FAILED(result)) MessageBox(NULL, _T("unable to create dialog box"), NULL, MB_OK);
if (IDOK == result)
{
printf("result: %d\n", result);
@ -223,8 +223,8 @@ int _tmain(int argc, _TCHAR* argv[])
for (int i = 0; i < 2; ++i)
{
char temp[256];
_snprintf(temp, 256, "gen %02d", i);
TCHAR temp[256];
_sntprintf_s(temp, 256, _T("gen %02d"), i);
SyncTrack &temp2 = syncData.getTrack(temp);
}

View File

@ -38,13 +38,14 @@ TrackView::TrackView()
// selectBaseBrush = CreateSolidBrush(RGB(0xff, 0xdd, 0xff));
// selectDarkBrush = CreateSolidBrush(RGB(0xdd, 0xbb, 0xdd));
selectBaseBrush = GetSysColorBrush(COLOR_HIGHLIGHT);
selectDarkBrush = CreateSolidBrush(darken(GetSysColor(COLOR_HIGHLIGHT), 0.9f));
editBrush = CreateSolidBrush(RGB(255, 255, 0));
clipboardFormat = RegisterClipboardFormat("syncdata");
if (0 == clipboardFormat) printf("geh");
editBrush = CreateSolidBrush(RGB(255, 255, 0)); // yellow
clipboardFormat = RegisterClipboardFormat(_T("syncdata"));
assert(0 != clipboardFormat);
}
TrackView::~TrackView()
@ -97,13 +98,14 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks)
fillRect = topLeftMargin;
DrawEdge(hdc, &fillRect, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_ADJUST | BF_BOTTOM);
FillRect(hdc, &fillRect, GetSysColorBrush(COLOR_3DFACE));
ExcludeClipRect(hdc, topLeftMargin.left, topLeftMargin.top, topLeftMargin.right, topLeftMargin.bottom);
int firstTrack = min(max(scrollPosX / trackWidth, 0), getTrackCount() - 1);
int lastTrack = min(max(firstTrack + windowTracks + 1, 0), getTrackCount() - 1);
SyncData *syncData = getSyncData();
if (NULL == syncData) return;
SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
SyncData::TrackContainer::iterator trackIter = syncData->tracks.begin();
for (int track = 0; track <= lastTrack; ++track, ++trackIter)
@ -134,7 +136,6 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks)
fillRect.left, 0,
trackName.data(), int(trackName.length())
);
ExcludeClipRect(hdc, topMargin.left, topMargin.top, topMargin.right, topMargin.bottom);
}
RECT topRightMargin;
@ -145,7 +146,9 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks)
fillRect = topRightMargin;
DrawEdge(hdc, &fillRect, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_ADJUST | BF_BOTTOM);
FillRect(hdc, &fillRect, GetSysColorBrush(COLOR_3DFACE));
ExcludeClipRect(hdc, topRightMargin.left, topRightMargin.top, topRightMargin.right, topRightMargin.bottom);
// make sure that the top margin isn't overdrawn by the track-data
ExcludeClipRect(hdc, 0, 0, rcTracks.right, topMarginHeight);
}
void TrackView::paintTracks(HDC hdc, RECT rcTracks)
@ -162,9 +165,6 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
lastRow = min(max(lastRow, 0), rows - 1);
SetBkMode(hdc, TRANSPARENT);
// SelectObject(hdc, editBrush);
paintTopMargin(hdc, rcTracks);
for (int row = firstRow; row <= lastRow; ++row)
@ -183,19 +183,18 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
FillRect(hdc, &leftMargin, fillBrush);
DrawEdge(hdc, &leftMargin, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_RIGHT | BF_BOTTOM | BF_TOP);
// Rectangle( hdc, leftMargin.left, leftMargin.top, leftMargin.right, leftMargin.bottom + 1);
if ((row % 16) == 0) SetTextColor(hdc, RGB(0, 0, 0));
else if ((row % 8) == 0) SetTextColor(hdc, RGB(32, 32, 32));
else if ((row % 4) == 0) SetTextColor(hdc, RGB(64, 64, 64));
else SetTextColor(hdc, RGB(128, 128, 128));
if ((row % 8) == 0) SetTextColor(hdc, RGB(0, 0, 0));
else if ((row % 4) == 0) SetTextColor(hdc, RGB(64, 64, 64));
else SetTextColor(hdc, RGB(128, 128, 128));
/* if ((row % 4) == 0) SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
else SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT)); */
_sntprintf_s(temp, 256, _T("%0*Xh"), 5, row);
TextOut(hdc,
leftMargin.left, leftMargin.top,
temp, int(_tcslen(temp))
);
ExcludeClipRect(hdc, leftMargin.left, leftMargin.top, leftMargin.right, leftMargin.bottom);
}
SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
@ -330,7 +329,7 @@ void TrackView::copy()
if (FAILED(OpenClipboard(getWin())))
{
MessageBox(NULL, "Failed to open clipboard", NULL, MB_OK);
MessageBox(NULL, _T("Failed to open clipboard"), NULL, MB_OK);
return;
}
@ -607,6 +606,29 @@ LRESULT TrackView::onHScroll(UINT sbCode, int newPos)
return FALSE;
}
void TrackView::onReturn()
{
if (editString.size() > 0)
{
syncData->setKey(editTrack, editRow, float(_tstof(editString.c_str())));
editString.clear();
invalidatePos(editTrack, editRow);
}
else MessageBeep(0);
}
void TrackView::onDelete()
{
SyncTrack &track = syncData->getTrack(editTrack);
if (track.isKeyFrame(editRow))
{
syncData->deleteKey(editTrack, editRow);
invalidatePos(editTrack, editRow);
}
else MessageBeep(0);
}
LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
{
bool refreshCaret = false;
@ -645,31 +667,8 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
switch (keyCode)
{
case VK_RETURN:
if (editString.size() > 0)
{
SyncEditData::EditCommand *cmd = new SyncEditData::EditCommand(
editTrack, editRow,
true, float(_tstof(editString.c_str()))
);
syncData->exec(cmd);
editString.clear();
invalidatePos(editTrack, editRow);
}
else MessageBeep(0);
break;
case VK_DELETE:
{
SyncEditData::EditCommand *cmd = new SyncEditData::EditCommand(
editTrack, editRow,
false, 0.0f
);
syncData->exec(cmd);
invalidatePos(editTrack, editRow);
}
break;
case VK_RETURN: onReturn(); break;
case VK_DELETE: onDelete(); break;
case VK_BACK:
if (editString.size() > 0)

View File

@ -38,6 +38,9 @@ private:
LRESULT onKeyDown(UINT keyCode, UINT flags);
LRESULT onChar(UINT keyCode, UINT flags);
void onReturn();
void onDelete();
void copy();
void cut();
void paste();