From cedd4488780deca267bf3fd631ad300cc356085a Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 29 Sep 2008 19:27:18 +0000 Subject: [PATCH] fixed some crashes, and repainting to "round up" (or rather - add one). --- editor/syncdocument.h | 2 ++ editor/trackview.cpp | 80 +++++++++++++++++++++++++++++++++++---------------- editor/trackview.h | 3 -- 3 files changed, 58 insertions(+), 27 deletions(-) diff --git a/editor/syncdocument.h b/editor/syncdocument.h index d4c0d7b..41172a0 100644 --- a/editor/syncdocument.h +++ b/editor/syncdocument.h @@ -9,6 +9,8 @@ #include "inifile.h" #include #include +#include +#include class SyncDocument : public sync::Data { diff --git a/editor/trackview.cpp b/editor/trackview.cpp index 88b5cbb..e69e997 100644 --- a/editor/trackview.cpp +++ b/editor/trackview.cpp @@ -70,6 +70,9 @@ TrackView::~TrackView() DeleteObject(bgDarkBrush); DeleteObject(selectBaseBrush); DeleteObject(selectDarkBrush); + DeleteObject(lerpPen); + DeleteObject(cosinePen); + DeleteObject(rampPen); DeleteObject(editBrush); DeleteObject(rowPen); DeleteObject(rowSelectPen); @@ -118,7 +121,7 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks) FillRect(hdc, &fillRect, GetSysColorBrush(COLOR_3DFACE)); int startTrack = scrollPosX / trackWidth; - int endTrack = min(startTrack + windowTracks, getTrackCount()); + int endTrack = min(startTrack + windowTracks + 1, getTrackCount()); SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT)); @@ -218,7 +221,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) int selectBottom = max(selectStartRow, selectStopRow); int startTrack = scrollPosX / trackWidth; - int endTrack = min(startTrack + windowTracks, getTrackCount()); + int endTrack = min(startTrack + windowTracks + 1, getTrackCount()); for (int track = startTrack; track < endTrack; ++track) { @@ -354,6 +357,12 @@ struct CopyEntry void TrackView::editCopy() { + if (0 == document->getTrackCount()) + { + MessageBeep(-1); + return; + } + int selectLeft = min(selectStartTrack, selectStopTrack); int selectRight = max(selectStartTrack, selectStopTrack); int selectTop = min(selectStartRow, selectStopRow); @@ -418,13 +427,24 @@ void TrackView::editCopy() void TrackView::editCut() { + if (0 == document->getTrackCount()) + { + MessageBeep(-1); + return; + } + editCopy(); editDelete(); } void TrackView::editPaste() { -#if 1 + if (0 == document->getTrackCount()) + { + MessageBeep(-1); + return; + } + if (FAILED(OpenClipboard(getWin()))) { MessageBox(NULL, _T("Failed to open clipboard"), NULL, MB_OK); @@ -467,10 +487,9 @@ void TrackView::editPaste() GlobalUnlock(hmem); clipbuf = NULL; } - else MessageBeep(0); + else MessageBeep(-1); CloseClipboard(); -#endif } void TrackView::setupScrollBars() @@ -706,7 +725,7 @@ void TrackView::editEnterValue() // invalidatePos(editTrack, editRow); InvalidateRect(getWin(), NULL, FALSE); } - else MessageBeep(0); + else MessageBeep(-1); } void TrackView::editToggleInterpolationType() @@ -721,7 +740,7 @@ void TrackView::editToggleInterpolationType() // bounds check if (upper == t.keyFrames.end()) { - MessageBeep(0); + MessageBeep(-1); return; } @@ -730,7 +749,7 @@ void TrackView::editToggleInterpolationType() // bounds check again if (lower == t.keyFrames.end()) { - MessageBeep(0); + MessageBeep(-1); return; } @@ -745,7 +764,7 @@ void TrackView::editToggleInterpolationType() invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first)); } - else MessageBeep(0); + else MessageBeep(-1); } void TrackView::editDelete() @@ -776,7 +795,7 @@ void TrackView::editDelete() if (0 == multiCmd->getSize()) { - MessageBeep(0); + MessageBeep(-1); delete multiCmd; } else @@ -794,9 +813,16 @@ void TrackView::editBiasValue(float amount) int selectTop = min(selectStartRow, selectStopRow); int selectBottom = max(selectStartRow, selectStopRow); + if (0 == document->getTrackCount()) + { + MessageBeep(-1); + return; + } + SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); for (int track = selectLeft; track <= selectRight; ++track) { + assert(track < int(document->getTrackCount())); size_t trackIndex = document->getTrackIndexFromPos(track); sync::Track &t = document->getTrack(trackIndex); @@ -816,7 +842,7 @@ void TrackView::editBiasValue(float amount) if (0 == multiCmd->getSize()) { - MessageBeep(0); + MessageBeep(-1); delete multiCmd; } else @@ -852,7 +878,8 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) { float bias = 1.0f; if (GetKeyState(VK_SHIFT) < 0) bias = 0.1f; - editBiasValue(bias); + if (int(document->trackOrder.size()) > editTrack) editBiasValue(bias); + else MessageBeep(-1); } else setEditRow(editRow - 1); break; @@ -862,23 +889,26 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) { float bias = 1.0f; if (GetKeyState(VK_SHIFT) < 0) bias = 0.1f; - editBiasValue(-bias); + if (int(document->trackOrder.size()) > editTrack) editBiasValue(-bias); + else MessageBeep(-1); } else setEditRow(editRow + 1); break; case VK_LEFT: - if (GetKeyState(VK_CONTROL) < 0 && 0 < editTrack) + if (GetKeyState(VK_CONTROL) < 0) { - std::swap(document->trackOrder[editTrack], document->trackOrder[editTrack - 1]); + if (0 < editTrack) std::swap(document->trackOrder[editTrack], document->trackOrder[editTrack - 1]); + else MessageBeep(-1); } setEditTrack(editTrack - 1); break; case VK_RIGHT: - if (GetKeyState(VK_CONTROL) < 0 && document->trackOrder.size() > editTrack + 1) + if (GetKeyState(VK_CONTROL) < 0) { - std::swap(document->trackOrder[editTrack], document->trackOrder[editTrack + 1]); + if (int(document->trackOrder.size()) > editTrack + 1) std::swap(document->trackOrder[editTrack], document->trackOrder[editTrack + 1]); + else MessageBeep(-1); } setEditTrack(editTrack + 1); break; @@ -902,6 +932,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) } else setEditRow(editRow + 0x10); break; + case VK_HOME: if (GetKeyState(VK_CONTROL) < 0) { @@ -920,6 +951,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) } } break; + case VK_END: if (GetKeyState(VK_CONTROL) < 0) { @@ -952,7 +984,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) editString.resize(editString.size() - 1); invalidatePos(editTrack, editRow); } - else MessageBeep(0); + else MessageBeep(-1); break; case VK_CANCEL: @@ -962,7 +994,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) // return to old value (i.e don't clear) editString.clear(); invalidatePos(editTrack, editRow); - MessageBeep(0); + MessageBeep(-1); } break; case VK_SPACE: @@ -970,7 +1002,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) { editString.clear(); invalidatePos(editTrack, editRow); - MessageBeep(0); + MessageBeep(-1); } document->sendPauseCommand( !document->clientPaused ); break; @@ -993,7 +1025,7 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags) // only one '.' allowed if (std::string::npos != editString.find('.')) { - MessageBeep(0); + MessageBeep(-1); break; } case '0': @@ -1011,7 +1043,7 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags) editString.push_back(char(keyCode)); invalidatePos(editTrack, editRow); } - else MessageBeep(0); + else MessageBeep(-1); break; case 'i': @@ -1065,13 +1097,13 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) break; case WM_UNDO: - if (!document->undo()) MessageBeep(0); + if (!document->undo()) MessageBeep(-1); // unfortunately, we don't know how much to invalidate... so we'll just invalidate it all. InvalidateRect(hwnd, NULL, FALSE); break; case WM_REDO: - if (!document->redo()) MessageBeep(0); + if (!document->redo()) MessageBeep(-1); // unfortunately, we don't know how much to invalidate... so we'll just invalidate it all. InvalidateRect(hwnd, NULL, FALSE); break; diff --git a/editor/trackview.h b/editor/trackview.h index a2d86fb..69a996b 100644 --- a/editor/trackview.h +++ b/editor/trackview.h @@ -5,10 +5,7 @@ #pragma once #include "syncdocument.h" - -#include #include -#include // custom messages #define WM_REDO (WM_USER + 0x40 + 3)