1
1

1999-04-16 Federico Mena Quintero <federico@nuclecu.unam.mx>

* gscreen.c (panel_tree_check_auto_expand): Enabled auto-collapse
	functionality again.  Made the code a simpler by using
	gtk_dtree_is_ancestor().

	* gtkdtree.c (gtk_dtree_is_ancestor): New function to test whether
	a node is an ancestor of a child.  This does the same as
	gtk_ctree_is_ancestor(), but much more efficiently.  GtkCTree
	seems to use the pessimal algorithm for this.
	(gtk_dtree_collapse): Slight optimization: do not re-select if the
	node is already selected.
	(gtk_dtree_collapse): Do not freeze/thaw the tree while
	collapsing/selecting.

	* gmain.c: Removed crufty old SM code.
Этот коммит содержится в:
Miguel de Icaza 1999-04-16 18:25:00 +00:00
родитель 00e136e22d
Коммит 1270687440
5 изменённых файлов: 88 добавлений и 123 удалений

Просмотреть файл

@ -1,3 +1,20 @@
1999-04-16 Federico Mena Quintero <federico@nuclecu.unam.mx>
* gscreen.c (panel_tree_check_auto_expand): Enabled auto-collapse
functionality again. Made the code a simpler by using
gtk_dtree_is_ancestor().
* gtkdtree.c (gtk_dtree_is_ancestor): New function to test whether
a node is an ancestor of a child. This does the same as
gtk_ctree_is_ancestor(), but much more efficiently. GtkCTree
seems to use the pessimal algorithm for this.
(gtk_dtree_collapse): Slight optimization: do not re-select if the
node is already selected.
(gtk_dtree_collapse): Do not freeze/thaw the tree while
collapsing/selecting.
* gmain.c: Removed crufty old SM code.
1999-04-15 Federico Mena Quintero <federico@nuclecu.unam.mx> 1999-04-15 Federico Mena Quintero <federico@nuclecu.unam.mx>
* gscreen.c (panel_setup_drag_scroll): Made it not return * gscreen.c (panel_setup_drag_scroll): Made it not return

Просмотреть файл

