summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-10-16 12:14:43 +0200
committerArno <am@disconnect.de>2010-10-16 12:14:43 +0200
commit101cc9ec266a2d3b5168ab5053efbf868be7e25b (patch)
tree1e6fbee38872edc55126b2d5841b9b76207e5f21
parenta30a4c02d1c8a9c8442010b6ae12a2477c936b92 (diff)
downloadSheMov-101cc9ec266a2d3b5168ab5053efbf868be7e25b.tar.gz
SheMov-101cc9ec266a2d3b5168ab5053efbf868be7e25b.tar.bz2
SheMov-101cc9ec266a2d3b5168ab5053efbf868be7e25b.zip
Implemented hover for SeriesTreeWidget
SeriesTreeWidget show a popup window with the movies assigned to the series when hovering over a series entry.
-rw-r--r--seriestreewidget.cpp101
-rw-r--r--seriestreewidget.h20
-rw-r--r--shemov.pro2
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 {
diff --git a/shemov.pro b/shemov.pro
index a58d4ca..dc3cc47 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -60,5 +60,5 @@ HEADERS = listitem.h \
mappingtablewidget.h \
newmoviewizard.h \
filepropertiesdialog.h
-LIBS += -lmagic
+LIBS += -lmagic -lXfixes
RESOURCES = shemov.qrc