New workaround to focus the selected item in the "output folder" view: As the focus will get lost again when the QFileSystemModel asynchronously loads a directory, we need to focus again on each directory loaded. Though we must stop focusing on the selected item, as soon as the user expands a folder. Otherwise the view would scroll unexpectedly...

This commit is contained in:
LoRd_MuldeR 2012-03-29 01:32:47 +02:00
parent 47f0f1629c
commit 9b41e9c6a9
5 changed files with 486 additions and 452 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -30,7 +30,7 @@
#define VER_LAMEXP_MINOR_LO 4 #define VER_LAMEXP_MINOR_LO 4
#define VER_LAMEXP_TYPE Beta #define VER_LAMEXP_TYPE Beta
#define VER_LAMEXP_PATCH 9 #define VER_LAMEXP_PATCH 9
#define VER_LAMEXP_BUILD 927 #define VER_LAMEXP_BUILD 929
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Tool versions (minimum expected versions!) // Tool versions (minimum expected versions!)

View File

@ -93,7 +93,8 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
m_qaacEncoderAvailable(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll")), m_qaacEncoderAvailable(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll")),
m_accepted(false), m_accepted(false),
m_firstTimeShown(true), m_firstTimeShown(true),
m_OutputFolderViewInitialized(false) m_outputFolderViewInitialized(false),
m_outputFolderViewCentering(false)
{ {
//Init the dialog, from the .ui file //Init the dialog, from the .ui file
setupUi(this); setupUi(this);
@ -169,6 +170,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
connect(outputFolderView, SIGNAL(activated(QModelIndex)), this, SLOT(outputFolderViewClicked(QModelIndex))); connect(outputFolderView, SIGNAL(activated(QModelIndex)), this, SLOT(outputFolderViewClicked(QModelIndex)));
connect(outputFolderView, SIGNAL(pressed(QModelIndex)), this, SLOT(outputFolderViewClicked(QModelIndex))); connect(outputFolderView, SIGNAL(pressed(QModelIndex)), this, SLOT(outputFolderViewClicked(QModelIndex)));
connect(outputFolderView, SIGNAL(entered(QModelIndex)), this, SLOT(outputFolderViewMoved(QModelIndex))); connect(outputFolderView, SIGNAL(entered(QModelIndex)), this, SLOT(outputFolderViewMoved(QModelIndex)));
connect(outputFolderView, SIGNAL(expanded(QModelIndex)), this, SLOT(outputFolderItemExpanded(QModelIndex)));
connect(buttonMakeFolder, SIGNAL(clicked()), this, SLOT(makeFolderButtonClicked())); connect(buttonMakeFolder, SIGNAL(clicked()), this, SLOT(makeFolderButtonClicked()));
connect(buttonGotoHome, SIGNAL(clicked()), SLOT(gotoHomeFolderButtonClicked())); connect(buttonGotoHome, SIGNAL(clicked()), SLOT(gotoHomeFolderButtonClicked()));
connect(buttonGotoDesktop, SIGNAL(clicked()), this, SLOT(gotoDesktopButtonClicked())); connect(buttonGotoDesktop, SIGNAL(clicked()), this, SLOT(gotoDesktopButtonClicked()));
@ -176,6 +178,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
connect(saveToSourceFolderCheckBox, SIGNAL(clicked()), this, SLOT(saveToSourceFolderChanged())); connect(saveToSourceFolderCheckBox, SIGNAL(clicked()), this, SLOT(saveToSourceFolderChanged()));
connect(prependRelativePathCheckBox, SIGNAL(clicked()), this, SLOT(prependRelativePathChanged())); connect(prependRelativePathCheckBox, SIGNAL(clicked()), this, SLOT(prependRelativePathChanged()));
connect(outputFolderEdit, SIGNAL(editingFinished()), this, SLOT(outputFolderEditFinished())); connect(outputFolderEdit, SIGNAL(editingFinished()), this, SLOT(outputFolderEditFinished()));
connect(m_fileSystemModel, SIGNAL(directoryLoaded(QString)), this, SLOT(outputFolderDirectoryLoaded(QString)));
m_outputFolderContextMenu = new QMenu(); m_outputFolderContextMenu = new QMenu();
m_showFolderContextAction = m_outputFolderContextMenu->addAction(QIcon(":/icons/zoom.png"), "N/A"); m_showFolderContextAction = m_outputFolderContextMenu->addAction(QIcon(":/icons/zoom.png"), "N/A");
m_outputFolderFavoritesMenu = new QMenu(); m_outputFolderFavoritesMenu = new QMenu();
@ -1431,13 +1434,13 @@ void MainWindow::tabPageChanged(int idx)
} }
else if(idx == tabWidget->indexOf(tabOutputDir)) else if(idx == tabWidget->indexOf(tabOutputDir))
{ {
if(!m_OutputFolderViewInitialized) if(!m_outputFolderViewInitialized)
{ {
QTimer::singleShot(0, this, SLOT(initOutputFolderModel())); QTimer::singleShot(125, this, SLOT(initOutputFolderModel()));
} }
else else
{ {
QTimer::singleShot(0, this, SLOT(centerOutputFolderModel())); QTimer::singleShot(125, this, SLOT(centerOutputFolderModel()));
} }
} }
@ -2515,7 +2518,7 @@ void MainWindow::makeFolderButtonClicked(void)
{ {
outputFolderView->setCurrentIndex(m_fileSystemModel->index(createdDir.canonicalPath())); outputFolderView->setCurrentIndex(m_fileSystemModel->index(createdDir.canonicalPath()));
outputFolderViewClicked(outputFolderView->currentIndex()); outputFolderViewClicked(outputFolderView->currentIndex());
outputFolderView->setFocus(); QTimer::singleShot(125, this, SLOT(centerOutputFolderModel()));
} }
} }
else else
@ -2625,16 +2628,18 @@ void MainWindow::outputFolderEditFinished(void)
{ {
ok = true; ok = true;
outputFolderView->setCurrentIndex(index); outputFolderView->setCurrentIndex(index);
outputFolderViewClicked(index);
break; break;
} }
} }
else if(info.exists() && info.isFile()) else if(info.exists() && info.isFile())
{ {
QModelIndex index = m_fileSystemModel->index(QFileInfo(info.canonicalFilePath()).absoluteFilePath()); QModelIndex index = m_fileSystemModel->index(QFileInfo(info.canonicalPath()).absoluteFilePath());
if(index.isValid()) if(index.isValid())
{ {
ok = true; ok = true;
outputFolderView->setCurrentIndex(index); outputFolderView->setCurrentIndex(index);
outputFolderViewClicked(index);
break; break;
} }
} }
@ -2643,6 +2648,8 @@ void MainWindow::outputFolderEditFinished(void)
} }
if(!ok) MessageBeep(MB_ICONERROR); if(!ok) MessageBeep(MB_ICONERROR);
QTimer::singleShot(125, this, SLOT(centerOutputFolderModel()));
outputFolderEdit->setVisible(false); outputFolderEdit->setVisible(false);
outputFolderLabel->setVisible(true); outputFolderLabel->setVisible(true);
outputFolderView->setEnabled(true); outputFolderView->setEnabled(true);
@ -2654,22 +2661,46 @@ void MainWindow::outputFolderEditFinished(void)
*/ */
void MainWindow::initOutputFolderModel(void) void MainWindow::initOutputFolderModel(void)
{ {
//QModelIndex previousIndex = outputFolderView->currentIndex();
//outputFolderView->reset();
//QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//outputFolderView->setCurrentIndex(previousIndex);
//QTimer::singleShot(125, this, SLOT(centerOutputFolderModel()));
m_fileSystemModel->setRootPath(""); m_fileSystemModel->setRootPath("");
QTimer::singleShot(333, this, SLOT(centerOutputFolderModel())); QTimer::singleShot(125, this, SLOT(centerOutputFolderModel()));
m_OutputFolderViewInitialized = true; m_outputFolderViewInitialized = true;
} }
/*
* Center current folder in view
*/
void MainWindow::centerOutputFolderModel(void) void MainWindow::centerOutputFolderModel(void)
{ {
outputFolderView->scrollTo(outputFolderView->currentIndex(), QAbstractItemView::PositionAtCenter); if(outputFolderView->isVisible())
{
m_outputFolderViewCentering = true;
const QModelIndex index = outputFolderView->currentIndex();
QApplication::processEvents();
outputFolderView->scrollTo(index, QAbstractItemView::PositionAtCenter);
outputFolderView->setFocus(); outputFolderView->setFocus();
} }
}
/*
* File system model asynchronously loaded a dir
*/
void MainWindow::outputFolderDirectoryLoaded(const QString &path)
{
//We need to center again, because the focus on the current item gets lost when a dir is loaded asynchronously!
if(m_outputFolderViewCentering)
{
QTimer::singleShot(125, this, SLOT(centerOutputFolderModel()));
}
}
/*
* Directory view item was expanded by user
*/
void MainWindow::outputFolderItemExpanded(const QModelIndex &item)
{
//We need to stop centering as soon as the user has expanded an item manually!
m_outputFolderViewCentering = false;
}
// ========================================================= // =========================================================
// Metadata tab slots // Metadata tab slots

View File

@ -105,7 +105,9 @@ private slots:
void notifyOtherInstance(void); void notifyOtherInstance(void);
void openFolderActionActivated(void); void openFolderActionActivated(void);
void outputFolderContextMenu(const QPoint &pos); void outputFolderContextMenu(const QPoint &pos);
void outputFolderDirectoryLoaded(const QString &path);
void outputFolderEditFinished(void); void outputFolderEditFinished(void);
void outputFolderItemExpanded(const QModelIndex &item);
void outputFolderViewClicked(const QModelIndex &index); void outputFolderViewClicked(const QModelIndex &index);
void outputFolderViewMoved(const QModelIndex &index); void outputFolderViewMoved(const QModelIndex &index);
void playlistEnabledChanged(void); void playlistEnabledChanged(void);
@ -161,7 +163,8 @@ private:
bool m_accepted; bool m_accepted;
bool m_firstTimeShown; bool m_firstTimeShown;
bool m_OutputFolderViewInitialized; bool m_outputFolderViewInitialized;
bool m_outputFolderViewCentering;
const bool m_neroEncoderAvailable; const bool m_neroEncoderAvailable;
const bool m_fhgEncoderAvailable; const bool m_fhgEncoderAvailable;