moodmeter/AffdexMe/MetricSelectionUI.xaml.cs

201 lines
7.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using WpfAnimatedGif;
namespace AffdexMe
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class MetricSelectionUI : Window
{
const String SELECTMSG = "Please select 6 Emotions or Expressions to track.";
const String ACTIVEMSG = "{0} Metrics chosen, please select {1} more.";
const String DONEMSG = "{0} Metrics chosen.";
const String DESELECTMSG = "Reached max number of metrics selected.";
public MetricSelectionUI(StringCollection enabled_classifiers)
{
InitializeComponent();
CenterWindowOnScreen();
Classifiers = enabled_classifiers;
foreach (String classifier in enabled_classifiers)
{
Border border = getBorder(classifier);
border.BorderBrush = Brushes.Green;
}
}
private void CenterWindowOnScreen()
{
double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
double windowWidth = this.Width;
double windowHeight = this.Height;
this.Left = (screenWidth / 2) - (windowWidth / 2);
this.Top = (screenHeight / 2) - (windowHeight / 2);
}
private void StackPanel_MouseEnter(object sender, MouseEventArgs e)
{
Border border = (Border)((StackPanel)sender).Parent;
if (!isStackPanelSelected(border))
border.BorderBrush = Brushes.Coral;
var image = ((StackPanel)sender).Children.OfType<Image>().FirstOrDefault();
NameToResourceConverter conv = new NameToResourceConverter();
var gifUri = conv.Convert(((StackPanel)sender).Name, null, "gif", null);
var img = new BitmapImage();
img.BeginInit();
img.UriSource = (Uri) gifUri;
img.EndInit();
ImageBehavior.SetAnimatedSource(image, img);
playGif(image);
}
private void StackPanel_MouseLeave(object sender, MouseEventArgs e)
{
Border border = (Border)((StackPanel)sender).Parent;
var image = ((StackPanel)sender).Children.OfType<Image>().FirstOrDefault();
NameToResourceConverter conv = new NameToResourceConverter();
stopGif(image);
var img = new BitmapImage();
img.BeginInit();
img.UriSource = (Uri)conv.Convert(((StackPanel)sender).Name, null, "jpg", null);
img.EndInit();
ImageBehavior.SetAnimatedSource(image, img);
if (!isStackPanelSelected(border))
border.BorderBrush = Brushes.White;
int classifersCount = Classifiers.Count;
if (classifersCount == 6) txtBlkInfo.Text = String.Format(DONEMSG, classifersCount);
else txtBlkInfo.Text = String.Format(ACTIVEMSG, classifersCount, 6 - classifersCount);
}
private void stopGif(Image image)
{
var control = ImageBehavior.GetAnimationController(image);
if (control != null)
{
control.Pause();
control.GotoFrame(control.FrameCount - 1);
}
}
private void playGif(Image image)
{
var control = ImageBehavior.GetAnimationController(image);
control.GotoFrame(0);
control.Play();
}
private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e)
{
Border border = (Border)((StackPanel)sender).Parent;
if (isStackPanelSelected(border))
{
border.BorderBrush = Brushes.White;
Classifiers.Remove(((StackPanel)sender).Name);
}
else {
int classifersCount = Classifiers.Count;
if ( classifersCount < 6)
{
border.BorderBrush = Brushes.Green;
Classifiers.Add(((StackPanel)sender).Name);
if (classifersCount + 1 == 6) txtBlkInfo.Text = String.Format(DONEMSG, classifersCount + 1);
else txtBlkInfo.Text = String.Format(ACTIVEMSG, classifersCount+1, 6 - classifersCount);
}
else
{
border.BorderBrush = Brushes.Red;
txtBlkInfo.Text = DESELECTMSG;
}
}
}
private Border getBorder(String name)
{
Border border = null;
foreach (StackPanel panel in theGrid.Children.OfType<StackPanel>())
{
var tempBorder = panel.Children.OfType<Border>().FirstOrDefault();
var stackPanel = (StackPanel)tempBorder.Child;
if (stackPanel.Name == name) border = tempBorder;
}
return border;
}
private bool isStackPanelSelected(Border border)
{
return (border.BorderBrush == Brushes.Green);
}
public StringCollection Classifiers {get;set;}
public String ActiveClassifierList
{
get
{
String classifiers = "";
foreach(String key in Classifiers)
classifiers += String.Format("{0},", key);
return String.Format("{0} active classifiers: {1}", Classifiers.Count, classifiers);
}
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
int selectedClassifiersCount = Classifiers.Count;
if ( selectedClassifiersCount < 6)
{
int missing = 6 - selectedClassifiersCount;
List<StackPanel> panels = theGrid.Children.OfType<StackPanel>().ToList();
int index = 0;
while (selectedClassifiersCount < 6)
{
var tempBorder = panels[index].Children.OfType<Border>().FirstOrDefault();
var stackPanel = (StackPanel)tempBorder.Child;
Classifiers.Add(stackPanel.Name);
index++;
selectedClassifiersCount++;
}
}
}
private void btnClearAll_Click(object sender, RoutedEventArgs e)
{
foreach (String classifier in Classifiers)
{
Border border = getBorder(classifier);
border.BorderBrush = Brushes.White;
txtBlkInfo.Text = SELECTMSG;
}
Classifiers.Clear();
}
private void btnOK_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}