From 1eb06de6449bb040bc77e2083c4927f9f5cd8c84 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Tue, 14 Oct 2008 23:49:52 +0000 Subject: [PATCH] rows as a document property --- editor/syncdocument.cpp | 31 ++++++++++++++++++++++--------- editor/syncdocument.h | 8 ++++++-- editor/trackview.cpp | 18 +++++++++--------- editor/trackview.h | 7 +++++-- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/editor/syncdocument.cpp b/editor/syncdocument.cpp index 5935f27..b00a48f 100644 --- a/editor/syncdocument.cpp +++ b/editor/syncdocument.cpp @@ -16,6 +16,14 @@ bool SyncDocument::load(const std::string &fileName) SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); doc->load(fileName.c_str()); + MSXML2::IXMLDOMNamedNodeMapPtr attribs = doc->documentElement->Getattributes(); + MSXML2::IXMLDOMNodePtr rowsParam = attribs->getNamedItem("rows"); + if (NULL != rowsParam) + { + std::string rowsString = rowsParam->Gettext(); + this->setRows(atoi(rowsString.c_str())); + } + MSXML2::IXMLDOMNodeListPtr trackNodes = doc->documentElement->selectNodes("track"); for (int i = 0; i < trackNodes->Getlength(); ++i) { @@ -76,9 +84,13 @@ bool SyncDocument::save(const std::string &fileName) MSXML2::IXMLDOMDocumentPtr doc(MSXML2::CLSID_DOMDocument); try { + char temp[256]; _variant_t varNodeType((short)MSXML2::NODE_ELEMENT); - MSXML2::IXMLDOMNodePtr rootNode = doc->createNode(varNodeType, _T("tracks"), _T("")); + MSXML2::IXMLDOMElementPtr rootNode = doc->createElement(_T("tracks")); doc->appendChild(rootNode); + + _snprintf(temp, 256, "%d", getRows()); + rootNode->setAttribute(_T("rows"), temp); for (size_t i = 0; i < getTrackCount(); ++i) { @@ -87,36 +99,37 @@ bool SyncDocument::save(const std::string &fileName) MSXML2::IXMLDOMElementPtr trackElem = doc->createElement(_T("track")); trackElem->setAttribute(_T("name"), track.getName().c_str()); - rootNode->appendChild(doc->createTextNode("\n\t")); + rootNode->appendChild(doc->createTextNode(_T("\n\t"))); rootNode->appendChild(trackElem); sync::Track::KeyFrameContainer::const_iterator it; for (it = track.keyFrames.begin(); it != track.keyFrames.end(); ++it) { - char temp[256]; size_t row = it->first; float value = it->second.value; char interpolationType = char(it->second.interpolationType); MSXML2::IXMLDOMElementPtr keyElem = doc->createElement(_T("key")); - _snprintf(temp, 256, "%d", row); + _snprintf(temp, 256, _T("%d"), row); keyElem->setAttribute(_T("row"), temp); - _snprintf(temp, 256, "%f", value); + _snprintf(temp, 256, _T("%f"), value); keyElem->setAttribute(_T("value"), temp); - _snprintf(temp, 256, "%d", interpolationType); + _snprintf(temp, 256, _T("%d"), interpolationType); keyElem->setAttribute(_T("interpolation"), temp); - trackElem->appendChild(doc->createTextNode("\n\t\t")); + trackElem->appendChild(doc->createTextNode(_T("\n\t\t"))); trackElem->appendChild(keyElem); } - if (0 != track.keyFrames.size()) trackElem->appendChild(doc->createTextNode("\n\t")); + if (0 != track.keyFrames.size()) trackElem->appendChild(doc->createTextNode(_T("\n\t"))); } - if (0 != getTrackCount()) rootNode->appendChild(doc->createTextNode("\n")); + if (0 != getTrackCount()) rootNode->appendChild(doc->createTextNode(_T("\n"))); doc->save(fileName.c_str()); + doc->Release(); + savePointDelta = 0; savePointUnreachable = false; } diff --git a/editor/syncdocument.h b/editor/syncdocument.h index feea0eb..3304f28 100644 --- a/editor/syncdocument.h +++ b/editor/syncdocument.h @@ -15,7 +15,7 @@ class SyncDocument : public sync::Data { public: - SyncDocument() : sync::Data(), clientPaused(true), savePointDelta(0), savePointUnreachable(true) {} + SyncDocument() : sync::Data(), clientPaused(true), rows(128), savePointDelta(0), savePointUnreachable(true) {} ~SyncDocument(); size_t createTrack(const std::basic_string &name) @@ -313,10 +313,14 @@ public: NetworkSocket clientSocket; std::map clientRemap; bool clientPaused; + + size_t getRows() const { return rows; } + void setRows(size_t rows) { this->rows = rows; } private: std::vector trackOrder; - + size_t rows; + // undo / redo functionality std::stack undoStack; std::stack redoStack; diff --git a/editor/trackview.cpp b/editor/trackview.cpp index 828614e..7045dbb 100644 --- a/editor/trackview.cpp +++ b/editor/trackview.cpp @@ -38,7 +38,6 @@ TrackView::TrackView() editRow = 0; editTrack = 0; - rows = 0x80; selectStartTrack = selectStopTrack = 0; selectStartRow = selectStopRow = 0; @@ -183,9 +182,10 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) int firstRow = editRow - windowRows / 2 - 1; int lastRow = editRow + windowRows / 2 + 1; + /* clamp first & last row */ - firstRow = min(max(firstRow, 0), int(rows) - 1); - lastRow = min(max(lastRow, 0), int(rows) - 1); + firstRow = min(max(firstRow, 0), int(getRows()) - 1); + lastRow = min(max(lastRow, 0), int(getRows()) - 1); SetBkMode(hdc, TRANSPARENT); paintTopMargin(hdc, rcTracks); @@ -331,7 +331,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) { RECT rightMargin; rightMargin.top = getScreenY(0); - rightMargin.bottom = getScreenY(rows); + rightMargin.bottom = getScreenY(getRows()); rightMargin.left = getScreenX(getTrackCount()); rightMargin.right = rcTracks.right; FillRect( hdc, &rightMargin, GetSysColorBrush(COLOR_APPWORKSPACE)); @@ -339,7 +339,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) { RECT bottomPadding; - bottomPadding.top = getScreenY(rows); + bottomPadding.top = getScreenY(getRows()); bottomPadding.bottom = rcTracks.bottom; bottomPadding.left = rcTracks.left; bottomPadding.right = rcTracks.right; @@ -512,7 +512,7 @@ void TrackView::setupScrollBars() si.nPos = editRow; si.nPage = windowRows; si.nMin = 0; - si.nMax = rows - 1 + windowRows - 1; + si.nMax = getRows() - 1 + windowRows - 1; SetScrollInfo(hwnd, SB_VERT, &si, TRUE); si.fMask = SIF_POS | SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL; @@ -571,7 +571,7 @@ void TrackView::setEditRow(int newEditRow) editRow = newEditRow; // clamp to document - editRow = min(max(editRow, 0), int(rows) - 1); + editRow = min(max(editRow, 0), int(getRows()) - 1); if (oldEditRow != editRow) { @@ -649,7 +649,7 @@ static int getScrollPos(HWND hwnd, int bar) void TrackView::setRows(size_t rows) { - this->rows = rows; + document->setRows(rows); InvalidateRect(getWin(), NULL, FALSE); setEditRow(min(editRow, int(rows) - 1)); } @@ -980,7 +980,7 @@ LRESULT TrackView::onKeyDown(UINT keyCode, UINT /*flags*/) case VK_END: if (GetKeyState(VK_CONTROL) < 0) setEditTrack(int(getTrackCount()) - 1); - else setEditRow(rows - 1); + else setEditRow(int(getRows()) - 1); break; } } diff --git a/editor/trackview.h b/editor/trackview.h index c2d0337..c95994c 100644 --- a/editor/trackview.h +++ b/editor/trackview.h @@ -27,7 +27,11 @@ public: SyncDocument *getDocument() { return document; } void setRows(size_t rows); - int getRows() const { return rows; } + int getRows() const + { + if (NULL == document) return 0; + return document->getRows(); + } void editEnterValue(); void editDelete(); @@ -165,7 +169,6 @@ private: HWND hwnd; UINT clipboardFormat; - size_t rows; }; ATOM registerTrackViewWindowClass(HINSTANCE hInstance);