diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-16 17:42:06 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-10-16 17:42:06 +0000 |
| commit | 6d121794491610ca09441715bd1fa15d88c31890 (patch) | |
| tree | f2b5c8d2778621ad3b7fd5dd11601a248fda7154 /src/qmmpui | |
| parent | 8abc1d73303c4841ff8bbf22d4d6f7994d4ac190 (diff) | |
| download | qmmp-6d121794491610ca09441715bd1fa15d88c31890.tar.gz qmmp-6d121794491610ca09441715bd1fa15d88c31890.tar.bz2 qmmp-6d121794491610ca09441715bd1fa15d88c31890.zip | |
some main menu reorganization
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1941 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/qmmpui')
| -rw-r--r-- | src/qmmpui/mediaplayer.cpp | 84 | ||||
| -rw-r--r-- | src/qmmpui/mediaplayer.h | 21 | ||||
| -rw-r--r-- | src/qmmpui/playlistmanager.cpp | 10 | ||||
| -rw-r--r-- | src/qmmpui/playlistmanager.h | 8 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.cpp | 59 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.h | 27 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_cs.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_de.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_es.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_it.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_ja.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_lt.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_nl.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_pl.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_pt_BR.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_ru.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_tr.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_uk_UA.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_zh_CN.ts | 2 | ||||
| -rw-r--r-- | src/qmmpui/translations/libqmmpui_zh_TW.ts | 2 |
20 files changed, 155 insertions, 82 deletions
diff --git a/src/qmmpui/mediaplayer.cpp b/src/qmmpui/mediaplayer.cpp index cf8a41d46..69a3bbd56 100644 --- a/src/qmmpui/mediaplayer.cpp +++ b/src/qmmpui/mediaplayer.cpp @@ -37,7 +37,7 @@ MediaPlayer::MediaPlayer(QObject *parent) m_core = 0; m_skips = 0; m_repeat = false; - m_autoStop = false; + m_noPlaylistAdvance = false; QTranslator *translator = new QTranslator(parent); QString locale = Qmmp::systemLanguageID(); translator->load(QString(":/libqmmpui_") + locale); @@ -59,7 +59,7 @@ void MediaPlayer::initialize(SoundCore *core, PlayListManager *pl_manager) m_core = core; m_pl_manager = pl_manager; m_repeat = false; - m_autoStop = false; + m_noPlaylistAdvance = false; connect(m_core, SIGNAL(nextTrackRequest()), SLOT(updateNextUrl())); connect(m_core, SIGNAL(finished()), SLOT(playNext())); } @@ -74,9 +74,9 @@ bool MediaPlayer::isRepeatable() const return m_repeat; } -bool MediaPlayer::isAutoStopping() const +bool MediaPlayer::isNoPlaylistAdvance() const { - return m_autoStop; + return m_noPlaylistAdvance; } void MediaPlayer::play(qint64 offset) @@ -181,82 +181,68 @@ void MediaPlayer::previous() void MediaPlayer::setRepeatable(bool r) { - if (!isAutoStopping()) + if (r != m_repeat) { - if (r != m_repeat && !r) - { - disconnect(m_core, SIGNAL(finished()), this, SLOT(play())); - connect(m_core, SIGNAL(finished()), SLOT(playNext())); - } - else if (r != m_repeat && r) + if(r) { disconnect(m_core, SIGNAL(finished()), this, SLOT(playNext())); connect(m_core, SIGNAL(finished()), SLOT(play())); } + else + { + disconnect(m_core, SIGNAL(finished()), this, SLOT(play())); + connect(m_core, SIGNAL(finished()), SLOT(playNext())); + } + m_repeat = r; + emit repeatableChanged(r); } - m_repeat = r; - emit repeatableChanged(r); } void MediaPlayer::playNext() { - if (!m_pl_manager->currentPlayList()->next()) + if(m_noPlaylistAdvance) { stop(); return; } - play(); -} - -void MediaPlayer::setAutoStop(bool enable) -{ - if (enable != m_autoStop) + if (!m_pl_manager->currentPlayList()->next()) { - if(enable) - { - if (m_repeat) - disconnect(m_core, SIGNAL(finished()), this, SLOT(play())); - else - disconnect(m_core, SIGNAL(finished()), this, SLOT(playNext())); - connect(m_core, SIGNAL(finished()), SLOT(autoStop())); - } - else - { - disconnect(m_core, SIGNAL(finished()), this, SLOT(autoStop())); - if (m_repeat) - connect(m_core, SIGNAL(finished()), SLOT(play())); - else - connect(m_core, SIGNAL(finished()), SLOT(playNext())); - } - m_autoStop = enable; - emit autoStopChanged(enable); + stop(); + return; } + play(); } -void MediaPlayer::autoStop() +void MediaPlayer::setNoPlaylistAdvance(bool enabled) { - if (!m_repeat && !m_pl_manager->currentPlayList()->isEmptyQueue()) + if (enabled != m_noPlaylistAdvance) { - playNext(); - return; + m_noPlaylistAdvance = enabled; + emit noPlaylistAdvanceChanged(enabled); } - setAutoStop(false); - stop(); } void MediaPlayer::updateNextUrl() { m_nextUrl.clear(); - if(m_pl_manager->currentPlayList()->nextItem() && !isRepeatable()) + PlayListItem *item = 0; + if(isRepeatable()) + item = m_pl_manager->currentPlayList()->currentItem(); + else if(!m_noPlaylistAdvance) + item = m_pl_manager->currentPlayList()->nextItem(); + + if(item) { - qDebug("MediaPlayer: sending next url"); - bool ok = m_core->play(m_pl_manager->currentPlayList()->nextItem()->url(), true); + bool ok = m_core->play(item->url(), true); if(ok) { m_nextUrl = m_pl_manager->currentPlayList()->nextItem()->url(); - qDebug("MediaPlayer: sending next url - done"); + qDebug("MediaPlayer: next track state: received"); } else - qDebug("MediaPlayer: sending next url - failed"); + qDebug("MediaPlayer: next track state: error"); } + else + qDebug("MediaPlayer: next track state: unknown"); + } diff --git a/src/qmmpui/mediaplayer.h b/src/qmmpui/mediaplayer.h index 3809cdb3c..06c80ec30 100644 --- a/src/qmmpui/mediaplayer.h +++ b/src/qmmpui/mediaplayer.h @@ -60,9 +60,9 @@ public: */ bool isRepeatable() const; /*! - * Returns \b true if "Auto Stop" option is enabled, otherwise returns \b false + * Returns \b true if "No playlist advance" option is enabled, otherwise returns \b false */ - bool isAutoStopping() const; + bool isNoPlaylistAdvance() const; public slots: /*! @@ -87,10 +87,11 @@ public slots: */ void setRepeatable(bool enable); /*! - * Toggles the AutoStop feature. - * @param enable the AutoStop state (\b true - automatic stop, \b false - normal play) + * When finished playing a song, don't automatically advance to the next + * @param enable State of the 'No playlist advance' option + * (\b true - enabled, \b false - normal playback) */ - void setAutoStop(bool enable); + void setNoPlaylistAdvance(bool enable); signals: /*! @@ -98,11 +99,15 @@ signals: * @param enabled New repeate state of the current track (\b true - enabled, \b false - disabled) */ void repeatableChanged(bool enabled); - void autoStopChanged(bool enabled); + /*! + * Emitted when state of the "No playlist advance" option changes. + * @param enabled New state of this option (\b true - no playlist advance, + * \b false - normal playlist behaviour) + */ + void noPlaylistAdvanceChanged(bool enabled); private slots: void playNext(); - void autoStop(); void updateNextUrl(); private: @@ -110,7 +115,7 @@ private: SoundCore *m_core; static MediaPlayer* m_instance; bool m_repeat; - bool m_autoStop; + bool m_noPlaylistAdvance; int m_skips; QString m_nextUrl; }; diff --git a/src/qmmpui/playlistmanager.cpp b/src/qmmpui/playlistmanager.cpp index 784536b6c..1db91cde0 100644 --- a/src/qmmpui/playlistmanager.cpp +++ b/src/qmmpui/playlistmanager.cpp @@ -493,3 +493,13 @@ void PlayListManager::removeDuplicates() { m_selected->removeDuplicates(); } + +void PlayListManager::clearQueue() +{ + m_selected->clearQueue(); +} + +void PlayListManager::stopAfterSelected() +{ + m_selected->stopAfterSelected(); +} diff --git a/src/qmmpui/playlistmanager.h b/src/qmmpui/playlistmanager.h index c1adb2378..de9108055 100644 --- a/src/qmmpui/playlistmanager.h +++ b/src/qmmpui/playlistmanager.h @@ -288,6 +288,14 @@ public slots: * This is a convenience function and is the same as calling \b selectedPlayList()->removeDuplicates() */ void removeDuplicates(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->clearQueue() + */ + void clearQueue(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->stopAfterSelected() + */ + void stopAfterSelected(); private: diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp index 189bcf984..a710073b4 100644 --- a/src/qmmpui/playlistmodel.cpp +++ b/src/qmmpui/playlistmodel.cpp @@ -74,6 +74,7 @@ PlayListModel::PlayListModel(const QString &name, QObject *parent) m_current = 0; is_repeatable_list = false; m_play_state = new NormalPlayState(this); + m_stop_item = 0; } PlayListModel::~PlayListModel() @@ -146,9 +147,11 @@ PlayListItem* PlayListModel::currentItem() } PlayListItem* PlayListModel::nextItem() -{ +{ if(m_items.isEmpty() || !m_play_state) return 0; + if(m_stop_item && m_stop_item == currentItem()) + return 0; if(!isEmptyQueue()) return m_queued_songs.at(0); int index = m_play_state->nextIndex(); @@ -180,6 +183,12 @@ bool PlayListModel::setCurrent(int c) bool PlayListModel::next() { + if(m_stop_item == currentItem()) + { + m_stop_item = 0; + emit listChanged(); + return false; + } if (!isEmptyQueue()) { setCurrentToQueued(); @@ -212,6 +221,7 @@ void PlayListModel::clear() m_running_loaders.clear(); m_current = 0; + m_stop_item = 0; while (!m_items.isEmpty()) { PlayListItem* mf = m_items.takeFirst(); @@ -305,6 +315,8 @@ void PlayListModel::removeAt (int i) if ((i < count()) && (i >= 0)) { PlayListItem* f = m_items.takeAt(i); + if(m_stop_item == f) + m_stop_item = 0; m_total_length -= f->length(); if (m_total_length < 0) m_total_length = qMin(0, m_total_length); @@ -345,6 +357,8 @@ void PlayListModel::removeSelection(bool inverted) if (m_items.at(i)->isSelected() ^ inverted) { PlayListItem* f = m_items.takeAt(i); + if(f == m_stop_item) + m_stop_item = 0; m_total_length -= f->length(); if (m_total_length < 0) m_total_length = 0; @@ -644,6 +658,21 @@ bool PlayListModel::isEmptyQueue() const return m_queued_songs.isEmpty(); } +int PlayListModel::queuedIndex(PlayListItem* item) const +{ + return m_queued_songs.indexOf(item); +} + +int PlayListModel::queueSize() const +{ + return m_queued_songs.size(); +} + +bool PlayListModel::isStopAfter(PlayListItem* item) const +{ + return m_stop_item == item; +} + void PlayListModel::randomizeList() { for (int i = 0;i < m_items.size();i++) @@ -943,3 +972,31 @@ void PlayListModel::removeDuplicates() } } } + +void PlayListModel::clearQueue() +{ + m_queued_songs.clear(); + m_stop_item = 0; + emit listChanged(); +} + +void PlayListModel::stopAfterSelected() +{ + QList<PlayListItem*> selected_items = getSelectedItems(); + if(!m_queued_songs.isEmpty()) + { + m_stop_item = m_stop_item != m_queued_songs.last() ? m_queued_songs.last() : 0; + } + else if(selected_items.count() == 1) + { + m_stop_item = m_stop_item != selected_items.at(0) ? selected_items.at(0) : 0; + } + else if(selected_items.count() > 1) + { + addToQueue(); + m_stop_item = m_queued_songs.last(); + } + else + return; + emit listChanged(); +} diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h index d6eb3c4f4..ac5668ffa 100644 --- a/src/qmmpui/playlistmodel.h +++ b/src/qmmpui/playlistmodel.h @@ -184,11 +184,11 @@ public: */ QStringList getTimes(int first,int last); /*! - * Moves the item at index position \b from to index position \b to + * Moves the item at index position \b from to index position \b to. */ void moveItems(int from, int to); /*! - * Returns \b true if \b f file is in play queue, else returns \b false + * Returns \b true if \b f file is in play queue, otherwise returns \b false. */ bool isQueued(PlayListItem* item) const; /*! @@ -202,17 +202,15 @@ public: /*! * Returns index of \b f file in queue.e */ - int queuedIndex(PlayListItem* item) const - { - return m_queued_songs.indexOf(item); - } + int queuedIndex(PlayListItem* item) const; /*! * Returns the number of items in the queue */ - int queueSize() const - { - return m_queued_songs.size(); - } + int queueSize() const; + /*! + * Returns \b true if playback stops after \b item, otherwise returns \b false. + */ + bool isStopAfter(PlayListItem* item) const; /*! * Returns current selection(playlist can contain a lot of selections, * this method returns selection which \b row belongs to) @@ -413,6 +411,14 @@ public slots: * Removes duplicate items by URL. */ void removeDuplicates(); + /*! + * Removes all items from queue. + */ + void clearQueue(); + /*! + * Toggles 'stop after selected' feature. + */ + void stopAfterSelected(); private: /*! @@ -448,6 +454,7 @@ private: QList <PlayListItem*> m_items; QList <PlayListItem*> m_editing_items; PlayListItem* m_currentItem; + PlayListItem* m_stop_item; int m_current; /*! * This flyweight object represents current selection. diff --git a/src/qmmpui/translations/libqmmpui_cs.ts b/src/qmmpui/translations/libqmmpui_cs.ts index 07fd33f2c..9e82d56c7 100644 --- a/src/qmmpui/translations/libqmmpui_cs.ts +++ b/src/qmmpui/translations/libqmmpui_cs.ts @@ -84,7 +84,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Souborový dialog Qt</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_de.ts b/src/qmmpui/translations/libqmmpui_de.ts index bf5d9274a..5de695ebc 100644 --- a/src/qmmpui/translations/libqmmpui_de.ts +++ b/src/qmmpui/translations/libqmmpui_de.ts @@ -84,7 +84,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Qt Datei-Dialog</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_es.ts b/src/qmmpui/translations/libqmmpui_es.ts index 8541c3baf..c9aeebbea 100644 --- a/src/qmmpui/translations/libqmmpui_es.ts +++ b/src/qmmpui/translations/libqmmpui_es.ts @@ -84,7 +84,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Diálogo de archivos Qt</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_it.ts b/src/qmmpui/translations/libqmmpui_it.ts index be3f22bc7..c4c709c9b 100644 --- a/src/qmmpui/translations/libqmmpui_it.ts +++ b/src/qmmpui/translations/libqmmpui_it.ts @@ -84,7 +84,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Menu brani Qt</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_ja.ts b/src/qmmpui/translations/libqmmpui_ja.ts index 41b76f1f4..1dfe56557 100644 --- a/src/qmmpui/translations/libqmmpui_ja.ts +++ b/src/qmmpui/translations/libqmmpui_ja.ts @@ -84,7 +84,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Qtファイルダイアログ</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_lt.ts b/src/qmmpui/translations/libqmmpui_lt.ts index 4080bf130..e720b714e 100644 --- a/src/qmmpui/translations/libqmmpui_lt.ts +++ b/src/qmmpui/translations/libqmmpui_lt.ts @@ -84,7 +84,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Qt bylų langas</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_nl.ts b/src/qmmpui/translations/libqmmpui_nl.ts index 3f0604c04..6beed7e84 100644 --- a/src/qmmpui/translations/libqmmpui_nl.ts +++ b/src/qmmpui/translations/libqmmpui_nl.ts @@ -84,7 +84,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Qt Bestandsdialoog</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_pl.ts b/src/qmmpui/translations/libqmmpui_pl.ts index 56e5f3d21..2c6513f8a 100644 --- a/src/qmmpui/translations/libqmmpui_pl.ts +++ b/src/qmmpui/translations/libqmmpui_pl.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Okno dialogowe QT</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_pt_BR.ts b/src/qmmpui/translations/libqmmpui_pt_BR.ts index 7e28cc10f..4a9786cdc 100644 --- a/src/qmmpui/translations/libqmmpui_pt_BR.ts +++ b/src/qmmpui/translations/libqmmpui_pt_BR.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation type="unfinished"></translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_ru.ts b/src/qmmpui/translations/libqmmpui_ru.ts index 57048a403..90caa8f44 100644 --- a/src/qmmpui/translations/libqmmpui_ru.ts +++ b/src/qmmpui/translations/libqmmpui_ru.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Файловый диалог Qt</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_tr.ts b/src/qmmpui/translations/libqmmpui_tr.ts index 191cb0dca..fbb11ef3d 100644 --- a/src/qmmpui/translations/libqmmpui_tr.ts +++ b/src/qmmpui/translations/libqmmpui_tr.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Qt Dosya Diyaloğu</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_uk_UA.ts b/src/qmmpui/translations/libqmmpui_uk_UA.ts index 6ed7602f4..1bcc2efee 100644 --- a/src/qmmpui/translations/libqmmpui_uk_UA.ts +++ b/src/qmmpui/translations/libqmmpui_uk_UA.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Файловий діалог Qt</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_zh_CN.ts b/src/qmmpui/translations/libqmmpui_zh_CN.ts index e48f6ca01..bce778f00 100644 --- a/src/qmmpui/translations/libqmmpui_zh_CN.ts +++ b/src/qmmpui/translations/libqmmpui_zh_CN.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Qmmp 文件会话</translation> </message> diff --git a/src/qmmpui/translations/libqmmpui_zh_TW.ts b/src/qmmpui/translations/libqmmpui_zh_TW.ts index 34f27399f..52cf309c5 100644 --- a/src/qmmpui/translations/libqmmpui_zh_TW.ts +++ b/src/qmmpui/translations/libqmmpui_zh_TW.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } <context> <name>QtFileDialogFactory</name> <message> - <location filename="../qtfiledialog.cpp" line="33"/> + <location filename="../qtfiledialog.cpp" line="34"/> <source>Qt File Dialog</source> <translation>Qmmp 檔案會話</translation> </message> |
