File indexing completed on 2024-04-28 15:39:08

0001 // SPDX-FileCopyrightText: 2021-2022 Tobias Leupold <tl at stonemx dot de>
0002 //
0003 // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 // Local includes
0006 #include "TracksListView.h"
0007 #include "GeoDataModel.h"
0008 
0009 // KDE includes
0010 #include <KLocalizedString>
0011 
0012 // Qt includes
0013 #include <QMenu>
0014 #include <QAction>
0015 
0016 TracksListView::TracksListView(GeoDataModel *model, QWidget *parent) : QListView(parent)
0017 {
0018     viewport()->setAcceptDrops(true);
0019     setDropIndicatorShown(true);
0020     setDragDropMode(QAbstractItemView::DropOnly);
0021 
0022     setModel(model);
0023     setSelectionMode(QAbstractItemView::ExtendedSelection);
0024     setContextMenuPolicy(Qt::CustomContextMenu);
0025 
0026     connect(this, &QAbstractItemView::clicked, this, &TracksListView::trackSelected);
0027 
0028     connect(selectionModel(), &QItemSelectionModel::selectionChanged,
0029             this, &TracksListView::checkSelection);
0030 
0031     m_contextMenu = new QMenu(this);
0032 
0033     m_remove = m_contextMenu->addAction(i18np("Remove track", "Remove tracks", 1));
0034     connect(m_remove, &QAction::triggered, this, &TracksListView::removeTracks);
0035 
0036     connect(this, &QListView::customContextMenuRequested, this, &TracksListView::showContextMenu);
0037 }
0038 
0039 void TracksListView::currentChanged(const QModelIndex &current, const QModelIndex &)
0040 {
0041     if (current.isValid()) {
0042         Q_EMIT trackSelected(current);
0043         scrollTo(current);
0044     }
0045 }
0046 
0047 void TracksListView::showContextMenu(const QPoint &point)
0048 {
0049     const auto selected = selectedIndexes();
0050     const int allSelected = selected.count();
0051 
0052     m_remove->setEnabled(allSelected > 0);
0053     m_remove->setText(i18np("Remove track", "Remove tracks", allSelected));
0054 
0055     m_contextMenu->exec(mapToGlobal(point));
0056 }
0057 
0058 QVector<int> TracksListView::selectedTracks() const
0059 {
0060     QVector<int> selection;
0061     const auto selected = selectedIndexes();
0062     for (const auto &index : selected) {
0063         selection.append(index.row());
0064     }
0065     return selection;
0066 }
0067 
0068 void TracksListView::checkSelection()
0069 {
0070     const auto selected = selectedIndexes();
0071     Q_EMIT updateTrackWalker(selected.count() == 1 ? selected.first().row() : -1);
0072 }