人気ブログランキング | 話題のタグを見る

[CoveredCalc for BeOS] BColumnListView

カバーブラウザのリスト部分の色(BColumnListView のデフォルト設定色)が気に入らなかったので修正してやることにしました。
ところがやってみてわかったんですが、BColumnListView::SetColor() で色を設定しても全く反映されないものとかあるんですよね。選択テキストの色とかはソース上で全く使われていません。
まあ、作りかけの状態で終わってしまったんだと思うので仕方ないと言えば仕方ないのですが。

BColumnListView は Haiku OS の CVS レポジトリからとってきたものをそのまま手を加えずに使おうと考えていたんですが、やっぱり手を加えることにしました。
修正はしましたが、CoveredCalc の使い方で不都合があったところだけ。
それに修正方法も、周辺のコードを見て適当にやったので正しいのかどうか。(^^;

あと、まだ修正してないんですが、横方向にスクロールしたときに選択部分の描画が少し変です。
どうも、ビューの左端からビューの範囲(すなわちスクロールバーを左端に持って行ったときに表示される範囲)だけに何かやってる感じがします。

とりあえず、今回の修正点:
(CoveredCalc の Subversion リポジトリでとった差分。revision 201 が Haiku OS からとってきたオリジナルです。エディタか何かにコピペしないと意味不明かも…)
Index: ColumnListView.cpp
===================================================================
--- ColumnListView.cpp  (revision 201)
+++ ColumnListView.cpp  (revision 202)
@@ -2559,12 +2559,17 @@
   #if DOUBLE_BUFFERED_COLUMN_RESIZE
               fDrawBuffer->Lock();
               if (row->fNextSelected != 0) {
-                   if(fEditMode) {
-                       fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_EDIT_BACKGROUND));
-                       fDrawBufferView->SetLowColor(fMasterView->Color(B_COLOR_EDIT_BACKGROUND));
+                   if (Window()->IsActive()) {
+                       if(fEditMode) {
+                           fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_EDIT_BACKGROUND));
+                           fDrawBufferView->SetLowColor(fMasterView->Color(B_COLOR_EDIT_BACKGROUND));
+                       } else {
+                           fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_SELECTION));
+                           fDrawBufferView->SetLowColor(fMasterView->Color(B_COLOR_SELECTION));
+                       }
                   } else {
-                       fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_SELECTION));
-                       fDrawBufferView->SetLowColor(fMasterView->Color(B_COLOR_SELECTION));
+                       fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_NON_FOCUS_SELECTION));
+                       fDrawBufferView->SetLowColor(fMasterView->Color(B_COLOR_NON_FOCUS_SELECTION));
                   }
               } else {
                   fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_BACKGROUND));
@@ -2603,7 +2608,11 @@
                   fDrawBufferView->ConstrainClippingRegion(&clipRegion);
                   fDrawBufferView->PushState();
       #endif
-                   fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_TEXT));
+                   if (row->fNextSelected != 0) {
+                       fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_SELECTION_TEXT));
+                   } else {
+                       fDrawBufferView->SetHighColor(fMasterView->Color(B_COLOR_TEXT));
+                   }
                   float baseline = floor(fieldRect.top + fh.ascent
                                           + (fieldRect.Height()+1-(fh.ascent+fh.descent))/2);
                   fDrawBufferView->MovePenTo(fieldRect.left + 8, baseline);
@@ -2614,7 +2623,7 @@
       #endif
               }
   
