[Feature] Custom Scrollbar (#183), version 1.0.17.53

This commit is contained in:
Markus Hofknecht 2021-06-03 12:52:47 +02:00
parent 3d22f41b2a
commit 0fe947e4bf
13 changed files with 1157 additions and 206 deletions

View file

@ -215,8 +215,15 @@ namespace SystemTrayMenu.Business
keyboardInput.ClosePressed += MenusFadeOut;
keyboardInput.RowDeselected += waitToOpenMenu.RowDeselected;
keyboardInput.RowSelected += waitToOpenMenu.RowSelected;
keyboardInput.EnterPressed += waitToOpenMenu.EnterOpensInstantly;
keyboardInput.RowSelected += waitToOpenMenu.RowSelected;
keyboardInput.RowSelected += AdjustScrollbarToDisplayedRow;
void AdjustScrollbarToDisplayedRow(DataGridView dgv, int index)
{
#warning to improve arguments, do not use .Parent.Parent.Parent
Menu menu = dgv.Parent.Parent.Parent as Menu;
menu.AdjustScrollbar();
}
timerStillActiveCheck.Interval = 1000;
timerStillActiveCheck.Tick += StillActiveTick;
@ -669,6 +676,7 @@ namespace SystemTrayMenu.Business
dgv.DataSource = dataTable;
dgv.Columns["data"].Visible = false;
dgv.Columns["SortIndex"].Visible = false;
}
DataGridView dgv = menu.GetDataGridView();
@ -783,7 +791,7 @@ namespace SystemTrayMenu.Business
if (!searchTextChanging)
{
dgv.Refresh();
dgv.Invalidate();
}
}
@ -947,6 +955,11 @@ namespace SystemTrayMenu.Business
{
menu.AdjustSizeAndLocation(screenBounds, menuPredecessor, startLocation);
}
#warning workaround added also as else, because need adjust scrollbar after search
else
{
menu.AdjustSizeAndLocation(screenBounds, menuPredecessor, startLocation);
}
if (i == 0)
{

View file

@ -201,10 +201,13 @@ namespace SystemTrayMenu.Handler
if (dgv != null && dgv.Rows.Count > rowIndex)
{
RowData rowData = (RowData)dgv.Rows[rowIndex].Cells[2].Value;
rowData.IsSelected = false;
dgv.Rows[rowIndex].Selected = false;
this.dgv = null;
this.rowIndex = 0;
if (rowData != null)
{
rowData.IsSelected = false;
dgv.Rows[rowIndex].Selected = false;
this.dgv = null;
this.rowIndex = 0;
}
}
}
}

View file

