selection-ish
This commit is contained in:
parent
f47da18fbc
commit
a47ed300b0
@ -66,6 +66,12 @@ public:
|
|||||||
keyFrames[row] = KeyFrame(value);
|
keyFrames[row] = KeyFrame(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getFrameCount()
|
||||||
|
{
|
||||||
|
KeyFrameContainer::const_iterator iter = keyFrames.end();
|
||||||
|
iter--;
|
||||||
|
return iter->first;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::map<int, struct KeyFrame> KeyFrameContainer;
|
typedef std::map<int, struct KeyFrame> KeyFrameContainer;
|
||||||
|
|||||||
142
trackview.cpp
142
trackview.cpp
@ -25,6 +25,10 @@ TrackView::TrackView()
|
|||||||
|
|
||||||
this->hwnd = NULL;
|
this->hwnd = NULL;
|
||||||
|
|
||||||
|
selectActive = false;
|
||||||
|
selectBaseBrush = CreateSolidBrush(RGB(255, 192, 255));
|
||||||
|
selectDarkBrush = CreateSolidBrush(RGB(192, 128, 192));
|
||||||
|
|
||||||
editBrush = CreateSolidBrush(RGB(255, 255, 0));
|
editBrush = CreateSolidBrush(RGB(255, 255, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,10 +147,8 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
|
|||||||
|
|
||||||
SelectObject(hdc, editBrush);
|
SelectObject(hdc, editBrush);
|
||||||
|
|
||||||
|
|
||||||
paintTopMargin(hdc, rcTracks);
|
paintTopMargin(hdc, rcTracks);
|
||||||
|
|
||||||
|
|
||||||
for (int row = firstRow; row <= lastRow; ++row)
|
for (int row = firstRow; row <= lastRow; ++row)
|
||||||
{
|
{
|
||||||
RECT leftMargin;
|
RECT leftMargin;
|
||||||
@ -157,8 +159,10 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
|
|||||||
|
|
||||||
if (!RectVisible(hdc, &leftMargin)) continue;
|
if (!RectVisible(hdc, &leftMargin)) continue;
|
||||||
|
|
||||||
if (row == editRow) FillRect(hdc, &leftMargin, editBrush);
|
HBRUSH fillBrush;
|
||||||
else FillRect(hdc, &leftMargin, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
|
if (row == editRow) fillBrush = editBrush;
|
||||||
|
else fillBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
|
||||||
|
FillRect(hdc, &leftMargin, fillBrush);
|
||||||
|
|
||||||
DrawEdge(hdc, &leftMargin, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_RIGHT | BF_BOTTOM | BF_TOP);
|
DrawEdge(hdc, &leftMargin, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_RIGHT | BF_BOTTOM | BF_TOP);
|
||||||
// Rectangle( hdc, leftMargin.left, leftMargin.top, leftMargin.right, leftMargin.bottom + 1);
|
// Rectangle( hdc, leftMargin.left, leftMargin.top, leftMargin.right, leftMargin.bottom + 1);
|
||||||
@ -181,6 +185,11 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
|
|||||||
SyncData *syncData = getSyncData();
|
SyncData *syncData = getSyncData();
|
||||||
if (NULL == syncData) return;
|
if (NULL == syncData) return;
|
||||||
|
|
||||||
|
int selectLeft = min(selectStartTrack, selectStopTrack);
|
||||||
|
int selectRight = max(selectStartTrack, selectStopTrack);
|
||||||
|
int selectTop = min(selectStartRow, selectStopRow);
|
||||||
|
int selectBottom = max(selectStartRow, selectStopRow);
|
||||||
|
|
||||||
SyncData::TrackContainer::iterator trackIter = syncData->tracks.begin();
|
SyncData::TrackContainer::iterator trackIter = syncData->tracks.begin();
|
||||||
for (int track = 0; track <= lastTrack; ++track, ++trackIter)
|
for (int track = 0; track <= lastTrack; ++track, ++trackIter)
|
||||||
{
|
{
|
||||||
@ -197,9 +206,20 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
|
|||||||
|
|
||||||
if (!RectVisible(hdc, &patternDataRect)) continue;
|
if (!RectVisible(hdc, &patternDataRect)) continue;
|
||||||
|
|
||||||
HBRUSH bgBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
HBRUSH baseBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
||||||
if (row % 8 == 0) bgBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
|
HBRUSH darkBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
|
||||||
if (row == editRow) bgBrush = editBrush;
|
|
||||||
|
// if (row % 8 == 0) bgBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
|
||||||
|
// if (row == editRow) bgBrush = editBrush;
|
||||||
|
|
||||||
|
if (selectActive && (track >= selectLeft && track <= selectRight) && (row >= selectTop && row <= selectBottom))
|
||||||
|
{
|
||||||
|
baseBrush = selectBaseBrush;
|
||||||
|
darkBrush = selectDarkBrush;
|
||||||
|
}
|
||||||
|
|
||||||
|
HBRUSH bgBrush = baseBrush;
|
||||||
|
if (row % 8 == 0) bgBrush = darkBrush;
|
||||||
|
|
||||||
RECT fillRect = patternDataRect;
|
RECT fillRect = patternDataRect;
|
||||||
// if (row == editRow && track == editTrack) DrawEdge(hdc, &fillRect, BDR_RAISEDINNER | BDR_SUNKENOUTER, BF_ADJUST | BF_TOP | BF_BOTTOM | BF_LEFT | BF_RIGHT);
|
// if (row == editRow && track == editTrack) DrawEdge(hdc, &fillRect, BDR_RAISEDINNER | BDR_SUNKENOUTER, BF_ADJUST | BF_TOP | BF_BOTTOM | BF_LEFT | BF_RIGHT);
|
||||||
@ -326,20 +346,11 @@ void TrackView::setEditRow(int newEditRow)
|
|||||||
// clamp to document
|
// clamp to document
|
||||||
editRow = min(max(editRow, 0), rows - 1);
|
editRow = min(max(editRow, 0), rows - 1);
|
||||||
|
|
||||||
RECT clientRect;
|
bool selecting = GetKeyState(VK_SHIFT) < 0 ? true : false;
|
||||||
GetClientRect(hwnd, &clientRect);
|
if (selecting) selectStopRow = editRow;
|
||||||
|
|
||||||
RECT rowRect;
|
invalidateRow(oldEditRow);
|
||||||
rowRect.left = clientRect.left;
|
invalidateRow(editRow);
|
||||||
rowRect.right = clientRect.right;
|
|
||||||
|
|
||||||
rowRect.top = getScreenY(oldEditRow);
|
|
||||||
rowRect.bottom = rowRect.top + fontHeight;
|
|
||||||
InvalidateRect(hwnd, &rowRect, TRUE);
|
|
||||||
|
|
||||||
rowRect.top = getScreenY(editRow);
|
|
||||||
rowRect.bottom = rowRect.top + fontHeight;
|
|
||||||
InvalidateRect(hwnd, &rowRect, TRUE);
|
|
||||||
|
|
||||||
setScrollPos(scrollPosX, (editRow * fontHeight) - ((windowHeight - topMarginHeight) / 2) + fontHeight / 2);
|
setScrollPos(scrollPosX, (editRow * fontHeight) - ((windowHeight - topMarginHeight) / 2) + fontHeight / 2);
|
||||||
}
|
}
|
||||||
@ -353,33 +364,11 @@ void TrackView::setEditTrack(int newEditTrack)
|
|||||||
editTrack = max(editTrack, 0);
|
editTrack = max(editTrack, 0);
|
||||||
editTrack = min(editTrack, getTrackCount() - 1);
|
editTrack = min(editTrack, getTrackCount() - 1);
|
||||||
|
|
||||||
RECT trackRect;
|
bool selecting = GetKeyState(VK_SHIFT) < 0 ? true : false;
|
||||||
|
if (selecting) selectStopTrack = editTrack;
|
||||||
|
|
||||||
// dirty old and new marker
|
invalidateTrack(oldEditTrack);
|
||||||
trackRect.top = getScreenY(editRow);
|
invalidateTrack(editTrack);
|
||||||
trackRect.bottom = trackRect.top + fontHeight;
|
|
||||||
|
|
||||||
// old marker
|
|
||||||
trackRect.left = getScreenX(oldEditTrack);
|
|
||||||
trackRect.right = trackRect.left + trackWidth;
|
|
||||||
InvalidateRect(hwnd, &trackRect, TRUE);
|
|
||||||
|
|
||||||
// new marker
|
|
||||||
trackRect.left = getScreenX(editTrack);
|
|
||||||
trackRect.right = trackRect.left + trackWidth;
|
|
||||||
InvalidateRect(hwnd, &trackRect, TRUE);
|
|
||||||
|
|
||||||
/* dirty track-marker */
|
|
||||||
trackRect.top = 0;
|
|
||||||
trackRect.bottom = topMarginHeight;
|
|
||||||
|
|
||||||
trackRect.left = getScreenX(oldEditTrack);
|
|
||||||
trackRect.right = trackRect.left + trackWidth;
|
|
||||||
InvalidateRect(hwnd, &trackRect, TRUE);
|
|
||||||
|
|
||||||
trackRect.left = getScreenX(editTrack);
|
|
||||||
trackRect.right = trackRect.left + trackWidth;
|
|
||||||
InvalidateRect(hwnd, &trackRect, TRUE);
|
|
||||||
|
|
||||||
int firstTrack = scrollPosX / trackWidth;
|
int firstTrack = scrollPosX / trackWidth;
|
||||||
int lastTrack = firstTrack + windowTracks;
|
int lastTrack = firstTrack + windowTracks;
|
||||||
@ -487,6 +476,12 @@ 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 VK_SHIFT:
|
||||||
|
selectStartTrack = selectStopTrack = editTrack;
|
||||||
|
selectStartRow = selectStopRow = editRow;
|
||||||
|
selectActive = true;
|
||||||
|
break;
|
||||||
|
|
||||||
// simulate keyboard accelerators
|
// simulate keyboard accelerators
|
||||||
case 'Z':
|
case 'Z':
|
||||||
if (ctrlDown) SendMessage(GetParent(this->getWin()), WM_COMMAND, MAKEWPARAM(shiftDown ? WM_REDO : WM_UNDO, 1), 0);
|
if (ctrlDown) SendMessage(GetParent(this->getWin()), WM_COMMAND, MAKEWPARAM(shiftDown ? WM_REDO : WM_UNDO, 1), 0);
|
||||||
@ -504,14 +499,18 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
|||||||
{
|
{
|
||||||
case VK_RETURN:
|
case VK_RETURN:
|
||||||
{
|
{
|
||||||
SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
|
if (editString.size() > 0)
|
||||||
editTrack, editRow,
|
{
|
||||||
true, float(_tstof(editString.c_str()))
|
SyncDataEdit::EditCommand *cmd = new SyncDataEdit::EditCommand(
|
||||||
);
|
editTrack, editRow,
|
||||||
syncDataEdit.exec(cmd);
|
true, float(_tstof(editString.c_str()))
|
||||||
|
);
|
||||||
|
syncDataEdit.exec(cmd);
|
||||||
|
|
||||||
editString.clear();
|
editString.clear();
|
||||||
refreshCaret = true;
|
invalidatePos(editTrack, editRow);
|
||||||
|
}
|
||||||
|
else MessageBeep(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -522,8 +521,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
|||||||
false, 0.0f
|
false, 0.0f
|
||||||
);
|
);
|
||||||
syncDataEdit.exec(cmd);
|
syncDataEdit.exec(cmd);
|
||||||
|
invalidatePos(editTrack, editRow);
|
||||||
refreshCaret = true;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -531,40 +529,32 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags)
|
|||||||
if (editString.size() > 0)
|
if (editString.size() > 0)
|
||||||
{
|
{
|
||||||
editString.resize(editString.size() - 1);
|
editString.resize(editString.size() - 1);
|
||||||
refreshCaret = true;
|
invalidatePos(editTrack, editRow);
|
||||||
}
|
}
|
||||||
else MessageBeep(0);
|
else MessageBeep(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_CANCEL:
|
case VK_CANCEL:
|
||||||
case VK_ESCAPE:
|
case VK_ESCAPE:
|
||||||
|
if (selectActive)
|
||||||
|
{
|
||||||
|
selectActive = false;
|
||||||
|
invalidateRange(selectStartTrack, selectStopTrack, selectStartRow, selectStopRow);
|
||||||
|
}
|
||||||
if (editString.size() > 0)
|
if (editString.size() > 0)
|
||||||
{
|
{
|
||||||
// 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);
|
||||||
refreshCaret = true;
|
|
||||||
MessageBeep(0);
|
MessageBeep(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refreshCaret)
|
|
||||||
{
|
|
||||||
RECT rowRect;
|
|
||||||
rowRect.left = getScreenX(editTrack);
|
|
||||||
rowRect.right = getScreenX(editTrack + 1);
|
|
||||||
rowRect.top = getScreenY(editRow);
|
|
||||||
rowRect.bottom = getScreenY(editRow + 1);
|
|
||||||
InvalidateRect(hwnd, &rowRect, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT TrackView::onChar(UINT keyCode, UINT flags)
|
LRESULT TrackView::onChar(UINT keyCode, UINT flags)
|
||||||
{
|
{
|
||||||
bool refreshCaret = false;
|
|
||||||
printf("char: \"%c\" (%d) - flags: %x\n", (char)keyCode, keyCode, flags);
|
printf("char: \"%c\" (%d) - flags: %x\n", (char)keyCode, keyCode, flags);
|
||||||
switch ((char)keyCode)
|
switch ((char)keyCode)
|
||||||
{
|
{
|
||||||
@ -587,19 +577,9 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags)
|
|||||||
case '9':
|
case '9':
|
||||||
editString.push_back(keyCode);
|
editString.push_back(keyCode);
|
||||||
printf("accepted: %c - %s\n", (char)keyCode, editString.c_str());
|
printf("accepted: %c - %s\n", (char)keyCode, editString.c_str());
|
||||||
refreshCaret = true;
|
invalidatePos(editTrack, editRow);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refreshCaret)
|
|
||||||
{
|
|
||||||
RECT rowRect;
|
|
||||||
rowRect.left = getScreenX(editTrack);
|
|
||||||
rowRect.right = getScreenX(editTrack + 1);
|
|
||||||
rowRect.top = getScreenY(editRow);
|
|
||||||
rowRect.bottom = getScreenY(editRow + 1);
|
|
||||||
InvalidateRect(hwnd, &rowRect, TRUE);
|
|
||||||
}
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
45
trackview.h
45
trackview.h
@ -146,6 +146,16 @@ private:
|
|||||||
void setScrollPos(int newScrollPosX, int newScrollPosY);
|
void setScrollPos(int newScrollPosX, int newScrollPosY);
|
||||||
void scrollWindow(int newScrollPosX, int newScrollPosY);
|
void scrollWindow(int newScrollPosX, int newScrollPosY);
|
||||||
|
|
||||||
|
void invalidateRange(int startTrack, int stopTrack, int startRow, int stopRow)
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
rect.left = getScreenX(min(startTrack, stopTrack));
|
||||||
|
rect.right = getScreenX(max(startTrack, stopTrack) + 1);
|
||||||
|
rect.top = getScreenY(min(startRow, stopRow));
|
||||||
|
rect.bottom = getScreenY(max(startRow, stopRow) + 1);
|
||||||
|
InvalidateRect(hwnd, &rect, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
void invalidatePos(int track, int row)
|
void invalidatePos(int track, int row)
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
@ -156,6 +166,35 @@ private:
|
|||||||
InvalidateRect(hwnd, &rect, TRUE);
|
InvalidateRect(hwnd, &rect, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void invalidateRow(int row)
|
||||||
|
{
|
||||||
|
RECT clientRect;
|
||||||
|
GetClientRect(hwnd, &clientRect);
|
||||||
|
|
||||||
|
RECT rect;
|
||||||
|
rect.left = clientRect.left;
|
||||||
|
rect.right = clientRect.right;
|
||||||
|
rect.top = getScreenY(row);
|
||||||
|
rect.bottom = getScreenY(row + 1);
|
||||||
|
|
||||||
|
InvalidateRect(hwnd, &rect, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void invalidateTrack(int track)
|
||||||
|
{
|
||||||
|
RECT clientRect;
|
||||||
|
GetClientRect(hwnd, &clientRect);
|
||||||
|
|
||||||
|
RECT rect;
|
||||||
|
rect.left = getScreenX(track);
|
||||||
|
rect.right = getScreenX(track + 1);
|
||||||
|
rect.top = clientRect.top;
|
||||||
|
rect.bottom = clientRect.bottom;
|
||||||
|
|
||||||
|
InvalidateRect(hwnd, &rect, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void setEditRow(int newEditRow);
|
void setEditRow(int newEditRow);
|
||||||
void setEditTrack(int newEditTrack);
|
void setEditTrack(int newEditTrack);
|
||||||
|
|
||||||
@ -169,6 +208,12 @@ private:
|
|||||||
return int(syncData->getTrackCount());
|
return int(syncData->getTrackCount());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool selectActive;
|
||||||
|
int selectStartTrack, selectStopTrack;
|
||||||
|
int selectStartRow, selectStopRow;
|
||||||
|
|
||||||
|
HBRUSH selectBaseBrush, selectDarkBrush;
|
||||||
|
|
||||||
/* cursor position */
|
/* cursor position */
|
||||||
int editRow, editTrack;
|
int editRow, editTrack;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user