added support for pre-connection editing
This commit is contained in:
parent
74eee30216
commit
ff614fbbb9
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
11
sync/data.h
11
sync/data.h
@ -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:
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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];
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user