fixed some crashes, and repainting to "round up" (or rather - add one).
This commit is contained in:
parent
33c8eab9d5
commit
cedd448878
@ -9,6 +9,8 @@
|
|||||||
#include "inifile.h"
|
#include "inifile.h"
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
class SyncDocument : public sync::Data
|
class SyncDocument : public sync::Data
|
||||||
{
|
{
|
||||||
|
|||||||
@ -70,6 +70,9 @@ TrackView::~TrackView()
|
|||||||
DeleteObject(bgDarkBrush);
|
DeleteObject(bgDarkBrush);
|
||||||
DeleteObject(selectBaseBrush);
|
DeleteObject(selectBaseBrush);
|
||||||
DeleteObject(selectDarkBrush);
|
DeleteObject(selectDarkBrush);
|
||||||
|
DeleteObject(lerpPen);
|
||||||
|
DeleteObject(cosinePen);
|
||||||
|
DeleteObject(rampPen);
|
||||||
DeleteObject(editBrush);
|
DeleteObject(editBrush);
|
||||||
DeleteObject(rowPen);
|
DeleteObject(rowPen);
|
||||||
DeleteObject(rowSelectPen);
|
DeleteObject(rowSelectPen);
|
||||||
@ -118,7 +121,7 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks)
|
|||||||
FillRect(hdc, &fillRect, GetSysColorBrush(COLOR_3DFACE));
|
FillRect(hdc, &fillRect, GetSysColorBrush(COLOR_3DFACE));
|
||||||
|
|
||||||
int startTrack = scrollPosX / trackWidth;
|
int startTrack = scrollPosX / trackWidth;
|
||||||
int endTrack = min(startTrack + windowTracks, getTrackCount());
|
int endTrack = min(startTrack + windowTracks + 1, getTrackCount());
|
||||||
|
|
||||||
SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
|
SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
|
||||||
|
|
||||||
@ -218,7 +221,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
|
|||||||
int selectBottom = max(selectStartRow, selectStopRow);
|
int selectBottom = max(selectStartRow, selectStopRow);
|
||||||
|
|
||||||
int startTrack = scrollPosX / trackWidth;
|
int startTrack = scrollPosX / trackWidth;
|
||||||
int endTrack = min(startTrack + windowTracks, getTrackCount());
|
int endTrack = min(startTrack + windowTracks + 1, getTrackCount());
|
||||||
|
|
||||||
for (int track = startTrack; track < endTrack; ++track)
|
for (int track = startTrack; track < endTrack; ++track)
|
||||||
{
|
{
|
||||||
@ -354,6 +357,12 @@ struct CopyEntry
|
|||||||
|
|
||||||
void TrackView::editCopy()
|
void TrackView::editCopy()
|
||||||
{
|
{
|
||||||
|
if (0 == document->getTrackCount())
|
||||||
|
{
|
||||||
|
MessageBeep(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int selectLeft = min(selectStartTrack, selectStopTrack);
|
int selectLeft = min(selectStartTrack, selectStopTrack);
|
||||||
int selectRight = max(selectStartTrack, selectStopTrack);
|
int selectRight = max(selectStartTrack, selectStopTrack);
|
||||||
int selectTop = min(selectStartRow, selectStopRow);
|
int selectTop = min(selectStartRow, selectStopRow);
|
||||||
@ -418,13 +427,24 @@ void TrackView::editCopy()
|
|||||||
|
|
||||||
void TrackView::editCut()
|
void TrackView::editCut()
|
||||||
{
|
{
|
||||||
|
if (0 == document->getTrackCount())
|
||||||
|
{
|
||||||
|
MessageBeep(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
editCopy();
|
editCopy();
|
||||||
editDelete();
|
editDelete();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackView::editPaste()
|
void TrackView::editPaste()
|
||||||
{
|
{
|
||||||
#if 1
|
if (0 == document->getTrackCount())
|
||||||
|
{
|
||||||
|
MessageBeep(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (FAILED(OpenClipboard(getWin())))
|
if (FAILED(OpenClipboard(getWin())))
|
||||||
{
|
{
|
||||||
MessageBox(NULL, _T("Failed to open clipboard"), NULL, MB_OK);
|
MessageBox(NULL, _T("Failed to open clipboard"), NULL, MB_OK);
|
||||||
@ -467,10 +487,9 @@ void TrackView::editPaste()
|
|||||||
GlobalUnlock(hmem);
|
GlobalUnlock(hmem);
|
||||||
clipbuf = NULL;
|
clipbuf = NULL;
|
||||||
}
|
}
|
||||||
else MessageBeep(0);
|
else MessageBeep(-1);
|
||||||
|
|
||||||
CloseClipboard();
|
CloseClipboard();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackView::setupScrollBars()
|
void TrackView::setupScrollBars()
|
||||||
@ -706,7 +725,7 @@ void TrackView::editEnterValue()
|
|||||||
// invalidatePos(editTrack, editRow);
|
// invalidatePos(editTrack, editRow);
|
||||||
InvalidateRect(getWin(), NULL, FALSE);
|
InvalidateRect(getWin(), NULL, FALSE);
|
||||||
}
|
}
|
||||||
else MessageBeep(0);
|
else MessageBeep(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackView::editToggleInterpolationType()
|
void TrackView::editToggleInterpolationType()
|
||||||
@ -721,7 +740,7 @@ void TrackView::editToggleInterpolationType()
|
|||||||
// bounds check
|
// bounds check
|
||||||
if (upper == t.keyFrames.end())
|
if (upper == t.keyFrames.end())
|
||||||
{
|
{
|
||||||
MessageBeep(0);
|
MessageBeep(-1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -730,7 +749,7 @@ void TrackView::editToggleInterpolationType()
|
|||||||
// bounds check again
|
// bounds check again
|
||||||
if (lower == t.keyFrames.end())
|
if (lower == t.keyFrames.end())
|
||||||
{
|
{
|
||||||
MessageBeep(0);
|
MessageBeep(-1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -745,7 +764,7 @@ void TrackView::editToggleInterpolationType()
|
|||||||
|
|
||||||
invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first));
|
invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first));
|
||||||
}
|
}
|
||||||
else MessageBeep(0);
|
else MessageBeep(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackView::editDelete()
|
void TrackView::editDelete()
|
||||||
@ -776,7 +795,7 @@ void TrackView::editDelete()
|
|||||||
|
|
||||||
if (0 == multiCmd->getSize())
|
if (0 == multiCmd->getSize())
|
||||||
{
|
{
|
||||||
MessageBeep(0);
|
MessageBeep(-1);
|
||||||
delete multiCmd;
|
delete multiCmd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -794,9 +813,16 @@ void TrackView::editBiasValue(float amount)
|
|||||||
int selectTop = min(selectStartRow, selectStopRow);
|
int selectTop = min(selectStartRow, selectStopRow);
|
||||||
int selectBottom = max(selectStartRow, selectStopRow);
|
int selectBottom = max(selectStartRow, selectStopRow);
|
||||||
|
|
||||||
|
if (0 == document->getTrackCount())
|
||||||
|
{
|
||||||
|
MessageBeep(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
|
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
|
||||||
for (int track = selectLeft; track <= selectRight; ++track)
|
for (int track = selectLeft; track <= selectRight; ++track)
|
||||||
{
|
{
|
||||||
|
assert(track < int(document->getTrackCount()));
|
||||||
size_t trackIndex = document->getTrackIndexFromPos(track);
|
size_t trackIndex = document->getTrackIndexFromPos(track);
|
||||||
sync::Track &t = document->getTrack(trackIndex);
|
sync::Track &t = document->getTrack(trackIndex);
|
||||||
|
|
||||||
@ -816,7 +842,7 @@ void TrackView::editBiasValue(float amount)
|
|||||||
|
|
||||||
if (0 == multiCmd->getSize())
|
if (0 == multiCmd->getSize())
|
||||||
{
|
{
|
||||||
MessageBeep(0);
|
MessageBeep(-1);
|
||||||
delete multiCmd;
|
delete multiCmd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -852,7 +878,8 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/)
|
|||||||
{
|
{
|
||||||
float bias = 1.0f;
|
float bias = 1.0f;
|
||||||
if (GetKeyState(VK_SHIFT) < 0) bias = 0.1f;
|
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);
|
else setEditRow(editRow - 1);
|
||||||
break;
|
break;
|
||||||
@ -862,23 +889,26 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/)
|
|||||||
{
|
{
|
||||||
float bias = 1.0f;
|
float bias = 1.0f;
|
||||||
if (GetKeyState(VK_SHIFT) < 0) bias = 0.1f;
|
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);
|
else setEditRow(editRow + 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_LEFT:
|
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);
|
setEditTrack(editTrack - 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RIGHT:
|
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);
|
setEditTrack(editTrack + 1);
|
||||||
break;
|
break;
|
||||||
@ -902,6 +932,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/)
|
|||||||
}
|
}
|
||||||
else setEditRow(editRow + 0x10);
|
else setEditRow(editRow + 0x10);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_HOME:
|
case VK_HOME:
|
||||||
if (GetKeyState(VK_CONTROL) < 0)
|
if (GetKeyState(VK_CONTROL) < 0)
|
||||||
{
|
{
|
||||||
@ -920,6 +951,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_END:
|
case VK_END:
|
||||||
if (GetKeyState(VK_CONTROL) < 0)
|
if (GetKeyState(VK_CONTROL) < 0)
|
||||||
{
|
{
|
||||||
@ -952,7 +984,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/)
|
|||||||
editString.resize(editString.size() - 1);
|
editString.resize(editString.size() - 1);
|
||||||
invalidatePos(editTrack, editRow);
|
invalidatePos(editTrack, editRow);
|
||||||
}
|
}
|
||||||
else MessageBeep(0);
|
else MessageBeep(-1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_CANCEL:
|
case VK_CANCEL:
|
||||||
@ -962,7 +994,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/)
|
|||||||
// return to old value (i.e don't clear)
|
// return to old value (i.e don't clear)
|
||||||
editString.clear();
|
editString.clear();
|
||||||
invalidatePos(editTrack, editRow);
|
invalidatePos(editTrack, editRow);
|
||||||
MessageBeep(0);
|
MessageBeep(-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VK_SPACE:
|
case VK_SPACE:
|
||||||
@ -970,7 +1002,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/)
|
|||||||
{
|
{
|
||||||
editString.clear();
|
editString.clear();
|
||||||
invalidatePos(editTrack, editRow);
|
invalidatePos(editTrack, editRow);
|
||||||
MessageBeep(0);
|
MessageBeep(-1);
|
||||||
}
|
}
|
||||||
document->sendPauseCommand( !document->clientPaused );
|
document->sendPauseCommand( !document->clientPaused );
|
||||||
break;
|
break;
|
||||||
@ -993,7 +1025,7 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags)
|
|||||||
// only one '.' allowed
|
// only one '.' allowed
|
||||||
if (std::string::npos != editString.find('.'))
|
if (std::string::npos != editString.find('.'))
|
||||||
{
|
{
|
||||||
MessageBeep(0);
|
MessageBeep(-1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '0':
|
case '0':
|
||||||
@ -1011,7 +1043,7 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags)
|
|||||||
editString.push_back(char(keyCode));
|
editString.push_back(char(keyCode));
|
||||||
invalidatePos(editTrack, editRow);
|
invalidatePos(editTrack, editRow);
|
||||||
}
|
}
|
||||||
else MessageBeep(0);
|
else MessageBeep(-1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
@ -1065,13 +1097,13 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_UNDO:
|
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.
|
// unfortunately, we don't know how much to invalidate... so we'll just invalidate it all.
|
||||||
InvalidateRect(hwnd, NULL, FALSE);
|
InvalidateRect(hwnd, NULL, FALSE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_REDO:
|
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.
|
// unfortunately, we don't know how much to invalidate... so we'll just invalidate it all.
|
||||||
InvalidateRect(hwnd, NULL, FALSE);
|
InvalidateRect(hwnd, NULL, FALSE);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -5,10 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "syncdocument.h"
|
#include "syncdocument.h"
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stack>
|
|
||||||
|
|
||||||
// custom messages
|
// custom messages
|
||||||
#define WM_REDO (WM_USER + 0x40 + 3)
|
#define WM_REDO (WM_USER + 0x40 + 3)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user