/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * */ #include #include #include #include "TorrentView.h" class TorrentView::HeaderWidget : public QWidget { public: HeaderWidget(TorrentView* parent) : QWidget(parent), myText() { setFont(qApp->font("QMiniFont")); } void setText(QString const& text) { myText = text; update(); } // QWidget virtual QSize sizeHint() const { QStyleOptionHeader option; option.rect = QRect(0, 0, 100, 100); QRect const labelRect = style()->subElementRect(QStyle::SE_HeaderLabel, &option, this); return QSize(100, fontMetrics().height() + (option.rect.height() - labelRect.height())); } protected: // QWidget virtual void paintEvent(QPaintEvent* /*event*/) { QStyleOptionHeader option; option.initFrom(this); option.state = QStyle::State_Enabled; option.position = QStyleOptionHeader::OnlyOneSection; QStylePainter painter(this); painter.drawControl(QStyle::CE_HeaderSection, option); option.rect = style()->subElementRect(QStyle::SE_HeaderLabel, &option, this); painter.drawItemText(option.rect, Qt::AlignCenter, option.palette, true, myText, QPalette::ButtonText); } virtual void mouseDoubleClickEvent(QMouseEvent* /*event*/) { emit static_cast(parent())->headerDoubleClicked(); } private: QString myText; }; TorrentView::TorrentView(QWidget* parent) : QListView(parent), myHeaderWidget(new HeaderWidget(this)) { } void TorrentView::setHeaderText(QString const& text) { bool const headerVisible = !text.isEmpty(); myHeaderWidget->setText(text); myHeaderWidget->setVisible(headerVisible); if (headerVisible) { adjustHeaderPosition(); } setViewportMargins(0, headerVisible ? myHeaderWidget->height() : 0, 0, 0); } void TorrentView::resizeEvent(QResizeEvent* event) { QListView::resizeEvent(event); if (myHeaderWidget->isVisible()) { adjustHeaderPosition(); } } void TorrentView::adjustHeaderPosition() { QRect headerWidgetRect = contentsRect(); headerWidgetRect.setWidth(viewport()->width()); headerWidgetRect.setHeight(myHeaderWidget->sizeHint().height()); myHeaderWidget->setGeometry(headerWidgetRect); }