@ -528,78 +528,7 @@ gmc_do_quit (void)
quit = 1; quit = 1;
dlg_stop (desktop_dlg); dlg_stop (desktop_dlg);
} }
#if 0
static void
session_die (void)
{
gmc_do_quit ();
}
/*
* Save the session callback
*/
static int
session_save_state (GnomeClient *client, gint phase, GnomeRestartStyle save_style, gint shutdown,
GnomeInteractStyle interact_style, gint fast, gpointer client_data)
{
char *sess_id;
char **argv = g_malloc (sizeof (char *) * ((g_list_length (containers) * 3) + 2));
GList *l, *free_list = 0;
int i;
sess_id = gnome_client_get_id (client);
argv [0] = client_data;
for (i = 1, l = containers; l; l = l->next){
PanelContainer *pc = l->data;
char *geom;
geom = gnome_geometry_string (GTK_WIDGET (pc->panel->widget.wdata)->window);
argv [i++] = pc->panel->cwd;
argv [i++] = "--geometry";
argv [i++] = geom;
free_list = g_list_append (free_list, geom);
}
/* If no windows were open */
if (i == 1){
argv [i++] = "--nowindows";
}
argv [i] = NULL;
gnome_client_set_clone_command (client, i, argv);
gnome_client_set_restart_command (client, i, argv);
gnome_config_sync ();
for (l = free_list; l; l = l->next)
g_free (l->data);
g_list_free (free_list);
g_free (argv);
if (shutdown){
quit = 1;
dlg_stop (midnight_dlg);
}
return 1;
}
void
session_management_setup (char *name)
{
session_client = gnome_master_client ();
if (session_client){
gnome_client_set_restart_style (session_client,
finish_program ? GNOME_RESTART_NEVER : GNOME_RESTART_IMMEDIATELY);
gtk_signal_connect (GTK_OBJECT (session_client), "save_yourself",
GTK_SIGNAL_FUNC (session_save_state), name);
gtk_signal_connect (GTK_OBJECT (session_client), "die",
GTK_SIGNAL_FUNC (session_die), NULL);
}
}
#endif
/* /*
* Configures the GtkWindow/GnomeDialog from a WPanel. * Configures the GtkWindow/GnomeDialog from a WPanel.
* *

Просмотреть файл

@ -1980,8 +1980,6 @@ tree_drag_open_directory (gpointer data)
WPanel *panel; WPanel *panel;
GtkDTree *dtree; GtkDTree *dtree;
GtkCTreeNode *node; GtkCTreeNode *node;
int row, col;
int on_row;
panel = data; panel = data;
dtree = GTK_DTREE (panel->tree); dtree = GTK_DTREE (panel->tree);
@ -1989,67 +1987,59 @@ tree_drag_open_directory (gpointer data)
node = gtk_ctree_node_nth (GTK_CTREE (panel->tree), panel->drag_tree_row); node = gtk_ctree_node_nth (GTK_CTREE (panel->tree), panel->drag_tree_row);
g_assert (node != NULL); g_assert (node != NULL);
if (!GTK_CTREE_ROW (node)->expanded) if (!GTK_CTREE_ROW (node)->expanded) {
dtree->auto_expanded_nodes = g_list_append (dtree->auto_expanded_nodes, node); dtree->auto_expanded_nodes = g_list_append (dtree->auto_expanded_nodes, node);
gtk_ctree_expand (GTK_CTREE (panel->tree), node);
gtk_ctree_expand (GTK_CTREE (panel->tree), node); }
return FALSE; return FALSE;
} }
/* Handles automatic collapsing of the tree nodes when doing drag and drop */
static void static void
panel_tree_check_auto_expand (WPanel *panel, GtkCTreeNode *current) panel_tree_check_auto_expand (WPanel *panel, GtkCTreeNode *current)
{ {
GtkDTree *dtree = GTK_DTREE (panel->tree); GtkDTree *dtree;
GList *tmp_list = dtree->auto_expanded_nodes; GtkCTree *ctree;
#if 0 GtkCList *clist;
GtkCList *clist = GTK_CLIST (dtree); GList *free_list;
GList *tmp_list;
gint row, old_y, new_y; gint row, old_y, new_y;
#endif
if (current) { dtree = GTK_DTREE (panel->tree);
while (tmp_list) { ctree = GTK_CTREE (panel->tree);
GtkCTreeNode *parent_node = tmp_list->data; clist = GTK_CLIST (panel->tree);
GtkCTreeNode *tmp_node = current; tmp_list = dtree->auto_expanded_nodes;
while (tmp_node) { if (current)
if (tmp_node == parent_node) for (; tmp_list; tmp_list = tmp_list->next)
break; if (!gtk_dtree_is_ancestor (dtree, tmp_list->data, current))
tmp_node = GTK_CTREE_ROW (tmp_node)->parent;
}
if (!tmp_node) /* parent not found */
break; break;
tmp_list = tmp_list->next; /* Collapse the rows as necessary. If possible, try to do so that the
} * "current" stays the same place on the screen.
}
/* Collapse the rows as necessary. If possible, try to do
* so that the "current" stays the same place on the
* screen
*/ */
#if 0
/* This behaviour is confusing --jrb and quartic (and MS, apparently)*/
if (tmp_list) { if (tmp_list) {
if (current) { if (current) {
row = g_list_position (clist->row_list, (GList *)current); row = g_list_position (clist->row_list, (GList *) current);
old_y = row * clist->row_height - clist->vadjustment->value; old_y = row * clist->row_height - clist->vadjustment->value;
} }
free_list = tmp_list; free_list = tmp_list;
while (tmp_list) {
gtk_ctree_collapse (GTK_CTREE (panel->tree), tmp_list->data);
tmp_list = tmp_list->next;
}
for (; tmp_list; tmp_list = tmp_list->next)
gtk_ctree_collapse (GTK_CTREE (panel->tree), tmp_list->data);
/* We have to calculate the row position again because rows may
* have shifted during the collapse.
*/
if (current) { if (current) {
row = g_list_position (clist->row_list, (GList *)current); row = g_list_position (clist->row_list, (GList *) current);
new_y = row * clist->row_height - clist->vadjustment->value; new_y = row * clist->row_height - clist->vadjustment->value;
if (new_y != old_y) { if (new_y != old_y)
gtk_adjustment_set_value (clist->vadjustment, gtk_adjustment_set_value (clist->vadjustment,
clist->vadjustment->value + new_y - old_y); clist->vadjustment->value + new_y - old_y);
}
} }
if (free_list->prev) if (free_list->prev)
@ -2060,7 +2050,6 @@ panel_tree_check_auto_expand (WPanel *panel, GtkCTreeNode *current)
free_list->prev = NULL; free_list->prev = NULL;
g_list_free (free_list); g_list_free (free_list);
} }
#endif
} }
/** /**
@ -2128,6 +2117,7 @@ panel_tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y
GtkDTree *dtree; GtkDTree *dtree;
WPanel *panel; WPanel *panel;
int on_row, row, col; int on_row, row, col;
GtkCTreeNode *node;
GdkDragAction action; GdkDragAction action;
GtkWidget *source_widget; GtkWidget *source_widget;
char *row_path; char *row_path;
@ -2159,15 +2149,14 @@ panel_tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y
action = 0; action = 0;
if (on_row) { if (on_row) {
row_path = gtk_dtree_get_row_path (dtree, node = gtk_ctree_node_nth (GTK_CTREE (dtree), row);
gtk_ctree_node_nth (GTK_CTREE (dtree), row), row_path = gtk_dtree_get_row_path (dtree, node, 0);
0);
if (row != panel->drag_tree_row) { if (row != panel->drag_tree_row) {
/* Highlight the row by selecting it */ /* Highlight the row by selecting it */
#if 0
panel_tree_check_auto_expand (GTK_CTREE (widget), row); panel_tree_check_auto_expand (panel, node);
#endif
dtree->internal = TRUE; dtree->internal = TRUE;
gtk_clist_select_row (GTK_CLIST (widget), row, 0); gtk_clist_select_row (GTK_CLIST (widget), row, 0);
dtree->internal = FALSE; dtree->internal = FALSE;
@ -2215,8 +2204,10 @@ panel_tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y
g_free (parent_dir); g_free (parent_dir);
g_free (row_path); g_free (row_path);
} else } else {
panel->drag_tree_row = -1; panel->drag_tree_row = -1;
panel_tree_check_auto_expand (panel, NULL);
}
gdk_drag_status (context, action, time); gdk_drag_status (context, action, time);
return TRUE; return TRUE;
@ -2244,6 +2235,9 @@ panel_tree_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, g
panel->drag_tree_fe = NULL; panel->drag_tree_fe = NULL;
} }
if (panel->drag_tree_row != -1)
panel_tree_check_auto_expand (panel, NULL);
panel->drag_tree_row = -1; panel->drag_tree_row = -1;
} }

