第23回 細かい機能の追加と変更

公開日:2019-01-10 更新日:2019-07-02

1. 注意事項

ソースをダウンロードしてプロジェクトを開き、
「・・・を処理できませんでした。インターネットまたは制限付きゾーン内にあるか、ファイルに Web のマークがあるためです。これらのファイルを処理するには、Web のマークを削除してください。」
と言うエラーが出た場合は、一度プロジェクトを閉じて、「WindowsによってPCが保護されました」の時と同様に、該当ファイルを右クリックして、セキュリティーの「許可する」にチェックを入れてください。

また、他のエラーの場合には、何度かリビルドすると、直る場合があります。

2. 動画



3. 内容

1. プラグインの I/F に ParentPlugin (親プラグイン)の追加

プラグインの I/F の IPlugin に ParentPlugin (親プラグイン) を持たせて、親のプラグインを参照できるようにしました。ParentPlugin の設定は、PluginManager で自動的に行うようにしてあります。
また、全プラグインの ParentPlugin をチェックにすることにより、子プラグインリストを取得するメソッドを PluginManager に追加しました。「タブを全て閉じる」メニューにより、タブに割り当てられている子プラグインを全て閉じる際に使用しています。

2. プラグインの定義ファイル名を plugin.ini に統一

以前は「plugins/define/フルクラス名/フルクラス名.ini」と言うパスにしていましたが、パスの文字列長の制限に引っかかり、ソースの zip ファイル解凍時や、プラグインの定義ファイルコピー時にエラーが発生する可能性があったため、全て「plugin.ini」と言うファイル名に統一しました。
ちなみに、以前ファイル名をフルクラス名にしていた理由は、grep やファイル検索でファイルを区別するためと、ファイルコピーで誤って上書きしないようにするためです。今回は、そのリスクよりも、パスの文字列長の制限の回避を優先しました。

3. plugin_list.ini のセクション名の連番を廃止

plugins/define/NineCubed.Memo.Plugins.PluginLoader.PluginLoaderPlugin/plugin_list.ini
に、プラグインローダーがアプリ起動時に生成するプラグインを定義しており、以前は [plugin_1]、[plugin_2]、[plugin_3] のように連番をつけていましたが、今回は連番を付けずに全て [plugin] で指定できるようにしました。これにより、プラグインの追加や入れ替え時に、連番を付け替える必要がなくなります。
また、ファイル読み込み時に、内部ではセクション名に自動的に連番を付けて保持しているため、取得する際には連番を付けてセクション名を指定する必要があります。

拡張子はファイルの形式を表すもので、今回の ini ファイルは厳密な ini ファイルではなくなり、本来は「.iniex」など、拡張子を変更した方が望ましいと思いますが、今回は妥協してそのままにしてあります。

4. プラグインローダーによる全プラグインの生成完了イベントの追加

アプリ起動時に、plugin_list.ini に定義されたプラグインを生成しますが、全てのプラグインが生成されたら、AllPluginCreated イベントを飛ばすようにしました。
タブプラグインに他のプラグインを割り当てるとタブが追加されますが、毎回起動時に右端にあるタブが選択されて表示されるため、AllPluginCreated イベントを使って、左端のタブを選択して表示するようにしました。

5. タブのメニューに「全て閉じる」メニューの追加

タブのメニューにタブを全て閉じるメニューを追加しました。
「1.」で追加した ParentPlugin を使って、タブに割り当てられている子プラグインの一覧を取得して、全ての子プラグインを終了しています。

6. 画像ビューアーの画像縮小時の画質の選択

画像縮小時の画質(縮小アルゴリズム)を、リストから選択できるようにしました。

ちなみに、今回のアプリに限らず、画像を縮小する際の画質は、アルゴリズムに依存するため、アプリを変えると画質が変わる可能性があります。直線がギザギザになったり、ぼやけて見える場合には、他のアプリで試してみるのも良いかもしれません。

7. 画像ビューアーの画像ファイルの読み方の変更

Image.FromFile(path) を使って画像ファイルを読み込むと、ファイルにロックがかかり、ファイル名の変更ができなくなるため、Image.FromStream(stream) を使うようにしました。

8. ファイルツリーで「フォルダを開く」メニューの追加

ファイルツリーから、選択したフォルダをエクスプローラーで開けるようにしました。

9. ファイルツリーで「フォルダを開く」メニューの追加

ファイルツリーから、選択したフォルダをエクスプローラーで開けるようにしました。

10. ファイルリストの変更

1. Ctrl + Enter で、ネイティブな方法でファイルを開くようにしました。
2. 「現在のフォルダを開く」「ネイティブな方法で開く」メニューを追加しました。
3. ファイルリストの各列をプラグイン化しました。
 プラグインローダーの plugin_list.ini を変更することにより、表示する列や、表示順を指定できます。
4. 作成日時、アクセス日時、画像サイズの列を追加しました。
 画像サイズは、取得する処理が重いため、別スレッドで値を取得して表示するようにしています。
5. クリックで編集不可にしました。編集はF2キーで行えます。
 ダブルクリックがシングルクリックとして判定され、入力モードになってしまうことがあったため、
 シングルクリックでの編集は不可にしました。
6. ワイルドカード(*)を使用して、ファイルの絞り込みが行えるようにしました。
7. フォルダ数、ファイル数を表示するようにしました。
8. ファイルツリー、ファイルリストなどの画像を変更しました。

10. ファイル情報管理プラグインの追加

フォルダとファイルに、評価、メモ、タグを付けられるプラグインです。別プロジェクト(FileInfoManager)で作成しています。
ファイルリストで「評価」を表示するための評価カラムプラグイン、データの検索などを行う管理プラグイン、データの編集を行う編集プラグインで構成しています。
データは SQLite の DB で保持しているため、実ファイルへの影響はありません。

写真・動画・音楽ファイルなどに評価やタグをつけて、お気に入りのファイルを検索したり、手ブレした写真や不要なファイルにマーキングをして一括削除するなどを、用途として考えています。
また、ファイルにメモやタイトルをつけることができます。音楽ファイルに歌詞を付けたり、Excel や PDF などの概要をメモに登録して、キーワード検索することもできます。

使い方の注意点として、データは実ファイルには埋め込まれずにフルパスをキーにして別の場所に保存されているため、パスが変わるとデータが参照できなくなる点があります。その場合、新しいパスを再設定すると、再度参照できるようになります。
パスやファイル名を変更しなくても済むように、フォルダやファイルを日付や連番などにしても良いかもしれません。ファイルを特定するキーとして、パス以外のユニークなIDが、WindowsのOS側で自動的に付与されると良いのですが。

4. 画面

画像1

画像2

画像3

5. 今後の課題

grep機能の追加
テキストビューアーの追加
プラグインのプロパティ変更画面の追加
現在のEXEからプラグインやUtilsなどをDLLへ移す
お気に入りファイルツリープラグインの追加
左側の余白の不具合対応、
プラグインでテキストの加工を行えるようにする、
プラグインでカレンダーをつけて日記をつけられるようにする、などなど。

ダウンロード

ver実行ファイルソース
1.1.9
2019/01/10
ncm_1_1_9.zipncm_1_1_9_src.zip