gnucash maint: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Sun Jul 10 11:46:27 EDT 2022


Updated	 via  https://github.com/Gnucash/gnucash/commit/a9ec51bd (commit)
	 via  https://github.com/Gnucash/gnucash/commit/f5f30371 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1a263040 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/46ac60bd (commit)
	 via  https://github.com/Gnucash/gnucash/commit/263f007d (commit)
	from  https://github.com/Gnucash/gnucash/commit/aa43c198 (commit)



commit a9ec51bd6db94bcd891765567c9a85d842abe49e
Merge: aa43c198c f5f303714
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Jul 10 23:45:17 2022 +0800

    Merge branch 'maint-log-paths' into maint #1345


commit f5f303714c5f8303828d913da708824ec721f7dd
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Jun 6 15:42:36 2022 +0800

    [gnucash-core-app] "--paths" returns gnc_list_all_paths()

diff --git a/gnucash/gnucash-core-app.cpp b/gnucash/gnucash-core-app.cpp
index 3bbcc5f75..54c6d32e2 100644
--- a/gnucash/gnucash-core-app.cpp
+++ b/gnucash/gnucash-core-app.cpp
@@ -249,6 +249,22 @@ Gnucash::CoreApp::parse_command_line (int argc, char **argv)
         exit(1);
     }
 
+    if (m_show_paths)
+    {
+        auto paths { gnc_list_all_paths ()};
+        std::cout << _("GnuCash Paths") << '\n';
+        for (auto n = paths; n; n = n->next)
+        {
+            auto it = static_cast<EnvPaths*>(n->data);
+            std::cout << it->env_name << ": " << it->env_path;
+            if (it->modifiable)
+                std::cout << ' ' << _("(user modifiable)");
+            std::cout << '\n';
+        }
+        g_list_free_full (paths, g_free);
+        exit (0);
+    }
+
     if (m_show_version)
     {
         bl::format rel_fmt (bl::translate ("GnuCash {1}"));
@@ -289,6 +305,8 @@ Gnucash::CoreApp::add_common_program_options (void)
          _("Enable extra/development/debugging features."))
         ("log", bpo::value (&m_log_flags),
          _("Log level overrides, of the form \"modulename={debug,info,warn,crit,error}\"\nExamples: \"--log qof=debug\" or \"--log gnc.backend.file.sx=info\"\nThis can be invoked multiple times."))
+        ("paths", bpo::bool_switch(&m_show_paths),
+         _("Show paths"))
         ("logto", bpo::value (&m_log_to_filename),
          _("File to log into; defaults to \"/tmp/gnucash.trace\"; can be \"stderr\" or \"stdout\"."));
 
diff --git a/gnucash/gnucash-core-app.hpp b/gnucash/gnucash-core-app.hpp
index 9ff91af33..b7b1bf40d 100644
--- a/gnucash/gnucash-core-app.hpp
+++ b/gnucash/gnucash-core-app.hpp
@@ -62,6 +62,7 @@ private:
     /* Command-line option variables */
     bool m_show_help = false;
     bool m_show_version = false;
+    bool m_show_paths = false;
     bool m_debug = false;
     bool m_extra = false;
     boost::optional <std::string> m_gsettings_prefix;

commit 1a263040ab17e17e8b7343ee6ef75fae57ece9f6
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Jun 5 12:01:05 2022 +0800

    [gnc-main-window] About window shows gnc_list_all_paths()

diff --git a/gnucash/gnome-utils/gnc-main-window.c b/gnucash/gnome-utils/gnc-main-window.c
index 249de0490..89fe6fc8d 100644
--- a/gnucash/gnome-utils/gnc-main-window.c
+++ b/gnucash/gnome-utils/gnc-main-window.c
@@ -51,6 +51,7 @@
 #include "engine-helpers.h"
 #include "file-utils.h"
 #include "gnc-component-manager.h"
+#include "dialog-doclink-utils.h"
 #include "gnc-engine.h"
 #include "gnc-features.h"
 #include "gnc-file.h"
@@ -59,6 +60,7 @@
 #include "gnc-gnome-utils.h"
 #include "gnc-gobject-utils.h"
 #include "gnc-gui-query.h"
+#include "gnc-gtk-utils.h"
 #include "gnc-hooks.h"
 #include "gnc-icons.h"
 #include "gnc-session.h"
@@ -4702,6 +4704,67 @@ url_signal_cb (GtkAboutDialog *dialog, gchar *uri, gpointer data)
     return TRUE;
 }
 
