Example #1
0
        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;
        }
Example #2
0
        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);
            }
        }
Example #3
0
        /// <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();
            }
        }
Example #4
0
        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));
            }
        }