1 #include "library/dlganalysis.h"
2 
3 #include <QSqlTableModel>
4 
5 #include "analyzer/analyzerprogress.h"
6 #include "library/dao/trackschema.h"
7 #include "library/library.h"
8 #include "library/trackcollectionmanager.h"
9 #include "moc_dlganalysis.cpp"
10 #include "util/assert.h"
11 #include "widget/wanalysislibrarytableview.h"
12 #include "widget/wlibrary.h"
13 #include "widget/wskincolor.h"
14 #include "widget/wwidget.h"
15 
DlgAnalysis(WLibrary * parent,UserSettingsPointer pConfig,Library * pLibrary)16 DlgAnalysis::DlgAnalysis(WLibrary* parent,
17                        UserSettingsPointer pConfig,
18                        Library* pLibrary)
19         : QWidget(parent),
20           m_pConfig(pConfig),
21           m_bAnalysisActive(false) {
22     setupUi(this);
23     m_songsButtonGroup.addButton(radioButtonRecentlyAdded);
24     m_songsButtonGroup.addButton(radioButtonAllSongs);
25 
26     m_pAnalysisLibraryTableView = new WAnalysisLibraryTableView(
27             this,
28             pConfig,
29             pLibrary->trackCollections(),
30             parent->getTrackTableBackgroundColorOpacity());
31     connect(m_pAnalysisLibraryTableView,
32             &WAnalysisLibraryTableView::loadTrack,
33             this,
34             &DlgAnalysis::loadTrack);
35     connect(m_pAnalysisLibraryTableView,
36             &WAnalysisLibraryTableView::loadTrackToPlayer,
37             this,
38             &DlgAnalysis::loadTrackToPlayer);
39 
40     connect(m_pAnalysisLibraryTableView,
41             &WAnalysisLibraryTableView::trackSelected,
42             this,
43             &DlgAnalysis::trackSelected);
44 
45     QBoxLayout* box = qobject_cast<QBoxLayout*>(layout());
46     VERIFY_OR_DEBUG_ASSERT(box) { // Assumes the form layout is a QVBox/QHBoxLayout!
47     } else {
48         box->removeWidget(m_pTrackTablePlaceholder);
49         m_pTrackTablePlaceholder->hide();
50         box->insertWidget(1, m_pAnalysisLibraryTableView);
51     }
52 
53     m_pAnalysisLibraryTableModel = new AnalysisLibraryTableModel(this, pLibrary->trackCollections());
54     m_pAnalysisLibraryTableView->loadTrackModel(m_pAnalysisLibraryTableModel);
55 
56     connect(radioButtonRecentlyAdded,
57             &QRadioButton::clicked,
58             this,
59             &DlgAnalysis::showRecentSongs);
60     connect(radioButtonAllSongs,
61             &QRadioButton::clicked,
62             this,
63             &DlgAnalysis::showAllSongs);
64     // Don't click those radio buttons now reduce skin loading time.
65     // 'RecentlyAdded' is clicked in onShow()
66 
67     connect(pushButtonAnalyze,
68             &QPushButton::clicked,
69             this,
70             &DlgAnalysis::analyze);
71     pushButtonAnalyze->setEnabled(false);
72 
73     connect(pushButtonSelectAll,
74             &QPushButton::clicked,
75             this,
76             &DlgAnalysis::selectAll);
77 
78     connect(m_pAnalysisLibraryTableView->selectionModel(),
79             &QItemSelectionModel::selectionChanged,
80             this,
81             &DlgAnalysis::tableSelectionChanged);
82 
83     connect(pLibrary,
84             &Library::setTrackTableFont,
85             m_pAnalysisLibraryTableView,
86             &WAnalysisLibraryTableView::setTrackTableFont);
87     connect(pLibrary,
88             &Library::setTrackTableRowHeight,
89             m_pAnalysisLibraryTableView,
90             &WAnalysisLibraryTableView::setTrackTableRowHeight);
91     connect(pLibrary,
92             &Library::setSelectedClick,
93             m_pAnalysisLibraryTableView,
94             &WAnalysisLibraryTableView::setSelectedClick);
95 
96     slotAnalysisActive(m_bAnalysisActive);
97 }
98 
onShow()99 void DlgAnalysis::onShow() {
100     if (!radioButtonRecentlyAdded->isChecked() &&
101             !radioButtonAllSongs->isChecked()) {
102         radioButtonRecentlyAdded->click();
103     }
104     // Refresh table
105     // There might be new tracks dropped to other views
106     m_pAnalysisLibraryTableModel->select();
107 }
108 
hasFocus() const109 bool DlgAnalysis::hasFocus() const {
110     return m_pAnalysisLibraryTableView->hasFocus();
111 }
112 
onSearch(const QString & text)113 void DlgAnalysis::onSearch(const QString& text) {
114     m_pAnalysisLibraryTableModel->search(text);
115 }
116 
loadSelectedTrack()117 void DlgAnalysis::loadSelectedTrack() {
118     m_pAnalysisLibraryTableView->loadSelectedTrack();
119 }
120 
loadSelectedTrackToGroup(const QString & group,bool play)121 void DlgAnalysis::loadSelectedTrackToGroup(const QString& group, bool play) {
122     m_pAnalysisLibraryTableView->loadSelectedTrackToGroup(group, play);
123 }
124 
slotAddToAutoDJBottom()125 void DlgAnalysis::slotAddToAutoDJBottom() {
126     // append to auto DJ
127     m_pAnalysisLibraryTableView->slotAddToAutoDJBottom();
128 }
129 
slotAddToAutoDJTop()130 void DlgAnalysis::slotAddToAutoDJTop() {
131     m_pAnalysisLibraryTableView->slotAddToAutoDJTop();
132 }
133 
slotAddToAutoDJReplace()134 void DlgAnalysis::slotAddToAutoDJReplace() {
135     m_pAnalysisLibraryTableView->slotAddToAutoDJReplace();
136 }
137 
moveSelection(int delta)138 void DlgAnalysis::moveSelection(int delta) {
139     m_pAnalysisLibraryTableView->moveSelection(delta);
140 }
141 
tableSelectionChanged(const QItemSelection & selected,const QItemSelection & deselected)142 void DlgAnalysis::tableSelectionChanged(const QItemSelection& selected,
143                                        const QItemSelection& deselected) {
144     Q_UNUSED(selected);
145     Q_UNUSED(deselected);
146     bool tracksSelected = m_pAnalysisLibraryTableView->selectionModel()->hasSelection();
147     pushButtonAnalyze->setEnabled(tracksSelected || m_bAnalysisActive);
148 }
149 
selectAll()150 void DlgAnalysis::selectAll() {
151     m_pAnalysisLibraryTableView->selectAll();
152 }
153 
analyze()154 void DlgAnalysis::analyze() {
155     //qDebug() << this << "analyze()";
156     if (m_bAnalysisActive) {
157         emit stopAnalysis();
158     } else {
159         QList<TrackId> trackIds;
160 
161         QModelIndexList selectedIndexes = m_pAnalysisLibraryTableView->selectionModel()->selectedRows();
162         foreach(QModelIndex selectedIndex, selectedIndexes) {
163             TrackId trackId(selectedIndex.sibling(
164                 selectedIndex.row(),
165                 m_pAnalysisLibraryTableModel->fieldIndex(LIBRARYTABLE_ID)).data());
166             if (trackId.isValid()) {
167                 trackIds.append(trackId);
168             }
169         }
170         emit analyzeTracks(trackIds);
171     }
172 }
173 
slotAnalysisActive(bool bActive)174 void DlgAnalysis::slotAnalysisActive(bool bActive) {
175     //qDebug() << this << "slotAnalysisActive" << bActive;
176     m_bAnalysisActive = bActive;
177     if (bActive) {
178         pushButtonAnalyze->setChecked(true);
179         pushButtonAnalyze->setText(tr("Stop Analysis"));
180         labelProgress->setEnabled(true);
181     } else {
182         pushButtonAnalyze->setChecked(false);
183         pushButtonAnalyze->setText(tr("Analyze"));
184         labelProgress->setText("");
185         labelProgress->setEnabled(false);
186     }
187 }
188 
onTrackAnalysisSchedulerProgress(AnalyzerProgress analyzerProgress,int finishedCount,int totalCount)189 void DlgAnalysis::onTrackAnalysisSchedulerProgress(
190         AnalyzerProgress analyzerProgress, int finishedCount, int totalCount) {
191     //qDebug() << this << "onTrackAnalysisSchedulerProgress" << analyzerProgress << finishedCount << totalCount;
192     if (labelProgress->isEnabled()) {
193         QString progressText;
194         if (analyzerProgress >= kAnalyzerProgressNone) {
195             QString progressPercent = QString::number(
196                     analyzerProgressPercent(analyzerProgress));
197             progressText = tr("Analyzing %1% %2/%3").arg(
198                     progressPercent,
199                     QString::number(finishedCount),
200                     QString::number(totalCount));
201         } else {
202             // Omit to display any percentage
203             progressText = tr("Analyzing %1/%2").arg(
204                     QString::number(finishedCount),
205                     QString::number(totalCount));
206         }
207         labelProgress->setText(progressText);
208     }
209 }
210 
onTrackAnalysisSchedulerFinished()211 void DlgAnalysis::onTrackAnalysisSchedulerFinished() {
212     slotAnalysisActive(false);
213 }
214 
showRecentSongs()215 void DlgAnalysis::showRecentSongs() {
216     m_pAnalysisLibraryTableModel->showRecentSongs();
217 }
218 
showAllSongs()219 void DlgAnalysis::showAllSongs() {
220     m_pAnalysisLibraryTableModel->showAllSongs();
221 }
222 
installEventFilter(QObject * pFilter)223 void DlgAnalysis::installEventFilter(QObject* pFilter) {
224     QWidget::installEventFilter(pFilter);
225     m_pAnalysisLibraryTableView->installEventFilter(pFilter);
226 }
227