protected GraphFile(IEnumerable <GraphAndUI <NodeUIData> > nodes, IEnumerable <NodeGroup> groups, ReadOnlyCollection <LoadError> errors, INodeFactory nodeFactory, GenerateAudio generateAudio, Func <IDynamicEnumParameter, object, DynamicEnumParameter.Source> getDocumentSource, IAudioLibrary audioProvider) { Contract.Assert(getDocumentSource != null); m_nodeFactory = nodeFactory; m_generateAudio = generateAudio; m_getDocumentSource = a => getDocumentSource(a, this); m_audioProvider = audioProvider; m_nodes = new CallbackList <ConversationNode>(nodes.Select(gnu => nodeFactory.MakeNode(gnu.GraphData, gnu.UIData))); m_nodesLookup = new O1LookupWrapper <ConversationNode, Id <NodeTemp> >(m_nodes, n => n.Data.NodeId); m_nodesOrdered = new SortedWrapper <ConversationNode>(m_nodes); m_groups = new CallbackList <NodeGroup>(groups); m_groupsOrdered = new SortedWrapper <NodeGroup>(m_groups); m_errors = errors; IEnumerable <IDynamicEnumParameter> localDynamicEnumerationParameters = m_nodes.SelectMany(n => n.Data.Parameters.OfType <IDynamicEnumParameter>()); foreach (var ldep in localDynamicEnumerationParameters) { ldep.MergeInto(m_getDocumentSource(ldep)); } m_nodes.Inserting += M_nodes_Inserting; m_nodes.Inserted += M_nodes_Inserted; m_nodes.Removing += M_nodes_Removing; m_nodes.Clearing += M_nodes_Clearing; }
public static ConversationFile CreateEmpty(DirectoryInfo directory, Project project, INodeFactory nodeFactory, GenerateAudio generateAudio, Func <IDynamicEnumParameter, object, DynamicEnumParameter.Source> getDocumentSource, IAudioLibrary audioProvider, UpToDateFile.BackEnd backEnd, DirectoryInfo origin) { var file = GetAvailableConversationPath(directory, project.Elements); var nodes = Enumerable.Empty <GraphAndUI <NodeUIData> >(); var groups = new List <NodeGroup>(); //Fill the stream with the essential content using (MemoryStream m = new MemoryStream()) { using (FileStream stream = Util.LoadFileStream(file, FileMode.CreateNew, FileAccess.Write)) { project.ConversationSerializer.Write(SerializationUtils.MakeConversationData(nodes, new ConversationEditorData(groups)), m); m.Position = 0; m.CopyTo(stream); } var result = new ConversationFile(Id <FileInProject> .New(), nodes, groups, m, DocumentPath.FromPath(file, origin), project.ConversationSerializer, new ReadOnlyCollection <LoadError>(new LoadError[0]), nodeFactory, generateAudio, getDocumentSource, audioProvider, backEnd); result.m_file.Save(); //Make sure the file starts life as a valid xml document return(result); } }
/// <summary> /// /// </summary> /// <param name="nodes"></param> /// <param name="groups"></param> /// <param name="rawData">Represents the current contents of the file. Reference is not held. A copy is made.</param> /// <param name="file"></param> /// <param name="serializer"></param> /// <param name="errors"></param> /// <param name="nodeFactory"></param> /// <param name="generateAudio"></param> /// <param name="getDocumentSource"></param> /// <param name="audioProvider"></param> public ConversationFile(Id <FileInProject> id, IEnumerable <GraphAndUI <NodeUIData> > nodes, IEnumerable <NodeGroup> groups, MemoryStream rawData, DocumentPath file, ISerializer <TData> serializer, ReadOnlyCollection <LoadError> errors, INodeFactory nodeFactory, GenerateAudio generateAudio, Func <IDynamicEnumParameter, object, DynamicEnumParameter.Source> getDocumentSource, IAudioLibrary audioProvider, UpToDateFile.BackEnd backEnd) : base(nodes, groups, errors, nodeFactory, generateAudio, getDocumentSource, audioProvider) { Id = id; m_file = new SaveableFileUndoable(rawData, file.FileInfo, SaveTo, backEnd); m_serializer = serializer; foreach (var node in m_nodes) { //TODO: AUDIO: Why are we automatically decorrupting specifically audio parameters? var audios = node.Data.Parameters.OfType <IAudioParameter>(); foreach (var aud in audios) { if (aud.Corrupted) { var val = generateAudio(this); aud.SetValueAction(val).Value.Redo(); m_file.ChangeNoUndo(); audioProvider.UpdateUsage(val); } } node.UpdateRendererCorruption(); } }
public static IConversationFile Load(Id <FileInProject> file, DocumentPath path, INodeFactory nodeFactory, ISerializerDeserializer <TData> serializer, GenerateAudio generateAudio, Func <IDynamicEnumParameter, object, DynamicEnumParameter.Source> getDocumentSource, IAudioLibrary audioProvider, UpToDateFile.BackEnd backEnd) { try { using (var stream = Util.LoadFileStream(path.FileInfo, FileMode.Open, FileAccess.Read)) { using (MemoryStream m = new MemoryStream((int)stream.Length)) { stream.CopyTo(m); stream.Dispose(); m.Position = 0; TData data = serializer.Read(m); return(new ConversationFile(file, data.Nodes.ToList(), data.EditorData.Groups.ToList(), m, path, serializer, data.Errors, nodeFactory, generateAudio, getDocumentSource, audioProvider, backEnd)); } } } catch (MyFileLoadException e) { Console.Out.WriteLine(e.Message); Console.Out.WriteLine(e.StackTrace); Console.Out.WriteLine(e.InnerException.Message); Console.Out.WriteLine(e.InnerException.StackTrace); MessageBox.Show("File: " + path.AbsolutePath + " could not be accessed"); return(new MissingConversationFile(file, path)); } catch (DeserializerVersionMismatchException e) { MessageBox.Show("File: " + path.AbsolutePath + " could not be processed. " + e.Message); return(new MissingConversationFile(file, path)); } }