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

📄 folderlistview.cpp

📁 Qtopia下的邮件处理程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    if ( folder == NULL ) {	showFolderChoice( NULL );	emit folderSelected( (Folder *) NULL );	return;    }    showFolderChoice( (FolderListItem *) folder);    emit folderSelected( ((FolderListItem *) folder)->folder() );}void FolderListView::buildImapFolder(FolderListItem *item, MailAccount* account){    Q_ASSERT(item);    Q_ASSERT(account);    Mailbox *box = 0;    FolderListItem* subfolder = 0;        //delete current subtree    blockSignals(true);    QList<QTreeWidgetItem*> children = item->takeChildren();    while (!children.isEmpty())        delete children.takeFirst();    blockSignals(false);                //build new subtree    QListIterator<Mailbox*> it(account->mailboxes);    while ( it.hasNext()) {    box = it.next();	if ( !box->isDeleted() && box->localCopy())	    subfolder = new FolderListItem(getParent(item, box->pathName(), box->getDelimiter() ), (Folder *) box);    }}/*  Returns the parent mailbox/account in the treewidget of the given account.	All mailboxes are sorted by name before added, so the conversion from	flat to tree should not produce inccorect results.*/FolderListItem* FolderListView::getParent(FolderListItem *parent, QString name, QString delimiter){    QStringList list = name.split(delimiter);    list.removeAll( list.last() );    if (list.count() == 0)	return parent;    QString target = list.join(delimiter);        int level = parent->depth();    Folder *folder;    QModelIndex index = indexFromItem(parent); //parent index    index = next(index); //get first child                for ( ; index.isValid(); index = next( index ) ) {	FolderListItem *item = (FolderListItem *) itemFromIndex( index );	if ( item->depth() <= level )	    return parent;		//failed	folder = item->folder();	if ( folder->folderType() != FolderTypeMailbox )	    return parent;		//failed	if ( ((Mailbox *) folder)->pathName() == target )	    return item;    }        return parent;}void FolderListView::cancelMenuTimer(){    if( menuTimer.isActive() )	menuTimer.stop();}void FolderListView::itemClicked(QTreeWidgetItem *i){    if (i)	emit viewMessageList();}void FolderListView::popFolderSelected(int value){    QModelIndex index = model()->index( 0, 0 );    while (value) {	index = next( index );	--value;    }    setCurrentItem( itemFromIndex( index ) );    scrollToItem( itemFromIndex( index ) );}QMenu* FolderListView::folderParentMenu(QMenuBar *host){    folderBar = new QMenu(host);    newQueryAction = folderBar->addAction( QIcon(":icon/find"), tr("New query"),					   this, SLOT( newQuery() ) );    modifyQueryAction = folderBar->addAction( QIcon(":icon/edit"), tr("Modify query"),					      this, SLOT( modifyQuery() ) );    deleteFolderAction = folderBar->addAction( QIcon(":icon/trash"), tr("Delete query"),					       this, SLOT( deleteFolder() ) );    showFolderChoice( NULL );    return folderBar;}/* sets the valid choices for the parent folder menu.  Basically   the same as showfoldermenu()  (might join)  */void FolderListView::showFolderChoice(FolderListItem *item){    // mark all as not active    newQueryAction->setVisible( false );    modifyQueryAction->setVisible( false );    deleteFolderAction->setVisible( false );    if ( item == NULL )	return;    Folder *folder = item->folder();    if ( folder->folderType() == FolderTypeSystem ) {	if ( ((SystemFolder *) folder)->systemType() != SystemTypeSearch )	    newQueryAction->setVisible( true );    } else if ( folder->folderType() == FolderTypeSearch ) {	modifyQueryAction->setVisible( true );	deleteFolderAction->setVisible( true );    }}void FolderListView::showFolderMenu(){    FolderListItem *item = (FolderListItem *) currentItem();    if ( item == NULL )	return;    Folder *folder = item->folder();    QMenu *popFolder = new QMenu(this);    bool empty = false;    if ( folder->folderType() == FolderTypeSystem ) {	if ( !(folder->mailbox() == TrashString )  && !((SystemFolder *) folder)->isSearch() ) {	    popFolder->addAction( QIcon(":icon/find"), tr( "New query" ), this, SLOT( newQuery() ) );	} else if ( folder->mailbox() == TrashString && ! ((SystemFolder *) folder)->isSearch() ) {	    popFolder->addAction( QIcon(":icon/trash"), tr( "Empty trash" ), this, SIGNAL( emptyFolder() ) );	} else {	    empty = true;	}    } else if ( folder->folderType() == FolderTypeSearch ) {	popFolder->addAction( QIcon(":icon/edit"), tr("Modify query"), this, SLOT( modifyQuery() ) );	popFolder->addSeparator();	popFolder->addAction( QIcon(":icon/trash"), tr("Delete query"), this, SLOT( deleteFolder() ) );    } else {	empty = true;    }    if ( !empty )	popFolder->popup( QCursor::pos() );}void FolderListView::mousePressEvent( QMouseEvent * e ){    QTreeWidget::mousePressEvent( e );    menuTimer.setSingleShot( true );    menuTimer.start( 500 );}void FolderListView::mouseReleaseEvent( QMouseEvent * e ){    QTreeWidget::mouseReleaseEvent( e );    menuTimer.stop();}void FolderListView::newQuery(){    SearchView searchView(true, this,Qt::Dialog); // No tr    searchView.setWindowTitle( tr("New query") );    searchView.setModal(true);    FolderListItem *item = (FolderListItem *) currentItem();    Folder *folder = item->folder();    searchView.setQueryBox( folder->mailbox() );    QtopiaApplication::execDialog(&searchView);    if (searchView.result() == QDialog::Accepted) {	Search *newSearch = searchView.getSearch();	Folder *newFolder = new SearchFolder(newSearch);	new FolderListItem(item, newFolder);    }}void FolderListView::modifyQuery(){    FolderListItem *item = (FolderListItem *) currentItem();    SearchView searchView(true, this,Qt::Dialog); // No tr    searchView.setWindowTitle( tr("Modify query") );    Folder *folder = item->folder();    if (folder->folderType() != FolderTypeSearch) {	qWarning("not a virtual folder");	return;    }    searchView.setQueryBox( folder->mailbox() );    searchView.setSearch( ( (SearchFolder *) folder )->search() );    QtopiaApplication::execDialog(&searchView);    if (searchView.result() == QDialog::Accepted) {	Search *newSearch = searchView.getSearch();	delete ( ( (SearchFolder *) folder )->search() );	( (SearchFolder *) folder )->setSearch(newSearch);	item->setText(0, newSearch->name() );	searchView.hide();	// in case it's a slow search	emit folderSelected( folder );    }}void FolderListView::deleteFolder(){    FolderListItem *item = (FolderListItem *) currentItem();    if ( item == NULL )        return;    Folder *folder = item->folder();    if ( folder->folderType() == FolderTypeSearch ) {        delete folder;        delete item;	folderChanged( currentItem() );    }}void FolderListView::saveQueries(QString mainGroup, QSettings *config){    FolderListItem *item;    int count = 0, posCount = 0;    QModelIndex index = model()->index( 0, 0);    for ( ; index.isValid(); index = next( index ) ) {	item = (FolderListItem *) itemFromIndex( index );	if ( item == (FolderListItem *) currentItem() ) {	    config->beginGroup( mainGroup );	    config->setValue("folderselected", posCount);	    config->endGroup();	}	Folder *folder = item->folder();	if ( folder->folderType() == FolderTypeSearch ) {	    config->beginGroup( "query_" + QString::number(count) );	    saveSingleQuery(config, folder);	    count++;	    config->endGroup();	}	posCount++; //current position in QTreeWidget    }    config->beginGroup("lastsearch");    saveSingleQuery(config, searchFolder);    config->endGroup();    // save count    config->beginGroup(mainGroup);    config->setValue("querycount", count );    config->endGroup();}void FolderListView::saveSingleQuery(QSettings *config, Folder *folder){    Search *search = NULL;    if ( folder->folderType() == FolderTypeSearch ) {	search = ( (SearchFolder * ) folder )->search();    } else if ( folder->folderType() == FolderTypeSystem ) {	if ( ((SystemFolder *) folder)->systemType() == SystemTypeSearch ) {	    search = ((SystemFolder *) folder)->search();	}    }    if (search == NULL) {        qWarning("trying to save invalid folder");        return;    }    config->setValue("mailbox", search->mailbox() );    config->setValue("name", search->name() );    config->setValue("from", search->getFrom() );    config->setValue("to", search->getTo() );    config->setValue("subject", search->getSubject() );    config->setValue("body", search->getBody() );    config->setValue("status", (int) search->status() );    if ( !search->getBeforeDate().isNull() ) {        config->setValue("datebefore", search->getBeforeDate().toString() );    } else {        config->setValue("datebefore", "" );    }    if ( !search->getAfterDate().isNull() ) {        config->setValue("dateafter", search->getAfterDate().toString() );    } else {        config->setValue("dateafter", "" );    }}void FolderListView::readQueries(QString mainGroup, QSettings *config){    SearchFolder  *sFolder;    Search *search;    config->beginGroup(mainGroup);    int count = config->value("querycount", 0).toInt();    for (int x = 0; x < count; x++) {        config->beginGroup( "query_" + QString::number(x) );        search = readSingleQuery(config);        sFolder = new SearchFolder(search);		Folder *folder;	FolderListItem *item;	QModelIndex index = model()->index( 0, 0 );	for ( ; index.isValid(); index = next( index ) ) {	    item = (FolderListItem *) itemFromIndex( index );	    folder = item->folder();	    if ( folder->folderType() == FolderTypeSystem ) {		if ( ( (SystemFolder *) folder )->mailbox() == search->mailbox() ) {		    new FolderListItem( item, sFolder);		    break;		}	    }	}	config->endGroup();    }    config->endGroup();    config->beginGroup("lastsearch");    search = readSingleQuery(config);    searchFolder->setSearch( search );    config->endGroup();    config->beginGroup(mainGroup);    count = config->value("folderselected", -1).toInt();    if ( count != -1 ) {	QModelIndex index = model()->index( 0, 0 );	while (count) {	    index = next( index );	    --count;	}	scrollToItem( itemFromIndex( index ) );	setCurrentIndex( index );    }    config->endGroup();        }Search* FolderListView::readSingleQuery(QSettings *config){    Search *search = new Search();    search->setMailbox( config->value("mailbox", "inbox").toString() );    search->setMailFrom( config->value("from").toString().trimmed() );    search->setMailTo( config->value("to").toString().trimmed() );    search->setMailSubject( config->value("subject").toString().trimmed() );    search->setMailBody( config->value("body").toString().trimmed() );    search->setStatus( config->value("status", (int) Search::Any).toInt() );    search->setName( config->value("name").toString().trimmed() );    QString strDate = config->value("dateafter").toString();    if (!strDate.isEmpty())        search->setAfterDate( Email::parseDate(strDate).date() );    strDate = config->value("datebefore").toString();    if (!strDate.isEmpty())        search->setBeforeDate( Email::parseDate(strDate).date() );    return search;}FolderListItem *FolderListView::folderItemFromIndex( QModelIndex index ){    return (FolderListItem *)itemFromIndex( index );}/* Folder List Item Delegate */FolderListItemDelegate::FolderListItemDelegate(FolderListView *parent)    : QItemDelegate(parent),      mParent(parent){}void FolderListItemDelegate::paint(QPainter *painter, 				   const QStyleOptionViewItem &option,				   const QModelIndex &index) const{    Q_ASSERT(index.isValid());    const QAbstractItemModel *model = index.model();    Q_ASSERT(model);    FolderListItem *item = mParent->folderItemFromIndex( index );    QString statusText;    bool statusHighlight;    QColor statusCol;    if ( item )	item->statusText( &statusText, &statusHighlight, &statusCol );    QStyleOptionViewItem opt = option;    // Set color group    opt.palette.setCurrentColorGroup(option.state & QStyle::State_Enabled                                     ? QPalette::Active : QPalette::Disabled);    // set font    QVariant value = model->data(index, Qt::FontRole);    if (value.isValid())        opt.font = qvariant_cast<QFont>(value);    // set text alignment    value = model->data(index, Qt::TextAlignmentRole);    if (value.isValid())        opt.displayAlignment = QFlag(value.toInt());    // set text color    value = model->data(index, Qt::TextColorRole);    if (value.isValid() && qvariant_cast<QColor>(value).isValid())        opt.palette.setColor(QPalette::Text, qvariant_cast<QColor>(value));    // do layout    // decoration    value = model->data(index, Qt::DecorationRole);    QPixmap pixmap = decoration(opt, value);    QRect pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0)                        : QRect(QPoint(0, 0), option.decorationSize));    // display    QRect textRect;    QString text = model->data(index, Qt::DisplayRole).toString().simplified();    QString orgText = text;    QRect statusRect;    const int elideMargin = 6;    if (item && !statusText.isEmpty()) {	QFontMetrics fontMetrics(opt.font);	statusRect = QRect(0, 0, fontMetrics.width(statusText), 			   fontMetrics.lineSpacing());	text += statusText;    }    if (!text.isEmpty())    {	QFontMetrics fontMetrics(opt.font);	textRect = QRect(0, 0, fontMetrics.width(text) + elideMargin, 			 fontMetrics.lineSpacing());    }    // check    value = model->data(index, Qt::CheckStateRole);    QRect checkRect = check(opt, opt.rect, value);    Qt::CheckState checkState = static_cast<Qt::CheckState>(value.toInt());    QRect savedRect = opt.rect;    opt.rect.setWidth( pixmapRect.width() + textRect.width() + elideMargin );    doLayout(opt, &checkRect, &pixmapRect, &textRect, false);    opt.rect = savedRect;        statusRect.translate( textRect.topRight() );    statusRect.setWidth( statusRect.width() + 2 );    statusRect.setLeft( textRect.right() - statusRect.width() );    // handle rtl drawing    if (opt.direction == Qt::RightToLeft) {	checkRect.setRect( opt.rect.left() + opt.rect.width() - checkRect.width(), opt.rect.top(),			    checkRect.width(), checkRect.height() );	pixmapRect.setRect( opt.rect.left() + opt.rect.width() - pixmapRect.width() - 3, opt.rect.top(),			    pixmapRect.width(), pixmapRect.height() );	textRect.setRect( pixmapRect.left() - textRect.width(), textRect.top(),			    textRect.width(), textRect.height() );	statusRect.setRect( textRect.left() - statusRect.width(), statusRect.top(),			    statusRect.width(), statusRect.height() );    }    // draw the background color    if (option.showDecorationSelected && (option.state & QStyle::State_Selected)) {        QPalette::ColorGroup cg = option.state & QStyle::State_Enabled                                  ? QPalette::Normal : QPalette::Disabled;        painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight));    } else {        value = model->data(index, Qt::BackgroundColorRole);        if (value.isValid() && qvariant_cast<QColor>(value).isValid())            painter->fillRect(option.rect, qvariant_cast<QColor>(value));    }        // draw the item    if (checkRect.isValid())        drawCheck(painter, opt, checkRect, checkState);    if (pixmapRect.isValid())        drawDecoration(painter, opt, pixmapRect, pixmap);    // avoid drawing highlight color twice.    opt.palette.setColor(QPalette::Highlight, QColor(0,0,0,0));    if (!orgText.isEmpty()) {        drawDisplay(painter, opt, textRect, orgText);        drawFocus(painter, opt, textRect);    }    if (item && !statusText.isEmpty()) {	opt.palette.setColor( QPalette::Text, statusCol );	opt.font.setBold( statusHighlight );        drawDisplay(painter, opt, statusRect, statusText);        drawFocus(painter, opt, statusRect);    }}

⌨️ 快捷键说明

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