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