added support for pre-connection editing
This commit is contained in:
parent
74eee30216
commit
ff614fbbb9
@ -9,6 +9,9 @@
|
|||||||
#include <stack>
|
#include <stack>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
|
||||||
|
#import <msxml4.dll> named_guids
|
||||||
|
|
||||||
class SyncDocument : public sync::Data
|
class SyncDocument : public sync::Data
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -31,6 +34,8 @@ public:
|
|||||||
void sendDeleteKeyCommand(int track, int row)
|
void sendDeleteKeyCommand(int track, int row)
|
||||||
{
|
{
|
||||||
if (INVALID_SOCKET == clientSocket) return;
|
if (INVALID_SOCKET == clientSocket) return;
|
||||||
|
if (clientRemap.count(track) == 0) return;
|
||||||
|
track = int(clientRemap[track]);
|
||||||
|
|
||||||
unsigned char cmd = DELETE_KEY;
|
unsigned char cmd = DELETE_KEY;
|
||||||
send(clientSocket, (char*)&cmd, 1, 0);
|
send(clientSocket, (char*)&cmd, 1, 0);
|
||||||
@ -77,18 +82,19 @@ public:
|
|||||||
|
|
||||||
virtual void exec(SyncDocument *data)
|
virtual void exec(SyncDocument *data)
|
||||||
{
|
{
|
||||||
sync::Track &t = data->getTrack(this->track);
|
sync::Track *t = data->actualTracks[this->track];
|
||||||
assert(!t.isKeyFrame(row));
|
assert(NULL != t);
|
||||||
t.setKeyFrame(row, key);
|
assert(!t->isKeyFrame(row));
|
||||||
|
t->setKeyFrame(row, key);
|
||||||
data->sendSetKeyCommand(track, row, key); // update clients
|
data->sendSetKeyCommand(track, row, key); // update clients
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void undo(SyncDocument *data)
|
virtual void undo(SyncDocument *data)
|
||||||
{
|
{
|
||||||
sync::Track &t = data->getTrack(this->track);
|
sync::Track *t = data->actualTracks[this->track];
|
||||||
assert(t.isKeyFrame(row));
|
assert(NULL != t);
|
||||||
t.deleteKeyFrame(row);
|
assert(t->isKeyFrame(row));
|
||||||
|
t->deleteKeyFrame(row);
|
||||||
|
|
||||||
data->sendDeleteKeyCommand(track, row); // update clients
|
data->sendDeleteKeyCommand(track, row); // update clients
|
||||||
}
|
}
|
||||||
@ -249,6 +255,53 @@ public:
|
|||||||
else cmd = new InsertCommand(track, row, key);
|
else cmd = new InsertCommand(track, row, key);
|
||||||
return cmd;
|
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;
|
SOCKET clientSocket;
|
||||||
std::map<size_t, size_t> clientRemap;
|
std::map<size_t, size_t> clientRemap;
|
||||||
|
|||||||
@ -234,19 +234,6 @@ static ATOM registerMainWindowClass(HINSTANCE hInstance)
|
|||||||
return RegisterClassEx(&wc);
|
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[])
|
int _tmain(int argc, _TCHAR* argv[])
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -258,6 +245,7 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
HINSTANCE hInstance = GetModuleHandle(NULL);
|
HINSTANCE hInstance = GetModuleHandle(NULL);
|
||||||
|
CoInitialize(NULL);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (false == initNetwork())
|
if (false == initNetwork())
|
||||||
@ -317,7 +305,6 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
CW_USEDEFAULT, CW_USEDEFAULT, // width, height
|
CW_USEDEFAULT, CW_USEDEFAULT, // width, height
|
||||||
NULL, NULL, hInstance, NULL
|
NULL, NULL, hInstance, NULL
|
||||||
);
|
);
|
||||||
printf("main window: %p\n", hwnd);
|
|
||||||
|
|
||||||
if (NULL == hwnd)
|
if (NULL == hwnd)
|
||||||
{
|
{
|
||||||
@ -326,15 +313,11 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
HACCEL accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
|
HACCEL accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
|
||||||
printf("accel: %p\n", accel);
|
|
||||||
|
|
||||||
ShowWindow(hwnd, TRUE);
|
ShowWindow(hwnd, TRUE);
|
||||||
UpdateWindow(hwnd);
|
UpdateWindow(hwnd);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
||||||
printf("server socket %x\n", serverSocket);
|
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
SOCKET clientSocket = INVALID_SOCKET;
|
SOCKET clientSocket = INVALID_SOCKET;
|
||||||
MSG msg;
|
MSG msg;
|
||||||
@ -427,7 +410,6 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
{
|
{
|
||||||
int newRow = 0;
|
int newRow = 0;
|
||||||
int ret = recv(clientSocket, (char*)&newRow, sizeof(int), 0);
|
int ret = recv(clientSocket, (char*)&newRow, sizeof(int), 0);
|
||||||
printf("new row: %d\n", newRow);
|
|
||||||
trackView->setEditRow(newRow);
|
trackView->setEditRow(newRow);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -373,8 +373,9 @@ void TrackView::editCopy()
|
|||||||
std::vector<struct CopyEntry> copyEntries;
|
std::vector<struct CopyEntry> copyEntries;
|
||||||
for (int track = selectLeft; track <= selectRight; ++track)
|
for (int track = selectLeft; track <= selectRight; ++track)
|
||||||
{
|
{
|
||||||
int localTrack = track - selectLeft;
|
const size_t trackIndex = document->getTrackIndexFromPos(track);
|
||||||
const sync::Track &t = document->getTrack(track);
|
const sync::Track &t = document->getTrack(trackIndex);
|
||||||
|
|
||||||
for (int row = selectTop; row <= selectBottom; ++row)
|
for (int row = selectTop; row <= selectBottom; ++row)
|
||||||
{
|
{
|
||||||
int localRow = row - selectTop;
|
int localRow = row - selectTop;
|
||||||
@ -384,7 +385,7 @@ void TrackView::editCopy()
|
|||||||
assert(NULL != keyFrame);
|
assert(NULL != keyFrame);
|
||||||
|
|
||||||
CopyEntry ce;
|
CopyEntry ce;
|
||||||
ce.track = localTrack;
|
ce.track = int(trackIndex);
|
||||||
ce.row = localRow;
|
ce.row = localRow;
|
||||||
ce.keyFrame = *keyFrame;
|
ce.keyFrame = *keyFrame;
|
||||||
|
|
||||||
@ -682,13 +683,14 @@ void TrackView::editEnterValue()
|
|||||||
{
|
{
|
||||||
if (int(editString.size()) > 0 && editTrack < int(document->getTrackCount()))
|
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;
|
sync::Track::KeyFrame newKey;
|
||||||
if (t.isKeyFrame(editRow)) newKey = *t.getKeyFrame(editRow); // copy old key
|
if (t.isKeyFrame(editRow)) newKey = *t.getKeyFrame(editRow); // copy old key
|
||||||
newKey.value = float(_tstof(editString.c_str())); // modify value
|
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);
|
document->exec(cmd);
|
||||||
|
|
||||||
editString.clear();
|
editString.clear();
|
||||||
@ -702,7 +704,8 @@ void TrackView::editToggleInterpolationType()
|
|||||||
{
|
{
|
||||||
if (editTrack < int(document->getTrackCount()))
|
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
|
// find key to modify
|
||||||
sync::Track::KeyFrameContainer::const_iterator upper = t.keyFrames.upper_bound(editRow);
|
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
|
(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);
|
document->exec(cmd);
|
||||||
|
|
||||||
invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first));
|
invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first));
|
||||||
@ -752,12 +755,14 @@ void TrackView::editDelete()
|
|||||||
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
|
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
|
||||||
for (int track = selectLeft; track <= selectRight; ++track)
|
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)
|
for (int row = selectTop; row <= selectBottom; ++row)
|
||||||
{
|
{
|
||||||
if (t.isKeyFrame(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);
|
multiCmd->addCommand(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -786,7 +791,9 @@ void TrackView::editBiasValue(float amount)
|
|||||||
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
|
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
|
||||||
for (int track = selectLeft; track <= selectRight; ++track)
|
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)
|
for (int row = selectTop; row <= selectBottom; ++row)
|
||||||
{
|
{
|
||||||
if (t.isKeyFrame(row))
|
if (t.isKeyFrame(row))
|
||||||
@ -795,7 +802,7 @@ void TrackView::editBiasValue(float amount)
|
|||||||
newKey.value += amount; // modify value
|
newKey.value += amount; // modify value
|
||||||
|
|
||||||
// add sub-command
|
// add sub-command
|
||||||
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(track, row, newKey);
|
SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), row, newKey);
|
||||||
multiCmd->addCommand(cmd);
|
multiCmd->addCommand(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -944,6 +951,10 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags)
|
|||||||
case 's':
|
case 's':
|
||||||
document->sendSaveCommand();
|
document->sendSaveCommand();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
document->load("test.xml");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,10 @@ using namespace sync;
|
|||||||
size_t Data::getTrackIndex(const std::basic_string<TCHAR> &name)
|
size_t Data::getTrackIndex(const std::basic_string<TCHAR> &name)
|
||||||
{
|
{
|
||||||
TrackContainer::iterator iter = tracks.find(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();
|
size_t index = actualTracks.size();
|
||||||
tracks[name] = index;
|
tracks[name] = index;
|
||||||
@ -26,14 +29,16 @@ Track &Data::getTrack(const std::basic_string<TCHAR> &name)
|
|||||||
return *actualTracks[index];
|
return *actualTracks[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
Track &Data::getTrack(size_t track)
|
size_t Data::getTrackIndexFromPos(size_t track)
|
||||||
{
|
{
|
||||||
assert(track >= 0);
|
assert(track >= 0);
|
||||||
assert(track < tracks.size());
|
assert(track < tracks.size());
|
||||||
|
|
||||||
sync::Data::TrackContainer::iterator trackIter = tracks.begin();
|
sync::Data::TrackContainer::iterator trackIter = tracks.begin();
|
||||||
for (size_t currTrack = 0; currTrack < track; ++currTrack, ++trackIter);
|
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
|
size_t Data::getTrackCount() const
|
||||||
|
|||||||
11
sync/data.h
11
sync/data.h
@ -22,7 +22,16 @@ namespace sync
|
|||||||
public:
|
public:
|
||||||
size_t getTrackIndex(const std::basic_string<TCHAR> &name);
|
size_t getTrackIndex(const std::basic_string<TCHAR> &name);
|
||||||
Track &getTrack(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;
|
size_t getTrackCount() const;
|
||||||
|
|
||||||
// private:
|
// private:
|
||||||
|
|||||||
@ -42,11 +42,12 @@ Track &ClientDevice::getTrack(const std::string &trackName)
|
|||||||
{
|
{
|
||||||
sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName);
|
sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName);
|
||||||
if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second];
|
if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second];
|
||||||
|
|
||||||
unsigned char cmd = GET_TRACK;
|
unsigned char cmd = GET_TRACK;
|
||||||
send(serverSocket, (char*)&cmd, 1, 0);
|
send(serverSocket, (char*)&cmd, 1, 0);
|
||||||
|
|
||||||
size_t clientIndex = syncData.actualTracks.size();
|
size_t clientIndex = syncData.actualTracks.size();
|
||||||
|
|
||||||
send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0);
|
send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0);
|
||||||
|
|
||||||
// send request data
|
// send request data
|
||||||
@ -90,12 +91,11 @@ bool ClientDevice::update(float row)
|
|||||||
recv(serverSocket, (char*)&row, sizeof(int), 0);
|
recv(serverSocket, (char*)&row, sizeof(int), 0);
|
||||||
recv(serverSocket, (char*)&value, sizeof(float), 0);
|
recv(serverSocket, (char*)&value, sizeof(float), 0);
|
||||||
recv(serverSocket, (char*)&interp, 1, 0);
|
recv(serverSocket, (char*)&interp, 1, 0);
|
||||||
|
|
||||||
|
|
||||||
assert(interp >= 0);
|
assert(interp >= 0);
|
||||||
assert(interp < Track::KeyFrame::IT_COUNT);
|
assert(interp < Track::KeyFrame::IT_COUNT);
|
||||||
|
|
||||||
sync::Track &t = syncData.getTrack(track);
|
sync::Track &t = *syncData.actualTracks[track];
|
||||||
t.setKeyFrame(row,
|
t.setKeyFrame(row,
|
||||||
Track::KeyFrame(
|
Track::KeyFrame(
|
||||||
value,
|
value,
|
||||||
|
|||||||
@ -25,7 +25,6 @@ SOCKET clientConnect(SOCKET serverSocket)
|
|||||||
{
|
{
|
||||||
SOCKET clientSocket = accept(serverSocket, NULL, NULL);
|
SOCKET clientSocket = accept(serverSocket, NULL, NULL);
|
||||||
if (INVALID_SOCKET == clientSocket) return INVALID_SOCKET;
|
if (INVALID_SOCKET == clientSocket) return INVALID_SOCKET;
|
||||||
printf("%x\n", clientSocket);
|
|
||||||
|
|
||||||
const char *expectedGreeting = clientGreeting;
|
const char *expectedGreeting = clientGreeting;
|
||||||
char recievedGreeting[128];
|
char recievedGreeting[128];
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user