#include "yacreader_folders_view.h" #include "QsLog.h" #include "comic.h" #include "comic_files_manager.h" #include "folder_model.h" #include "yacreader_treeview.h" YACReaderFoldersView::YACReaderFoldersView(QWidget *parent) : YACReaderTreeView(parent) { setItemDelegate(new YACReaderFoldersViewItemDeletegate(this)); } void YACReaderFoldersView::dragEnterEvent(QDragEnterEvent *event) { YACReaderTreeView::dragEnterEvent(event); if (event->mimeData()->hasUrls() && event->dropAction() == Qt::CopyAction) { const auto urlList = event->mimeData()->urls(); QString currentPath; for (const auto &url : urlList) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) { event->acceptProposedAction(); return; } } } } void YACReaderFoldersView::dragLeaveEvent(QDragLeaveEvent *event) { YACReaderTreeView::dragLeaveEvent(event); } void YACReaderFoldersView::dragMoveEvent(QDragMoveEvent *event) { YACReaderTreeView::dragMoveEvent(event); event->acceptProposedAction(); } void YACReaderFoldersView::dropEvent(QDropEvent *event) { YACReaderTreeView::dropEvent(event); QLOG_DEBUG() << "drop on tree" << event->dropAction(); bool validAction = event->dropAction() == Qt::CopyAction; // || event->dropAction() & Qt::MoveAction; TODO move if (validAction) { QList> droppedFiles = ComicFilesManager::getDroppedFiles(event->mimeData()->urls()); QModelIndex destinationIndex = indexAt(event->position().toPoint()); if (event->dropAction() == Qt::CopyAction) { QLOG_DEBUG() << "copy - tree :" << droppedFiles; emit copyComicsToFolder(droppedFiles, destinationIndex); } else if (event->dropAction() & Qt::MoveAction) { QLOG_DEBUG() << "move - tree :" << droppedFiles; emit moveComicsToFolder(droppedFiles, destinationIndex); } event->acceptProposedAction(); } } //---------------------------------------------------------- YACReaderFoldersViewItemDeletegate::YACReaderFoldersViewItemDeletegate(QObject *parent) : QStyledItemDelegate(parent) { } void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { // Promote hover to selected so QIcon::Selected mode activates on mouse-over, // matching the QSS which already uses the same background for hover and selected. QStyleOptionViewItem opt = option; if (opt.state & QStyle::State_MouseOver) opt.state |= QStyle::State_Selected; // Get indicator colors from the theme via the owning view QColor notCompletedColor(237, 197, 24); // Default fallback QColor newItemDotColor(237, 197, 24); // Default fallback if (auto foldersView = qobject_cast(parent())) { const auto &nt = foldersView->navigationTreeTheme(); notCompletedColor = nt.folderNotCompletedColor; newItemDotColor = nt.newItemColor; } if (!index.data(FolderModel::CompletedRole).toBool()) { painter->save(); painter->setBrush(QBrush(notCompletedColor)); painter->setPen(QPen(QBrush(), 0)); painter->drawRect(0, opt.rect.y(), 2, opt.rect.height()); painter->restore(); } QStyledItemDelegate::paint(painter, opt, index); auto showRecent = index.data(FolderModel::ShowRecentRole).toBool(); if (showRecent) { auto now = QDateTime::currentSecsSinceEpoch(); auto added = index.data(FolderModel::AddedRole).toLongLong(); auto updated = index.data(FolderModel::UpdatedRole).toLongLong(); auto daysInSeconds = index.data(FolderModel::RecentRangeRole).toLongLong(); if (now - added < daysInSeconds || now - updated < daysInSeconds) { painter->save(); painter->setRenderHint(QPainter::Antialiasing); painter->setBrush(QBrush(newItemDotColor)); painter->setPen(QPen(QBrush(), 0)); painter->drawEllipse(opt.rect.x() + 13, opt.rect.y() + 2, 7, 7); painter->restore(); } } }