示例#1
0
文件: Fbx.cs 项目: kkdevs/sb3u
            public void ConvertAnimation(odfANIMSection anim, odfParser odaParser, bool odaSkeleton)
            {
                if (odaSkeleton)
                {
                    FrameList.Clear();
                    ConvertFrames(odaParser.FrameSection.RootFrame);
                }

                ImportedKeyframedAnimation iAnim = new ImportedKeyframedAnimation();

                AnimationList.Add(iAnim);
                iAnim.TrackList = new List <ImportedAnimationKeyframedTrack>(anim.Count);
                string notFound = String.Empty;

                foreach (odfTrack track in anim)
                {
                    odfFrame boneFrame = odf.FindFrame(track.BoneFrameId, odaParser.FrameSection.RootFrame);
                    if (boneFrame == null)
                    {
                        notFound += (notFound.Length > 0 ? ", " : "") + track.BoneFrameId;
                        continue;
                    }

                    ImportedAnimationKeyframedTrack iTrack = new ImportedAnimationKeyframedTrack();
                    iAnim.TrackList.Add(iTrack);
                    iTrack.Name      = boneFrame.Name;
                    iTrack.Keyframes = ConvertTrack(track.KeyframeList);
                }
                if (notFound.Length > 0)
                {
                    Report.ReportLog("Warning: Animations weren't converted for the following missing frame IDs: " + notFound);
                }
            }
示例#2
0
        /// <summary>
        /// Handles the <see cref="ButtonBase.Click"/> event for the "Remove Frame" <see
        /// cref="Button"/>.</summary>
        /// <param name="sender">
        /// The <see cref="Object"/> where the event handler is attached.</param>
        /// <param name="args">
        /// A <see cref="RoutedEventArgs"/> object containing event data.</param>
        /// <remarks>
        /// <b>OnFrameRemove</b> removes the selected item from the "Image Frames" list box and sets
        /// the <see cref="DataChanged"/> flag.</remarks>

        private void OnFrameRemove(object sender, RoutedEventArgs args)
        {
            args.Handled = true;

            // cannot remove last item in list box
            if (FrameList.Items.Count < 2)
            {
                return;
            }

            // remove selected item
            int index = FrameList.SelectedIndex;

            if (index < 0)
            {
                return;
            }
            FrameList.Items.RemoveAt(index);

            // select next or last item in list box
            FrameList.SelectAndShow(Math.Min(index, FrameList.Items.Count - 1));

            // disable Remove if only one item left
            RemoveFrameButton.IsEnabled = (FrameList.Items.Count > 1);

            // frame list has changed
            DataChanged = true;
        }
示例#3
0
        /// <summary>
        /// Replace the geometries in the scene with the ones contained in the given Assimp scene.
        /// </summary>
        /// <param name="scene"></param>
        public void ReplaceGeometries(Assimp.Scene scene)
        {
            var skinToBoneMatrices = ComputeSkinToBoneMatrices(scene);

            GeometryList.Clear();
            Atomics.Clear();

            for (var i = 0; i < scene.Meshes.Count; i++)
            {
                var assimpMesh = scene.Meshes[i];

                var rootNode = FindMeshRootNode(scene.RootNode, i) ?? scene.RootNode;
                TransformMeshVertices(assimpMesh, rootNode);

                var geometryNode = new RwGeometryNode(this, assimpMesh, scene.Materials[assimpMesh.MaterialIndex], FrameList, skinToBoneMatrices, out bool singleWeight);
                GeometryList.Add(geometryNode);

                var atomicNode = new RwAtomicNode(this, 0, i, 5);
                if (singleWeight)
                {
                    if (assimpMesh.Bones.Count != 0)
                    {
                        atomicNode.FrameIndex = FrameList.GetFrameIndexByName(assimpMesh.Bones[0].Name);
                    }
                    else if (rootNode != null)
                    {
                        atomicNode.FrameIndex = FrameList.GetFrameIndexByName(rootNode.Name);
                    }
                }

                Atomics.Add(atomicNode);
            }

            mStructNode = new RwClumpStructNode(this);
        }
        private void CaptureCurrentFrame(MediaPlayer player)
        {
            var frame = GenerateFrame(player);

            #region Scaling

            if (Scale <= 0)
            {
                var bit = frame as BitmapFrame;

                if (bit != null)
                {
                    FrameList.Add(bit);
                }
            }

            var thumbnailFrame = BitmapFrame.Create(new TransformedBitmap(frame as BitmapSource, new ScaleTransform(Scale, Scale))).GetCurrentValueAsFrozen();

            var thumbBit = thumbnailFrame as BitmapFrame;

            if (thumbBit != null)
            {
                FrameList.Add(thumbBit);
            }

            #endregion

            SeekNextFrame();

            GC.Collect();
        }
