File: localbrowsemodel.cpp

package info (click to toggle)
cantata 3.4.0.ds1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 20,428 kB
  • sloc: cpp: 109,584; perl: 1,366; xml: 722; python: 139; lex: 110; sh: 105; yacc: 78; makefile: 8
file content (110 lines) | stat: -rw-r--r-- 3,297 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 * Cantata
 *
 * Copyright (c) 2018-2022 Craig Drummond <craig.p.drummond@gmail.com>
 *
 * ----
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#include "localbrowsemodel.h"
#include "gui/stdactions.h"
#include "playqueuemodel.h"
#include "roles.h"
#include "support/utils.h"
#include "widgets/icons.h"

FileSystemProxyModel::FileSystemProxyModel(LocalBrowseModel* p)
	: QSortFilterProxyModel(p), m(p)
{
	setSourceModel(p);
}

bool FileSystemProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const
{
	QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
	QFileInfo info = m->fileInfo(index);
	if (info.isDir()) {
		return true;
	}
	QString name = info.fileName();
	int pos = name.lastIndexOf(".");
	if (-1 == pos) {
		return false;
	}
	return PlayQueueModel::constFileExtensions.contains(name.mid(pos + 1).toLower());
}

bool FileSystemProxyModel::lessThan(const QModelIndex& left, const QModelIndex& right) const
{
	QFileInfo l = m->fileInfo(left);
	QFileInfo r = m->fileInfo(right);

	if (l.isDir() && !r.isDir()) {
		return true;
	}
	if (!l.isDir() && r.isDir()) {
		return false;
	}
	return Utils::compare(l.fileName(), r.fileName()) < 0;
}

LocalBrowseModel::LocalBrowseModel(const QString& name, const QString& title, const QString& descr, const QIcon& icon, QObject* p)
	: QFileSystemModel(p), pathName(name), pathTitle(title), pathDescr(descr), icn(icon)
{
	setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Drives);
}

QVariant LocalBrowseModel::data(const QModelIndex& index, int role) const
{
	if (!index.isValid() || fileInfo(index).absoluteFilePath() == rootPath()) {
		switch (role) {
		case Cantata::Role_TitleText:
			return title();
		case Cantata::Role_SubText:
			return descr();
		case Qt::DecorationRole:
			return icon();
		}
	}

	switch (role) {
	case Qt::DecorationRole: {
		QFileInfo info = fileInfo(index);
		return info.isDir()
				? Icons::self()->folderListIcon
				: MPDConnection::isPlaylist(info.fileName())
				? Icons::self()->playlistListIcon
				: Icons::self()->audioListIcon;
	}
	case Cantata::Role_TitleText:
		return QFileSystemModel::data(index, Qt::DisplayRole);
	case Cantata::Role_SubText: {
		QFileInfo info = fileInfo(index);
		return info.isDir() ? QString() : Utils::formatByteSize(info.size());
	}
	case Cantata::Role_Actions: {
		QVariant v;
		v.setValue(QList<Action*>() << StdActions::self()->replacePlayQueueAction << StdActions::self()->appendToPlayQueueAction);
		return v;
	}
	default:
		return QFileSystemModel::data(index, role);
	}
}

#include "moc_localbrowsemodel.cpp"