added support for pre-connection editing

This commit is contained in:
Erik Faye-Lund 2008-02-18 23:57:50 +00:00
parent 74eee30216
commit ff614fbbb9
7 changed files with 104 additions and 45 deletions

View File

@ -9,6 +9,9 @@
#include <stack>
#include <list>
#import <msxml4.dll> named_guids
class SyncDocument : public sync::Data
{
public:
@ -31,6 +34,8 @@ public:
void sendDeleteKeyCommand(int track, int row)
{
if (INVALID_SOCKET == clientSocket) return;
if (clientRemap.count(track) == 0) return;
track = int(clientRemap[track]);
unsigned char cmd = DELETE_KEY;
send(clientSocket, (char*)&cmd, 1, 0);
@ -77,18 +82,19 @@ public:
virtual void exec(SyncDocument *data)
{
sync::Track &t = data->getTrack(this->track);
assert(!t.isKeyFrame(row));
t.setKeyFrame(row, key);
sync::Track *t = data->actualTracks[this->track];
assert(NULL != t);
assert(!t->isKeyFrame(row));
t->setKeyFrame(row, key);
data->sendSetKeyCommand(track, row, key); // update clients
}
virtual void undo(SyncDocument *data)
{
sync::Track &t = data->getTrack(this->track);
assert(t.isKeyFrame(row));
t.deleteKeyFrame(row);
sync::Track *t = data->actualTracks[this->track];
assert(NULL != t);
assert(t->isKeyFrame(row));
t->deleteKeyFrame(row);
data->sendDeleteKeyCommand(track, row); // update clients
}
@ -250,6 +256,53 @@ public:
return cmd;
}
void load(const std::string &fileName)
{
MSXML2::IXMLDOMDocumentPtr doc(MSXML2::CLSID_DOMDocument);
try
{
doc->load(fileName.c_str());
MSXML2::IXMLDOMNodeListPtr trackNodes = doc->documentElement->selectNodes("track");
for (int i = 0; i < trackNodes->Getlength(); ++i)
{
MSXML2::IXMLDOMNodePtr trackNode = trackNodes->Getitem(i);
MSXML2::IXMLDOMNamedNodeMapPtr attribs = trackNode->Getattributes();
std::string name = attribs->getNamedItem("name")->Gettext();
sync::Track &t = getTrack(name);
MSXML2::IXMLDOMNodeListPtr rowNodes = trackNode->GetchildNodes();
for (int i = 0; i < rowNodes->Getlength(); ++i)
{
MSXML2::IXMLDOMNodePtr keyNode = rowNodes->Getitem(i);
std::string baseName = keyNode->GetbaseName();
if (baseName == "key")
{
MSXML2::IXMLDOMNamedNodeMapPtr rowAttribs = keyNode->Getattributes();
std::string rowString = rowAttribs->getNamedItem("row")->Gettext();
std::string valueString = rowAttribs->getNamedItem("value")->Gettext();
std::string interpolationString = rowAttribs->getNamedItem("interpolation")->Gettext();
sync::Track::KeyFrame keyFrame(
float(atof(valueString.c_str())),
sync::Track::KeyFrame::InterpolationType(
atoi(interpolationString.c_str())
)
);
t.setKeyFrame(atoi(rowString.c_str()), keyFrame);
}
}
}
}
catch(_com_error &e)
{
char temp[256];
_snprintf(temp, 256, "Error loading: %s\n", (const char*)_bstr_t(e.Description()));
MessageBox(NULL, temp, NULL, MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
}
}
SOCKET clientSocket;
std::map<size_t, size_t> clientRemap;
bool clientPaused;

View File

@ -234,19 +234,6 @@ static ATOM registerMainWindowClass(HINSTANCE hInstance)
return RegisterClassEx(&wc);
}
SyncDocument loadDocument()
{
SyncDocument document;
for (int i = 0; i < 10; ++i)
{
std::string trackName = "balle";
// find track
const sync::Track &track = document.getTrack(trackName);
}
return document;
}
int _tmain(int argc, _TCHAR* argv[])
{
#ifdef _DEBUG
@ -258,6 +245,7 @@ int _tmain(int argc, _TCHAR* argv[])
#endif
HINSTANCE hInstance = GetModuleHandle(NULL);
CoInitialize(NULL);
#if 1
if (false == initNetwork())
@ -317,7 +305,6 @@ 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)
{
@ -326,15 +313,11 @@ int _tmain(int argc, _TCHAR* argv[])
}
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);
bool done = false;
SOCKET clientSocket = INVALID_SOCKET;
MSG msg;
@ -427,7 +410,6 @@ int _tmain(int argc, _TCHAR* argv[])
{
int newRow = 0;
int ret = recv(clientSocket, (char*)&newRow, sizeof(int), 0);
printf("new row: %d\n", newRow);
trackView->setEditRow(newRow);
}
break;

View File