示例#5
0
 private void FrameMessage(string InputString)
 {
     /* According to the ASTM E1381-95 standard, frames longer than 240 characters
      *  -- 247 characters including frame overhead (<STX>[FrameNumber]...<ETX>[Checksum]<CR><LF>) --
      *  are sent as one or more intermediate frames followed by an end frame.
      *  Shorter messages are sent as a single end frame.
      *  Intermediate frames use <ETB> in place of <ETX> to indicate that it is continued
      *  in the next frame.
      *  This procedure splits long frames into intermediate frames if necessary
      *  before appending the checksum and <CR><LF> and adding the frame to the message FrameList.
      *  CLSI-LIS1-A increased this frame size to 64,000 including frame overhead.
      *  The use_legacy_frame_size setting in config.yml is used to specify which size to use.
      */
     if (InputString.Length > frameSize + 3)                                 // <STX> + FrameNumber + frame + <ETX>
     {
         string firstString       = InputString.Substring(0, frameSize + 2); // +2 to make room for the <ETB>
         int    firstStringLength = firstString.Length;
         int    iLength           = InputString.Length - firstStringLength;
         firstString += Constants.ETB;
         firstString += ServiceMain.CHKSum(firstString);
         firstString += Constants.CR + Constants.LF;
         string nextString = InputString.Substring(firstStringLength, iLength); // The remainder of the string
         FrameList.Add(firstString);                                            // Add intermediate frame to list           // is passed to this function recursively
         FrameMessage(nextString);                                              // to be added as its own frame(s)
     }
     else
     {
         InputString += ServiceMain.CHKSum(InputString) + Constants.CR + Constants.LF; // Tag on the checksum and <CR><LF>
         FrameList.Add(InputString);                                                   // Add the end frame
     }
 }
        /// <summary>
        /// Creates frames for each object list for each transmitter
        /// </summary>
        public void CreateFramesForTransmitters()
        {
            //Only create frames for transmitters that are ready to transmit
            var transmitters = _transmitters.Where(transmitter => transmitter.Listener.CanTransmit).ToList();

            //Create a frame list for each transmitter
            var frameListList = new FrameList[transmitters.Count];

            for (var i = 0; i < transmitters.Count; ++i)
            {
                frameListList[i] = new FrameList();
            }

            //For each object list, create a frame for each transmitter
            //This ensures that each list is fully processed, allowing us to inform listeners without having to repeatedly signal begin/end
            foreach (var objectList in _objectLists)
            {
                for (var i = 0; i < transmitters.Count; ++i)
                {
                    var transmitter = transmitters[i];
                    var frameList   = frameListList[i];

                    frameList.AddFrame(CreateFrame(transmitter, objectList));
                }

                objectList.PostFramesCreated();
            }

            for (var i = 0; i < transmitters.Count; ++i)
            {
                transmitters[i].AddList(frameListList[i]);
            }
        }
