diff options
-rw-r--r-- | seriestreewidget.cpp | 101 | ||||
-rw-r--r-- | seriestreewidget.h | 20 | ||||
-rw-r--r-- | shemov.pro | 2 |
3 files changed, 121 insertions, 2 deletions
diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp index e717b13..791fb9e 100644 --- a/seriestreewidget.cpp +++ b/seriestreewidget.cpp @@ -22,6 +22,14 @@ #include <QFileInfo> #include <QComboBox> #include <QFile> +#include <QEvent> +#include <QHoverEvent> +#include <QPaintEvent> +#include <QPainter> + +#include <QX11Info> +#include <X11/Xlib.h> +#include <X11/extensions/Xfixes.h> #include "seriestreewidget.h" #include "smtreemodel.h" @@ -310,7 +318,13 @@ void SeriesTreeWidget::addCover(){ } } -SeriesTreeView::SeriesTreeView(QWidget *parent) : QTreeView(parent) {} +SeriesTreeView::SeriesTreeView(QWidget *parent) : QTreeView(parent), mCursorOffset(0) { + setAttribute(Qt::WA_Hover); + mHoverWin = new SeriesTreeHoverWindow; + XFixesCursorImage *curImage = XFixesGetCursorImage(QX11Info::display()); + mCursorOffset = curImage->height; + XFree(curImage); +} void SeriesTreeView::contextMenuEvent(QContextMenuEvent *e){ QMenu contextMenu(this); @@ -320,6 +334,91 @@ void SeriesTreeView::contextMenuEvent(QContextMenuEvent *e){ contextMenu.exec(e->globalPos()); } +bool SeriesTreeView::event(QEvent *e){ + QModelIndex curIdx; + QHoverEvent *hEvent = static_cast<QHoverEvent*>(e); + QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() - mCursorOffset); + QPoint globalPos = mapToGlobal(hotSpot); + QPoint where = globalPos + QPoint(30, 30); + + curIdx = indexAt(hotSpot); + if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ + if(!curIdx.isValid()){ + return false; + } + if(curIdx.parent() != QModelIndex()){ + mHoverWin->setVisible(false); + mCurHover = QModelIndex(); + return false; + } + } + + if(e->type() == QEvent::HoverEnter){ + mCurHover = curIdx; + mHoverWin->setContent(curIdx.data(Qt::DisplayRole).toString(), children(curIdx)); + mHoverWin->move(where); + mHoverWin->setVisible(true); + return true; + } + if(e->type() == QEvent::HoverMove){ + if(curIdx != mCurHover){ + mCurHover = curIdx; + mHoverWin->setContent(curIdx.data(Qt::DisplayRole).toString(), children(curIdx)); + mHoverWin->setVisible(false); + mHoverWin->move(where); + mHoverWin->setVisible(true); + return true; + }else{ + mHoverWin->move(where); + return true; + } + } + if(e->type() == QEvent::HoverLeave){ + mHoverWin->setVisible(false); + return true; + } + return QTreeView::event(e); +} + +QStringList SeriesTreeView::children(const QModelIndex &idx) const{ + if(!idx.isValid()){ + return QStringList(); + } + QStringList retval; + QModelIndex curIdx = idx.child(0,0); + while(curIdx.isValid()){ + retval << curIdx.data(Qt::DisplayRole).toString(); + curIdx = idx.model()->index(curIdx.row() + 1, curIdx.column(), curIdx.parent()); + } + return retval; +} + +SeriesTreeHoverWindow::SeriesTreeHoverWindow(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f){ + setVisible(false); + setWindowOpacity(0.7); + setStyleSheet("QLabel { background-color: #D6A583; color: black; border-width: 2px; border-style: solid; padding: 4px; }"); + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->setContentsMargins(4, 4, 4, 4); + mLabel = new QLabel; + mainLayout->addWidget(mLabel); + setLayout(mainLayout); +} + +void SeriesTreeHoverWindow::setContent(const QString &parent, const QStringList &children){ + QString curText = QString("<p style=\"align: center; text-decoration: underline; font-weight: bold; margin-bottom: 0;\">%1</p>").arg(parent); + curText.append("<ul style=\"margin-left: -25; margin-top: 0px;\">"); + int count = qMin(6, children.size()); + int i = 0; + for(i = 0; i < count; ++i){ + curText.append(QString("<li>%1</li>").arg(children.at(i))); + } + if(i < children.count()){ + curText.append("<li>...</li>"); + } + curText.append("</ul>"); + mLabel->setText(curText); +} + SeriesTreeSortModel::SeriesTreeSortModel(QObject *parent) : QSortFilterProxyModel(parent) {} bool SeriesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const{ diff --git a/seriestreewidget.h b/seriestreewidget.h index a917501..4532ddb 100644 --- a/seriestreewidget.h +++ b/seriestreewidget.h @@ -17,9 +17,12 @@ class QLineEdit; class QPushButton; class QSortFilterProxyModel; class QComboBox; +class QEvent; +class QLabel; class SeriesTreeModel; class SeriesTreeView; class SeriesTreeSortModel; +class SeriesTreeHoverWindow; class FilesTreeModel; class AddCoverDialog; @@ -69,6 +72,23 @@ class SeriesTreeView : public QTreeView { protected: virtual void contextMenuEvent(QContextMenuEvent *e); + virtual bool event(QEvent *event); + + private: + QStringList children(const QModelIndex &idx) const; + QModelIndex mCurHover; + SeriesTreeHoverWindow *mHoverWin; + int mCursorOffset; +}; + +class SeriesTreeHoverWindow : public QWidget { + Q_OBJECT + public: + explicit SeriesTreeHoverWindow(QWidget *parent = 0, Qt::WindowFlags f = Qt::FramelessWindowHint); + void setContent(const QString &parent, const QStringList &children); + + private: + QLabel *mLabel; }; class SeriesTreeSortModel : public QSortFilterProxyModel { @@ -60,5 +60,5 @@ HEADERS = listitem.h \ mappingtablewidget.h \ newmoviewizard.h \ filepropertiesdialog.h -LIBS += -lmagic +LIBS += -lmagic -lXfixes RESOURCES = shemov.qrc |