Merge Bob Fewell's 'color-accounts' into maint.

This commit is contained in:
John Ralls 2018-07-15 10:47:19 -07:00
commit 374477c360
5 changed files with 340 additions and 45 deletions

View File

@ -1866,7 +1866,7 @@ gnc_ui_edit_account_window(GtkWindow *parent, Account *account)
parent_acct = gnc_account_get_parent (account);
if (parent_acct == NULL)
parent_acct = account; /* must be at the root */
parent_acct = account; /* must be at the root */
gtk_tree_view_collapse_all (aw->parent_tree);
gnc_tree_view_account_set_selected_account (
@ -1951,23 +1951,23 @@ gnc_account_renumber_update_examples (RenumberDialog *data)
prefix = gtk_editable_get_chars(GTK_EDITABLE(data->prefix), 0, -1);
interval = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->interval));
if (interval <= 0)
interval = 10;
interval = 10;
num_digits = (unsigned int)log10((double)(data->num_children * interval)) + 1;
if (strlen (prefix))
str = g_strdup_printf("%s-%0*d", prefix, num_digits, interval);
str = g_strdup_printf("%s-%0*d", prefix, num_digits, interval);
else
str = g_strdup_printf("%0*d", num_digits, interval);
str = g_strdup_printf("%0*d", num_digits, interval);
gtk_label_set_text(GTK_LABEL(data->example1), str);
g_free(str);
if (strlen (prefix))
str = g_strdup_printf("%s-%0*d", prefix, num_digits,
interval * data->num_children);
str = g_strdup_printf("%s-%0*d", prefix, num_digits,
interval * data->num_children);
else
str = g_strdup_printf("%0*d", num_digits,
interval * data->num_children);
str = g_strdup_printf("%0*d", num_digits,
interval * data->num_children);
gtk_label_set_text(GTK_LABEL(data->example2), str);
g_free(str);
@ -2004,27 +2004,28 @@ gnc_account_renumber_response_cb (GtkDialog *dialog,
{
gtk_widget_hide(data->dialog);
children = gnc_account_get_children_sorted(data->parent);
if (children == NULL)
{
PWARN ("Can't renumber children of an account with no children!");
g_free (data);
return;
}
if (children == NULL)
{
PWARN ("Can't renumber children of an account with no children!");
g_free (data);
return;
}
prefix = gtk_editable_get_chars(GTK_EDITABLE(data->prefix), 0, -1);
interval =
gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->interval));
if (interval <= 0)
interval = 10;
interval = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->interval));
if (interval <= 0)
interval = 10;
num_digits = (unsigned int)log10 ((double)(data->num_children * interval) + 1);
gnc_set_busy_cursor (NULL, TRUE);
for (tmp = children, i = 1; tmp; tmp = g_list_next(tmp), i += 1)
{
if (strlen (prefix))
str = g_strdup_printf("%s-%0*d", prefix,
num_digits, interval * i);
else
str = g_strdup_printf("%0*d", num_digits, interval * i);
if (strlen (prefix))
str = g_strdup_printf("%s-%0*d", prefix,
num_digits, interval * i);
else
str = g_strdup_printf("%0*d", num_digits, interval * i);
xaccAccountSetCode(tmp->data, str);
g_free(str);
}
@ -2058,7 +2059,7 @@ gnc_account_renumber_create_dialog (GtkWidget *window, Account *account)
data->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "account_renumber_dialog"));
gtk_window_set_transient_for(GTK_WINDOW(data->dialog), GTK_WINDOW(window));
g_object_set_data_full(G_OBJECT(data->dialog), "builder", builder,
g_object_unref);
g_object_unref);
widget = GTK_WIDGET(gtk_builder_get_object (builder, "header_label"));
string = g_strdup_printf(_( "Renumber the immediate sub-accounts of %s? "
@ -2080,3 +2081,119 @@ gnc_account_renumber_create_dialog (GtkWidget *window, Account *account)
gtk_widget_show_all(data->dialog);
}
static void
default_color_button_cb (GtkButton *button, gpointer user_data)
{
GdkRGBA color;
if (gdk_rgba_parse (&color, DEFAULT_COLOR))
gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(user_data), &color);
}
static void
update_account_color (Account *acc, const gchar *old_color, const gchar *new_color, gboolean replace)
{
// check to see if the color has been changed
if (g_strcmp0 (new_color, old_color) != 0)
{
if ((old_color == NULL) || (g_strcmp0 (old_color, "Not Set") == 0) || (replace == TRUE))
{
xaccAccountBeginEdit (acc);
xaccAccountSetColor (acc, new_color);
xaccAccountCommitEdit (acc);
}
}
}
void
gnc_account_cascade_color_dialog (GtkWidget *window, Account *account)
{
GtkWidget *dialog;
GtkBuilder *builder;
GtkWidget *color_label, *color_button, *over_write, *color_button_default;
gchar *string;
const char *color_string;
gchar *old_color_string;
GdkRGBA color;
gint response;
// check if we actualy do have sub accounts
g_return_if_fail (gnc_account_n_children (account) > 0);
builder = gtk_builder_new();
gnc_builder_add_from_file (builder, "dialog-account.glade", "account_cascade_color_dialog");
dialog = GTK_WIDGET(gtk_builder_get_object (builder, "account_cascade_color_dialog"));
gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(window));
color_label = GTK_WIDGET(gtk_builder_get_object (builder, "color_label"));
over_write = GTK_WIDGET(gtk_builder_get_object (builder, "replace_check"));
color_button = GTK_WIDGET(gtk_builder_get_object (builder, "color_button"));
color_button_default = GTK_WIDGET(gtk_builder_get_object (builder, "color_button_default"));
gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(color_button), FALSE);
g_signal_connect (G_OBJECT(color_button_default), "clicked",
G_CALLBACK(default_color_button_cb), (gpointer)color_button);
string = g_strdup_printf(_( "Set the account color for account '%s' "
"including all sub-accounts to the selected color:"),
gnc_account_get_full_name(account));
gtk_label_set_text (GTK_LABEL(color_label), string);
g_free (string);
color_string = xaccAccountGetColor (account); // get existing account color
old_color_string = g_strdup (color_string); // save the old color string
if ((color_string == NULL) || (g_strcmp0 (color_string, "Not Set") == 0))
color_string = DEFAULT_COLOR;
// set the color chooser to account color
if (gdk_rgba_parse (&color, color_string))
gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(color_button), &color);
/* default to cancel */
gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
gtk_builder_connect_signals (builder, dialog);
g_object_unref (G_OBJECT(builder));
gtk_widget_show_all (dialog);
response = gtk_dialog_run (GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_OK)
{
GList *accounts = gnc_account_get_descendants (account);
gboolean replace = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(over_write));
GList *acct;
GdkRGBA new_color;
const gchar *new_color_string;
gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_button), &new_color);
new_color_string = gdk_rgba_to_string (&new_color);
if (g_strcmp0 (new_color_string, DEFAULT_COLOR) == 0)
new_color_string = "Not Set";
// check/update selected account
update_account_color (account, old_color_string, new_color_string, replace);
if (accounts != NULL)
{
for (acct = accounts; acct; acct = g_list_next(acct))
{
const char *string = xaccAccountGetColor (acct->data);
// check/update sub-account
update_account_color (acct->data, string, new_color_string, replace);
}
g_list_free (accounts);
}
}
if (old_color_string)
g_free (old_color_string);
gtk_widget_destroy (dialog);
}

