From 5bd298dbcf23fc9a199cd8fed1776b6fe71235af Mon Sep 17 00:00:00 2001 From: Visvaldis Date: Sun, 13 Sep 2026 15:27:44 -0400 Subject: [PATCH 1/4] fix: correct typo in context menu item label 'past' -> 'paste' --- DotNetCMD/Application/AppForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DotNetCMD/Application/AppForm.cs b/DotNetCMD/Application/AppForm.cs index a497881..9176495 100644 --- a/DotNetCMD/Application/AppForm.cs +++ b/DotNetCMD/Application/AppForm.cs @@ -170,7 +170,7 @@ private void CreateEditMenu(ToolStripMenuItem parent) parent.DropDownItems.Clear(); parent.DropDownItems.Add(CreateMenuItem("copy", Button_Copy)); parent.DropDownItems.Add(CreateMenuItem("cut", Edit_Cut)); - parent.DropDownItems.Add(CreateMenuItem("past", Edit_Paste)); + parent.DropDownItems.Add(CreateMenuItem("paste", Edit_Paste)); parent.DropDownItems.Add(new ToolStripSeparator()); parent.DropDownItems.Add(CreateMenuItem("rename", Edit_Rename)); } From e68ea74944326e7ab89e17c4b50982553002ed0b Mon Sep 17 00:00:00 2001 From: Visvaldis Date: Sun, 13 Sep 2026 15:28:07 -0400 Subject: [PATCH 2/4] feat: migrate all browser views to BufferedListView for reduced flickering --- DotNetCMD/Browsers/Archives/ArchiveBrowser.cs | 4 ++-- DotNetCMD/Browsers/Compound/CompoundBrowser.cs | 4 ++-- .../Browsers/FileSystem/FileBrowser.Designer.cs | 4 ++-- DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs | 4 ++-- DotNetCMD/Browsers/Search/SearchBrowser.cs | 4 ++-- DotNetCMD/Controls/BufferedListView.cs | 13 +++++++++++++ 6 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 DotNetCMD/Controls/BufferedListView.cs diff --git a/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs b/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs index 6a45750..a166724 100644 --- a/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs +++ b/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs @@ -13,7 +13,7 @@ namespace DotNetCommander internal sealed class ArchiveBrowser : BrowserPanelBase { private readonly TextBox locationBox; - private readonly ListView archiveView; + private readonly BufferedListView archiveView; private readonly Label loadingLabel; private readonly List catalog = new List(); private readonly List visibleItems = new List(); @@ -45,7 +45,7 @@ public ArchiveBrowser() }; locationPanel.Controls.Add(locationBox); - archiveView = new ListView + archiveView = new BufferedListView { AllowColumnReorder = true, Dock = DockStyle.Fill, diff --git a/DotNetCMD/Browsers/Compound/CompoundBrowser.cs b/DotNetCMD/Browsers/Compound/CompoundBrowser.cs index 21072d7..9dd7296 100644 --- a/DotNetCMD/Browsers/Compound/CompoundBrowser.cs +++ b/DotNetCMD/Browsers/Compound/CompoundBrowser.cs @@ -14,7 +14,7 @@ internal sealed class CompoundBrowser : BrowserPanelBase { private readonly CompoundFileCatalogService catalogService = new CompoundFileCatalogService(); private readonly AddressBar addressBar; - private readonly ListView compoundView; + private readonly BufferedListView compoundView; private readonly Label loadingLabel; private readonly List catalog = new List(); private readonly List visibleItems = new List(); @@ -30,7 +30,7 @@ public CompoundBrowser() addressBar.RefreshClick += (_, __) => RefreshPanel(); addressBar.ButtonClick += AddressBar_ButtonClick; - compoundView = new ListView + compoundView = new BufferedListView { AllowColumnReorder = true, Dock = DockStyle.Fill, diff --git a/DotNetCMD/Browsers/FileSystem/FileBrowser.Designer.cs b/DotNetCMD/Browsers/FileSystem/FileBrowser.Designer.cs index d9b1fd7..30c263a 100644 --- a/DotNetCMD/Browsers/FileSystem/FileBrowser.Designer.cs +++ b/DotNetCMD/Browsers/FileSystem/FileBrowser.Designer.cs @@ -45,7 +45,7 @@ private void InitializeComponent() { components = new System.ComponentModel.Container(); fileImages = new System.Windows.Forms.ImageList(components); fileImagesLarge = new System.Windows.Forms.ImageList(components); - browserView = new System.Windows.Forms.ListView(); + browserView = new BufferedListView(); contextMenu = new System.Windows.Forms.ContextMenuStrip(components); toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); helpProvider1 = new System.Windows.Forms.HelpProvider(); @@ -131,7 +131,7 @@ private void InitializeComponent() { private System.Windows.Forms.ImageList fileImages; private System.Windows.Forms.ImageList fileImagesLarge; - private System.Windows.Forms.ListView browserView; + private BufferedListView browserView; private System.Windows.Forms.ContextMenuStrip contextMenu; private System.Windows.Forms.HelpProvider helpProvider1; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; diff --git a/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs b/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs index 8c13db7..b06c451 100644 --- a/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs +++ b/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs @@ -22,7 +22,7 @@ internal sealed class GedcomBrowser : BrowserPanelBase private const string TagPathPrefix = "tag/"; private readonly AddressBar addressBar; - private readonly ListView browserView; + private readonly BufferedListView browserView; private readonly Label loadingLabel; private readonly ImageList sexIconsSmall; private readonly ImageList sexIconsLarge; @@ -51,7 +51,7 @@ public GedcomBrowser() sexIconsSmall = CreateSexImageList(16); sexIconsLarge = CreateSexImageList(32); - browserView = new ListView + browserView = new BufferedListView { AllowColumnReorder = true, Dock = DockStyle.Fill, diff --git a/DotNetCMD/Browsers/Search/SearchBrowser.cs b/DotNetCMD/Browsers/Search/SearchBrowser.cs index c4f8ca4..f878d1a 100644 --- a/DotNetCMD/Browsers/Search/SearchBrowser.cs +++ b/DotNetCMD/Browsers/Search/SearchBrowser.cs @@ -14,7 +14,7 @@ internal sealed class SearchBrowser : BrowserPanelBase { private readonly SearchService searchService = new SearchService(); private readonly AddressBar addressBar; - private readonly ListView resultView; + private readonly BufferedListView resultView; private readonly Label statusLabel; private readonly Button cancelButton; private readonly List visibleItems = new List(); @@ -35,7 +35,7 @@ public SearchBrowser() addressBar.ParentClick += (_, __) => LeaveRequested?.Invoke(this, EventArgs.Empty); addressBar.RefreshClick += (_, __) => RefreshPanel(); - resultView = new ListView + resultView = new BufferedListView { AllowColumnReorder = true, Dock = DockStyle.Fill, diff --git a/DotNetCMD/Controls/BufferedListView.cs b/DotNetCMD/Controls/BufferedListView.cs new file mode 100644 index 0000000..c6f2c22 --- /dev/null +++ b/DotNetCMD/Controls/BufferedListView.cs @@ -0,0 +1,13 @@ +using System.Windows.Forms; + +namespace DotNetCommander +{ + internal sealed class BufferedListView : ListView + { + public BufferedListView() + { + DoubleBuffered = true; + ResizeRedraw = true; + } + } +} From 8d882c5df3e9b9035c17baa10c948d343c584667 Mon Sep 17 00:00:00 2001 From: Visvaldis Date: Mon, 14 Sep 2026 00:16:41 -0400 Subject: [PATCH 3/4] fix: use Paste terminology consistently --- DotNetCMD/Application/AppForm.cs | 2 +- DotNetCMD/Browsers/FileSystem/FileBrowser.cs | 10 +++++----- DotNetCMD/Resources/Language.Designer.cs | 6 +++--- DotNetCMD/Resources/Language.de-DE.resx | 2 +- DotNetCMD/Resources/Language.resx | 4 ++-- DotNetCMD/Resources/Language.uk.resx | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/DotNetCMD/Application/AppForm.cs b/DotNetCMD/Application/AppForm.cs index 9176495..38f2798 100644 --- a/DotNetCMD/Application/AppForm.cs +++ b/DotNetCMD/Application/AppForm.cs @@ -536,7 +536,7 @@ private void FileBrowser_AdjacentPanelRequested(object sender, EventArgs e) } /* - * Comand Buttons (e.g.: Copy, Past) + * Comand Buttons (e.g.: Copy, Paste) */ private void Button_View(object sender, EventArgs e) { diff --git a/DotNetCMD/Browsers/FileSystem/FileBrowser.cs b/DotNetCMD/Browsers/FileSystem/FileBrowser.cs index 0755bf0..3f8a0d6 100644 --- a/DotNetCMD/Browsers/FileSystem/FileBrowser.cs +++ b/DotNetCMD/Browsers/FileSystem/FileBrowser.cs @@ -179,8 +179,8 @@ public FileBrowser() { browserView.ShowGroups = false; // Mindestens 1 Item muss im ContextMenü vorhanden sein - ToolStripMenuItem toolItem = new ToolStripMenuItem(Language.getString("past")); - toolItem.Tag = "past"; + ToolStripMenuItem toolItem = new ToolStripMenuItem(Language.getString("paste")); + toolItem.Tag = "paste"; contextMenu.Items.Add(toolItem); @@ -921,7 +921,7 @@ private void contextMenu_ItemClicked(object sender, ToolStripItemClickedEventArg } Clipboard.SetFileDropList(paths); } - else if (tag == "past") { + else if (tag == "paste") { StringCollection paths = Clipboard.GetFileDropList(); CopyWindow = new FormCopy(paths, CurrentPath); CopyWindow.ActionComplete += new FormCopy.ActionCompleteHandler(this.CopyComplete); @@ -956,8 +956,8 @@ private void contextMenu_Opening(object sender, CancelEventArgs e) { contextMenu.Items.Add(toolItem); } - toolItem = new ToolStripMenuItem(Language.getString("past")); - toolItem.Tag = "past"; + toolItem = new ToolStripMenuItem(Language.getString("paste")); + toolItem.Tag = "paste"; contextMenu.Items.Add(toolItem); if (browserView.SelectedItems.Count > 0) { diff --git a/DotNetCMD/Resources/Language.Designer.cs b/DotNetCMD/Resources/Language.Designer.cs index 0e0e2be..5537004 100644 --- a/DotNetCMD/Resources/Language.Designer.cs +++ b/DotNetCMD/Resources/Language.Designer.cs @@ -115,11 +115,11 @@ internal static string newFolder { } /// - /// Ищет локализованную строку, похожую на Past. + /// Ищет локализованную строку, похожую на Paste. /// - internal static string past { + internal static string paste { get { - return ResourceManager.GetString("past", resourceCulture); + return ResourceManager.GetString("paste", resourceCulture); } } diff --git a/DotNetCMD/Resources/Language.de-DE.resx b/DotNetCMD/Resources/Language.de-DE.resx index 1703142..468c644 100644 --- a/DotNetCMD/Resources/Language.de-DE.resx +++ b/DotNetCMD/Resources/Language.de-DE.resx @@ -168,7 +168,7 @@ Der Ordnername enthält ungültige Zeichen oder nicht unterstützte Pfadsegmente. - + Einfügen diff --git a/DotNetCMD/Resources/Language.resx b/DotNetCMD/Resources/Language.resx index 790a24d..72a9bf9 100644 --- a/DotNetCMD/Resources/Language.resx +++ b/DotNetCMD/Resources/Language.resx @@ -216,8 +216,8 @@ No built-in editor is registered for this file type. - - Past + + Paste Are you sure you want to delete this item? diff --git a/DotNetCMD/Resources/Language.uk.resx b/DotNetCMD/Resources/Language.uk.resx index 5bb9ee9..61a6c59 100644 --- a/DotNetCMD/Resources/Language.uk.resx +++ b/DotNetCMD/Resources/Language.uk.resx @@ -168,7 +168,7 @@ Назва папки містить неприпустимі символи або непідтримувані сегменти шляху. - + Вставити From 1781d8b82bad27c8f570b561b7a9da09045b7c9c Mon Sep 17 00:00:00 2001 From: Visvaldis Date: Mon, 14 Sep 2026 00:54:38 -0400 Subject: [PATCH 4/4] feat: add browser row color modes --- DotNetCMD/Browsers/Archives/ArchiveBrowser.cs | 4 + .../Browsers/Compound/CompoundBrowser.cs | 3 + DotNetCMD/Browsers/DataSets/DataSetBrowser.cs | 2 + DotNetCMD/Browsers/FileSystem/FileBrowser.cs | 4 + DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs | 5 + DotNetCMD/Browsers/Search/SearchBrowser.cs | 4 + DotNetCMD/CHANGE.md | 1 + DotNetCMD/Controls/BrowserRowColoring.cs | 144 ++++++++++++++++++ DotNetCMD/Dialogs/Common/FormSettings.cs | 45 ++++++ DotNetCMD/Properties/Settings.Designer.cs | 12 ++ DotNetCMD/Properties/Settings.settings | 3 + DotNetCMD/Resources/Language.de-DE.resx | 13 ++ DotNetCMD/Resources/Language.resx | 13 ++ DotNetCMD/Resources/Language.uk.resx | 12 ++ 14 files changed, 265 insertions(+) create mode 100644 DotNetCMD/Controls/BrowserRowColoring.cs diff --git a/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs b/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs index a166724..9a23881 100644 --- a/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs +++ b/DotNetCMD/Browsers/Archives/ArchiveBrowser.cs @@ -246,6 +246,8 @@ public void ApplyUserSettings(Font browserFont, FileBrowser.BrowserColumnWidths archiveView.View = view; UpdateItemTextForView(); QueueIconLoading(); + BrowserRowColoring.Apply(archiveView, Properties.Settings.Default.BrowserRowColorMode); + } private async Task RefreshAsync() @@ -337,6 +339,8 @@ private void ApplySorting() { archiveView.ListViewItemSorter = new ArchiveListViewItemComparer(sortColumn, sortAscending); archiveView.Sort(); + BrowserRowColoring.Apply(archiveView, Properties.Settings.Default.BrowserRowColorMode); + } private void RenderCurrentPath(string preferredEntry = null) diff --git a/DotNetCMD/Browsers/Compound/CompoundBrowser.cs b/DotNetCMD/Browsers/Compound/CompoundBrowser.cs index 9dd7296..e4de71d 100644 --- a/DotNetCMD/Browsers/Compound/CompoundBrowser.cs +++ b/DotNetCMD/Browsers/Compound/CompoundBrowser.cs @@ -100,6 +100,7 @@ public void ApplyUserSettings(Font browserFont, FileBrowser.BrowserColumnWidths compoundView.Columns[3].Width = Math.Max(60, widths.SizeWidth); compoundView.Columns[4].Width = Math.Max(80, widths.DateWidth); compoundView.View = view == System.Windows.Forms.View.Details ? view : System.Windows.Forms.View.Details; + BrowserRowColoring.Apply(compoundView, Properties.Settings.Default.BrowserRowColorMode); } public async Task OpenCompoundAsync(string path, bool reportFailure = true) @@ -320,6 +321,8 @@ private void RenderCurrentPath(string preferredEntry = null) { compoundView.EndUpdate(); } + BrowserRowColoring.Apply(compoundView, Properties.Settings.Default.BrowserRowColorMode); + addressBar.Path = DisplayLocation; RaiseLocationChanged(DisplayLocation); diff --git a/DotNetCMD/Browsers/DataSets/DataSetBrowser.cs b/DotNetCMD/Browsers/DataSets/DataSetBrowser.cs index c23a3c1..3ec5c4c 100644 --- a/DotNetCMD/Browsers/DataSets/DataSetBrowser.cs +++ b/DotNetCMD/Browsers/DataSets/DataSetBrowser.cs @@ -262,6 +262,7 @@ public void ApplyUserSettings(Font browserFont) grid.ColumnHeadersDefaultCellStyle.Font = browserFont; grid.ColumnHeadersHeight = Math.Max(24, browserFont.Height + 8); grid.RowTemplate.Height = Math.Max(22, browserFont.Height + 8); + BrowserRowColoring.Apply(grid, Properties.Settings.Default.BrowserRowColorMode); } private void ActivateSelectedItem() @@ -319,6 +320,7 @@ private void RenderCurrentLocation() else if (internalPath.StartsWith("relation/", StringComparison.OrdinalIgnoreCase)) RenderRelationDetails(); + BrowserRowColoring.Apply(grid, Properties.Settings.Default.BrowserRowColorMode); addressBar.Path = DisplayLocation; grid.ResumeLayout(); RaiseLocationChanged(DisplayLocation); diff --git a/DotNetCMD/Browsers/FileSystem/FileBrowser.cs b/DotNetCMD/Browsers/FileSystem/FileBrowser.cs index 3f8a0d6..80f46bf 100644 --- a/DotNetCMD/Browsers/FileSystem/FileBrowser.cs +++ b/DotNetCMD/Browsers/FileSystem/FileBrowser.cs @@ -579,6 +579,8 @@ public void ApplyUserSettings() browserView.ShowGroups = browserView.View == System.Windows.Forms.View.Details && Properties.Settings.Default.FileBrowserDirectoriesFirst; ApplySorting(); + BrowserRowColoring.Apply(browserView, Properties.Settings.Default.BrowserRowColorMode); + } /** @@ -687,6 +689,8 @@ public String browseTo(String path) { { browserView.Items.AddRange(pendingItems.ToArray()); } + BrowserRowColoring.Apply(browserView, Properties.Settings.Default.BrowserRowColorMode); + } finally { diff --git a/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs b/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs index b06c451..dfb0a79 100644 --- a/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs +++ b/DotNetCMD/Browsers/Gedcom/GedcomBrowser.cs @@ -269,8 +269,11 @@ public void ApplyUserSettings(Font browserFont, FileBrowser.BrowserColumnWidths browserView.View = view; if (catalog != null) RenderCurrentLocation(); + BrowserRowColoring.Apply(browserView, Properties.Settings.Default.BrowserRowColorMode); } + + private void ActivateSelectedItem() { ViewEntry entry = GetCurrentEntry(); @@ -336,6 +339,8 @@ private void RenderCurrentLocation() { browserView.EndUpdate(); } + BrowserRowColoring.Apply(browserView, Properties.Settings.Default.BrowserRowColorMode); + addressBar.Path = DisplayLocation; RaiseLocationChanged(DisplayLocation); diff --git a/DotNetCMD/Browsers/Search/SearchBrowser.cs b/DotNetCMD/Browsers/Search/SearchBrowser.cs index f878d1a..bdc3947 100644 --- a/DotNetCMD/Browsers/Search/SearchBrowser.cs +++ b/DotNetCMD/Browsers/Search/SearchBrowser.cs @@ -128,6 +128,8 @@ public void ApplyUserSettings(Font browserFont, FileBrowser.BrowserColumnWidths resultView.Columns[4].Width = Math.Max(70, widths.SizeWidth); resultView.Columns[5].Width = Math.Max(90, widths.DateWidth); resultView.View = view == System.Windows.Forms.View.Details ? view : System.Windows.Forms.View.Details; + BrowserRowColoring.Apply(resultView, Properties.Settings.Default.BrowserRowColorMode); + } public async Task StartSearchAsync(SearchQuery query) @@ -284,6 +286,8 @@ private void PopulateResults(IReadOnlyList results) finally { resultView.EndUpdate(); + BrowserRowColoring.Apply(resultView, Properties.Settings.Default.BrowserRowColorMode); + } } diff --git a/DotNetCMD/CHANGE.md b/DotNetCMD/CHANGE.md index 839139d..2782eef 100644 --- a/DotNetCMD/CHANGE.md +++ b/DotNetCMD/CHANGE.md @@ -12,6 +12,7 @@ - **[ux]** Детермінований progress bar показує пакет і кількість оброблених файлів, минулий час, адаптивну оцінку залишку та очікуваний час завершення; локально відхилені й пропущені моделлю рядки залишаються у preview з конкретними причинами. - **[feat]** Додано summary-only режим без файлових операцій; великі папки описуються по пакетах із фінальним об’єднанням часткових підсумків, а Auto читає вміст лише коли він потрібний запиту. - **[ux]** `Options -> AI organizer -> Models...` відкриває фільтровану таблицю моделей із `/api/tags`: parameters, quantization, context, disk size, family, digest і capabilities; у формі організатора показується коротка картка вибраної моделі, embedding-only моделі не пропонуються для планування. +- **[ux]** `Options -> View` тепер дозволяє вимкнути кольори рядків, увімкнути чергування або розфарбувати рядки за типом файла; вибір зберігається для користувача й застосовується до всіх browser-панелей. ## [1.9.0] - 2026-09-11 diff --git a/DotNetCMD/Controls/BrowserRowColoring.cs b/DotNetCMD/Controls/BrowserRowColoring.cs new file mode 100644 index 0000000..c64524a --- /dev/null +++ b/DotNetCMD/Controls/BrowserRowColoring.cs @@ -0,0 +1,144 @@ +using System; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +namespace DotNetCommander +{ + internal static class BrowserRowColoring + { + internal const string None = "None"; + internal const string Striped = "Striped"; + internal const string ByExtension = "ByExtension"; + + + internal static string NormalizeMode(string mode) + { + if (string.Equals(mode, Striped, StringComparison.OrdinalIgnoreCase)) + return Striped; + if (string.Equals(mode, ByExtension, StringComparison.OrdinalIgnoreCase)) + return ByExtension; + return None; + } + + internal static void Apply(ListView listView, string mode) + { + if (listView == null) + return; + + string normalizedMode = NormalizeMode(mode); + Color baseColor = listView.BackColor.IsEmpty ? SystemColors.Window : listView.BackColor; + Color foregroundColor = listView.ForeColor.IsEmpty ? SystemColors.WindowText : listView.ForeColor; + + for (int index = 0; index < listView.Items.Count; index++) + { + ListViewItem item = listView.Items[index]; + Color rowColor = GetRowColor(normalizedMode, index, GetItemName(item), baseColor); + item.UseItemStyleForSubItems = normalizedMode != None; + item.BackColor = rowColor; + item.ForeColor = normalizedMode == None ? Color.Empty : foregroundColor; + } + } + + internal static void Apply(DataGridView grid, string mode) + { + if (grid == null) + return; + + string normalizedMode = NormalizeMode(mode); + Color baseColor = grid.BackgroundColor.IsEmpty ? SystemColors.Window : grid.BackgroundColor; + Color foregroundColor = grid.ForeColor.IsEmpty ? SystemColors.WindowText : grid.ForeColor; + + for (int index = 0; index < grid.Rows.Count; index++) + { + DataGridViewRow row = grid.Rows[index]; + if (row.IsNewRow) + continue; + + string rowName = row.Cells.Count == 0 ? string.Empty : row.Cells[0].Value?.ToString(); + Color rowColor = GetRowColor(normalizedMode, index, rowName, baseColor); + row.DefaultCellStyle.BackColor = rowColor; + row.DefaultCellStyle.ForeColor = normalizedMode == None ? Color.Empty : foregroundColor; + } + } + + internal static Color GetRowColor(string mode, int rowIndex, string name, Color baseColor) + { + switch (NormalizeMode(mode)) + { + case Striped: + return rowIndex % 2 == 0 ? baseColor : GetTint(baseColor, Color.FromArgb(125, 155, 190)); + case ByExtension: + return GetExtensionColor(name, baseColor); + default: + return Color.Empty; + } + } + + private static Color GetExtensionColor(string name, Color baseColor) + { + string extension = Path.GetExtension(name ?? string.Empty); + if (string.IsNullOrEmpty(extension)) + return baseColor; + + switch (extension.ToLowerInvariant()) + { + case ".png": + case ".jpg": + case ".jpeg": + case ".gif": + case ".bmp": + case ".svg": + return GetTint(baseColor, Color.FromArgb(80, 140, 205)); + case ".zip": + case ".tar": + case ".gz": + case ".tgz": + case ".7z": + case ".rar": + return GetTint(baseColor, Color.FromArgb(215, 145, 60)); + case ".cs": + case ".cpp": + case ".c": + case ".h": + case ".java": + case ".js": + case ".ts": + case ".py": + case ".json": + case ".xml": + return GetTint(baseColor, Color.FromArgb(75, 160, 105)); + case ".txt": + case ".md": + case ".rtf": + case ".doc": + case ".docx": + case ".pdf": + return GetTint(baseColor, Color.FromArgb(145, 105, 185)); + default: + return baseColor; + } + } + + private static string GetItemName(ListViewItem item) + { + return item?.SubItems.Count > 1 + ? item.SubItems[1].Text + : item?.Text; + } + + private static Color GetTint(Color baseColor, Color accent) + { + const double tintStrength = 0.16; + return Color.FromArgb( + Blend(baseColor.R, accent.R, tintStrength), + Blend(baseColor.G, accent.G, tintStrength), + Blend(baseColor.B, accent.B, tintStrength)); + } + + private static int Blend(int source, int target, double amount) + { + return (int)Math.Round(source + (target - source) * amount); + } + } +} diff --git a/DotNetCMD/Dialogs/Common/FormSettings.cs b/DotNetCMD/Dialogs/Common/FormSettings.cs index 440bc69..e5b346c 100644 --- a/DotNetCMD/Dialogs/Common/FormSettings.cs +++ b/DotNetCMD/Dialogs/Common/FormSettings.cs @@ -19,6 +19,8 @@ public sealed class FormSettings : Form private readonly Panel aiPage; private readonly Panel performancePage; private readonly ComboBox browserFontComboBox; + private readonly ComboBox browserRowColorModeComboBox; + private readonly ComboBox textEditorFontComboBox; private readonly ComboBox rtfEditorFontComboBox; private readonly ComboBox markdownPreviewFontComboBox; @@ -171,6 +173,15 @@ public FormSettings(FileBrowser.BrowserColumnWidths initialColumnWidths) uiLanguageComboBox.Items.Add(new LanguageOption("uk", "Українська")); browserFontSizeNumeric = CreateNumeric(8, 32, 120); + browserRowColorModeComboBox = new ComboBox + { + DropDownStyle = ComboBoxStyle.DropDownList, + Width = 280 + }; + browserRowColorModeComboBox.Items.Add(new RowColorModeOption(BrowserRowColoring.None, Language.getString("settingsBrowserRowColorNone"))); + browserRowColorModeComboBox.Items.Add(new RowColorModeOption(BrowserRowColoring.Striped, Language.getString("settingsBrowserRowColorStriped"))); + browserRowColorModeComboBox.Items.Add(new RowColorModeOption(BrowserRowColoring.ByExtension, Language.getString("settingsBrowserRowColorByExtension"))); + textEditorFontSizeNumeric = CreateNumeric(6, 72, 120); rtfEditorFontSizeNumeric = CreateNumeric(6, 72, 120); markdownPreviewBaseFontSizeNumeric = CreateNumeric(8, 48, 120); @@ -405,6 +416,8 @@ private void BuildViewPage() AddRow(layout, Language.getString("settingsLanguage"), uiLanguageComboBox); AddRow(layout, Language.getString("settingsBrowserFontName"), browserFontComboBox); AddRow(layout, Language.getString("settingsBrowserFontSize"), browserFontSizeNumeric); + AddRow(layout, Language.getString("settingsBrowserRowColorMode"), browserRowColorModeComboBox); + AddRow(layout, Language.getString("settingsColumnNameWidth"), nameColumnWidthNumeric); AddRow(layout, Language.getString("settingsColumnTypeWidth"), typeColumnWidthNumeric); AddRow(layout, Language.getString("settingsColumnSizeWidth"), sizeColumnWidthNumeric); @@ -616,6 +629,8 @@ private void LoadSettings() SelectLanguageOption(Properties.Settings.Default.UiLanguage); SelectFontComboValue(browserFontComboBox, Properties.Settings.Default.BrowserFontName, "Microsoft Sans Serif"); browserFontSizeNumeric.Value = (decimal)Math.Max(8f, Properties.Settings.Default.BrowserFontSize); + SelectRowColorMode(Properties.Settings.Default.BrowserRowColorMode); + SelectFontComboValue(dialogFontComboBox, Properties.Settings.Default.DialogFontName, "Segoe UI"); dialogFontSizeNumeric.Value = (decimal)Math.Max(8f, Properties.Settings.Default.DialogFontSize); dialogCaptionFontSizeNumeric.Value = (decimal)Math.Max(8f, Properties.Settings.Default.DialogCaptionFontSize); @@ -682,6 +697,9 @@ private void SaveSettings() Properties.Settings.Default.UiLanguage = (uiLanguageComboBox.SelectedItem as LanguageOption)?.Value ?? "auto"; Properties.Settings.Default.BrowserFontName = browserFontComboBox.SelectedItem?.ToString() ?? "Microsoft Sans Serif"; Properties.Settings.Default.BrowserFontSize = (float)browserFontSizeNumeric.Value; + Properties.Settings.Default.BrowserRowColorMode = + (browserRowColorModeComboBox.SelectedItem as RowColorModeOption)?.Value ?? BrowserRowColoring.None; + Properties.Settings.Default.DialogFontName = dialogFontComboBox.SelectedItem?.ToString() ?? "Segoe UI"; Properties.Settings.Default.DialogFontSize = (float)dialogFontSizeNumeric.Value; Properties.Settings.Default.DialogCaptionFontSize = (float)dialogCaptionFontSizeNumeric.Value; @@ -896,6 +914,33 @@ private static Control CreatePageHeader(string title, string description) return panel; } + private void SelectRowColorMode(string value) + { + RowColorModeOption selectedOption = browserRowColorModeComboBox.Items + .OfType() + .FirstOrDefault(option => string.Equals(option.Value, value, StringComparison.OrdinalIgnoreCase)) + ?? browserRowColorModeComboBox.Items.OfType().FirstOrDefault(); + + browserRowColorModeComboBox.SelectedItem = selectedOption; + } + + private sealed class RowColorModeOption + { + public RowColorModeOption(string value, string displayName) + { + Value = value; + DisplayName = displayName; + } + + public string Value { get; } + public string DisplayName { get; } + + public override string ToString() + { + return DisplayName; + } + } + private sealed class LanguageOption { public LanguageOption(string value, string displayName) diff --git a/DotNetCMD/Properties/Settings.Designer.cs b/DotNetCMD/Properties/Settings.Designer.cs index 791f5a5..87cd1bc 100644 --- a/DotNetCMD/Properties/Settings.Designer.cs +++ b/DotNetCMD/Properties/Settings.Designer.cs @@ -166,6 +166,18 @@ public float BrowserFontSize { this["BrowserFontSize"] = value; } } + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("None")] + public string BrowserRowColorMode { + get { + return ((string)(this["BrowserRowColorMode"])); + } + set { + this["BrowserRowColorMode"] = value; + } + } + [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] diff --git a/DotNetCMD/Properties/Settings.settings b/DotNetCMD/Properties/Settings.settings index beab295..2d71251 100644 --- a/DotNetCMD/Properties/Settings.settings +++ b/DotNetCMD/Properties/Settings.settings @@ -38,6 +38,9 @@ 11.25 + + None + Segoe UI diff --git a/DotNetCMD/Resources/Language.de-DE.resx b/DotNetCMD/Resources/Language.de-DE.resx index 468c644..38b46b6 100644 --- a/DotNetCMD/Resources/Language.de-DE.resx +++ b/DotNetCMD/Resources/Language.de-DE.resx @@ -616,6 +616,19 @@ Ordner beim Sortieren vor Dateien anzeigen (kann große Listen verlangsamen) + + Zeilenfarbmodus + + + Keine + + + Abwechselnde Zeilenfarben + + + Zeilen nach Dateityp färben + + Sprache der Benutzeroberfläche diff --git a/DotNetCMD/Resources/Language.resx b/DotNetCMD/Resources/Language.resx index 72a9bf9..d65c5cb 100644 --- a/DotNetCMD/Resources/Language.resx +++ b/DotNetCMD/Resources/Language.resx @@ -783,6 +783,19 @@ Keep folders before files when sorting (may slow down large lists) + + Row color mode + + + None + + + Alternating row colors + + + Color rows by file type + + Interface language diff --git a/DotNetCMD/Resources/Language.uk.resx b/DotNetCMD/Resources/Language.uk.resx index 61a6c59..4e1a27d 100644 --- a/DotNetCMD/Resources/Language.uk.resx +++ b/DotNetCMD/Resources/Language.uk.resx @@ -616,6 +616,18 @@ Під час сортування завжди показувати каталоги перед файлами (може сповільнити великі списки) + + Режим кольорів рядків + + + Немає + + + Чергування кольорів рядків + + + Фарбувати рядки за типом файла + Мова інтерфейсу