summaryrefslogtreecommitdiff
path: root/src/gui_qt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui_qt.cc')
-rw-r--r--src/gui_qt.cc109
1 files changed, 100 insertions, 9 deletions
diff --git a/src/gui_qt.cc b/src/gui_qt.cc
index 596ddda..59dc5e1 100644
--- a/src/gui_qt.cc
+++ b/src/gui_qt.cc
@@ -7,6 +7,7 @@
#include <QClipboard>
#include <QCloseEvent>
#include <QDialogButtonBox>
+#include <QFileDialog>
#include <QGridLayout>
#include <QHeaderView>
#include <QIntValidator>
@@ -850,6 +851,15 @@ public:
values_.emplace_back(new NumberValue(id, label, description, value));
}
+ void add_file(std::string const& id, std::string const& label,
+ std::string const& value,
+ std::string const& description,
+ bool must_exist,
+ std::vector<Filter> const& filter) override {
+ values_.emplace_back(new FileValue(id, label, description, value,
+ must_exist, filter));
+ }
+
std::string get_string(std::string const& id) const override {
for (auto const& value : values_) {
if (value->id_ == id && value->type_ == STRING) {
@@ -879,6 +889,19 @@ public:
return 0;
}
+ std::string get_file(std::string const& id) const override {
+ for (auto const& value : values_) {
+ if (value->id_ == id && value->type_ == FILE) {
+ if (value->edit_) {
+ return value->edit_->text().toStdString();
+ }
+ return static_cast<FileValue*>(value.get())->value_;
+ }
+ }
+ assert(false);
+ return "";
+ }
+
void set_error(std::string const& error) override {
if (!error_) {
assert(false);
@@ -900,6 +923,7 @@ protected:
enum Type {
STRING,
NUMBER,
+ FILE,
};
struct Value {
@@ -936,6 +960,20 @@ protected:
}
};
+ struct FileValue : public Value {
+ std::string value_;
+ bool must_exist_;
+ std::vector<Filter> filter_;
+
+ FileValue(std::string const& id, std::string const& label,
+ std::string const& description,
+ std::string const& value,
+ bool must_exist, std::vector<Filter> const& filter)
+ : Value(FILE, id, label, description), value_(value),
+ must_exist_(must_exist), filter_(filter) {
+ }
+ };
+
static bool get_number(QLineEdit* edit, uint64_t* number) {
assert(edit && number);
auto text = edit->text().toStdString();
@@ -956,7 +994,7 @@ protected:
int row = 0;
if (!text_.empty()) {
auto text = new QLabel(QString::fromStdString(text_));
- layout->addWidget(text, row++, 0, 1, 2);
+ layout->addWidget(text, row++, 0, 1, 3);
}
for (auto& value : values_) {
auto label = new QLabel(QString::fromStdString(value->label_));
@@ -975,20 +1013,35 @@ protected:
edit->setValidator(new QIntValidator(
0, std::numeric_limits<int>::max(), edit));
}
+ case FILE:
+ edit->setText(QString::fromStdString(
+ static_cast<FileValue*>(value.get())->value_));
+ break;
}
layout->addWidget(label, row, 0);
- layout->addWidget(edit, row, 1);
+ if (value->type_ == FILE) {
+ auto button = new QPushButton("...");
+ edit->setReadOnly(true);
+ dialog_->connect(button, &QPushButton::clicked,
+ [this,&value](bool UNUSED(checked)) {
+ showFileDialog(static_cast<FileValue*>(value.get()));
+ });
+ layout->addWidget(edit, row, 1);
+ layout->addWidget(button, row, 2);
+ } else {
+ layout->addWidget(edit, row, 1, 1, 2);
+ }
++row;
if (!value->description_.empty()) {
auto desc = new QLabel(
QString::fromStdString("<i>" + value->description_ + "</i>"));
desc->setAlignment(Qt::AlignTrailing);
desc->setWordWrap(true);
- layout->addWidget(desc, row++, 0, 1, 2);
+ layout->addWidget(desc, row++, 0, 1, 3);
}
}
error_ = new QLabel();
- layout->addWidget(error_, row++, 0, 1, 2);
+ layout->addWidget(error_, row++, 0, 1, 3);
error_->hide();
buttons_ = new QDialogButtonBox(QDialogButtonBox::Ok |
QDialogButtonBox::Cancel);
@@ -996,8 +1049,8 @@ protected:
dialog_, &QDialog::accept);
dialog_->connect(buttons_, &QDialogButtonBox::rejected,
dialog_, &QDialog::reject);
- layout->addWidget(buttons_, row++, 0, 1, 2);
- add_extra_widgets(layout, row);
+ layout->addWidget(buttons_, row++, 0, 1, 3);
+ add_extra_widgets(layout, row, 3);
dialog_->setLayout(layout);
auto ret = dialog_->exec();
for (auto& value : values_) {
@@ -1009,6 +1062,10 @@ protected:
case NUMBER:
get_number(value->edit_,
&static_cast<NumberValue*>(value.get())->value_);
+ case FILE:
+ static_cast<FileValue*>(value.get())->value_ =
+ value->edit_->text().toStdString();
+ break;
}
value->edit_ = nullptr;
}
@@ -1028,13 +1085,47 @@ protected:
return true;
}
- virtual int add_extra_widgets(QGridLayout*, int row) {
+ virtual int add_extra_widgets(QGridLayout*, int row, int UNUSED(columns)) {
return row;
}
virtual void reset_extra_widgets() {
}
+ void showFileDialog(FileValue* value) {
+ QString filter;
+ for (auto const& f : value->filter_) {
+ if (!filter.isEmpty()) filter.append(";;");
+ filter.append(QString::fromStdString(f.name));
+ filter.append(" (");
+ bool first = true;
+ for (auto const& mask : f.masks) {
+ if (first) {
+ first = false;
+ } else {
+ filter.append(' ');
+ }
+ filter.append(QString::fromStdString(mask));
+ }
+ filter.append(')');
+ }
+ if (value->must_exist_) {
+ auto file = QFileDialog::getOpenFileName(
+ dialog_, QString::fromStdString(value->label_),
+ value->edit_->text(), filter);
+ if (!file.isNull()) {
+ value->edit_->setText(file);
+ }
+ } else {
+ auto file = QFileDialog::getSaveFileName(
+ dialog_, QString::fromStdString(value->label_),
+ value->edit_->text(), filter);
+ if (!file.isNull()) {
+ value->edit_->setText(file);
+ }
+ }
+ }
+
std::string title_;
std::string text_;
Observers<GuiForm::Listener*> observers_;
@@ -1070,7 +1161,7 @@ public:
}
private:
- int add_extra_widgets(QGridLayout* layout, int row) override {
+ int add_extra_widgets(QGridLayout* layout, int row, int columns) override {
assert(buttons_);
if (buttons_) {
auto ok = buttons_->button(QDialogButtonBox::Ok);
@@ -1080,7 +1171,7 @@ private:
progress_ = new QProgressBar();
progress_->setMinimum(0);
progress_->setMaximum(0);
- layout->addWidget(progress_, row++, 0, 1, 2);
+ layout->addWidget(progress_, row++, 0, 1, columns);
progress_->hide();
return row;
}