\r
itemRenderer : null,\r
\r
+ itemNodes : null,\r
\r
startIndex : 0,\r
startRenderIndex : 0,\r
numItemsParPage : 0,\r
+ numItemsPrev : 0,\r
numItems : 0,\r
+ itemHeightLast : 0,\r
+ itemHeightLastEM : 0,\r
\r
Constructor : function( user, dataSource, itemRenderer, attr ){\r
this.Super( user, null, [ attr ] );\r
this.dataSource = dataSource;\r
this.itemRenderer = itemRenderer;\r
+ this.itemNodes = [];\r
+ this.__item__ = X_Pair_get( itemRenderer );\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
},\r
\r
handleEvent : function( e ){\r
- var scrollBox, scrollY, dataSource, offsetY, startIndex, maxIndex, offset, uinodes;\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
+ scrollY = - scrollBox.scrollY;\r
dataSource = this[ 'dataSource' ];\r
- uinodes = this.uinodes;\r
+ itemNodes = this.itemNodes;\r
+ itemH = this.itemHeightLast;\r
+ \r
// transition Y を 0 付近に。\r
- offsetY = scrollY % this.itemHeightLast;\r
- scrollBox.scrollTo( 0, offsetY, 0, '', 0 ); // anime無し\r
+ \r
+ \r
// startIndex の計算\r
- startIndex = scrollY / this.itemHeightLast | 0;\r
- maxIndex = dataSource.length <= this.numItems ? 0 : dataSource.length - this.numItems;\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
+ 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
- this.addAt( last, uinodes.splice( 0, offset ) );\r
+ itemNodes.push.apply( itemNodes, itemNodes.splice( 0, offset ) );\r
} else\r
- if( offset < 0 ){\r
- this.addAt( 0, uinodes.splice( uinodes.length - offset ) );\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
updateItemRenderer : function( _w, _h ){\r
- var uinodes = this.uinodes || ( this.uinodes = [] ),\r
+ var itemNodes = this.itemNodes,\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
l = dataSource.length,\r
- start = this.startIndex - ( this.numItems - this.numItemsParPage ) / 2 | 0,\r
- itemH = this.itemHeightLast,\r
- i, node, data, _y = 0, last, n;\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
- i = start = start < 0 ? 0 : start;\r
+ _y = ( itemH + gapY ) * i;\r
\r
for( ; i < l; ++i ){\r
- if( !( node = uinodes[ i ] ) ){\r
+ if( !( data = itemNodes[ i ] ) ){\r
node = render.clone( true );\r
this.addAt( i, [ node ] );\r
- data = X_Pair_get( node );\r
+ data = itemNodes[ i ] = X_Pair_get( node );\r
// init -> addToParent -> creationComplete\r
};\r
data.setItemData( dataSource[ i ] );\r
// 一番最初のループ。ここでページあたりのアイテム数を計算\r
if( !itemH && i === start ){\r
itemH = _y - gapY;\r
- this.itemHeightLast = itemH * X_ViewPort_baseFontSize,\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
};\r
};\r
\r
- for( l = uinodes.length; i < l; ++i ){\r
- // uinodes[ i ] hide\r
+ for( l = itemNodes.length; i < l; ++i ){\r
+ // itemNodes[ i ] hide\r
};\r
\r
// TODO contentHeight は attr を無視する -> 未表示領域につくるアイテム数 GPU の有無で変わる\r
- this.contentHeight = _y - gapY;\r
+ this.contentHeight = dataSource.length * ( itemH + gapY ) - gapY;\r
},\r
\r
onPropertyChange : function( name, newValue ){\r
- var uinodes, i, l, uinode, dataList, from;\r
+ var itemNodes, i, l, uinode, dataList, from;\r
\r
switch( name ){\r
case 'itemRenderer' :\r
- for( uinodes = this.uinodes, i = uinodes && uinodes.length; i; ){\r
- uinodes[ --i ][ 'kill' ]();\r
+ for( itemNodes = this.itemNodes, i = itemNodes && itemNodes.length; i; ){\r
+ itemNodes[ --i ][ 'kill' ]();\r
};\r
\r
case 'dataSource' :\r
- if( uinodes = this.uinodes ){\r
- i = uinodes.length;\r
+ if( itemNodes = this.itemNodes ){\r
+ i = itemNodes.length;\r
l = this[ 'dataSource' ].length;\r
while( l < i ){\r
- uinodes[ --i ][ 'kill' ]();\r
- uinodes.length = i;\r
+ itemNodes[ --i ][ 'kill' ]();\r
+ itemNodes.length = i;\r
}; \r
};\r
\r
var supports;\r
\r
if( XUI_Repeater.prototype.usableAttrs === XUI_Box.prototype.usableAttrs ){\r
- XUI_Repeater.prototype.usableAttrs = supports = XUI_Attr_createAttrDef( XUI_Attr_Support, XUI_Layout_Vertical.overrideAttrsForSelf );\r
+ supports = XUI_Attr_createAttrDef( XUI_Attr_Support, X_UI_Repeater_SUPPORT_ATTRS );\r
+ XUI_Repeater.prototype.usableAttrs = supports = XUI_Attr_createAttrDef( supports, XUI_Layout_Vertical.overrideAttrsForSelf );\r
\r
XUI_Repeater.prototype.attrClass = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports );\r
};\r
width : 'auto',\r
minWidth : '100%',\r
height : 'auto',\r
- minHeight : '100%'\r
+ minHeight : '100%',\r
+ borderColor : 0x252527,\r
+ borderWidth : [ 0.15, 0, 0 ],\r
+ borderStyle : 'solid',\r
+ height : 'auto',\r
+ bgColor : 0x444643,\r
+ gapY : 0.15\r
}));\r
},\r
\r