From eb180b4d15a074c876d18969eec76409f1033c4f Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Tue, 19 Feb 2008 09:10:05 +0000 Subject: [PATCH] Partial fix for bug 1896587. Added a fileNew()-function, and made it do some of what it's supposed to do. However, it only clears the part of the document that is within the max-row range. To fix properly, a separate function to clear a track should be added, and all tracks should be iterated through and truncated to 0. Another issue, is that there's no real purgeUnused()-method in SyncDocument yet, and it's a bit tricky to implement (needs to remap properly). But, at least some of this seems to work-ish now. Also added a menu-hook for fileNew. --- editor/editor.rc | 2 +- editor/syncdocument.cpp | 3 +++ editor/syncdocument.h | 2 ++ editor/synctracker2.cpp | 19 +++++++++++++++++-- editor/trackview.cpp | 9 +++------ editor/trackview.h | 34 +++++++++++++++++++++++++++------- sync/data.h | 2 +- sync/device_client.cpp | 16 +++------------- 8 files changed, 57 insertions(+), 30 deletions(-) diff --git a/editor/editor.rc b/editor/editor.rc index 5e20387..280d622 100644 --- a/editor/editor.rc +++ b/editor/editor.rc @@ -72,7 +72,7 @@ IDR_MENU MENU BEGIN POPUP "&File" BEGIN - MENUITEM "New\tCtrl+N", ID_FILE_NEW40015 + MENUITEM "New\tCtrl+N", ID_FILE_NEW MENUITEM "&Open\tCtrl+O", ID_FILE_OPEN MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE MENUITEM "Save &As", ID_FILE_SAVE_AS diff --git a/editor/syncdocument.cpp b/editor/syncdocument.cpp index 4410c16..fd6caa9 100644 --- a/editor/syncdocument.cpp +++ b/editor/syncdocument.cpp @@ -17,6 +17,9 @@ size_t SyncDocument::getTrackIndexFromPos(size_t track) const return trackIter->second; } +/* void SyncDocument::purgeUnused() +{ +} */ #import named_guids diff --git a/editor/syncdocument.h b/editor/syncdocument.h index 2ee16cb..4fd8110 100644 --- a/editor/syncdocument.h +++ b/editor/syncdocument.h @@ -264,6 +264,8 @@ public: size_t getTrackIndexFromPos(size_t track) const; +/* void purgeUnused(); */ + bool load(const std::string &fileName); bool save(const std::string &fileName); diff --git a/editor/synctracker2.cpp b/editor/synctracker2.cpp index 30a7980..6d209c7 100644 --- a/editor/synctracker2.cpp +++ b/editor/synctracker2.cpp @@ -126,8 +126,14 @@ bool fileNameValid = false; void fileNew() { +/* document.purgeUnused(); */ + trackView->selectAll(); + trackView->editDelete(); + trackView->selectNone(); + fileNameValid = false; -// fileNameValid = false; + document.clearUndoStack(); + document.clearRedoStack(); } void fileOpen() @@ -144,10 +150,13 @@ void fileOpen() ofn.Flags = OFN_SHOWHELP; if (GetOpenFileName(&ofn)) { + fileNew(); if (document.load(fileName)) { + document.clearUndoStack(); + document.clearRedoStack(); + fileNameValid = true; - InvalidateRect(trackViewWin, NULL, FALSE); } else MessageBox(trackViewWin, _T("failed to open file"), NULL, MB_OK | MB_ICONERROR | MB_SETFOREGROUND); } @@ -239,8 +248,14 @@ static LRESULT CALLBACK mainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA case WM_COMMAND: switch (LOWORD(wParam)) { + case ID_FILE_NEW: + fileNew(); + InvalidateRect(hwnd, NULL, FALSE); + break; + case ID_FILE_OPEN: fileOpen(); + InvalidateRect(hwnd, NULL, FALSE); break; case ID_FILE_SAVE_AS: diff --git a/editor/trackview.cpp b/editor/trackview.cpp index 9d656f0..699160e 100644 --- a/editor/trackview.cpp +++ b/editor/trackview.cpp @@ -747,12 +747,9 @@ void TrackView::editDelete() int selectRight = max(selectStartTrack, selectStopTrack); int selectTop = min(selectStartRow, selectStopRow); int selectBottom = max(selectStartRow, selectStopRow); - - if (selectRight >= int(document->getTrackCount())) - { - MessageBeep(0); - return; - } + + if (0 == document->getTrackCount()) return; + assert(selectRight < int(document->getTrackCount())); SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); for (int track = selectLeft; track <= selectRight; ++track) diff --git a/editor/trackview.h b/editor/trackview.h index d2e5cf7..4b3c8f9 100644 --- a/editor/trackview.h +++ b/editor/trackview.h @@ -27,11 +27,38 @@ public: void setRows(int rows); int getRows() const { return rows; } + + void editEnterValue(); + void editDelete(); + void editCopy(); + void editCut(); + void editPaste(); void editBiasValue(float amount); + void editToggleInterpolationType(); void setEditRow(int newEditRow); int getEditRow() { return editRow; } + void selectAll() + { + selectStartTrack = 0; + selectStopTrack = this->getTrackCount() - 1; + selectStartRow = 0; + selectStopRow = this->getRows() - 1; + + editTrack = 0; + editRow = 0; + + InvalidateRect(hwnd, NULL, FALSE); + } + + void selectNone() + { + selectStartTrack = selectStopTrack = editTrack; + selectStartRow = selectStopRow = editRow; + InvalidateRect(hwnd, NULL, FALSE); + } + private: // some nasty hackery to forward the window messages friend static LRESULT CALLBACK trackViewWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); @@ -46,13 +73,6 @@ private: LRESULT onKeyDown(UINT keyCode, UINT flags); LRESULT onChar(UINT keyCode, UINT flags); - void editEnterValue(); - void editDelete(); - void editCopy(); - void editCut(); - void editPaste(); - void editToggleInterpolationType(); - void paintTracks(HDC hdc, RECT rcTracks); void paintTopMargin(HDC hdc, RECT rcTracks); diff --git a/sync/data.h b/sync/data.h index 26606dc..d9300f4 100644 --- a/sync/data.h +++ b/sync/data.h @@ -35,7 +35,7 @@ namespace sync typedef std::map, size_t> TrackContainer; TrackContainer tracks; -// protected: + protected: std::vector actualTracks; }; } diff --git a/sync/device_client.cpp b/sync/device_client.cpp index 385e93a..91117eb 100644 --- a/sync/device_client.cpp +++ b/sync/device_client.cpp @@ -40,31 +40,21 @@ ClientDevice::~ClientDevice() Track &ClientDevice::getTrack(const std::string &trackName) { -/* const size_t oldCount = syncData.getTrackCount(); - Track &track = syncData.getTrack(trackName); - if (oldCount == syncData.getTrackCount()) return track; */ - sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName); if (iter != syncData.tracks.end()) return syncData.getTrack(iter->second); + // send request data unsigned char cmd = GET_TRACK; send(serverSocket, (char*)&cmd, 1, 0); - size_t clientIndex = syncData.getTrackCount(); send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0); - - // send request data size_t name_len = trackName.size(); send(serverSocket, (char*)&name_len, sizeof(size_t), 0); - const char *name_str = trackName.c_str(); send(serverSocket, name_str, int(name_len), 0); - sync::Track *track = new sync::Track(); - syncData.actualTracks.push_back(track); - syncData.tracks[trackName] = clientIndex; - return *track; -// return track; + // insert new track + return syncData.getTrack(trackName); } bool ClientDevice::update(float row)