+static gboolean
+link_button_cb (GtkLinkButton *button, gpointer user_data)
+{
+   const gchar *uri = gtk_link_button_get_uri (button);
+   gnc_launch_doclink (GTK_WINDOW(user_data), uri);
+   return TRUE;
+}
+
+static void
+add_about_paths (GtkDialog *dialog)
+{
+    GtkWidget *page_vbox = gnc_get_dialog_widget_from_id (dialog, "page_vbox");
+    GtkWidget *grid;
+    GList *paths;
+    gint i = 0;
+
+    if (!page_vbox)
+    {
+        PWARN("Unable to find AboutDialog 'page_vbox' Widget");
+        return;
+    }
+
+    grid = gtk_grid_new ();
+    paths = gnc_list_all_paths ();
+
+    for (GList *path_node = paths; path_node; path_node = g_list_next (path_node))
+    {
+        EnvPaths *ep = (EnvPaths*)path_node->data;
+
+        gchar *env_name = g_strconcat (ep->env_name, ":", NULL);
+        GtkWidget *label = gtk_label_new (env_name);
+        const gchar *uri = gnc_uri_create_uri ("file", NULL, 0, NULL, NULL, ep->env_path);
+        gchar *display_uri = gnc_doclink_get_unescaped_just_uri (uri);
+        GtkWidget *widget = gtk_link_button_new_with_label (uri, display_uri);
+
+        gtk_grid_attach (GTK_GRID(grid), label, 0, i, 1, 1);
+        gtk_widget_set_halign (label, GTK_ALIGN_END);
+        gtk_grid_attach (GTK_GRID(grid), widget, 1, i, 1, 1);
+        gtk_widget_set_halign (widget, GTK_ALIGN_START);
+        gtk_widget_set_margin_top (widget, 0);
+        gtk_widget_set_margin_bottom (widget, 0);
+
+        if (ep->modifiable)
+        {
+            GtkWidget *mod_lab = gtk_label_new (_("(user modifiable)"));
+            gtk_grid_attach (GTK_GRID(grid), mod_lab, 2, i, 1, 1);
+            gtk_widget_show (mod_lab);
+        }
+        g_signal_connect (widget, "activate-link",
+                          G_CALLBACK(link_button_cb), dialog);
+        i++;
+
+        g_free (display_uri);
+        g_free (env_name);
+    }
+    gtk_container_add_with_properties (GTK_CONTAINER(page_vbox), grid,
+                                       "position", 1, NULL);
+    gtk_widget_show_all (grid);
+    g_list_free_full (paths, g_free);
+}
+
 /** Create and display the "about" dialog for gnucash.
  *
  *  @param action The GtkAction for the "about" menu item.
@@ -4759,6 +4822,10 @@ gnc_main_window_cmd_help_about (GtkAction *action, GncMainWindow *window)
     g_object_unref (logo);
     g_signal_connect (dialog, "activate-link",
                       G_CALLBACK (url_signal_cb), NULL);
+
+    // Add enviroment paths
+    add_about_paths (dialog);
+
     /* Set dialog to resize. */
     gtk_window_set_resizable(GTK_WINDOW (dialog), TRUE);
 
diff --git a/gnucash/gnucash.css b/gnucash/gnucash.css
index 92e8dca84..af46af841 100644
--- a/gnucash/gnucash.css
+++ b/gnucash/gnucash.css
@@ -89,3 +89,8 @@ dialog#GnuCash > box > box > label
 {
   font-size: 24px;
 }
+dialog#GnuCash grid * {
+  padding-top: 0px;
+  padding-bottom: 0px;
+  min-height: 4px;
+}

commit 46ac60bda1986b1639a0edbe59af435d1d271058
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sat Jun 18 16:36:13 2022 +0800

    [gnc-gtk-utils] new: gnc_get_dialog_widget_from_id

diff --git a/gnucash/gnome-utils/gnc-gtk-utils.c b/gnucash/gnome-utils/gnc-gtk-utils.c
index 2dca606f5..9b6914186 100644
--- a/gnucash/gnome-utils/gnc-gtk-utils.c
+++ b/gnucash/gnome-utils/gnc-gtk-utils.c
@@ -297,3 +297,38 @@ gnc_style_context_get_border_color (GtkStyleContext *context,
     *color = *c;
     gdk_rgba_free (c);
 }
+
+static gpointer
+find_widget_func (GtkWidget *widget, const gchar *id)
+{
+    const gchar *name = gtk_buildable_get_name (GTK_BUILDABLE(widget));
+    GtkWidget *ret = NULL;
+
+    if (g_strcmp0 (name, id) == 0)
+        return widget;
+
+    if (GTK_IS_CONTAINER(widget))
+    {
+        GList *container_list = gtk_container_get_children (GTK_CONTAINER(widget));
+        for (GList *n = container_list; !ret && n; n = n->next)
+            ret = find_widget_func (n->data, id);
+        g_list_free (container_list);
+    }
+
+    return ret;
+}
+
+/** Find the Widget defined by 'id' in the dialog
+ *
+ *  @param dialog The dialog to search for 'id'.
+ *
+ *  @param id The widget name to find in the dialog.
+ *
+ *  @returns The widget defined by id in the dialog or NULL.
+ */
+GtkWidget *
+gnc_get_dialog_widget_from_id (GtkDialog *dialog, const gchar *id)
+{
+    GtkWidget *content_area = gtk_dialog_get_content_area (dialog);
+    return find_widget_func (content_area, id);
+}
diff --git a/gnucash/gnome-utils/gnc-gtk-utils.h b/gnucash/gnome-utils/gnc-gtk-utils.h
index 6651f76f0..b227eec0c 100644
--- a/gnucash/gnome-utils/gnc-gtk-utils.h
+++ b/gnucash/gnome-utils/gnc-gtk-utils.h
@@ -53,6 +53,8 @@ void gnc_style_context_get_border_color (GtkStyleContext *context,
                                          GtkStateFlags    state,
                                          GdkRGBA         *color);
 
