Bug 797185 - Allow sorting on all Transaction Association columns

This commit is contained in:
Robert Fewell 2020-05-18 15:00:13 +01:00
parent 282e456f52
commit 1884ae2093
2 changed files with 54 additions and 101 deletions

View File

@ -46,7 +46,18 @@
#define GNC_PREFS_GROUP "dialogs.trans-assoc" #define GNC_PREFS_GROUP "dialogs.trans-assoc"
/** Enumeration for the tree-store */ /** Enumeration for the tree-store */
enum GncAssocColumn {DATE_TRANS, DESC_TRANS, URI_U, AVAILABLE, URI_SPLIT, URI, URI_RELATIVE}; enum GncAssocColumn
{
DATE_TRANS,
DATE_INT64, // used just for sorting date_trans
DESC_TRANS,
DISPLAY_URI,
AVAILABLE,
URI_SPLIT,
URI,
URI_RELATIVE, // used just for sorting relative_pix
URI_RELATIVE_PIX
};
typedef struct typedef struct
{ {
@ -528,56 +539,6 @@ gnc_assoc_dialog_window_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpo
return FALSE; return FALSE;
} }
static gint
sort_iter_compare_func (GtkTreeModel *model,
GtkTreeIter *a,
GtkTreeIter *b,
gpointer user_data)
{
gint ret = 0;
gchar *uri1, *uri2;
gtk_tree_model_get (model, a, URI_U, &uri1, -1);
gtk_tree_model_get (model, b, URI_U, &uri2, -1);
ret = g_utf8_collate (uri1, uri2);
g_free (uri1);
g_free (uri2);
return ret;
}
static void
assoc_dialog_sort (AssocDialog *assoc_dialog)
{
GtkTreeModel *model;
GtkTreeSortable *sortable;
gint id;
GtkSortType order;
model = gtk_tree_view_get_model (GTK_TREE_VIEW(assoc_dialog->view));
sortable = GTK_TREE_SORTABLE(model);
if (gtk_tree_sortable_get_sort_column_id (sortable, &id, &order))
{
if (order == GTK_SORT_ASCENDING)
order = GTK_SORT_DESCENDING;
else
order = GTK_SORT_ASCENDING;
}
else
{
gtk_tree_sortable_set_sort_func (sortable, URI, sort_iter_compare_func,
assoc_dialog, NULL);
order = GTK_SORT_ASCENDING;
}
/* set sort order */
gtk_tree_sortable_set_sort_column_id (sortable, URI, order);
}
static void static void
assoc_dialog_update (AssocDialog *assoc_dialog) assoc_dialog_update (AssocDialog *assoc_dialog)
{ {
@ -638,13 +599,6 @@ assoc_dialog_update (AssocDialog *assoc_dialog)
g_object_unref (G_OBJECT(model)); g_object_unref (G_OBJECT(model));
} }
static void
gnc_assoc_dialog_sort_button_cb (GtkWidget * widget, gpointer user_data)
{
AssocDialog *assoc_dialog = user_data;
assoc_dialog_sort (assoc_dialog);
}
static void static void
gnc_assoc_dialog_check_button_cb (GtkWidget * widget, gpointer user_data) gnc_assoc_dialog_check_button_cb (GtkWidget * widget, gpointer user_data)
{ {
@ -673,14 +627,14 @@ row_selected_cb (GtkTreeView *view, GtkTreePath *path,
gtk_tree_model_get (assoc_dialog->model, &iter, URI, &uri, URI_SPLIT, &split, -1); gtk_tree_model_get (assoc_dialog->model, &iter, URI, &uri, URI_SPLIT, &split, -1);
// Open associated link // Open associated link, subtract 1 to allow for date_int64
if (gtk_tree_view_get_column (GTK_TREE_VIEW(assoc_dialog->view), URI_U) == col) if (gtk_tree_view_get_column (GTK_TREE_VIEW(assoc_dialog->view), DISPLAY_URI - 1) == col)
gnc_assoc_open_uri (GTK_WINDOW(assoc_dialog->window), uri); gnc_assoc_open_uri (GTK_WINDOW(assoc_dialog->window), uri);
g_free (uri); g_free (uri);
// Open transaction // Open transaction, subtract 1 to allow for date_int64
if (gtk_tree_view_get_column (GTK_TREE_VIEW(assoc_dialog->view), DESC_TRANS) == col) if (gtk_tree_view_get_column (GTK_TREE_VIEW(assoc_dialog->view), DESC_TRANS - 1) == col)
{ {
GncPluginPage *page; GncPluginPage *page;
GNCSplitReg *gsr; GNCSplitReg *gsr;
@ -760,10 +714,12 @@ add_trans_info_to_model (QofInstance* data, gpointer user_data)
gtk_list_store_set (GTK_LIST_STORE(assoc_dialog->model), &iter, gtk_list_store_set (GTK_LIST_STORE(assoc_dialog->model), &iter,
DATE_TRANS, datebuff, DATE_TRANS, datebuff,
DATE_INT64, t, // used just for sorting date column
DESC_TRANS, xaccTransGetDescription (trans), DESC_TRANS, xaccTransGetDescription (trans),
URI_U, display_uri, AVAILABLE, _("Unknown"), DISPLAY_URI, display_uri, AVAILABLE, _("Unknown"),
URI_SPLIT, split, URI, uri, URI_SPLIT, split, URI, uri,
URI_RELATIVE, (rel == TRUE ? "emblem-default" : NULL), -1); URI_RELATIVE, rel, // used just for sorting relative column
URI_RELATIVE_PIX, (rel == TRUE ? "emblem-default" : NULL), -1);
g_free (display_uri); g_free (display_uri);
g_free (scheme); g_free (scheme);
g_free (uri); g_free (uri);
@ -801,7 +757,6 @@ gnc_assoc_dialog_create (GtkWindow *parent, AssocDialog *assoc_dialog)
GtkBuilder *builder; GtkBuilder *builder;
GtkTreeSelection *selection; GtkTreeSelection *selection;
GtkTreeViewColumn *tree_column; GtkTreeViewColumn *tree_column;
GtkCellRenderer *cr;
GtkWidget *button; GtkWidget *button;
ENTER(" "); ENTER(" ");
@ -813,8 +768,6 @@ gnc_assoc_dialog_create (GtkWindow *parent, AssocDialog *assoc_dialog)
assoc_dialog->window = window; assoc_dialog->window = window;
assoc_dialog->session = gnc_get_current_session(); assoc_dialog->session = gnc_get_current_session();
button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_button"));
g_signal_connect(button, "clicked", G_CALLBACK(gnc_assoc_dialog_sort_button_cb), assoc_dialog);
button = GTK_WIDGET(gtk_builder_get_object (builder, "check_button")); button = GTK_WIDGET(gtk_builder_get_object (builder, "check_button"));
g_signal_connect(button, "clicked", G_CALLBACK(gnc_assoc_dialog_check_button_cb), assoc_dialog); g_signal_connect(button, "clicked", G_CALLBACK(gnc_assoc_dialog_check_button_cb), assoc_dialog);
button = GTK_WIDGET(gtk_builder_get_object (builder, "close_button")); button = GTK_WIDGET(gtk_builder_get_object (builder, "close_button"));
@ -835,26 +788,16 @@ gnc_assoc_dialog_create (GtkWindow *parent, AssocDialog *assoc_dialog)
assoc_set_path_head_label (assoc_dialog->path_head_label); assoc_set_path_head_label (assoc_dialog->path_head_label);
// set the Associate column to be the one that expands // set the Associate column to be the one that expands
tree_column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object (builder, "uri-entry")); tree_column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object (builder, "assoc"));
gtk_tree_view_column_set_expand (tree_column, TRUE); gtk_tree_view_column_set_expand (tree_column, TRUE);
/* Need to add toggle renderers here to get the xalign to work. */
tree_column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title (tree_column, _("Relative"));
gtk_tree_view_append_column (GTK_TREE_VIEW(assoc_dialog->view), tree_column);
gtk_tree_view_column_set_alignment (tree_column, 0.5);
cr = gtk_cell_renderer_pixbuf_new();
gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
// connect 'active' and set 'xalign' property of the cell renderer
gtk_tree_view_column_set_attributes (tree_column, cr, "icon-name", URI_RELATIVE, NULL);
gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
g_signal_connect (assoc_dialog->view, "row-activated", g_signal_connect (assoc_dialog->view, "row-activated",
G_CALLBACK(row_selected_cb), (gpointer)assoc_dialog); G_CALLBACK(row_selected_cb), (gpointer)assoc_dialog);
// set the Associate column to be the one that expands /* default sort order */
tree_column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object (builder, "uri-entry")); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(gtk_tree_view_get_model(
gtk_tree_view_column_set_expand (tree_column, TRUE); GTK_TREE_VIEW(assoc_dialog->view))),
DATE_INT64, GTK_SORT_ASCENDING);
// Set grid lines option to preference // Set grid lines option to preference
gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(assoc_dialog->view), gnc_tree_view_get_grid_lines_pref ()); gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(assoc_dialog->view), gnc_tree_view_get_grid_lines_pref ());
@ -876,6 +819,7 @@ gnc_assoc_dialog_create (GtkWindow *parent, AssocDialog *assoc_dialog)
get_trans_info (assoc_dialog); get_trans_info (assoc_dialog);
gtk_widget_show_all (GTK_WIDGET(window)); gtk_widget_show_all (GTK_WIDGET(window));
gtk_tree_view_columns_autosize (GTK_TREE_VIEW(assoc_dialog->view));
LEAVE(" "); LEAVE(" ");
} }

