[geary/wip/geary-inspector: 30/38] Append new log records to the inspector and scroll to them
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/geary-inspector: 30/38] Append new log records to the inspector and scroll to them
- Date: Sun, 7 Apr 2019 08:32:44 +0000 (UTC)
commit 955449b7022b65f06c3953e1d860c2f10bcfc17d
Author: Michael Gratton <mike vee net>
Date: Sun Apr 7 11:32:38 2019 +1000
Append new log records to the inspector and scroll to them
src/client/components/components-inspector.vala | 58 ++++++++++++++++++++++---
src/engine/imap-db/imap-db-attachment.vala | 12 +++--
ui/components-inspector.ui | 8 ++--
3 files changed, 62 insertions(+), 16 deletions(-)
---
diff --git a/src/client/components/components-inspector.vala b/src/client/components/components-inspector.vala
index 321176be..bee621b3 100644
--- a/src/client/components/components-inspector.vala
+++ b/src/client/components/components-inspector.vala
@@ -36,6 +36,9 @@ public class Components.Inspector : Gtk.Window {
[GtkChild]
private Gtk.SearchEntry search_entry;
+ [GtkChild]
+ private Gtk.ScrolledWindow logs_scroller;
+
[GtkChild]
private Gtk.TreeView logs_view;
@@ -58,6 +61,8 @@ public class Components.Inspector : Gtk.Window {
private string details;
+ private bool autoscroll = true;
+
public Inspector(GearyApplication app) {
this.title = this.header_bar.title = _("Inspector");
@@ -81,15 +86,14 @@ public class Components.Inspector : Gtk.Window {
}
this.details = details.str;
- // Log a marker for when the inspector was opened
- debug("---- 8< ---- %s ---- 8< ----", this.header_bar.title);
+ enable_log_updates(true);
Gtk.ListStore logs_store = this.logs_store;
Geary.Logging.Record? logs = Geary.Logging.get_logs();
int index = 0;
while (logs != null) {
Gtk.TreeIter iter;
- logs_store.append(out iter);
+ logs_store.insert(out iter, index++);
logs_store.set_value(iter, COL_MESSAGE, logs.format());
logs = logs.get_next();
}
@@ -117,6 +121,13 @@ public class Components.Inspector : Gtk.Window {
this.logs_view.set_model(this.logs_filter);
}
+ public override void destroy() {
+ // Don't use enable_log_updates() here because we don't want a
+ // marker logged.
+ Geary.Logging.set_log_listener(null);
+ base.destroy();
+ }
+
public override bool key_press_event(Gdk.EventKey event) {
bool ret = this.search_bar.handle_event(event);
if (ret == Gdk.EVENT_PROPAGATE) {
@@ -125,6 +136,16 @@ public class Components.Inspector : Gtk.Window {
return ret;
}
+ private void enable_log_updates(bool enabled) {
+ // Log a marker it indicate when it was toggled
+ debug("---- 8< ---- %s ---- 8< ----", this.header_bar.title);
+ if (enabled) {
+ Geary.Logging.set_log_listener(this.on_log_record);
+ } else {
+ Geary.Logging.set_log_listener(null);
+ }
+ }
+
private async void save(string path,
GLib.Cancellable? cancellable)
throws GLib.Error {
@@ -167,11 +188,22 @@ public class Components.Inspector : Gtk.Window {
this.search_button.set_visible(logs_visible);
}
+ private void update_scrollbar() {
+ Gtk.Adjustment adj = this.logs_scroller.get_vadjustment();
+ adj.set_value(adj.upper - adj.page_size);
+ }
+
private void update_logs_filter() {
this.logs_filter_terms = this.search_entry.text.split(" ");
this.logs_filter.refilter();
}
+ private void append_record(Geary.Logging.Record record) {
+ Gtk.TreeIter inserted_iter;
+ this.logs_store.append(out inserted_iter);
+ this.logs_store.set_value(inserted_iter, COL_MESSAGE, record.format());
+ }
+
[GtkCallback]
private void on_visible_child_changed() {
update_ui();
@@ -240,6 +272,13 @@ public class Components.Inspector : Gtk.Window {
this.search_bar.set_search_mode(!this.search_bar.get_search_mode());
}
+ [GtkCallback]
+ private void on_logs_size_allocate() {
+ if (this.autoscroll) {
+ update_scrollbar();
+ }
+ }
+
[GtkCallback]
private void on_logs_selection_changed() {
update_ui();
@@ -250,9 +289,16 @@ public class Components.Inspector : Gtk.Window {
update_logs_filter();
}
- [GtkCallback]
- private void on_destroy() {
- destroy();
+ private void on_log_record(Geary.Logging.Record record) {
+ if (GLib.MainContext.default() ==
+ GLib.MainContext.get_thread_default()) {
+ append_record(record);
+ } else {
+ GLib.Idle.add(() => {
+ append_record(record);
+ return GLib.Source.REMOVE;
+ });
+ }
}
}
diff --git a/src/engine/imap-db/imap-db-attachment.vala b/src/engine/imap-db/imap-db-attachment.vala
index f840aeb8..60c7028c 100644
--- a/src/engine/imap-db/imap-db-attachment.vala
+++ b/src/engine/imap-db/imap-db-attachment.vala
@@ -95,9 +95,9 @@ private class Geary.ImapDB.Attachment : Geary.Attachment {
save_file(part, attachments_dir, cancellable);
update_db(cx, cancellable);
} catch (Error err) {
- // Don't honour the cancellable here, we need to delete
- // it.
- this.delete(cx, cancellable);
+ // Don't honour the cancellable here, it needs to be
+ // deleted
+ this.delete(cx, null);
throw err;
}
}
@@ -161,10 +161,8 @@ private class Geary.ImapDB.Attachment : Geary.Attachment {
// create directory, but don't throw exception if already exists
try {
target.get_parent().make_directory_with_parents(cancellable);
- } catch (IOError ioe) {
- // fall through if already exists
- if (!(ioe is IOError.EXISTS))
- throw ioe;
+ } catch (IOError.EXISTS err) {
+ // All good
}
// Delete any existing file now since we might not be creating
diff --git a/ui/components-inspector.ui b/ui/components-inspector.ui
index d62575b1..732b2845 100644
--- a/ui/components-inspector.ui
+++ b/ui/components-inspector.ui
@@ -18,7 +18,6 @@
<property name="can_focus">False</property>
<property name="default_width">750</property>
<property name="default_height">500</property>
- <signal name="destroy" handler="on_destroy" swapped="no"/>
<child type="titlebar">
<object class="GtkHeaderBar" id="header_bar">
<property name="visible">True</property>
@@ -50,6 +49,8 @@
<object class="GtkButton" id="save_as_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes"
+ comments="Tooltip for inspector button">Save logs and details to a file</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_save_as_clicked" swapped="no"/>
<child>
@@ -69,13 +70,13 @@
<object class="GtkButton" id="copy_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes" comments="Tooltip for inspector button">Copy
selected rows</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_copy_clicked" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes" comments="Tooltip for inspector
button">Copy selected rows</property>
<property name="icon_name">edit-copy-symbolic</property>
</object>
</child>
@@ -119,7 +120,7 @@
</packing>
</child>
<child>
- <object class="GtkScrolledWindow">
+ <object class="GtkScrolledWindow" id="logs_scroller">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="vexpand">True</property>
@@ -132,6 +133,7 @@
<property name="headers_visible">False</property>
<property name="enable_search">False</property>
<property name="show_expanders">False</property>
+ <signal name="size-allocate" handler="on_logs_size_allocate" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection">
<property name="mode">multiple</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]