From f3a0ef8dc2cffb20846285ce1b05b7f6579dac94 Mon Sep 17 00:00:00 2001 From: quinnvoker Date: Mon, 24 Dec 2018 13:52:39 -0800 Subject: [PATCH] Added: Multi-sprite drag, Sprite selection memory between frames, Frame naming --- AnimationEditor/AnimationPreview.cs | 40 +++-- AnimationEditor/Form1.Designer.cs | 233 +++++++++++++++------------- AnimationEditor/Form1.cs | 127 ++++++++++++++- 3 files changed, 269 insertions(+), 131 deletions(-) diff --git a/AnimationEditor/AnimationPreview.cs b/AnimationEditor/AnimationPreview.cs index bbe8128..46f54b2 100644 --- a/AnimationEditor/AnimationPreview.cs +++ b/AnimationEditor/AnimationPreview.cs @@ -20,7 +20,7 @@ namespace AnimationEditor public float ZoomLevel { get; set; } public Vector3 CameraLocation { get; set; } - public Sprite EditSprite { get; set; } + public List EditSprites { get; set; } public int PixelGridDisplayLevel { get; set; } public int GridSpacing { get; set; } @@ -142,22 +142,27 @@ namespace AnimationEditor private void HandleDragging() { - if (EditSprite != null) + if (EditSprites != null && EditSprites.Count > 0) { - /*create draggable rect spriteRect at 0,0 - *rect is scaled by Zoomlevel to match sprite's onscreen size - *rect is then offset to match sprite's offset & origin(multiplied by the zoomlevel) - *rect is then offset by the camera's location(multiplied by zoomlevel) and the onscreen centerpoint - *this results in a rect that matches the sprite's onscreen position regardless of pan or zoom - */ - Rectangle spriteRect = new Rectangle(0, 0, (int)(EditSprite.Bounds.Width * ZoomLevel), (int)(EditSprite.Bounds.Height * ZoomLevel)); - spriteRect.Offset((EditSprite.Offset - EditSprite.Origin) * ZoomLevel + new Vector2(CameraLocation.X, CameraLocation.Y) * ZoomLevel + centerPoint); + bool hoverFound = false; + foreach (Sprite spr in EditSprites) + { + /*create draggable rect spriteRect at 0,0 + *rect is scaled by Zoomlevel to match sprite's onscreen size + *rect is then offset to match sprite's offset & origin(multiplied by the zoomlevel) + *rect is then offset by the camera's location(multiplied by zoomlevel) and the onscreen centerpoint + *this results in a rect that matches the sprite's onscreen position regardless of pan or zoom + */ + Rectangle sprRect = new Rectangle(0, 0, (int)(spr.Bounds.Width * ZoomLevel), (int)(spr.Bounds.Height * ZoomLevel)); + sprRect.Offset((spr.Offset - spr.Origin) * ZoomLevel + new Vector2(CameraLocation.X, CameraLocation.Y) * ZoomLevel + centerPoint); + if (sprRect.Contains(mState.Position)) + { + hoverFound = true; + break; + } + } - //fix for when detecting the mouse being within Bounds made an uninteractable section appear at the top of screen and allowed interaction below bottom - Rectangle frame = new Rectangle(Bounds.X, Bounds.Y, Bounds.Width, Bounds.Height); - frame.Y = 0; - - if (spriteRect.Contains(mState.Position)) + if (hoverFound) { if (!hovering) { @@ -189,7 +194,10 @@ namespace AnimationEditor if (distMoved != Vector2.Zero) { - EditSprite.Offset += distMoved; + foreach(Sprite spr in EditSprites) + { + spr.Offset += distMoved; + } OnSpriteMoved(new EventArgs()); } } diff --git a/AnimationEditor/Form1.Designer.cs b/AnimationEditor/Form1.Designer.cs index e537173..06577a6 100644 --- a/AnimationEditor/Form1.Designer.cs +++ b/AnimationEditor/Form1.Designer.cs @@ -63,17 +63,19 @@ this.frameEditorPanel = new System.Windows.Forms.Panel(); this.frameNameBox = new System.Windows.Forms.TextBox(); this.frameSpritePanel = new System.Windows.Forms.Panel(); + this.spritePosPanel = new System.Windows.Forms.Panel(); + this.frameSpritePositionLabel = new System.Windows.Forms.Label(); + this.spriteYPosLabel = new System.Windows.Forms.Label(); + this.spriteXPosLabel = new System.Windows.Forms.Label(); + this.spriteYPosBox = new System.Windows.Forms.NumericUpDown(); + this.spriteXPosBox = new System.Windows.Forms.NumericUpDown(); this.removeSpriteButton = new System.Windows.Forms.Button(); this.moveSpriteUpButton = new System.Windows.Forms.Button(); this.moveSpriteDownButton = new System.Windows.Forms.Button(); - this.frameSpritePositionLabel = new System.Windows.Forms.Label(); this.frameSpriteListBox = new System.Windows.Forms.ListBox(); - this.spriteYPosLabel = new System.Windows.Forms.Label(); - this.spriteXPosLabel = new System.Windows.Forms.Label(); this.frameSpriteListLabel = new System.Windows.Forms.Label(); + this.replaceSpriteButton = new System.Windows.Forms.Button(); this.addSpriteToFrameSpritesButton = new System.Windows.Forms.Button(); - this.spriteYPosBox = new System.Windows.Forms.NumericUpDown(); - this.spriteXPosBox = new System.Windows.Forms.NumericUpDown(); this.importDelayLabel = new System.Windows.Forms.Label(); this.importValuesLabel = new System.Windows.Forms.Label(); this.importDelayBox = new System.Windows.Forms.NumericUpDown(); @@ -82,20 +84,20 @@ this.frameInfoLabel = new System.Windows.Forms.Label(); this.frameBoxLabel = new System.Windows.Forms.Label(); this.spriteBoxLabel = new System.Windows.Forms.Label(); + this.duplicateFrameButton = new System.Windows.Forms.Button(); this.addEmptyFrameButton = new System.Windows.Forms.Button(); this.animationPanel = new System.Windows.Forms.Panel(); this.animationNameLabel = new System.Windows.Forms.Label(); this.animationLabel = new System.Windows.Forms.Label(); - this.loadAnimationSetDialog = new System.Windows.Forms.OpenFileDialog(); - this.duplicateFrameButton = new System.Windows.Forms.Button(); this.animationPreview = new AnimationEditor.AnimationPreview(); - this.replaceSpriteButton = new System.Windows.Forms.Button(); + this.loadAnimationSetDialog = new System.Windows.Forms.OpenFileDialog(); ((System.ComponentModel.ISupportInitialize)(this.spritePreview)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.frameTrackBar)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.delayInputBox)).BeginInit(); this.mainMenuStrip.SuspendLayout(); this.frameEditorPanel.SuspendLayout(); this.frameSpritePanel.SuspendLayout(); + this.spritePosPanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.importDelayBox)).BeginInit(); @@ -430,27 +432,105 @@ this.frameNameBox.Name = "frameNameBox"; this.frameNameBox.Size = new System.Drawing.Size(83, 20); this.frameNameBox.TabIndex = 25; + this.frameNameBox.TextChanged += new System.EventHandler(this.frameNameBox_TextChanged); // // frameSpritePanel // this.frameSpritePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.frameSpritePanel.Controls.Add(this.spritePosPanel); this.frameSpritePanel.Controls.Add(this.removeSpriteButton); this.frameSpritePanel.Controls.Add(this.moveSpriteUpButton); this.frameSpritePanel.Controls.Add(this.moveSpriteDownButton); - this.frameSpritePanel.Controls.Add(this.frameSpritePositionLabel); this.frameSpritePanel.Controls.Add(this.frameSpriteListBox); - this.frameSpritePanel.Controls.Add(this.spriteYPosLabel); - this.frameSpritePanel.Controls.Add(this.spriteXPosLabel); this.frameSpritePanel.Controls.Add(this.frameSpriteListLabel); this.frameSpritePanel.Controls.Add(this.replaceSpriteButton); this.frameSpritePanel.Controls.Add(this.addSpriteToFrameSpritesButton); - this.frameSpritePanel.Controls.Add(this.spriteYPosBox); - this.frameSpritePanel.Controls.Add(this.spriteXPosBox); this.frameSpritePanel.Location = new System.Drawing.Point(129, 277); this.frameSpritePanel.Name = "frameSpritePanel"; this.frameSpritePanel.Size = new System.Drawing.Size(161, 126); this.frameSpritePanel.TabIndex = 24; // + // spritePosPanel + // + this.spritePosPanel.Controls.Add(this.frameSpritePositionLabel); + this.spritePosPanel.Controls.Add(this.spriteYPosLabel); + this.spritePosPanel.Controls.Add(this.spriteXPosLabel); + this.spritePosPanel.Controls.Add(this.spriteYPosBox); + this.spritePosPanel.Controls.Add(this.spriteXPosBox); + this.spritePosPanel.Location = new System.Drawing.Point(32, 81); + this.spritePosPanel.Name = "spritePosPanel"; + this.spritePosPanel.Size = new System.Drawing.Size(128, 44); + this.spritePosPanel.TabIndex = 27; + // + // frameSpritePositionLabel + // + this.frameSpritePositionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.frameSpritePositionLabel.AutoSize = true; + this.frameSpritePositionLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.frameSpritePositionLabel.Location = new System.Drawing.Point(1, 1); + this.frameSpritePositionLabel.Name = "frameSpritePositionLabel"; + this.frameSpritePositionLabel.Size = new System.Drawing.Size(86, 13); + this.frameSpritePositionLabel.TabIndex = 23; + this.frameSpritePositionLabel.Text = "Sprite Positon"; + // + // spriteYPosLabel + // + this.spriteYPosLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.spriteYPosLabel.AutoSize = true; + this.spriteYPosLabel.Location = new System.Drawing.Point(62, 21); + this.spriteYPosLabel.Name = "spriteYPosLabel"; + this.spriteYPosLabel.Size = new System.Drawing.Size(14, 13); + this.spriteYPosLabel.TabIndex = 18; + this.spriteYPosLabel.Text = "Y"; + // + // spriteXPosLabel + // + this.spriteXPosLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.spriteXPosLabel.AutoSize = true; + this.spriteXPosLabel.Location = new System.Drawing.Point(1, 21); + this.spriteXPosLabel.Name = "spriteXPosLabel"; + this.spriteXPosLabel.Size = new System.Drawing.Size(14, 13); + this.spriteXPosLabel.TabIndex = 18; + this.spriteXPosLabel.Text = "X"; + // + // spriteYPosBox + // + this.spriteYPosBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.spriteYPosBox.Location = new System.Drawing.Point(77, 19); + this.spriteYPosBox.Maximum = new decimal(new int[] { + 2147483647, + 0, + 0, + 0}); + this.spriteYPosBox.Minimum = new decimal(new int[] { + 2147483647, + 0, + 0, + -2147483648}); + this.spriteYPosBox.Name = "spriteYPosBox"; + this.spriteYPosBox.Size = new System.Drawing.Size(43, 20); + this.spriteYPosBox.TabIndex = 8; + this.spriteYPosBox.ValueChanged += new System.EventHandler(this.spriteYPosBox_ValueChanged); + // + // spriteXPosBox + // + this.spriteXPosBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.spriteXPosBox.Location = new System.Drawing.Point(16, 19); + this.spriteXPosBox.Maximum = new decimal(new int[] { + 2147483647, + 0, + 0, + 0}); + this.spriteXPosBox.Minimum = new decimal(new int[] { + 2147483647, + 0, + 0, + -2147483648}); + this.spriteXPosBox.Name = "spriteXPosBox"; + this.spriteXPosBox.Size = new System.Drawing.Size(43, 20); + this.spriteXPosBox.TabIndex = 8; + this.spriteXPosBox.ValueChanged += new System.EventHandler(this.spriteXPosBox_ValueChanged); + // // removeSpriteButton // this.removeSpriteButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -487,47 +567,17 @@ this.moveSpriteDownButton.UseVisualStyleBackColor = true; this.moveSpriteDownButton.Click += new System.EventHandler(this.moveSpriteDownButton_Click); // - // frameSpritePositionLabel - // - this.frameSpritePositionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.frameSpritePositionLabel.AutoSize = true; - this.frameSpritePositionLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.frameSpritePositionLabel.Location = new System.Drawing.Point(33, 82); - this.frameSpritePositionLabel.Name = "frameSpritePositionLabel"; - this.frameSpritePositionLabel.Size = new System.Drawing.Size(86, 13); - this.frameSpritePositionLabel.TabIndex = 23; - this.frameSpritePositionLabel.Text = "Sprite Positon"; - // // frameSpriteListBox // this.frameSpriteListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.frameSpriteListBox.FormattingEnabled = true; this.frameSpriteListBox.Location = new System.Drawing.Point(34, 23); this.frameSpriteListBox.Name = "frameSpriteListBox"; + this.frameSpriteListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; this.frameSpriteListBox.Size = new System.Drawing.Size(120, 56); this.frameSpriteListBox.TabIndex = 22; this.frameSpriteListBox.SelectedIndexChanged += new System.EventHandler(this.frameSpriteListBox_SelectedIndexChanged); // - // spriteYPosLabel - // - this.spriteYPosLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.spriteYPosLabel.AutoSize = true; - this.spriteYPosLabel.Location = new System.Drawing.Point(94, 102); - this.spriteYPosLabel.Name = "spriteYPosLabel"; - this.spriteYPosLabel.Size = new System.Drawing.Size(14, 13); - this.spriteYPosLabel.TabIndex = 18; - this.spriteYPosLabel.Text = "Y"; - // - // spriteXPosLabel - // - this.spriteXPosLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.spriteXPosLabel.AutoSize = true; - this.spriteXPosLabel.Location = new System.Drawing.Point(33, 102); - this.spriteXPosLabel.Name = "spriteXPosLabel"; - this.spriteXPosLabel.Size = new System.Drawing.Size(14, 13); - this.spriteXPosLabel.TabIndex = 18; - this.spriteXPosLabel.Text = "X"; - // // frameSpriteListLabel // this.frameSpriteListLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -539,6 +589,18 @@ this.frameSpriteListLabel.TabIndex = 16; this.frameSpriteListLabel.Text = "Sprites"; // + // replaceSpriteButton + // + this.replaceSpriteButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.replaceSpriteButton.Location = new System.Drawing.Point(1, 56); + this.replaceSpriteButton.Name = "replaceSpriteButton"; + this.replaceSpriteButton.Size = new System.Drawing.Size(27, 23); + this.replaceSpriteButton.TabIndex = 5; + this.replaceSpriteButton.Text = "@"; + this.replaceSpriteButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.replaceSpriteButton.UseVisualStyleBackColor = true; + this.replaceSpriteButton.Click += new System.EventHandler(this.replaceSpriteButton_Click); + // // addSpriteToFrameSpritesButton // this.addSpriteToFrameSpritesButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -550,44 +612,6 @@ this.addSpriteToFrameSpritesButton.UseVisualStyleBackColor = true; this.addSpriteToFrameSpritesButton.Click += new System.EventHandler(this.addSpriteToFrameSpritesButton_Click); // - // spriteYPosBox - // - this.spriteYPosBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.spriteYPosBox.Location = new System.Drawing.Point(109, 100); - this.spriteYPosBox.Maximum = new decimal(new int[] { - 2147483647, - 0, - 0, - 0}); - this.spriteYPosBox.Minimum = new decimal(new int[] { - 2147483647, - 0, - 0, - -2147483648}); - this.spriteYPosBox.Name = "spriteYPosBox"; - this.spriteYPosBox.Size = new System.Drawing.Size(43, 20); - this.spriteYPosBox.TabIndex = 8; - this.spriteYPosBox.ValueChanged += new System.EventHandler(this.spriteYPosBox_ValueChanged); - // - // spriteXPosBox - // - this.spriteXPosBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.spriteXPosBox.Location = new System.Drawing.Point(48, 100); - this.spriteXPosBox.Maximum = new decimal(new int[] { - 2147483647, - 0, - 0, - 0}); - this.spriteXPosBox.Minimum = new decimal(new int[] { - 2147483647, - 0, - 0, - -2147483648}); - this.spriteXPosBox.Name = "spriteXPosBox"; - this.spriteXPosBox.Size = new System.Drawing.Size(43, 20); - this.spriteXPosBox.TabIndex = 8; - this.spriteXPosBox.ValueChanged += new System.EventHandler(this.spriteXPosBox_ValueChanged); - // // importDelayLabel // this.importDelayLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -669,6 +693,16 @@ this.spriteBoxLabel.TabIndex = 15; this.spriteBoxLabel.Text = "Sprite Selection"; // + // duplicateFrameButton + // + this.duplicateFrameButton.Location = new System.Drawing.Point(130, 18); + this.duplicateFrameButton.Name = "duplicateFrameButton"; + this.duplicateFrameButton.Size = new System.Drawing.Size(27, 23); + this.duplicateFrameButton.TabIndex = 12; + this.duplicateFrameButton.Text = "++"; + this.duplicateFrameButton.UseVisualStyleBackColor = true; + this.duplicateFrameButton.Click += new System.EventHandler(this.duplicateFrameButton_Click); + // // addEmptyFrameButton // this.addEmptyFrameButton.Location = new System.Drawing.Point(162, 18); @@ -719,29 +753,13 @@ this.animationLabel.TabIndex = 22; this.animationLabel.Text = "Animation"; // - // loadAnimationSetDialog - // - this.loadAnimationSetDialog.DefaultExt = "animset"; - this.loadAnimationSetDialog.FileName = "openFileDialog1"; - this.loadAnimationSetDialog.Filter = "QUROGames AnimationSet|*.animSet"; - // - // duplicateFrameButton - // - this.duplicateFrameButton.Location = new System.Drawing.Point(130, 18); - this.duplicateFrameButton.Name = "duplicateFrameButton"; - this.duplicateFrameButton.Size = new System.Drawing.Size(27, 23); - this.duplicateFrameButton.TabIndex = 12; - this.duplicateFrameButton.Text = "++"; - this.duplicateFrameButton.UseVisualStyleBackColor = true; - this.duplicateFrameButton.Click += new System.EventHandler(this.duplicateFrameButton_Click); - // // animationPreview // this.animationPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.animationPreview.BackColor = System.Drawing.SystemColors.ControlDarkDark; - this.animationPreview.EditSprite = null; + this.animationPreview.EditSprites = null; this.animationPreview.GridSpacing = 0; this.animationPreview.Location = new System.Drawing.Point(3, 26); this.animationPreview.Name = "animationPreview"; @@ -755,17 +773,11 @@ this.animationPreview.ZoomLevel = 0F; this.animationPreview.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.animationPreview_MouseWheel); // - // replaceSpriteButton + // loadAnimationSetDialog // - this.replaceSpriteButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.replaceSpriteButton.Location = new System.Drawing.Point(1, 56); - this.replaceSpriteButton.Name = "replaceSpriteButton"; - this.replaceSpriteButton.Size = new System.Drawing.Size(27, 23); - this.replaceSpriteButton.TabIndex = 5; - this.replaceSpriteButton.Text = "@"; - this.replaceSpriteButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.replaceSpriteButton.UseVisualStyleBackColor = true; - this.replaceSpriteButton.Click += new System.EventHandler(this.replaceSpriteButton_Click); + this.loadAnimationSetDialog.DefaultExt = "animset"; + this.loadAnimationSetDialog.FileName = "openFileDialog1"; + this.loadAnimationSetDialog.Filter = "QUROGames AnimationSet|*.animSet"; // // Form1 // @@ -788,6 +800,8 @@ this.frameEditorPanel.PerformLayout(); this.frameSpritePanel.ResumeLayout(false); this.frameSpritePanel.PerformLayout(); + this.spritePosPanel.ResumeLayout(false); + this.spritePosPanel.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.importDelayBox)).EndInit(); @@ -862,6 +876,7 @@ private System.Windows.Forms.Button moveSpriteDownButton; private System.Windows.Forms.Button duplicateFrameButton; private System.Windows.Forms.Button replaceSpriteButton; + private System.Windows.Forms.Panel spritePosPanel; } } diff --git a/AnimationEditor/Form1.cs b/AnimationEditor/Form1.cs index a3fb86b..10934a6 100644 --- a/AnimationEditor/Form1.cs +++ b/AnimationEditor/Form1.cs @@ -41,6 +41,7 @@ namespace AnimationEditor private Animation currentAnimation; private Frame currentFrame; + private bool tracking; private bool reading; private float importDelay = 0; @@ -157,6 +158,39 @@ namespace AnimationEditor } } + private void UpdateEnabledControls() + { + bool singleFrameSelected = frameListBox.SelectedIndices.Count < 2; + bool singleSpriteSelected = frameSpriteListBox.SelectedIndices.Count < 2; + + //update per-frame controls + frameSpritePanel.Enabled = singleFrameSelected; + moveFrameDownButton.Enabled = singleFrameSelected; + moveFrameUpButton.Enabled = singleFrameSelected; + removeFrameButton.Enabled = singleFrameSelected; + duplicateFrameButton.Enabled = singleFrameSelected; + + //update per-sprite controls + spritePosPanel.Enabled = singleSpriteSelected; + replaceSpriteButton.Enabled = singleSpriteSelected; + moveSpriteDownButton.Enabled = singleSpriteSelected; + moveSpriteUpButton.Enabled = singleSpriteSelected; + removeSpriteButton.Enabled = singleSpriteSelected; + + reading = true; + if (!singleSpriteSelected) + { + spriteXPosBox.Text = ""; + spriteYPosBox.Text = ""; + } + else + { + spriteXPosBox.Text = spriteXPosBox.Value.ToString(); + spriteYPosBox.Text = spriteYPosBox.Value.ToString(); + } + reading = false; + } + private void ReadAnimationInfo() { reading = true; @@ -184,26 +218,61 @@ namespace AnimationEditor private void frameListBox_SelectedIndexChanged(object sender, EventArgs e) { + if(!tracking) + UpdateEnabledControls(); if (frameListBox.SelectedIndices.Count == 1 && frameListBox.SelectedItem != null) { + //create copy of current frameSprite selection + List oldFrameSpriteSelection = new List(); + foreach (int index in frameSpriteListBox.SelectedIndices) + { + oldFrameSpriteSelection.Add(index); + } + + //update currentFrame to match selection currentFrame = (Frame)frameListBox.SelectedItem; + //update preview and frameTrackBar frame positions if (animationPreview.PreviewSprite != null && !animationPreview.Playing) { animationPreview.PreviewSprite.CurrentFrameIndex = frameListBox.SelectedIndex; frameTrackBar.Value = frameListBox.SelectedIndex; } - frameSpritePanel.Enabled = true; + + //update frameSpriteListBox with the current frame's sprites if (currentFrame.Sprites != null) frameSprites = new BindingList(currentFrame.Sprites); else frameSprites = new BindingList(); frameSpriteListBox.DataSource = frameSprites; frameSpriteListBox.DisplayMember = "Name"; + + //restore old frameSprite selection + frameSpriteListBox.SelectedIndices.Clear(); + foreach(int index in oldFrameSpriteSelection) + { + if(index < frameSprites.Count) + { + frameSpriteListBox.SelectedIndex = index; + } + } + + //update forms fields to match selected frame's informations UpdateFrameInformation(); } else if (frameListBox.SelectedIndices.Count > 1) { + //disable frameSpritePanel, as multi frame sprite editing is not yet possible frameSpritePanel.Enabled = false; + + //disable single frame controls + moveFrameDownButton.Enabled = false; + moveFrameUpButton.Enabled = false; + removeFrameButton.Enabled = false; + duplicateFrameButton.Enabled = false; + + //disable preview sprite drag+drop functionality + if (animationPreview.EditSprites != null) + animationPreview.EditSprites.Clear(); } } @@ -224,7 +293,6 @@ namespace AnimationEditor } } - private void loadSpriteSheetToolStripMenuItem_Click(object sender, EventArgs e) { if (loadSpriteSheetDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) @@ -315,8 +383,10 @@ namespace AnimationEditor { if (!animationPreview.Playing) { + tracking = true; animationPreview.PreviewSprite.CurrentFrameIndex = frameTrackBar.Value; frameListBox_SetSingleSelection(frameTrackBar.Value); + tracking = false; } } @@ -542,10 +612,25 @@ namespace AnimationEditor private void frameSpriteListBox_SelectedIndexChanged(object sender, EventArgs e) { + if(!tracking) + UpdateEnabledControls(); if (frameSpriteListBox.SelectedIndex > -1 && frameSpriteListBox.SelectedIndex < frameSprites.Count) { - animationPreview.EditSprite = frameSprites[frameSpriteListBox.SelectedIndex]; - ReadSpriteOffset(); + //check if animationPreview has initialized EditSprites; do so if not, and if so, clear it + if (animationPreview.EditSprites == null) + animationPreview.EditSprites = new List(); + else + animationPreview.EditSprites.Clear(); + //add selected sprites to EditSprites list + foreach(int index in frameSpriteListBox.SelectedIndices) + { + if(index < frameSprites.Count) + animationPreview.EditSprites.Add(frameSprites[index]); + } + if (frameSpriteListBox.SelectedIndices.Count == 1) + { + ReadSpriteOffset(); + } } } @@ -598,7 +683,36 @@ namespace AnimationEditor { if (reading) return; - currentFrame.Name = frameNameBox.Text; + + bool changed = false; + + foreach(int index in frameListBox.SelectedIndices) + { + if (frames[index].Name != frameNameBox.Text) + { + frames[index].Name = frameNameBox.Text; + changed = true; + } + } + + if (changed) + { + //store current frame selection data + List selection = new List(); + foreach (int index in frameListBox.SelectedIndices) + { + selection.Add(index); + } + //refresh list so name changes are reflected in form + frames.ResetBindings(); + //restore selection + reading = true; + foreach(int index in selection) + { + frameListBox.SelectedIndex = index; + } + reading = false; + } } private void moveSpriteDownButton_Click(object sender, EventArgs e) @@ -642,7 +756,8 @@ namespace AnimationEditor private void animationPreview_SpriteMoved(object sender, EventArgs e) { - ReadSpriteOffset(); + if(frameSpriteListBox.SelectedIndices.Count == 1) + ReadSpriteOffset(); } private void duplicateFrameButton_Click(object sender, EventArgs e)