@ -373,8 +373,9 @@ void TrackView::editCopy()
std::vector<struct CopyEntry> copyEntries;
for (int track = selectLeft; track <= selectRight; ++track)
{
int localTrack = track - selectLeft;
const sync::Track &t = document->getTrack(track);
const size_t trackIndex = document->getTrackIndexFromPos(track);
const sync::Track &t = document->getTrack(trackIndex);
for (int row = selectTop; row <= selectBottom; ++row)
{
int localRow = row - selectTop;
@ -384,7 +385,7 @@ void TrackView::editCopy()
assert(NULL != keyFrame);
CopyEntry ce;
ce.track = localTrack;
ce.track = int(trackIndex);
ce.row = localRow;
ce.keyFrame = *keyFrame;
@ -682,13 +683,14 @@ void TrackView::editEnterValue()
{
if (int(editString.size()) > 0 && editTrack < int(document->getTrackCount()))
{
sync::Track &t = document->getTrack(editTrack);
size_t trackIndex = document->getTrackIndexFromPos(editTrack);
sync::Track &t = document->getTrack(trackIndex);
sync::Track::KeyFrame newKey;
if (t.isKeyFrame(editRow)) newKey = *t.getKeyFrame(editRow); // copy old key
newKey.value = float(_tstof(editString.c_str())); // modify value
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(editTrack, editRow, newKey);
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), editRow, newKey);
document->exec(cmd);
editString.clear();
@ -702,7 +704,8 @@ void TrackView::editToggleInterpolationType()
{
if (editTrack < int(document->getTrackCount()))
{
sync::Track &t = document->getTrack(editTrack);
size_t trackIndex = document->getTrackIndexFromPos(editTrack);
sync::Track &t = document->getTrack(trackIndex);
// find key to modify
sync::Track::KeyFrameContainer::const_iterator upper = t.keyFrames.upper_bound(editRow);
@ -728,7 +731,7 @@ void TrackView::editToggleInterpolationType()
(int(newKey.interpolationType) + 1) % sync::Track::KeyFrame::IT_COUNT
);
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(editTrack, int(lower->first), newKey);
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), int(lower->first), newKey);
document->exec(cmd);
invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first));
@ -752,12 +755,14 @@ void TrackView::editDelete()
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
for (int track = selectLeft; track <= selectRight; ++track)
{
sync::Track &t = document->getTrack(track);
size_t trackIndex = document->getTrackIndexFromPos(track);
sync::Track &t = document->getTrack(trackIndex);
for (int row = selectTop; row <= selectBottom; ++row)
{
if (t.isKeyFrame(row))
{
SyncDocument::Command *cmd = new SyncDocument::DeleteCommand(track, row);
SyncDocument::Command *cmd = new SyncDocument::DeleteCommand(int(trackIndex), row);
multiCmd->addCommand(cmd);
}
}
@ -786,7 +791,9 @@ void TrackView::editBiasValue(float amount)
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
for (int track = selectLeft; track <= selectRight; ++track)
{
sync::Track &t = document->getTrack(track);
size_t trackIndex = document->getTrackIndexFromPos(track);
sync::Track &t = document->getTrack(trackIndex);
for (int row = selectTop; row <= selectBottom; ++row)
{
if (t.isKeyFrame(row))
@ -795,7 +802,7 @@ void TrackView::editBiasValue(float amount)
newKey.value += amount; // modify value
// add sub-command
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(track, row, newKey);
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), row, newKey);
multiCmd->addCommand(cmd);
}
}
@ -944,6 +951,10 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags)
case 's':
document->sendSaveCommand();
break;
case 'l':
document->load("test.xml");
break;
}
return FALSE;
}

View File

@ -9,7 +9,10 @@ using namespace sync;
size_t Data::getTrackIndex(const std::basic_string<TCHAR> &name)
{
TrackContainer::iterator iter = tracks.find(name);
if (iter != tracks.end()) return int(iter->second);
if (iter != tracks.end())
{
return iter->second;
}
size_t index = actualTracks.size();
tracks[name] = index;
@ -26,14 +29,16 @@ Track &Data::getTrack(const std::basic_string<TCHAR> &name)
return *actualTracks[index];
}
Track &Data::getTrack(size_t track)
size_t Data::getTrackIndexFromPos(size_t track)
{
assert(track >= 0);
assert(track < tracks.size());
sync::Data::TrackContainer::iterator trackIter = tracks.begin();
for (size_t currTrack = 0; currTrack < track; ++currTrack, ++trackIter);
return *actualTracks[trackIter->second];
assert(tracks.end() != trackIter);
return trackIter->second;
}
size_t Data::getTrackCount() const

View File

@ -22,7 +22,16 @@ namespace sync
public:
size_t getTrackIndex(const std::basic_string<TCHAR> &name);
Track &getTrack(const std::basic_string<TCHAR> &name);
Track &getTrack(size_t track);
size_t getTrackIndexFromPos(size_t track);
Track &getTrack(size_t track)
{
assert(track < actualTracks.size());
assert(NULL != actualTracks[track]);
return *actualTracks[track];
}
size_t getTrackCount() const;
// private:

View File

@ -47,6 +47,7 @@ Track &ClientDevice::getTrack(const std::string &trackName)
send(serverSocket, (char*)&cmd, 1, 0);
size_t clientIndex = syncData.actualTracks.size();
send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0);
// send request data
@ -91,11 +92,10 @@ bool ClientDevice::update(float row)
recv(serverSocket, (char*)&value, sizeof(float), 0);
recv(serverSocket, (char*)&interp, 1, 0);
assert(interp >= 0);
assert(interp < Track::KeyFrame::IT_COUNT);
sync::Track &t = syncData.getTrack(track);
sync::Track &t = *syncData.actualTracks[track];
t.setKeyFrame(row,
Track::KeyFrame(
value,

View File

@ -25,7 +25,6 @@ SOCKET clientConnect(SOCKET serverSocket)
{
SOCKET clientSocket = accept(serverSocket, NULL, NULL);
if (INVALID_SOCKET == clientSocket) return INVALID_SOCKET;
printf("%x\n", clientSocket);
const char *expectedGreeting = clientGreeting;
char recievedGreeting[128];