Files
yacreader/YACReaderLibrary/yacreader_folders_view.cpp
luisangelsm 3709b6e737
Some checks failed
Build / Initialization (push) Has been cancelled
Build / Code Format Validation (push) Has been cancelled
Build / Linux (Qt6) (push) Has been cancelled
Build / Linux (Qt6 + 7zip) (push) Has been cancelled
Build / macOS (Qt6 Universal) (push) Has been cancelled
Build / Windows x64 (Qt6) (push) Has been cancelled
Build / Windows ARM64 (Qt6) (push) Has been cancelled
Build / Docker amd64 Image (push) Has been cancelled
Build / Docker arm64 Image (push) Has been cancelled
Build / Publish Dev Builds (push) Has been cancelled
Build / Publish Release (push) Has been cancelled
Build / Publish YACReader10 Pre-release Builds (push) Has been cancelled
Format includes using clang-format
2026-03-13 18:21:38 +01:00

122 lines
4.3 KiB
C++

#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);
QList<QUrl> urlList;
if (event->mimeData()->hasUrls() && event->dropAction() == Qt::CopyAction) {
urlList = event->mimeData()->urls();
QString currentPath;
foreach (QUrl 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<QPair<QString, QString>> droppedFiles = ComicFilesManager::getDroppedFiles(event->mimeData()->urls());
QModelIndex destinationIndex = indexAt(event->pos());
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<YACReaderFoldersView *>(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();
}
}
}