summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@yahoo.com>2017-07-28 22:05:37 +0200
committerJoel Klinghed <the_jk@yahoo.com>2017-07-28 22:11:23 +0200
commit29d3d1cef5272f5cba1fe573b664ea6059f05eda (patch)
tree9a3b346b75cf6464def9c73b8efddc74ae955060
parent0898066430e0f2908565a1b4588e50de2d41a256 (diff)
Add GuiMain::file_dialog
-rw-r--r--src/gui_file.hh25
-rw-r--r--src/gui_form.hh9
-rw-r--r--src/gui_gtk.cc66
-rw-r--r--src/gui_main.hh7
-rw-r--r--src/gui_qt.cc81
-rw-r--r--src/monitor-gui.cc10
6 files changed, 134 insertions, 64 deletions
diff --git a/src/gui_file.hh b/src/gui_file.hh
new file mode 100644
index 0000000..74d2fee
--- /dev/null
+++ b/src/gui_file.hh
@@ -0,0 +1,25 @@
+// -*- mode: c++; c-basic-offset: 2; -*-
+
+#ifndef GUI_FILE_HH
+#define GUI_FILE_HH
+
+#include <string>
+#include <vector>
+
+class GuiFile {
+public:
+ struct Filter {
+ std::string name;
+ std::vector<std::string> masks;
+ };
+ static const uint8_t FILE_OPEN;
+ static const uint8_t FILE_SAVE;
+
+private:
+ GuiFile() {}
+ ~GuiFile() {}
+ GuiFile(GuiFile const&) = delete;
+ GuiFile& operator=(GuiFile const&) = delete;
+};
+
+#endif // GUI_FILE_HH
diff --git a/src/gui_form.hh b/src/gui_form.hh
index 1c65ee6..4bb8251 100644
--- a/src/gui_form.hh
+++ b/src/gui_form.hh
@@ -6,6 +6,7 @@
#include <string>
#include <vector>
+#include "gui_file.hh"
#include "gui_window.hh"
class GuiForm : public GuiWindow {
@@ -29,16 +30,10 @@ public:
virtual void add_number(std::string const& id, std::string const& label,
uint64_t value,
std::string const& description) = 0;
- struct Filter {
- std::string name;
- std::vector<std::string> masks;
- };
- static const uint8_t FILE_OPEN;
- static const uint8_t FILE_SAVE;
virtual void add_file(std::string const& id, std::string const& label,
std::string const& value,
std::string const& description, uint8_t flags,
- std::vector<Filter> const& filter) = 0;
+ std::vector<GuiFile::Filter> const& filter) = 0;
virtual void add_bool(std::string const& id, std::string const& label,
bool value, std::string const& description) = 0;
diff --git a/src/gui_gtk.cc b/src/gui_gtk.cc
index 301b92f..12972cf 100644
--- a/src/gui_gtk.cc
+++ b/src/gui_gtk.cc
@@ -573,6 +573,18 @@ private:
std::unordered_map<std::string, std::string> memory_;
};
+void set_filter(GtkFileChooser* chooser,
+ std::vector<GuiFile::Filter> const& filters) {
+ for (auto const& filter : filters) {
+ auto f = gtk_file_filter_new();
+ gtk_file_filter_set_name(f, filter.name.c_str());
+ for (auto const& mask : filter.masks) {
+ gtk_file_filter_add_pattern(f, mask.c_str());
+ }
+ gtk_file_chooser_add_filter(chooser, f);
+ }
+}
+
class GtkGuiMain : public virtual GuiMain, public GtkGuiWindow {
public:
GtkGuiMain(std::string const& title, uint32_t width, uint32_t height)
@@ -697,6 +709,32 @@ public:
gtk_target_entry_free(target);
}
+ std::string file_dialog(std::string const& title, std::string const& file,
+ uint8_t flags,
+ std::vector<GuiFile::Filter> const& filter) override {
+ auto chooser = gtk_file_chooser_native_new(
+ title.c_str(),
+ reinterpret_cast<GtkWindow*>(impl()),
+ flags & GuiFile::FILE_SAVE ? GTK_FILE_CHOOSER_ACTION_SAVE
+ : GTK_FILE_CHOOSER_ACTION_OPEN,
+ nullptr, nullptr);
+ if (flags & GuiFile::FILE_SAVE) {
+ gtk_file_chooser_set_do_overwrite_confirmation(
+ GTK_FILE_CHOOSER(chooser), true);
+ }
+ if (file.empty()) {
+ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser), file.c_str());
+ }
+ set_filter(GTK_FILE_CHOOSER(chooser), filter);
+ std::string ret_file;
+ auto ret = gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser));
+ if (ret == GTK_RESPONSE_ACCEPT) {
+ ret_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
+ }
+ gtk_widget_destroy(GTK_WIDGET(chooser));
+ return ret_file;
+ }
+
private:
bool notify_about_to_exit() {
auto it = observers_.notify();
@@ -935,7 +973,7 @@ public:
std::string const& value,
std::string const& description,
uint8_t flags,
- std::vector<Filter> const& filter) override {
+ std::vector<GuiFile::Filter> const& filter) override {
values_.emplace_back(new FileValue(this, id, label, description, value,
flags, filter));
}
@@ -1004,7 +1042,7 @@ public:
for (auto const& value : values_) {
if (value->id_ == id && value->type_ == FILE) {
auto v = static_cast<FileValue*>(value.get());
- if ((v->flags_ & FILE_SAVE) == 0 && v->chooser_) {
+ if ((v->flags_ & GuiFile::FILE_SAVE) == 0 && v->chooser_) {
std::string ret;
auto file = gtk_file_chooser_get_filename(v->chooser_);
if (file) {
@@ -1079,7 +1117,8 @@ public:
label = nullptr;
}
if (value->type_ != FILE
- || (static_cast<FileValue*>(value.get())->flags_ & FILE_SAVE)) {
+ || (static_cast<FileValue*>(value.get())
+ ->flags_ & GuiFile::FILE_SAVE)) {
value->entry_ = gtk_entry_new();
gtk_entry_set_activates_default(GTK_ENTRY(value->entry_), true);
}
@@ -1104,7 +1143,7 @@ public:
}
case FILE: {
auto v = static_cast<FileValue*>(value.get());
- if ((v->flags_ & FILE_SAVE) == 0) {
+ if ((v->flags_ & GuiFile::FILE_SAVE) == 0) {
assert(!value->entry_);
value->entry_ = gtk_file_chooser_button_new(
v->label_.c_str(), GTK_FILE_CHOOSER_ACTION_OPEN);
@@ -1130,14 +1169,7 @@ public:
if (!v->value_.empty()) {
gtk_file_chooser_set_filename(v->chooser_, v->value_.c_str());
}
- for (auto const& filter : v->filter_) {
- auto f = gtk_file_filter_new();
- gtk_file_filter_set_name(f, filter.name.c_str());
- for (auto const& mask : filter.masks) {
- gtk_file_filter_add_pattern(f, mask.c_str());
- }
- gtk_file_chooser_add_filter(v->chooser_, f);
- }
+ set_filter(v->chooser_, v->filter_);
break;
}
case BOOLEAN:
@@ -1200,7 +1232,7 @@ public:
break;
case FILE: {
auto v = static_cast<FileValue*>(value.get());
- if ((v->flags_ & FILE_SAVE) == 0) {
+ if ((v->flags_ & GuiFile::FILE_SAVE) == 0) {
auto file = gtk_file_chooser_get_filename(v->chooser_);
if (file) {
v->value_ = file;
@@ -1273,13 +1305,13 @@ protected:
struct FileValue : public Value {
std::string value_;
uint8_t flags_;
- std::vector<Filter> filter_;
+ std::vector<GuiFile::Filter> filter_;
GtkFileChooser* chooser_;
GtkWidget* button_;
FileValue(GtkGuiForm* me, std::string const& id, std::string const& label,
std::string const& description, std::string const& value,
- uint8_t flags, std::vector<Filter> const& filter)
+ uint8_t flags, std::vector<GuiFile::Filter> const& filter)
: Value(me, FILE, id, label, description), value_(value),
flags_(flags), filter_(filter), chooser_(nullptr), button_(nullptr) {
}
@@ -2079,8 +2111,8 @@ GuiForm* GuiForm::create(std::string const& title,
}
// static
-uint8_t const GuiForm::FILE_OPEN = 0;
-uint8_t const GuiForm::FILE_SAVE = 1;
+uint8_t const GuiFile::FILE_OPEN = 0;
+uint8_t const GuiFile::FILE_SAVE = 1;
// static
GuiFormApply* GuiFormApply::create(std::string const& title,
diff --git a/src/gui_main.hh b/src/gui_main.hh
index 83c0f8d..3b98b71 100644
--- a/src/gui_main.hh
+++ b/src/gui_main.hh
@@ -8,6 +8,7 @@
#include <string>
#include "gui_attrtext.hh"
+#include "gui_file.hh"
#include "gui_window.hh"
class Config;
@@ -62,6 +63,12 @@ public:
virtual Config* config() = 0;
+ virtual std::string file_dialog(
+ std::string const& title,
+ std::string const& file,
+ uint8_t flags,
+ std::vector<GuiFile::Filter> const& filter) = 0;
+
protected:
GuiMain() {}
};
diff --git a/src/gui_qt.cc b/src/gui_qt.cc
index 77e292e..c032c87 100644
--- a/src/gui_qt.cc
+++ b/src/gui_qt.cc
@@ -362,6 +362,34 @@ private:
std::unordered_map<std::string, std::string> memory_;
};
+QString show_file_dialog(QWidget* parent, std::string const& title,
+ QString const& value, uint8_t flags,
+ std::vector<GuiFile::Filter> const& filters) {
+ QString filter;
+ for (auto const& f : filters) {
+ 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 (!(flags & GuiFile::FILE_SAVE)) {
+ return QFileDialog::getOpenFileName(
+ parent, QString::fromStdString(title), value, filter);
+ } else {
+ return QFileDialog::getSaveFileName(
+ parent, QString::fromStdString(title), value, filter);
+ }
+}
+
class QtGuiMain : public GuiMain, public QtGuiWindow {
public:
QtGuiMain(std::string const& title, uint32_t width, uint32_t height)
@@ -489,6 +517,14 @@ public:
return config_.get();
}
+ std::string file_dialog(std::string const& title, std::string const& file,
+ uint8_t flags,
+ std::vector<GuiFile::Filter> const& filter) override {
+ auto ret = show_file_dialog(main_.get(), title, QString::fromStdString(file),
+ flags, filter);
+ return ret.isNull() ? "" : ret.toStdString();
+ }
+
private:
static bool valid_utf8(std::string const& data) {
QTextCodec::ConverterState state;
@@ -859,7 +895,7 @@ public:
std::string const& value,
std::string const& description,
uint8_t flags,
- std::vector<Filter> const& filter) override {
+ std::vector<GuiFile::Filter> const& filter) override {
values_.emplace_back(new FileValue(id, label, description, value,
flags, filter));
}
@@ -1014,13 +1050,13 @@ protected:
struct FileValue : public Value {
std::string value_;
uint8_t flags_;
- std::vector<Filter> filter_;
+ std::vector<GuiFile::Filter> filter_;
QPushButton* button_;
FileValue(std::string const& id, std::string const& label,
std::string const& description,
std::string const& value,
- uint8_t flags, std::vector<Filter> const& filter)
+ uint8_t flags, std::vector<GuiFile::Filter> const& filter)
: Value(FILE, id, label, description), value_(value),
flags_(flags), filter_(filter), button_(nullptr) {
}
@@ -1202,36 +1238,11 @@ protected:
}
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->flags_ & FILE_SAVE)) {
- 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);
- }
+ auto file = show_file_dialog(dialog_, value->label_,
+ value->edit_->text(), value->flags_,
+ value->filter_);
+ if (!file.isNull()) {
+ value->edit_->setText(file);
}
}
@@ -1697,8 +1708,8 @@ GuiForm* GuiForm::create(std::string const& title,
}
// static
-uint8_t const GuiForm::FILE_OPEN = 0;
-uint8_t const GuiForm::FILE_SAVE = 1;
+uint8_t const GuiFile::FILE_OPEN = 0;
+uint8_t const GuiFile::FILE_SAVE = 1;
// static
GuiFormApply* GuiFormApply::create(std::string const& title,
diff --git a/src/monitor-gui.cc b/src/monitor-gui.cc
index 3494855..4f6b21d 100644
--- a/src/monitor-gui.cc
+++ b/src/monitor-gui.cc
@@ -714,7 +714,7 @@ public:
mitm,
"If enabled SSL connections will be intercepted"
" by the proxy to log unencrypted traffic.");
- std::vector<GuiFormApply::Filter> filter;
+ std::vector<GuiFile::Filter> filter;
filter.emplace_back();
filter.back().name = "PEM";
filter.back().masks.emplace_back("*.pem");
@@ -722,7 +722,7 @@ public:
main_->config()->get("ssl-ca",
main_->config()->get("genca-output", "")),
"CA and key to sign all fake server certificates with",
- GuiForm::FILE_OPEN, filter);
+ GuiFile::FILE_OPEN, filter);
connect_->enable("ssl-ca", mitm);
filter.back().name = "CRT";
filter.back().masks.emplace_back("*.crt");
@@ -730,7 +730,7 @@ public:
main_->config()->get("ssl-certs",
default_cert_bundle()),
"Certificate bundle to verify remote SSL connections",
- GuiForm::FILE_OPEN, filter);
+ GuiFile::FILE_OPEN, filter);
connect_->enable("ssl-certs", mitm);
connect_->add_bool("unsecure", "Allow unsecure remote connections",
main_->config()->get("unsecure", false),
@@ -822,13 +822,13 @@ public:
dlg->add_string("issuer", "Issuer name",
main_->config()->get("issuer", ""),
"Issuer name to user instead of default.");
- std::vector<GuiFormApply::Filter> filter;
+ std::vector<GuiFile::Filter> filter;
filter.emplace_back();
filter.back().name = "PEM";
filter.back().masks.emplace_back("*.pem");
dlg->add_file("output", "File", "",
"File to save certificate and key pair to.",
- GuiForm::FILE_SAVE, filter);
+ GuiFile::FILE_SAVE, filter);
dlg->add_listener(lst.get());
dlg->show(main_.get());
#endif // HAVE_SSL