/*************************************************************************** * Copyright (C) 2015-2017 by Savoir-faire Linux * * Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> * * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com> * * Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com> * * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> * * * * This program 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. * * * * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. * **************************************************************************/ #include "smartlistview.h" #include "invitebuttonswidget.h" #include "smartlistmodel.h" #include "utils.h" #include <QScrollBar> #include <QMouseEvent> #include <QDebug> #include <ciso646> SmartListView::SmartListView(QWidget *parent) : QTreeView(parent) { verticalScrollBar()->setEnabled(true); setVerticalScrollMode(ScrollPerPixel); verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 0px; }"); setDragEnabled(true); setAcceptDrops(true); setDropIndicatorShown(true); setSelectionMode(QAbstractItemView::SingleSelection); setMouseTracking(true); installEventFilter(this); QObject::connect(this, &QAbstractItemView::entered, [this](const QModelIndex & index) { auto type = Utils::toEnum<lrc::api::profile::Type>( index.data(static_cast<int>(SmartListModel::Role::ContactType)).value<int>() ); if (type == lrc::api::profile::Type::PENDING) { auto widget = indexWidget(index); if (!widget) { InviteButtonsWidget* buttons = new InviteButtonsWidget(); setIndexWidget(index, buttons); QObject::connect(buttons, &InviteButtonsWidget::btnAcceptInviteClicked, this, [this, index]() { hoveredRow_ = QModelIndex(); emit btnAcceptInviteClicked(index); }); QObject::connect(buttons, &InviteButtonsWidget::btnIgnoreInviteClicked, this, [this, index]() { hoveredRow_ = QModelIndex(); emit btnIgnoreInviteClicked(index); }); QObject::connect(buttons, &InviteButtonsWidget::btnBlockInviteClicked, this, [this, index]() { hoveredRow_ = QModelIndex(); emit btnBlockInviteClicked(index); }); } else { widget->show(); } if (hoveredRow_.isValid() && indexWidget(hoveredRow_)) { indexWidget(hoveredRow_)->hide(); } hoveredRow_ = index; } }); } SmartListView::~SmartListView() { reset(); } void SmartListView::enterEvent(QEvent* event) { Q_UNUSED(event); } void SmartListView::leaveEvent(QEvent* event) { Q_UNUSED(event); hoveredRow_ = QModelIndex(); } void SmartListView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { emit customContextMenuRequested(event->pos()); } else { QTreeView::mousePressEvent(event); } } bool SmartListView::eventFilter(QObject* watched, QEvent* event) { auto index = this->indexAt(static_cast<QMouseEvent*>(event)->pos()); if (!index.isValid()) { hoveredRow_ = QModelIndex(); } if (qobject_cast<QScrollBar*>(watched) && event->type() == QEvent::Enter) { hoveredRow_ = QModelIndex(); return true; } return QObject::eventFilter(watched, event); } void SmartListView::drawRow(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { if (index == hoveredRow_ && indexWidget(hoveredRow_)) { indexWidget(index)->setVisible(true); } else if (indexWidget(index)) { auto type = Utils::toEnum<lrc::api::profile::Type>( index.data(static_cast<int>(SmartListModel::Role::ContactType)).value<int>() ); if (type == lrc::api::profile::Type::PENDING) { indexWidget(index)->setVisible(false); } } QTreeView::drawRow(painter, option, index); }