メディアプレイヤーなどに楽曲の演奏順番をユーザーが任意に作成する機能をよく見かけます。
今回はListViewを使ってインタフェースの試作をしてみます。
機能
- ListViewにエクスプローラからファイルをドラッグアンドドロップで項目の追加
- ListView内のファイルの位置をマウスで自由に移動できます。
- Deleteキーで不要なファイルを削除することが出来ます。
- Ctrl + SでListViewの並びでファイルの一覧をテキストファイルで保存します。
- 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());
}
}
コメント