Cleanup and remove of CustomScrollbar

This commit is contained in:
Peter Kirmeier 2022-11-19 19:33:23 +01:00
parent 8001a5324a
commit 1245700a13
9 changed files with 32 additions and 1103 deletions

View file

@ -20,6 +20,7 @@ namespace SystemTrayMenu.Business
using SystemTrayMenu.Helper;
using SystemTrayMenu.Helpers;
using SystemTrayMenu.Utilities;
using static SystemTrayMenu.UserInterface.Menu;
using Menu = SystemTrayMenu.UserInterface.Menu;
internal class Menus : IDisposable
@ -62,18 +63,17 @@ namespace SystemTrayMenu.Business
if (e.Result == null)
{
// Clean up menu status IsMenuOpen for previous one
// The main menu gets loaded again
// Clean up menu status of previous one
ListView dgvMainMenu = menus[0].GetDataGridView();
#if TODO
foreach (DataRow row in ((DataTable)dgvMainMenu.DataSource).Rows)
foreach (ListViewItemData item in dgvMainMenu.Items)
{
RowData rowDataToClear = (RowData)row[2];
RowData rowDataToClear = item.data;
rowDataToClear.IsMenuOpen = false;
rowDataToClear.IsClicking = false;
rowDataToClear.IsSelected = false;
rowDataToClear.IsContextMenuOpen = false;
}
#endif
RefreshSelection(dgvMainMenu);
@ -86,6 +86,7 @@ namespace SystemTrayMenu.Business
}
else
{
// First time the main menu gets loaded
MenuData menuData = (MenuData)e.Result;
switch (menuData.Validity)
{
@ -267,12 +268,6 @@ namespace SystemTrayMenu.Business
keyboardInput.RowDeselected += waitToOpenMenu.RowDeselected;
keyboardInput.EnterPressed += waitToOpenMenu.EnterOpensInstantly;
keyboardInput.RowSelected += waitToOpenMenu.RowSelected;
keyboardInput.RowSelected += AdjustScrollbarToDisplayedRow;
void AdjustScrollbarToDisplayedRow(ListView dgv, int index)
{
Menu menu = (Menu)dgv.GetParentWindow();
menu.AdjustScrollbar();
}
joystickHelper = new();
joystickHelper.KeyPressed += (key) => menus[0].Dispatcher.Invoke(keyboardInput.CmdKeyProcessed, new object[] { null, key });
@ -586,46 +581,7 @@ namespace SystemTrayMenu.Business
List<Menu.ListViewItemData> items = new();
ListView lv = menu.GetDataGridView();
#if TODO // REMOVE?
DataTable dataTable = new();
foreach (var prop in typeof(Menu.ListViewItemData).GetProperties())
{
dataTable.Columns.Add(prop.Name, prop.PropertyType);
}
foreach (RowData rowData in data)
{
if (!(rowData.IsAddionalItem && Properties.Settings.Default.ShowOnlyAsSearchResult))
{
if (rowData.ContainsMenu)
{
foldersCount++;
}
else
{
filesCount++;
}
}
rowData.SetData(rowData, dataTable);
}
lv.ItemsSource = dataTable.DefaultView;
foreach (DataRow row in dataTable.Rows)
{
RowData rowData = (RowData)row[nameof(Menu.ListViewItemData.data)];
if (rowData.IsAddionalItem && Properties.Settings.Default.ShowOnlyAsSearchResult)
{
row[nameof(Menu.ListViewItemData.SortIndex)] = 99;
}
else
{
row[nameof(Menu.ListViewItemData.SortIndex)] = 0;
}
}
#else
foreach (RowData rowData in data)
{
if (!(rowData.IsAddionalItem && Properties.Settings.Default.ShowOnlyAsSearchResult))
@ -649,7 +605,6 @@ namespace SystemTrayMenu.Business
}
lv.ItemsSource = items;
#endif
}
private bool IsActive()
@ -660,17 +615,15 @@ namespace SystemTrayMenu.Business
foreach (Menu menu in menus.Where(m => m != null))
{
ListView dgv = menu.GetDataGridView();
#if TODO
foreach (DataGridViewRow row in dgv.Items)
foreach (ListViewItemData item in dgv.Items)
{
RowData rowData = (RowData)row.Cells[2].Value;
RowData rowData = item.data;
if (rowData != null && rowData.IsContextMenuOpen)
{
isShellContextMenuOpen = true;
break;
}
}
#endif
if (isShellContextMenuOpen)
{
@ -771,13 +724,6 @@ namespace SystemTrayMenu.Business
dgv.MouseDoubleClick += Dgv_MouseDoubleClick;
dgv.SelectionChanged += Dgv_SelectionChanged;
dgv.RowPostPaint += Dgv_RowPostPaint;
dgv.DataError += Dgv_DataError;
void Dgv_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
// WARN Dgv_DataError occured System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Icon'
// => Rare times occured (e.g. when focused an close other application => closed and activated at same time)
Log.Warn("Dgv_DataError occured", e.Exception);
}
#endif
menu.SetCounts(foldersCount, filesCount);
@ -857,8 +803,6 @@ namespace SystemTrayMenu.Business
{
isDragSwipeScrolled = true;
dgv.FirstDisplayedScrollingRowIndex = newFirstDisplayedScrollingRowIndex;
Menu menu = (Menu)dgv.GetParentWindow();
menu.AdjustScrollbar();
scrolled = dgv.FirstDisplayedScrollingRowIndex == newFirstDisplayedScrollingRowIndex;
}
#endif
@ -1120,10 +1064,9 @@ namespace SystemTrayMenu.Business
{
// Clean up menu status IsMenuOpen for previous one
ListView dgvPrevious = menuPrevious.GetDataGridView();
#if TODO
foreach (DataRow row in ((DataTable)dgvPrevious.DataSource).Rows)
foreach (ListViewItemData item in dgvPrevious.Items)
{
RowData rowDataToClear = (RowData)row[2];
RowData rowDataToClear = item.data;
if (rowDataToClear == (RowData)menuToShow.Tag)
{
rowDataToClear.IsMenuOpen = keepOrSetIsMenuOpen;
@ -1133,7 +1076,6 @@ namespace SystemTrayMenu.Business
rowDataToClear.IsMenuOpen = false;
}
}
#endif
RefreshSelection(dgvPrevious);
@ -1356,11 +1298,10 @@ namespace SystemTrayMenu.Business
try
{
List<RowData> rowDatas = new();
#if TODO
DataTable dataTable = (DataTable)menus[0].GetDataGridView().DataSource;
foreach (DataRow row in dataTable.Rows)
ListView dgv = menus[0].GetDataGridView();
foreach (ListViewItemData item in dgv.Items)
{
RowData rowData = (RowData)row[2];
RowData rowData = item.data;
if (rowData.Path.StartsWith($"{e.OldFullPath}"))
{
string path = rowData.Path.Replace(e.OldFullPath, e.FullPath);
@ -1386,7 +1327,6 @@ namespace SystemTrayMenu.Business
rowDatas.Add(rowData);
}
}
#endif
rowDatas = MenusHelpers.SortItems(rowDatas);
keyboardInput.ClearIsSelectedByKey();
@ -1408,29 +1348,25 @@ namespace SystemTrayMenu.Business
{
try
{
List<DataRow> rowsToRemove = new();
#if TODO
List<ListViewItemData> rowsToRemove = new();
ListView dgv = menus[0].GetDataGridView();
DataTable dataTable = (DataTable)dgv.DataSource;
foreach (DataRow row in dataTable.Rows)
foreach (ListViewItemData item in dgv.Items)
{
RowData rowData = (RowData)row[2];
RowData rowData = item.data;
if (rowData.Path == e.FullPath ||
rowData.Path.StartsWith($"{e.FullPath}\\"))
{
IconReader.RemoveIconFromCache(rowData.Path);
rowsToRemove.Add(row);
rowsToRemove.Add(item);
}
}
foreach (DataRow rowToRemove in rowsToRemove)
foreach (ListViewItemData rowToRemove in rowsToRemove)
{
dataTable.Rows.Remove(rowToRemove);
dgv.Items.Remove(rowToRemove);
}
keyboardInput.ClearIsSelectedByKey();
dgv.DataSource = dataTable;
#endif
hideSubmenuDuringRefreshSearch = false;
menus[0].ResetHeight();
@ -1463,13 +1399,11 @@ namespace SystemTrayMenu.Business
rowData,
};
#if TODO
DataTable dataTable = (DataTable)menus[0].GetDataGridView().DataSource;
foreach (DataRow row in dataTable.Rows)
ListView dgv = menus[0].GetDataGridView();
foreach (ListViewItemData item in dgv.Items)
{
rowDatas.Add((RowData)row[2]);
rowDatas.Add(item.data);
}
#endif
rowDatas = MenusHelpers.SortItems(rowDatas);
keyboardInput.ClearIsSelectedByKey();

View file

@ -12,6 +12,7 @@ namespace SystemTrayMenu.Handler
using SystemTrayMenu.DataClasses;
using SystemTrayMenu.UserInterface;
using SystemTrayMenu.Utilities;
using static SystemTrayMenu.UserInterface.Menu;
using ListView = System.Windows.Controls.ListView;
using Menu = SystemTrayMenu.UserInterface.Menu;
@ -174,7 +175,7 @@ namespace SystemTrayMenu.Handler
{
if (dgv.Items.Count > rowIndex)
{
RowData rowData = ((Menu.ListViewItemData)dgv.Items[rowIndex]).data;
RowData rowData = ((ListViewItemData)dgv.Items[rowIndex]).data;
Menu menu = (Menu)dgv.GetParentWindow();
rowData.Level = menu.Level;
if (rowData.ContainsMenu)
@ -198,33 +199,29 @@ namespace SystemTrayMenu.Handler
dgvTmp = null;
this.dgv = dgv;
this.rowIndex = rowIndex;
#if TODO
RowData rowData = (RowData)dgv.Items[rowIndex].Cells[2].Value;
RowData rowData = ((ListViewItemData)dgv.Items[rowIndex]).data;
if (rowData != null)
{
rowData.IsSelected = true;
}
dgv.Items[rowIndex].Selected = false;
dgv.Items[rowIndex].Selected = true;
#endif
dgv.SelectedIndex = rowIndex;
}
private void ResetData(ListView dgv, int rowIndex)
{
if (dgv != null && dgv.Items.Count > rowIndex)
{
#if TODO
RowData rowData = (RowData)dgv.Items[rowIndex].Cells[2].Value;
RowData rowData = ((ListViewItemData)dgv.Items[rowIndex]).data;
if (rowData != null)
{
rowData.IsSelected = false;
rowData.IsClicking = false;
dgv.Items[rowIndex].Selected = false;
dgv.SelectedItem = null;
this.dgv = null;
this.rowIndex = 0;
}
#endif
}
}
}

View file

@ -147,26 +147,6 @@ namespace SystemTrayMenu.DataClasses
internal bool ProcessStarted { get; set; }
#if TODO // WPF REMOVE?
internal void SetData(RowData data, DataTable dataTable)
{
DataRow row = dataTable.Rows.Add();
data.RowIndex = dataTable.Rows.IndexOf(row);
if (HiddenEntry)
{
row[0] = AddIconOverlay(data.Icon, Properties.Resources.White50Percentage);
}
else
{
row[0] = data.Icon;
}
row[1] = data.Text;
row[2] = data;
}
#endif
internal Icon ReadIcon(bool updateIconInBackground)
{
if (IsFolder || IsLinkToFolder)

View file

@ -104,8 +104,6 @@
<NoWarn>1701;1702;WFAC010;MSB3061</NoWarn>
</PropertyGroup>
<ItemGroup>
<Compile Remove="UserInterface\CustomScrollbar\CustomScrollbar.cs" />
<Compile Remove="UserInterface\CustomScrollbar\ScrollbarControlDesigner.cs" />
<Compile Remove="UserInterface\HotkeyTextboxControl\HotkeyControl.cs" />
</ItemGroup>
<ItemGroup>
@ -140,8 +138,6 @@
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<None Include="UserInterface\CustomScrollbar\CustomScrollbar.cs" />
<None Include="UserInterface\CustomScrollbar\ScrollbarControlDesigner.cs" />
<None Include="UserInterface\HotkeyTextboxControl\HotkeyControl.cs" />
</ItemGroup>
<ItemGroup>

View file

@ -1,745 +0,0 @@
// <copyright file="CustomScrollbar.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
namespace SystemTrayMenu.UserInterface
{
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
[Designer(typeof(ScrollbarControlDesigner))]
public class CustomScrollbar : UserControl
{
private readonly Timer timerMouseStillClicked = new();
private float largeChange = 10;
private float smallChange = 1;
private int minimum = 0;
private int maximum = 100;
private int value = 0;
private int lastValue = 0;
private int clickPoint;
private float sliderTop = 0;
private bool sliderDown = false;
private bool sliderDragging = false;
private bool arrowUpHovered = false;
private bool sliderHovered = false;
private bool arrowDownHovered = false;
private bool trackHovered = false;
private bool mouseStillClickedMoveUp = false;
private bool mouseStillClickedMoveLarge = false;
private int timerMouseStillClickedCounter = 0;
private bool paintEnabled = false;
private int width;
public CustomScrollbar()
{
InitializeComponent();
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
timerMouseStillClicked.Interval = 30;
timerMouseStillClicked.Tick += TimerMouseStillClicked_Tick;
}
public new event EventHandler Scroll = null;
public event EventHandler ValueChanged = null;
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("LargeChange")]
public float LargeChange
{
get => largeChange;
set
{
largeChange = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("SmallChange")]
public float SmallChange
{
get => smallChange;
set
{
smallChange = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("Minimum")]
public int Minimum
{
get => minimum;
set
{
minimum = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("Maximum")]
public int Maximum
{
get => maximum;
set
{
maximum = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("Value")]
public int Value
{
get => value;
set
{
this.value = value;
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int pixelRange = trackHeight - sliderHeight;
int realRange = GetRealRange();
float percentage = 0.0f;
if (realRange != 0)
{
percentage = this.value / (float)realRange;
}
float top = percentage * pixelRange;
sliderTop = (int)top;
Invalidate();
}
}
public int Delta => Value - lastValue;
public override bool AutoSize
{
get => base.AutoSize;
set => base.AutoSize = value;
}
public void CustomScrollbar_MouseWheel(object sender, MouseEventArgs e)
{
if (e.Delta > 0)
{
MoveUp(SmallChange * MenuDefines.Scrollspeed);
}
else
{
MoveDown(SmallChange * MenuDefines.Scrollspeed);
}
}
internal void Reset()
{
sliderTop = 0;
sliderDown = false;
sliderDragging = false;
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = false;
trackHovered = false;
mouseStillClickedMoveUp = false;
mouseStillClickedMoveLarge = false;
timerMouseStillClickedCounter = 0;
lastValue = 0;
}
/// <summary>
/// Show the control
/// (workaround, because visible = false, was causing appearing scrollbars).
/// </summary>
/// <param name="newHeight">newHeight which to paint.</param>
internal void PaintEnable(int newHeight)
{
int newWidth = Math.Max(width, Width);
Size = new Size(newWidth, newHeight);
paintEnabled = true;
}
/// <summary>
/// Hide the control
/// (workaround, because visible = false, was causing appearing scrollbars).
/// </summary>
internal void PaintDisable()
{
if (Width > 0)
{
width = Width;
}
Size = new Size(0, 0);
paintEnabled = false;
}
protected override void Dispose(bool disposing)
{
MouseDown -= CustomScrollbar_MouseDown;
MouseMove -= CustomScrollbar_MouseMove;
MouseUp -= CustomScrollbar_MouseUp;
MouseLeave -= CustomScrollbar_MouseLeave;
timerMouseStillClicked.Tick -= TimerMouseStillClicked_Tick;
timerMouseStillClicked.Dispose();
base.Dispose(disposing);
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
Color colorArrow;
Color colorArrowHoverBackground;
Color colorArrowHover;
Color colorArrowClick;
Color colorArrowClickBackground;
Color colorSliderArrowsAndTrackHover;
Color colorSlider;
Color colorSliderHover;
Color colorSliderDragging;
Color colorScrollbarBackground;
if (Config.IsDarkMode())
{
colorArrow = AppColors.ArrowDarkMode;
colorArrowHoverBackground = AppColors.ArrowHoverBackgroundDarkMode;
colorArrowHover = AppColors.ArrowHoverDarkMode;
colorArrowClick = AppColors.ArrowClickDarkMode;
colorArrowClickBackground = AppColors.ArrowClickBackgroundDarkMode;
colorSliderArrowsAndTrackHover = AppColors.SliderArrowsAndTrackHoverDarkMode;
colorSlider = AppColors.SliderDarkMode;
colorSliderHover = AppColors.SliderHoverDarkMode;
colorSliderDragging = AppColors.SliderDraggingDarkMode;
colorScrollbarBackground = AppColors.ScrollbarBackgroundDarkMode;
}
else
{
colorArrow = AppColors.Arrow;
colorArrowHoverBackground = AppColors.ArrowHoverBackground;
colorArrowHover = AppColors.ArrowHover;
colorArrowClick = AppColors.ArrowClick;
colorArrowClickBackground = AppColors.ArrowClickBackground;
colorSliderArrowsAndTrackHover = AppColors.SliderArrowsAndTrackHover;
colorSlider = AppColors.Slider;
colorSliderHover = AppColors.SliderHover;
colorSliderDragging = AppColors.SliderDragging;
colorScrollbarBackground = AppColors.ScrollbarBackground;
}
if (!paintEnabled)
{
e.Graphics.FillRectangle(
new SolidBrush(colorScrollbarBackground),
new Rectangle(0, 0, Width, Height));
return;
}
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int top = (int)sliderTop + Width;
// Draw background
Brush brushScrollbarBorder = new SolidBrush(colorScrollbarBackground);
e.Graphics.FillRectangle(brushScrollbarBorder, new Rectangle(0, 0, Width, Height));
// Draw arrowUp
SolidBrush solidBrushArrowUpBackground;
SolidBrush solidBrushArrowUp;
Pen penArrowUp;
if (timerMouseStillClicked.Enabled &&
!mouseStillClickedMoveLarge && mouseStillClickedMoveUp)
{
solidBrushArrowUpBackground = new SolidBrush(colorArrowClickBackground);
solidBrushArrowUp = new SolidBrush(colorArrowClick);
penArrowUp = new Pen(colorArrowClick, 2.5F);
}
else if (arrowUpHovered)
{
solidBrushArrowUpBackground = new SolidBrush(colorArrowHoverBackground);
solidBrushArrowUp = new SolidBrush(colorArrowHover);
penArrowUp = new Pen(colorArrowHover, 2.5F);
}
else
{
solidBrushArrowUpBackground = new SolidBrush(colorScrollbarBackground);
solidBrushArrowUp = new SolidBrush(colorArrow);
penArrowUp = new Pen(colorArrow, 2.5F);
}
e.Graphics.FillRectangle(solidBrushArrowUpBackground, GetUpArrowRectangleWithoutBorder());
int widthDevidedBy2 = Width / 2;
int widthDevidedBy6 = Width / 6;
int widthDevidedBy2PluswidthDevidedBy8 = widthDevidedBy2 + (Width / 8);
PointF pointArrowUp1 = new(widthDevidedBy2 - widthDevidedBy6, widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowUp2 = new(widthDevidedBy2 + widthDevidedBy6, widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowUp3 = new(widthDevidedBy2, widthDevidedBy2PluswidthDevidedBy8 - widthDevidedBy6);
PointF pointArrowUp4 = pointArrowUp1;
PointF[] curvePoints =
{
pointArrowUp1,
pointArrowUp2,
pointArrowUp3,
pointArrowUp4,
};
e.Graphics.FillPolygon(solidBrushArrowUp, curvePoints);
e.Graphics.DrawPolygon(penArrowUp, curvePoints);
// draw slider
SolidBrush solidBrushSlider;
if (sliderDragging)
{
solidBrushSlider = new SolidBrush(colorSliderDragging);
}
else if (sliderHovered)
{
solidBrushSlider = new SolidBrush(colorSliderHover);
}
else
{
if (arrowUpHovered || arrowDownHovered || trackHovered)
{
solidBrushSlider = new SolidBrush(colorSliderArrowsAndTrackHover);
}
else
{
solidBrushSlider = new SolidBrush(colorSlider);
}
}
Rectangle rectangleSlider = new(1, top, Width - 2, sliderHeight);
e.Graphics.FillRectangle(solidBrushSlider, rectangleSlider);
// Draw arrowDown
SolidBrush solidBrushArrowDownBackground;
SolidBrush solidBrushArrowDown;
Pen penArrowDown;
if (timerMouseStillClicked.Enabled &&
!mouseStillClickedMoveLarge && !mouseStillClickedMoveUp)
{
solidBrushArrowDownBackground = new SolidBrush(colorArrowClickBackground);
solidBrushArrowDown = new SolidBrush(colorArrowClick);
penArrowDown = new Pen(colorArrowClick, 2.5F);
}
else
if (arrowDownHovered)
{
solidBrushArrowDownBackground = new SolidBrush(colorArrowHoverBackground);
solidBrushArrowDown = new SolidBrush(colorArrowHover);
penArrowDown = new Pen(colorArrowHover, 2.5F);
}
else
{
solidBrushArrowDownBackground = new SolidBrush(colorScrollbarBackground);
solidBrushArrowDown = new SolidBrush(colorArrow);
penArrowDown = new Pen(colorArrow, 2.5F);
}
e.Graphics.FillRectangle(solidBrushArrowDownBackground, GetDownArrowRectangleWithoutBorder(trackHeight));
PointF pointArrowDown1 = new(widthDevidedBy2 - widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowDown2 = new(widthDevidedBy2 + widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowDown3 = new(widthDevidedBy2, Height - widthDevidedBy2PluswidthDevidedBy8 + widthDevidedBy6);
PointF pointArrowDown4 = pointArrowDown1;
PointF[] curvePointsArrowDown =
{
pointArrowDown1,
pointArrowDown2,
pointArrowDown3,
pointArrowDown4,
};
e.Graphics.FillPolygon(solidBrushArrowDown, curvePointsArrowDown);
e.Graphics.DrawPolygon(penArrowDown, curvePointsArrowDown);
}
private void TimerMouseStillClicked_Tick(object sender, EventArgs e)
{
timerMouseStillClickedCounter++;
Point pointCursor = PointToClient(Cursor.Position);
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int top = (int)sliderTop + Width;
Rectangle sliderRectangle = GetSliderRectangle(sliderHeight, top);
if (sliderRectangle.Contains(pointCursor))
{
timerMouseStillClicked.Stop();
}
else if (timerMouseStillClickedCounter > 6)
{
float change;
if (mouseStillClickedMoveLarge)
{
change = SmallChange * MenuDefines.Scrollspeed;
}
else
{
change = SmallChange;
}
if (mouseStillClickedMoveUp)
{
MoveUp(change);
}
else
{
MoveDown(change);
}
}
}
private void InitializeComponent()
{
SuspendLayout();
Name = "CustomScrollbar";
MouseDown += CustomScrollbar_MouseDown;
MouseMove += CustomScrollbar_MouseMove;
MouseUp += CustomScrollbar_MouseUp;
MouseLeave += CustomScrollbar_MouseLeave;
ResumeLayout(false);
}
private void CustomScrollbar_MouseLeave(object sender, EventArgs e)
{
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = false;
trackHovered = false;
Refresh();
}
private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e)
{
Point pointCursor = PointToClient(Cursor.Position);
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int top = (int)sliderTop + Width;
Rectangle sliderRectangle = GetSliderRectangle(sliderHeight, top);
Rectangle trackRectangle = GetTrackRectangle(trackHeight);
if (sliderRectangle.Contains(pointCursor))
{
clickPoint = pointCursor.Y - top;
sliderDown = true;
}
else if (trackRectangle.Contains(pointCursor))
{
if (e.Y < sliderRectangle.Y)
{
MoveUp(Height);
mouseStillClickedMoveUp = true;
}
else
{
MoveDown(Height);
mouseStillClickedMoveUp = false;
}
mouseStillClickedMoveLarge = true;
timerMouseStillClickedCounter = 0;
timerMouseStillClicked.Start();
}
Rectangle upArrowRectangle = GetUpArrowRectangle();
if (upArrowRectangle.Contains(pointCursor))
{
MoveUp(SmallChange);
mouseStillClickedMoveUp = true;
mouseStillClickedMoveLarge = false;
timerMouseStillClickedCounter = 0;
timerMouseStillClicked.Start();
}
Rectangle downArrowRectangle = GetDownArrowRectangle(trackHeight);
if (downArrowRectangle.Contains(pointCursor))
{
MoveDown(SmallChange);
mouseStillClickedMoveUp = false;
mouseStillClickedMoveLarge = false;
timerMouseStillClickedCounter = 0;
timerMouseStillClicked.Start();
}
}
private void MoveDown(float change)
{
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int realRange = GetRealRange();
int pixelRange = trackHeight - sliderHeight;
if (realRange > 0)
{
if (pixelRange > 0)
{
float changeForOneItem = GetChangeForOneItem(change, pixelRange);
if ((sliderTop + changeForOneItem) > pixelRange)
{
sliderTop = pixelRange;
}
else
{
sliderTop += changeForOneItem;
}
CalculateValue(pixelRange);
if (Value != lastValue)
{
ValueChanged?.Invoke(this, new EventArgs());
Scroll?.Invoke(this, new EventArgs());
lastValue = Value;
}
Invalidate();
}
}
}
private void MoveUp(float change)
{
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int realRange = GetRealRange();
int pixelRange = trackHeight - sliderHeight;
if (realRange > 0)
{
if (pixelRange > 0)
{
float changeForOneItem = GetChangeForOneItem(change, pixelRange);
if ((sliderTop - changeForOneItem) < 0)
{
sliderTop = 0;
}
else
{
sliderTop -= changeForOneItem;
}
CalculateValue(pixelRange);
if (Value != lastValue)
{
ValueChanged?.Invoke(this, new EventArgs());
Scroll?.Invoke(this, new EventArgs());
lastValue = Value;
}
Invalidate();
}
}
}
private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e)
{
sliderDown = false;
sliderDragging = false;
timerMouseStillClicked.Stop();
}
private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e)
{
if (sliderDown == true)
{
sliderDragging = true;
}
if (sliderDragging)
{
MoveSlider(e.Y);
}
if (Value != lastValue)
{
ValueChanged?.Invoke(this, new EventArgs());
Scroll?.Invoke(this, new EventArgs());
lastValue = Value;
}
Point pointCursor = PointToClient(Cursor.Position);
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int top = (int)sliderTop + Width;
Rectangle sliderRectangle = GetSliderRectangle(sliderHeight, top);
Rectangle trackRectangle = GetTrackRectangle(trackHeight);
if (sliderRectangle.Contains(pointCursor))
{
if (e.Button != MouseButtons.Left)
{
arrowUpHovered = false;
sliderHovered = true;
arrowDownHovered = false;
trackHovered = false;
}
}
else if (trackRectangle.Contains(pointCursor))
{
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = false;
trackHovered = true;
}
Rectangle upArrowRectangle = GetUpArrowRectangle();
if (upArrowRectangle.Contains(pointCursor))
{
if (e.Button != MouseButtons.Left)
{
arrowUpHovered = true;
sliderHovered = false;
arrowDownHovered = false;
trackHovered = false;
}
}
Rectangle downArrowRectangle = GetDownArrowRectangle(trackHeight);
if (downArrowRectangle.Contains(pointCursor))
{
if (e.Button != MouseButtons.Left)
{
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = true;
trackHovered = false;
}
}
Invalidate();
}
private void MoveSlider(int y)
{
int nRealRange = Maximum - Minimum;
int trackHeight = GetTrackHeight();
int sliderHeight = GetSliderHeight(trackHeight);
int spot = clickPoint;
int pixelRange = trackHeight - sliderHeight;
if (sliderDown && nRealRange > 0)
{
if (pixelRange > 0)
{
int newSliderTop = y - (Width + spot);
if (newSliderTop < 0)
{
sliderTop = 0;
}
else if (newSliderTop > pixelRange)
{
sliderTop = pixelRange;
}
else
{
sliderTop = y - (Width + spot);
}
CalculateValue(pixelRange);
Invalidate();
}
}
}
private void CalculateValue(int pixelRange)
{
float percentage = sliderTop / pixelRange;
float fValue = percentage * (Maximum - LargeChange);
value = (int)fValue;
}
private Rectangle GetSliderRectangle(int sliderHeight, int top)
{
return new Rectangle(new Point(0, top), new Size(Width + 1, sliderHeight));
}
private Rectangle GetUpArrowRectangle()
{
return new Rectangle(new Point(0, 0), new Size(Width + 1, Width));
}
private Rectangle GetUpArrowRectangleWithoutBorder()
{
return new Rectangle(new Point(1, 0), new Size(Width - 2, Width));
}
private Rectangle GetDownArrowRectangle(int trackHeight)
{
return new Rectangle(new Point(0, Width + trackHeight), new Size(Width + 1, Width));
}
private Rectangle GetDownArrowRectangleWithoutBorder(int trackHeight)
{
return new Rectangle(new Point(1, Width + trackHeight), new Size(Width - 2, Width));
}
private Rectangle GetTrackRectangle(int trackHeight)
{
return new Rectangle(new Point(0, Width), new Size(Width + 1, trackHeight));
}
private int GetRealRange()
{
return Maximum - Minimum - (int)LargeChange;
}
private float GetChangeForOneItem(float change, int pixelRange)
{
return change * pixelRange / (Maximum - LargeChange);
}
private int GetTrackHeight()
{
return Height - (Width + Width);
}
private int GetSliderHeight(int trackHeight)
{
int sliderHeight = (int)((float)LargeChange / Maximum * trackHeight);
if (sliderHeight > trackHeight)
{
sliderHeight = trackHeight;
}
if (sliderHeight < 56)
{
sliderHeight = 56;
}
return sliderHeight;
}
}
}

View file

@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -1,35 +0,0 @@
// <copyright file="ScrollbarControlDesigner.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
namespace SystemTrayMenu.UserInterface
{
using System.ComponentModel;
using System.Windows.Forms.Design;
internal class ScrollbarControlDesigner : ControlDesigner
{
public override SelectionRules SelectionRules
{
get
{
SelectionRules selectionRules = base.SelectionRules;
PropertyDescriptor propDescriptor = TypeDescriptor.GetProperties(Component)["AutoSize"];
if (propDescriptor != null)
{
bool autoSize = (bool)propDescriptor.GetValue(Component);
if (autoSize)
{
selectionRules = SelectionRules.Visible | SelectionRules.Moveable | SelectionRules.BottomSizeable | SelectionRules.TopSizeable;
}
else
{
selectionRules = SelectionRules.Visible | SelectionRules.AllSizeable | SelectionRules.Moveable;
}
}
return selectionRules;
}
}
}
}

View file

@ -129,21 +129,11 @@ namespace SystemTrayMenu.UserInterface
labelItems.FontSize = Scaling.ScaleFontByPoints(7F);
dgv.FontSize = Scaling.ScaleFontByPoints(9F);
#if TODO
customScrollbar = new CustomScrollbar();
tableLayoutPanelDgvAndScrollbar.Controls.Add(customScrollbar, 1, 0);
#endif
MouseDown += Menu_MouseDown;
MouseUp += Menu_MouseUp;
MouseMove += Menu_MouseMove;
#if TODO
labelTitle.MouseWheel += new MouseEventHandler(DgvMouseWheel);
// customScrollbar
customScrollbar.Location = new Point(0, 0);
customScrollbar.Name = "customScrollbar";
customScrollbar.Size = new Size(Scaling.Scale(15), 40);
#endif
SolidColorBrush foreColor = new(Colors.Black);
SolidColorBrush backColor = AppColors.Background.ToSolidColorBrush();
@ -170,21 +160,6 @@ namespace SystemTrayMenu.UserInterface
dgv.GotFocus += (_, _) => FocusTextBox();
#if TODO
customScrollbar.GotFocus += (sender, e) => FocusTextBox();
customScrollbar.Margin = new Padding(0);
customScrollbar.Scroll += CustomScrollbar_Scroll;
void CustomScrollbar_Scroll(object sender, EventArgs e)
{
decimal firstIndex = customScrollbar.Value * dgv.Rows.Count / (decimal)customScrollbar.Maximum;
int firstIndexRounded = (int)Math.Ceiling(firstIndex);
if (firstIndexRounded > -1 && firstIndexRounded < dgv.RowCount)
{
dgv.FirstDisplayedScrollingRowIndex = firstIndexRounded;
}
}
customScrollbar.MouseEnter += ControlsMouseEnter;
dgv.MouseEnter += ControlsMouseEnter;
labelTitle.MouseEnter += ControlsMouseEnter;
textBoxSearch.MouseEnter += ControlsMouseEnter;
@ -202,7 +177,6 @@ namespace SystemTrayMenu.UserInterface
MouseEnter?.Invoke();
}
customScrollbar.MouseLeave += ControlsMouseLeave;
dgv.MouseLeave += ControlsMouseLeave;
labelTitle.MouseLeave += ControlsMouseLeave;
textBoxSearch.MouseLeave += ControlsMouseLeave;
@ -343,9 +317,6 @@ namespace SystemTrayMenu.UserInterface
{
dgv.ScrollIntoView(dgv.Items[0]);
}
#if TODO
AdjustScrollbar();
#endif
}
internal void RefreshSearchText()
@ -355,9 +326,6 @@ namespace SystemTrayMenu.UserInterface
{
dgv.ScrollIntoView(dgv.Items[0]);
}
#if TODO
AdjustScrollbar();
#endif
}
internal void FocusTextBox()
@ -772,19 +740,6 @@ namespace SystemTrayMenu.UserInterface
};
}
internal void AdjustScrollbar()
{
#if TODO
if (dgv.Rows.Count > 0)
{
customScrollbar.Value = (int)Math.Round(
dgv.FirstDisplayedScrollingRowIndex * (decimal)customScrollbar.Maximum / dgv.Rows.Count,
0,
MidpointRounding.AwayFromZero);
}
#endif
}
internal void ResetHeight()
{
#if TODO
@ -870,20 +825,10 @@ namespace SystemTrayMenu.UserInterface
if (dgvHeightByItems > dgvHeightMax)
{
ScrollbarVisible = true;
customScrollbar.PaintEnable(dgv.Height);
if (customScrollbar.Maximum != dgvHeightByItems)
{
customScrollbar.Reset();
customScrollbar.Minimum = 0;
customScrollbar.Maximum = dgvHeightByItems;
customScrollbar.LargeChange = dgvHeightMax;
customScrollbar.SmallChange = Resources["RowHeight"];
}
}
else
{
ScrollbarVisible = false;
customScrollbar.PaintDisable();
}
#endif
}
@ -944,7 +889,6 @@ namespace SystemTrayMenu.UserInterface
#if TODO
int widthIcon = dgv.Columns[0].Width;
int widthText = dgv.Columns[1].Width;
int widthScrollbar = customScrollbar.Width;
using Graphics gfx = labelTitle.CreateGraphics();
gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
@ -952,15 +896,15 @@ namespace SystemTrayMenu.UserInterface
txtTitle.Text + "___",
dgv.RowTemplate.DefaultCellStyle.Font).Width + 0.5);
if (withTitle > (widthIcon + widthText + widthScrollbar))
if (withTitle > (widthIcon + widthText))
{
tableLayoutPanelDgvAndScrollbar.MinimumSize = new Size(withTitle, 0);
dgv.Width = withTitle - widthScrollbar;
dgv.Width = withTitle;
dgv.Columns[1].Width = dgv.Width - widthIcon;
}
else
{
tableLayoutPanelDgvAndScrollbar.MinimumSize = new Size(widthIcon + widthText + widthScrollbar, 0);
tableLayoutPanelDgvAndScrollbar.MinimumSize = new Size(widthIcon + widthText, 0);
dgv.Width = widthIcon + widthText;
dgv.Columns[1].Width = dgv.Width - widthIcon;
}
@ -974,7 +918,6 @@ namespace SystemTrayMenu.UserInterface
private void DgvMouseWheel(object sender, MouseEventArgs e)
{
((HandledMouseEventArgs)e).Handled = true;
customScrollbar.CustomScrollbar_MouseWheel(sender, e);
MouseWheel?.Invoke();
}
@ -986,8 +929,6 @@ namespace SystemTrayMenu.UserInterface
private void TextBoxSearch_TextChanged()
{
#if TODO
customScrollbar.Value = 0;
DataTable data = (DataTable)dgv.DataSource;
#endif
string filterField = nameof(ListViewItemData.ColumnText);
@ -1347,7 +1288,6 @@ namespace SystemTrayMenu.UserInterface
private void ListViewItem_MouseUp(object sender, MouseButtonEventArgs e)
{
CellMouseUp?.Invoke(dgv, dgv.Items.IndexOf(((ListViewItem)sender).Content), e);
AdjustScrollbar();
}
private void ListViewxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)

View file

@ -1197,24 +1197,6 @@ namespace SystemTrayMenu.UserInterface
textBoxColorScrollbarBackgroundDarkMode.Text = "#171717";
}
#if TODO
private void StopPlayingDingSoundEnterKeyPressed_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.Handled = e.SuppressKeyPress = true;
}
}
private void StopPlayingDingSoundEnterKeyPressed_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.Handled = e.SuppressKeyPress = true;
}
}
#endif
private void ButtonCancel_Click(object sender, RoutedEventArgs e)
{
Settings.Default.Reload();