Просмотреть файл

@ -459,18 +459,14 @@ gtk_dtree_collapse (GtkCTree *ctree, GtkCTreeNode *node)
if (!sel) if (!sel)
do_select = TRUE; do_select = TRUE;
else { else {
if (gtk_ctree_is_ancestor (ctree, node, sel->data)) if (node != sel->data && gtk_dtree_is_ancestor (GTK_DTREE (ctree), node, sel->data))
do_select = TRUE; do_select = TRUE;
} }
gtk_clist_freeze (GTK_CLIST (ctree));
(* parent_class->tree_collapse) (ctree, node); (* parent_class->tree_collapse) (ctree, node);
if (do_select) if (do_select)
gtk_ctree_select (ctree, node); gtk_ctree_select (ctree, node);
gtk_clist_thaw (GTK_CLIST (ctree));
} }
/* /*
@ -808,3 +804,30 @@ gtk_dtree_get_type (void)
return dtree_type; return dtree_type;
} }
/**
* gtk_dtree_is_ancestor:
* @dtree: A tree
* @node: The presumed ancestor node
* @child: The presumed child node
*
* Tests whether a node is an ancestor of a child node. This does this in
* O(height of child), instead of O(number of children in node), like GtkCTree
* does.
*
* Return value: TRUE if the node is an ancestor of the child, FALSE otherwise.
**/
gboolean
gtk_dtree_is_ancestor (GtkDTree *dtree, GtkCTreeNode *node, GtkCTreeNode *child)
{
g_return_val_if_fail (dtree != NULL, FALSE);
g_return_val_if_fail (GTK_IS_DTREE (dtree), FALSE);
g_return_val_if_fail (node != NULL, FALSE);
g_return_val_if_fail (child != NULL, FALSE);
for (; child; child = GTK_CTREE_ROW (child)->parent)
if (child == node)
return TRUE;
return FALSE;
}

Просмотреть файл

@ -55,4 +55,6 @@ char *gtk_dtree_get_row_path (GtkDTree *ctree,
gint column); gint column);
void gtk_dtree_construct (GtkDTree *dtree); void gtk_dtree_construct (GtkDTree *dtree);
gboolean gtk_dtree_is_ancestor (GtkDTree *dtree, GtkCTreeNode *node, GtkCTreeNode *child);
#endif #endif