2022-12-30 17:00:40 -07:00

143 lines
3.9 KiB
C#

using DataLayer;
using Mpeg4Lib.Boxes;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LibationWinForms.GridView
{
public partial class RatingPicker : UserControl, IDataGridViewEditingControl
{
private const string SOLID_STAR = "★";
private const string HOLLOW_STAR = "☆";
private Rating _rating;
public Rating Rating {
get => _rating;
set
{
_rating = value;
int rating = 0;
foreach (Label star in panel1.Controls)
star.Tag = star.Text = _rating.OverallRating > rating++ ? SOLID_STAR : HOLLOW_STAR;
rating = 0;
foreach (Label star in panel2.Controls)
star.Tag = star.Text = _rating.PerformanceRating > rating++ ? SOLID_STAR : HOLLOW_STAR;
rating = 0;
foreach (Label star in panel3.Controls)
star.Tag = star.Text = _rating.StoryRating > rating++ ? SOLID_STAR : HOLLOW_STAR;
}
}
public RatingPicker()
{
InitializeComponent();
}
private void Star_MouseEnter(object sender, EventArgs e)
{
var thisTbox = sender as Label;
var stackPanel = thisTbox.Parent as Panel;
var star = SOLID_STAR;
foreach (Label child in stackPanel.Controls)
{
child.Text = star;
if (child == thisTbox) star = HOLLOW_STAR;
}
}
private void Star_MouseLeave(object sender, EventArgs e)
{
var thisTbox = sender as Label;
var panel = thisTbox.Parent as Panel;
//Artifically shrink rectangle to guarantee mouse is outside when exiting from the left (negative X)
var clientPt = panel.PointToClient(MousePosition);
var rect = new Rectangle(0, 0, panel.ClientRectangle.Width - 2, panel.ClientRectangle.Height);
if (!rect.Contains(clientPt.X - 2, clientPt.Y))
{
//Restore defaults
foreach (Label child in panel.Controls)
child.Text = (string)child.Tag;
}
}
private void Star_MouseClick(object sender, MouseEventArgs e)
{
var overall = Rating.OverallRating;
var perform = Rating.PerformanceRating;
var story = Rating.StoryRating;
var thisTbox = sender as Label;
var panel = thisTbox.Parent as Panel;
int newRating = 0;
foreach (var child in panel.Controls)
{
newRating++;
if (child == thisTbox) break;
}
if (panel == panel1)
overall = newRating;
else if (panel == panel2)
perform = newRating;
else if (panel == panel3)
story = newRating;
if (overall + perform + story == 0f) return;
Rating = new Rating(overall, perform, story);
EditingControlValueChanged = true;
EditingControlDataGridView.NotifyCurrentCellDirty(true);
}
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;
#region IDataGridViewEditingControl
public DataGridView EditingControlDataGridView { get => dataGridView; set => dataGridView = value; }
public object EditingControlFormattedValue { get => Rating.ToStarString(); set { } }
public int EditingControlRowIndex { get => rowIndex; set => rowIndex = value; }
public bool EditingControlValueChanged { get => valueChanged; set => valueChanged = value; }
public Cursor EditingPanelCursor => base.Cursor;
public bool RepositionEditingControlOnValueChange => false;
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Enter:
case Keys.Escape:
return true;
default:
return !dataGridViewWantsInputKey;
}
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) => EditingControlFormattedValue;
public void PrepareEditingControlForEdit(bool selectAll) { }
#endregion
}
}