-               if (fFocusRow == row) {
+               if (fFocusRow == row && fMasterView->IsFocus() && Window()->IsActive()) {
                   if(!fEditMode) {
                       fDrawBufferView->SetHighColor(0, 0, 0);
                       fDrawBufferView->StrokeRect(BRect(-1, sourceRect.top, 10000.0, sourceRect.bottom - 1));
@@ -2812,7 +2821,10 @@
                           ConstrainClippingRegion(&clipRegion);
                           PushState();
#endif
-                           SetHighColor(fMasterView->Color(B_COLOR_TEXT));
+                           if (row->fNextSelected != 0)
+                               SetHighColor(fMasterView->Color(B_COLOR_SELECTION_TEXT));
+                           else
+                               SetHighColor(fMasterView->Color(B_COLOR_TEXT));
                           float baseline = floor(destRect.top + fh.ascent
                                                   + (destRect.Height()+1-(fh.ascent+fh.descent))/2);
                           MovePenTo(destRect.left + 8, baseline);
# by hironytic | 2004-11-11 00:57 | 開発状況

[CoveredCalc for BeOS] カバーブラウザ

カバーブラウザでカバーが切り替えられるようになりました。
BeOS 独特のウィンドウごとにスレッドが別というところにちょっと悩まされました。
具体的には、カバーブラウザからの操作(つまり、カバーブラウザのスレッド)で、メインウィンドウの状態を切り替えるので、メインウィンドウのロックが必要なのです。
そのロックをどこで行うか悩んでしまいました。

そもそも、メインウィンドウの状態が切り替わるんだから、カバーブラウザはメインウィンドウにメッセージを送ったりしてメインウィンドウ自身に処理を行わせたらいいような気もしてきたんですが、Windows との設計の共有もあるのでそれは少し難しいのです。
このあたりの設計をしたのはずいぶん前なので、自分自身、どうなってるのかいまいち覚えてないのですが(^^; だいたい流れとしてはカバーブラウザ→(カバー変更依頼)→カバー管理クラス→(カバー変更イベント発生)→ UI 管理クラスときて、UI 管理クラスが自分に結び付いた UI 操作インタフェース経由で UI を操作するのです。BeOS版の場合、UI 操作インタフェースを実装しているのがメインウィンドウ内に1つだけ存在するビュー(BBiew継承クラス)です。
そういうわけで、カバーブラウザは最終的にメインウィンドウが影響を受けるなんてことは知らない(知るべきでない)のです。で、結局は、UI操作インタフェースが OS 間の相違を吸収してるわけで、そのインタフェースを実装しているビューのそのメソッドでロックをかけるようにしました。

まだカバーブラウザのウィンドウタブのボタンを押すとブラウザが消えてしまうのを防がなければいけませんが、とりあえず少し進んだかな、と思います。
# by hironytic | 2004-11-08 00:26 | 開発状況

[CoveredCalc] 小数点のバグ発見!

JPBE.net の Koki さんに CoveredCalc を発見していただきました。
まだ BeOS 版は開発中なのですが、JPBE.net で紹介していただけるということです。

(Zeta を持っていないので)Zeta での動作を確認してもらうために現状のものを Koki さんに送る際に、R5 で一応動くことを確認していたら小数点が入力できない(ことがある)バグを見つけてしまいました。
例えば、[1.2+3.4] と入力すると、後の小数点が入力されず、[1.2+34] になってしまいます。
電卓のエンジン部分は BeOS でも Windows でも共通のソースファイルのはずなので、もしやと思い、すでにリリース済みの Windows 版でも実行してみるとやっぱり発生!(泣)

ということで、今日はこれからデバッグです。
Windows 版はリリースしちゃってますからね。さすがに致命的なバグですし…。

(23:00; 追記)
修正しました。
いったん小数点を入力して小数部分を入力しているときに、再度小数点が入力できるとマズいので、小数部分を入力しているかどうかのフラグを持たせていたんですが、そのフラグをクリアするのを忘れていました。とほほ。
というわけで、Windows 版はバージョンアップしました
# by hironytic | 2004-11-03 21:19 | 開発状況

[CoveredCalc for BeOS] カバーブラウザ

カバーブラウザの実装(といっても、BeOS用の差分だけ)を行っていたはずなのですが、本業が忙しくなって手が付けられていませんでした。

今日、少し時間ができたので、さて、何をしてるところだったけ?と subversion リポジトリの最後の更新を見てみると‥ 9月20日!?
そういえば、インストールされているカバーをファイルシステムから列挙するところを作れば一覧に出てくるはず、っていうところまで作っていたのでした。

そこをちょこっと実装したところ、たしかに一覧に出てくるようになりました。
でも、一覧に出てくるだけでその一覧を元にする操作はなにもできません。
なんだかな~。
# by hironytic | 2004-10-22 00:15 | 開発状況

[CoveredCalc for BeOS] 表示しないウィンドウ

ここ数日(と言っても 1 日に数十分しかかけてないけど)初期状態では表示しないウィンドウをどうやって生成したらいいのか悩んでました。
BWindow はコンストラクタで生成した時点では、ウィンドウも非表示だし、そもそもスレッドが開始しておらずメッセージループも回っていません。また、コンストラクタを呼び出したスレッドによってロックされた状態になっています。
初回の Show() を呼び出すことで、スレッドが開始し、それによってメッセージループが回ります。また、ロックも解除されます。

しかし、カバーブラウザウィンドウは生成したあと、すぐには表示したくなかったのです。
(ユーザの操作によって表示状態の切り替えを行うので。デフォルトは非表示です。)

1) 生成時、Show() を呼ばずに放っておく。

→ ユーザの操作で Show() を呼び出すと、ウィンドウを生成したスレッド(今回の場合、BApplication のスレッド)とユーザの操作によるメッセージを受信したウィンドウのスレッドが違うので、初回の Show() で行われるロック解除に失敗しました。

2) 生成時、Show() を呼ばずに、Unlock() してみる。

→ ユーザの操作で Show() を呼び出すと、結局、ユーザの操作によるメッセージを受信したウィンドウのスレッドがロックしてないので、初回の Show() で行われるロック解除に失敗しました。

3) 生成時、Show() を呼ばずに、Unlock() して、Show() するときに初回であればロックする。

→ 初回の Show() かどうかを自分で判断しなければならないわけで、…それはイヤ。(試してません)

4) 生成時、Show() を呼ばずに、Run() を呼んでやる。(呼ぶなと Be Book に書いてあった気がするが)

→ ユーザの操作で Show() を呼び出してもうまくいった。…かのように見えたのですが、そのウィンドウのスレッド名に "w>" がついてません。通常は初回の Show() が何かやってるに違いありません。他の影響もまだ見えてないだけで、いずれ問題になりそうなので却下。

5) 【解決】生成時、一度 Hide() を呼んでから Show() を呼んでやる。

→ Hide() と Show() はカウンタを持っているので、Hide() → Show() だと、それをする前と同じ状態になります。つまり、非表示状態のままです。でも、その Show() は初回の Show() として認識されるようで、"w>" 付きのスレッドも生成されるし、ロックも解除されたようです。

とりあえず、これで解決できた、と思っています。
# by hironytic | 2004-09-16 13:06 | 開発状況