Add basic Geary Inspector, hook it up to Alt+Shift+I

This commit is contained in:
Michael Gratton 2019-04-05 23:37:02 +11:00 committed by Michael James Gratton
parent 93cb84b0a3
commit ae4d7655b0
5 changed files with 278 additions and 0 deletions

View file

@ -26,6 +26,7 @@ src/client/application/goa-mediator.vala
src/client/application/main.vala
src/client/application/secret-mediator.vala
src/client/components/client-web-view.vala
src/client/components/components-inspector.vala
src/client/components/components-placeholder-pane.vala
src/client/components/components-validator.vala
src/client/components/count-badge.vala
@ -412,6 +413,7 @@ ui/composer-headerbar.ui
ui/composer-link-popover.ui
ui/composer-menus.ui
ui/composer-widget.ui
ui/components-inspector.ui
ui/components-placeholder-pane.ui
ui/conversation-email.ui
ui/conversation-email-attachment-view.ui

View file

@ -55,6 +55,7 @@ public class GearyApplication : Gtk.Application {
private const string ACTION_ABOUT = "about";
private const string ACTION_ACCOUNTS = "accounts";
private const string ACTION_COMPOSE = "compose";
private const string ACTION_INSPECT = "inspect";
private const string ACTION_HELP = "help";
private const string ACTION_MAILTO = "mailto";
private const string ACTION_PREFERENCES = "preferences";
@ -64,6 +65,7 @@ public class GearyApplication : Gtk.Application {
{ACTION_ABOUT, on_activate_about},
{ACTION_ACCOUNTS, on_activate_accounts},
{ACTION_COMPOSE, on_activate_compose},
{ACTION_INSPECT, on_activate_inspect},
{ACTION_HELP, on_activate_help},
{ACTION_MAILTO, on_activate_mailto, "s"},
{ACTION_PREFERENCES, on_activate_preferences},
@ -342,6 +344,7 @@ public class GearyApplication : Gtk.Application {
// Application accels
add_app_accelerators(ACTION_COMPOSE, { "<Ctrl>N" });
add_app_accelerators(ACTION_HELP, { "F1" });
add_app_accelerators(ACTION_INSPECT, { "<Alt><Shift>I" });
add_app_accelerators(ACTION_QUIT, { "<Ctrl>Q" });
// Common window accels
@ -561,6 +564,11 @@ public class GearyApplication : Gtk.Application {
}
}
private void on_activate_inspect() {
Components.Inspector inspector = new Components.Inspector(this);
inspector.show();
}
private void on_activate_mailto(SimpleAction action, Variant? param) {
if (this.controller != null && param != null) {
this.controller.compose_mailto(param.get_string());

View file

@ -0,0 +1,82 @@
/*
* Copyright 2019 Michael Gratton <mike@vee.net>
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
/**
* A window that displays debugging and development information.
*/
[GtkTemplate (ui = "/org/gnome/Geary/components-inspector.ui")]
public class Components.Inspector : Gtk.Window {
[GtkChild]
private Hdy.SearchBar search_bar;
[GtkChild]
private Gtk.ListBox detail_list;
private string details;
public Inspector(GearyApplication app) {
StringBuilder details = new StringBuilder();
foreach (GearyApplication.RuntimeDetail? detail
in app.get_runtime_information()) {
this.detail_list.add(
new DetailRow("%s:".printf(detail.name), detail.value)
);
details.append_printf("%s: %s\n", detail.name, detail.value);
}
this.details = details.str;
}
[GtkCallback]
private void on_copy_clicked() {
get_clipboard(Gdk.SELECTION_CLIPBOARD).set_text(this.details, -1);
}
[GtkCallback]
private void on_search_clicked() {
this.search_bar.set_search_mode(!this.search_bar.get_search_mode());
}
}
private class Components.DetailRow : Gtk.ListBoxRow {
private Gtk.Grid layout { get; private set; default = new Gtk.Grid(); }
private Gtk.Label label { get; private set; default = new Gtk.Label(""); }
private Gtk.Label value { get; private set; default = new Gtk.Label(""); }
public DetailRow(string label, string value) {
get_style_context().add_class("geary-labelled-row");
this.label.halign = Gtk.Align.START;
this.label.valign = Gtk.Align.CENTER;
this.label.set_text(label);
this.label.show();
this.value.halign = Gtk.Align.END;
this.value.hexpand = true;
this.value.valign = Gtk.Align.CENTER;
this.value.xalign = 1.0f;
this.value.set_text(value);
this.value.show();
this.layout.orientation = Gtk.Orientation.HORIZONTAL;
this.layout.add(this.label);
this.layout.add(this.value);
this.layout.show();
add(this.layout);
this.activatable = false;
show();
}
}

185
ui/components-inspector.ui Normal file
View file

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<requires lib="libhandy" version="0.0"/>
<object class="GtkListStore" id="logs_liststore">
<columns>
<!-- column-name log -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">Inspector opened</col>
</row>
</data>
</object>
<template class="ComponentsInspector" parent="GtkWindow">
<property name="can_focus">False</property>
<property name="default_width">750</property>
<property name="default_height">500</property>
<child type="titlebar">
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_close_button">True</property>
<child>
<object class="GtkButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_search_clicked" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">edit-find-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="title">
<object class="GtkStackSwitcher">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stack">stack</property>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Copy to Clipboard</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_copy_clicked" swapped="no"/>
<style>
<class name="suggested-action"/>
</style>
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkStack" id="stack">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="HdySearchBar" id="search_bar">
<property name="name">search_bar</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="vexpand">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">logs_liststore</property>
<property name="headers_visible">False</property>
<property name="enable_search">False</property>
<property name="show_expanders">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="log_column">
<property name="title" translatable="yes">column</property>
<child>
<object class="GtkCellRendererText" id="log_renderer"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
</object>
<packing>
<property name="name">logs_pane</property>
<property name="title" translatable="yes" comments="Inspector stack title">Logs</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="shadow_type">in</property>
<property name="max_content_width">600</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="HdyColumn">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">16</property>
<property name="margin_right">16</property>
<property name="margin_top">32</property>
<property name="margin_bottom">32</property>
<property name="maximum_width">500</property>
<property name="linear_growth_width">1</property>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkListBox" id="detail_list">
<property name="name">detail_list</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="selection_mode">none</property>
<property name="activate_on_single_click">False</property>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="name">general_pane</property>
<property name="title" translatable="yes" comments="Inspector stack title">General</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</template>
</interface>

View file

@ -10,6 +10,7 @@
<file compressed="true" preprocess="xml-stripblanks">certificate_warning_dialog.glade</file>
<file compressed="true">client-web-view.js</file>
<file compressed="true">client-web-view-allow-remote-images.js</file>
<file compressed="true" preprocess="xml-stripblanks">components-inspector.ui</file>
<file compressed="true" preprocess="xml-stripblanks">components-placeholder-pane.ui</file>
<file compressed="true" preprocess="xml-stripblanks">composer-headerbar.ui</file>
<file compressed="true" preprocess="xml-stripblanks">composer-link-popover.ui</file>