diff options
| author | Joel Klinghed <the_jk@yahoo.com> | 2017-07-24 23:43:07 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@yahoo.com> | 2017-07-24 23:43:07 +0200 |
| commit | 2dbfb58efe5e53b56bfda3ed21a3e41562205437 (patch) | |
| tree | 1f37423bc091a66930316add25258d3a934ffc0a /src/gui_qt.cc | |
| parent | 5540079928fd36e656becdbaff7e44138a647ede (diff) | |
Add tools -> Generate CA
Added file field to GuiForm
Diffstat (limited to 'src/gui_qt.cc')
| -rw-r--r-- | src/gui_qt.cc | 109 |
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; } |
