summaryrefslogtreecommitdiffstats
path: root/collectionfoldersview.cpp
blob: e1a96b2069ace23742fa66729ea9a03e58fae209 (plain)
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
#include <QSettings>
#include <QStandardItem>
#include <QDir>
#include <QMimeDatabase>
#include <QMessageBox>
#include <QFileInfo>

#include <taglib/fileref.h>

#include "collectionfoldersview.h"
#include "collectionwidgetproxy.h"

CollectionFoldersView::CollectionFoldersView(QWidget *parent) : CollectionWidget(parent){
    readSettings();
    connect(view(), &BeetView::doubleClicked, this, &CollectionFoldersView::itemDoubleCliced);
}

void CollectionFoldersView::populate(){
    disableSorting();
    model()->clear();
    model()->setHorizontalHeaderLabels(headers());
    QStandardItem *root = model()->invisibleRootItem();
    QDir d(mCurrentFolder);
    QMimeDatabase db;
    QIcon songIcon(":/song.png");
    QIcon otherIcon(":/belly_right_and_clear.png");
    QIcon dirIcon(":/folder.png");
    QFileInfoList fl = d.entryInfoList(QStringList() << "*", QDir::Files | QDir::Dirs | QDir::NoDot, QDir::Name | QDir::DirsFirst);
    for(const QFileInfo &fi : fl){
        QStandardItem *cur = new QStandardItem;
        cur->setEditable(false);
        cur->setText(fi.fileName());
        if(fi.isDir()){
            cur->setIcon(dirIcon);
        }else if(fi.isFile()){
            QMimeType mt = db.mimeTypeForFile(fi);
            if(mt.name().startsWith("audio")){
                cur->setIcon(songIcon);
                cur->setData(Song, TypeRole);
                cur->setData(-1, IdRole);
                TagLib::FileRef file(fi.absoluteFilePath().toUtf8());
                if(!file.isNull()){
                    QString artist = QString::fromStdWString(file.tag()->artist().toWString());
                    cur->setData(artist.toLower(), ArtistRole);
                    QString album = QString::fromStdWString(file.tag()->album().toWString());
                    cur->setData(album.toLower(), AlbumRole);
                    QString genre = QString::fromStdWString(file.tag()->genre().toWString());
                    cur->setData(genre.toLower(), GenreRole);
                    QString title = QString::fromStdWString(file.tag()->title().toWString());
                    cur->setData(title.toLower(), TitleRole);
                }
            }else{
                cur->setIcon(otherIcon);
            }
        }
        cur->setData(fi.absoluteFilePath(), FullPathRole);
        root->appendRow(cur);
    }
    enableSorting();
}

void CollectionFoldersView::readSettings(){
    QSettings s;
    mCurrentFolder = s.value("folderdir", QDir::homePath()).toString();
}

void CollectionFoldersView::itemDoubleCliced(const QModelIndex &idx){
    QDir d(mCurrentFolder);
    if(idx.data().toString() == ".."){
        d.cdUp();
    }else{
        d.cd(idx.data().toString());
    }
    mCurrentFolder = d.absolutePath();
    populate();
}

void CollectionFoldersView::deleteCurrent(){
    QString toDel = QDir::toNativeSeparators(mCurrentFolder);
    toDel.append(QDir::separator());
    toDel.append(view()->currentIndex().data().toString());
    QString msg = QString(tr("Really delete %1?")).arg(toDel);
    CollectionWidgetProxy *proxy = static_cast<CollectionWidgetProxy*>(view()->model());
    int retval = QMessageBox::question(this, tr("Delete"), msg);
    if(retval == QMessageBox::Yes){
        QFileInfo fi(toDel);
        bool success = false;
        if(fi.isDir()){
            QDir d(toDel);
            success = d.removeRecursively();
        }else if(fi.isFile()){
            success = QFile::remove(toDel);
        }
        if(success){
            proxy->removeRow(view()->currentIndex().row());
        }else{
            QString msg = QString(tr("Deleting %1 failed!")).arg(toDel);
            QMessageBox::critical(this, tr("Error"), msg);
        }
    }
}