/* Select all messages from a set of threads (passed as a set of mail.thread_id). Return the number of selected messages. */ int mail_listview::select_threads(const QSet<uint>& threads) { if (threads.empty()) return 0; int cnt=0; QStandardItem* item = model()->first_top_level_item(); QItemSelectionModel* sel = this->selectionModel(); while (item) { QVariant v = item->data(mail_item_model::mail_msg_role); mail_msg* msg = v.value<mail_msg*>(); QModelIndex index = item->index(); if (threads.contains(msg->thread_id())) { DBG_PRINTF(4, "selecting index for mail_id=%d", msg->get_id()); sel->select(index, QItemSelectionModel::Select|QItemSelectionModel::Rows); cnt++; } // next item QModelIndex index_below = indexBelow(index); if (index_below.isValid()) { item = model()->itemFromIndex(index_below); } else item=NULL; } return cnt; }
/** * This implementation provides a recursive realtime search over * the whole channel tree. It also features delayed selection * with with automatic expanding of folded channels. */ void UserView::keyboardSearch(const QString &search) { if (qtSearch->isActive()) { qpmiSearch = QPersistentModelIndex(); qtSearch->stop(); } bool forceSkip = false; if (tSearch.restart() > (QApplication::keyboardInputInterval() * 1000ULL)) { qsSearch = QString(); forceSkip = true; } bool isBackspace = (search.length() == 1) && (search.at(0).row() == 0) && (search.at(0).cell() == 8); if (isBackspace) { if (! qsSearch.isEmpty()) qsSearch = qsSearch.left(qsSearch.length()-1); } else { qsSearch += search; } // Try default search (which doesn't recurse non-expanded items) and see if it returns something "valid" QTreeView::keyboardSearch(search); QModelIndex start = currentIndex(); if (start.isValid() && model()->data(start, Qt::DisplayRole).toString().startsWith(qsSearch, Qt::CaseInsensitive)) return; if (forceSkip && start.isValid()) start = indexBelow(start); if (! start.isValid()) start = model()->index(0, 0, QModelIndex()); QModelIndexList qmil = model()->match(start, Qt::DisplayRole, qsSearch, 1, Qt::MatchFlags(Qt::MatchStartsWith | Qt::MatchWrap | Qt::MatchRecursive)); if (qmil.count() == 0) qmil = model()->match(start, Qt::DisplayRole, qsSearch, 1, Qt::MatchFlags(Qt::MatchContains | Qt::MatchWrap | Qt::MatchRecursive)); if (qmil.isEmpty()) return; QModelIndex qmi = qmil.at(0); QModelIndex p = qmi.parent(); bool visible = true; while (visible && p.isValid()) { visible = visible && isExpanded(p); p = p.parent(); } if (visible) selectionModel()->setCurrentIndex(qmi, QItemSelectionModel::ClearAndSelect); else { qpmiSearch = qmi; qtSearch->start(); } }
int PacmanView::visibleRowIndex(const QModelIndex & index) const { if (!isVisibleIndex(index)) return -1; QModelIndex next_index = indexAt(QPoint(0,0)); if (next_index == index) return 0; for (int i=1;(next_index = indexBelow(next_index)).isValid() && isVisibleIndex(next_index);i++) { if (next_index == index) return i; } return -1; }
void hrTreeView::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Down) { QModelIndex index = indexBelow(currentIndex()); emit highlighted(index.isValid() ? index : currentIndex()); } else if (event->key() == Qt::Key_Up) { QModelIndex index = indexAbove(currentIndex()); emit highlighted(index.isValid() ? index : currentIndex()); } QTreeView::keyPressEvent(event); }
void TabTreeView::initView() { // Restore expanded state expandAll(); QModelIndex index = model()->index(0, 0); while (index.isValid()) { WebTab *tab = index.data(TabModel::WebTabRole).value<WebTab*>(); if (tab) { setExpanded(index, tab->sessionData().value(m_expandedSessionKey, true).toBool()); } index = indexBelow(index); } m_initializing = false; }
int CustomTreeView::sizeHintForColumn(int col) const { if (!model() || col > 0) return -1; ensurePolished(); int hint = 0; QModelIndex index = model()->index(0,col); while (index.isValid()) { if (viewport()->rect().contains(visualRect(index))) { hint = qMax(hint, visualRect(index).x() + itemDelegate(index)->sizeHint(viewOptions(), index).width()); } index = indexBelow(index); } return qMin(hint, viewport()->rect().width()); }
QModelIndex SearchEditorTreeView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) { if (cursorAction == QAbstractItemView::MoveNext) { QModelIndex index = currentIndex(); // Only the first column of a group is editable if (!model()->data(index.sibling(index.row(), 0), Qt::UserRole + 1).toBool()) { // Move to next column in row if there is one if (index.column() < (header()->count() - 1)) { return model()->index(index.row(), index.column() + 1, index.parent()); } } // Reset to first column in row so that default moveCursor moves it down one if (indexBelow(index).isValid()) { setCurrentIndex(model()->index(index.row(), 0, index.parent())); } } else if (cursorAction == QAbstractItemView::MovePrevious) { QModelIndex index = currentIndex(); // Only the first column of a group is editable if (!model()->data(index.sibling(index.row(), 0), Qt::UserRole + 1).toBool()) { // Move to previous column in row if there is one if (index.column() > 0) { return model()->index(index.row(), index.column() - 1, index.parent()); } } if (indexAbove(index).isValid()) { // If row above is a group always reset to first column otherwise last column if (model()->data(indexAbove(index).sibling(indexAbove(index).row(), 0), Qt::UserRole + 1).toBool()) { setCurrentIndex(model()->index(index.row(), 0, index.parent())); } else { setCurrentIndex(model()->index(index.row(), header()->count() - 1, index.parent())); } } } return QTreeView::moveCursor(cursorAction, modifiers); }
/* direction: 1=below only, 2=above only, 3=below then above */ QStandardItem* mail_listview::nearest(const mail_msg* msg, int direction) const { mail_item_model* model = this->model(); QStandardItem* item = model->item_from_id(msg->get_id()); if (item!=NULL) { if (direction==1 || direction==3) { QModelIndex index_below=indexBelow(item->index()); if (index_below.isValid()) { return model->itemFromIndex(index_below); } } if (direction==2 || direction==3) { QModelIndex index_above=indexAbove(item->index()); if (index_above.isValid()) { return model->itemFromIndex(index_above); } } } return NULL; }
void mail_listview::remove_msg(mail_msg* msg, bool select_next) { DBG_PRINTF(8, "mail_listview::remove_msg(mail_id=%d, select_next=%d)", msg->get_id(), select_next); mail_item_model* model = this->model(); QStandardItem* item = model->item_from_id(msg->get_id()); if (!item) return; QStandardItem* nearest = NULL; QSet<QStandardItem*> expanded_set; if (select_next) { QModelIndex index_below = indexBelow(item->index()); if (index_below.isValid()) { nearest = model->itemFromIndex(index_below); DBG_PRINTF(5, "nearest got from index_below"); } else { QModelIndex index_above = indexAbove(item->index()); if (index_above.isValid()) { nearest = model->itemFromIndex(index_above); DBG_PRINTF(5, "nearest got from index_above"); } } if (nearest) { /* record the expansion states of all child items to set them back after the parent's removal */ collect_expansion_states(item, expanded_set); } } model->remove_msg(msg); if (select_next && nearest) { QModelIndex index = nearest->index(); DBG_PRINTF(5,"making current index row=%d col=%d parent is valid=%d", index.row(), index.column(), index.parent().isValid()?1:0); foreach (QStandardItem *child, expanded_set) { setExpanded(child->index(), true); }
void TabTreeView::adjustStyleOption(QStyleOptionViewItem *option) { const QModelIndex index = option->index; option->state.setFlag(QStyle::State_Active, true); option->state.setFlag(QStyle::State_HasFocus, false); option->state.setFlag(QStyle::State_Selected, index.data(TabModel::CurrentTabRole).toBool()); if (!index.isValid()) { option->viewItemPosition = QStyleOptionViewItem::Invalid; } else if (model()->rowCount() == 1) { option->viewItemPosition = QStyleOptionViewItem::OnlyOne; } else { if (!indexAbove(index).isValid()) { option->viewItemPosition = QStyleOptionViewItem::Beginning; } else if (!indexBelow(index).isValid()) { option->viewItemPosition = QStyleOptionViewItem::End; } else { option->viewItemPosition = QStyleOptionViewItem::Middle; } } }
void views::treeView::paintEvent(QPaintEvent * event) { QPainter painter(viewport()); drawTree(&painter, event->region()); if(state() ==QAbstractItemView::DraggingState && showDropIndicator() ) { DropIndicatorPosition pos=dropIndicatorPosition (); if(pos==AboveItem) { QModelIndex in=indexAt( viewport()->mapFromGlobal(QCursor::pos() ) ); QRect rect=visualRect(in); rect.setX(viewport()->rect().x() ); rect.setWidth(viewport()->rect().width()); QPen pen(palette().highlight().color() ); pen.setWidth(3); painter.setPen(pen); painter.drawLine(rect.topLeft(),rect.topRight()); } else if(pos==BelowItem) { QModelIndex in=indexAt( viewport()->mapFromGlobal(QCursor::pos() ) ); QRect rect=visualRect(in); rect.setX(viewport()->rect().x() ); rect.setWidth(viewport()->rect().width()); QPen pen(palette().highlight().color() ); pen.setWidth(3); painter.setPen(pen); painter.drawLine(rect.bottomLeft(),rect.bottomRight()); } else if(pos==OnViewport) { if(model()==0) return ; QModelIndex in=model()->index(model()->rowCount()-1,notHide(),QModelIndex() ); while(indexBelow(in).isValid() ) { in=indexBelow(in); } QRect rect=visualRect(in); rect.setX(viewport()->rect().x() ); rect.setWidth(viewport()->rect().width()); QPen pen(palette().highlight().color() ); pen.setWidth(3); painter.setPen(pen); painter.drawLine(rect.bottomLeft(),rect.bottomRight()); } else if(pos==OnItem) { QModelIndex in=indexAt( viewport()->mapFromGlobal(QCursor::pos() ) ); QRect rect=visualRect(in); QPen pen(palette().highlight().color() ); pen.setWidth(2); painter.setPen(pen); painter.drawRect(rect); } } }