📄 folderlistview.cpp
字号:
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 + -