Fix up focus code a lot.

Mon Mar 12 21:02:08 2001  Jonathan Blandford  <jrb@redhat.com>

	* gtk/gtktreeview.c (gtk_tree_view_header_focus): Fix up focus
	code a lot.

	* gtk/gtktreedatalist.c (_gtk_tree_data_list_free): use
	g_mem_chunk.
	(_gtk_tree_data_list_alloc): use g_mem_chunk.
	(_gtk_tree_data_list_node_to_value): Fix to switch on
	G_TYPE_FUNDAMENTAL.
	(_gtk_tree_data_list_value_to_node): Fix to switch on
	G_TYPE_FUNDAMENTAL.
	(_gtk_tree_data_list_node_copy): Fix to switch on
	G_TYPE_FUNDAMENTAL.
This commit is contained in:
Jonathan Blandford
2001-03-13 02:00:37 +00:00
committed by Jonathan Blandford
parent b0752cb4b2
commit cf89a05f07
13 changed files with 292 additions and 278 deletions

View File

@ -2075,128 +2075,74 @@ gtk_tree_view_header_focus (GtkTreeView *tree_view,
last_column &&
!(GTK_TREE_VIEW_COLUMN (last_column->data)->visible) &&
GTK_WIDGET_CAN_FOCUS (GTK_TREE_VIEW_COLUMN (last_column->data)->button);
last_column = last_column->prev)
;
last_column = last_column->prev);
for (first_column = tree_view->priv->columns;
first_column &&
!(GTK_TREE_VIEW_COLUMN (first_column->data)->visible) &&
GTK_WIDGET_CAN_FOCUS (GTK_TREE_VIEW_COLUMN (first_column->data)->button);
first_column = first_column->next)
;
first_column = first_column->next);
/* no headers are visible, or are focussable. We can't focus in or out.
* I wonder if focussable is a real word...
/* No headers are visible, or are focusable. We can't focus in or out.
*/
if (last_column == NULL)
return FALSE;
/* First thing we want to handle is entering and leaving the headers.
*/
switch (dir)
{
case GTK_DIR_TAB_BACKWARD:
if (!focus_child)
{
focus_child = GTK_TREE_VIEW_COLUMN (last_column->data)->button;
gtk_widget_grab_focus (focus_child);
goto cleanup;
}
if (focus_child == GTK_TREE_VIEW_COLUMN (first_column->data)->button)
{
focus_child = NULL;
goto cleanup;
}
break;
case GTK_DIR_TAB_FORWARD:
if (!focus_child)
case GTK_DIR_UP:
case GTK_DIR_DOWN:
if (focus_child == NULL)
{
focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
if (tree_view->priv->focus_column == NULL)
focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
else
focus_child = GTK_TREE_VIEW_COLUMN (tree_view->priv->focus_column->data)->button;
gtk_widget_grab_focus (focus_child);
goto cleanup;
break;
}
if (focus_child == GTK_TREE_VIEW_COLUMN (last_column->data)->button)
{
focus_child = NULL;
goto cleanup;
}
break;
return FALSE;
case GTK_DIR_LEFT:
if (!focus_child)
case GTK_DIR_RIGHT:
if (focus_child == NULL)
{
g_assert_not_reached ();
return FALSE;
}
if (gtk_container_focus (GTK_CONTAINER (focus_child), dir))
{
/* The focus moves inside the button. */
/* This is probably a great example of bad UI */
break;
}
/* We need to move the focus among the row of buttons. */
for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
if (GTK_TREE_VIEW_COLUMN (tmp_list->data)->button == focus_child)
break;
if (tmp_list == first_column && dir == GTK_DIR_LEFT)
{
focus_child = GTK_TREE_VIEW_COLUMN (last_column->data)->button;
gtk_widget_grab_focus (focus_child);
goto cleanup;
break;
}
if (focus_child == GTK_TREE_VIEW_COLUMN (first_column->data)->button)
{
focus_child = NULL;
goto cleanup;
}
break;
case GTK_DIR_RIGHT:
if (!focus_child)
else if (tmp_list == last_column && dir == GTK_DIR_RIGHT)
{
focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
gtk_widget_grab_focus (focus_child);
goto cleanup;
break;
}
if (focus_child == GTK_TREE_VIEW_COLUMN (last_column->data)->button)
{
focus_child = NULL;
goto cleanup;
}
break;
case GTK_DIR_UP:
if (!focus_child)
{
focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
gtk_widget_grab_focus (focus_child);
}
else
{
focus_child = NULL;
}
goto cleanup;
case GTK_DIR_DOWN:
if (!focus_child)
{
focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
gtk_widget_grab_focus (focus_child);
}
else
{
focus_child = NULL;
}
goto cleanup;
}
/* We need to move the focus to the next button. */
if (focus_child)
{
for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
if (GTK_TREE_VIEW_COLUMN (tmp_list->data)->button == focus_child)
{
if (gtk_container_focus (GTK_CONTAINER (GTK_TREE_VIEW_COLUMN (tmp_list->data)->button), dir))
{
/* The focus moves inside the button. */
/* This is probably a great example of bad UI */
goto cleanup;
}
break;
}
/* We need to move the focus among the row of buttons. */
while (tmp_list)
{
GtkTreeViewColumn *column;
if (dir == GTK_DIR_RIGHT || dir == GTK_DIR_TAB_FORWARD)
if (dir == GTK_DIR_RIGHT)
tmp_list = tmp_list->next;
else
tmp_list = tmp_list->prev;
@ -2204,7 +2150,7 @@ gtk_tree_view_header_focus (GtkTreeView *tree_view,
if (tmp_list == NULL)
{
g_warning ("Internal button not found");
goto cleanup;
break;
}
column = tmp_list->data;
if (column->button &&
@ -2216,9 +2162,12 @@ gtk_tree_view_header_focus (GtkTreeView *tree_view,
break;
}
}
break;
default:
g_assert_not_reached ();
break;
}
cleanup:
/* if focus child is non-null, we assume it's been set to the current focus child
*/
if (focus_child)
@ -2274,14 +2223,12 @@ gtk_tree_view_focus (GtkContainer *container,
switch (direction)
{
case GTK_DIR_LEFT:
case GTK_DIR_RIGHT:
return (gtk_tree_view_header_focus (tree_view, direction));
case GTK_DIR_TAB_BACKWARD:
case GTK_DIR_UP:
return FALSE;
case GTK_DIR_TAB_FORWARD:
if (gtk_tree_view_header_focus (tree_view, direction))
return TRUE;
case GTK_DIR_RIGHT:
case GTK_DIR_DOWN:
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS);
gtk_widget_grab_focus (GTK_WIDGET (container));
@ -4186,6 +4133,9 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view,
_gtk_tree_view_column_unset_tree_view (column);
if (GTK_TREE_VIEW_COLUMN (tree_view->priv->focus_column->data) == column)
tree_view->priv->focus_column = NULL;
tree_view->priv->columns = g_list_remove (tree_view->priv->columns, column);
g_object_unref (G_OBJECT (column));