From 2a106f7949081e23488c31cff5f4e91357ca18d7 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Sat, 9 Feb 2008 20:50:03 +0000 Subject: [PATCH] changing row count works \o/ --- network.cpp | 4 +- resource.h | 7 +- syncdata.h | 10 +- synctracker2.cpp | 198 +++++++++++++++++------------ synctracker2.rc | 34 +++++ synctracker2.vcproj | 2 +- trackview.cpp | 360 ++++++++++++++++++++++++++-------------------------- trackview.h | 8 +- 8 files changed, 356 insertions(+), 267 deletions(-) diff --git a/network.cpp b/network.cpp index e664a34..41736c4 100644 --- a/network.cpp +++ b/network.cpp @@ -26,8 +26,8 @@ SOCKET clientConnect(SOCKET serverSocket) const char *expectedGreeting = clientGreeting; char recievedGreeting[128]; - while(recv(clientSocket, recievedGreeting, int(strlen(expectedGreeting)), 0) < 0) Sleep(1); - + recv(clientSocket, recievedGreeting, int(strlen(expectedGreeting)), 0); + fprintf(stderr, "got: \"%s\"\n", recievedGreeting); if (strncmp(expectedGreeting, recievedGreeting, strlen(expectedGreeting)) != 0) { diff --git a/resource.h b/resource.h index f0787f5..4594c7b 100644 --- a/resource.h +++ b/resource.h @@ -4,6 +4,9 @@ // #define IDR_ACCELERATOR 101 #define IDR_MENU 102 +#define IDD_SETROWS 103 +#define IDC_EDIT 1002 +#define IDC_SETROWS_EDIT 1002 #define ID_FILE 40001 #define ID_FILE_EXIT 40002 #define ID_EDIT 40003 @@ -13,9 +16,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40008 -#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_CONTROL_VALUE 1003 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/syncdata.h b/syncdata.h index d87a19e..1297bcc 100644 --- a/syncdata.h +++ b/syncdata.h @@ -37,7 +37,7 @@ public: // lerp, bitch float d = (time - lower->first) / (upper->first - lower->first); return lower->second.value + delta * d; - }; + } bool isKeyFrame(size_t row) const { @@ -63,7 +63,7 @@ public: void setKeyFrame(size_t row, const float value) { - keyFrames[row] = KeyFrame(value); + setKeyFrame(row, KeyFrame(value)); } size_t getFrameCount() const @@ -74,6 +74,7 @@ public: } private: + typedef std::map KeyFrameContainer; KeyFrameContainer keyFrames; }; @@ -98,9 +99,10 @@ public: return trackIter->second; } - size_t getTrackCount() { return tracks.size(); } + size_t getTrackCount() const { return tracks.size(); } -// private: +//private: typedef std::map, SyncTrack> TrackContainer; TrackContainer tracks; }; + diff --git a/synctracker2.cpp b/synctracker2.cpp index b657f13..5d35bed 100644 --- a/synctracker2.cpp +++ b/synctracker2.cpp @@ -13,13 +13,62 @@ TrackView *trackView; HWND trackViewWin; HWND statusBarWin; +#define WM_SETROWS (WM_USER+1) + #include "network.h" +static LRESULT CALLBACK setRowsDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + int *rows = (int*)lParam; + assert(NULL != rows); + + /* create row-string */ + char temp[256]; + _snprintf(temp, 256, "%d", *rows); + + /* set initial row count */ + SetWindowText(GetDlgItem(hDlg, IDC_SETROWS_EDIT), temp); + } + break; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK) + { + /* get value */ + char temp[256]; + GetWindowText(GetDlgItem(hDlg, IDC_SETROWS_EDIT), temp, 256); + int result = atoi(temp); + + /* update editor */ + SendMessage(GetParent(hDlg), WM_SETROWS, 0, result); + + /* end dialog */ + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + else if(LOWORD(wParam)== IDCANCEL) + { + EndDialog( hDlg, LOWORD(wParam)); + } + break; + + case WM_CLOSE: + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + + return FALSE; +} + static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { - case WM_CREATE: + case WM_CREATE: { HINSTANCE hInstance = GetModuleHandle(NULL); trackViewWin = trackView->create(hInstance, hwnd); @@ -42,8 +91,8 @@ static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA SendMessage(statusBarWin, SB_SETTEXT, 1, (LPARAM)_T("Hi there :)")); } break; - - case WM_SIZE: + + case WM_SIZE: { int width = LOWORD(lParam); int height = HIWORD(lParam); @@ -56,62 +105,47 @@ static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA MoveWindow(statusBarWin, 0, height - statusBarHeight, width, statusBarHeight, TRUE); } break; - - case WM_SETFOCUS: - SetFocus(trackViewWin); // needed to forward keyboard input - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case ID_FILE_SAVE: /* meh.*/ break; - case ID_FILE_EXIT: PostQuitMessage(0); break; - case ID_EDIT_UNDO: SendMessage(trackViewWin, WM_UNDO, 0, 0); break; - case ID_EDIT_REDO: SendMessage(trackViewWin, WM_REDO, 0, 0); break; - case ID_EDIT_COPY: SendMessage(trackViewWin, WM_COPY, 0, 0); break; - case ID_EDIT_CUT: SendMessage(trackViewWin, WM_CUT, 0, 0); break; - case ID_EDIT_PASTE: SendMessage(trackViewWin, WM_PASTE, 0, 0); break; - default: - printf("cmd %d %d\n", wParam, lParam); - } + + case WM_SETFOCUS: + SetFocus(trackViewWin); // needed to forward keyboard input break; - case WM_USER+1: + case WM_SETROWS: + printf("rows: %d\n", int(lParam)); + trackView->setRows(int(lParam)); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { - if (WSAGETSELECTERROR(lParam)) + case ID_FILE_SAVE: /* meh.*/ break; + case ID_FILE_EXIT: PostQuitMessage(0); break; + case ID_EDIT_UNDO: SendMessage(trackViewWin, WM_UNDO, 0, 0); break; + case ID_EDIT_REDO: SendMessage(trackViewWin, WM_REDO, 0, 0); break; + case ID_EDIT_COPY: SendMessage(trackViewWin, WM_COPY, 0, 0); break; + case ID_EDIT_CUT: SendMessage(trackViewWin, WM_CUT, 0, 0); break; + case ID_EDIT_PASTE: SendMessage(trackViewWin, WM_PASTE, 0, 0); break; + + case ID_EDIT_SETROWS: { - printf("ERR!\n"); - // error occurred - WSACleanup (); - return 0; - } - - printf("tjo %x %x\n", lParam, wParam); - SOCKET serverSocket = (SOCKET)wParam; - switch (WSAGETSELECTEVENT(lParam)) - { - case FD_ACCEPT: - printf("accept\n"); + 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 (IDOK == result) { - SOCKET clientSocket = clientConnect(serverSocket); - if (INVALID_SOCKET != clientSocket) - { - unsigned char cmd = 0x1; - send(clientSocket, (char*)&cmd, 1, 0); - closesocket(clientSocket); - } - else - { - puts("accept failed!"); - } + printf("result: %d\n", result); } - break; } - } - break; + break; default: - return DefWindowProc(hwnd, msg, wParam, lParam); + printf("cmd %d %d\n", wParam, lParam); + } + break; + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } @@ -129,7 +163,7 @@ static ATOM registerMainWindowClass(HINSTANCE hInstance) wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)0; - wc.lpszMenuName = (LPCSTR)IDR_MENU; + wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wc.lpszClassName = mainWindowClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); @@ -138,35 +172,42 @@ static ATOM registerMainWindowClass(HINSTANCE hInstance) int _tmain(int argc, _TCHAR* argv[]) { - HWND hwnd; +#ifdef _DEBUG + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG); + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); + _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG); +/* _CrtSetBreakAlloc(68); */ +#endif + HINSTANCE hInstance = GetModuleHandle(NULL); - + #if 1 if (false == initNetwork()) { fputs("Failed to init WinSock", stderr); exit(1); } - + SOCKET serverSocket = socket( AF_INET, SOCK_STREAM, 0 ); - + struct sockaddr_in sin; memset( &sin, 0, sizeof sin ); - + sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons( 1338 ); - + puts("binding..."); if (SOCKET_ERROR == bind( serverSocket, (struct sockaddr *)&sin, sizeof(sin))) { fputs("Coult not start server", stderr); exit(1); } - + puts("listening..."); while ( listen( serverSocket, SOMAXCONN ) == SOCKET_ERROR ); - + /* ULONG nonBlock = 1; if (ioctlsocket(serverSocket, FIONBIO, &nonBlock) == SOCKET_ERROR) { @@ -174,26 +215,27 @@ int _tmain(int argc, _TCHAR* argv[]) return 0; } */ #endif - + SyncEditData syncData; SyncTrack &camXTrack = syncData.getTrack(_T("cam.x")); SyncTrack &camYTrack = syncData.getTrack(_T("cam.y")); SyncTrack &camZTrack = syncData.getTrack(_T("cam.z")); + for (int i = 0; i < 2; ++i) { char temp[256]; - sprintf(temp, "gen %02d", i); + _snprintf(temp, 256, "gen %02d", i); SyncTrack &temp2 = syncData.getTrack(temp); } - - camXTrack.setKeyFrame(1, SyncTrack::KeyFrame(2.0f)); - camXTrack.setKeyFrame(4, SyncTrack::KeyFrame(3.0f)); - - camYTrack.setKeyFrame(0, SyncTrack::KeyFrame(100.0f)); - camYTrack.setKeyFrame(8, SyncTrack::KeyFrame(999.0f)); - + + camXTrack.setKeyFrame(1, 2.0f); + camXTrack.setKeyFrame(4, 3.0f); + + camYTrack.setKeyFrame(0, 100.0f); + camYTrack.setKeyFrame(8, 999.0f); + camYTrack.setKeyFrame(16, SyncTrack::KeyFrame(float(1E-5))); - + for (int i = 0; i < 5 * 2; ++i) { float time = float(i) / 2; @@ -212,7 +254,7 @@ int _tmain(int argc, _TCHAR* argv[]) trackView->setSyncData(&syncData); // Step 2: Creating the Window - hwnd = CreateWindowEx( + HWND hwnd = CreateWindowEx( 0, mainWindowClassName, _T("SyncTracker 3000"), @@ -221,6 +263,7 @@ int _tmain(int argc, _TCHAR* argv[]) CW_USEDEFAULT, CW_USEDEFAULT, // width, height NULL, NULL, hInstance, NULL ); + printf("main window: %p\n", hwnd); if (NULL == hwnd) { @@ -228,17 +271,16 @@ int _tmain(int argc, _TCHAR* argv[]) return 0; } - HACCEL accel = LoadAccelerators(hInstance, (LPCSTR)IDR_ACCELERATOR); + HACCEL accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR)); printf("accel: %p\n", accel); ShowWindow(hwnd, TRUE); UpdateWindow(hwnd); - + #if 1 - + printf("server socket %x\n", serverSocket); -// WSAAsyncSelect(serverSocket, hwnd, WM_USER+1, FD_ACCEPT); - + bool done = false; SOCKET clientSocket = INVALID_SOCKET; MSG msg; @@ -253,7 +295,7 @@ int _tmain(int argc, _TCHAR* argv[]) struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; - + // look for new clients if (select(0, &fds, NULL, NULL, &timeout) > 0) { @@ -288,7 +330,7 @@ int _tmain(int argc, _TCHAR* argv[]) if (cmd == 1) printf("yes, master!\n"); } } - + // terminate connection /* cmd = 0x0; send(clientSocket, (char*)&cmd, 1, 0); @@ -310,7 +352,7 @@ int _tmain(int argc, _TCHAR* argv[]) closesocket(serverSocket); closeNetwork(); - + #else // Step 3: The Message Loop while(GetMessage(&msg, NULL, 0, 0) > 0) diff --git a/synctracker2.rc b/synctracker2.rc index 0d07dc6..da2ad37 100644 --- a/synctracker2.rc +++ b/synctracker2.rc @@ -90,6 +90,40 @@ BEGIN END END + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_SETROWS DIALOGEX 0, 0, 129, 27 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Set Rows" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + EDITTEXT IDC_SETROWS_EDIT,7,6,59,12,ES_AUTOHSCROLL | ES_NUMBER + DEFPUSHBUTTON "OK",IDOK,72,6,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_SETROWS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 122 + TOPMARGIN, 7 + BOTTOMMARGIN, 20 + END +END +#endif // APSTUDIO_INVOKED + #endif // Norwegian (Bokmal) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/synctracker2.vcproj b/synctracker2.vcproj index 1ce3262..199b4ba 100644 --- a/synctracker2.vcproj +++ b/synctracker2.vcproj @@ -40,7 +40,7 @@ tracks.end()); if (track < firstTrack) continue; - + RECT topMargin; - + topMargin.top = 0; topMargin.bottom = topMarginHeight; - + topMargin.left = getScreenX(track); topMargin.right = topMargin.left + trackWidth; if (!RectVisible(hdc, &topMargin)) continue; - + RECT fillRect = topMargin; - + HBRUSH bgBrush = GetSysColorBrush(COLOR_3DFACE); if (track == editTrack) bgBrush = editBrush; - + DrawEdge(hdc, &fillRect, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_ADJUST | BF_LEFT | BF_RIGHT | BF_BOTTOM); FillRect(hdc, &fillRect, bgBrush); - + const std::basic_string &trackName = trackIter->first; TextOut(hdc, fillRect.left, 0, @@ -136,7 +136,7 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks) ); ExcludeClipRect(hdc, topMargin.left, topMargin.top, topMargin.right, topMargin.bottom); } - + RECT topRightMargin; topRightMargin.top = 0; topRightMargin.bottom = topMarginHeight; @@ -146,13 +146,12 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks) 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); - } void TrackView::paintTracks(HDC hdc, RECT rcTracks) { TCHAR temp[256]; - + int firstTrack = min(max(scrollPosX / trackWidth, 0), getTrackCount() - 1); int lastTrack = min(max(firstTrack + windowTracks + 1, 0), getTrackCount() - 1); @@ -161,9 +160,9 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) /* clamp first & last row */ firstRow = min(max(firstRow, 0), rows - 1); lastRow = min(max(lastRow, 0), rows - 1); - + SetBkMode(hdc, TRANSPARENT); - + // SelectObject(hdc, editBrush); paintTopMargin(hdc, rcTracks); @@ -195,7 +194,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) leftMargin.left, leftMargin.top, temp, int(_tcslen(temp)) ); - + ExcludeClipRect(hdc, leftMargin.left, leftMargin.top, leftMargin.right, leftMargin.bottom); } @@ -203,7 +202,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) SyncData *syncData = getSyncData(); if (NULL == syncData) return; - + int selectLeft = min(selectStartTrack, selectStopTrack); int selectRight = max(selectStartTrack, selectStopTrack); int selectTop = min(selectStartRow, selectStopRow); @@ -214,7 +213,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) { ASSERT(trackIter != syncData->tracks.end()); if (track < firstTrack) continue; - + for (int row = firstRow; row <= lastRow; ++row) { RECT patternDataRect; @@ -222,11 +221,11 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) patternDataRect.right = patternDataRect.left + trackWidth; patternDataRect.top = getScreenY(row); patternDataRect.bottom = patternDataRect.top + fontHeight; - + if (!RectVisible(hdc, &patternDataRect)) continue; - + bool selected = selectActive && (track >= selectLeft && track <= selectRight) && (row >= selectTop && row <= selectBottom); - + HBRUSH baseBrush = bgBaseBrush; HBRUSH darkBrush = bgDarkBrush; if (selected) @@ -234,10 +233,10 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) baseBrush = selectBaseBrush; darkBrush = selectDarkBrush; } - + HBRUSH bgBrush = baseBrush; if (row % 8 == 0) bgBrush = darkBrush; - + 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); FillRect( hdc, &fillRect, bgBrush); @@ -246,7 +245,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) MoveToEx(hdc, patternDataRect.left, patternDataRect.top, (LPPOINT) NULL); LineTo(hdc, patternDataRect.right, patternDataRect.top); } */ - + bool drawEditString = false; if (row == editRow && track == editTrack) { @@ -255,7 +254,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) // Rectangle(hdc, fillRect.left, fillRect.top, fillRect.right, fillRect.bottom); if (editString.size() > 0) drawEditString = true; } - + // InvertRect(hdc, &fillRect); const SyncTrack &track = trackIter->second; @@ -279,7 +278,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) if (selected) SetTextColor(hdc, oldCol); } } - + /* right margin */ { RECT rightMargin; @@ -289,7 +288,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) rightMargin.right = rcTracks.right; FillRect( hdc, &rightMargin, GetSysColorBrush(COLOR_APPWORKSPACE)); } - + { RECT bottomPadding; bottomPadding.top = getScreenY(rows); @@ -367,7 +366,7 @@ void TrackView::copy() SetClipboardData(clipboardFormat, hmem); SetClipboardData(CF_TEXT, hmem_text); CloseClipboard(); - + // should this memory be free'd or not? freeing seems to cause some hick-ups some times... // GlobalFree(hmem); // GlobalFree(hmem_text); @@ -515,7 +514,7 @@ void TrackView::setEditTrack(int newEditTrack) int firstTrack = scrollPosX / trackWidth; int lastTrack = firstTrack + windowTracks; - + int newFirstTrack = firstTrack; if (editTrack >= lastTrack) newFirstTrack = editTrack - (lastTrack - firstTrack - 1); if (editTrack < firstTrack) newFirstTrack = editTrack; @@ -529,34 +528,43 @@ static int getScrollPos(HWND hwnd, int bar) return int(si.nTrackPos); } +void TrackView::setRows(int rows) +{ + int oldRows = getRows(); + this->rows = rows; + InvalidateRect(getWin(), NULL, FALSE); + setEditRow(min(editRow, rows - 1)); +} + + LRESULT TrackView::onVScroll(UINT sbCode, int newPos) { switch (sbCode) { case SB_TOP: setEditRow(0); - break; + break; case SB_LINEUP: setEditRow(editRow - 1); - break; + break; case SB_LINEDOWN: setEditRow(editRow + 1); - break; + break; case SB_PAGEUP: setEditRow(editRow - windowRows / 2); - break; + break; case SB_PAGEDOWN: setEditRow(editRow + windowRows / 2); - break; - + break; + case SB_THUMBPOSITION: case SB_THUMBTRACK: setEditRow(getScrollPos(hwnd, SB_VERT)); - break; + break; } return FALSE; @@ -568,32 +576,32 @@ LRESULT TrackView::onHScroll(UINT sbCode, int newPos) { case SB_LEFT: setEditTrack(0); - break; + break; case SB_RIGHT: setEditTrack(getTrackCount() - 1); - break; + break; case SB_LINELEFT: setEditTrack(editTrack - 1); - break; + break; case SB_LINERIGHT: setEditTrack(editTrack + 1); - break; + break; case SB_PAGELEFT: setEditTrack(editTrack - windowTracks); - break; + break; case SB_PAGEDOWN: setEditTrack(editTrack + windowTracks); - break; - + break; + case SB_THUMBPOSITION: case SB_THUMBTRACK: setEditTrack(getScrollPos(hwnd, SB_HORZ)); - break; + break; } return FALSE; @@ -605,56 +613,54 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags) bool ctrlDown = GetKeyState(VK_CONTROL) < 0 ? true : false; bool shiftDown = GetKeyState(VK_SHIFT) < 0 ? true : false; bool altDown = GetKeyState(VK_MENU) < 0 ? true : false; - + if (editString.empty()) { switch (keyCode) { - case VK_UP: setEditRow(editRow - 1); break; - case VK_DOWN: setEditRow(editRow + 1); break; - - case VK_LEFT: setEditTrack(editTrack - 1); break; - case VK_RIGHT: setEditTrack(editTrack + 1); break; - - case VK_PRIOR: setEditRow(editRow - windowRows / 2); break; - case VK_NEXT: setEditRow(editRow + windowRows / 2); break; - - case VK_SHIFT: -// if (selectActive) invalidateRange(selectStartTrack, selectStopTrack, selectStartRow, selectStopRow); - if (!selectActive) - { - selectStartTrack = selectStopTrack = editTrack; - selectStartRow = selectStopRow = editRow; -// selectActive = true; -// printf("select active\n"); - } + case VK_UP: setEditRow(editRow - 1); break; + case VK_DOWN: setEditRow(editRow + 1); break; + + case VK_LEFT: setEditTrack(editTrack - 1); break; + case VK_RIGHT: setEditTrack(editTrack + 1); break; + + case VK_PRIOR: setEditRow(editRow - windowRows / 2); break; + case VK_NEXT: setEditRow(editRow + windowRows / 2); break; + + case VK_SHIFT: +// if (selectActive) invalidateRange(selectStartTrack, selectStopTrack, selectStartRow, selectStopRow); + if (!selectActive) + { + selectStartTrack = selectStopTrack = editTrack; + selectStartRow = selectStopRow = editRow; +// selectActive = true; +// printf("select active\n"); + } break; - - default: + + default: break; } } switch (keyCode) { - case VK_RETURN: + case VK_RETURN: + if (editString.size() > 0) { - 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); + 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: + + case VK_DELETE: { SyncEditData::EditCommand *cmd = new SyncEditData::EditCommand( editTrack, editRow, @@ -664,30 +670,30 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT flags) invalidatePos(editTrack, editRow); } break; - - case VK_BACK: - if (editString.size() > 0) - { - editString.resize(editString.size() - 1); - invalidatePos(editTrack, editRow); - } - else MessageBeep(0); + + case VK_BACK: + if (editString.size() > 0) + { + editString.resize(editString.size() - 1); + invalidatePos(editTrack, editRow); + } + else MessageBeep(0); break; - - case VK_CANCEL: - case VK_ESCAPE: - if (selectActive) - { - selectActive = false; - invalidateRange(selectStartTrack, selectStopTrack, selectStartRow, selectStopRow); - } - if (editString.size() > 0) - { - // return to old value (i.e don't clear) - editString.clear(); - invalidatePos(editTrack, editRow); - MessageBeep(0); - } + + case VK_CANCEL: + case VK_ESCAPE: + if (selectActive) + { + selectActive = false; + invalidateRange(selectStartTrack, selectStopTrack, selectStartRow, selectStopRow); + } + if (editString.size() > 0) + { + // return to old value (i.e don't clear) + editString.clear(); + invalidatePos(editTrack, editRow); + MessageBeep(0); + } break; } return FALSE; @@ -698,26 +704,27 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags) printf("char: \"%c\" (%d) - flags: %x\n", (char)keyCode, keyCode, flags); switch ((char)keyCode) { - case '.': - // only one '.' allowed - if (std::string::npos != editString.find('.')) - { - MessageBeep(0); - break; - } - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - editString.push_back(keyCode); - printf("accepted: %c - %s\n", (char)keyCode, editString.c_str()); - invalidatePos(editTrack, editRow); + case '.': + // only one '.' allowed + if (std::string::npos != editString.find('.')) + { + MessageBeep(0); + break; + } + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + editString.push_back(keyCode); + printf("accepted: %c - %s\n", (char)keyCode, editString.c_str()); + invalidatePos(editTrack, editRow); break; } return FALSE; @@ -727,10 +734,10 @@ LRESULT TrackView::onSize(int width, int height) { const int oldWindowWidth = windowWidth; const int oldWindowHeight = windowHeight; - + windowWidth = width; windowHeight = height; - + windowRows = (height - topMarginHeight) / fontHeight; windowTracks = (width - leftMarginWidth) / trackWidth; @@ -745,41 +752,41 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) switch(msg) { - case WM_CREATE: return onCreate(); - - case WM_CLOSE: - DestroyWindow(hwnd); + case WM_CREATE: return onCreate(); + + case WM_CLOSE: + DestroyWindow(hwnd); break; - - case WM_DESTROY: - PostQuitMessage(0); + + case WM_DESTROY: + PostQuitMessage(0); break; - - case WM_SIZE: return onSize(LOWORD(lParam), HIWORD(lParam)); - case WM_VSCROLL: return onVScroll(LOWORD(wParam), getScrollPos(hwnd, SB_VERT)); - case WM_HSCROLL: return onHScroll(LOWORD(wParam), getScrollPos(hwnd, SB_HORZ)); - case WM_PAINT: return onPaint(); - case WM_KEYDOWN: return onKeyDown((UINT)wParam, (UINT)lParam); - case WM_CHAR: return onChar((UINT)wParam, (UINT)lParam); - - case WM_COPY: copy(); break; - case WM_CUT: cut(); break; - case WM_PASTE: paste(); break; - - case WM_UNDO: - if (!syncData->undo()) MessageBeep(0); - // unfortunately, we don't know how much to invalidate... so we'll just invalidate it all. - InvalidateRect(hwnd, NULL, TRUE); + + case WM_SIZE: return onSize(LOWORD(lParam), HIWORD(lParam)); + case WM_VSCROLL: return onVScroll(LOWORD(wParam), getScrollPos(hwnd, SB_VERT)); + case WM_HSCROLL: return onHScroll(LOWORD(wParam), getScrollPos(hwnd, SB_HORZ)); + case WM_PAINT: return onPaint(); + case WM_KEYDOWN: return onKeyDown((UINT)wParam, (UINT)lParam); + case WM_CHAR: return onChar((UINT)wParam, (UINT)lParam); + + case WM_COPY: copy(); break; + case WM_CUT: cut(); break; + case WM_PASTE: paste(); break; + + case WM_UNDO: + if (!syncData->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 (!syncData->redo()) MessageBeep(0); - // unfortunately, we don't know how much to invalidate... so we'll just invalidate it all. - InvalidateRect(hwnd, NULL, TRUE); + + case WM_REDO: + if (!syncData->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: - return DefWindowProc(hwnd, msg, wParam, lParam); + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); } return FALSE; } @@ -792,38 +799,37 @@ static LRESULT CALLBACK trackViewWindowProc(HWND hwnd, UINT msg, WPARAM wParam, switch(msg) { - case WM_NCCREATE: - // Get TrackView from createstruct - trackView = (TrackView*)((CREATESTRUCT*)lParam)->lpCreateParams; - trackView->hwnd = hwnd; - - // Set the TrackView instance -#pragma warning(suppress:4244) /* remove a pointless warning */ - SetWindowLongPtr(hwnd, 0, (LONG_PTR)trackView); - - // call the proper window procedure - return trackView->windowProc(hwnd, msg, wParam, lParam); - break; + case WM_NCCREATE: + // Get TrackView from createstruct + trackView = (TrackView*)((CREATESTRUCT*)lParam)->lpCreateParams; + trackView->hwnd = hwnd; - case WM_NCDESTROY: + // Set the TrackView instance +#pragma warning(suppress:4244) /* remove a pointless warning */ + SetWindowLongPtr(hwnd, 0, (LONG_PTR)trackView); + + // call the proper window procedure + return trackView->windowProc(hwnd, msg, wParam, lParam); + break; + + case WM_NCDESTROY: + ASSERT(NULL != trackView); { - ASSERT(NULL != trackView); - // call the window proc and store away the return code LRESULT res = trackView->windowProc(hwnd, msg, wParam, lParam); - + // get rid of the TrackView instance trackView = NULL; SetWindowLongPtr(hwnd, 0, (LONG_PTR)NULL); - + // return the stored return code return res; } break; - - default: - ASSERT(NULL != trackView); - return trackView->windowProc(hwnd, msg, wParam, lParam); + + default: + ASSERT(NULL != trackView); + return trackView->windowProc(hwnd, msg, wParam, lParam); } return 0; } diff --git a/trackview.h b/trackview.h index b6a216c..20fa54c 100644 --- a/trackview.h +++ b/trackview.h @@ -21,6 +21,9 @@ public: void setSyncData(SyncEditData *syncData) { this->syncData = syncData; } SyncEditData *getSyncData() { return syncData; } + void setRows(int rows); + int getRows() const { return rows; } + private: // some nasty hackery to forward the window messages friend static LRESULT CALLBACK trackViewWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); @@ -47,7 +50,7 @@ private: void setupScrollBars(); void setScrollPos(int newScrollPosX, int newScrollPosY); void scrollWindow(int newScrollPosX, int newScrollPosY); - + void invalidateRange(int startTrack, int stopTrack, int startRow, int stopRow) { RECT rect; @@ -124,8 +127,6 @@ private: int windowWidth, windowHeight; int windowRows, windowTracks; - int rows; - SyncEditData *syncData; std::basic_string editString; @@ -134,6 +135,7 @@ private: HBRUSH editBrush; UINT clipboardFormat; + int rows; }; ATOM registerTrackViewWindowClass(HINSTANCE hInstance);