Skip to content

Commit 059bae6

Browse files
authored
Merge pull request #252 from jrouzies-fr/Dark-Theme
Dark theme V1
2 parents 6390095 + adbcd03 commit 059bae6

24 files changed

+1409
-704
lines changed

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# LogExpert [![Build status](https://ci.appveyor.com/api/projects/status/hxwxyyxy81l4tee8/branch/master?svg=true)](https://ci.appveyor.com/project/Zarunbal/logexpert/branch/master)
22

3-
Clone from https://logexpert.codeplex.com/
3+
This is a clone from (no longer exists) https://logexpert.codeplex.com/
44

55
# Overview
66
LogExpert is a Windows tail program (a GUI replacement for the Unix tail command).
@@ -21,6 +21,7 @@ Summary of (most) features:
2121
* Plugin API for more log file data sources
2222
* Automatical determine columnizer with given file name and content (Experimental)
2323
* Serilog.Formatting.Compact format support (Experimental)
24+
* Portable (all options / settings saved in application startup directory)
2425

2526
# Download
2627
Follow the [Link](https://github.com/zarunbal/LogExpert/releases/latest) and download the latest package. Just extract it where you want and execute the application or download the Setup and install it
@@ -56,3 +57,13 @@ Nuke.build Requirements
5657
Please checkout the wiki for FAQ / HELP / Informations / Examples
5758

5859
https://github.com/zarunbal/LogExpert/wiki
60+
61+
## Credits
62+
### Contributors
63+
64+
This project exists thanks to all the people who contribute.
65+
<a href="https://github.com/zarunbal/LogExpert/graphs/contributors">
66+
<img src="https://contrib.rocks/image?repo=zarunbal/LogExpert" />
67+
</a>
68+
69+
Made with [contrib.rocks](https://contrib.rocks).

src/LogExpert/Classes/PaintHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static void CellPainting(ILogPaintContext logPaintCtx, DataGridView gridV
6060
}
6161
else
6262
{
63-
Color bgColor = Color.White;
63+
Color bgColor = LogExpert.Config.ColorMode.DockBackgroundColor;
6464
if (!DebugOptions.disableWordHighlight)
6565
{
6666
if (entry != null)
@@ -311,7 +311,7 @@ private static void PaintHighlightedCell(ILogPaintContext logPaintCtx, DataGridV
311311
HilightMatchEntry hme = new HilightMatchEntry();
312312
hme.StartPos = 0;
313313
hme.Length = column.FullValue.Length;
314-
hme.HilightEntry = new HilightEntry(column.FullValue, groundEntry?.ForegroundColor ?? Color.FromKnownColor(KnownColor.Black), groundEntry?.BackgroundColor ?? Color.Empty, false);
314+
hme.HilightEntry = new HilightEntry(column.FullValue, groundEntry?.ForegroundColor ?? LogExpert.Config.ColorMode.ForeColor, groundEntry?.BackgroundColor ?? Color.Empty, false);
315315
matchList = MergeHighlightMatchEntries(matchList, hme);
316316
}
317317
}

src/LogExpert/Config/ColorMode.cs

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Runtime.InteropServices;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using System.Drawing;
8+
9+
namespace LogExpert.Config
10+
{
11+
public static class ColorMode
12+
{
13+
// Bright Theme
14+
// https://paletton.com/#uid=15-0u0k00sH00kJ0pq+00RL00RL
15+
private static readonly Color BrightBookmarkDefaultSystemColor = SystemColors.Control; // Important: only supports SystemColors
16+
private static readonly Color LessBrightBackgroundColor = Color.FromArgb(208, 205, 206);
17+
private static readonly Color BrightBackgroundColor = Color.FromArgb(221, 221, 221);
18+
private static readonly Color BrighterBackgroundColor = Color.FromArgb(253, 253, 253);
19+
private static readonly Color BrightForeColor = Color.FromArgb(0, 0, 0);
20+
21+
// Dark Theme
22+
// https://paletton.com/#uid=15-0u0k005U0670008J003Y003Y
23+
private static readonly Color DarkBookmarkDefaultSystemColor = SystemColors.ControlDarkDark; // Important: only supports SystemColors
24+
private static readonly Color LessLessDarkBackgroundColor = Color.FromArgb(90, 90, 90);
25+
private static readonly Color LessDarkBackgroundColor = Color.FromArgb(67, 67, 67);
26+
private static readonly Color DarkBackgroundColor = Color.FromArgb(45, 45, 45);
27+
private static readonly Color DarkerBackgroundColor = Color.FromArgb(30, 30, 30);
28+
private static readonly Color DarkForeColor = Color.FromArgb(255, 255, 255);
29+
30+
// Default
31+
public static Color BackgroundColor = LessBrightBackgroundColor;
32+
public static Color DockBackgroundColor = BrighterBackgroundColor;
33+
public static Color BookmarksDefaultBackgroundColor = BrightBookmarkDefaultSystemColor;
34+
public static Color ForeColor = BrightForeColor;
35+
public static Color MenuBackgroundColor = BrighterBackgroundColor;
36+
public static Color HoverMenuBackgroundColor = LessBrightBackgroundColor;
37+
public static Color ActiveTabColor = BrighterBackgroundColor;
38+
public static Color InactiveTabColor = LessBrightBackgroundColor;
39+
public static Color TabsBackgroundStripColor = LessBrightBackgroundColor;
40+
41+
42+
public static bool DarkModeEnabled = false;
43+
44+
public static void LoadColorMode()
45+
{
46+
var preferences = Config.ConfigManager.Settings.preferences;
47+
48+
if (preferences.darkMode)
49+
{
50+
SetDarkMode();
51+
}
52+
else
53+
{
54+
SetBrightMode();
55+
}
56+
}
57+
58+
private static void SetDarkMode()
59+
{
60+
BackgroundColor = DarkBackgroundColor;
61+
ForeColor = DarkForeColor;
62+
MenuBackgroundColor = DarkerBackgroundColor;
63+
DockBackgroundColor = LessDarkBackgroundColor;
64+
HoverMenuBackgroundColor = LessDarkBackgroundColor;
65+
BookmarksDefaultBackgroundColor = DarkBookmarkDefaultSystemColor;
66+
TabsBackgroundStripColor = LessDarkBackgroundColor;
67+
ActiveTabColor = LessLessDarkBackgroundColor;
68+
InactiveTabColor = LessDarkBackgroundColor;
69+
DarkModeEnabled = true;
70+
}
71+
72+
private static void SetBrightMode()
73+
{
74+
BackgroundColor = BrightBackgroundColor;
75+
ForeColor = BrightForeColor;
76+
MenuBackgroundColor = BrighterBackgroundColor;
77+
DockBackgroundColor = BrighterBackgroundColor;
78+
BookmarksDefaultBackgroundColor = BrightBookmarkDefaultSystemColor;
79+
HoverMenuBackgroundColor = LessBrightBackgroundColor;
80+
TabsBackgroundStripColor = BrighterBackgroundColor;
81+
ActiveTabColor = BrighterBackgroundColor;
82+
InactiveTabColor = LessBrightBackgroundColor;
83+
DarkModeEnabled = false;
84+
}
85+
86+
#region TitleBarDarkMode
87+
[DllImport("dwmapi.dll")]
88+
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
89+
90+
private const int DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19;
91+
private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20;
92+
93+
public static bool UseImmersiveDarkMode(IntPtr handle, bool enabled)
94+
{
95+
96+
var attribute = DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1;
97+
if (IsWindows10OrGreater(18985))
98+
{
99+
attribute = DWMWA_USE_IMMERSIVE_DARK_MODE;
100+
}
101+
102+
int useImmersiveDarkMode = enabled ? 1 : 0;
103+
return DwmSetWindowAttribute(handle, (int)attribute, ref useImmersiveDarkMode, sizeof(int)) == 0;
104+
105+
}
106+
107+
private static bool IsWindows10OrGreater(int build = -1)
108+
{
109+
return Environment.OSVersion.Version.Major >= 10 && Environment.OSVersion.Version.Build >= build;
110+
}
111+
112+
#endregion TitleBarDarkMode
113+
114+
}
115+
}

src/LogExpert/Config/Preferences.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public class Preferences
1515

1616
public bool askForClose = false;
1717

18+
public bool darkMode = false;
19+
1820
public int bufferCount = 100;
1921

2022
public List<ColumnizerMaskEntry> columnizerMaskList = new List<ColumnizerMaskEntry>();

src/LogExpert/Controls/LogTabWindow/LogTabWindow.cs

Lines changed: 115 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ public partial class LogTabWindow : Form
7272

7373
public LogTabWindow(string[] fileNames, int instanceNumber, bool showInstanceNumbers)
7474
{
75-
InitializeComponent();
75+
InitializeComponent();
76+
77+
ChangeTheme(Controls);
78+
7679
_startupFileNames = fileNames;
7780
this._instanceNumber = instanceNumber;
7881
this._showInstanceNumbers = showInstanceNumbers;
@@ -83,7 +86,7 @@ public LogTabWindow(string[] fileNames, int instanceNumber, bool showInstanceNum
8386
HilightGroupList = ConfigManager.Settings.hilightGroupList;
8487

8588
Rectangle led = new Rectangle(0, 0, 8, 2);
86-
89+
8790
for (int i = 0; i < _leds.Length; ++i)
8891
{
8992
_leds[i] = led;
@@ -97,27 +100,27 @@ public LogTabWindow(string[] fileNames, int instanceNumber, bool showInstanceNum
97100
_ledBrushes[2] = new SolidBrush(Color.FromArgb(255, 0, 220, 0));
98101
_ledBrushes[3] = new SolidBrush(Color.FromArgb(255, 0, 220, 0));
99102
_ledBrushes[4] = new SolidBrush(Color.FromArgb(255, 0, 220, 0));
100-
103+
101104
_offLedBrush = new SolidBrush(Color.FromArgb(grayAlpha, 160, 160, 160));
102-
105+
103106
_dirtyLedBrush = new SolidBrush(Color.FromArgb(255, 220, 0, 00));
104-
107+
105108
_tailLedBrush[0] = new SolidBrush(Color.FromArgb(255, 50, 100, 250)); // Follow tail: blue-ish
106109
_tailLedBrush[1] = new SolidBrush(Color.FromArgb(grayAlpha, 160, 160, 160)); // Don't follow tail: gray
107110
_tailLedBrush[2] = new SolidBrush(Color.FromArgb(255, 220, 220, 0)); // Stop follow tail (trigger): yellow-ish
108-
111+
109112
_syncLedBrush = new SolidBrush(Color.FromArgb(255, 250, 145, 30));
110-
113+
111114
CreateIcons();
112-
115+
113116
_tabStringFormat.LineAlignment = StringAlignment.Center;
114117
_tabStringFormat.Alignment = StringAlignment.Near;
115118

116119
ToolStripControlHost host = new ToolStripControlHost(checkBoxFollowTail);
117-
120+
118121
host.Padding = new Padding(20, 0, 0, 0);
119122
host.BackColor = Color.FromKnownColor(KnownColor.Transparent);
120-
123+
121124
int index = buttonToolStrip.Items.IndexOfKey("toolStripButtonTail");
122125

123126
toolStripEncodingASCIIItem.Text = Encoding.ASCII.HeaderName;
@@ -151,6 +154,108 @@ public LogTabWindow(string[] fileNames, int instanceNumber, bool showInstanceNum
151154

152155
#endregion
153156

157+
#region ColorTheme
158+
public void ChangeTheme(Control.ControlCollection container)
159+
{
160+
LogExpert.Config.ColorMode.LoadColorMode();
161+
LogExpert.Config.ColorMode.UseImmersiveDarkMode(this.Handle, LogExpert.Config.ColorMode.DarkModeEnabled);
162+
163+
#region ApplyColorToAllControls
164+
foreach (Control component in container)
165+
{
166+
if (component.Controls != null && component.Controls.Count > 0)
167+
{
168+
ChangeTheme(component.Controls);
169+
component.BackColor = LogExpert.Config.ColorMode.BackgroundColor;
170+
component.ForeColor = LogExpert.Config.ColorMode.ForeColor;
171+
}
172+
else
173+
{
174+
component.BackColor = LogExpert.Config.ColorMode.BackgroundColor;
175+
component.ForeColor = LogExpert.Config.ColorMode.ForeColor;
176+
}
177+
178+
if (component is MenuStrip)
179+
{
180+
var menu = (MenuStrip)component;
181+
182+
foreach (ToolStripMenuItem item in menu.Items)
183+
{
184+
item.ForeColor = LogExpert.Config.ColorMode.ForeColor;
185+
item.BackColor = LogExpert.Config.ColorMode.BackgroundColor;
186+
187+
try
188+
{
189+
for(var x = 0; x< item.DropDownItems.Count; x++)
190+
{
191+
var children = item.DropDownItems[x];
192+
children.ForeColor = LogExpert.Config.ColorMode.ForeColor;
193+
children.BackColor = LogExpert.Config.ColorMode.MenuBackgroundColor;
194+
195+
196+
if(children is ToolStripDropDownItem) {
197+
198+
for (var y = 0; y < ((ToolStripDropDownItem)children).DropDownItems.Count; y++)
199+
{
200+
var subChildren = ((ToolStripDropDownItem)children).DropDownItems[y];
201+
subChildren.ForeColor = LogExpert.Config.ColorMode.ForeColor;
202+
subChildren.BackColor = LogExpert.Config.ColorMode.MenuBackgroundColor;
203+
}
204+
}
205+
}
206+
}
207+
catch (Exception ex)
208+
{
209+
_logger.Error(ex, "An error occured while applying style dynamically to all Controls under LogTabWindow:");
210+
}
211+
}
212+
}
213+
}
214+
#endregion
215+
216+
// Colors for selected menus
217+
mainMenuStrip.Renderer = new LogExpert.Extensions.ExtendedMenuStripRenderer();
218+
219+
// Dock special color
220+
dockPanel.DockBackColor = LogExpert.Config.ColorMode.DockBackgroundColor;
221+
222+
// Remove toolstrip bottom border
223+
buttonToolStrip.Renderer = new LogExpert.Extensions.ToolStripRendererExtension();
224+
225+
#region Tabs
226+
tabContextMenuStrip.Renderer = new LogExpert.Extensions.ExtendedMenuStripRenderer();
227+
228+
// Tabs menu
229+
for (var y = 0; y < tabContextMenuStrip.Items.Count; y++)
230+
{
231+
var item = tabContextMenuStrip.Items[y];
232+
item.ForeColor = LogExpert.Config.ColorMode.ForeColor;
233+
item.BackColor = LogExpert.Config.ColorMode.MenuBackgroundColor;
234+
}
235+
236+
// Tabs line
237+
dockPanel.Skin.DockPaneStripSkin.ToolWindowGradient.DockStripGradient.StartColor = LogExpert.Config.ColorMode.TabsBackgroundStripColor;
238+
dockPanel.Skin.DockPaneStripSkin.ToolWindowGradient.DockStripGradient.EndColor = LogExpert.Config.ColorMode.TabsBackgroundStripColor;
239+
240+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.DockStripGradient.StartColor = LogExpert.Config.ColorMode.TabsBackgroundStripColor;
241+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.DockStripGradient.EndColor = LogExpert.Config.ColorMode.TabsBackgroundStripColor;
242+
243+
// Tabs
244+
dockPanel.Skin.DockPaneStripSkin.ToolWindowGradient.ActiveTabGradient.StartColor = LogExpert.Config.ColorMode.ActiveTabColor;
245+
dockPanel.Skin.DockPaneStripSkin.ToolWindowGradient.ActiveTabGradient.EndColor = LogExpert.Config.ColorMode.ActiveTabColor;
246+
dockPanel.Skin.DockPaneStripSkin.ToolWindowGradient.ActiveTabGradient.TextColor = LogExpert.Config.ColorMode.ForeColor;
247+
248+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.ActiveTabGradient.StartColor = LogExpert.Config.ColorMode.ActiveTabColor;
249+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.ActiveTabGradient.EndColor = LogExpert.Config.ColorMode.ActiveTabColor;
250+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.ActiveTabGradient.TextColor = LogExpert.Config.ColorMode.ForeColor;
251+
252+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.InactiveTabGradient.StartColor = LogExpert.Config.ColorMode.InactiveTabColor;
253+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.InactiveTabGradient.EndColor = LogExpert.Config.ColorMode.InactiveTabColor;
254+
dockPanel.Skin.DockPaneStripSkin.DocumentGradient.InactiveTabGradient.TextColor = LogExpert.Config.ColorMode.ForeColor;
255+
#endregion Tabs
256+
}
257+
#endregion
258+
154259
#region Delegates
155260

156261
private delegate void AddFileTabsDelegate(string[] fileNames);

0 commit comments

Comments
 (0)