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