ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# リスト管理できるテキストエディタ「List Fusen」を制作&リリース

C#の勉強を兼ねて、複数のテキストをリスト上で切り替えながら編集できたらなあと思って作ったツール「List Fusen」を制作しました。

実行ファイルをzipにしてこちらにアップしています。
よろしければお使いになってみてください。

GitHubにも実行ファイルとソリューション一式をアップしています。
ライセンスは MIT License です。

f:id:moko_03_25:20171105190026j:plain

 2017.11/12
  Ctrl + A や Ctrl + S を入力時にシステム音が鳴る不具合を修正

 2017.11/15(ver.1.01)
  リストとテキストエディタの間をドラッグで分割サイズ変更可能に
  リスト上をF2またはダブルクリックでアイテムのリネーム
  リストアイテム削除時にダイアログ表示
  10分間隔でのオートセーブ

 2017.11/20(ver.1.02)
  リストアイテム追加時にテキストボックス内でのEnterで確定
  テキストを右端で折り返さない設定に変更
  ウインドウの分割位置を保存
  リストとテキストのフォントの設定の変更・保存に対応
  オートセーブ関連の設定の変更・保存に対応

 2017.11/23(ver.1.03)
  タブスペースに対応
  プログラムアイコンを設定

 2017.11/24(ver.1.04)
  タスクバーのアイコンとツール名表示に対応
  上記対応のためにフォームの枠を取り払ってツールのサイズ変更を実装

 2017.11/27(ver.1.05)
  ツール設定でテキストを右端で折り返す設定に対応
  二重起動を禁止していたのを解除

 2017.11/28(ver.1.06)
  テキストに変更があった際にDirtyマークを表示

 2018.1/22(ver.1.06)
  ツール上部のバージョン表記が間違っていたので修正

 2018.5/8(ver.1.07)
  ツールのアクセントカラーがオプションで変更可能に
  それに伴いアイコンのアクティブ時の色を修正
f:id:moko_03_25:20180509010345j:plain

 2018.5/9(ver.1.08)
  パネルのアクセントカラーが初期化されない不具合を修正
  オプション設定での変更がその場ですぐ反映されるよう対応

上部にボタンが並んでいて、メイン画面の左はリスト(ListBox)、右はテキストエディタ(TextBox)になっています。
Visual Basic Community 2017 を使って C# で作っています。

Fusen」という名前になってるのは、普段フリーソフトの付箋ツールを使っていたのですが、複数枚並べると画面を覆って邪魔なので、付箋をタブ切り替えできるようなものが欲しいと思って取り掛かったのが元になっています。

実装したもの


ちゃんときっちり作るのは初めてでしたが、とりあえず細かくやることが多かったです。
我ながら頑張ったと思います。

●リストのアイテム名とテキストデータを保持しておくクラスの作成
 ListBoxのItemにnewしてオブジェクトを渡し
 オブジェクト内ではリストのアイテム名とテキストの内容を変数で保持しておき
 アイテムを切り替える際など一時的に保存したい際にアクセスしています

●リスト名とテキストデータをtxtファイルで管理
・実行ファイルと同じ場所に管理用フォルダを作ってその中のテキストファイルで管理
 ・管理フォルダが存在しない場合に作成
 ・リスト名管理ファイルが無い場合に作成
 ・保存実行時にリスト名管理ファイルを更新し
  テキストデータも1項目1つのtxtファイルで出力
 ・起動時にリスト名管理ファイルとテキストデータを読み込む

●ListBox周りの挙動
・起動直後にはリスト先頭のアイテムを選択
・起動直後に1つもアイテムが無ければ追加
・ボタンで選択したアイテムを上下に移動
・ボタンでアイテムを追加
・ボタンでアイテムをリネーム
 ・ダイアログを作成、表示
 ・OKボタンとキャンセルボタン対応
 ・Escキーでのキャンセル対応
・ボタンでアイテムを削除
 ・最後のアイテムを消した際には1つ上のindexを選択
・リストを切り替えた際には対応したテキストデータをTextBoxに表示
 ・SelectedIndexChangedイベントで行っているが、リストの内容が変わっても
  反応するなど悪さをするので、リスト編集時にはイベントを一時的にOFFして対応

●TextBox周りの挙動
・リスト選択時にカーソルをテキストの先頭に配置
 起動直後にも行う
