30 m_functionWidget(nullptr),
31 m_songSearchWidget(nullptr)
105 inNeed.remove(item.m_itemIndex);
108 if(!inNeed.isEmpty())
113 for(
const int item :
qAsConst(inNeed))
136 case MUSIC_RECENT_LIST:
158 return inNeed.isEmpty();
163 for(
int i = 0; i < items.count(); ++i)
183 const QFileInfo fin(path);
191 files << fin.absoluteFilePath();
206 if(item->
m_songs.contains(song))
220 files << fin.absoluteFilePath();
242 progress.
setTitle(tr(
"Import file mode"));
243 progress.setRange(0, files.count());
249 for(
const QString &path :
qAsConst(files))
256 progress.setValue(++i);
303 if(playlistRow < 0 || playlistRow >=
m_containerItems.count() || path.isEmpty())
309 for(
int i = 0; i < songs->count(); ++i)
327 if(index < 0 || index >= songs->count())
332 return songs->at(index).path();
343 if(row >= result.count() || row < 0)
435 message.
setText(tr(
"Are you sure to delete?"));
447 m_items.front().m_itemWidget->setExpand(
false);
465 message.
setText(tr(
"Are you sure to delete?"));
474 m_items.front().m_itemWidget->setExpand(
false);
499 if(widget->rowCount() > 0)
501 widget->setCurrentCell(0, 1);
672 for(
int i = 0; i < searchedSongs.count(); ++i)
693 for(
int i = 0; i < searchedSongs.count(); ++i)
695 if(searchedSongs[i].contains(text, Qt::CaseInsensitive))
721 if(lastPlayIndex.count() != 3)
727 const int index = lastPlayIndex[2].toInt();
753 if(item->
m_songs.removeOne(song))
789 if(item->
m_songs.removeOne(song))
807 int index = it->
m_songs.indexOf(song);
813 index = it->
m_songs.count() - 1;
832 QStringList files(items);
837 const MusicSongList *musicSongs = &item->
m_songs;
840 int index = musicSongs->count() - 1;
841 if(musicSongs->contains(song))
843 index = musicSongs->indexOf(song);
860 QStringList deleteFiles;
861 for(
int i = index.count() - 1; i >= 0; --i)
864 deleteFiles << song.
path();
869 if(playIndex > -1 && playIndex < songs.count())
871 if(songs[playIndex] == song)
896 for(
int i = start; i > end; --i)
903 for(
int i = start; i < end; ++i)
936 if(!songs.isEmpty() && index < songs.count())
951 if(songs->isEmpty() || index >= songs->count())
958 MusicSongList *recentSongs = &item->
m_songs;
960 if(!recentSongs->contains(recentSong))
964 recentSongs->takeFirst();
968 recentSong.setPlayCount(recentSong.playCount() + 1);
969 recentSongs->append(recentSong);
972 const QString title(QString(
"%1[%2]").arg(item->
m_itemName).arg(recentSongs->count()));
979 if(recentSong == song)
981 song.setPlayCount(song.playCount() + 1);
1040 for(
int i = 0; i < songs->count(); ++i)
1042 (*songs)[i].setSort(sort);
1047 std::sort(songs->begin(), songs->end());
1051 std::sort(songs->begin(), songs->end(), std::greater<MusicSong>());
1057 index = songs->indexOf(song);
1101 MusicSongsToolBoxWidget::resizeEvent(event);
1107 MusicSongsToolBoxWidget::dragEnterEvent(event);
1108 event->setDropAction(Qt::IgnoreAction);
1114 MusicSongsToolBoxWidget::dragMoveEvent(event);
1123 item.m_itemWidget->isActive();
1126 event->setDropAction(Qt::CopyAction);
1132 MusicSongsToolBoxWidget::dropEvent(event);
1134 QStringList dirs, files;
1135 const QMimeData *data =
event->mimeData();
1137 for(
const QUrl &url : data->urls())
1139 const QString &path = url.toLocalFile();
1140 if(QFileInfo(path).isDir())
1150 bool contains =
false;
1158 if(item.m_itemWidget->isExpand() || item.m_itemWidget->isActive())
1171 for(
const QString &dir :
qAsConst(dirs))
1186 MusicSongsToolBoxWidget::contextMenuEvent(event);
1190 menu.addAction(tr(
"Create Item"),
this, SLOT(
addNewRowItem()));
1198 menu.exec(QCursor::pos());
1219 QString check =
name;
1225 if(check == item.m_itemName)
1228 check = name + QString::number(i);
1279 const QString title(QString(
"%1[%2]").arg(item->
m_itemName).arg(item->
m_songs.count()));
1320 item.m_itemWidget->setPlaylistRow(index);
1323 TTK::IndexPropertyList
items;
1337 for(
int i = begin; i < end; ++i)
1339 items << TTK::IndexProperty(i + 1, i);
1344 for(
int i = end; i > begin; --i)
1346 items << TTK::IndexProperty(i, i - 1);
#define TTKStaticCast(x, y)
TTK_MODULE_EXPORT QByteArray md5(const QByteArray &data)
The class of the search result data item.
static MusicApplication * instance()
virtual void setVisible(bool visible) overridefinal
void setText(const QString &text) const
#define QtContainerSwap(p, i, j)
Container swap.
void addSongToLovestList(bool state=true)
MusicSongItemList m_containerItems
QString path() const noexcept
void playIndexBy(int row)
The class of the messagebox widget.
#define MUSIC_RECENT_LIST
#define TTKGenerateSingleWidget(...)
void removeItemAt(const QStringList &path, bool remove, bool current, int playlistRow)
void importSongsByDir(int index=TTK_LOW_LEVEL)
bool hasSearchResult() const noexcept
The class of the index property.
TTKSearchItems m_searchResultItems
static void popup(const QString &text)
void clearSearchResult() noexcept
TTK_MODULE_EXPORT QString pefix(const QString &name)
TTK_MODULE_EXPORT QString generateNetworkSongPath(const QString &path)
TTK_MODULE_EXPORT bool isNetworkUrl(const QString &path) noexcept
TTK_MODULE_EXPORT bool playlistRowValid(int index) noexcept
void importSongsByFiles(int index=TTK_LOW_LEVEL)
MusicAbstractSongsListTableWidget * m_itemWidget
void playIndexClicked(int row, int column)
TTK_MODULE_EXPORT QFileInfoList fileInfoListByPath(const QString &dpath, const QStringList &filter={}, bool recursively=true)
TTK_MODULE_EXPORT QString splitToken(const QString &name)
static const QString MenuStyle02
The class of the music song item.
#define MUSIC_NETWORK_LIST
#define MUSIC_LOVEST_LIST
void setPlayCount(const int c) noexcept
TTK_MODULE_EXPORT QStringList fileListByPath(const QString &dpath, const QStringList &filter={}, bool recursively=true)
#define TTK_FILE_SUFFIX(fin)
The class of the music song info.
The class of the song search widget.
void removeLoveItemAt(const QString &path, bool current)
#define MUSIC_NORMAL_LIST
int playCount() const noexcept
TTK_MODULE_EXPORT MusicSongList generateSongList(const QString &path)
#define TTKObjectCast(x, y)