mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-16 07:55:41 +00:00
581400937d
See https://bugreports.qt-project.org/browse/QTBUG-34132 * [QTBUG-34132] QFileDialog does no longer instantiate widgets if a native dialog will be used instead. Therefore some accessors which previously returned unused objects will now return null. As before, you can set the DontUseNativeDialog option to ensure that widgets will be created and used instead. Seemingly, Qt uses native dialogs by default starting from version 5.2.0. When trying to open a file dialog, LyX segfaults in release mode, whereas Qt asserts in debug mode: ASSERT failure in QList<T>::at: "index out of range", file /usr/local/qt/5.2.0/include/QtCore/qlist.h, line 472 This is avoided by explicitly setting the DontUseNativeDialog option in the code path selected by *not* setting USE_NATIVE_FILEDIALOG. This option was introduced in Qt 4.5, which is the minimum required for compiling LyX. So, it is not protected by a preprocessor macro.
90 lines
1.9 KiB
C++
90 lines
1.9 KiB
C++
/**
|
|
* \file LyXFileDialog.cpp
|
|
* This file is part of LyX, the document processor.
|
|
* Licence details can be found in the file COPYING.
|
|
*
|
|
* \author John Levon
|
|
*
|
|
* Full author contact details are available in file CREDITS.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include "LyXFileDialog.h"
|
|
|
|
#include "qt_helpers.h"
|
|
|
|
#include "support/lstrings.h"
|
|
|
|
#include <QApplication>
|
|
#include <QToolButton>
|
|
#include <QHBoxLayout>
|
|
|
|
using namespace std;
|
|
using namespace lyx::support;
|
|
|
|
namespace lyx {
|
|
|
|
/// return the Qt form of the label
|
|
static QString getLabel(QString const & qstr)
|
|
{
|
|
// FIXME UNICODE (or "qt-ify")
|
|
string str = fromqstr(qstr);
|
|
string label;
|
|
string sc = split(str, label, '|');
|
|
if (sc.length() < 2)
|
|
return toqstr(label);
|
|
size_t pos = label.find(sc[1]);
|
|
if (pos != string::npos)
|
|
label.insert(pos, 1, '&');
|
|
return toqstr(label);
|
|
}
|
|
|
|
|
|
LyXFileDialog::LyXFileDialog(QString const & title,
|
|
QString const & path,
|
|
QStringList const & filters,
|
|
FileDialog::Button const & b1,
|
|
FileDialog::Button const & b2)
|
|
// FIXME replace that with guiApp->currentView()
|
|
: QFileDialog(qApp->focusWidget(), title, path)
|
|
{
|
|
setNameFilters(filters);
|
|
setWindowTitle(title);
|
|
setOption(QFileDialog::DontUseNativeDialog);
|
|
|
|
QList<QHBoxLayout *> layout = findChildren<QHBoxLayout *>();
|
|
|
|
if (!b1.first.isEmpty()) {
|
|
b1_dir_ = b1.second;
|
|
QToolButton * tb = new QToolButton(this);
|
|
connect(tb, SIGNAL(clicked()), this, SLOT(button1Clicked()));
|
|
tb->setText(getLabel(b1.first));
|
|
layout.at(0)->addWidget(tb);
|
|
}
|
|
|
|
if (!b2.first.isEmpty()) {
|
|
b2_dir_ = b2.second;
|
|
QToolButton * tb = new QToolButton(this);
|
|
connect(tb, SIGNAL(clicked()), this, SLOT(button2Clicked()));
|
|
tb->setText(getLabel(b2.first));
|
|
layout.at(0)->addWidget(tb);
|
|
}
|
|
}
|
|
|
|
|
|
void LyXFileDialog::button1Clicked()
|
|
{
|
|
setDirectory(b1_dir_);
|
|
}
|
|
|
|
|
|
void LyXFileDialog::button2Clicked()
|
|
{
|
|
setDirectory(b2_dir_);
|
|
}
|
|
|
|
} // namespace lyx
|
|
|
|
#include "moc_LyXFileDialog.cpp"
|