2011年2月18日金曜日

Cocoa ObjC MatrixなView

NSMatrixとは全然関係ありません。自分で作る、Matrixな表示のViewの話。

本日の成果はこんな感じ。


基本的なViewの上に、四角いViewを並べる、と。おそらく
1,MainController
2,MainView
3,SpacesView
4,RunAppView
というクラス構成と名前になると思われ、画像はそのうちMainViewとSpacesViewにあたる予定。
画像で16個ある四角がSpacesView、1つがSpacesのWorkspace1つを表している(予定)。
MainViewの大きさとWorkspaceの数に合わせてSpacesViewの大きさは自動で設定される。当然MainViewがリサイズされたらSpacesViewもリサイズ。MainViewの大きさが同じでWorkspaceが4つだとこうなる。


この感じだとこんなふうにリサイズするのが一般的だろう。


で、実際にはこの位置、このくらいのサイズで使うつもり。


スクリーンの右隅に置くのが自分としてはいいかなあ。
ウィンドウのどこでマウスホイールをころころしてもWorkspaceが切り替わり、SpacesViewのクリックで該当Workspaceへの切替、さらにSpacesViewに表示されているアプリのアイコンで、タスクスイッチ、という感じで機能をつけていく予定。
実際のSpacesViewのサイズ・表示位置決定部分のソースはたったこれだけ。

-(void)setSpaceFrameSize{
 NSRect rect;
 NSRect bound=[self bounds];
 rect.origin.x=VIEW_FRAME_SPACE;
 rect.origin.y=(bound.size.height / ROW)*(ROW-1)+VIEW_FRAME_SPACE;
 rect.size.width=(bound.size.width / COL)-(VIEW_FRAME_SPACE * 2);
 rect.size.height=(bound.size.height / ROW)-(VIEW_FRAME_SPACE * 2);
 NSArray *views=[self subviews];
 if([views count]>0){ 
  for(NSInteger j=0; j< ROW ;j++){
   for(NSInteger i =0;i<COL;i++){
    //NSLog(@"x:%f y:%f w:%f h:%f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
    FrameView *aFrame=[views objectAtIndex:i+(COL*j)];
    aFrame.frame=rect;
    rect.origin.x+=(VIEW_FRAME_SPACE *2)+rect.size.width;
    
   }
   rect.origin.y-=(rect.size.height+VIEW_FRAME_SPACE*2);
   rect.origin.x=VIEW_FRAME_SPACE;

  }
 }
}


(bloggerに文句を言われるのでひとつだけ全角の<を使っております)
ROW、COLは現在のところdefineした定数。本番ではちゃんとSpacesのRowとColになるでしょう。

*NIXのWindowManagerに付属する(というかワークスペース切替器はWindowManagerの基本的な機能の一部ですな)ワークスペース切替器だと、現在表示されているウィンドウをリアルタイムに表示できるものですが、そこまでやる気力は今のところ、ない。というか必要ないような気もするし。

全体的な設計を考えてつくり直していくので、まだまだ完成まで時間がかかりそう。

0 件のコメント:

コメントを投稿