using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace ImageSorter { public partial class Form1 : Form { ImageCollection _images; int _currentImage; string _indexFile; public Form1() { InitializeComponent(); } internal ImageCollection ImageCollection { get { return _images; } } private ImageInfo CurrentImage { get { return _images[_currentImage]; } } internal TagCollection TagCollection { get { return ImageCollection.Tags; } } private string entryForTag(string tag) { return String.Format("{0} ({1})", tag, ImageCollection.UsesOfTag(tag)); } private void UpdateTags() { tagList.Nodes.Clear(); foreach (string tag in TagCollection) { bool currentImageHasTag = CurrentImage.HasTag(tag); string entryForTag1 = entryForTag(tag); TreeNode node = new TreeNode(entryForTag1); node.Checked = currentImageHasTag; tagList.Nodes.Add(node); } } private void Reset() { _currentImage = 0; UpdateImage(); } Dictionary loaded = new Dictionary(); private void UpdateImage() { string filename = _images[_currentImage].Filename; if (!loaded.ContainsKey(filename)) { Bitmap img = new Bitmap(filename); loaded.Add(filename, img); } pictureBox1.Image = loaded[filename]; label1.Text = Path.GetFileName(_images[_currentImage].Filename); label2.Text = String.Format("{0}/{1}", _currentImage + 1, _images.Count); prevButton.Enabled = (_currentImage > 0); nextButton.Enabled = (_currentImage < _images.Count - 1); UpdateTags(); } private void prevButton_Click(object sender, EventArgs e) { showPrevImage(); } private void showPrevImage() { if (_currentImage == 0) { // XXX beep return; } --_currentImage; UpdateImage(); } private void nextButton_Click(object sender, EventArgs e) { showNextImage(); } private void showNextImage() { if (_currentImage >= _images.Count) { // XXX beep return; } ++_currentImage; UpdateImage(); } /// /// Takes the menu entry from the tag list, /// and returns the tag corresponding to it. /// private string tagFromMenuEntry(string menuString) { return menuString.Substring(0, menuString.IndexOf('(')).TrimEnd(' '); } private void Form1_Shown(object sender, EventArgs e) { //Reset(); } private void tagList_AfterCheck(object sender, TreeViewEventArgs e) { string tag = tagFromMenuEntry(e.Node.Text); CurrentImage.SetTag(tag, e.Node.Checked); // update the count displayed in the entry e.Node.Text = entryForTag(tag); WriteCurrentState(); } private void WriteCurrentState() { if (_indexFile != null) { using (StreamWriter wrt = new StreamWriter(_indexFile)) { _images.WriteTo(wrt); } } } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { // if the user presses return, we take // the contents and add it as a tag // for the current image. if (e.KeyChar == '\r') { string tag = textBox1.Text.Trim(); if (!string.IsNullOrEmpty(tag)) { TagCollection.AddTag(tag); CurrentImage.SetTag(tag, true); UpdateTags(); WriteCurrentState(); } textBox1.Clear(); e.Handled = true; } } internal void LoadFromDirectory(string dir) { string indexFile = dir + "/image-index.xml"; if (File.Exists(indexFile)) { using (StreamReader rdr = new StreamReader(indexFile)) { _images = new ImageCollection(rdr); } } else { _images = new ImageCollection(dir); } // we will save into the index file _indexFile = indexFile; Reset(); } private void Global_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.PageDown) { showNextImage(); e.Handled = true; } else if (e.KeyCode == Keys.PageUp) { showPrevImage(); e.Handled = true; } } private void button1_Click(object sender, EventArgs e) { excludeImage(); } ImageInfo _lastExcluded = null; private void excludeImage() { _lastExcluded = ImageCollection[_currentImage]; ImageCollection.Exclude(_currentImage); // if we exclude the final image, go back // one. if (_currentImage == ImageCollection.Count) { --_currentImage; } WriteCurrentState(); UpdateImage(); button2.Enabled = true; } private void button2_Click(object sender, EventArgs e) { // re-insert the last excluded image // at the current point ImageCollection.Insert(_currentImage, _lastExcluded); _lastExcluded = null; button2.Enabled = false; WriteCurrentState(); UpdateImage(); } } }