メディアプレイヤーなどのプレイリストの試作

コンピュータ

メディアプレイヤーなどに楽曲の演奏順番をユーザーが任意に作成する機能をよく見かけます。
今回はListViewを使ってインタフェースの試作をしてみます。

機能

  1. ListViewにエクスプローラからファイルをドラッグアンドドロップで項目の追加
  2. ListView内のファイルの位置をマウスで自由に移動できます。
  3. Deleteキーで不要なファイルを削除することが出来ます。
  4. Ctrl + SでListViewの並びでファイルの一覧をテキストファイルで保存します。
  5. Ctrl + Oで保存したテキストファイルを読み込めます。

ソース

using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Text;
// 
// プレイリスト
// 

// コンパイル
// csc /t:winexe ListView.cs

class Form1 : Form
{
    ListView listView = new ListView {
        Dock = DockStyle.Fill,
        View = View.List,
        AllowDrop = true,
        MultiSelect = false,
    };

    Form1()
    {
        // Itemのドラック
        listView.ItemDrag += (sender, e) => {
            listView.DoDragDrop(
                (ListViewItem)e.Item,
                DragDropEffects.Move
            );
        };
        // ドラック開始
        listView.DragEnter += (sender, e) => {
            // ファイルドロップ
            if(e.Data.GetDataPresent(DataFormats.FileDrop)) {
                e.Effect = DragDropEffects.Copy;
            }
            // リストビュー内
            if(e.Data.GetDataPresent(typeof(ListViewItem))) {
                e.Effect = DragDropEffects.Move;
            }
        };
        // ドラックアンドドロップ
        listView.DragDrop += (sender, e) => {
            // ファイルドロップ
            if(e.Data.GetDataPresent(DataFormats.FileDrop)) {
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                for (int i=0; i < files.Length; i++) {
                    var lvi = new ListViewItem(files[i], i);
                    listView.Items.Add(lvi);
                }
            }
            // リストビュー内の移動
            if(e.Data.GetDataPresent(typeof(ListViewItem))) {

                var dragItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
                Point p = listView.PointToClient(new Point(e.X, e.Y));
                var currentItem = listView.GetItemAt(p.X, p.Y);
                int currentIndex = listView.Items.IndexOf(currentItem);

                if (currentIndex < 0) return;

                if (currentIndex > dragItem.Index) currentIndex++;
                
                var newItem = listView.Items.Insert(currentIndex, dragItem.Text);
                newItem.Selected = true;
                listView.Items.Remove(dragItem);
            }
        };
        // キーダウン
        listView.KeyDown += (sender, e) => {
            // Ctrl + N クリア
            if (e.KeyData == (Keys.Control | Keys.N)) {
                Text = "";
                listView.Items.Clear();
            }
            
            // Delete 削除
            if (e.KeyData == (Keys.Delete)) {
                foreach (ListViewItem item in listView.SelectedItems) {
                    listView.Items.Remove(item);
                }
            }

            // Ctrl + S 保存
            if (e.KeyData == (Keys.Control | Keys.S)) {
                if (Text == "") {
                    var dialog = new SaveFileDialog {
                        Filter = "TXETファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*",
                    };
                    if (dialog.ShowDialog() != DialogResult.OK) return;
                    Text = dialog.FileName;
                }
                using(var sw = new StreamWriter(Text, false, new UTF8Encoding(false))) {
                    foreach (ListViewItem item in listView.Items) {
                        sw.WriteLine(item.Text);
                    }
                };
            }
            // Ctrl + O 開く
            if (e.KeyData == (Keys.Control | Keys.O)) {
                var dialog = new OpenFileDialog {
                    Filter = "TXETファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*",
                };
                if (dialog.ShowDialog() != DialogResult.OK) return;
                
                Text = dialog.FileName;
                listView.Items.Clear();

                using(var sr = new StreamReader(Text, new UTF8Encoding(false))) {
                    int i = 0;
                    while (sr.EndOfStream == false) {
                        var lvi = new ListViewItem(sr.ReadLine(), i++);
                        listView.Items.Add(lvi);
                    }
                };
            }
        };

        // キーイベントを最初にFormで受け取る
        KeyPreview = true;

        Controls.Add(listView);

        listView.Columns.Add("ファイル名", -2, HorizontalAlignment.Left);


    }
    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }
}

実行

コメント