・見た目を損ねるのでスクロールバーを表示したくなかったが
 マウスホイールが効かなくなるためやむなく表示
・TextBox標準で履歴1つ分のトグルしかできないがUndoがあるのでボタン対応
 (ちなみにRichTextBoxは細やかなUndoとRedoが標準で付いている)
・Ctrl + Aで全選択

●保存
・全てのリスト名とテキスト内容をtxtファイルに出力
・ListBoxとTextBoxでのCtrl + Sで保存に対応
・保存時には「SAVED!」の文字を1秒間表示
 その際にメインスレッドを止めない

●全データの一括出力
・リストの全てのアイテム名をファイル名にして1つのテキストデータで出力
・ダイアログを作成、表示
・OKボタンとキャンセルボタン対応
・Escキーでのキャンセル対応
・フォルダ指定ボタン対応
 ・フォルダパスが有効かのチェックとメッセージ対応
・保存時にフォルダパスとファイルネームを結合
 ・フォルダパス末尾に¥がある・なしに対応
 ・ファイル名に無効な文字が含まれるかチェックとメッセージ対応

●最前面表示のON・OFF切り替え
・ボタンで対応、ここだけクリックする度にトグルさせている

●ボタン
・ボタン背景にアイコン画像を設定
 PNGで抜き付きの画像にし、ボタン自体の色はTranslucentにする
 最初はPictureBoxをボタン変わりにしていたが
 MouseClickイベントの挙動が遅くてストレスだったため後からボタンに変更
・マウスカーソル侵入で画像切り替え
 MouseHoverイベントは画像の切り替えが遅いので途中でMouseEnterに変更

●ツール外観
・付箋紙ツールのようにしたかったのでタイトルバーを非表示に
 しかしそうするとサイズ変更ができなくなるので止む無く枠だけ表示
 タイトルを付けると枠が広がるため空白に
 するとタスクバーで空白になって現在不格好な状態‥
・ツール上部をマウスドラッグすることによる移動に対応
・色のついたバーはPanelコントロールに背景色を設定
 レイアウトはPanelを使いつつAnchorとDockのプロパティを活用
 これで若干の見た目の特徴付けができる

●終了時
・ツール右上にLabelで「X」ボタンを用意、クリックで終了
・ウインドウサイズと位置を覚えておいて次回起動時に反映させる

などなど。
いやはやとても疲れましたが勉強になりました。。

実装できたら良いなあと思うもの


逆に実装・改善したいものは‥

●ListBox
・フォルダの実装(まだ全く手に負え無さそう‥)

●TextBox
・URLの部分をハイパーリンク表示にしてブラウザで表示させたい
 今のテキストボックスをリッチテキストボックスにすると解決する‥
 ※少し試しましたが思っていた以上に厄介そうで一旦中断
・太字・下線・文字色変更に対応したい
 リッチテキストボックスにすると解決する‥
 上記が可能になればCtrl + Bで選択中の文字列を太字にするなども対応
・検索と置換

●データ管理
・ツールの設定情報はXMLJSONファイルで記録させる
・リストの全アイテムでTextBoxのカーソル位置を記憶させておく
 ・終了時にも覚えておく
  テキストデータを管理しているクラスに変数を追加するだけでいけそうな‥
・保存状態から変更があったら終了時にダイアログボックスを表示する
 簡単なフラグ管理でいけそうな‥
・保存時にリストのアイテム名に重複があるか事前チェック

●ツール外観
・外枠を消したい
 ・マウスドラッグでサイズ変更を自前実装する必要がある
 ・タスクバーにツール名を出したい
・ListBoxとListBox選択時の背景色を水色ではなくデザインに合った色にする
・スクロールバーをデザインに合った色に変える
・文字サイズやカラーリングを変えるオプションを付ける

●その他
・KeyDownイベントでシステム音を鳴らさない

などなど。
こうしたい、ああしたいというものはまだまだあって終わりが無さそうです。。

おかしい部分を見つけられたらこちらまでお知らせ頂けると助かります!

助けて頂いた方


困ったときに相談に乗っていただいた com04 さん・Kさん・Mさん
ありがとうございましたー!

そして『ココナラ』の Kazuki Takayama さん、ありがとうございました!
Kazuki Takayamaさんのプロフィール | ココナラ