Giraffe+ 0.5.26.415
前リリースからの変化
- アイコン指定に数値をハンドルとして使えるようにした
- SwitchWindowのアイコンをモジュール(.exe)のものではなくウインドウのものを表示するようにした
- SwitchWindowのウインドウ候補判断基準をAlt+Tabに近づけた
- ShowMenu2で表示されるメニューの選択の移動に問題があったのを修正
- Boost.Filesystemのクラスや関数を全部定義した
- イテレータにdistanceメソッドを持たせ、Range.sizeはself.begin.distance(self.end)とすることにした
- クラスのオーバーロードメソッドをor(new, old)からor(old, new)に変更した
- Range.deep_copyを、イテレートとコピーを同時にやるようにした
- Ostream_iteratorを、文字以外も受け付けるようにした
- Ostream.obeginをデリミタを受けられるようにした
アイコン指定に数値をハンドルとして使えるようにした
数値と見做せる文字列を、アイコンのパスが想定される場面で使うと、それをハンドルと見做します。
バグっぽい仕様
これにより、Giraffe+の入力窓に数字を打ち込むと、入力窓のアイコンがその数字のものになってしまうようになりましたが、あまり気にしていません。
SwitchWindowのアイコンをモジュール(.exe)のものではなくウインドウのものを表示するようにした
結構いい加減です。ファイルのプロパティのダイアログなんかでちゃんと動作しないようです。
SwitchWindowのウインドウ候補判断基準をAlt+Tabに近づけた
URLは忘れましたが、Googleのグループ検索で見つけたアルゴリズムを元に、自分の環境のWinampの複雑なウインドウ構成をちゃんと扱えるようにはしておきました。
ShowMenu2で表示されるメニューの選択の移動に問題があったのを修正
一番下のアイテムを選択してる状態でDownキーを押すと、一番上のアイテムが選択される仕様ですが、例えば一番下にセパレータがある場合にDownキーを押しても選択状態が変化しませんでした。上下端への移動時にセパレータの有無を考慮する仕様になりました。
Boost.Filesystemのクラスや関数を全部定義した
pathクラスというものがスクリプト言語には合わないように思えましたが、とりあえず定義しておいて使ってみて使い勝手を判断すればいいだろうと、取捨選択することもなく全部定義しておきました。
pathを引数に取る関数を、Pathオブジェクトのメソッドとしつつ、StringをPathの子とすることで、StringからPathのconstメソッドを呼べるようにしておきました。正直、綺麗とは言いがたい仕様ですが、まあ、問題があれば変えればいいかと、その程度の認識です。
使い方はfilesystem_test.cppとBoostのドキュメントを参照してください。Path.dirでdirectory_iteratorの、rdirでrecursive_directory_iteratorのレンジが作れる以外にBoostに無い関数等はありません。特に置き場の無かったcurrent/initial_pathもとりあえずPathのメソッドとしています。
イテレータにdistanceメソッドを持たせ、Range.sizeはself.begin.distance(self.end)とすることにした
今まで、Ragen.sizeはself.end.-(self.begin)でした。これではマイナスオペレータを持たないイテレータ、例えばdirectory_iteratorのようなSingle Pass Traversalなもの、を扱えませんでした。
カレントディレクトリのファイル数を得たい場合に、
'.'.dir.size
とできるようになりました。
クラスのオーバーロードメソッドをor(new, old)からor(old, new)に変更した
後から宣言したものが先に試されるようになりました。これにより、上位クラスほど抽象的なメソッドを持つ、という当たり前の実装が出来るようになりました。具体的に言うと、親クラスのメソッドが消費できる引数を取るメソッドを子クラスで宣言できるようになりました。
Range.deep_copyを、イテレートとコピーを同時にやるようにした
同時にやってませんでした。基本的に、Single Pass Traversal Iteratorのことを考えていなかったようです。
さて、カレントディレクトリのファイル名を配列に起きたい場合、
'.'.dir.to_Array
では求める結果は得られません。これは、to_Arrayがshallow_copyであるためです。内部のオブジェクトのコピーは実行されないということです。directory_iteratorのようなSingle Pass Traversal Iteratorでは、イテレータが動くと内部のデータも変化してしまいますので、コピーが必要になります。
'.'.dir.deep_copy
とすれば、dirが指し示すもの全てのcopy*1が実行され、その戻り値で構成されるArrayの子が得られます。
Ostream_iteratorを、文字以外も受け付けるようにした
Istream_iteratorがどうにも文字以外を扱えそうになかったので、そのカウンターパートであるOstream_iteratorもそうあるべきと思えたのですが、使ってみるとやはり不便極まりなく、小さな整合性より大きな実用性を取りました。
'.'.dir.copy_into(Dout.obegin("\n"))
Ostream.obeginをデリミタを受けられるようにした
忘れてました。
*1:deep_copyにすべきか