View File

@ -269,9 +269,11 @@
<columns> <columns>
<!-- column-name date --> <!-- column-name date -->
<column type="gchararray"/> <column type="gchararray"/>
<!-- column-name date_int64 -->
<column type="gint64"/>
<!-- column-name desc --> <!-- column-name desc -->
<column type="gchararray"/> <column type="gchararray"/>
<!-- column-name uri_u --> <!-- column-name display_uri -->
<column type="gchararray"/> <column type="gchararray"/>
<!-- column-name available --> <!-- column-name available -->
<column type="gchararray"/> <column type="gchararray"/>
@ -280,6 +282,8 @@
<!-- column-name uri --> <!-- column-name uri -->
<column type="gchararray"/> <column type="gchararray"/>
<!-- column-name uri_relative --> <!-- column-name uri_relative -->
<column type="gboolean"/>
<!-- column-name uri_relative_pix -->
<column type="gchararray"/> <column type="gchararray"/>
</columns> </columns>
</object> </object>
@ -312,20 +316,6 @@
<object class="GtkButtonBox" id="buttonbox"> <object class="GtkButtonBox" id="buttonbox">
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child>
<object class="GtkButton" id="sort_button">
<property name="label" translatable="yes">_Sort Association</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</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> <child>
<object class="GtkButton" id="check_button"> <object class="GtkButton" id="check_button">
<property name="label" translatable="yes">_Locate Association</property> <property name="label" translatable="yes">_Locate Association</property>
@ -394,6 +384,8 @@
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="title" translatable="yes">Date</property> <property name="title" translatable="yes">Date</property>
<property name="alignment">0.5</property> <property name="alignment">0.5</property>
<property name="reorderable">True</property>
<property name="sort_column_id">1</property>
<child> <child>
<object class="GtkCellRendererText" id="cellrenderertext1"/> <object class="GtkCellRendererText" id="cellrenderertext1"/>
<attributes> <attributes>
@ -407,25 +399,29 @@
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="title" translatable="yes">Description</property> <property name="title" translatable="yes">Description</property>
<property name="alignment">0.5</property> <property name="alignment">0.5</property>
<property name="reorderable">True</property>
<property name="sort_column_id">2</property>
<child> <child>
<object class="GtkCellRendererText" id="cellrenderertext2"/> <object class="GtkCellRendererText" id="cellrenderertext2"/>
<attributes> <attributes>
<attribute name="text">1</attribute> <attribute name="text">2</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkTreeViewColumn" id="uri-entry"> <object class="GtkTreeViewColumn" id="assoc">
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="title" translatable="yes">Association</property> <property name="title" translatable="yes">Association</property>
<property name="alignment">0.5</property> <property name="alignment">0.5</property>
<property name="reorderable">True</property>
<property name="sort_column_id">3</property>
<child> <child>
<object class="GtkCellRendererText" id="cellrenderertext3"> <object class="GtkCellRendererText" id="cellrenderertext3">
<property name="ellipsize">start</property> <property name="ellipsize">start</property>
</object> </object>
<attributes> <attributes>
<attribute name="text">2</attribute> <attribute name="text">3</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>
@ -435,12 +431,25 @@
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="title" translatable="yes">Available ?</property> <property name="title" translatable="yes">Available ?</property>
<property name="alignment">0.5</property> <property name="alignment">0.5</property>
<property name="sort_column_id">4</property>
<child> <child>
<object class="GtkCellRendererText" id="cellrenderertext4"> <object class="GtkCellRendererText" id="cellrenderertext4">
<property name="xpad">10</property> <property name="xpad">10</property>
</object> </object>
<attributes> <attributes>
<attribute name="text">3</attribute> <attribute name="text">4</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="relative">
<property name="title" translatable="yes">Relative</property>
<property name="sort_column_id">7</property>
<child>
<object class="GtkCellRendererPixbuf" id="cellrendererpix1"/>
<attributes>
<attribute name="icon-name">8</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>