示例#7
0
        private void InitWithGameObject(GameObject m_GameObject)
        {
            assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform);
            var rootTransform = m_Transform;
            var frameList     = new List <ImportedFrame>();

            while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father))
            {
                frameList.Add(ConvertFrames(m_Father));
                rootTransform = m_Father;
            }
            if (frameList.Count > 0)
            {
                FrameList.Add(frameList[frameList.Count - 1]);
                for (var i = frameList.Count - 2; i >= 0; i--)
                {
                    var frame  = frameList[i];
                    var parent = frameList[i + 1];
                    parent.AddChild(frame);
                }
                ConvertFrames(m_Transform, frameList[0]);
            }
            else
            {
                ConvertFrames(m_Transform, null);
            }

            CreateBonePathHash(rootTransform);
            ConvertMeshRenderer(m_Transform);
        }
示例#8
0
        public void AddPerforation()
        {
            if (IsPerforationAdded_)
            {
                return;
            }

            CatchExceptionsByMessageCenter(() => {
                TFCOM.TFPerforatorList perfoList = GetPerfoList();

                perfoList.SetSweepMode(
                    TFCOM.TFdPerforatorSweepMode.tfdPerforatorSweepModeBi);
                //perfoList.SetSenseDist(1.01 * length / 2);
                perfoList.SetPolicy(
                    TFCOM.TFdPerforatorPolicy.tfdPerforatorPolicyThroughHoleWithinSenseDist);
                perfoList.SetIsVisible(false);

                FrameList.AsTFFrame.SetPerforatorList(perfoList);
                FrameList.AsTFFrame.SetSenseDistance2(GetPerfoSenseDistance());
                FrameList.AsTFFrame.SetPerforatorsAreActive(true);
                FrameList.Synchronize(string.Empty);

                FrameList.ApplyPerforatorInModel();

                IsPerforationAdded_ = true;
            });
        }
示例#9
0
    public override void Save()
    {
        //List is copied so we can replace it with a list more suited for saving, then reinstate the old one
        var listcopy = new List <ObjectWithName>(FrameList);

        FrameList.Clear();
        if (SingleSaveFile)
        {
            FrameList.Add(new ObjectWithName(true, "SingleSave"));
            foreach (WekitPlayer_Base player in ActiveWekitPlayers)
            {
                FrameList.Add(new ObjectWithName(player.GetListAsObject(), player.PlayerName));
            }
        }

        base.Save();

        FrameList = listcopy;
        if (SingleSaveFile)
        {
            return;
        }
        foreach (WekitPlayer_Base player in ActiveWekitPlayers)
        {
            player.UseZip             = UseZip;
            player.UseCompoundArchive = UseCompoundArchive;
            player.CompoundZipName    = CompoundZipName;
            player.FileName           = FileName;
            player.Save();
        }
    }
示例#10
0
        private void InitWithGameObject(GameObject m_GameObject, Dictionary <string, int> sharedFileIndex, List <AssetsFile> assetsfileList, Dictionary <string, EndianBinaryReader> resourceFileReaders)
        {
            assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform);
            var rootTransform = m_Transform;
            var frameList     = new List <ImportedFrame>();

            while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father))
            {
                frameList.Add(ConvertFrames(m_Father));
                rootTransform = m_Father;
            }
            if (frameList.Count > 0)
            {
                FrameList.Add(frameList[frameList.Count - 1]);
                for (var i = frameList.Count - 2; i >= 0; i--)
                {
                    var frame  = frameList[i];
                    var parent = frameList[i + 1];
                    parent.AddChild(frame);
                }
                ConvertFrames(m_Transform, frameList[0]);
            }
            else
            {
                ConvertFrames(m_Transform, null);
            }

            CreateBonePathHash(rootTransform);
            ConvertMeshRenderer(m_Transform, sharedFileIndex, assetsfileList, resourceFileReaders);
        }