@ -10,7 +10,7 @@ namespace SystemTrayMenu
{
internal const int MenusMax = 50;
internal const int LengthMax = 37;
internal const int Scrollspeed = 4;
internal const int Scrollspeed = 3;
public static Color ColorSelectedItem
{

View file

@ -39,5 +39,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.17.56")]
[assembly: AssemblyFileVersion("1.0.17.56")]
[assembly: AssemblyVersion("1.0.17.57")]
[assembly: AssemblyFileVersion("1.0.17.57")]

View file

@ -114,6 +114,7 @@
<Compile Update="UserInterface\AboutBox.Designer.cs">
<DependentUpon>AboutBox.cs</DependentUpon>
</Compile>
<Compile Update="UserInterface\CustomScrollbar\CustomScrollbar.cs" />
<Compile Update="UserInterface\SettingsForm.Designer.cs">
<DependentUpon>SettingsForm.cs</DependentUpon>
</Compile>

View file

@ -0,0 +1,805 @@
// <copyright file="CustomScrollbar.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
namespace SystemTrayMenu.UserInterface
{
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
[Designer(typeof(ScrollbarControlDesigner))]
public class CustomScrollbar : UserControl
{
private readonly Timer timerMouseStillClicked = new Timer();
private readonly int arrowHeight = 18;
private readonly int controlWidth = 15;
private float moLargeChange = 10;
private float moSmallChange = 1;
private int moMinimum = 0;
private int moMaximum = 100;
private int moValue = 0;
private int nClickPoint;
private float moSliderTop = 0;
private bool moSliderDown = false;
private bool moSliderDragging = false;
private bool arrowUpHovered = false;
private bool sliderHovered = false;
private bool arrowDownHovered = false;
private bool mouseStillClickedMoveUp = false;
private bool mouseStillClickedMoveLarge;
private int timerMouseStillClickedCounter = 0;
private int lastValue = 0;
private bool paintEnabledWasCalled = false;
private bool paintEnabled = false;
public CustomScrollbar()
{
InitializeComponent();
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
Width = controlWidth;
MinimumSize = new Size(controlWidth, arrowHeight + arrowHeight + GetScrollbarHeight());
int GetScrollbarHeight()
{
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fThumbHeight = (float)LargeChange / Maximum * nTrackHeight;
int nThumbHeight = (int)fThumbHeight;
if (nThumbHeight > nTrackHeight)
{
nThumbHeight = nTrackHeight;
}
if (nThumbHeight < 56)
{
nThumbHeight = 56;
}
return nThumbHeight;
}
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
{
return moLargeChange;
}
set
{
moLargeChange = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("SmallChange")]
public float SmallChange
{
get
{
return moSmallChange;
}
set
{
moSmallChange = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("Minimum")]
public int Minimum
{
get
{
return moMinimum;
}
set
{
moMinimum = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("Maximum")]
public int Maximum
{
get
{
return moMaximum;
}
set
{
moMaximum = value;
Invalidate();
}
}
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[DefaultValue(false)]
[Category("Behavior")]
[Description("Value")]
public int Value
{
get
{
return moValue;
}
set
{
moValue = value;
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fThumbHeight = (float)LargeChange / Maximum * nTrackHeight;
int nThumbHeight = (int)fThumbHeight;
if (nThumbHeight > nTrackHeight)
{
nThumbHeight = nTrackHeight;
fThumbHeight = nTrackHeight;
}
if (nThumbHeight < 56)
{
nThumbHeight = 56;
fThumbHeight = 56;
}
int nPixelRange = nTrackHeight - nThumbHeight;
int nRealRange = Maximum - Minimum - (int)LargeChange;
float fPerc = 0.0f;
if (nRealRange != 0)
{
fPerc = moValue / (float)nRealRange;
}
float fTop = fPerc * nPixelRange;
moSliderTop = (int)fTop;
Invalidate();
}
}
public int Delta
{
get
{
return Value - lastValue;
}
}
public override bool AutoSize
{
get
{
return base.AutoSize;
}
set
{
base.AutoSize = value;
if (base.AutoSize)
{
Width = controlWidth;
}
}
}
public void CustomScrollbar_MouseWheel(object sender, MouseEventArgs e)
{
if (e.Delta > 0)
{
MoveUp(SmallChange * MenuDefines.Scrollspeed);
}
else
{
MoveDown(SmallChange * MenuDefines.Scrollspeed);
}
}
internal void Reset()
{
moSliderTop = 0;
moSliderDown = false;
moSliderDragging = false;
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = false;
mouseStillClickedMoveUp = false;
mouseStillClickedMoveLarge = false;
timerMouseStillClickedCounter = 0;
lastValue = 0;
}
/// <summary>
/// Show the control
/// (workaround, because visible = false, was causing appearing scrollbars).
/// </summary>
internal void PaintEnable()
{
Enabled = true;
if (!paintEnabled)
{
paintEnabledWasCalled = true;
}
paintEnabled = true;
Invalidate();
}
/// <summary>
/// Hide the control
/// (workaround, because visible = false, was causing appearing scrollbars).
/// </summary>
internal void PaintDisable()
{
if (!paintEnabledWasCalled)
{
Enabled = false;
Size = new Size(0, 0);
}
paintEnabled = false;
Invalidate();
}
protected override void Dispose(bool disposing)
{
timerMouseStillClicked.Dispose();
base.Dispose(disposing);
}
protected override void OnPaint(PaintEventArgs e)
{
int heightArrow = 18;
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
Color colorArrows;
Color colorArrowsHover;
Color colorSlider;
Color colorSliderHover;
Color colorSliderDragging;
Color colorScrollbarBorder;
if (Config.IsDarkMode())
{
colorArrows = Color.FromArgb(103, 103, 103);
#warning consider as arrowHover, normally colorArrows not changes only background
colorArrowsHover = Color.FromArgb(55, 55, 55);
colorSlider = Color.FromArgb(77, 77, 77);
colorSliderHover = Color.FromArgb(122, 122, 122);
colorSliderDragging = Color.FromArgb(166, 166, 166);
#warning remove border ? replace with background
colorScrollbarBorder = Color.FromArgb(23, 23, 23);
}
else
{
colorArrows = Color.FromArgb(100, 100, 100);
colorArrowsHover = Color.FromArgb(0, 0, 0);
colorSlider = Color.FromArgb(205, 205, 205);
colorSliderHover = Color.FromArgb(166, 166, 166);
colorSliderDragging = Color.FromArgb(96, 96, 96);
colorScrollbarBorder = Color.FromArgb(255, 255, 255);
}
if (!paintEnabled)
{
e.Graphics.FillRectangle(
new SolidBrush(colorScrollbarBorder),
new Rectangle(0, 0, Width, Height));
return;
}
// Draw background
Brush brushScrollbarBorder = new SolidBrush(colorScrollbarBorder);
e.Graphics.FillRectangle(brushScrollbarBorder, new Rectangle(0, 0, Width, Height));
// Draw arrowUp
Pen penArrowUp;
if (arrowUpHovered)
{
penArrowUp = new Pen(colorArrowsHover, 2.5F);
}
else
{
penArrowUp = new Pen(colorArrows, 2.5F);
}
int widthDevidedBy2 = Width / 2;
int widthDevidedBy6 = Width / 6;
int widthDevidedBy2PluswidthDevidedBy8 = widthDevidedBy2 + (Width / 8);
PointF pointArrowUp1 = new PointF(widthDevidedBy2 - widthDevidedBy6, widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowUp2 = new PointF(widthDevidedBy2 + widthDevidedBy6, widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowUp3 = new PointF(widthDevidedBy2, widthDevidedBy2PluswidthDevidedBy8 - widthDevidedBy6);
PointF pointArrowUp4 = pointArrowUp1;
PointF[] curvePoints =
{
pointArrowUp1,
pointArrowUp2,
pointArrowUp3,
pointArrowUp4,
};
e.Graphics.DrawPolygon(penArrowUp, curvePoints);
// draw thumb
int nTrackHeight = Height - (heightArrow * 2);
float fThumbHeight = (float)LargeChange / Maximum * nTrackHeight;
int nThumbHeight = (int)fThumbHeight;
if (nThumbHeight > nTrackHeight)
{
nThumbHeight = nTrackHeight;
fThumbHeight = nTrackHeight;
}
if (nThumbHeight < 56)
{
nThumbHeight = 56;
fThumbHeight = 56;
}
int nTop = (int)moSliderTop;
nTop += arrowHeight;
SolidBrush solidBrushSlider;
if (moSliderDragging)
{
solidBrushSlider = new SolidBrush(colorSliderDragging);
}
else if (sliderHovered)
{
solidBrushSlider = new SolidBrush(colorSliderHover);
}
else
{
solidBrushSlider = new SolidBrush(colorSlider);
}
Rectangle rectangleSlider = new Rectangle(1, nTop, Width - 2, nThumbHeight);
e.Graphics.FillRectangle(solidBrushSlider, rectangleSlider);
// Draw arrowDown
Pen penArrowDown;
if (arrowDownHovered)
{
penArrowDown = new Pen(colorArrowsHover, 2.5F);
}
else
{
penArrowDown = new Pen(colorArrows, 2.5F);
}
PointF pointArrowDown1 = new PointF(widthDevidedBy2 - widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowDown2 = new PointF(widthDevidedBy2 + widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
PointF pointArrowDown3 = new PointF(widthDevidedBy2, Height - widthDevidedBy2PluswidthDevidedBy8 + widthDevidedBy6);
PointF pointArrowDown4 = pointArrowDown1;
PointF[] curvePointsArrowDown =
{
pointArrowDown1,
pointArrowDown2,
pointArrowDown3,
pointArrowDown4,
};
e.Graphics.DrawPolygon(penArrowDown, curvePointsArrowDown);
}
private void TimerMouseStillClicked_Tick(object sender, EventArgs e)
{
timerMouseStillClickedCounter++;
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fThumbHeight = (float)LargeChange / Maximum * nTrackHeight;
int nScrollbarHeight = (int)fThumbHeight;
if (nScrollbarHeight > nTrackHeight)
{
nScrollbarHeight = nTrackHeight;
}
if (nScrollbarHeight < 56)
{
nScrollbarHeight = 56;
}
int nTop = (int)moSliderTop;
nTop += arrowHeight;
Point ptPoint = PointToClient(Cursor.Position);
Rectangle thumbrect = new Rectangle(new Point(0, nTop), new Size(controlWidth + 1, nScrollbarHeight));
if (thumbrect.Contains(ptPoint))
{
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;
// this.MouseWheel += CustomScrollbar_MouseWheel;
ResumeLayout(false);
}
private void CustomScrollbar_MouseLeave(object sender, EventArgs e)
{
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = false;
Refresh();
}
private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e)
{
Point ptPoint = PointToClient(Cursor.Position);
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fThumbHeight = (float)LargeChange / Maximum * nTrackHeight;
int nScrollbarHeight = (int)fThumbHeight;
if (nScrollbarHeight > nTrackHeight)
{
nScrollbarHeight = nTrackHeight;
}
if (nScrollbarHeight < 56)
{
nScrollbarHeight = 56;
}
int nTop = (int)moSliderTop;
nTop += arrowHeight;
Rectangle thumbrect = new Rectangle(new Point(0, nTop), new Size(controlWidth + 1, nScrollbarHeight));
Rectangle trackRectangle = new Rectangle(new Point(0, arrowHeight), new Size(controlWidth + 1, nTrackHeight));
if (thumbrect.Contains(ptPoint))
{
nClickPoint = ptPoint.Y - nTop;
moSliderDown = true;
}
else if (trackRectangle.Contains(ptPoint))
{
if (e.Y < thumbrect.Y)
{
MoveUp(Height);
mouseStillClickedMoveUp = true;
}
else
{
MoveDown(Height);
mouseStillClickedMoveUp = false;
}
mouseStillClickedMoveLarge = true;
timerMouseStillClickedCounter = 0;
timerMouseStillClicked.Start();
}
Rectangle uparrowrect = new Rectangle(new Point(0, 0), new Size(controlWidth + 1, arrowHeight));
if (uparrowrect.Contains(ptPoint))
{
MoveUp(SmallChange);
mouseStillClickedMoveUp = true;
mouseStillClickedMoveLarge = false;
timerMouseStillClickedCounter = 0;
timerMouseStillClicked.Start();
}
Rectangle downarrowrect = new Rectangle(new Point(0, arrowHeight + nTrackHeight), new Size(controlWidth + 1, arrowHeight));
if (downarrowrect.Contains(ptPoint))
{
MoveDown(SmallChange);
mouseStillClickedMoveUp = false;
mouseStillClickedMoveLarge = false;
timerMouseStillClickedCounter = 0;
timerMouseStillClicked.Start();
}
}
private void MoveDown(float change)
{
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fThumbHeight = (float)LargeChange / Maximum * nTrackHeight;
int nThumbHeight = (int)fThumbHeight;
if (nThumbHeight > nTrackHeight)
{
nThumbHeight = nTrackHeight;
fThumbHeight = nTrackHeight;
}
if (nThumbHeight < 56)
{
nThumbHeight = 56;
fThumbHeight = 56;
}
int nRealRange = Maximum - Minimum - (int)LargeChange;
int nPixelRange = nTrackHeight - nThumbHeight;
if (nRealRange > 0)
{
if (nPixelRange > 0)
{
float changeForOneItem = (change * nPixelRange) / (Maximum - LargeChange);
if ((moSliderTop + changeForOneItem) > nPixelRange)
{
moSliderTop = nPixelRange;
}
else
{
moSliderTop += changeForOneItem;
}
// figure out value
float fPerc = moSliderTop / nPixelRange;
float fValue = fPerc * (Maximum - LargeChange);
moValue = (int)fValue;
if (Value != lastValue)
{
ValueChanged?.Invoke(this, new EventArgs());
Scroll?.Invoke(this, new EventArgs());
lastValue = Value;
}
Invalidate();
}
}
}
private void MoveUp(float change)
{
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
int nSliderHeight = (int)fSliderHeight;
if (nSliderHeight > nTrackHeight)
{
nSliderHeight = nTrackHeight;
fSliderHeight = nTrackHeight;
}
if (nSliderHeight < 56)
{
nSliderHeight = 56;
fSliderHeight = 56;
}
int nRealRange = Maximum - Minimum - (int)LargeChange;
int nPixelRange = nTrackHeight - nSliderHeight;
if (nRealRange > 0)
{
if (nPixelRange > 0)
{
float changeForOneItem = (change * nPixelRange) / (Maximum - LargeChange);
if ((moSliderTop - changeForOneItem) < 0)
{
moSliderTop = 0;
}
else
{
moSliderTop -= changeForOneItem;
}
// figure out value
float fPerc = moSliderTop / nPixelRange;
float fValue = fPerc * (Maximum - LargeChange);
moValue = (int)fValue;
if (Value != lastValue)
{
ValueChanged?.Invoke(this, new EventArgs());
Scroll?.Invoke(this, new EventArgs());
lastValue = Value;
}
Invalidate();
}
}
}
private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e)
{
moSliderDown = false;
moSliderDragging = false;
timerMouseStillClicked.Stop();
}
private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e)
{
if (moSliderDown == true)
{
moSliderDragging = true;
}
if (moSliderDragging)
{
MoveThumb(e.Y);
}
if (Value != lastValue)
{
ValueChanged?.Invoke(this, new EventArgs());
Scroll?.Invoke(this, new EventArgs());
lastValue = Value;
}
// Remember hovered control
Point ptPoint = PointToClient(Cursor.Position);
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
int nSliderHeight = (int)fSliderHeight;
if (nSliderHeight > nTrackHeight)
{
nSliderHeight = nTrackHeight;
}
if (nSliderHeight < 56)
{
nSliderHeight = 56;
}
int nTop = (int)moSliderTop;
nTop += arrowHeight;
Rectangle scrollbarbrect = new Rectangle(new Point(0, nTop), new Size(controlWidth + 1, nSliderHeight));
Rectangle trackRectangle = new Rectangle(new Point(0, arrowHeight), new Size(controlWidth + 1, nTrackHeight));
if (scrollbarbrect.Contains(ptPoint))
{
if (e.Button != MouseButtons.Left)
{
arrowUpHovered = false;
sliderHovered = true;
arrowDownHovered = false;
}
}
else if (trackRectangle.Contains(ptPoint))
{
if (e.Y < scrollbarbrect.Y)
{
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = false;
}
else
{
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = false;
}
}
Rectangle uparrowrect = new Rectangle(new Point(0, 0), new Size(controlWidth + 1, arrowHeight));
if (uparrowrect.Contains(ptPoint))
{
arrowUpHovered = true;
sliderHovered = false;
arrowDownHovered = false;
}
Rectangle downarrowrect = new Rectangle(new Point(0, arrowHeight + nTrackHeight), new Size(controlWidth + 1, arrowHeight));
if (downarrowrect.Contains(ptPoint))
{
arrowUpHovered = false;
sliderHovered = false;
arrowDownHovered = true;
}
Invalidate();
}
private void MoveThumb(int y)
{
int nRealRange = Maximum - Minimum;
int nTrackHeight = Height - (arrowHeight + arrowHeight);
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
int nSliderHeight = (int)fSliderHeight;
if (nSliderHeight > nTrackHeight)
{
nSliderHeight = nTrackHeight;
}
if (nSliderHeight < 56)
{
nSliderHeight = 56;
}
int nSpot = nClickPoint;
int nPixelRange = nTrackHeight - nSliderHeight;
if (moSliderDown && nRealRange > 0)
{
if (nPixelRange > 0)
{
int nNewThumbTop = y - (arrowHeight + nSpot);
if (nNewThumbTop < 0)
{
moSliderTop = nNewThumbTop = 0;
}
else if (nNewThumbTop > nPixelRange)
{
moSliderTop = nNewThumbTop = nPixelRange;
}
else
{
moSliderTop = y - (arrowHeight + nSpot);
}
// figure out value
float fPerc = moSliderTop / nPixelRange;
float fValue = fPerc * (Maximum - LargeChange);
moValue = (int)fValue;
Application.DoEvents();
Invalidate();
}
}
}
}
}

View file

@ -0,0 +1,120 @@
<?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

@ -0,0 +1,39 @@
// <copyright file="ScrollbarControlDesigner.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
namespace SystemTrayMenu.UserInterface
{
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
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

@ -18,6 +18,7 @@
components.Dispose();
}
fading.Dispose();
customScrollbar.Dispose();
base.Dispose(disposing);
}
@ -29,49 +30,52 @@
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
this.components = new System.ComponentModel.Container();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
this.tableLayoutPanelDgvAndScrollbar = new System.Windows.Forms.TableLayoutPanel();
this.labelTitle = new SystemTrayMenu.UserInterface.LabelNoCopy();
this.ColumnText = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnIcon = new System.Windows.Forms.DataGridViewImageColumn();
this.dgv = new System.Windows.Forms.DataGridView();
this.pictureBoxSearch = new System.Windows.Forms.PictureBox();
this.textBoxSearch = new System.Windows.Forms.TextBox();
this.tableLayoutPanelSearch = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel.SuspendLayout();
this.textBoxSearch = new System.Windows.Forms.TextBox();
this.pictureBoxSearch = new System.Windows.Forms.PictureBox();
this.tableLayoutPanelMenu = new System.Windows.Forms.TableLayoutPanel();
this.customScrollbar = new UserInterface.CustomScrollbar();
this.tableLayoutPanelDgvAndScrollbar.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dgv)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxSearch)).BeginInit();
this.tableLayoutPanelSearch.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxSearch)).BeginInit();
this.tableLayoutPanelMenu.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel
// tableLayoutPanelDgvAndScrollbar
//
this.tableLayoutPanel.AutoScroll = true;
this.tableLayoutPanel.AutoSize = true;
this.tableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.tableLayoutPanel.ColumnCount = 1;
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel.Controls.Add(this.labelTitle, 0, 0);
this.tableLayoutPanel.Controls.Add(this.dgv, 0, 1);
this.tableLayoutPanel.Controls.Add(this.tableLayoutPanelSearch, 0, 2);
this.tableLayoutPanel.Location = new System.Drawing.Point(1, 1);
this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel.Name = "tableLayoutPanel";
this.tableLayoutPanel.RowCount = 3;
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel.Size = new System.Drawing.Size(83, 182);
this.tableLayoutPanel.TabIndex = 3;
this.tableLayoutPanel.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.DgvMouseWheel);
this.tableLayoutPanelDgvAndScrollbar.AutoScroll = true;
this.tableLayoutPanelDgvAndScrollbar.AutoSize = true;
this.tableLayoutPanelDgvAndScrollbar.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.tableLayoutPanelDgvAndScrollbar.ColumnCount = 2;
this.tableLayoutPanelDgvAndScrollbar.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelDgvAndScrollbar.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelDgvAndScrollbar.Controls.Add(this.customScrollbar, 1, 0);
this.tableLayoutPanelDgvAndScrollbar.Controls.Add(this.dgv, 0, 0);
this.tableLayoutPanelDgvAndScrollbar.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanelDgvAndScrollbar.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanelDgvAndScrollbar.Name = "tableLayoutPanelDgvAndScrollbar";
this.tableLayoutPanelDgvAndScrollbar.RowCount = 1;
this.tableLayoutPanelDgvAndScrollbar.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanelDgvAndScrollbar.Size = new System.Drawing.Size(70, 40);
this.tableLayoutPanelDgvAndScrollbar.TabIndex = 3;
this.tableLayoutPanelDgvAndScrollbar.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.DgvMouseWheel);
//
// labelTitle
//
this.labelTitle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labelTitle.AutoEllipsis = true;
this.labelTitle.AutoSize = true;
this.labelTitle.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelTitle.BackColor = System.Drawing.Color.Azure;
this.labelTitle.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelTitle.ForeColor = System.Drawing.Color.Black;
@ -79,7 +83,7 @@
this.labelTitle.Margin = new System.Windows.Forms.Padding(0);
this.labelTitle.Name = "labelTitle";
this.labelTitle.Padding = new System.Windows.Forms.Padding(3, 0, 0, 1);
this.labelTitle.Size = new System.Drawing.Size(83, 14);
this.labelTitle.Size = new System.Drawing.Size(70, 14);
this.labelTitle.TabIndex = 2;
this.labelTitle.Text = "STM";
this.labelTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
@ -101,7 +105,7 @@
this.ColumnText.ReadOnly = true;
this.ColumnText.Resizable = System.Windows.Forms.DataGridViewTriState.False;
this.ColumnText.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Programmatic;
this.ColumnText.Width = 50;
this.ColumnText.Width = 25;
//
// ColumnIcon
//
@ -146,16 +150,36 @@
this.dgv.RowTemplate.DefaultCellStyle.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.dgv.RowTemplate.Height = 20;
this.dgv.RowTemplate.ReadOnly = true;
this.dgv.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.dgv.ScrollBars = System.Windows.Forms.ScrollBars.None;
this.dgv.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dgv.ShowCellErrors = false;
this.dgv.ShowCellToolTips = false;
this.dgv.ShowEditingIcon = false;
this.dgv.ShowRowErrors = false;
this.dgv.Size = new System.Drawing.Size(83, 145);
this.dgv.Size = new System.Drawing.Size(55, 40);
this.dgv.TabIndex = 4;
this.dgv.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.DgvMouseWheel);
//
// tableLayoutPanelSearch
//
this.tableLayoutPanelSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.tableLayoutPanelSearch.AutoSize = true;
this.tableLayoutPanelSearch.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.tableLayoutPanelSearch.BackColor = System.Drawing.Color.White;
this.tableLayoutPanelSearch.ColumnCount = 2;
this.tableLayoutPanelSearch.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelSearch.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelSearch.Controls.Add(this.textBoxSearch, 1, 0);
this.tableLayoutPanelSearch.Controls.Add(this.pictureBoxSearch, 0, 0);
this.tableLayoutPanelSearch.Location = new System.Drawing.Point(0, 146);
this.tableLayoutPanelSearch.Margin = new System.Windows.Forms.Padding(0, 1, 0, 0);
this.tableLayoutPanelSearch.Name = "tableLayoutPanelSearch";
this.tableLayoutPanelSearch.RowCount = 1;
this.tableLayoutPanelSearch.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanelSearch.Size = new System.Drawing.Size(70, 22);
this.tableLayoutPanelSearch.TabIndex = 5;
this.tableLayoutPanelSearch.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.DgvMouseWheel);
//
// pictureBoxSearch
//
this.pictureBoxSearch.BackColor = System.Drawing.Color.White;
@ -181,24 +205,31 @@
this.textBoxSearch.TextChanged += new System.EventHandler(this.TextBoxSearch_TextChanged);
this.textBoxSearch.ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
//
// tableLayoutPanelSearch
// tableLayoutPanelMenu
//
this.tableLayoutPanelSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.tableLayoutPanelSearch.AutoSize = true;
this.tableLayoutPanelSearch.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.tableLayoutPanelSearch.BackColor = System.Drawing.Color.White;
this.tableLayoutPanelSearch.ColumnCount = 2;
this.tableLayoutPanelSearch.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelSearch.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelSearch.Controls.Add(this.textBoxSearch, 1, 0);
this.tableLayoutPanelSearch.Controls.Add(this.pictureBoxSearch, 0, 0);
this.tableLayoutPanelSearch.Location = new System.Drawing.Point(0, 160);
this.tableLayoutPanelSearch.Margin = new System.Windows.Forms.Padding(0, 1, 0, 0);
this.tableLayoutPanelSearch.Name = "tableLayoutPanelSearch";
this.tableLayoutPanelSearch.RowCount = 1;
this.tableLayoutPanelSearch.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanelSearch.Size = new System.Drawing.Size(83, 22);
this.tableLayoutPanelSearch.TabIndex = 5;
this.tableLayoutPanelMenu.AutoSize = true;
this.tableLayoutPanelMenu.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.tableLayoutPanelMenu.ColumnCount = 1;
this.tableLayoutPanelMenu.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanelMenu.Controls.Add(this.labelTitle, 0, 0);
this.tableLayoutPanelMenu.Controls.Add(this.tableLayoutPanelSearch, 0, 2);
this.tableLayoutPanelMenu.Controls.Add(this.tableLayoutPanelDgvAndScrollbar, 0, 1);
this.tableLayoutPanelMenu.Location = new System.Drawing.Point(1, 1);
this.tableLayoutPanelMenu.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanelMenu.Name = "tableLayoutPanelMenu";
this.tableLayoutPanelMenu.RowCount = 3;
this.tableLayoutPanelMenu.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanelMenu.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanelMenu.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanelMenu.Size = new System.Drawing.Size(70, 76);
this.tableLayoutPanelMenu.TabIndex = 4;
//
// customScrollbar
//
this.customScrollbar.Location = new System.Drawing.Point(0, 0);
this.customScrollbar.Name = "customScrollbar";
this.customScrollbar.Size = new System.Drawing.Size(15, 40);
this.customScrollbar.TabIndex = 5;
//
// Menu
//
@ -208,7 +239,7 @@
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(331, 360);
this.Controls.Add(this.tableLayoutPanel);
this.Controls.Add(this.tableLayoutPanelMenu);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "Menu";
this.Opacity = 0.01D;
@ -217,12 +248,13 @@
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "SystemTrayMenu";
this.TopMost = true;
this.tableLayoutPanel.ResumeLayout(false);
this.tableLayoutPanel.PerformLayout();
this.tableLayoutPanelDgvAndScrollbar.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dgv)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxSearch)).EndInit();
this.tableLayoutPanelSearch.ResumeLayout(false);
this.tableLayoutPanelSearch.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxSearch)).EndInit();
this.tableLayoutPanelMenu.ResumeLayout(false);
this.tableLayoutPanelMenu.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@ -230,12 +262,14 @@
#endregion
private SystemTrayMenu.UserInterface.LabelNoCopy labelTitle;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanelDgvAndScrollbar;
private System.Windows.Forms.DataGridView dgv;
private System.Windows.Forms.DataGridViewImageColumn ColumnIcon;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnText;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanelSearch;
private System.Windows.Forms.TextBox textBoxSearch;
private System.Windows.Forms.PictureBox pictureBoxSearch;
private UserInterface.CustomScrollbar customScrollbar;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanelMenu;
}
}

