From b4dee8958f53f489b2a816685badd0a015c33719 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Wed, 13 Jun 2012 23:04:27 +0200 Subject: [PATCH] Rework talkfile creation window. Support selecting multiple folders by replacing the provided path with a tree view that allows selecting multiple entries. The view is limited to the selected mountpoint (i.e. the player) so this removes the possibility of generating talk files for files that are not on the player. However, since Rockbox Utility disables most functionality without an attached player this isn't too much of a problem. Creating a standalone application for talkfile creation that is not limited to the player is possible as well. Change-Id: Ic68e7556f2e2e5b9c121aaba759a42a4d1d9d53a --- rbutil/rbutilqt/installtalkfrm.ui | 254 ++++++++++++-------------- rbutil/rbutilqt/installtalkwindow.cpp | 90 ++++----- rbutil/rbutilqt/installtalkwindow.h | 2 +- 3 files changed, 160 insertions(+), 186 deletions(-) diff --git a/rbutil/rbutilqt/installtalkfrm.ui b/rbutil/rbutilqt/installtalkfrm.ui index de9a199ac7..216a473573 100644 --- a/rbutil/rbutilqt/installtalkfrm.ui +++ b/rbutil/rbutilqt/installtalkfrm.ui @@ -9,15 +9,15 @@ 0 0 - 600 - 450 + 722 + 448 Install Talk Files - + @@ -30,37 +30,48 @@ - - - - Select the Folder to generate Talkfiles for. - - - - - - - Talkfile Folder - - - - - - - &Browse - - - - :/icons/system-search.png:/icons/system-search.png - - - - + - Generation settings + Generation options - + + + + + Strip Extensions + + + false + + + + + + + Generate for files + + + true + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -68,7 +79,27 @@ - + + + + Generate for folders + + + true + + + + + + + Recurse into folders + + + true + + + + @@ -81,49 +112,30 @@ - - - - Qt::Horizontal + + + + Ignore files - - - 40 - 20 - + + + + + + + + + Skip existing - + + true + + - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + @@ -149,86 +161,46 @@ - - - - Generation options + + + + + + + Select folders for Talkfile generation (Ctrl for multiselect) - - - - - - - - Ignore files (comma seperated Wildcards): - - - - - - - Generate .talk files for Files - - - true - - - false - - - - - - - Generate .talk files for Folders - - - true - - - - - - - Run recursive - - - true - - - - - - - Strip Extensions - - - false - - - - - - - Create only new Talkfiles - - - true - - - - + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + - lineTalkFolder - buttonBrowse - change buttonOk buttonCancel + treeView + change + talkFiles + talkFolders + recursive + GenerateOnlyNew + StripExtensions + checkBox + ignoreFiles diff --git a/rbutil/rbutilqt/installtalkwindow.cpp b/rbutil/rbutilqt/installtalkwindow.cpp index de723ae33e..f2e042e2a5 100644 --- a/rbutil/rbutilqt/installtalkwindow.cpp +++ b/rbutil/rbutilqt/installtalkwindow.cpp @@ -28,47 +28,42 @@ InstallTalkWindow::InstallTalkWindow(QWidget *parent) : QDialog(parent) ui.setupUi(this); talkcreator = new TalkFileCreator(this); - connect(ui.buttonBrowse, SIGNAL(clicked()), this, SLOT(browseFolder())); connect(ui.change,SIGNAL(clicked()),this,SLOT(change())); ui.recursive->setChecked(true); ui.GenerateOnlyNew->setChecked(true); ui.StripExtensions->setChecked(true); - updateSettings(); -} + fsm = new QFileSystemModel(this); + QString mp = RbSettings::value(RbSettings::Mountpoint).toString(); + fsm->setRootPath(mp); + ui.treeView->setModel(fsm); + ui.treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); + ui.treeView->setRootIndex(fsm->index(mp)); + qDebug() << fsm->columnCount(); + fsm->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot); + for(int i = 1; i < fsm->columnCount(); i++) + ui.treeView->setColumnHidden(i, true); + ui.treeView->setHeaderHidden(true); -void InstallTalkWindow::browseFolder() -{ - QString selected; - QString startfolder; - if(QFileInfo(ui.lineTalkFolder->text()).isDir()) - { - startfolder = ui.lineTalkFolder->text(); - } - else - { - startfolder = RbSettings::value(RbSettings::Mountpoint).toString(); - } - selected = QFileDialog::getExistingDirectory(this, - tr("Select folder to create talk files"), startfolder); - if(!selected.isEmpty()) - { - ui.lineTalkFolder->setText(selected); - } + updateSettings(); } void InstallTalkWindow::change() { - Config *cw = new Config(this,4); + Config *cw = new Config(this, 4); // make sure the current selected folder doesn't get lost on settings - // changes. If the current selection is invalid don't accept it so - // it gets reset to the old value after closing the settings dialog. - QString folderToTalk = ui.lineTalkFolder->text(); - if(QFileInfo(folderToTalk).isDir()) - RbSettings::setValue(RbSettings::LastTalkedFolder, folderToTalk); + // changes. + QModelIndexList si = ui.treeView->selectionModel()->selectedIndexes(); + QStringList foldersToTalk; + for(int i = 0; i < si.size(); i++) { + if(si.at(i).column() == 0) { + foldersToTalk.append(fsm->filePath(si.at(i))); + } + } + RbSettings::setValue(RbSettings::LastTalkedFolder, foldersToTalk); connect(cw, SIGNAL(settingsUpdated()), this, SLOT(updateSettings())); cw->show(); @@ -78,24 +73,20 @@ void InstallTalkWindow::accept() { logger = new ProgressLoggerGui(this); + QModelIndexList si = ui.treeView->selectionModel()->selectedIndexes(); + QStringList foldersToTalk; + for(int i = 0; i < si.size(); i++) { + if(si.at(i).column() == 0) { + foldersToTalk.append(fsm->filePath(si.at(i))); + } + } connect(logger,SIGNAL(closed()),this,SLOT(close())); logger->show(); - - QString folderToTalk = ui.lineTalkFolder->text(); - - if(!QFileInfo(folderToTalk).isDir()) - { - logger->addItem(tr("The Folder to Talk is wrong!"),LOGERROR); - logger->setFinished(); - return; - } - - RbSettings::setValue(RbSettings::LastTalkedFolder, folderToTalk); + RbSettings::setValue(RbSettings::LastTalkedFolder, foldersToTalk); RbSettings::sync(); - talkcreator->setDir(QDir(folderToTalk)); talkcreator->setMountPoint(RbSettings::value(RbSettings::Mountpoint).toString()); talkcreator->setGenerateOnlyNew(ui.GenerateOnlyNew->isChecked()); @@ -110,7 +101,10 @@ void InstallTalkWindow::accept() connect(talkcreator, SIGNAL(logProgress(int, int)), logger, SLOT(setProgress(int, int))); connect(logger,SIGNAL(aborted()),talkcreator,SLOT(abort())); - talkcreator->createTalkFiles(); + for(int i = 0; i < foldersToTalk.size(); i++) { + talkcreator->setDir(QDir(foldersToTalk.at(i))); + talkcreator->createTalkFiles(); + } } @@ -119,14 +113,22 @@ void InstallTalkWindow::updateSettings(void) QString ttsName = RbSettings::value(RbSettings::Tts).toString(); TTSBase* tts = TTSBase::getTTS(this,ttsName); if(tts->configOk()) - ui.labelTtsProfile->setText(tr("Selected TTS engine: %1") + ui.labelTtsProfile->setText(tr("%1") .arg(TTSBase::getTTSName(ttsName))); else - ui.labelTtsProfile->setText(tr("Selected TTS engine: %1") + ui.labelTtsProfile->setText(tr("%1") .arg("Invalid TTS configuration!")); - ui.lineTalkFolder->setText( - RbSettings::value(RbSettings::LastTalkedFolder).toString()); + QStringList folders = RbSettings::value(RbSettings::LastTalkedFolder).toStringList(); + for(int i = 0; i < folders.size(); ++i) { + QModelIndex mi = fsm->index(folders.at(i)); + ui.treeView->selectionModel()->select(mi, QItemSelectionModel::Select); + // make sure all parent items are expanded. + while((mi = mi.parent()) != QModelIndex()) { + ui.treeView->setExpanded(mi, true); + } + } + emit settingsUpdated(); } diff --git a/rbutil/rbutilqt/installtalkwindow.h b/rbutil/rbutilqt/installtalkwindow.h index acac221af9..ab233955d8 100644 --- a/rbutil/rbutilqt/installtalkwindow.h +++ b/rbutil/rbutilqt/installtalkwindow.h @@ -38,7 +38,6 @@ class InstallTalkWindow : public QDialog void change(void); private slots: - void browseFolder(void); void updateSettings(void); signals: @@ -49,6 +48,7 @@ class InstallTalkWindow : public QDialog TalkFileCreator* talkcreator; Ui::InstallTalkFrm ui; ProgressLoggerGui* logger; + QFileSystemModel *fsm; }; #endif