⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playlistselection.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include <qtopia/qpeapplication.h>#include <qtopia/applnk.h>#include <qtopia/resource.h>#include <qtopia/global.h>#include <qtopia/storage.h>#include <qtopia/categoryselect.h>#include <qpainter.h>#include <qimage.h>#include <qcopchannel_qws.h>#include <qfile.h>#include <qfileinfo.h>#include <qdir.h>#include <qlistview.h>#include <qlist.h>#include <qpixmap.h>#include "mediaplayerstate.h"#include "playlistselection.h"#include "fileinfo.h"#include <stdlib.h>class PlayListSelectionItem : public QListViewItem {public:    PlayListSelectionItem( QListView *parent, const DocLnk &f ) : QListViewItem( parent ) {	setFile( f );    }    const DocLnk &file() const { return fl; }    void setFile( const DocLnk& f ) {	fl = f;	QFile file( f.file() );	// First column	if ( file.exists() )	    setPixmap( 0, f.pixmap() );	else	    setPixmap( 0, Resource::loadPixmap("UnknownDocument") );	setText( 0, f.name().lower() );	// Second Column	StorageInfo storage;	const FileSystem *fileSystem = storage.fileSystemOf( f.file() );	if ( fileSystem )	    setText( 1, fileSystem->name() );	else	    setText( 1, "-" );	// Third Column	if ( file.exists() ) {	    uint fileSize = file.size();	    QString sizeText = "0B";	    if ( fileSize < 1000 )		sizeText = QString("%1B").arg( fileSize );	    else if ( fileSize < 1000000 )		sizeText = QString("%1KB").arg( fileSize / 1000 );	    else 		sizeText = QString("%1MB").arg( (double)fileSize / 1000000.0, 0, 'f', 1 );	    setText( 2, sizeText );	} else {	    setText( 2, "-" );	}/*	setText( 3, f.type() );	QDate date = QFileInfo( file ).lastModified().date();	setText( 4, QString("%1 %1 %1").arg( date.monthName( date.month() ) ).arg( date.day() ).arg( date.year() ) );*/    }    void paintCell( QPainter *p, const QColorGroup & cg, int column, int width, int alignment ) {	if ( column == 0 ) {	    bool updates = listView()->isUpdatesEnabled();	    listView()->setUpdatesEnabled( false );	    setText( 0, fl.name() );	    QListViewItem::paintCell( p, cg, column, width, alignment );	    setText( 0, fl.name().lower() );	    listView()->setUpdatesEnabled( updates );	} else {	    QListViewItem::paintCell( p, cg, column, width, alignment );	}	    }private:    DocLnk fl;};class PlayListSelectionData {    public:	CategorySelect		*catSel;	QComboBox		*locSel;	QList<QListViewItem>	shuffledList;};PlayListSelection::PlayListSelection( QWidget *parent, const char *name )    : QListView( parent, name ){    d = new PlayListSelectionData;    d->catSel = 0;    d->locSel = 0;    QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold );    setAllColumnsShowFocus( TRUE );    setFrameStyle( NoFrame );    addColumn( tr( "Title" ) );    addColumn( tr( "Media" ) );    addColumn( tr( "Size" ) );    setColumnAlignment( 0, Qt::AlignLeft );    setColumnAlignment( 1, Qt::AlignLeft );    setColumnAlignment( 2, Qt::AlignRight );    setColumnWidthMode( 0, QListView::Manual );    setColumnWidthMode( 1, QListView::Manual );    setColumnWidthMode( 2, QListView::Manual );    setColumnWidth( 0, 105 );    setColumnWidth( 1, 60 );    setColumnWidth( 2, 50 );    connect( this, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int ) ), this, SLOT( showItemProperties( QListViewItem * ) ) );    clear();    sbVis = FALSE;}PlayListSelection::~PlayListSelection(){    delete d;}PlayListSelectionItem *PlayListSelection::newItem( const DocLnk& lnk ){    PlayListSelectionItem *item = new PlayListSelectionItem( this, lnk );    unsigned int randomPos = (unsigned int)((double)rand() * d->shuffledList.count() / RAND_MAX);    randomPos = QMIN( randomPos, d->shuffledList.count() );    d->shuffledList.insert( randomPos, item );    if ( verticalScrollBar()->isVisible() != sbVis )	viewportResizeEvent( 0 );    return item;}void PlayListSelection::deleteItem( PlayListSelectionItem *item ){    d->shuffledList.remove( item );    delete item;}// Maximize the 1st column to fill the space left from the next two columns// Attempt to resize so no horizontal scroll bar is needed. Perhaps need to catch// other changes like font size changes or style changes to really do this properly,// but at the very least try to get the desired columns on the screen.void PlayListSelection::viewportResizeEvent( QResizeEvent * ){    QScrollBar *sb = verticalScrollBar();    sbVis = sb->isVisible();    int sbWidth = sbVis ? sb->width() + 1 : 0;    setColumnWidth( 0, width() - columnWidth( 1 ) - columnWidth( 2 ) - sbWidth - 2 * lineWidth() );}void PlayListSelection::showItemProperties( QListViewItem *i ){    PlayListSelectionItem *item = (PlayListSelectionItem *)i;    if ( item ) {	MediaFileInfoWidget *infoWidget = new MediaFileInfoWidget( item->file(), 0 );	QPEApplication::execDialog( infoWidget );    }}void PlayListSelection::setCategoryFilter( CategorySelect *c ){    d->catSel = c;}void PlayListSelection::setLocationFilter( QComboBox *l ){    d->locSel = l;}bool PlayListSelection::filtersMatch( const DocLnk& lnk ){    if ( d->catSel && !d->catSel->containsCategory( lnk.categories() ) )	return FALSE;    if ( d->locSel ) {	StorageInfo storage;	QString comboLoc = d->locSel->currentText();        if ( comboLoc == tr( "All Locations" ) )	    return TRUE;	const FileSystem *fileSystem = storage.fileSystemOf( lnk.file() );        if ( fileSystem && comboLoc == fileSystem->name() )	    return TRUE;	return FALSE;    }    return TRUE;}void PlayListSelection::removeLink( const DocLnk &lnk ){    QListViewItem *prevItem = 0;    QListViewItem *item = firstChild();    while ( item ) {	PlayListSelectionItem *i = (PlayListSelectionItem *)item;	DocLnk l = i->file();	if ( l.name() == lnk.name() && l.file() == lnk.file() ) {	    deleteItem( i );	    return;	}	prevItem = item;	item = item->nextSibling();    }}void PlayListSelection::changeLink( const DocLnk &oldDoc, const DocLnk &newDoc ){    QListViewItem *item = firstChild();    while ( item ) {	PlayListSelectionItem *i = (PlayListSelectionItem *)item;	DocLnk l = i->file();	if ( l.name() == oldDoc.name() && l.file() == oldDoc.file() ) {	    if ( !filtersMatch( newDoc ) ) 		// The category has been changed to no longer be in the selected category		deleteItem( i );	    else 		i->setFile( newDoc );	    return;	}	item = item->nextSibling();    }}void PlayListSelection::addLink( const DocLnk &lnk ){    // Ignore if it is not in the category    if ( !filtersMatch( lnk ) )	return;    newItem( lnk );    // Set selected and current to first in list while adding links    QListViewItem *first = firstChild();    if ( first ) {	setCurrentItem( first );	setSelected( first, TRUE );    }}void PlayListSelection::contentsMouseMoveEvent( QMouseEvent *event ){    if ( event->state() == QMouseEvent::LeftButton ) {	QListViewItem *currentItem = selectedItem();	QListViewItem *itemUnder = itemAt( QPoint( event->pos().x(), event->pos().y() - contentsY() ) );	if ( currentItem && currentItem->itemAbove() == itemUnder )	    moveSelectedUp();	else if ( currentItem && currentItem->itemBelow() == itemUnder )	    moveSelectedDown();    }}const DocLnk *PlayListSelection::current() {    PlayListSelectionItem *item = (PlayListSelectionItem *)selectedItem();    if ( item )	return &(item->file());    if ( firstChild() ) { // try harder	setSelected( firstChild(), TRUE );	item = (PlayListSelectionItem *)firstChild();	if ( item )	    return &(item->file());    }    return NULL;}void PlayListSelection::addToSelection( const DocLnk &lnk ){    PlayListSelectionItem *item = newItem( lnk );    QListViewItem *current = selectedItem();    if ( current )        item->moveItem( current );    setSelected( item, TRUE );    ensureItemVisible( selectedItem() );}void PlayListSelection::removeSelected(){    QListViewItem *item = selectedItem();    if ( item )	deleteItem( (PlayListSelectionItem *)item );    setSelected( currentItem(), TRUE );    ensureItemVisible( selectedItem() );}void PlayListSelection::moveSelectedUp(){    QListViewItem *item = selectedItem();    if ( item && item->itemAbove() )	item->itemAbove()->moveItem( item );    ensureItemVisible( selectedItem() );}void PlayListSelection::moveSelectedDown(){    QListViewItem *item = selectedItem();    if ( item && item->itemBelow() )        item->moveItem( item->itemBelow() );    ensureItemVisible( selectedItem() );}bool PlayListSelection::prev(){    QListViewItem *curItem = selectedItem();    QListViewItem *prevItem = 0;    if ( mediaPlayerState->shuffled() ) {	d->shuffledList.find( curItem );	prevItem = d->shuffledList.prev();    } else if ( curItem )	prevItem = curItem->itemAbove();    if ( !prevItem ) {	if ( mediaPlayerState->looping() ) {	    if ( mediaPlayerState->shuffled() ) {		prevItem = d->shuffledList.last();	    } else {		return last();	    }	} else	    return FALSE;    }    setSelected( prevItem, TRUE );    ensureItemVisible( prevItem );    return TRUE;}bool PlayListSelection::next(){    QListViewItem *curItem = selectedItem();    QListViewItem *nextItem = 0;    if ( mediaPlayerState->shuffled() ) {	d->shuffledList.find( curItem );	nextItem = d->shuffledList.next();    } else if ( curItem )	nextItem = curItem->itemBelow();    if ( !nextItem ) {	if ( mediaPlayerState->looping() ) {	    if ( mediaPlayerState->shuffled() ) {		nextItem = d->shuffledList.first();	    } else {		return first();	    }	} else	    return FALSE;    }    setSelected( nextItem, TRUE );    ensureItemVisible( nextItem );    return TRUE;}bool PlayListSelection::advanceSelection(){    QListViewItem *curItem = selectedItem();    if ( curItem ) {	QListViewItem *nextItem = curItem->itemBelow();	if ( nextItem ) {	    setSelected( nextItem, TRUE );	    ensureItemVisible( nextItem );	    return TRUE;	}    }    return FALSE;}bool PlayListSelection::first(){    QListViewItem *item = firstChild();    if ( item )        setSelected( item, TRUE );    else	return FALSE;    ensureItemVisible( selectedItem() );    return TRUE;}bool PlayListSelection::last(){    QListViewItem *prevItem = NULL;    QListViewItem *item = firstChild();    while ( ( item = item->nextSibling() ) )	prevItem = item;    if ( prevItem )        setSelected( prevItem, TRUE );    else	return FALSE;    ensureItemVisible( selectedItem() );    return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -