From 3c656b36a79cbbe351075fc09393dd51712852ab Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Mon, 2 Jun 2025 18:03:52 +0300 Subject: [PATCH 1/5] TODO feature: A button to Copy from Test font dialog to then paste into another frame --- McBitFont/ChangeHistory.cs | 2 +- McBitFont/FontTester.Designer.cs | 23 +++++++++++++++-- McBitFont/FontTester.cs | 43 ++++++++++++++++++++++++++++++-- TODO.txt | 2 +- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/McBitFont/ChangeHistory.cs b/McBitFont/ChangeHistory.cs index 80b3b24..25b2dfa 100644 --- a/McBitFont/ChangeHistory.cs +++ b/McBitFont/ChangeHistory.cs @@ -61,7 +61,7 @@ namespace McBitFont { public FrameMiniature? Canvas { get; set; } = canvas; } - private static FrameMiniature CopyFrameSimple(FrameMiniature f) { + public static FrameMiniature CopyFrameSimple(FrameMiniature f) { FrameMiniature newf = new(f.code, f.width, f.height); Array.Copy(f.data, newf.data, f.data.Length); return newf; diff --git a/McBitFont/FontTester.Designer.cs b/McBitFont/FontTester.Designer.cs index 4fc6680..3a0e37c 100644 --- a/McBitFont/FontTester.Designer.cs +++ b/McBitFont/FontTester.Designer.cs @@ -35,6 +35,7 @@ cbZoom = new System.Windows.Forms.ComboBox(); toolTip1 = new System.Windows.Forms.ToolTip(components); chkBaseline = new System.Windows.Forms.CheckBox(); + btnCopy = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)nudSpace).BeginInit(); SuspendLayout(); // @@ -151,11 +152,27 @@ chkBaseline.UseVisualStyleBackColor = true; chkBaseline.CheckedChanged += Scrolling; // + // btnCopy + // + btnCopy.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + btnCopy.Image = Properties.Resources.Famfamfam_Silk_Page_copy_16; + btnCopy.ImageAlign = System.Drawing.ContentAlignment.MiddleRight; + btnCopy.Location = new System.Drawing.Point(110, 214); + btnCopy.Name = "btnCopy"; + btnCopy.Size = new System.Drawing.Size(80, 30); + btnCopy.TabIndex = 21; + btnCopy.Text = " Copy"; + btnCopy.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + toolTip1.SetToolTip(btnCopy, "Copy BitPixels you see to Clipboard"); + btnCopy.UseVisualStyleBackColor = true; + btnCopy.MouseClick += Copy_Click; + // // FontTester // AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - ClientSize = new System.Drawing.Size(284, 221); + ClientSize = new System.Drawing.Size(284, 251); + Controls.Add(btnCopy); Controls.Add(chkBaseline); Controls.Add(cbZoom); Controls.Add(lblZoom); @@ -168,13 +185,14 @@ Controls.Add(lblSpace); MaximizeBox = false; MinimizeBox = false; - MinimumSize = new System.Drawing.Size(260, 260); + MinimumSize = new System.Drawing.Size(300, 290); Name = "FontTester"; ShowIcon = false; ShowInTaskbar = false; StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "Font Tester"; Load += FontTester_Load; + Resize += Form_Resize; ((System.ComponentModel.ISupportInitialize)nudSpace).EndInit(); ResumeLayout(false); PerformLayout(); @@ -193,5 +211,6 @@ private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.ComboBox cbZoom; private System.Windows.Forms.CheckBox chkBaseline; + private System.Windows.Forms.Button btnCopy; } } \ No newline at end of file diff --git a/McBitFont/FontTester.cs b/McBitFont/FontTester.cs index e30cf02..073a192 100644 --- a/McBitFont/FontTester.cs +++ b/McBitFont/FontTester.cs @@ -1,4 +1,5 @@ -using System; +using MessagePack; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -24,6 +25,8 @@ namespace McBitFont { private int cellSize; private int width; + private readonly DataFormats.Format clpbFormat = DataFormats.GetFormat("McBitFontFrame"); + public FontTester(int codepage, int height, int baseline, List frames) { InitializeComponent(); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); @@ -53,7 +56,7 @@ namespace McBitFont { int space = (int)nudSpace.Value; int index = 0; for (int c = 0; c < encoded.Length; c++) { - // Check if we have suck symbol + // Check if we have such symbol var f = frames.FindAll(x => x.code == encoded[c]); if (f.Count == 1) { // Draw the symbol @@ -160,6 +163,42 @@ namespace McBitFont { private void Scrolling(object sender, EventArgs e) { dotPanel.Invalidate(); } + + private void Form_Resize(object sender, EventArgs e) { + btnCopy.Left = this.Width / 2 - 40; + } + + private void Copy_Click(object sender, MouseEventArgs e) { + if (encoded.Length < 1) { + MessageBox.Show("Nothing to copy! Type some symbols first.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + // Sycle through ecoded bytes of test text + int space = (int)nudSpace.Value; + int index = 0; + int i, j; + MainForm.FrameMiniature ff = new(0, width, frames[0].height); + for (int c = 0; c < encoded.Length; c++) { + // Check if we have such symbol + var f = frames.FindAll(x => x.code == encoded[c]); + if (f.Count == 1) { + // Draw the symbol + for (i = 0; i < f[0].width; i++) { + for (j = 0; j < f[0].height; j++) { + // Fill the frame with data + ff.data[index + i, j] = f[0].data[i, j]; + } + } + index += (f[0].width > 0 ? f[0].width + space : 0); + } else { + index += 5 + space; + } + } + // Copy the frame we made into Clipboard + var bb = MessagePackSerializer.Serialize(ChangeHistory.CopyFrameSimple(ff)); + DataObject clpbObj = new DataObject(clpbFormat.Name, bb); + Clipboard.SetDataObject(clpbObj, true); + } } diff --git a/TODO.txt b/TODO.txt index 72f831f..f3aaef1 100644 --- a/TODO.txt +++ b/TODO.txt @@ -5,7 +5,7 @@ Application: Functionality: - Middle mouse - drag the canvas - Straight line painting -- A button to Copy from Test font dialog to then paste into another frame +V A button to Copy from Test font dialog to then paste into another frame Bugs: - Nothing selected after removing a symbol. Potential error throw on "Apply" \ No newline at end of file From 76ca7ccf3519c512ef987c9ffac015f42b7b8f22 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Mon, 2 Jun 2025 23:37:22 +0300 Subject: [PATCH 2/5] TODO feature: Middle mouse - drag the canvas --- McBitFont/FontTester.Designer.cs | 26 +++++++++++----------- McBitFont/Form1.Designer.cs | 7 +++++- McBitFont/Form1.cs | 37 ++++++++++++++++++++++++++++++++ TODO.txt | 2 +- 4 files changed, 57 insertions(+), 15 deletions(-) diff --git a/McBitFont/FontTester.Designer.cs b/McBitFont/FontTester.Designer.cs index 3a0e37c..355ee76 100644 --- a/McBitFont/FontTester.Designer.cs +++ b/McBitFont/FontTester.Designer.cs @@ -34,8 +34,8 @@ lblZoom = new System.Windows.Forms.Label(); cbZoom = new System.Windows.Forms.ComboBox(); toolTip1 = new System.Windows.Forms.ToolTip(components); - chkBaseline = new System.Windows.Forms.CheckBox(); btnCopy = new System.Windows.Forms.Button(); + chkBaseline = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)nudSpace).BeginInit(); SuspendLayout(); // @@ -99,7 +99,7 @@ vScroll.LargeChange = 25; vScroll.Location = new System.Drawing.Point(251, 84); vScroll.Name = "vScroll"; - vScroll.Size = new System.Drawing.Size(21, 125); + vScroll.Size = new System.Drawing.Size(21, 104); vScroll.TabIndex = 17; vScroll.ValueChanged += Scrolling; // @@ -141,17 +141,6 @@ toolTip1.InitialDelay = 500; toolTip1.ReshowDelay = 100; // - // chkBaseline - // - chkBaseline.AutoSize = true; - chkBaseline.Location = new System.Drawing.Point(203, 36); - chkBaseline.Name = "chkBaseline"; - chkBaseline.Size = new System.Drawing.Size(69, 19); - chkBaseline.TabIndex = 20; - chkBaseline.Text = "Baseline"; - chkBaseline.UseVisualStyleBackColor = true; - chkBaseline.CheckedChanged += Scrolling; - // // btnCopy // btnCopy.Anchor = System.Windows.Forms.AnchorStyles.Bottom; @@ -167,6 +156,17 @@ btnCopy.UseVisualStyleBackColor = true; btnCopy.MouseClick += Copy_Click; // + // chkBaseline + // + chkBaseline.AutoSize = true; + chkBaseline.Location = new System.Drawing.Point(203, 36); + chkBaseline.Name = "chkBaseline"; + chkBaseline.Size = new System.Drawing.Size(69, 19); + chkBaseline.TabIndex = 20; + chkBaseline.Text = "Baseline"; + chkBaseline.UseVisualStyleBackColor = true; + chkBaseline.CheckedChanged += Scrolling; + // // FontTester // AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); diff --git a/McBitFont/Form1.Designer.cs b/McBitFont/Form1.Designer.cs index ffd5494..0427c47 100644 --- a/McBitFont/Form1.Designer.cs +++ b/McBitFont/Form1.Designer.cs @@ -493,7 +493,10 @@ // hScroll // hScroll.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + hScroll.Enabled = false; + hScroll.LargeChange = 2; hScroll.Location = new System.Drawing.Point(14, 609); + hScroll.Maximum = 1; hScroll.Name = "hScroll"; hScroll.Size = new System.Drawing.Size(427, 21); hScroll.TabIndex = 14; @@ -502,8 +505,10 @@ // vScroll // vScroll.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - vScroll.LargeChange = 25; + vScroll.Enabled = false; + vScroll.LargeChange = 2; vScroll.Location = new System.Drawing.Point(444, 31); + vScroll.Maximum = 1; vScroll.Name = "vScroll"; vScroll.Size = new System.Drawing.Size(21, 575); vScroll.TabIndex = 15; diff --git a/McBitFont/Form1.cs b/McBitFont/Form1.cs index 45fa49a..2114a0c 100644 --- a/McBitFont/Form1.cs +++ b/McBitFont/Form1.cs @@ -296,6 +296,7 @@ namespace McBitFont { if (w <= dotPanel.Width) { hScroll.Enabled = false; hScroll.Value = 0; + vScroll.Maximum = 0; } else { hScroll.Maximum = w - dotPanel.Width + 12; hScroll.Minimum = 0; @@ -305,6 +306,7 @@ namespace McBitFont { if (h <= dotPanel.Height) { vScroll.Enabled = false; vScroll.Value = 0; + vScroll.Maximum = 0; } else { vScroll.Maximum = h - dotPanel.Height + 12; vScroll.Minimum = 0; @@ -416,10 +418,45 @@ namespace McBitFont { private bool mouseDown = false; private bool fChanged = false; + private bool mouseDownMiddle = false; + private int mouseX, mouseY; private void dotPanel_MouseMove(object sender, MouseEventArgs e) { var rectSel = chkRectSelect.Checked; bool rectSelUpdated = false; + // Drag with middle mouse button + if (vScroll.Enabled || hScroll.Enabled) { + if (mouseDownMiddle) { + var dY = mouseY - e.Y <= -cellSize - gap || mouseY - e.Y >= cellSize + gap; + var dX = mouseX - e.X <= -cellSize - gap || mouseX - e.X >= cellSize + gap; + int newY = vScroll.Value; + int newX = hScroll.Value; + if (dX) { + newX += (mouseX - e.X); + if (newX < hScroll.Minimum) newX = hScroll.Minimum; + if (newX > hScroll.Maximum) newX = hScroll.Maximum; + mouseX = e.X; + hScroll.Value = newX; + } + if (dY) { + newY += (mouseY - e.Y); + if (newY < vScroll.Minimum) newY = vScroll.Minimum; + if (newY > vScroll.Maximum) newY = vScroll.Maximum; + mouseY = e.Y; + vScroll.Value = newY; + } + } + if (!mouseDownMiddle && e.Button == MouseButtons.Middle) { + mouseDownMiddle = true; + mouseX = e.X; + mouseY = e.Y; + } + if (mouseDownMiddle && e.Button == MouseButtons.None) { + mouseDownMiddle = false; + } + } + + // Moving baseline Rectangle rect1, rect2; if (set_base) { diff --git a/TODO.txt b/TODO.txt index f3aaef1..d1571b3 100644 --- a/TODO.txt +++ b/TODO.txt @@ -3,7 +3,7 @@ Application: Functionality: -- Middle mouse - drag the canvas +V Middle mouse - drag the canvas - Straight line painting V A button to Copy from Test font dialog to then paste into another frame From 9cfe8ef5c3596078d52ea985d450da3a67ad4dbb Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Tue, 3 Jun 2025 11:30:12 +0300 Subject: [PATCH 3/5] Version changed to 2.5; TODO feature: Straight line painting (hold Shift / Ctrl) --- McBitFont/Form1.cs | 18 ++++++++++++++---- McBitFont/McBitFont.csproj | 6 +++--- TODO.txt | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/McBitFont/Form1.cs b/McBitFont/Form1.cs index 2114a0c..edca56b 100644 --- a/McBitFont/Form1.cs +++ b/McBitFont/Form1.cs @@ -416,10 +416,11 @@ namespace McBitFont { dotPanel.Refresh(); } - private bool mouseDown = false; - private bool fChanged = false; - private bool mouseDownMiddle = false; - private int mouseX, mouseY; + private bool mouseDown = false; // Used in canvas history tracking and rectangle selection logics + private bool fChanged = false; // Used in canvas history (undo / redo) tracking + private bool mouseDownMiddle = false; // Used in middle mouse dragging logic + private int mouseX, mouseY; // To remember last mouse X and Y (used in middle mouse dragging logic) + private int lastX = 0, lastY = 0; // Used for drawing straight lines private void dotPanel_MouseMove(object sender, MouseEventArgs e) { var rectSel = chkRectSelect.Checked; bool rectSelUpdated = false; @@ -551,6 +552,15 @@ namespace McBitFont { return; } + // Check for Shift / Ctrl keys for straight lines + if (ModifierKeys.HasFlag(Keys.Shift)) { + j = lastY; + } else if (ModifierKeys.HasFlag(Keys.Control)) { + i = lastX; + } + lastX = i; + lastY = j; + // Paint black / white if (e.Button == MouseButtons.Left && !f.data[i, j]) { f.data[i, j] = true; diff --git a/McBitFont/McBitFont.csproj b/McBitFont/McBitFont.csproj index 126e4a8..a3b3b66 100644 --- a/McBitFont/McBitFont.csproj +++ b/McBitFont/McBitFont.csproj @@ -20,9 +20,9 @@ true true icon_64.ico - 2.4.0.0 - 2.4.0.0 - $(VersionPrefix)2.4.0 + 2.5.0.0 + 2.5.0.0 + $(VersionPrefix)2.5.0 Anton Mukhin diff --git a/TODO.txt b/TODO.txt index d1571b3..a493be2 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,7 +4,7 @@ Application: Functionality: V Middle mouse - drag the canvas -- Straight line painting +V Straight line painting (hold Shift / Ctrl) V A button to Copy from Test font dialog to then paste into another frame Bugs: From 8ca83b7edcd007df89cc2fc7203ecb71f2264084 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Tue, 3 Jun 2025 11:35:40 +0300 Subject: [PATCH 4/5] Update README.md; Update Font-tester screenshot; Version number in-code update --- McBitFont/Form1.cs | 2 +- README.md | 2 ++ images/Screenshot_Font-tester.png | Bin 11583 -> 12784 bytes 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/McBitFont/Form1.cs b/McBitFont/Form1.cs index edca56b..e2d483d 100644 --- a/McBitFont/Form1.cs +++ b/McBitFont/Form1.cs @@ -59,7 +59,7 @@ namespace McBitFont { public bool monospaced = false; private bool modified = false; private bool prjModified = false; - public const string version = "2.4"; + public const string version = "2.5"; public string prjName = "Untitled"; public string prjFileName = ""; public int codepage = 1251; diff --git a/README.md b/README.md index 716027a..00e08f3 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Some basic hints on the interface: - Mouse 1 to mark a pixel black - Mouse 2 to mark a pixel white - Drag the mouse holding a button to draw pixels +- Hold Shift to constrain painting horizontally +- Hold Ctrl to constrain painting vertically - Mouse Scroll to scroll up and down - Shift + scroll to scroll left and right - Crtl + scroll to zoom diff --git a/images/Screenshot_Font-tester.png b/images/Screenshot_Font-tester.png index 18822f6588fc9e45f65fae2b6f25ca55d8270abc..e13c7f4be02e12fc76be1b5c16d30328b078b64b 100644 GIT binary patch literal 12784 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 S(76Vx)G7)Z5AyDtz4#x(lxAiC literal 11583 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 From cebbdc63c801b05665bf22458f2b1a9b6bc32a79 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Tue, 3 Jun 2025 11:46:30 +0300 Subject: [PATCH 5/5] Bug fixed: Nothing selected after removing a symbol. Potential error throw on "Apply" --- McBitFont/Form1.cs | 3 +++ TODO.txt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/McBitFont/Form1.cs b/McBitFont/Form1.cs index e2d483d..39cda8a 100644 --- a/McBitFont/Form1.cs +++ b/McBitFont/Form1.cs @@ -1035,8 +1035,11 @@ namespace McBitFont { var sel = miniList.SelectedItems[0].ImageKey; int code = Convert.ToInt32(miniList.SelectedItems[0].ImageKey); FrameMiniature ff = frames.Find(x => x.code == code); + bool isLast = frames.Last().Equals(ff); frames.Remove(ff); miniList.SelectedItems[0].Remove(); + + miniList.Items[isLast ? miniList.Items.Count - 1 : 0].Selected = true; } private void prependSymbolToolStripMenuItem_Click(object sender, EventArgs e) { diff --git a/TODO.txt b/TODO.txt index a493be2..1d91468 100644 --- a/TODO.txt +++ b/TODO.txt @@ -8,4 +8,4 @@ V Straight line painting (hold Shift / Ctrl) V A button to Copy from Test font dialog to then paste into another frame Bugs: -- Nothing selected after removing a symbol. Potential error throw on "Apply" \ No newline at end of file +V Nothing selected after removing a symbol. Potential error throw on "Apply" \ No newline at end of file