23 #include "filepickwidget.h"
25 #include "datapaths.h"
26 #include "filefilter.h"
27 #include "ini/inisection.h"
28 #include "ini/inivariable.h"
29 #include "pathfinder/pathfind.h"
30 #include "serverapi/gamefile.h"
31 #include "templatedpathresolver.h"
32 #include "ui_filepickwidget.h"
33 #include <QFileDialog>
37 DClass<FilePickWidget> :
public Ui::FilePickWidget
42 QSharedPointer< ::FilePickWidget::NeighbourStrategy> neighbourStrategy;
51 d->neighbourStrategy = QSharedPointer<NeighbourStrategy>(
new NeighbourStrategy);
52 d->lblWarning->hide();
53 d->btnBrowse->setIcon(style()->standardIcon(QStyle::SP_DirOpenIcon));
54 this->connect(d->lePath, SIGNAL(editingFinished()), SLOT(emitPathChangedIfChanged()));
55 this->connect(d->lePath, SIGNAL(textEdited(QString)), SLOT(trackEdit()));
58 FilePickWidget::~FilePickWidget()
62 void FilePickWidget::browsePath()
64 QString filepath = QFileDialog::getOpenFileName(
this,
65 tr(
"Doomseeker - choose executable file"),
66 d->lePath->text(), FileFilter::executableFilesFilter());
67 if (!filepath.isEmpty())
69 d->lePath->setText(gDefaultDataPaths->portablizePath(filepath));
74 void FilePickWidget::findPath()
77 if (currentFile.isFile() && d->file.isSameFile(currentFile.fileName()))
79 QString path = PathFind::findGameFile(d->neighbourStrategy->neighbours(), d->file);
82 d->lePath->setText(gDefaultDataPaths->portablizePath(path));
89 bool FilePickWidget::isEmpty()
const
91 return path().trimmed().isEmpty();
94 void FilePickWidget::setFile(
const GameFile &file)
97 d->lblTitle->setText(tr(
"Path to %1 executable:").arg(file.
niceName()));
98 d->btnFind->setVisible(canSearch());
101 void FilePickWidget::setNeighbourStrategy(QSharedPointer<NeighbourStrategy> strategy)
103 d->neighbourStrategy = strategy;
106 QString FilePickWidget::path()
const
108 return d->lePath->text().trimmed();
111 bool FilePickWidget::canSearch()
const
113 return !d->file.fileName().isEmpty();
116 void FilePickWidget::emitPathChangedIfChanged()
125 void FilePickWidget::trackEdit()
130 void FilePickWidget::load(
const IniSection &cfg)
132 d->lePath->setText(cfg[d->file.configName()].valueString());
137 cfg[d->file.configName()].
setValue(d->lePath->text());
140 bool FilePickWidget::validate()
145 if (!path().isEmpty())
147 if (error.isEmpty() && !fileInfo.exists())
148 error = tr(
"File doesn't exist.");
150 if (error.isEmpty() && fileInfo.isDir() && !fileInfo.isBundle())
151 error = tr(
"This is a directory.");
154 d->lblWarning->setVisible(!error.isEmpty());
155 d->lblWarning->setToolTip(error);
156 return error.isEmpty();