QSize ListView::sizeHint() const { QSize s = QListView::sizeHint(); int h = fontMetrics().height() + 2 * itemMargin(); if(h % 2 > 0) { h++; } s.setHeight(h * mVisibleItem + lineWidth() * 2 + header()->sizeHint().height()); return s; }
void TeQtViewsListView::contentsDragMoveEvent(QDragMoveEvent *e) { if(pressedThemeItem_) pressedThemeItem_->setOpen(themeOpen_); if(e->source() != viewport()) { e->ignore(); e->acceptAction(false); return; } QPoint p = contentsToViewport(((QDragMoveEvent*)e)->pos()); TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p); if (item) { if (p.x() < treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin()) { e->ignore(); e->acceptAction(false); } else { if(item->getType() == TeQtCheckListItem::THEME || item->getType() == TeQtCheckListItem::VIEW) { e->accept(); e->acceptAction(); } else { e->ignore(); e->acceptAction(false); if(currentThemeItem_) { unselectAllItems(); currentThemeItem_->parent()->setSelected(true); currentThemeItem_->parent()->repaint(); currentThemeItem_->setSelected(true); repaint(); } } } } else { e->ignore(); e->acceptAction(false); } }
void DirectoryView::contentsMousePressEvent( QMouseEvent* e ) { QListView::contentsMousePressEvent(e); QPoint p( contentsToViewport( e->pos() ) ); QListViewItem *i = itemAt( p ); if ( i ) { // if the user clicked into the root decoration of the item, don't try to start a drag! if ( p.x() > header()->cellPos( header()->mapToActual( 0 ) ) + treeStepSize() * ( i->depth() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin() || p.x() < header()->cellPos( header()->mapToActual( 0 ) ) ) { presspos = e->pos(); mousePressed = TRUE; } } }
ItemDelegate::ItemDelegate(QAbstractItemView *view, QWidget *parent) : QItemDelegate(parent) , m_view(view) , m_saveOnReturnKey(true) , m_re() , m_maxSize(2048, 2048 * 8) , m_idealWidth(0) , m_vMargin( itemMargin() ) , m_hMargin( m_vMargin * 2 + 6 ) , m_foundFont() , m_foundPalette() , m_rowNumberFont() , m_rowNumberSize(0, 0) , m_showRowNumber(false) , m_rowNumberPalette() , m_antialiasing(true) , m_cache() { }
PropertyEditor::PropertyEditor(QWidget * parent, const char * name) : KListView(parent, name) , m_items(101, false) , justClickedItem(false) , m_currentEditor(0) { m_items.setAutoDelete(false); addColumn(i18n("Property")); addColumn(i18n("Value")); m_topItem = 0; m_editItem = 0; connect(this, SIGNAL(selectionChanged(QListViewItem *)), this, SLOT(slotClicked(QListViewItem *))); connect(this, SIGNAL(currentChanged(QListViewItem *)), this, SLOT(slotCurrentChanged(QListViewItem *))); connect(this, SIGNAL(expanded(QListViewItem *)), this, SLOT(slotExpanded(QListViewItem *))); connect(this, SIGNAL(collapsed(QListViewItem *)), this, SLOT(slotCollapsed(QListViewItem *))); connect(header(), SIGNAL(sizeChange(int, int, int)), this, SLOT(slotColumnSizeChanged(int, int, int))); connect(header(), SIGNAL(clicked(int)), this, SLOT(moveEditor())); connect(header(), SIGNAL(sectionHandleDoubleClicked(int)), this, SLOT(slotColumnSizeChanged(int))); m_defaults = new KPushButton(viewport()); m_defaults->setFocusPolicy(QWidget::NoFocus); setFocusPolicy(QWidget::ClickFocus); m_defaults->setPixmap(SmallIcon("undo")); QToolTip::add(m_defaults, i18n("Undo changes")); m_defaults->hide(); connect(m_defaults, SIGNAL(clicked()), this, SLOT(resetItem())); setRootIsDecorated(false); setShowSortIndicator(false); setTooltipColumn(0); setSorting(0); setItemMargin(2); setResizeMode(QListView::LastColumn); header()->setMovingEnabled(false); setTreeStepSize(0); m_baseRowHeight = QFontMetrics(font()).height() + itemMargin() * 2; }
void Theme::updateTheme() { const auto margin = itemMargin(); m_margins = QSize(margin + 2, margin); // search style m_searchPalette.setColor(QPalette::Base, color("find_bg")); m_searchPalette.setColor(QPalette::Text, color("find_fg")); m_searchFont = font("find_font"); // editor style m_editorPalette.setColor(QPalette::Base, color("edit_bg")); m_editorPalette.setColor(QPalette::Text, color("edit_fg")); m_editorFont = font("edit_font"); // number style m_showRowNumber = value("show_number").toBool(); m_rowNumberPalette.setColor(QPalette::Text, color("num_fg")); m_rowNumberFont = font("num_font"); m_rowNumberSize = QFontMetrics(m_rowNumberFont).boundingRect( QString("0123") ).size() + QSize(m_margins.width(), m_margins.height()); m_antialiasing = value("font_antialiasing").toBool(); }
void TeQtViewsListView::contentsMousePressEvent(QMouseEvent *e) { rightMouseWasClicked_ = false;; if (e->button() == RightButton) { rightMouseWasClicked_ = true; popupMenu_->move(e->globalPos().x(), e->globalPos().y()); } else if (e->button() == LeftButton) { QPoint p( contentsToViewport( e->pos() ) ); pressedPosition_ = p; TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p); if (item != 0) { if(item->getType() == TeQtCheckListItem::THEME) { // don?t drag, if the user clicked into the root decoration of the item int x = p.x(); int len = treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin(); if (x > len) // if (p.x() > treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin()) { pressedThemeItem_ = (TeQtThemeItem*)item; themeOpen_ = isOpen(item); } // Item was pressed inside the visibility box if (x > len && x < len + 10) { if (e->state() & Qt::ShiftButton) { if (refThemeItemForVis_ == 0) refThemeItemForVis_ = (TeQtThemeItem*)item; else { TeQtThemeItem *themeItem = (TeQtThemeItem*)item; if ((themeItem == refThemeItemForVis_) || (themeItem->parent() != refThemeItemForVis_->parent())) return; list<TeQtCheckListItem*> themeItemList; list<TeQtCheckListItem*>::iterator it; // find if the item pressed is below the reference item TeQtCheckListItem *itemBelow = (TeQtCheckListItem*)refThemeItemForVis_->itemBelow(); while((itemBelow != 0) && (itemBelow->getType() == TeQtCheckListItem::THEME)) { themeItemList.push_back(itemBelow); if (itemBelow == themeItem) { for (it = themeItemList.begin(); it != themeItemList.end(); ++it) { TeQtCheckListItem *thItem = *it; bool visible = refThemeItemForVis_->isOn(); setOn(thItem, visible); } refThemeItemForVis_ = 0; return; } itemBelow = (TeQtCheckListItem*)itemBelow->itemBelow(); } // find if the item pressed is above the reference item themeItemList.clear(); TeQtCheckListItem *itemAbove = (TeQtCheckListItem*)refThemeItemForVis_->itemAbove(); while((itemAbove != 0) && (itemAbove->getType() == TeQtCheckListItem::THEME)) { themeItemList.push_back(itemAbove); if (itemAbove == themeItem) { for (it = themeItemList.begin(); it != themeItemList.end(); ++it) { TeQtCheckListItem* thItem = *it; bool visible = refThemeItemForVis_->isOn(); setOn(thItem, visible); } refThemeItemForVis_ = 0; return; } itemAbove = (TeQtCheckListItem*)itemAbove->itemAbove(); } } } else refThemeItemForVis_ = 0; } } else { item->setSelected(false); item->repaint(); pressedThemeItem_ = 0; } leftButtonPressed_ = true; } } QListView::contentsMousePressEvent(e); }
/* If sourceList is empty we set the source file name into the header, * else this code is of a inlined function, and we add "inlined from..." */ void SourceView::fillSourceFile(TraceFunctionSource* sf, int fileno) { if (!sf) return; if (0) qDebug("Selected Item %s", _selectedItem ? _selectedItem->name().ascii() : "(none)"); TraceLineMap::Iterator lineIt, lineItEnd; int nextCostLineno = 0, lastCostLineno = 0; bool validSourceFile = (!sf->file()->name().isEmpty()); TraceLine* sLine = 0; if (_selectedItem) { if (_selectedItem->type() == TraceItem::Line) sLine = (TraceLine*) _selectedItem; if (_selectedItem->type() == TraceItem::Instr) sLine = ((TraceInstr*)_selectedItem)->line(); } if (validSourceFile) { TraceLineMap* lineMap = sf->lineMap(); if (lineMap) { lineIt = lineMap->begin(); lineItEnd = lineMap->end(); // get first line with cost of selected type while(lineIt != lineItEnd) { if (&(*lineIt) == sLine) break; if ((*lineIt).hasCost(_costType)) break; if (_costType2 && (*lineIt).hasCost(_costType2)) break; ++lineIt; } nextCostLineno = (lineIt == lineItEnd) ? 0 : (*lineIt).lineno(); if (nextCostLineno<0) { kdError() << "SourceView::fillSourceFile: Negative line number " << nextCostLineno << endl << " Function '" << sf->function()->name() << "'" << endl << " File '" << sf->file()->name() << "'" << endl; nextCostLineno = 0; } } if (nextCostLineno == 0) { new SourceItem(this, this, fileno, 0, false, i18n("There is no cost of current selected type associated")); new SourceItem(this, this, fileno, 1, false, i18n("with any source line of this function in file")); new SourceItem(this, this, fileno, 2, false, QString(" '%1'").arg(sf->function()->prettyName())); new SourceItem(this, this, fileno, 3, false, i18n("Thus, no annotated source can be shown.")); return; } } QString filename = sf->file()->shortName(); QString dir = sf->file()->directory(); if (!dir.isEmpty()) filename = dir + "/" + filename; if (nextCostLineno>0) { // we have debug info... search for source file if (!QFile::exists(filename)) { QStringList list = Configuration::sourceDirs(_data, sf->function()->object()); QStringList::Iterator it; for ( it = list.begin(); it != list.end(); ++it ) { dir = *it; if (checkFileExistance(dir, sf->file()->shortName())) break; } if (it == list.end()) nextCostLineno = 0; else { filename = dir + "/" + sf->file()->shortName(); // no need to search again sf->file()->setDirectory(dir); } } } // do it here, because the source directory could have been set before if (childCount()==0) { setColumnText(4, validSourceFile ? i18n("Source ('%1')").arg(filename) : i18n("Source (unknown)")); } else { new SourceItem(this, this, fileno, 0, true, validSourceFile ? i18n("--- Inlined from '%1' ---").arg(filename) : i18n("--- Inlined from unknown source ---")); } if (nextCostLineno == 0) { new SourceItem(this, this, fileno, 0, false, i18n("There is no source available for the following function:")); new SourceItem(this, this, fileno, 1, false, QString(" '%1'").arg(sf->function()->prettyName())); if (sf->file()->name().isEmpty()) { new SourceItem(this, this, fileno, 2, false, i18n("This is because no debug information is present.")); new SourceItem(this, this, fileno, 3, false, i18n("Recompile source and redo the profile run.")); if (sf->function()->object()) { new SourceItem(this, this, fileno, 4, false, i18n("The function is located in this ELF object:")); new SourceItem(this, this, fileno, 5, false, QString(" '%1'") .arg(sf->function()->object()->prettyName())); } } else { new SourceItem(this, this, fileno, 2, false, i18n("This is because its source file cannot be found:")); new SourceItem(this, this, fileno, 3, false, QString(" '%1'").arg(sf->file()->name())); new SourceItem(this, this, fileno, 4, false, i18n("Add the folder of this file to the source folder list.")); new SourceItem(this, this, fileno, 5, false, i18n("The list can be found in the configuration dialog.")); } return; } // initialisation for arrow drawing // create sorted list of jumps (for jump arrows) TraceLineMap::Iterator it = lineIt, nextIt; _lowList.clear(); _highList.clear(); while(1) { nextIt = it; ++nextIt; while(nextIt != lineItEnd) { if (&(*nextIt) == sLine) break; if ((*nextIt).hasCost(_costType)) break; if (_costType2 && (*nextIt).hasCost(_costType2)) break; ++nextIt; } TraceLineJumpList jlist = (*it).lineJumps(); TraceLineJump* lj; for (lj=jlist.first();lj;lj=jlist.next()) { if (lj->executedCount()==0) continue; // skip jumps to next source line with cost //if (lj->lineTo() == &(*nextIt)) continue; _lowList.append(lj); _highList.append(lj); } it = nextIt; if (it == lineItEnd) break; } _lowList.sort(); _highList.sort(); _lowList.first(); // iterators to list start _highList.first(); _jump.resize(0); char buf[256]; bool inside = false, skipLineWritten = true; int readBytes; int fileLineno = 0; SubCost most = 0; TraceLine* currLine; SourceItem *si, *si2, *item = 0, *first = 0, *selected = 0; QFile file(filename); if (!file.open(IO_ReadOnly)) return; while (1) { readBytes=file.readLine(buf, sizeof( buf )); if (readBytes<=0) { // for nice empty 4 lines after function with EOF buf[0] = 0; } if (readBytes >= (int) sizeof( buf )) { qDebug("%s:%d Line too long\n", sf->file()->name().ascii(), fileLineno); } else if ((readBytes>0) && (buf[readBytes-1] == '\n')) buf[readBytes-1] = 0; // keep fileLineno inside [lastCostLineno;nextCostLineno] fileLineno++; if (fileLineno == nextCostLineno) { currLine = &(*lineIt); // get next line with cost of selected type ++lineIt; while(lineIt != lineItEnd) { if (&(*lineIt) == sLine) break; if ((*lineIt).hasCost(_costType)) break; if (_costType2 && (*lineIt).hasCost(_costType2)) break; ++lineIt; } lastCostLineno = nextCostLineno; nextCostLineno = (lineIt == lineItEnd) ? 0 : (*lineIt).lineno(); } else currLine = 0; // update inside if (!inside) { if (currLine) inside = true; } else { if ( (fileLineno > lastCostLineno) && ((nextCostLineno == 0) || (fileLineno < nextCostLineno - Configuration::noCostInside()) )) inside = false; } int context = Configuration::context(); if ( ((lastCostLineno==0) || (fileLineno > lastCostLineno + context)) && ((nextCostLineno==0) || (fileLineno < nextCostLineno - context))) { if (lineIt == lineItEnd) break; if (!skipLineWritten) { skipLineWritten = true; // a "skipping" line: print "..." instead of a line number strcpy(buf,"..."); } else continue; } else skipLineWritten = false; si = new SourceItem(this, this, fileno, fileLineno, inside, QString(buf), currLine); if (!currLine) continue; if (!selected && (currLine == sLine)) selected = si; if (!first) first = si; if (currLine->subCost(_costType) > most) { item = si; most = currLine->subCost(_costType); } si->setOpen(true); TraceLineCallList list = currLine->lineCalls(); TraceLineCall* lc; for (lc=list.first();lc;lc=list.next()) { if ((lc->subCost(_costType)==0) && (lc->subCost(_costType2)==0)) continue; if (lc->subCost(_costType) > most) { item = si; most = lc->subCost(_costType); } si2 = new SourceItem(this, si, fileno, fileLineno, currLine, lc); if (!selected && (lc->call()->called() == _selectedItem)) selected = si2; } TraceLineJumpList jlist = currLine->lineJumps(); TraceLineJump* lj; for (lj=jlist.first();lj;lj=jlist.next()) { if (lj->executedCount()==0) continue; new SourceItem(this, si, fileno, fileLineno, currLine, lj); } } if (selected) item = selected; if (item) first = item; if (first) { ensureItemVisible(first); _inSelectionUpdate = true; setCurrentItem(first); _inSelectionUpdate = false; } file.close(); // for arrows: go down the list according to list sorting sort(); QListViewItem *item1, *item2; for (item1=firstChild();item1;item1 = item1->nextSibling()) { si = (SourceItem*)item1; updateJumpArray(si->lineno(), si, true, false); for (item2=item1->firstChild();item2;item2 = item2->nextSibling()) { si2 = (SourceItem*)item2; if (si2->lineJump()) updateJumpArray(si->lineno(), si2, false, true); else si2->setJumpArray(_jump); } } if (arrowLevels()) setColumnWidth(3, 10 + 6*arrowLevels() + itemMargin() * 2); else setColumnWidth(3, 0); }