[geary/mjog/info-bar-cleanup: 3/4] Application.MainWindow: Convert to using InfoBarStack
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/mjog/info-bar-cleanup: 3/4] Application.MainWindow: Convert to using InfoBarStack
- Date: Tue, 17 Mar 2020 07:21:03 +0000 (UTC)
commit 61c8493bdd23e064285a38408dd9715ce9ec78da
Author: Michael Gratton <mike vee net>
Date: Tue Mar 17 16:56:55 2020 +1100
Application.MainWindow: Convert to using InfoBarStack
Use an info bar stack to display info bars, so that at most one is ever
shown. This will prioritise status messages (offline, service/auth/cert
problems) over other misc errors, which means we might miss some, but
I guess that's better than huge stacks of bars?
Fixes #697
May help with #406 as well in cases where there was a service error
prior to going offline.
.../application/application-main-window.vala | 82 +++++++---------------
1 file changed, 25 insertions(+), 57 deletions(-)
---
diff --git a/src/client/application/application-main-window.vala
b/src/client/application/application-main-window.vala
index 4498628a..699151bb 100644
--- a/src/client/application/application-main-window.vala
+++ b/src/client/application/application-main-window.vala
@@ -332,12 +332,8 @@ public class Application.MainWindow :
[GtkChild]
private Gtk.Overlay overlay;
- // This is a frame so users can use F6/Shift-F6 to get to it
- [GtkChild]
- private Gtk.Frame info_bar_frame;
-
- [GtkChild]
- private Gtk.Grid info_bar_container;
+ private Components.InfoBarStack info_bars =
+ new Components.InfoBarStack.exclusive();
private Gtk.InfoBar offline_infobar;
@@ -617,27 +613,15 @@ public class Application.MainWindow :
bool has_auth_error,
bool has_cert_error,
Geary.Account? problem_source) {
- // Only ever show one at a time. Offline is primary since
- // nothing else can happen when offline. Service problems are
- // secondary since auth and cert problems can't be resolved
- // when the service isn't talking to the server. Cert problems
- // are tertiary since you can't auth if you can't connect.
- bool show_offline = false;
- bool show_service = false;
- bool show_cert = false;
- bool show_auth = false;
-
+ // Only ever show one info bar at a time. Offline is primary
+ // since nothing else can happen when offline. Service
+ // problems are secondary since auth and cert problems can't
+ // be resolved when the service isn't talking to the
+ // server. Cert problems are tertiary since you can't auth if
+ // you can't connect.
if (!status.is_online()) {
- show_offline = true;
+ this.info_bars.add(this.offline_infobar);
} else if (status.has_service_problem()) {
- show_service = true;
- } else if (has_cert_error) {
- show_cert = true;
- } else if (has_auth_error) {
- show_auth = true;
- }
-
- if (show_service && this.service_problem_infobar == null) {
Geary.ClientService? service = (
problem_source.incoming.last_error != null
? problem_source.incoming
@@ -651,14 +635,14 @@ public class Application.MainWindow :
)
);
this.service_problem_infobar.retry.connect(on_service_problem_retry);
-
- show_info_bar(this.service_problem_infobar);
+ this.info_bars.add(this.service_problem_infobar);
+ } else if (has_cert_error) {
+ this.info_bars.add(this.cert_problem_infobar);
+ } else if (has_auth_error) {
+ this.info_bars.add(this.auth_problem_infobar);
+ } else {
+ this.info_bars.remove_all();
}
-
- this.offline_infobar.set_visible(show_offline);
- this.cert_problem_infobar.set_visible(show_cert);
- this.auth_problem_infobar.set_visible(show_auth);
- update_infobar_frame();
}
/**
@@ -872,8 +856,9 @@ public class Application.MainWindow :
/** Displays an infobar in the window. */
public void show_info_bar(Gtk.InfoBar info_bar) {
- this.info_bar_container.add(info_bar);
- this.info_bar_frame.show();
+ if (!this.info_bars.has_current) {
+ this.info_bars.add(info_bar);
+ }
}
/** Displays a composer addressed to a specific email address. */
@@ -1269,6 +1254,8 @@ public class Application.MainWindow :
set_titlebar(titlebar);
}
+ this.main_layout.pack_start(this.info_bars, false, true, 0);
+
// Status bar
this.status_bar.set_size_request(-1, STATUS_BAR_HEIGHT);
this.status_bar.set_border_width(2);
@@ -1707,18 +1694,6 @@ public class Application.MainWindow :
this.main_toolbar.folder = this.selected_folder.get_display_name();
}
- private void update_infobar_frame() {
- // Ensure the info bar frame is shown only when it has visible
- // children
- bool show_frame = false;
- this.info_bar_container.foreach((child) => {
- if (child.visible) {
- show_frame = true;
- }
- });
- this.info_bar_frame.set_visible(show_frame);
- }
-
private void update_conversation_actions(ConversationCount count) {
bool sensitive = (count != NONE);
bool multiple = (count == MULTIPLE);
@@ -1958,32 +1933,25 @@ public class Application.MainWindow :
}
private void on_offline_infobar_response() {
- this.offline_infobar.hide();
- update_infobar_frame();
+ this.info_bars.remove(this.offline_infobar);
}
private void on_service_problem_retry() {
+ this.info_bars.remove(this.service_problem_infobar);
this.service_problem_infobar = null;
retry_service_problem(Geary.ClientService.Status.CONNECTION_FAILED);
}
private void on_cert_problem_retry() {
- this.cert_problem_infobar.hide();
- update_infobar_frame();
+ this.info_bars.remove(this.cert_problem_infobar);
retry_service_problem(Geary.ClientService.Status.TLS_VALIDATION_FAILED);
}
private void on_auth_problem_retry() {
- this.auth_problem_infobar.hide();
- update_infobar_frame();
+ this.info_bars.remove(this.auth_problem_infobar);
retry_service_problem(Geary.ClientService.Status.AUTHENTICATION_FAILED);
}
- [GtkCallback]
- private void on_info_bar_container_remove() {
- update_infobar_frame();
- }
-
private void on_update_ui_timeout() {
update_ui();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]