示例#11
0
        protected void SendStepAll(object sender, ElapsedEventArgs e)
        {
            if (ClientPool.ActiveCount <= 0)
            {
                if (FrameList.Count > 0)
                {
                    ServerLog.LogServer("所有客户端退出游戏 战斗结束!!!", 1);
                    FrameList.Clear();
                }
                return;
            }

            if (FrameList.Count == 0)
            {
                ServerLog.LogServer("玩家进入服务器 战斗开始!!!", 1);
            }
            ServerLog.LogServer("0[" + FrameList.Count + "]", 1);

            byte[][]     temp     = StepMessage;
            int          length   = temp.Length;
            ProtocolBase protocol = new ByteProtocol();

            protocol.push((byte)MessageType.Frame);
            protocol.push((byte)length);
            //ServerLog.LogServer("获取[" + FrameList.Count + "]", 1);
            for (int i = 0; i < length; i++)
            {
                protocol.push(temp[i] != null);
                protocol.push(temp[i]);
            }
            if (FrameList.Count == 0)
            {
                protocol.push((byte)MessageType.RandomSeed);
                Random rand = new Random();
                protocol.push(rand.Next(10000));
            }
            protocol.push((byte)MessageType.end);
            ServerLog.LogServer("生成帧信息[" + length + "]", 1);
            byte[] temp2 = protocol.GetByteStream();

            FrameList.Add(temp2);

            ClientPool.Foreach((con) => { SendToClient(con.clientId, temp2);
                                          if (!con.ActiveCheck())
                                          {
                                              ServerLog.LogClient("客户端断线 中止连接:" + ClientPool[con.clientId].socket.LocalEndPoint + "ClientID:" + con.clientId, 0, con.clientId);

                                              con.socket.Close();
                                              ClientPool.Recover(con.clientId);
                                          }
                               });

            ServerLog.LogServer("帧同步[" + FrameList.Count + "]", 2);
            //StepMessage = new byte[ClientPool.Count][];
            //for (int i = 0; i < StepMessage.Length; i++)
            //{
            //    StepMessage[i] = new byte[framSize];
            //}
        }
示例#12
0
        void InitThreadList(FrameGroup group)
        {
            List <ThreadRow> rows = new List <ThreadRow>();

            if (group != null)
            {
                rows.Add(new HeaderThreadRow(group)
                {
                    GradientTop    = (ThreadViewControl.OptickAlternativeBackground as SolidColorBrush).Color,
                    GradientBottom = (ThreadViewControl.OptickBackground as SolidColorBrush).Color,
                    TextColor      = Colors.Gray,
                    Header         = new ThreadFilterView(),
                });

                ChartRow cpuCoreChart = GenerateCoreChart(group);
                if (cpuCoreChart != null)
                {
                    cpuCoreChart.IsExpanded     = false;
                    cpuCoreChart.ExpandChanged += CpuCoreChart_ExpandChanged;
                    cpuCoreChart.ChartHover    += Row_ChartHover;
                    rows.Add(cpuCoreChart);
                }

                List <EventsThreadRow> threadRows = GenerateThreadRows(group);
                foreach (EventsThreadRow row in threadRows)
                {
                    if (row.Description.Origin == ThreadDescription.Source.Core)
                    {
                        row.IsVisible = false;
                        coreRows.Add(row);
                    }
                }
                rows.AddRange(threadRows);
            }

            ThreadViewControl.InitRows(rows, group != null ? group.Board.TimeSlice : null);

            List <ITick> frames = null;

            if (Group != null && Group.Frames != null && Group.Frames[FrameList.Type.CPU] != null)
            {
                FrameList list = Group.Frames[FrameList.Type.CPU];
                frames = list.Events.ConvertAll(frame => frame as ITick);
            }
            else if (Group != null)
            {
                frames = new List <ITick>();
                long step = Durable.MsToTick(1000.0);
                for (long timestamp = Group.Board.TimeSlice.Start; timestamp < Group.Board.TimeSlice.Finish; timestamp += step)
                {
                    frames.Add(new Tick()
                    {
                        Start = timestamp
                    });
                }
            }

            ThreadViewControl.InitForegroundLines(frames);
        }
