File indexing completed on 2024-04-28 04:21:18

0001 // SPDX-FileCopyrightText: 2014-2020 The KPhotoAlbum Development Team
0002 // SPDX-FileCopyrightText: 2022 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 //
0004 // SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006 #include "CategoriesGroupsWidget.h"
0007 
0008 // Qt includes
0009 #include <QDropEvent>
0010 
0011 // Local includes
0012 #include "TagGroupsPage.h"
0013 
0014 #include <DB/Category.h>
0015 
0016 Settings::CategoriesGroupsWidget::CategoriesGroupsWidget(QWidget *parent)
0017     : QTreeWidget(parent)
0018     , m_backgroundHiglightTarget(Qt::lightGray)
0019 {
0020     setDragEnabled(true);
0021     setAcceptDrops(true);
0022 
0023     m_tagGroupsPage = dynamic_cast<TagGroupsPage *>(parentWidget());
0024 }
0025 
0026 Settings::CategoriesGroupsWidget::~CategoriesGroupsWidget()
0027 {
0028 }
0029 
0030 void Settings::CategoriesGroupsWidget::mousePressEvent(QMouseEvent *event)
0031 {
0032     m_draggedItem = itemAt(event->pos());
0033 
0034     if (m_draggedItem != nullptr) {
0035         if (m_draggedItem->parent() != nullptr) {
0036             m_draggedItemCategory = m_tagGroupsPage->getCategory(m_draggedItem);
0037         }
0038     } else {
0039         m_draggedItemCategory = QString();
0040     }
0041 
0042     QTreeWidget::mousePressEvent(event);
0043 }
0044 
0045 void Settings::CategoriesGroupsWidget::dragMoveEvent(QDragMoveEvent *event)
0046 {
0047     QTreeWidgetItem *target = itemAt(event->pos());
0048 
0049     if (target == nullptr) {
0050         // We don't have a target, so we don't allow a drop.
0051         event->setDropAction(Qt::IgnoreAction);
0052     } else {
0053         // The target has to be in the same category as the dragged group.
0054         QTreeWidgetItem *parent = target;
0055         // the category is the root item:
0056         while (parent->parent() != nullptr) {
0057             parent = parent->parent();
0058             if (parent == m_draggedItem) {
0059                 event->setDropAction(Qt::IgnoreAction);
0060                 return;
0061             }
0062         }
0063         if (parent->text(0) != m_draggedItemCategory) {
0064             event->setDropAction(Qt::IgnoreAction);
0065         } else {
0066             updateHighlight(target);
0067             event->setDropAction(Qt::MoveAction);
0068             event->accept();
0069         }
0070     }
0071 }
0072 
0073 void Settings::CategoriesGroupsWidget::updateHighlight(QTreeWidgetItem *target)
0074 {
0075     Q_ASSERT(target != nullptr);
0076     if (target == m_oldTarget) {
0077         return;
0078     }
0079 
0080     if (m_oldTarget != nullptr) {
0081         m_oldTarget->setBackground(0, m_backgroundNoTarget);
0082     }
0083 
0084     m_backgroundNoTarget = target->background(0);
0085     target->setBackground(0, m_backgroundHiglightTarget);
0086 
0087     m_oldTarget = target;
0088 }
0089 
0090 void Settings::CategoriesGroupsWidget::dropEvent(QDropEvent *event)
0091 {
0092     QTreeWidgetItem *target = itemAt(event->pos());
0093     target->setBackground(0, m_backgroundNoTarget);
0094     m_oldTarget = nullptr;
0095 
0096     if (m_draggedItem != target) {
0097         m_tagGroupsPage->processDrop(m_draggedItem, target);
0098     }
0099 }
0100 
0101 // vi:expandtab:tabstop=4 shiftwidth=4:
0102 
0103 #include "moc_CategoriesGroupsWidget.cpp"