Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
GNOME
gtk
Commits
a2771e40
Commit
a2771e40
authored
Nov 22, 2000
by
Jonathan Blandford
Browse files
sync to home
parent
f8ab34e6
Changes
3
Hide whitespace changes
Inline
Side-by-side
gtk/gtktreemodelsort.c
View file @
a2771e40
...
...
@@ -46,11 +46,20 @@ struct _SortElt
gint
offset
;
};
typedef
struct
_SortData
SortData
;
struct
_SortData
{
GtkTreeModel
*
model
;
gint
sort_col
;
GValueCompareFunc
func
;
};
static
guint
tree_model_sort_signals
[
LAST_SIGNAL
]
=
{
0
};
#define get_array(e,t) ((GArray *)((e)->parent?(e)->parent->children:GTK_TREE_MODEL_SORT(t)->root))
static
void
gtk_tree_model_sort_init
(
GtkTreeModelSort
*
tree_model_sort
);
static
void
gtk_tree_model_sort_class_init
(
GtkTreeModelSortClass
*
tree_model_sort_class
);
static
void
gtk_tree_model_sort_tree_model_init
(
GtkTreeModelIface
*
iface
);
...
...
@@ -104,13 +113,21 @@ static void gtk_tree_model_sort_unref_iter (GtkTreeModel *
GtkTreeIter
*
iter
);
/* Internal functions */
static
void
gtk_tree_model_sort_build_level
(
GtkTreeModelSort
*
tree_model_sort
,
SortElt
*
place
);
static
void
gtk_tree_model_sort_free_level
(
GArray
*
array
);
gint
g_value_string_compare_func
(
const
GValue
*
a
,
const
GValue
*
b
);
gint
g_value_int_compare_func
(
const
GValue
*
a
,
const
GValue
*
b
);
static
GtkTreePath
*
gtk_tree_model_sort_convert_path_real
(
GtkTreeModelSort
*
tree_model_sort
,
GtkTreePath
*
child_path
,
gboolean
build_children
);
static
void
gtk_tree_model_sort_build_level
(
GtkTreeModelSort
*
tree_model_sort
,
SortElt
*
place
);
static
void
gtk_tree_model_sort_free_level
(
GArray
*
array
);
static
GFunc
gtk_tree_model_sort_get_func
(
GtkTreeModelSort
*
tree_model_sort
);
static
gint
gtk_tree_model_sort_func
(
gconstpointer
a
,
gconstpointer
b
,
gpointer
user_data
);
static
gint
g_value_string_compare_func
(
const
GValue
*
a
,
const
GValue
*
b
);
static
gint
g_value_int_compare_func
(
const
GValue
*
a
,
const
GValue
*
b
);
GtkType
...
...
@@ -318,53 +335,11 @@ GtkTreePath *
gtk_tree_model_sort_convert_path
(
GtkTreeModelSort
*
tree_model_sort
,
GtkTreePath
*
child_path
)
{
GtkTreePath
*
retval
;
GArray
*
array
;
gint
*
indices
;
gint
i
=
0
;
if
(
tree_model_sort
->
root
==
NULL
)
gtk_tree_model_sort_build_level
(
tree_model_sort
,
NULL
);
retval
=
gtk_tree_path_new
();
array
=
(
GArray
*
)
tree_model_sort
->
root
;
indices
=
gtk_tree_path_get_indices
(
child_path
);
do
{
SortElt
*
elt
;
gboolean
found
=
FALSE
;
gint
j
;
if
((
array
->
len
<
indices
[
i
])
||
(
array
==
NULL
))
{
gtk_tree_path_free
(
retval
);
return
NULL
;
}
elt
=
(
SortElt
*
)
array
->
data
;
for
(
j
=
0
;
j
<
array
->
len
;
j
++
,
elt
++
)
{
if
(
elt
->
offset
==
indices
[
i
])
{
found
=
TRUE
;
break
;
}
}
if
(
!
found
)
{
gtk_tree_path_free
(
retval
);
return
NULL
;
}
gtk_tree_path_prepend_index
(
retval
,
j
);
if
(
elt
->
children
==
NULL
)
gtk_tree_model_sort_build_level
(
tree_model_sort
,
elt
);
i
++
;
}
while
(
i
<
gtk_tree_path_get_depth
(
child_path
));
g_return_val_if_fail
(
tree_model_sort
!=
NULL
,
NULL
);
g_return_val_if_fail
(
GTK_IS_TREE_MODEL_SORT
(
tree_model_sort
),
NULL
);
g_return_val_if_fail
(
child_path
!=
NULL
,
NULL
);
return
retval
;
return
gtk_tree_model_sort_convert_path_real
(
tree_model_sort
,
child_path
,
TRUE
)
;
}
static
void
...
...
@@ -397,7 +372,13 @@ gtk_tree_model_sort_changed (GtkTreeModel *s_model,
s_path
=
gtk_tree_model_get_path
(
s_model
,
s_iter
);
}
path
=
gtk_tree_model_sort_convert_path
(
tree_model_sort
,
s_path
);
path
=
gtk_tree_model_sort_convert_path_real
(
tree_model_sort
,
s_path
,
FALSE
);
if
(
path
==
NULL
)
{
if
(
free_s_path
)
gtk_tree_path_free
(
s_path
);
return
;
}
gtk_tree_model_get_iter
(
GTK_TREE_MODEL
(
data
),
&
iter
,
path
);
gtk_signal_emit_by_name
(
GTK_OBJECT
(
data
),
"changed"
,
path
,
&
iter
);
...
...
@@ -406,7 +387,8 @@ gtk_tree_model_sort_changed (GtkTreeModel *s_model,
gtk_tree_path_free
(
s_path
);
}
static
void
/* FALSE if the value was inserted, TRUE otherwise */
static
gboolean
gtk_tree_model_sort_insert_value
(
GtkTreeModelSort
*
sort
,
GtkTreePath
*
s_path
,
GtkTreeIter
*
s_iter
)
...
...
@@ -417,7 +399,7 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
SortElt
elt
;
SortElt
*
tmp_elt
;
gint
offset
;
gint
high
,
low
,
middle
,
j
;
gint
middle
,
j
;
GValueCompareFunc
func
;
GValue
s_value
=
{
0
,
};
GValue
tmp_value
=
{
0
,
};
...
...
@@ -428,21 +410,28 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
elt
.
ref
=
0
;
elt
.
children
=
NULL
;
elt
.
offset
=
offset
;
tmp_path
=
gtk_tree_path_copy
(
s_path
);
if
(
gtk_tree_path_up
(
tmp_path
))
{
GtkTreePath
*
parent_path
;
parent_path
=
gtk_tree_model_sort_convert_path
(
sort
,
tmp_path
);
parent_path
=
gtk_tree_model_sort_convert_path_real
(
sort
,
tmp_path
,
FALSE
);
if
(
parent_path
==
NULL
)
{
gtk_tree_path_free
(
tmp_path
);
return
FALSE
;
}
gtk_tree_model_get_iter
(
GTK_TREE_MODEL
(
sort
),
&
iter
,
parent_path
);
elt
.
parent
=
((
SortElt
*
)
iter
.
tree_node
);
array
=
((
SortElt
*
)
iter
.
tree_node
)
->
children
;
gtk_tree_path_free
(
parent_path
);
if
(
array
==
NULL
)
{
((
SortElt
*
)
iter
.
tree_node
)
->
children
=
g_array_sized_new
(
FALSE
,
FALSE
,
sizeof
(
SortElt
),
1
);
array
=
((
SortElt
*
)
iter
.
tree_node
)
->
children
;
gtk_tree_path_free
(
tmp_path
);
return
FALSE
;
}
gtk_tree_path_free
(
parent_path
);
}
else
{
...
...
@@ -453,25 +442,9 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
}
gtk_tree_path_free
(
tmp_path
);
if
(
sort
->
func
)
func
=
sort
->
func
;
else
{
switch
(
gtk_tree_model_get_column_type
(
sort
->
child_model
,
sort
->
sort_col
))
{
case
G_TYPE_STRING
:
func
=
&
g_value_string_compare_func
;
break
;
case
G_TYPE_INT
:
func
=
&
g_value_int_compare_func
;
break
;
default:
g_warning
(
"No comparison function for row %d (Type %s)
\n
"
,
sort
->
sort_col
,
g_type_name
(
gtk_tree_model_get_column_type
(
sort
->
child_model
,
sort
->
sort_col
)));
return
;
}
}
func
=
(
GValueCompareFunc
)
gtk_tree_model_sort_get_func
(
sort
);
g_return_val_if_fail
(
func
!=
NULL
,
FALSE
);
gtk_tree_model_get_value
(
sort
->
child_model
,
s_iter
,
sort
->
sort_col
,
&
s_value
);
...
...
@@ -535,6 +508,8 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
j
!=
middle
)
tmp_elt
->
offset
++
;
}
return
TRUE
;
}
static
void
...
...
@@ -566,12 +541,13 @@ gtk_tree_model_sort_inserted (GtkTreeModel *s_model,
else
real_s_iter
=
(
*
s_iter
);
gtk_tree_model_sort_insert_value
(
tree_model_sort
,
s_path
,
&
real_s_iter
);
if
(
!
gtk_tree_model_sort_insert_value
(
tree_model_sort
,
s_path
,
&
real_s_iter
))
return
;
}
path
=
gtk_tree_model_sort_convert_path
(
tree_model_sort
,
s_path
);
g_
return
_if_fail
(
path
!=
NULL
)
;
path
=
gtk_tree_model_sort_convert_path
_real
(
tree_model_sort
,
s_path
,
FALSE
);
if
(
path
==
NULL
)
return
;
gtk_tree_model_get_iter
(
GTK_TREE_MODEL
(
data
),
&
iter
,
path
);
gtk_signal_emit_by_name
(
GTK_OBJECT
(
data
),
"inserted"
,
path
,
&
iter
);
...
...
@@ -603,7 +579,9 @@ gtk_tree_model_sort_child_toggled (GtkTreeModel *s_model,
free_s_path
=
TRUE
;
}
path
=
gtk_tree_model_sort_convert_path
(
tree_model_sort
,
s_path
);
path
=
gtk_tree_model_sort_convert_path_real
(
tree_model_sort
,
s_path
,
FALSE
);
if
(
path
==
NULL
)
return
;
gtk_tree_model_get_iter
(
GTK_TREE_MODEL
(
data
),
&
iter
,
path
);
gtk_signal_emit_by_name
(
GTK_OBJECT
(
data
),
"child_toggled"
,
...
...
@@ -805,6 +783,7 @@ gtk_tree_model_sort_iter_children (GtkTreeModel *tree_model,
g_return_val_if_fail
(
GTK_IS_TREE_MODEL_SORT
(
tree_model
),
FALSE
);
g_return_val_if_fail
(
GTK_TREE_MODEL_SORT
(
tree_model
)
->
child_model
!=
NULL
,
FALSE
);
if
(
parent
)
g_return_val_if_fail
(
GTK_TREE_MODEL_SORT
(
tree_model
)
->
stamp
==
parent
->
stamp
,
FALSE
);
...
...
@@ -936,6 +915,81 @@ gtk_tree_model_sort_unref_iter (GtkTreeModel *tree_model,
}
/* Internal functions */
static
GtkTreePath
*
gtk_tree_model_sort_convert_path_real
(
GtkTreeModelSort
*
tree_model_sort
,
GtkTreePath
*
child_path
,
gboolean
build_children
)
{
GtkTreePath
*
retval
;
GArray
*
array
;
gint
*
indices
;
gint
i
=
0
;
if
(
tree_model_sort
->
root
==
NULL
)
{
if
(
build_children
)
gtk_tree_model_sort_build_level
(
tree_model_sort
,
NULL
);
else
return
FALSE
;
}
retval
=
gtk_tree_path_new
();
array
=
(
GArray
*
)
tree_model_sort
->
root
;
indices
=
gtk_tree_path_get_indices
(
child_path
);
do
{
SortElt
*
elt
;
gboolean
found
=
FALSE
;
gint
j
;
if
((
array
->
len
<
indices
[
i
])
||
(
array
==
NULL
))
{
gtk_tree_path_free
(
retval
);
return
NULL
;
}
elt
=
(
SortElt
*
)
array
->
data
;
for
(
j
=
0
;
j
<
array
->
len
;
j
++
,
elt
++
)
{
if
(
elt
->
offset
==
indices
[
i
])
{
found
=
TRUE
;
break
;
}
}
if
(
!
found
)
{
gtk_tree_path_free
(
retval
);
return
NULL
;
}
gtk_tree_path_prepend_index
(
retval
,
j
);
i
++
;
if
(
i
==
gtk_tree_path_get_depth
(
child_path
))
break
;
if
(
elt
->
children
==
NULL
)
{
if
(
build_children
)
{
gtk_tree_path_prepend_index
(
retval
,
j
);
gtk_tree_model_sort_build_level
(
tree_model_sort
,
elt
);
}
else
{
gtk_tree_path_free
(
retval
);
return
NULL
;
}
}
}
while
(
TRUE
);
return
retval
;
}
static
void
gtk_tree_model_sort_build_level
(
GtkTreeModelSort
*
tree_model_sort
,
SortElt
*
place
)
...
...
@@ -945,6 +999,7 @@ gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
GtkTreeIter
*
parent_iter
=
NULL
;
GtkTreeIter
iter
;
SortElt
elt
;
SortData
sort_data
;
if
(
place
)
parent_iter
=
&
(
place
->
iter
);
...
...
@@ -979,6 +1034,11 @@ gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
}
while
(
gtk_tree_model_iter_next
(
tree_model_sort
->
child_model
,
&
iter
));
sort_data
.
func
=
(
GValueCompareFunc
)
gtk_tree_model_sort_get_func
(
tree_model_sort
);
sort_data
.
model
=
tree_model_sort
->
child_model
;
sort_data
.
sort_col
=
tree_model_sort
->
sort_col
;
g_array_sort_with_data
(
children
,
gtk_tree_model_sort_func
,
&
sort_data
);
}
static
void
...
...
@@ -1001,7 +1061,58 @@ gtk_tree_model_sort_free_level (GArray *array)
g_array_free
(
array
,
TRUE
);
}
gint
static
GFunc
gtk_tree_model_sort_get_func
(
GtkTreeModelSort
*
tree_model_sort
)
{
GValueCompareFunc
func
;
if
(
tree_model_sort
->
func
)
func
=
tree_model_sort
->
func
;
else
{
switch
(
gtk_tree_model_get_column_type
(
tree_model_sort
->
child_model
,
tree_model_sort
->
sort_col
))
{
case
G_TYPE_STRING
:
func
=
&
g_value_string_compare_func
;
break
;
case
G_TYPE_INT
:
func
=
&
g_value_int_compare_func
;
break
;
default:
g_warning
(
"No comparison function for row %d (Type %s)
\n
"
,
tree_model_sort
->
sort_col
,
g_type_name
(
gtk_tree_model_get_column_type
(
tree_model_sort
->
child_model
,
tree_model_sort
->
sort_col
)));
return
NULL
;
}
}
return
(
GFunc
)
func
;
}
static
gint
gtk_tree_model_sort_func
(
gconstpointer
a
,
gconstpointer
b
,
gpointer
user_data
)
{
GValue
value_a
;
GValue
value_b
;
SortData
*
sort_data
=
user_data
;
gint
retval
;
gtk_tree_model_get_value
(
sort_data
->
model
,
(
GtkTreeIter
*
)
a
,
sort_data
->
sort_col
,
&
value_a
);
gtk_tree_model_get_value
(
sort_data
->
model
,
(
GtkTreeIter
*
)
b
,
sort_data
->
sort_col
,
&
value_b
);
retval
=
(
sort_data
->
func
)
(
&
value_a
,
&
value_b
);
g_value_unset
(
&
value_a
);
g_value_unset
(
&
value_b
);
return
retval
;
}
static
gint
g_value_string_compare_func
(
const
GValue
*
a
,
const
GValue
*
b
)
{
...
...
@@ -1016,7 +1127,7 @@ g_value_string_compare_func (const GValue *a,
return
strcmp
(
a_str
,
b_str
);
}
gint
static
gint
g_value_int_compare_func
(
const
GValue
*
a
,
const
GValue
*
b
)
{
...
...
gtk/treestoretest.c
View file @
a2771e40
...
...
@@ -117,20 +117,26 @@ iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
NULL
,
&
selected
))
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
if
(
GTK_IS_TREE_STORE
(
model
))
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
node_set
(
&
iter
);
}
}
else
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
if
(
GTK_IS_TREE_STORE
(
model
))
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
node_set
(
&
iter
);
}
}
node_set
(
&
iter
);
}
static
void
...
...
@@ -219,7 +225,7 @@ make_window (gboolean use_sort)
GtkTreeModel
*
sort_model
;
sort_model
=
gtk_tree_model_sort_new_with_model
(
GTK_TREE_MODEL
(
base_model
),
NULL
,
0
);
NULL
,
1
);
tree_view
=
gtk_tree_view_new_with_model
(
GTK_TREE_MODEL
(
sort_model
));
}
else
...
...
@@ -300,6 +306,9 @@ make_window (gboolean use_sort)
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
}
/* Show it all */
gtk_widget_show_all
(
window
);
...
...
tests/treestoretest.c
View file @
a2771e40
...
...
@@ -117,20 +117,26 @@ iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
NULL
,
&
selected
))
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
if
(
GTK_IS_TREE_STORE
(
model
))
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
node_set
(
&
iter
);
}
}
else
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
if
(
GTK_IS_TREE_STORE
(
model
))
{
gtk_tree_store_insert_after
(
model
,
&
iter
,
NULL
,
&
selected
);
node_set
(
&
iter
);
}
}
node_set
(
&
iter
);
}
static
void
...
...
@@ -219,7 +225,7 @@ make_window (gboolean use_sort)
GtkTreeModel
*
sort_model
;
sort_model
=
gtk_tree_model_sort_new_with_model
(
GTK_TREE_MODEL
(
base_model
),
NULL
,
0
);
NULL
,
1
);
tree_view
=
gtk_tree_view_new_with_model
(
GTK_TREE_MODEL
(
sort_model
));
}
else
...
...
@@ -300,6 +306,9 @@ make_window (gboolean use_sort)
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
iter_prepend
(
NULL
,
GTK_TREE_VIEW
(
tree_view
));
}
/* Show it all */
gtk_widget_show_all
(
window
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment