diff --git a/Fonts.cs b/Fonts.cs new file mode 100644 index 0000000..af17da1 --- /dev/null +++ b/Fonts.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Media; + +namespace QuickClaude +{ + // The same font choices as wIRC. Saved in settings.json by Name. + // - Windows fonts (Segoe UI, Tahoma, Tw Cen MT) aren't bundled; they're listed only when + // installed (Tw Cen MT only comes with Office). + // - The rounded fonts (Nunito, Quicksand, Varela Round) are SIL OFL licensed and built into + // the exe from the fonts folder, with their license files. + // An unknown or missing font falls back to Consolas. + public static class Fonts + { + public const string Default = "Consolas"; + + static readonly Uri PackRoot = new Uri("pack://application:,,,/"); + + public class Choice + { + public string Name; + public FontFamily Family; + } + + static List choices; + + public static List All + { + get + { + if (choices != null) return choices; + var installed = new HashSet( + System.Windows.Media.Fonts.SystemFontFamilies.Select(f => f.Source), + StringComparer.OrdinalIgnoreCase); + + choices = new List + { + new Choice { Name = "Consolas", Family = new FontFamily("Consolas, Courier New") } + }; + foreach (var sys in new[] { "Segoe UI", "Tahoma", "Tw Cen MT" }) + if (installed.Contains(sys)) + choices.Add(new Choice { Name = sys, Family = new FontFamily(sys) }); + + choices.Add(Bundled("Nunito (rounded)", "Nunito")); + choices.Add(Bundled("Quicksand (rounded)", "Quicksand")); + choices.Add(Bundled("Varela Round (rounded)", "Varela Round")); + return choices; + } + } + + static Choice Bundled(string name, string family) => + new Choice { Name = name, Family = new FontFamily(PackRoot, "./fonts/#" + family + ", Consolas") }; + + public static Choice Find(string name) => + All.FirstOrDefault(c => string.Equals(c.Name, name, StringComparison.OrdinalIgnoreCase)) ?? All[0]; + } +} diff --git a/MainWindow.cs b/MainWindow.cs index 8b81c4f..c6274ff 100644 --- a/MainWindow.cs +++ b/MainWindow.cs @@ -21,13 +21,15 @@ namespace QuickClaude readonly TextBlock status = new TextBlock(); readonly TextBlock grip = new TextBlock(); WF.NotifyIcon tray; - WF.ToolStripMenuItem topItem, blackItem, whiteItem, lookItem, editItem, autoItem, folderItem; + WF.ToolStripMenuItem fontMenu, topItem, blackItem, whiteItem, lookItem, editItem, autoItem, folderItem; bool lastWasTool; bool quitting; // Nearly invisible fill so the window still catches the mouse (fully clear pixels click through) static readonly Brush HitFill = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0)); - internal static readonly FontFamily Mono = new FontFamily("Consolas, Courier New"); + // The current font (picked from the tray's Font menu). Still called Mono since + // ConfirmWindow and DarkMenu read it when they open. + internal static FontFamily Mono = new FontFamily("Consolas, Courier New"); // Matches wIRC at its smallest font slider setting (10sp = 10 WPF units) internal const double TextSize = 10; const double ResizeEdge = 6; @@ -35,6 +37,7 @@ namespace QuickClaude public MainWindow() { settings = Settings.Load(); + Mono = Fonts.Find(settings.Font).Family; Title = "QuickClaude"; WindowStyle = WindowStyle.None; @@ -88,7 +91,7 @@ namespace QuickClaude rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); rootGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); - // Top row: a faint "clod" label that moves the window, plus a quiet status line + // Top row: a solid "clod" label that moves the window, plus a quiet status line grip.Text = "clod"; grip.FontSize = TextSize; grip.FontFamily = Mono; @@ -131,12 +134,34 @@ namespace QuickClaude Grid.SetRow(bottom, 2); rootGrid.Children.Add(bottom); - // Right-click menus: Copy (and Cut/Paste in the input) plus New conversation; blank areas get just the latter + Content = rootGrid; + BuildContextMenus(); + } + + // Right-click menus: Copy (and Cut/Paste in the input) plus New conversation; blank areas get just the latter. + // Rebuilt when the font changes so they use it too. + void BuildContextMenus() + { transcript.ContextMenu = DarkMenu.Make(transcript, NewConversation); input.ContextMenu = DarkMenu.Make(input, NewConversation); - rootGrid.ContextMenu = DarkMenu.Make(null, NewConversation); + ((Grid)Content).ContextMenu = DarkMenu.Make(null, NewConversation); + } - Content = rootGrid; + void SetFont(string name) + { + var choice = Fonts.Find(name); + settings.Font = choice.Name; + settings.Save(); + Mono = choice.Family; + FontFamily = Mono; + transcript.FontFamily = Mono; + input.FontFamily = Mono; + status.FontFamily = Mono; + grip.FontFamily = Mono; + BuildContextMenus(); + if (fontMenu != null) + foreach (WF.ToolStripMenuItem item in fontMenu.DropDownItems) + item.Checked = item.Text == choice.Name; } static void StyleBox(TextBox tb) @@ -178,7 +203,7 @@ namespace QuickClaude input.CaretBrush = solid; transcript.CaretBrush = solid; status.Foreground = faint; - grip.Foreground = faint; + grip.Foreground = solid; if (blackItem != null) { blackItem.Checked = c == Colors.Black; whiteItem.Checked = c == Colors.White; } } @@ -354,6 +379,15 @@ namespace QuickClaude color.DropDownItems.Add(whiteItem); menu.Items.Add(color); + fontMenu = new WF.ToolStripMenuItem("Font"); + var current = Fonts.Find(settings.Font).Name; + foreach (var choice in Fonts.All) + { + var name = choice.Name; + fontMenu.DropDownItems.Add(new WF.ToolStripMenuItem(name, null, (s, e) => SetFont(name)) { Checked = name == current }); + } + menu.Items.Add(fontMenu); + topItem = new WF.ToolStripMenuItem("Always on top", null, (s, e) => { settings.Topmost = !settings.Topmost; Topmost = settings.Topmost; topItem.Checked = settings.Topmost; settings.Save(); diff --git a/QuickClaude.csproj b/QuickClaude.csproj index ee34c2b..e2e70f1 100644 --- a/QuickClaude.csproj +++ b/QuickClaude.csproj @@ -10,7 +10,7 @@ disable QuickClaude QuickClaude - 1.0.0 + 1.1.0 QuickClaude app.ico win-x64 @@ -21,4 +21,8 @@ none + + + + diff --git a/Settings.cs b/Settings.cs index 15c7f0a..658dfb0 100644 --- a/Settings.cs +++ b/Settings.cs @@ -11,6 +11,7 @@ namespace QuickClaude public double Width { get; set; } = 460; public double Height { get; set; } = 380; public string TextColor { get; set; } = "Black"; + public string Font { get; set; } = "Consolas"; public bool Topmost { get; set; } = false; public string WorkDir { get; set; } = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); public string Mode { get; set; } = "default"; diff --git a/fonts/Nunito-Regular.ttf b/fonts/Nunito-Regular.ttf new file mode 100644 index 0000000..0d7bc23 Binary files /dev/null and b/fonts/Nunito-Regular.ttf differ diff --git a/fonts/OFL-Nunito.txt b/fonts/OFL-Nunito.txt new file mode 100644 index 0000000..c8210f0 --- /dev/null +++ b/fonts/OFL-Nunito.txt @@ -0,0 +1,93 @@ +Copyright 2014 The Nunito Project Authors (https://github.com/googlefonts/nunito) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/OFL-Quicksand.txt b/fonts/OFL-Quicksand.txt new file mode 100644 index 0000000..5186b46 --- /dev/null +++ b/fonts/OFL-Quicksand.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Quicksand Project Authors (https://github.com/andrew-paglinawan/QuicksandFamily), with Reserved Font Name “Quicksand”. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/OFL-VarelaRound.txt b/fonts/OFL-VarelaRound.txt new file mode 100644 index 0000000..300cd6a --- /dev/null +++ b/fonts/OFL-VarelaRound.txt @@ -0,0 +1,93 @@ +Copyright 2023 The Varela Round Project Authors (https://github.com/alefalefalef/Varela-Round-Hebrew/), with Reserved Font Names 'Varela' and ‘Varela Round’. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/fonts/Quicksand-Regular.ttf b/fonts/Quicksand-Regular.ttf new file mode 100644 index 0000000..70d0c5f Binary files /dev/null and b/fonts/Quicksand-Regular.ttf differ diff --git a/fonts/VarelaRound-Regular.ttf b/fonts/VarelaRound-Regular.ttf new file mode 100644 index 0000000..592a836 Binary files /dev/null and b/fonts/VarelaRound-Regular.ttf differ