示例#13
0
 /// <summary>
 /// Gets rectangle of the sprite, and the duration of the frame, creates new frame in animation
 /// </summary>
 public void AddFrame(Rectangle rectangle, TimeSpan duration)
 {
     FrameList.Add(new Frame()
     {
         Rectangle = rectangle,
         Duration  = duration
     });
 }
示例#14
0
 /// <summary>
 /// Gets rectangle of the sprite, and the duration of the frame, creates new frame in animation
 /// </summary>
 public void AddFrame(Rectangle source, TimeSpan duration)
 {
     FrameList.Add(new AFrame()
     {
         Source   = source,
         Duration = duration
     });
 }
示例#15
0
 /// <summary>
 /// Disposes of the data stored by this TextureAtlas
 /// </summary>
 public void Dispose()
 {
     // Clear the lists
     FrameList.Clear();
     BoundsList.Clear();
     OriginsList.Clear();
     ReuseCount.Clear();
 }
示例#16
0
 protected void SendToClientAllFrame(int clientId)
 {
     byte[][] list = FrameList.ToArray();
     ServerLog.LogClient("中途加入 发送历史帧:" + list.Length, 3, clientId);
     foreach (var item in list)
     {
         SendToClient(clientId, item);
     }
 }
        internal void AddList(FrameList list)
        {
            if (list == null)
            {
                throw new ArgumentNullException(nameof(list));
            }

            _frameListLists.Add(list);
        }
示例#18
0
        protected void SaveFrameList()
        {
            var frameList = FrameList.Select(item =>
                                             String.Format("{0}{1}{2}{1}{3}{1}{4}{1}{5}{1}{6}", item.Number, TSharkHelper.OUTPUT_SEPARATOR,
                                                           item.SourceMac, item.DestinationMac,
                                                           item.SourceIp, item.DestinationIp, item.Protocol));

            File.WriteAllLines(GetFrameListFilename(), frameList);
        }
示例#19
0
 public void PrepareToSend()
 {
     if (isReady)
     {
         return;
     }
     // The header fields should already have been set to define the MessageHeader string.
     if (MessageHeader.Length == 0)
     {
         throw new InvalidOperationException("Missing MessageHeader string.");
     }
     FrameList.Clear();
     FrameMessage(MessageHeader);
     // Then process each patient and their orders, incrementing the frame number with each record.
     if (Patients.Count > 0)
     {
         int pCount = 0;
         foreach (var patient in Patients)
         {
             pCount += 1;
             patient.Elements["FrameNumber"] = IncrementFrameCount().ToString();
             // Assign proper Sequence Number to each patient.
             patient.Elements["SequenceNumber"] = pCount.ToString();
             // Add the patient message to the FrameList.
             FrameMessage(patient.PatientMessage);
             // Do the same for each order message.
             int oCount = 0;
             foreach (var order in patient.Orders)
             {
                 oCount += 1;
                 order.Elements["FrameNumber"] = IncrementFrameCount().ToString();
                 // Assign proper Sequence Number to each order.
                 order.Elements["SequenceNumber"] = oCount.ToString();
                 FrameMessage(order.OrderMessage);
                 // If there are any result messages for the order, prepare those, too.
                 int rCount = 0;
                 foreach (var result in order.Results)
                 {
                     rCount += 1;
                     result.Elements["FrameNumber"] = IncrementFrameCount().ToString();
                     // Assign proper Sequence Number to each order.
                     result.Elements["SequenceNumber"] = rCount.ToString();
                     FrameMessage(result.ResultMessage);
                 }
             }
         }
     }
     // Finally, don't forget the Terminator message.
     if (Terminator < 'E')
     {
         Terminator = 'N';
     }
     TerminationMessage = Constants.STX + IncrementFrameCount().ToString() + "L|1|" + Terminator + Constants.CR + Constants.ETX;
     FrameMessage(TerminationMessage);
     isReady = true;
 }