+GtkWidget *gnc_get_dialog_widget_from_id (GtkDialog *dialog, const gchar *id);
+
 /** @} */
 
 #endif /* GNC_GTK_UTILS_H */

commit 263f007d5c5246f72ea16805becc188bf1299735
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Jun 5 12:00:58 2022 +0800

    [gnc-filepath-utils] new: gnc_list_all_paths

diff --git a/libgnucash/core-utils/gnc-filepath-utils.cpp b/libgnucash/core-utils/gnc-filepath-utils.cpp
index 34f482d4c..e16d90883 100644
--- a/libgnucash/core-utils/gnc-filepath-utils.cpp
+++ b/libgnucash/core-utils/gnc-filepath-utils.cpp
@@ -69,6 +69,7 @@ extern "C" {
 #include <boost/filesystem.hpp>
 #include <boost/locale.hpp>
 #include <iostream>
+#include <numeric>
 
 /* Below cvt and bfs_locale should be used with boost::filesystem::path (bfs)
  * objects created alter in this source file. The rationale is as follows:
@@ -1306,5 +1307,27 @@ gnc_filepath_locate_doc_file (const gchar *name)
     return result;
 }
 
+GList *
+gnc_list_all_paths (void)
+{
+    if (gnc_userdata_home.empty())
+        gnc_filepath_init ();
+
+    std::vector<EnvPaths> paths
+        { { "GNC_USERDATA_DIR", gnc_userdata_home_str.c_str(), true},
+          { "GNC_USERCONFIG_DIR", gnc_userconfig_home_str.c_str(), true },
+          { "GNC_BIN", g_getenv ("GNC_BIN"), false },
+          { "GNC_LIB", g_getenv ("GNC_LIB"), false },
+          { "GNC_CONF", g_getenv ("GNC_CONF"), false },
+          { "GNC_DATA", g_getenv ("GNC_DATA"), false },
+        };
+    auto accum = [](const auto& a, const auto& b)
+    {
+        EnvPaths *ep = g_new0 (EnvPaths, 1);
+        *ep = b;
+        return g_list_prepend (a, ep);
+    };
+    return std::accumulate (paths.rbegin(), paths.rend(), (GList*) nullptr, accum);
+}
 
 /* =============================== END OF FILE ========================== */
diff --git a/libgnucash/core-utils/gnc-filepath-utils.h b/libgnucash/core-utils/gnc-filepath-utils.h
index f88cd3205..57e1ddf77 100644
--- a/libgnucash/core-utils/gnc-filepath-utils.h
+++ b/libgnucash/core-utils/gnc-filepath-utils.h
@@ -172,4 +172,22 @@ gchar *gnc_filepath_locate_ui_file (const gchar *name);
  */
 gchar *gnc_filepath_locate_doc_file (const gchar *name);
 
+typedef struct
+{
+    const gchar *env_name;
+    const gchar *env_path;
+    gboolean modifiable;
+} EnvPaths;
+
+
+/** Returns a GList* of the environment variables used by GnuCash.
+ *
+ *  @return a GList* of EnvPaths structs, describing the environment
+ *  variables used by GnuCash.
+ *
+ *  @note It is the caller's responsibility to free the GList with
+ *  g_list_free_full (paths, g_free)
+ */
+GList *gnc_list_all_paths (void);
+
 #endif /* GNC_FILEPATH_UTILS_H */



Summary of changes:
 gnucash/gnome-utils/gnc-gtk-utils.c          | 35 +++++++++++++++
 gnucash/gnome-utils/gnc-gtk-utils.h          |  2 +
 gnucash/gnome-utils/gnc-main-window.c        | 67 ++++++++++++++++++++++++++++
 gnucash/gnucash-core-app.cpp                 | 18 ++++++++
 gnucash/gnucash-core-app.hpp                 |  1 +
 gnucash/gnucash.css                          |  5 +++
 libgnucash/core-utils/gnc-filepath-utils.cpp | 23 ++++++++++
 libgnucash/core-utils/gnc-filepath-utils.h   | 18 ++++++++
 8 files changed, 169 insertions(+)



More information about the gnucash-changes mailing list