1 /*
2     SPDX-FileCopyrightText: 2008 Joris Guisson <joris.guisson@gmail.com>
3     SPDX-FileCopyrightText: 2008 Ivan Vasic <ivasic@gmail.com>
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include <QAction>
8 #include <QHeaderView>
9 #include <QIcon>
10 #include <QLineEdit>
11 #include <QSortFilterProxyModel>
12 #include <QVBoxLayout>
13 
14 #include <KLocalizedString>
15 #include <KToolBar>
16 
17 #include "mediamodel.h"
18 #include "mediaplayer.h"
19 #include "mediaplayerpluginsettings.h"
20 #include "mediaview.h"
21 #include <util/log.h>
22 
23 using namespace bt;
24 
25 namespace kt
26 {
MediaViewFilter(QObject * parent)27 MediaViewFilter::MediaViewFilter(QObject *parent)
28     : QSortFilterProxyModel(parent)
29     , show_incomplete(false)
30 {
31 }
32 
~MediaViewFilter()33 MediaViewFilter::~MediaViewFilter()
34 {
35 }
36 
setShowIncomplete(bool on)37 void MediaViewFilter::setShowIncomplete(bool on)
38 {
39     show_incomplete = on;
40     invalidateFilter();
41 }
42 
filterAcceptsRow(int source_row,const QModelIndex & source_parent) const43 bool MediaViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
44 {
45     if (show_incomplete)
46         return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
47 
48     MediaModel *model = (MediaModel *)sourceModel();
49     MediaFileRef ref = model->fileForIndex(model->index(source_row));
50     MediaFile::Ptr file = ref.mediaFile();
51     if (file->fullyAvailable())
52         return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
53     else
54         return false;
55 }
56 
refresh()57 void MediaViewFilter::refresh()
58 {
59     invalidateFilter();
60 }
61 
MediaView(MediaModel * model,QWidget * parent)62 MediaView::MediaView(MediaModel *model, QWidget *parent)
63     : QWidget(parent)
64     , model(model)
65 {
66     filter = new MediaViewFilter(this);
67     filter->setSourceModel(model);
68     filter->setFilterRole(Qt::DisplayRole);
69     filter->setFilterCaseSensitivity(Qt::CaseInsensitive);
70     filter->setSortRole(Qt::UserRole + 1);
71     filter->sort(0, Qt::DescendingOrder);
72 
73     QVBoxLayout *layout = new QVBoxLayout(this);
74     layout->setSpacing(0);
75     layout->setMargin(0);
76 
77     QHBoxLayout *hbox = new QHBoxLayout();
78     hbox->setSpacing(0);
79     hbox->setMargin(0);
80 
81     tool_bar = new KToolBar(this);
82     hbox->addWidget(tool_bar);
83 
84     show_incomplete = tool_bar->addAction(QIcon::fromTheme(QStringLiteral("task-ongoing")), i18n("Show incomplete files"));
85     show_incomplete->setCheckable(true);
86     show_incomplete->setChecked(false);
87     connect(show_incomplete, &QAction::toggled, this, &MediaView::showIncompleteChanged);
88 
89     refresh = tool_bar->addAction(QIcon::fromTheme(QStringLiteral("view-refresh")), i18n("Refresh"), filter, &MediaViewFilter::refresh);
90     refresh->setToolTip(i18n("Refresh media files"));
91 
92     search_box = new QLineEdit(this);
93     search_box->setClearButtonEnabled(true);
94     search_box->setPlaceholderText(i18n("Search media files"));
95     connect(search_box, &QLineEdit::textChanged, filter, &MediaViewFilter::setFilterFixedString);
96     hbox->addWidget(search_box);
97 
98     layout->addLayout(hbox);
99 
100     media_tree = new QListView(this);
101     media_tree->setModel(filter);
102     media_tree->setDragEnabled(true);
103     media_tree->setSelectionMode(QAbstractItemView::ContiguousSelection);
104     media_tree->setAlternatingRowColors(true);
105     layout->addWidget(media_tree);
106 
107     connect(media_tree, &QListView::doubleClicked, this, &MediaView::onDoubleClicked);
108 }
109 
~MediaView()110 MediaView::~MediaView()
111 {
112 }
113 
onDoubleClicked(const QModelIndex & index)114 void MediaView::onDoubleClicked(const QModelIndex &index)
115 {
116     if (!index.isValid())
117         return;
118 
119     QModelIndex idx = filter->mapToSource(index);
120     if (!idx.isValid())
121         return;
122 
123     doubleClicked(model->fileForIndex(idx));
124 }
125 
showIncompleteChanged(bool on)126 void MediaView::showIncompleteChanged(bool on)
127 {
128     filter->setShowIncomplete(on);
129 }
130 
loadState(KSharedConfig::Ptr cfg)131 void MediaView::loadState(KSharedConfig::Ptr cfg)
132 {
133     KConfigGroup g = cfg->group("MediaView");
134     show_incomplete->setChecked(g.readEntry("show_incomplete", false));
135     search_box->setText(g.readEntry("search_text", QString()));
136 }
137 
saveState(KSharedConfig::Ptr cfg)138 void MediaView::saveState(KSharedConfig::Ptr cfg)
139 {
140     KConfigGroup g = cfg->group("MediaView");
141     g.writeEntry("show_incomplete", show_incomplete->isChecked());
142     g.writeEntry("search_text", search_box->text());
143 }
144 
145 }
146