'_Repeater',\r
X_Class.NONE,\r
{\r
- layout : XUI_Layout_Vertical,\r
+ layout : XUI_Layout_Vertical,\r
\r
- dataSource : null, // Array.<object>, Array.<ItemData>\r
+ dataSource : null, // Array.<object>, Array.<ItemData>\r
\r
itemRenderer : null,\r
\r
itemNodes : null,\r
- \r
- startIndex : 0,\r
- startRenderIndex : 0,\r
- numItemsParPage : 0,\r
- numItemsPrev : 0,\r
- numItems : 0,\r
+\r
itemHeightLast : 0,\r
itemHeightLastEM : 0,\r
\r
\r
initialize : function(){\r
XUI_AbstractUINode.prototype.initialize.apply( this, arguments );\r
- \r
- this.parent[ 'listen' ]( XUI_Event.SCROLL_END, this );\r
},\r
\r
/*\r
var dataSource = this[ 'dataSource' ];\r
\r
if( allowedW + allowedH === XUI_Attr_AUTO ) return false;\r
- \r
- this.scrollPortWidth = allowedW;\r
- this.scrollPortHeight = allowedH; \r
\r
this.preMesure( allowedW, allowedH );\r
\r
},\r
\r
handleEvent : function( e ){\r
- var scrollBox, scrollY, dataSource, offsetY, startIndex, maxIndex, offset, itemNodes, ary, i, l;\r
- \r
switch( e.type ){\r
- case XUI_Event.SCROLL_END :\r
- scrollBox = this.parentData;\r
- scrollY = - scrollBox.scrollY;\r
- dataSource = this[ 'dataSource' ];\r
- itemNodes = this.itemNodes;\r
- itemH = this.itemHeightLast;\r
- \r
- // transition Y を 0 付近に。\r
- \r
- \r
- // startIndex の計算\r
- startIndex = scrollY / itemH | 0;\r
- \r
- /*maxIndex = dataSource.length <= this.numItems ? 0 : dataSource.length - this.numItems;\r
- console.log( ' >>> ' + startIndex + ' ' + maxIndex );\r
- \r
- startIndex =\r
- startIndex < 0 ? 0 :\r
- maxIndex < startIndex ? maxIndex : startIndex; */\r
- // アイテムの座標の修正とレンジ外のアイテムを配列内で再配置\r
- offset = startIndex - this.startIndex; // visible な stratIndex renderStartIndex\r
- this.startIndex = startIndex;\r
- \r
- console.log( this.numItemsPrev + ' oo ' + offset )\r
- \r
- if( 0 < offset ){\r
- itemNodes.push.apply( itemNodes, itemNodes.splice( 0, offset ) );\r
- } else\r
- if( offset < - 0 ){\r
- itemNodes.unshift.apply( itemNodes, itemNodes.splice( itemNodes.length + offset ) );\r
- };\r
-\r
- // 再配置されたアイテムにitemData のセット\r
- this.updateItemRenderer( this.contentWidth, this.scrollPortHeight );\r
- \r
- \r
- \r
- offsetY = scrollY % itemH;\r
- offsetY = offsetY === 0 ? 0 : ( offsetY - itemH );\r
- offsetY += ( this.startRenderIndex - this.startIndex ) * itemH;\r
- //console.log( ' ====> ' + this.startRenderIndex + ' -> ' + this.startIndex + ' scrollY:' + offsetY );\r
\r
- //scrollBox.scrollTo( 0, - scrollY, 0, '', 0 ); // anime無し \r
- //console.log( ' <==== ' );\r
- break;\r
};\r
},\r
\r
attrs = this.attrObject || this.attrClass.prototype,\r
gapY = XUI_AbstractUINode_calcValue( attrs[ this.usableAttrs.gapY.No ], _w ),\r
dataSource = this[ 'dataSource' ],\r
- render = this[ 'itemRenderer' ],\r
+ renderer = this[ 'itemRenderer' ],\r
l = dataSource.length,\r
- start = this.startIndex - this.numItemsPrev,\r
itemH = this.itemHeightLastEM,\r
- i, data, node, _y = 0, last, n;\r
- \r
- i = this.startRenderIndex = start = start < 0 ? 0 : start;\r
- \r
- _y = ( itemH + gapY ) * i;\r
+ i = 0, data, node, _y = 0, last, n;\r
\r
for( ; i < l; ++i ){\r
if( !( data = itemNodes[ i ] ) ){\r
- node = render.clone( true );\r
+ node = renderer.clone( true );\r
this.addAt( i, [ node ] );\r
data = itemNodes[ i ] = X_Pair_get( node );\r
// init -> addToParent -> creationComplete\r
_y += ( itemH || data.boxHeight ) + gapY;\r
\r
// 一番最初のループ。ここでページあたりのアイテム数を計算\r
- if( !itemH && i === start ){\r
+ if( !itemH && i === 0 ){\r
itemH = _y - gapY;\r
this.itemHeightLastEM = itemH;\r
- this.itemHeightLast = itemH * X_ViewPort_baseFontSize,\r
- // scroller の miniHeight は(例えば)親の高さの300% そこにいくつのアイテムを並べることが出来るか?端数切り上げ\r
- this.numItemsParPage = _h / itemH + 0.999 | 0;\r
- n = this.numItems = ( _h * 3 ) / itemH + 0.999 | 0; // TODO boxHeight\r
- this.numItemsPrev = ( this.numItems - this.numItemsParPage ) / 2 | 0;\r
- last = i + n;\r
- // データの最後まで、または、開始位置から 3ページ分を生成する\r
- l = last < l ? last : l;\r
+ this.itemHeightLast = itemH * X_ViewPort_baseFontSize;\r
};\r
};\r
\r
};\r
\r
// TODO contentHeight は attr を無視する -> 未表示領域につくるアイテム数 GPU の有無で変わる\r
- this.contentHeight = dataSource.length * ( itemH + gapY ) - gapY;\r
+ this.contentHeight = l * ( itemH + gapY ) - gapY;\r
},\r
\r
onPropertyChange : function( name, newValue ){\r