namespace lyx {
namespace frontend {
+namespace {
-void GuiLyXFiles::getFiles(QMap<QString, QString> & in, QString const type)
+QString const guiString(QString in)
{
+ // recode specially encoded chars in file names (URL encoding and underbar)
+ return QString(QByteArray::fromPercentEncoding(in.toUtf8())).replace('_', ' ');
+}
+
+} // namespace anon
+
+
+QMap<QString, QString> GuiLyXFiles::getFiles()
+{
+ QMap<QString, QString> result;
// We look for lyx files in the subdirectory dir of
// 1) user_lyxdir
// 2) build_lyxdir (if not empty)
QStringList relpaths;
// The three locations to look at.
- string const user = addPath(package().user_support().absFileName(), fromqstr(type));
- string const build = addPath(package().build_support().absFileName(), fromqstr(type));
- string const system = addPath(package().system_support().absFileName(), fromqstr(type));
+ string const user = addPath(package().user_support().absFileName(), fromqstr(type_));
+ string const build = addPath(package().build_support().absFileName(), fromqstr(type_));
+ string const system = addPath(package().system_support().absFileName(), fromqstr(type_));
available_languages_.insert(toqstr("en"), qt_("English"));
- // Search in the base path
- dirs << toqstr(user)
- << toqstr(build)
- << toqstr(system);
+ QString const type = fileTypeCO->itemData(fileTypeCO->currentIndex()).toString();
+
+ // Search in the base paths
+ if (type == "all" || type == "user")
+ dirs << toqstr(user);
+ if (type == "all" || type == "system")
+ dirs << toqstr(build)
+ << toqstr(system);
for (int i = 0; i < dirs.size(); ++i) {
QString const dir = dirs.at(i);
available_languages_.insert(li.key(), li.value());
localization = cat;
int sc = relpath.indexOf('/', s + 1);
- cat = (sc == -1) ? QString() : relpath.mid(s + 1, sc - s - 1);
+ cat = (sc == -1) ? qt_("General") : relpath.mid(s + 1, sc - s - 1);
s = sc;
}
if (s != -1) {
if (localization != "en")
// strip off lang/
relpath = relpath.mid(relpath.indexOf('/') + 1);
- in.insert(relpath, cat);
+ result.insert(relpath, cat);
QMap<QString, QString> lm;
if (localizations_.contains(relpath))
// pre-fill the language combo (it will be updated once an item
// has been clicked)
languageCO->clear();
- languageCO->addItem(qt_("English"), toqstr("en"));
QMap<QString, QString>::const_iterator i =available_languages_.constBegin();
while (i != available_languages_.constEnd()) {
languageCO->addItem(i.value(), i.key());
}
setLanguage();
languageLA->setText(qt_("Preferred &Language:"));
+ return result;
}
//filesLW->setViewMode(QListView::ListMode);
filesLW->setIconSize(QSize(22, 22));
+ QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png"));
+ QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png"));
+ fileTypeCO->addItem(qt_("User and System Files"), toqstr("all"));
+ fileTypeCO->addItem(user_icon, qt_("User Files Only"), toqstr("user"));
+ fileTypeCO->addItem(system_icon, qt_("System Files Only"), toqstr("system"));
+
setFocusProxy(filter_);
}
{
if (type_ == "bind" || type_ == "ui")
return toqstr(".") + type_;
+ else if (type_ == "kbd")
+ return ".kmap";
return ".lyx";
}
void GuiLyXFiles::setLanguage()
{
+ // Enable language selection only if there is a selection.
+ languageCO->setEnabled(languageCO->count() > 1);
+ languageLA->setEnabled(languageCO->count() > 1);
// first try last setting
if (!savelang_.isEmpty()) {
int index = languageCO->findData(savelang_);
void GuiLyXFiles::on_browsePB_pressed()
{
- bool const examples = (type_ == "examples");
- FileDialog dlg(qt_("Select template file"));
- dlg.setButton1(qt_("D&ocuments"), toqstr(lyxrc.document_path));
- if (examples)
- dlg.setButton2(qt_("&Examples"), toqstr(lyxrc.example_path));
- else
- dlg.setButton2(qt_("&Templates"), toqstr(lyxrc.template_path));
+ QString path1 = toqstr(lyxrc.document_path);
+ QString path2 = toqstr(lyxrc.example_path);
+ QString title = qt_("Select example file");
+ QString filter = qt_("LyX Documents (*.lyx)");
+ QString b1 = qt_("D&ocuments");
+ QString b2 = qt_("&Examples");
+
+ if (type_ == "templates") {
+ path2 = toqstr(lyxrc.template_path);
+ title = qt_("Select template file");
+ b1 = qt_("D&ocuments");
+ b2 = qt_("&Templates");
+ }
+ else if (type_ != "examples") {
+ path1 = toqstr(addName(package().user_support().absFileName(), fromqstr(type_)));
+ path2 = toqstr(addName(package().system_support().absFileName(), fromqstr(type_)));
+ b1 = qt_("&User files");
+ b2 = qt_("&System files");
+ }
+ if (type_ == "ui") {
+ title = qt_("Chose UI file");
+ filter = qt_("LyX UI Files (*.ui)");
+ }
+ if (type_ == "bind") {
+ title = qt_("Chose bind file");
+ filter = qt_("LyX Bind Files (*.bind)");
+ }
+ if (type_ == "kbd") {
+ title = qt_("Chose keyboard map");
+ filter = qt_("LyX Keymap Files (*.kmap)");
+ }
+
+ FileDialog dlg(title);
+ dlg.setButton1(b1, path1);
+ dlg.setButton2(b2, path2);
- FileDialog::Result result = dlg.open(examples ? toqstr(lyxrc.example_path)
- : toqstr(lyxrc.template_path),
- QStringList(qt_("LyX Documents (*.lyx)")));
+ FileDialog::Result result = dlg.open(path2, QStringList(filter));
if (result.first != FileDialog::Later && !result.second.isEmpty()) {
file_ = toqstr(FileName(fromqstr(result.second)).absFileName());
void GuiLyXFiles::updateContents()
{
- QString type = fileTypeCO->itemData(fileTypeCO->currentIndex()).toString();
- QMap<QString, QString> files;
languageCO->clear();
- getFiles(files, type);
+ QMap<QString, QString> files = getFiles();
languageCO->model()->sort(0);
filesLW->clear();
catsave = cat;
cat = catsave.left(catsave.indexOf('/'));
subcat = toqstr(translateIfPossible(
- qstring_to_ucs4(catsave.mid(
- catsave.indexOf('/') + 1).replace('_', ' '))));
+ qstring_to_ucs4(guiString(catsave.mid(catsave.indexOf('/') + 1)))));
}
- cat = toqstr(translateIfPossible(qstring_to_ucs4(cat.replace('_', ' '))));
+ cat = toqstr(translateIfPossible(qstring_to_ucs4(guiString(cat))));
QTreeWidgetItem * catItem = new QTreeWidgetItem();
if (!cats.contains(cat)) {
catItem->setText(0, cat);
QTreeWidgetItem * item = new QTreeWidgetItem();
QString const filename = info.fileName();
QString guiname = filename.left(filename.lastIndexOf(getSuffix())).replace('_', ' ');
- if (translateName())
- guiname = toqstr(translateIfPossible(qstring_to_ucs4(guiname)));
+ // Special case: defaults.lyx
+ if (type_ == "templates" && guiname == "defaults")
+ guiname = qt_("Default Template");
+ else if (translateName())
+ guiname = toqstr(translateIfPossible(qstring_to_ucs4(guiString(guiname))));
QIcon file_icon = (realpath.startsWith(toqstr(package().user_support().absFileName()))) ?
user_icon : system_icon;
item->setIcon(0, file_icon);
}
+void GuiLyXFiles::passParams(string const & data)
+{
+ initialiseParams(data);
+ updateContents();
+}
+
+
+void GuiLyXFiles::selectItem(QString const item)
+{
+ /* Using an intermediary variable flags is needed up to at least
+ * Qt 5.5 because of a subtle namespace issue. See:
+ * https://stackoverflow.com/questions/10755058/qflags-enum-type-conversion-fails-all-of-a-sudden
+ * for details.*/
+ Qt::MatchFlags const flags(Qt::MatchExactly|Qt::MatchRecursive);
+ QList<QTreeWidgetItem *> twi = filesLW->findItems(item, flags);
+ if (!twi.isEmpty())
+ twi.first()->setSelected(true);
+}
+
+
void GuiLyXFiles::paramsToDialog()
{
- fileTypeCO->clear();
- if (type_ == "examples" || type_ == "templates") {
- fileTypeCO->addItem(qt_("Templates"), toqstr("templates"));
- fileTypeCO->addItem(qt_("Examples"), toqstr("examples"));
- } else if (type_ == "ui")
- fileTypeCO->addItem(qt_("User Interface Files"), toqstr("ui"));
- else if (type_ == "bind")
- fileTypeCO->addItem(qt_("Key Binding Files"), toqstr("bind"));
-
- if (!type_.isEmpty()) {
- int i = fileTypeCO->findData(type_);
- if (i != -1)
- fileTypeCO->setCurrentIndex(i);
- }
if (type_ == "examples")
setTitle(qt_("Open Example File"));
else if (type_ == "templates")
arg += fromqstr(file_);
FuncCode const lfun = getLfun();
- dispatch(FuncRequest(lfun, arg));
+ if (lfun == LFUN_NOACTION)
+ // emit signal
+ fileSelected(file_);
+ else
+ dispatch(FuncRequest(lfun, arg));
}