void CtrlTree::autoScroll() { // Find the current playing stream int playIndex = 0; VarTree::Iterator it; for( it = m_flat ? m_rTree.firstLeaf() : m_rTree.begin(); it != m_rTree.end(); it = m_flat ? m_rTree.getNextLeaf( it ) : m_rTree.getNextItem( it ) ) { if( it->isPlaying() ) { ensureVisible( it ); break; } } }
void CtrlTree::makeImage() { stats_TimerStart( getIntf(), "[Skins] Playlist image", STATS_TIMER_SKINS_PLAYTREE_IMAGE ); delete m_pImage; // Get the size of the control const Position *pPos = getPosition(); if( !pPos ) { stats_TimerStop( getIntf(), STATS_TIMER_SKINS_PLAYTREE_IMAGE ); return; } int width = pPos->getWidth(); int height = pPos->getHeight(); int i_itemHeight = itemHeight(); // Create an image OSFactory *pOsFactory = OSFactory::instance( getIntf() ); m_pImage = pOsFactory->createOSGraphics( width, height ); VarTree::Iterator it = m_firstPos; if( m_pBgBitmap ) { // Draw the background bitmap if( !m_pScaledBitmap || m_pScaledBitmap->getWidth() != width || m_pScaledBitmap->getHeight() != height ) { delete m_pScaledBitmap; m_pScaledBitmap = new ScaledBitmap( getIntf(), *m_pBgBitmap, width, height ); } m_pImage->drawBitmap( *m_pScaledBitmap, 0, 0 ); for( int yPos = 0; yPos < height; yPos += i_itemHeight ) { if( it != m_rTree.end() ) { if( it->isSelected() ) { int rectHeight = __MIN( i_itemHeight, height - yPos ); m_pImage->fillRect( 0, yPos, width, rectHeight, m_selColor ); } do { it = m_flat ? m_rTree.getNextLeaf( it ) : m_rTree.getNextVisibleItem( it ); } while( it != m_rTree.end() && it->isDeleted() ); } } } else { // FIXME (TRYME) // Fill background with background color uint32_t bgColor = m_bgColor1; m_pImage->fillRect( 0, 0, width, height, bgColor ); for( int yPos = 0; yPos < height; yPos += i_itemHeight ) { int rectHeight = __MIN( i_itemHeight, height - yPos ); if( it == m_rTree.end() ) m_pImage->fillRect( 0, yPos, width, rectHeight, bgColor ); else { uint32_t color = ( it->isSelected() ? m_selColor : bgColor ); m_pImage->fillRect( 0, yPos, width, rectHeight, color ); do { it = m_flat ? m_rTree.getNextLeaf( it ) : m_rTree.getNextVisibleItem( it ); } while( it != m_rTree.end() && it->isDeleted() ); } bgColor = ( bgColor == m_bgColor1 ? m_bgColor2 : m_bgColor1 ); } } int bitmapWidth = itemImageWidth(); int yPos = 0; it = m_firstPos; while( it != m_rTree.end() && yPos < height ) { const GenericBitmap *m_pCurBitmap; UString *pStr = it->getString(); uint32_t color = ( it->isPlaying() ? m_playColor : m_fgColor ); // Draw the text if( pStr != NULL ) { int depth = m_flat ? 1 : it->depth(); GenericBitmap *pText = m_rFont.drawString( *pStr, color, width - bitmapWidth * depth ); if( !pText ) { stats_TimerStop( getIntf(), STATS_TIMER_SKINS_PLAYTREE_IMAGE ); return; } if( it->size() ) m_pCurBitmap = it->isExpanded() ? m_pOpenBitmap : m_pClosedBitmap; else m_pCurBitmap = m_pItemBitmap; if( m_pCurBitmap ) { // Make sure we are centered on the line int yPos2 = yPos+(i_itemHeight-m_pCurBitmap->getHeight()+1)/2; if( yPos2 >= height ) { delete pText; break; } m_pImage->drawBitmap( *m_pCurBitmap, 0, 0, bitmapWidth * (depth - 1 ), yPos2, m_pCurBitmap->getWidth(), __MIN( m_pCurBitmap->getHeight(), height - yPos2), true ); } yPos += i_itemHeight - pText->getHeight(); int ySrc = 0; if( yPos < 0 ) { ySrc = - yPos; yPos = 0; } int lineHeight = __MIN( pText->getHeight() - ySrc, height - yPos ); m_pImage->drawBitmap( *pText, 0, ySrc, bitmapWidth * depth, yPos, pText->getWidth(), lineHeight, true ); yPos += (pText->getHeight() - ySrc ); delete pText; } do { it = m_flat ? m_rTree.getNextLeaf( it ) : m_rTree.getNextVisibleItem( it ); } while( it != m_rTree.end() && it->isDeleted() ); } stats_TimerStop( getIntf(), STATS_TIMER_SKINS_PLAYTREE_IMAGE ); }