示例#20
0
        public void Roll(int knockedPins)
        {
            var lastFrame = GetLastFrame();

            //Frame first roll
            if (lastFrame.KnockedPins.Count == 0)
            {
                lastFrame.KnockedPins.Add(knockedPins);
                return;
            }

            //frame second roll
            if (lastFrame.FrameIndex == 9)
            {
                if (lastFrame.KnockedPins.Count < 2)
                {
                    lastFrame.KnockedPins.Add(knockedPins);
                    return;
                }
                else if (lastFrame.KnockedPins.Count == 2)
                {
                    if (lastFrame.KnockedPins[0] == 10 ||
                        lastFrame.KnockedPins[1] == 10 ||
                        (lastFrame.KnockedPins[0] + lastFrame.KnockedPins[1]) == 10)
                    {
                        lastFrame.KnockedPins.Add(knockedPins);
                        return;
                    }
                }
                else
                {
                    throw new Exception("Game Over");
                }
            }
            else
            {
                if (lastFrame.KnockedPins[0] == 10)
                {
                    var newFrame = new Frame();
                    newFrame.FrameIndex = lastFrame.FrameIndex + 1;
                    newFrame.KnockedPins.Add(knockedPins);
                    FrameList.Add(newFrame);
                }
                else if (lastFrame.KnockedPins.Count >= 2)
                {
                    var newFrame = new Frame();
                    newFrame.FrameIndex = lastFrame.FrameIndex + 1;
                    newFrame.KnockedPins.Add(knockedPins);
                    FrameList.Add(newFrame);
                }
                else
                {
                    lastFrame.KnockedPins.Add(knockedPins);
                }
            }
        }
示例#21
0
        public FrameList AddNewGame()
        {
            var game = new FrameList();

            this.games.Add(game);

            SaveLogs();

            return(game);
        }
示例#22
0
 private Frame GetLastFrame()
 {
     if (FrameList.Count == 0)
     {
         FrameList.Add(new Frame {
             FrameIndex = 0
         });
     }
     return(FrameList[FrameList.Count - 1]);
 }
示例#23
0
        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            _cancelled = true;

            FrameList?.Clear();

            GC.Collect();

            DialogResult = false;
        }
示例#24
0
        /// <summary>
        /// Selects the <see cref="ImageListBox"/> item on the <see cref="FrameTab"/> page indicated
        /// by the <see cref="EntityTemplate.FrameOffset"/> of the edited <see
        /// cref="EntityTemplate"/>.</summary>
        /// <remarks>
        /// <b>SelectFrameOffset</b> does nothing if the <see cref="ImageListBox"/> is empty, and
        /// otherwise restricts the <b>FrameOffset</b> to a legal item index.</remarks>

        private void SelectFrameOffset()
        {
            int count = FrameList.Items.Count;

            if (count > 0)
            {
                int offset = this._template.FrameOffset;
                FrameList.SelectAndShow(Math.Max(0, Math.Min(count, offset)));
            }
        }
示例#25
0
        private void SelectedInnerFileChanged(object sender, EventArgs e)
        {
            RefreshFrameList();

            // Select first frame
            if (FrameList.Count > 0)
            {
                FrameList.MoveCurrentToFirst();
            }
        }
示例#26
0
            public void UnParseFrames(Stream s)
            {
                uint width = GetWidthForChannelType(channelType);

                if (frames == null)
                {
                    frames = new FrameList(handler);
                }
                for (int i = 0; i < frames.Count; i++)
                {
                    frames[i].UnParse(s, width);
                }
            }
示例#27
0
        public bool SetTags()
        {
            BCOM.Element bcomElement;
            FrameList.GetElement(out bcomElement);

            bool res = false;

            foreach (TagToDataGroupMapProperty mapTag in TagsToDataGroupMapping.Instance.Items)
            {
                res |= TagsToDataGroupConverter.SetMapTagOnElement(bcomElement, mapTag);
            }
            return(res);
        }
示例#28
0
        private void CaptureCurrentFrame(MediaPlayer player)
        {
            var thumbBit = CaptureFrame(player) as BitmapFrame;

            if (thumbBit != null)
            {
                FrameList.Add(thumbBit);
            }

            GC.Collect();

            SeekNextFrame();
        }
