diff options
| -rw-r--r-- | src/gui_gtk.cc | 94 |
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_); } |
