X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fplaylistview.cpp;h=c0e1197e735227e666b0bb12eb83cb476453edb0;hb=504912535d1fd81a933706ef9459179a35a1483a;hp=2705c4dd8590181950cbeec0c2e52cb2ebaebf49;hpb=f5b36303738136ef3dc3ffc7a853bdb134cf0e1c;p=minitube diff --git a/src/playlistview.cpp b/src/playlistview.cpp index 2705c4d..c0e1197 100644 --- a/src/playlistview.cpp +++ b/src/playlistview.cpp @@ -1,67 +1,120 @@ +/* $BEGIN_LICENSE + +This file is part of Minitube. +Copyright 2009, Flavio Tordini + +Minitube is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Minitube is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Minitube. If not, see . + +$END_LICENSE */ + #include "playlistview.h" -#include "ListModel.h" -#include "playlist/PrettyItemDelegate.h" +#include "playlistmodel.h" +#include "playlistitemdelegate.h" +#include "painterutils.h" + +PlaylistView::PlaylistView(QWidget *parent) : QListView(parent), + clickableAuthors(true) { + setItemDelegate(new PlaylistItemDelegate(this)); + setSelectionMode(QAbstractItemView::ExtendedSelection); -PlaylistView::PlaylistView(QWidget *parent) : QListView(parent) { - connect(this, SIGNAL(entered(const QModelIndex &)), SLOT(itemEntered(const QModelIndex &))); + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding); + +#if QT_VERSION >= 0x050000 && defined(APP_MAC) + setMinimumWidth(160); +#else + setMinimumWidth(175); +#endif + + // dragndrop + setDragEnabled(true); + setAcceptDrops(true); + setDropIndicatorShown(true); + setDragDropMode(QAbstractItemView::DragDrop); + + // cosmetics + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + setFrameShape(QFrame::NoFrame); + setAttribute(Qt::WA_MacShowFocusRect, false); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setUniformItemSizes(true); + + connect(this, SIGNAL(entered(const QModelIndex &)), + SLOT(itemEntered(const QModelIndex &))); setMouseTracking(true); } void PlaylistView::itemEntered(const QModelIndex &index) { - ListModel *listModel = dynamic_cast(model()); + PlaylistModel *listModel = qobject_cast(model()); if (listModel) listModel->setHoveredRow(index.row()); } -void PlaylistView::leaveEvent(QEvent * /* event */) { - ListModel *listModel = dynamic_cast(model()); +void PlaylistView::leaveEvent(QEvent *event) { + QListView::leaveEvent(event); + PlaylistModel *listModel = qobject_cast(model()); if (listModel) listModel->clearHover(); } void PlaylistView::mouseMoveEvent(QMouseEvent *event) { - QWidget::mouseMoveEvent(event); - - if (isHoveringAuthor(event)) { - - // check for special "message" item - ListModel *listModel = dynamic_cast(model()); - if (listModel && listModel->rowCount() == indexAt(event->pos()).row()) - return; - + if (isHoveringThumbnail(event)) { + setCursor(Qt::PointingHandCursor); + } else if (isShowMoreItem(indexAt(event->pos()))) { + setCursor(Qt::PointingHandCursor); + } else if (isHoveringAuthor(event)) { QMetaObject::invokeMethod(model(), "enterAuthorHover"); setCursor(Qt::PointingHandCursor); } else { QMetaObject::invokeMethod(model(), "exitAuthorHover"); unsetCursor(); } - + QListView::mouseMoveEvent(event); } void PlaylistView::mousePressEvent(QMouseEvent *event) { - if (event->button() == Qt::LeftButton - && isHoveringAuthor(event)) { - QMetaObject::invokeMethod(model(), "enterAuthorPressed"); - event->ignore(); - } else { - QListView::mousePressEvent(event); + if (event->button() == Qt::LeftButton) { + if (isHoveringAuthor(event)) { + QMetaObject::invokeMethod(model(), "enterAuthorPressed"); + } } + QListView::mousePressEvent(event); } void PlaylistView::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { QMetaObject::invokeMethod(model(), "exitAuthorPressed"); - if (isHoveringAuthor(event)) - emit authorPushed(indexAt(event->pos())); - } else { - QListView::mousePressEvent(event); + const QModelIndex index = indexAt(event->pos()); + if (isHoveringThumbnail(event)) { + emit activated(index); + unsetCursor(); + } else if (isHoveringAuthor(event)) { + emit authorPushed(index); + } else if (isShowMoreItem(index)) { + PlaylistModel *listModel = qobject_cast(model()); + listModel->searchMore(); + unsetCursor(); + } } + QListView::mouseReleaseEvent(event); } bool PlaylistView::isHoveringAuthor(QMouseEvent *event) { + if (!clickableAuthors) return false; + const QModelIndex itemIndex = indexAt(event->pos()); const QRect itemRect = visualRect(itemIndex); // qDebug() << " itemRect.x()" << itemRect.x(); - PrettyItemDelegate *delegate = dynamic_cast(itemDelegate()); + PlaylistItemDelegate *delegate = qobject_cast(itemDelegate()); if (!delegate) return false; QRect rect = delegate->authorRect(itemIndex); @@ -72,3 +125,17 @@ bool PlaylistView::isHoveringAuthor(QMouseEvent *event) { return ret; } + +bool PlaylistView::isHoveringThumbnail(QMouseEvent *event) { + const QModelIndex index = indexAt(event->pos()); + const QRect itemRect = visualRect(index); + static const QRect thumbRect(0, 0, 160, 90); + const int x = event->x() - itemRect.x() - thumbRect.x(); + const int y = event->y() - itemRect.y() - thumbRect.y(); + return x > 0 && x < thumbRect.width() && y > 0 && y < thumbRect.height(); +} + +bool PlaylistView::isShowMoreItem(const QModelIndex &index) { + return model()->rowCount() > 1 && + model()->rowCount() == index.row() + 1; +}