summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gui_gtk.cc94
1 files changed, 65 insertions, 29 deletions
diff --git a/src/gui_gtk.cc b/src/gui_gtk.cc
index 96fa7a0..39016c1 100644
--- a/src/gui_gtk.cc
+++ b/src/gui_gtk.cc
@@ -1031,7 +1031,8 @@ private:
class GtkGuiForm : public virtual GuiForm, public GtkGuiWindow {
public:
GtkGuiForm(std::string const& title, std::string const& text)
- : title_(title), text_(text), dialog_(nullptr), error_(nullptr) {
+ : title_(title), text_(text), dialog_(nullptr), error_(nullptr),
+ grid_(nullptr) {
}
~GtkGuiForm() override {
@@ -1178,10 +1179,16 @@ public:
return;
}
if (error.empty()) {
- gtk_widget_hide(error_);
+ if (gtk_widget_get_parent(error_)) {
+ gtk_grid_remove_row(GTK_GRID(grid_), error_row_);
+ }
} else {
- gtk_widget_show(error_);
gtk_label_set_text(GTK_LABEL(error_), error.c_str());
+ if (!gtk_widget_get_parent(error_)) {
+ gtk_grid_insert_row(GTK_GRID(grid_), error_row_);
+ gtk_grid_attach(GTK_GRID(grid_), error_, 0, error_row_, 3, 1);
+ gtk_widget_show(error_);
+ }
}
}
@@ -1200,20 +1207,25 @@ public:
GTK_RESPONSE_REJECT,
nullptr);
auto content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog_));
- auto grid = gtk_grid_new();
- gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
- gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
+ grid_ = gtk_grid_new();
+ gtk_widget_set_margin_start(grid_, 18);
+ gtk_widget_set_margin_top(grid_, 18);
+ gtk_widget_set_margin_end(grid_, 18);
+ gtk_grid_set_column_spacing(GTK_GRID(grid_), 12);
+ gtk_grid_set_row_spacing(GTK_GRID(grid_), 6);
gint row = 0;
if (!text_.empty()) {
auto label = gtk_label_new(text_.c_str());
- gtk_label_set_width_chars(GTK_LABEL(label), 35);
+ gtk_label_set_width_chars(GTK_LABEL(label), 40);
gtk_label_set_line_wrap(GTK_LABEL(label), true);
- gtk_grid_attach(GTK_GRID(grid), label, 0, row++, 3, 1);
+ gtk_widget_set_margin_bottom(label, 12);
+ gtk_grid_attach(GTK_GRID(grid_), label, 0, row++, 3, 1);
}
for (auto& value : values_) {
GtkWidget* label;
if (value->type_ != BOOLEAN) {
label = gtk_label_new(value->label_.c_str());
+ gtk_widget_set_halign(label, GTK_ALIGN_END);
} else {
label = nullptr;
}
@@ -1299,34 +1311,41 @@ public:
}
gint col = 0;
if (label) {
- gtk_grid_attach(GTK_GRID(grid), label, col++, row, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid_), label, col++, row, 1, 1);
+ } else {
+ col++;
}
gtk_widget_set_sensitive(value->entry_, value->enable_);
if (extra) {
gtk_widget_set_sensitive(extra, value->enable_);
- gtk_grid_attach(GTK_GRID(grid), value->entry_, col, row, 2 - col, 1);
- gtk_grid_attach(GTK_GRID(grid), extra, ++col, row, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid_), value->entry_, col, row, 2 - col, 1);
+ gtk_grid_attach(GTK_GRID(grid_), extra, ++col, row, 1, 1);
} else {
- gtk_grid_attach(GTK_GRID(grid), value->entry_, col, row, 3 - col, 1);
+ gtk_grid_attach(GTK_GRID(grid_), value->entry_, col, row, 3 - col, 1);
}
row++;
if (!value->description_.empty()) {
auto desc = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(desc),
("<i>" + value->description_ + "</i>").c_str());
- gtk_widget_set_halign(GTK_WIDGET(desc), GTK_ALIGN_END);
+ gtk_widget_set_halign(desc, GTK_ALIGN_END);
gtk_label_set_line_wrap(GTK_LABEL(desc), true);
- gtk_label_set_max_width_chars(GTK_LABEL(desc), 35);
- gtk_grid_attach(GTK_GRID(grid), desc, 0, row++, 3, 1);
+ gtk_label_set_max_width_chars(GTK_LABEL(desc), 40);
+ gtk_widget_set_margin_bottom(desc, 6);
+ if (value->type_ != BOOLEAN) {
+ gtk_grid_attach(GTK_GRID(grid_), desc, 1, row++, 2, 1);
+ } else {
+ gtk_grid_attach(GTK_GRID(grid_), desc, 0, row++, 3, 1);
+ }
}
}
error_ = gtk_label_new("");
- gtk_label_set_xalign(GTK_LABEL(error_), 0.0);
- gtk_grid_attach(GTK_GRID(grid), error_, 0, row++, 3, 1);
- gtk_container_add(GTK_CONTAINER(content_area), grid);
+ gtk_widget_set_margin_top(error_, 12);
+ gtk_widget_set_margin_bottom(error_, 12);
+ error_row_ = row;
+ gtk_container_add(GTK_CONTAINER(content_area), grid_);
gtk_widget_show_all(dialog_);
- row = add_extra_widgets(GTK_GRID(grid), row, 3);
- gtk_widget_hide(error_);
+ add_extra_widgets(GTK_GRID(grid_), row, 3);
gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT);
gint result;
do {
@@ -1374,6 +1393,7 @@ public:
gtk_widget_destroy(dialog_);
dialog_ = nullptr;
error_ = nullptr;
+ grid_ = nullptr;
reset_extra_widgets();
return result == GTK_RESPONSE_ACCEPT;
}
@@ -1514,8 +1534,7 @@ protected:
value->me_->notify_changed(value->id_);
}
- virtual gint add_extra_widgets(GtkGrid*, gint row, gint) {
- return row;
+ virtual void add_extra_widgets(GtkGrid*, gint, gint) {
}
virtual void reset_extra_widgets() {
@@ -1531,6 +1550,8 @@ protected:
Observers<GuiForm::Listener*> observers_;
GtkWidget* dialog_;
GtkWidget* error_;
+ GtkWidget* grid_;
+ gint error_row_;
};
class GtkGuiFormApply : public GtkGuiForm, public virtual GuiFormApply {
@@ -1545,7 +1566,7 @@ public:
assert(spinner_);
if (spinner_) {
gtk_spinner_stop(GTK_SPINNER(spinner_));
- gtk_widget_hide(spinner_);
+ gtk_grid_remove_row(GTK_GRID(grid_), spinner_row_);
}
assert(dialog_);
if (dialog_) {
@@ -1561,15 +1582,17 @@ public:
}
private:
- gint add_extra_widgets(GtkGrid* layout, gint row, gint colspan) override {
+ void add_extra_widgets(GtkGrid* grid, gint row, gint colspan) override {
assert(!spinner_);
spinner_ = gtk_spinner_new();
- gtk_grid_attach(layout, spinner_, 0, row++, colspan, 1);
- return row;
+ grid_ = GTK_WIDGET(grid);
+ spinner_row_ = row;
+ spinner_colspan_ = colspan;
}
void reset_extra_widgets() override {
spinner_ = nullptr;
+ grid_ = nullptr;
}
char const* accept_button() override {
@@ -1584,8 +1607,11 @@ private:
if (!GtkGuiForm::notify_about_to_close()) return false;
assert(spinner_);
if (spinner_) {
- gtk_widget_show(spinner_);
gtk_spinner_start(GTK_SPINNER(spinner_));
+ gtk_grid_insert_row(GTK_GRID(grid_), spinner_row_);
+ gtk_grid_attach(GTK_GRID(grid_), spinner_, 0, spinner_row_,
+ spinner_colspan_, 1);
+ gtk_widget_show(spinner_);
}
assert(dialog_);
if (dialog_) {
@@ -1606,6 +1632,9 @@ private:
std::string apply_button_;
Delegate* const delegate_;
GtkWidget* spinner_;
+ GtkWidget* grid_;
+ gint spinner_row_;
+ gint spinner_colspan_;
bool applied_;
};
@@ -1889,8 +1918,15 @@ public:
progress_ = gtk_progress_bar_new();
sync_value();
auto content = gtk_dialog_get_content_area(GTK_DIALOG(dialog_));
- gtk_box_pack_start(GTK_BOX(content), label, true, true, 5);
- gtk_box_pack_end(GTK_BOX(content), progress_, true, true, 5);
+ auto grid = gtk_grid_new();
+ gtk_widget_set_margin_start(grid, 18);
+ gtk_widget_set_margin_top(grid, 18);
+ gtk_widget_set_margin_end(grid, 18);
+ gtk_grid_set_column_spacing(GTK_GRID(grid), 12);
+ gtk_grid_set_row_spacing(GTK_GRID(grid), 6);
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid), progress_, 0, 1, 1, 1);
+ gtk_container_add(GTK_CONTAINER(content), grid);
gtk_widget_show_all(dialog_);
}