View file

@ -95,23 +95,37 @@ namespace SystemTrayMenu.UserInterface
}
labelTitle.BackColor = titleBackColor;
tableLayoutPanel.BackColor = backColor;
tableLayoutPanelDgvAndScrollbar.BackColor = backColor;
dgv.BackgroundColor = backColor;
textBoxSearch.BackColor = backColorSearch;
pictureBoxSearch.BackColor = backColorSearch;
tableLayoutPanelSearch.BackColor = backColorSearch;
DataGridViewCellStyle dgvCellStyle = new DataGridViewCellStyle
dgv.DefaultCellStyle = new DataGridViewCellStyle
{
SelectionForeColor = foreColor,
ForeColor = foreColor,
BackColor = backColor,
};
dgv.DefaultCellStyle = dgvCellStyle;
VScrollBar scrollBar = dgv.Controls.OfType<VScrollBar>().First();
scrollBar.MouseWheel += DgvMouseWheel;
scrollBar.MouseEnter += ControlsMouseEnter;
customScrollbar.GotFocus += CustomScrollbar_GotFocus;
void CustomScrollbar_GotFocus(object sender, EventArgs e)
{
textBoxSearch.Focus();
}
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.Round(firstIndex, 0, MidpointRounding.AwayFromZero);
if (firstIndexRounded > -1 && firstIndexRounded < dgv.RowCount)
{
dgv.FirstDisplayedScrollingRowIndex = firstIndexRounded;
}
}
customScrollbar.MouseEnter += ControlsMouseEnter;
dgv.MouseEnter += ControlsMouseEnter;
labelTitle.MouseEnter += ControlsMouseEnter;
void ControlsMouseEnter(object sender, EventArgs e)
@ -119,7 +133,7 @@ namespace SystemTrayMenu.UserInterface
MouseEnter?.Invoke();
}
scrollBar.MouseLeave += ControlsMouseLeave;
customScrollbar.MouseLeave += ControlsMouseLeave;
dgv.MouseLeave += ControlsMouseLeave;
labelTitle.MouseLeave += ControlsMouseLeave;
void ControlsMouseLeave(object sender, EventArgs e)
@ -416,6 +430,14 @@ namespace SystemTrayMenu.UserInterface
textBoxSearch.Focus();
}
internal void AdjustScrollbar()
{
customScrollbar.Value = (int)Math.Round(
dgv.FirstDisplayedScrollingRowIndex * (decimal)customScrollbar.Maximum / dgv.Rows.Count,
0,
MidpointRounding.AwayFromZero);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keys)
{
switch (keys)
@ -482,43 +504,66 @@ namespace SystemTrayMenu.UserInterface
}
DataTable data = (DataTable)dgv.DataSource;
int dgvHeightNew = dgv.Rows.GetRowsHeight(DataGridViewElementStates.None); // Height of all rows
int dgvHeightMax = screenHeightMax - (Height - dgv.Height); // except dgv
if (dgvHeightMax > Properties.Settings.Default.MaximumMenuHeight)
{
dgvHeightMax = Properties.Settings.Default.MaximumMenuHeight;
}
if (dgvHeightNew > dgvHeightMax)
{
// Make all rows fit into the screen
customScrollbar.PaintEnable();
if (customScrollbar.Maximum != dgvHeightNew)
{
customScrollbar.Reset();
customScrollbar.Height = dgvHeightMax;
customScrollbar.Minimum = 0;
customScrollbar.Maximum = dgvHeightNew;
customScrollbar.LargeChange = (customScrollbar.Maximum / (float)customScrollbar.Height) + dgvHeightMax;
customScrollbar.SmallChange = dgv.RowTemplate.Height;
}
dgvHeightNew = dgvHeightMax;
}
else
{
customScrollbar.PaintDisable();
}
if (string.IsNullOrEmpty(data.DefaultView.RowFilter))
{
int dgvHeight = dgv.Rows.GetRowsHeight(DataGridViewElementStates.None); // Height of all rows
int dgvHeightMax = screenHeightMax - (Height - dgv.Height); // except dgv
if (dgvHeightMax > Properties.Settings.Default.MaximumMenuHeight)
{
dgvHeightMax = Properties.Settings.Default.MaximumMenuHeight;
}
if (dgvHeight > dgvHeightMax)
{
// Make all rows fit into the screen
dgvHeight = dgvHeightMax;
}
dgv.Height = dgvHeight;
dgv.Height = dgvHeightNew;
}
}
private void AdjustDataGridViewWidth()
{
DataGridViewExtensions.FastAutoSizeColumns(dgv);
int newWidth = dgv.Columns[0].Width + dgv.Columns[1].Width;
if (IsScrollbarShown())
if (dgv.Columns[1].Width < 60)
{
newWidth += SystemInformation.VerticalScrollBarWidth;
dgv.Columns[1].Width = 60;
}
if (labelTitle.Width > newWidth)
int widthIcon = dgv.Columns[0].Width;
int widthText = dgv.Columns[1].Width;
int widthScrollbar = 0;
if (customScrollbar.Enabled)
{
dgv.Width = labelTitle.Width;
dgv.Columns[1].Width = labelTitle.Width - dgv.Columns[0].Width;
widthScrollbar = customScrollbar.Width;
}
if (labelTitle.Width > (widthIcon + widthText + widthScrollbar))
{
dgv.Width = labelTitle.Width - widthScrollbar;
dgv.Columns[1].Width = labelTitle.Width - widthIcon - widthScrollbar;
}
else
{
dgv.Width = newWidth;
dgv.Width = widthIcon + widthText;
}
// Only scaling correct with Sans Serif for textBoxSearch. Workaround:
@ -528,57 +573,12 @@ namespace SystemTrayMenu.UserInterface
FontStyle.Regular,
GraphicsUnit.Point,
0);
// Ancor not working like in the label
textBoxSearch.Width = newWidth -
pictureBoxSearch.Width -
pictureBoxSearch.Margin.Horizontal -
textBoxSearch.Margin.Horizontal;
}
private bool IsScrollbarShown()
{
bool isScrollbarShown = false;
foreach (VScrollBar scroll in dgv.Controls.OfType<VScrollBar>())
{
if (scroll.Visible)
{
isScrollbarShown = true;
}
}
return isScrollbarShown;
}
private void DgvMouseWheel(object sender, MouseEventArgs e)
{
((HandledMouseEventArgs)e).Handled = true;
int scrollspeed = MenuDefines.Scrollspeed;
if (e.Delta < 0)
{
if (dgv.FirstDisplayedScrollingRowIndex < dgv.Rows.Count - scrollspeed)
{
dgv.FirstDisplayedScrollingRowIndex += scrollspeed;
}
else
{
dgv.FirstDisplayedScrollingRowIndex = dgv.Rows.Count - 1;
}
}
else
{
if (dgv.FirstDisplayedScrollingRowIndex > 0 + scrollspeed)
{
dgv.FirstDisplayedScrollingRowIndex -= scrollspeed;
}
else
{
dgv.FirstDisplayedScrollingRowIndex = 0;
}
}
dgv.Invalidate();
customScrollbar.CustomScrollbar_MouseWheel(sender, e);
MouseWheel?.Invoke();
}
@ -602,6 +602,8 @@ namespace SystemTrayMenu.UserInterface
private void TextBoxSearch_TextChanged(object sender, EventArgs e)
{
customScrollbar.Value = 0;
DataTable data = (DataTable)dgv.DataSource;
string filterField = dgv.Columns[1].Name;
SearchTextChanging?.Invoke();

View file

@ -1,64 +1,4 @@
<?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.
-->
<root>
<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">
@ -117,10 +57,4 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ColumnIcon.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnText.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View file

@ -160,7 +160,7 @@ namespace SystemTrayMenu.UserInterface
numericUpDownMenuWidth.Increment = 10;
numericUpDownMenuWidth.Value = Settings.Default.MaximumMenuWidth;
numericUpDownMenuHeight.Minimum = 100;
numericUpDownMenuHeight.Minimum = 200;
numericUpDownMenuHeight.Maximum = 4000;
numericUpDownMenuHeight.Increment = 10;
numericUpDownMenuHeight.Value = Settings.Default.MaximumMenuHeight;

View file

@ -8,7 +8,7 @@
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"settings": {
"documentationRules": {
"companyName": "TAMAHO"
"companyName": "SystemTrayMenu"
}
}
}