示例#29
0
        private void CaptureCurrentFrame(MediaPlayer player)
        {
            if (CaptureFrame(player) is BitmapFrame thumbBit)
            {
                FrameList.Add(thumbBit);
            }

            GC.Collect();

            if (!_cancelled)
            {
                SeekNextFrame();
            }
        }
示例#30
0
        /// <summary>
        /// Handles the <see cref="Control.MouseDoubleClick"/> event for an <see
        /// cref="ImageListBoxItem"/> of the <see cref="ImageListBox"/> on the <see
        /// cref="FrameTab"/> page.</summary>
        /// <param name="sender">
        /// The <see cref="Object"/> where the event handler is attached.</param>
        /// <param name="args">
        /// A <see cref="MouseButtonEventArgs"/> object containing event data.</param>
        /// <remarks>
        /// <b>OnFrameActivate</b> selects the double-clicked item in the <see
        /// cref="ImageListBox"/>, and sets the <see cref="Window.DialogResult"/> of the <see
        /// cref="ChangeFrame"/> dialog to <c>true</c> to confirm all changes.</remarks>

        private void OnFrameActivate(object sender, MouseButtonEventArgs args)
        {
            args.Handled = true;

            // retrieve double-clicked item, if any
            var source = args.OriginalSource as DependencyObject;
            var item   = ItemsControl.ContainerFromElement(FrameList, source) as ImageListBoxItem;

            if (item != null)
            {
                FrameList.SelectAndShow(item);
                DialogResult = true;
            }
        }
示例#31
0
        public MainWindowViewModel()
        {
            // TODO: inject dependencies
            _quicksaveFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), _quicksaveFolderName);

            InnerFileList = new InnerNpkFileList();
            InnerFileList.CurrentChanged += SelectedInnerFileChanged;

            FrameList = new FrameList();
            // Note that SelectedItems may not be up to date yet in the CurrentChanged event handler
            FrameList.CurrentChanged += SelectedFrameChanged;
            FrameList.SelectedItems.CollectionChanged += (sender, e) => RefreshCanQuickSaveAsPng();

            CanOpen = GetCanOpen();
            CanQuickSaveAsPng = GetCanQuickSaveAsPng();
        }
        public DesignerMainWindowViewModel()
        {
            InnerFileList = new InnerNpkFileList()
            {
                new InnerNpkFile("foo.img", "images/foo.img"),
                new InnerNpkFile("bar.img", "images/bar.img"),
                new InnerNpkFile("baz.img", "Images/baz.img")
            };

            FrameList = new FrameList()
            {
                new FrameMetadata(0, 85, 196, 200, 7, null),
                new FrameMetadata(1, 100, 185, 205, 15, null),
                new FrameMetadata(2, 100, 185, 205, 7, 0)
            };

            CurrentFrameImage = null;
            Status = "I'm the status";
            CanOpen = true;
            CanQuickSaveAsPng = true;
        }
        public DesignerMainWindowViewModel()
        {
            InnerFileList = new InnerNpkFileList()
            {
                new InnerNpkFile("blahblahblah_0.img", "sprite/character/fighter/blahblahblah_0.img"),
                new InnerNpkFile("blahblahblah_1.img", "sprite/character/fighter/blahblahblah_1.img"),
                new InnerNpkFile("blahblahblah_2.img", "sprite/character/fighter/blahblahblah_2.img")
            };

            InnerFileList.MoveCurrentToFirst();

            FrameList = new FrameList()
            {
                new FrameMetadata(0, 85, 196, 200, 7, null),
                new FrameMetadata(1, 100, 185, 205, 15, null),
                new FrameMetadata(2, 100, 185, 205, 7, 0)
            };

            CurrentFrameImage = null;
            Status = "I'm the status";
            OpenNPKPath = @"C:\Neople\DFO\ImagePacks2\blah.NPK";
            CanOpen = true;
            CanQuickSaveAsPng = true;
        }