View File

@ -161,6 +161,8 @@ void gnc_ui_register_account_destroy_callback (void (*cb)(Account *));
void gnc_account_renumber_create_dialog (GtkWidget *window, Account *account);
void gnc_account_cascade_color_dialog (GtkWidget *window, Account *account);
/** @} */
/** @} */

View File

@ -153,6 +153,7 @@ static void gnc_plugin_page_account_tree_cmd_lots (GtkAction *action, GncPluginP
static void gnc_plugin_page_account_tree_cmd_scrub (GtkAction *action, GncPluginPageAccountTree *page);
static void gnc_plugin_page_account_tree_cmd_scrub_sub (GtkAction *action, GncPluginPageAccountTree *page);
static void gnc_plugin_page_account_tree_cmd_scrub_all (GtkAction *action, GncPluginPageAccountTree *page);
static void gnc_plugin_page_account_tree_cmd_cascade_color_account (GtkAction *action, GncPluginPageAccountTree *page);
/* Command callback for new Register Test */
static void gnc_plugin_page_account_tree_cmd_open2_account (GtkAction *action, GncPluginPageAccountTree *page);
@ -226,6 +227,11 @@ static GtkActionEntry gnc_plugin_page_account_tree_actions [] =
N_("Delete selected account"),
G_CALLBACK (gnc_plugin_page_account_tree_cmd_delete_account)
},
{
"ColorCascadeAccountAction", NULL, N_("_Cascade Account Color..."), NULL,
N_("Cascade selected account color"),
G_CALLBACK (gnc_plugin_page_account_tree_cmd_cascade_color_account)
},
{
"EditFindAccountAction", "edit-find", N_("F_ind Account"), "<primary>i",
N_("Find an account"),
@ -1179,6 +1185,24 @@ gnc_plugin_page_account_tree_cmd_find_account_popup (GtkAction *action, GncPlugi
LEAVE(" ");
}
static void
gnc_plugin_page_account_tree_cmd_cascade_color_account (GtkAction *action, GncPluginPageAccountTree *page)
{
Account *account = NULL;
GtkWidget *window;
ENTER("action %p, page %p", action, page);
account = gnc_plugin_page_account_tree_get_current_account (page);
window = gnc_plugin_page_get_window(GNC_PLUGIN_PAGE(page));
if (account != NULL)
gnc_account_cascade_color_dialog (window, account);
LEAVE(" ");
}
/********************************************************************
* delete_account_helper
* See if this account has any splits present. Set the user data

View File

@ -2,6 +2,156 @@
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkDialog" id="account_cascade_color_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Cascade Account Color</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="cancelbutton3">
<property name="label" translatable="yes">_Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="okbutton3">
<property name="label">_OK</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="color_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<child>
<object class="GtkColorButton" id="color_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="color_button_default">
<property name="label" translatable="yes">Default</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="sub_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">If any account has an existing color it will not be replaced unless the following is ticked.</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="replace_check">
<property name="label" translatable="yes">Replace any existing account colors</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="halign">center</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">cancelbutton3</action-widget>
<action-widget response="-5">okbutton3</action-widget>
</action-widgets>
<child>
<placeholder/>
</child>
</object>
<object class="GtkDialog" id="account_delete_dialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>

View File

@ -3,9 +3,10 @@
<menu name="Edit" action="EditAction">
<placeholder name="EditSelectedPlaceholder">
<menuitem name="EditEditAccount" action="EditEditAccountAction"/>
<menuitem name="EditDeleteAccount" action="EditDeleteAccountAction"/>
<menuitem name="EditDeleteAccount" action="EditDeleteAccountAction"/>
<menuitem name="EditAccountFindAccount" action="EditFindAccountAction"/>
<menuitem name="EditRenumberSubaccounts" action="EditRenumberSubaccountsAction"/>
<menuitem name="AccountColorCascade" action="ColorCascadeAccountAction"/>
<menuitem name="EditRenumberSubaccounts" action="EditRenumberSubaccountsAction"/>
<separator name="EditSep2"/>
<menuitem name="FileOpenAccount" action="FileOpenAccountAction"/>
<menuitem name="FileOpenSubaccounts" action="FileOpenSubaccountsAction"/>
@ -13,29 +14,29 @@
</menu>
<menu name="Actions" action="ActionsAction">
<placeholder name="ActionsPlaceholder">
<separator name="ActionsSep1"/>
<menuitem name="FileNewAccount" action="FileNewAccountAction"/>
<menuitem name="FileAddAccountHierarchyAssistant" action="FileAddAccountHierarchyAssistantAction"/>
<separator name="ActionsSep2"/>
<menuitem name="ActionsTransfer" action="ActionsTransferAction"/>
<menuitem name="ActionsReconcile" action="ActionsReconcileAction"/>
<menuitem name="ActionsAutoClear" action="ActionsAutoClearAction"/>
<menuitem name="ActionsStockSplit" action="ActionsStockSplitAction"/>
<menuitem name="ActionLots" action="ActionsLotsAction"/>
<separator name="ActionsSep3"/>
<menu name="ScrubMenu" action="ScrubMenuAction">
<menuitem name="Scrub" action="ScrubAction"/>
<menuitem name="ScrubSub" action="ScrubSubAction"/>
<menuitem name="ScrubAll" action="ScrubAllAction"/>
</menu>
<separator name="ActionsSep1"/>
<menuitem name="FileNewAccount" action="FileNewAccountAction"/>
<menuitem name="FileAddAccountHierarchyAssistant" action="FileAddAccountHierarchyAssistantAction"/>
<separator name="ActionsSep2"/>
<menuitem name="ActionsTransfer" action="ActionsTransferAction"/>
<menuitem name="ActionsReconcile" action="ActionsReconcileAction"/>
<menuitem name="ActionsAutoClear" action="ActionsAutoClearAction"/>
<menuitem name="ActionsStockSplit" action="ActionsStockSplitAction"/>
<menuitem name="ActionLots" action="ActionsLotsAction"/>
<separator name="ActionsSep3"/>
<menu name="ScrubMenu" action="ScrubMenuAction">
<menuitem name="Scrub" action="ScrubAction"/>
<menuitem name="ScrubSub" action="ScrubSubAction"/>
<menuitem name="ScrubAll" action="ScrubAllAction"/>
</menu>
</placeholder>
</menu>
<menu name="Extensions" action="ExtensionsAction">
<placeholder name="ExtensionsPlaceholder">
<menu name="Register2Test" action="Register2TestAction">
<menuitem name="Register2TestAccount" action="Register2TestAccountAction"/>
<menuitem name="Register2TestSubAccount" action="Register2TestSubAccountAction"/>
</menu>
<menu name="Register2Test" action="Register2TestAction">
<menuitem name="Register2TestAccount" action="Register2TestAccountAction"/>
<menuitem name="Register2TestSubAccount" action="Register2TestSubAccountAction"/>
</menu>
</placeholder>
</menu>
</menubar>
@ -45,6 +46,7 @@
<menuitem name="AccountOpenAccount" action="FileOpenAccountAction"/>
<menuitem name="AccountOpenSubaccounts" action="FileOpenSubaccountsAction"/>
<menuitem name="AccountEditAccount" action="EditEditAccountAction"/>
<menuitem name="AccountColorCascade" action="ColorCascadeAccountAction"/>
<menuitem name="AccountFindAccountPopup" action="EditFindAccountPopupAction"/>
<separator name="AccountSep1"/>
<menuitem name="AccountReconcile" action="ActionsReconcileAction"/>