レイアウトについてよく考える。
30カテゴリぐらいあるようなので、6x5のグリッドで初期画面を作る。
columnは移動可能で並び順を変更できる。
今の所、このようになっている。
コンポーネントは使わないつもりだったが、とりあえずウィンドウは、わりとすぐに出てくるようだったので、使ってみた。
mx.containers.Windowなのだが、どうも、clickイベントしか拾えない。
ドラッグされているウィンドウの判定に一苦労と言った感じ。
クラスの構造は以下のようになっているので、とりあえず、後からウィンドウ部分を差し替えることも可能。
classes/column/Column
classes/column/WindowColumn
classes/layout/DataGridLayout
classes/layout/GridLayout
classes/layout/Layout
classes/layout/LayoutManager
classes/loadbar/LoadBar
classes/main/Main
classes/util/ColumnConstructor
classes/util/LayoutConstructor
classes/xml/LoadAmazonXML
classes/xml/ParseAmazonXML
今回主に手を入れたのは、GridLayoutクラス。
import classes.layout.*;
import classes.column.*;
import classes.util.*;
import mx.containers.*;
class GridLayout extends Layout{
private var mytimeline:MovieClip;//columnを貼り付ける場所
private var ctype:String="windowcolumn";//columnのタイプ
private var myclist:Array=new Array();//columnのリスト
private var pressx:Number;//columnをプレスし始めたときのx座標
private var pressy:Number;//columnをプレスし始めたときのy座標
private var xchklist:Array=new Array();//column入れ替えx座標チェック用リスト
private var ychklist:Array=new Array();//column入れ替えy座標チェック用リスト
private var xnum:Number;//1行に入れるcolumn数
private var ynum:Number;//何列表示させるか
private var centerx:Number;//columnの中央x;
private var centery:Number;//columnの中央y;
private var columnw:Number;//columnの幅
private var columnh:Number;//columnの高さ
public function GridLayout(tm:MovieClip,datanum:Number){
mytimeline=tm;
var margin:Number=5;//columnの外側の間隔
var stagewidth:Number=mytimeline._width-margin;
var stageheight:Number=mytimeline._height-margin;
xnum=6;
ynum=Math.ceil(datanum/xnum);
columnw=stagewidth/xnum-margin;
columnh=stageheight/ynum-margin;
centerx=columnw/2;
centery=columnh/2;
var columncons:ColumnConstructor=new ColumnConstructor();
for(var i:Number=0;i<datanum;i++){
var xid:Number=i%xnum;//横並びの順番
var yid:Number=Math.floor(i/(ynum+1));//縦並びの順番
var posx:Number=xid*columnw+margin*(xid+1);//X座標上のポジション
var posy:Number=yid*columnh+margin*(yid+1);//Y座標上のポジション
xchklist[i]=posx;
ychklist[i]=posy;
myclist[i]=columncons.makeClass(ctype,mytimeline,posx,posy,columnw,columnh);
}
mytimeline.grdlyt=this;
mytimeline.onMouseDown=function():Void{
pressx=this._xmouse;
pressy=this._ymouse;
}
mytimeline.onMouseUp=function():Void{
if(pressx!=this._xmouse||pressy!=this._ymouse){//columnが動いているとき、場所入れ替えの処理をする。
this.grdlyt.chkPos(this.grdlyt.chkTarget());
}
}
}
private function chkTarget():Number{
for(var i:Number=0;i<myclist.length;i++){
if(myclist[i].currentx!=myclist[i].startx||myclist[i].currenty!=myclist[i].starty){//どれが動いているかを突き止める
return i;
}
}
}
private function chkPos(idx:Number):Void{
//x座標の変更位置確認
var chkx:Number=myclist[idx].currentx+centerx;
for(var i:Number=0;i<xnum;i++){//列数分だけチェックする
if(xchklist[i]+columnw>chkx){
//var targetx:Number=xchklist[i];
var targetxidx:Number=i;
i=xnum;//loopを終了させる
}
}
//y座標の変更位置確認
var chky:Number=myclist[idx].currenty+centery;
for(var i:Number=0;i<ychklist.length;i+=xnum){
if(ychklist[i]+columnh>chky){//行数文だけチェックする
//var targety:Number=ychklist[i];
var targetyidx:Number=i/xnum;
i=ychklist.length;//loopを終了させる
}
}
var chgtgtidx:Number=targetyidx*xnum+targetxidx;//入れ替えターゲットのインデックス確定
if(chgtgtidx>=myclist.length){//末尾の余白部分にはドロップさせない
chgtgtidx=myclist.length-1;
}
var targetx:Number=xchklist[chgtgtidx];//移動位置確定
var targety:Number=ychklist[chgtgtidx];
//並び替え処理
var tgtc:Column=myclist[idx];//入れ替え用にキープ
if(chgtgtidx>idx){//前に詰める
for(var i:Number=idx+1;i<=chgtgtidx;i++){//実際に動かす
myclist[i].moveColumn(myclist[i-1].startx,myclist[i-1].starty);
}
for(var i:Number=idx+1;i<=chgtgtidx;i++){//リストの並び、start位置を変更する
myclist[i-1]=myclist[i];
myclist[i-1].startx=myclist[i-1].currentx;
myclist[i-1].starty=myclist[i-1].currenty;
}
}else if(chgtgtidx<idx){//後ろに詰める
for(var i:Number=idx-1;i>=chgtgtidx;i--){
myclist[i].moveColumn(myclist[i+1].startx,myclist[i+1].starty);
}
for(var i:Number=idx-1;i>=chgtgtidx;i--){//リストの並び、start位置を変更する
myclist[i+1]=myclist[i];
myclist[i+1].startx=myclist[i+1].currentx;
myclist[i+1].starty=myclist[i+1].currenty;
}
}
tgtc.moveColumn(targetx,targety);//実際の移動処理
myclist[chgtgtidx]=tgtc;//リストの並び、start位置を変更する
myclist[chgtgtidx].startx=tgtc.currentx;
myclist[chgtgtidx].starty=tgtc.currenty;
for(var i:Number=0;i<myclist.length;i++){
trace("y : "+myclist[i].starty+" , x : "+myclist[i].startx);
}
}
public function setName(nlist:Array):Void{
for(var i:Number=0;i<nlist.length;i++){
myclist[i].setName(nlist[i]);//カテゴリー名の設定
}
}
public function setID(idlist:Array):Void{
for(var i:Number=0;i<idlist.length;i++){
myclist[i].setID(idlist[i]);//ノードID設定
}
}
}
配列に入れているオブジェクトがオリジナルのクラスだとsortOnメソッドも使えないらしい。
単純に配列にウィンドウの参照を入れておいて、移動したら、配列のデータを参照しながら位置と情報をずらしていくだけ。
コンポーネントの表示待ちの時まで、ローディングバーを表示したままにできるようにしたい。
カテゴリーを色分けしたい。
ウィンドウサイズとステージサイズを可変にしたい。
サブカテゴリをウィンドウ内に表示させなければならない。