2000-10-05 01:04:57 +00:00
|
|
|
|
/* gtktreeview.c
|
|
|
|
|
* Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
|
|
|
|
|
*
|
2001-08-22 22:27:41 +00:00
|
|
|
|
This library is free software; you can redistribute it and/or
|
2000-10-05 01:04:57 +00:00
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
* Library General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "gtktreeview.h"
|
|
|
|
|
#include "gtkrbtree.h"
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
#include "gtktreednd.h"
|
2000-10-05 01:04:57 +00:00
|
|
|
|
#include "gtktreeprivate.h"
|
|
|
|
|
#include "gtkcellrenderer.h"
|
|
|
|
|
#include "gtksignal.h"
|
|
|
|
|
#include "gtkmain.h"
|
|
|
|
|
#include "gtkbutton.h"
|
|
|
|
|
#include "gtkalignment.h"
|
|
|
|
|
#include "gtklabel.h"
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
#include "gtkhbox.h"
|
|
|
|
|
#include "gtkarrow.h"
|
2001-03-05 20:07:18 +00:00
|
|
|
|
#include "gtkintl.h"
|
2001-06-01 22:57:30 +00:00
|
|
|
|
#include "gtkbindings.h"
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
#include "gtkcontainer.h"
|
|
|
|
|
#include "gtkentry.h"
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
#include <string.h>
|
2000-10-05 01:04:57 +00:00
|
|
|
|
#include <gdk/gdkkeysyms.h>
|
|
|
|
|
|
2001-04-12 16:11:54 +00:00
|
|
|
|
#if defined (GDK_WINDOWING_X11)
|
|
|
|
|
#include "x11/gdkx.h"
|
|
|
|
|
#elif defined (GDK_WINDOWING_WIN32)
|
|
|
|
|
#include "win32/gdkwin32.h"
|
|
|
|
|
#elif defined(GDK_WINDOWING_FB)
|
|
|
|
|
#include "linux-fb/gdkfb.h"
|
|
|
|
|
#elif defined (GDK_WINDOWING_NANOX)
|
|
|
|
|
#include "nanox/gdkprivate-nanox.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
#define SCROLL_EDGE_SIZE 15
|
2001-07-22 20:09:00 +00:00
|
|
|
|
#define EXPANDER_EXTRA_PADDING 4
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
/* The "background" areas of all rows/cells add up to cover the entire tree.
|
|
|
|
|
* The background includes all inter-row and inter-cell spacing.
|
|
|
|
|
* The "cell" areas are the cell_area passed in to gtk_cell_renderer_render(),
|
|
|
|
|
* i.e. just the cells, no spacing.
|
|
|
|
|
*/
|
|
|
|
|
#define BACKGROUND_FIRST_PIXEL(tree_view,tree,node) (_gtk_rbtree_node_find_offset ((tree), (node)) + TREE_VIEW_HEADER_HEIGHT ((tree_view)))
|
2001-04-26 23:17:36 +00:00
|
|
|
|
#define CELL_FIRST_PIXEL(tree_view,tree,node,separator) (BACKGROUND_FIRST_PIXEL (tree_view,tree,node) + separator/2)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
|
|
|
|
#define BACKGROUND_HEIGHT(node) (GTK_RBNODE_GET_HEIGHT (node))
|
2001-04-26 23:17:36 +00:00
|
|
|
|
#define CELL_HEIGHT(node, separator) (BACKGROUND_HEIGHT (node) - separator);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
|
|
|
|
#define TREE_WINDOW_Y_TO_RBTREE_Y(tree_view,y) ((y) - TREE_VIEW_HEADER_HEIGHT (tree_view))
|
|
|
|
|
#define RBTREE_Y_TO_TREE_WINDOW_Y(tree_view,y) ((y) + TREE_VIEW_HEADER_HEIGHT (tree_view))
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
typedef struct _GtkTreeViewChild GtkTreeViewChild;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
struct _GtkTreeViewChild
|
|
|
|
|
{
|
|
|
|
|
GtkWidget *widget;
|
|
|
|
|
gint x;
|
|
|
|
|
gint y;
|
|
|
|
|
};
|
|
|
|
|
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
typedef struct _TreeViewDragInfo TreeViewDragInfo;
|
|
|
|
|
struct _TreeViewDragInfo
|
|
|
|
|
{
|
|
|
|
|
GdkModifierType start_button_mask;
|
|
|
|
|
GtkTargetList *source_target_list;
|
|
|
|
|
GdkDragAction source_actions;
|
|
|
|
|
GClosure *row_draggable_closure;
|
|
|
|
|
|
|
|
|
|
GtkTargetList *dest_target_list;
|
|
|
|
|
GClosure *location_droppable_closure;
|
|
|
|
|
|
|
|
|
|
guint source_set : 1;
|
|
|
|
|
guint dest_set : 1;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Signals */
|
2001-03-16 22:59:24 +00:00
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
ROW_ACTIVATED,
|
2001-06-11 16:59:28 +00:00
|
|
|
|
TEST_EXPAND_ROW,
|
|
|
|
|
TEST_COLLAPSE_ROW,
|
|
|
|
|
ROW_EXPANDED,
|
|
|
|
|
ROW_COLLAPSED,
|
2001-05-09 13:18:46 +00:00
|
|
|
|
COLUMNS_CHANGED,
|
2001-06-01 22:57:30 +00:00
|
|
|
|
MOVE_CURSOR,
|
2001-06-08 23:51:21 +00:00
|
|
|
|
SELECT_CURSOR_ROW,
|
2001-06-07 00:07:32 +00:00
|
|
|
|
TOGGLE_CURSOR_ROW,
|
|
|
|
|
EXPAND_COLLAPSE_CURSOR_ROW,
|
|
|
|
|
SELECT_CURSOR_PARENT,
|
2001-03-16 22:59:24 +00:00
|
|
|
|
LAST_SIGNAL
|
|
|
|
|
};
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Properties */
|
2001-03-05 20:07:18 +00:00
|
|
|
|
enum {
|
|
|
|
|
PROP_0,
|
|
|
|
|
PROP_MODEL,
|
|
|
|
|
PROP_HADJUSTMENT,
|
|
|
|
|
PROP_VADJUSTMENT,
|
|
|
|
|
PROP_HEADERS_VISIBLE,
|
|
|
|
|
PROP_HEADERS_CLICKABLE,
|
|
|
|
|
PROP_EXPANDER_COLUMN,
|
2001-05-16 00:23:30 +00:00
|
|
|
|
PROP_REORDERABLE,
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
PROP_RULES_HINT,
|
|
|
|
|
PROP_ENABLE_SEARCH,
|
|
|
|
|
PROP_SEARCH_COLUMN,
|
2001-03-05 20:07:18 +00:00
|
|
|
|
};
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
static void gtk_tree_view_class_init (GtkTreeViewClass *klass);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void gtk_tree_view_init (GtkTreeView *tree_view);
|
|
|
|
|
|
|
|
|
|
/* object signals */
|
|
|
|
|
static void gtk_tree_view_finalize (GObject *object);
|
2001-03-05 20:07:18 +00:00
|
|
|
|
static void gtk_tree_view_set_property (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
const GValue *value,
|
2001-03-09 00:40:18 +00:00
|
|
|
|
GParamSpec *pspec);
|
2001-03-05 20:07:18 +00:00
|
|
|
|
static void gtk_tree_view_get_property (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
GValue *value,
|
2001-03-09 00:40:18 +00:00
|
|
|
|
GParamSpec *pspec);
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* gtkobject signals */
|
2001-03-09 00:40:18 +00:00
|
|
|
|
static void gtk_tree_view_destroy (GtkObject *object);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* gtkwidget signals */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static void gtk_tree_view_realize (GtkWidget *widget);
|
|
|
|
|
static void gtk_tree_view_unrealize (GtkWidget *widget);
|
|
|
|
|
static void gtk_tree_view_map (GtkWidget *widget);
|
|
|
|
|
static void gtk_tree_view_size_request (GtkWidget *widget,
|
|
|
|
|
GtkRequisition *requisition);
|
|
|
|
|
static void gtk_tree_view_size_allocate (GtkWidget *widget,
|
|
|
|
|
GtkAllocation *allocation);
|
|
|
|
|
static gboolean gtk_tree_view_expose (GtkWidget *widget,
|
|
|
|
|
GdkEventExpose *event);
|
2001-05-09 22:23:12 +00:00
|
|
|
|
static gboolean gtk_tree_view_key_press (GtkWidget *widget,
|
|
|
|
|
GdkEventKey *event);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static gboolean gtk_tree_view_motion (GtkWidget *widget,
|
|
|
|
|
GdkEventMotion *event);
|
|
|
|
|
static gboolean gtk_tree_view_enter_notify (GtkWidget *widget,
|
|
|
|
|
GdkEventCrossing *event);
|
|
|
|
|
static gboolean gtk_tree_view_leave_notify (GtkWidget *widget,
|
|
|
|
|
GdkEventCrossing *event);
|
|
|
|
|
static gboolean gtk_tree_view_button_press (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event);
|
|
|
|
|
static gboolean gtk_tree_view_button_release (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event);
|
2001-03-15 23:21:39 +00:00
|
|
|
|
static void gtk_tree_view_set_focus_child (GtkContainer *container,
|
|
|
|
|
GtkWidget *child);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static void gtk_tree_view_draw_focus (GtkWidget *widget);
|
|
|
|
|
static gint gtk_tree_view_focus_in (GtkWidget *widget,
|
|
|
|
|
GdkEventFocus *event);
|
|
|
|
|
static gint gtk_tree_view_focus_out (GtkWidget *widget,
|
|
|
|
|
GdkEventFocus *event);
|
2001-06-08 18:09:34 +00:00
|
|
|
|
static gint gtk_tree_view_focus (GtkWidget *widget,
|
2000-10-05 01:04:57 +00:00
|
|
|
|
GtkDirectionType direction);
|
|
|
|
|
|
|
|
|
|
/* container signals */
|
|
|
|
|
static void gtk_tree_view_remove (GtkContainer *container,
|
|
|
|
|
GtkWidget *widget);
|
|
|
|
|
static void gtk_tree_view_forall (GtkContainer *container,
|
|
|
|
|
gboolean include_internals,
|
|
|
|
|
GtkCallback callback,
|
|
|
|
|
gpointer callback_data);
|
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
/* Source side drag signals */
|
|
|
|
|
static void gtk_tree_view_drag_begin (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context);
|
|
|
|
|
static void gtk_tree_view_drag_end (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context);
|
|
|
|
|
static void gtk_tree_view_drag_data_get (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
GtkSelectionData *selection_data,
|
|
|
|
|
guint info,
|
|
|
|
|
guint time);
|
|
|
|
|
static void gtk_tree_view_drag_data_delete (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context);
|
|
|
|
|
|
|
|
|
|
/* Target side drag signals */
|
|
|
|
|
static void gtk_tree_view_drag_leave (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
guint time);
|
|
|
|
|
static gboolean gtk_tree_view_drag_motion (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
guint time);
|
|
|
|
|
static gboolean gtk_tree_view_drag_drop (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
guint time);
|
|
|
|
|
static void gtk_tree_view_drag_data_received (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
GtkSelectionData *selection_data,
|
|
|
|
|
guint info,
|
|
|
|
|
guint time);
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
/* tree_model signals */
|
2001-06-07 00:07:32 +00:00
|
|
|
|
static void gtk_tree_view_set_adjustments (GtkTreeView *tree_view,
|
|
|
|
|
GtkAdjustment *hadj,
|
|
|
|
|
GtkAdjustment *vadj);
|
|
|
|
|
static void gtk_tree_view_real_move_cursor (GtkTreeView *tree_view,
|
|
|
|
|
GtkMovementStep step,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gint count);
|
2001-06-08 23:51:21 +00:00
|
|
|
|
static void gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
static void gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_real_expand_collapse_cursor_row (GtkTreeView *tree_view,
|
|
|
|
|
gboolean logical,
|
|
|
|
|
gboolean expand,
|
|
|
|
|
gboolean open_all);
|
|
|
|
|
static void gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_range_changed (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
GtkTreePath *end_path,
|
|
|
|
|
GtkTreeIter *end_iter,
|
|
|
|
|
gpointer data);
|
|
|
|
|
static void gtk_tree_view_inserted (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gpointer data);
|
|
|
|
|
static void gtk_tree_view_has_child_toggled (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gpointer data);
|
|
|
|
|
static void gtk_tree_view_deleted (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
gpointer data);
|
|
|
|
|
static void gtk_tree_view_reordered (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *parent,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint *new_order,
|
|
|
|
|
gpointer data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
/* Internal functions */
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
static gboolean gtk_tree_view_is_expander_column (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column);
|
|
|
|
|
static void gtk_tree_view_add_move_binding (GtkBindingSet *binding_set,
|
|
|
|
|
guint keyval,
|
|
|
|
|
guint modmask,
|
|
|
|
|
GtkMovementStep step,
|
|
|
|
|
gint count);
|
|
|
|
|
static gint gtk_tree_view_unref_and_check_selection_tree (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree);
|
|
|
|
|
static void gtk_tree_view_queue_draw_node (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
GdkRectangle *clip_rect);
|
|
|
|
|
static void gtk_tree_view_queue_draw_path (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GdkRectangle *clip_rect);
|
|
|
|
|
static void gtk_tree_view_queue_draw_arrow (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
GdkRectangle *clip_rect);
|
|
|
|
|
static void gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y);
|
|
|
|
|
static void gtk_tree_view_get_arrow_xrange (GtkTreeView *tree_view,
|
|
|
|
|
gint *x1,
|
|
|
|
|
gint *x2);
|
|
|
|
|
static gint gtk_tree_view_new_column_width (GtkTreeView *tree_view,
|
|
|
|
|
gint i,
|
|
|
|
|
gint *x);
|
|
|
|
|
static void gtk_tree_view_ensure_scroll_timeout (GtkTreeView *tree_view,
|
|
|
|
|
GFunc func);
|
|
|
|
|
static void gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
|
|
|
|
|
GtkTreeView *tree_view);
|
|
|
|
|
static gint gtk_tree_view_insert_iter_height (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth);
|
|
|
|
|
static void gtk_tree_view_build_tree (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth,
|
|
|
|
|
gboolean recurse,
|
|
|
|
|
gboolean calc_bounds);
|
|
|
|
|
static void gtk_tree_view_calc_size (GtkTreeView *priv,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth);
|
|
|
|
|
static gboolean gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth,
|
2001-08-19 04:19:56 +00:00
|
|
|
|
gint *height,
|
|
|
|
|
GtkRBNode *node);
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
static void gtk_tree_view_discover_dirty (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth);
|
|
|
|
|
static void gtk_tree_view_check_dirty (GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node);
|
|
|
|
|
static gboolean gtk_tree_view_maybe_begin_dragging_row (GtkTreeView *tree_view,
|
|
|
|
|
GdkEventMotion *event);
|
|
|
|
|
static void _gtk_tree_view_update_col_width (GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_focus_to_cursor (GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
|
|
|
|
gint count);
|
|
|
|
|
static void gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
|
|
|
|
|
gint count);
|
|
|
|
|
static void gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
|
|
|
|
|
gint count);
|
|
|
|
|
static void gtk_tree_view_move_cursor_start_end (GtkTreeView *tree_view,
|
|
|
|
|
gint count);
|
|
|
|
|
static gboolean gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node);
|
|
|
|
|
static gboolean gtk_tree_view_real_expand_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
gboolean open_all);
|
|
|
|
|
static void gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
gboolean clear_and_select);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* interactive search */
|
|
|
|
|
static void gtk_tree_view_search_dialog_destroy (GtkWidget *search_dialog,
|
|
|
|
|
GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_search_position_func (GtkTreeView *tree_view,
|
|
|
|
|
GtkWidget *search_dialog);
|
|
|
|
|
static gboolean gtk_tree_view_search_delete_event (GtkWidget *widget,
|
|
|
|
|
GdkEventAny *event,
|
|
|
|
|
GtkTreeView *tree_view);
|
|
|
|
|
static gboolean gtk_tree_view_search_button_press_event (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event,
|
|
|
|
|
GtkTreeView *tree_view);
|
|
|
|
|
static gboolean gtk_tree_view_search_key_press_event (GtkWidget *entry,
|
|
|
|
|
GdkEventKey *event,
|
|
|
|
|
GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_search_move (GtkWidget *window,
|
|
|
|
|
GtkTreeView *tree_view,
|
|
|
|
|
gboolean up);
|
|
|
|
|
static gboolean gtk_tree_view_search_equal_func (GtkTreeModel *model,
|
|
|
|
|
gint column,
|
|
|
|
|
gchar *key,
|
|
|
|
|
GtkTreeIter *iter);
|
|
|
|
|
static gboolean gtk_tree_view_search_iter (GtkTreeModel *model,
|
|
|
|
|
GtkTreeSelection *selection,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gchar *text,
|
|
|
|
|
gint *count,
|
|
|
|
|
gint n);
|
|
|
|
|
static void gtk_tree_view_search_init (GtkWidget *entry,
|
|
|
|
|
GtkTreeView *tree_view);
|
|
|
|
|
static void gtk_tree_view_interactive_search (GtkTreeView *tree_view,
|
|
|
|
|
GdkEventKey *key);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
static GtkContainerClass *parent_class = NULL;
|
2001-03-16 22:59:24 +00:00
|
|
|
|
static guint tree_view_signals[LAST_SIGNAL] = { 0 };
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* GType Methods
|
|
|
|
|
*/
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
GtkType
|
|
|
|
|
gtk_tree_view_get_type (void)
|
|
|
|
|
{
|
|
|
|
|
static GtkType tree_view_type = 0;
|
|
|
|
|
|
|
|
|
|
if (!tree_view_type)
|
|
|
|
|
{
|
|
|
|
|
static const GTypeInfo tree_view_info =
|
|
|
|
|
{
|
|
|
|
|
sizeof (GtkTreeViewClass),
|
|
|
|
|
NULL, /* base_init */
|
|
|
|
|
NULL, /* base_finalize */
|
|
|
|
|
(GClassInitFunc) gtk_tree_view_class_init,
|
|
|
|
|
NULL, /* class_finalize */
|
|
|
|
|
NULL, /* class_data */
|
|
|
|
|
sizeof (GtkTreeView),
|
|
|
|
|
0, /* n_preallocs */
|
|
|
|
|
(GInstanceInitFunc) gtk_tree_view_init
|
|
|
|
|
};
|
|
|
|
|
|
urg, removed implementation of gtk_marshal_VOID__INT_INT_INT_INT. if
Wed Oct 25 20:47:41 2000 Tim Janik <timj@gtk.org>
* gtk/gdk-pixbuf-loader.c (gdk_pixbuf_loader_class_init): urg, removed
implementation of gtk_marshal_VOID__INT_INT_INT_INT. if people do that,
couldn't they at least give it a non-standard name?
* gtk/gtktextlayout.c: arg! yet another implementation of
gtk_marshal_VOID__INT_INT_INT_INT(), is this a conspiracy?
* gtk/gtktextbuffer.c: gotcha! captured a vagabonding
gtk_marshal_VOID__INT_POINTER_INT() implementation, braught it back
home. now i know this _is_ a conspiracy.
* gtk/gtkwidget.c (gtk_widget_class_init): marshaller fixups for
::state-changed.
* gtk/gtkaccelgroup.c (gtk_accel_group_create_remove):
(gtk_accel_group_create_add): marshaller signature fixups.
* gtk/gtklistitem.c (gtk_list_item_class_init): signal creation fixups,
pass in GTK_TYPE_SCROLL_TYPE instead of GTK_TYPE_ENUM.
* gtk/gtkobject.[hc]: removed GTK_CONNECTED flag, it's not valid
anymore.
Tue Oct 24 23:59:21 2000 Tim Janik <timj@gtk.org>
* docs/reference/Makefile.am: disabled SUBDIRS for the moment, since
due to the signal system changes, it wouldn't build currently. to
be fixed soon.
* docs/Changes-2.0.txt: GtkSignal/GSignal updates.
* gtk/gtkwidget.c: ::direction_changed takes an enum as argument,
so it needs gtk_marshal_VOID__ENUM() instead of
gtk_marshal_NONE__UINT().
* gdk/gdk*.c: adapted type registration functions.
* gtk/gtkbindings.c:
* gtk/gtkaccelgroup.c: operate on GSignalQuery, GtkSignalQuery is
gone.
* gtk/gtkenums.h: define GtkSignalRunType in terms of GSignalType.
* gtk/gtkobject.c:
(gtk_object_destroy):
(gtk_object_shutdown): fixed recursion guards. basically we have to
catch the case where any of GObject.shutdown() or gtk_object_destroy()
is called during ::destroy, and avoid recursion there.
* gtk/gtktypeutils.c:
* gtk/maketypes.awk: awk-script hackup to provide gtk_type_init() with
boxed_copy/boxed_free. this needs a more general solution based on a
publically installed code-generator utility.
* gtk/gtktypeutils.[hc]: compat aliased GTK_TYPE_BOXED to G_TYPE_BOXED,
glib's gobject has support for that now.
define GtkSignalMarshaller in terms of GSignalCMarshaller.
Mon Oct 23 09:36:42 2000 Tim Janik <timj@gtk.org>
* gtk/gtksignal.[hc]:
* gtk/gtkmarshal.[hc]:
* gtk/Makefile.am: generate marshallers with glib-genmarshal and don't
compile gtkmarshal.c on its own anymore, just include it in gtksignal.c.
removed #include <gtkmarshal.h>s all over the place, gtksignal.h takes
care of that.
* *.c: marshaller name fixups.
* gtk/gtkmarshal.list: added a comment briefing the format.
Sun Oct 22 23:14:39 2000 Tim Janik <timj@gtk.org>
* gtk/gtksignal.[hc]: nuked old implementation. we mostly have
compatibility macros here now. more specifically, most of
the API is preserved (yes, _most_, nonwithstanding the
following exceptions listed, the API is stil lHUGE ;)
things that got removed completely:
GtkSignalQuery, gtk_signal_query(), gtk_signal_n_emissions(),
gtk_signal_n_emissions_by_name(), gtk_signal_handlers_destroy(),
gtk_signal_set_funcs(), gtk_signal_handler_pending_by_id(),
gtk_signal_add_emission_hook(), gtk_signal_add_emission_hook_full(),
gtk_signal_remove_emission_hook().
non-functional functions variants:
gtk_signal_add_emission_hook(), gtk_signal_remove_emission_hook().
the GtkCallbackMarshal argument to gtk_signal_connect_full() is
not supported anymore.
(gtk_signal_compat_matched): new internal function to aid
implementation of the compatibility macros, it provides
functionality to block/unblock/disconnect handlers based
on func/data.
* gtk/gtkenums.h: define GtkSignalRunType in terms of GSignalType,
* *.c: adaptions to new type registration API signatures.
Fri Oct 20 15:26:33 2000 Tim Janik <timj@gtk.org>
* gtk/gtktypeutils.[hc]: removed G_TYPE_GTK_POINTER cludge.
2000-10-25 22:34:14 +00:00
|
|
|
|
tree_view_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkTreeView", &tree_view_info, 0);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return tree_view_type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_class_init (GtkTreeViewClass *class)
|
|
|
|
|
{
|
2001-01-21 18:45:20 +00:00
|
|
|
|
GObjectClass *o_class;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
GtkObjectClass *object_class;
|
|
|
|
|
GtkWidgetClass *widget_class;
|
|
|
|
|
GtkContainerClass *container_class;
|
2001-06-01 22:57:30 +00:00
|
|
|
|
GtkBindingSet *binding_set;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
parent_class = g_type_class_peek_parent (class);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
binding_set = gtk_binding_set_by_class (class);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-01-21 18:45:20 +00:00
|
|
|
|
o_class = (GObjectClass *) class;
|
|
|
|
|
object_class = (GtkObjectClass *) class;
|
|
|
|
|
widget_class = (GtkWidgetClass *) class;
|
|
|
|
|
container_class = (GtkContainerClass *) class;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GObject signals */
|
2001-03-05 20:07:18 +00:00
|
|
|
|
o_class->set_property = gtk_tree_view_set_property;
|
|
|
|
|
o_class->get_property = gtk_tree_view_get_property;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
o_class->finalize = gtk_tree_view_finalize;
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GtkObject signals */
|
2001-03-09 00:40:18 +00:00
|
|
|
|
object_class->destroy = gtk_tree_view_destroy;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GtkWidget signals */
|
|
|
|
|
widget_class->map = gtk_tree_view_map;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
widget_class->realize = gtk_tree_view_realize;
|
|
|
|
|
widget_class->unrealize = gtk_tree_view_unrealize;
|
|
|
|
|
widget_class->size_request = gtk_tree_view_size_request;
|
|
|
|
|
widget_class->size_allocate = gtk_tree_view_size_allocate;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
widget_class->button_press_event = gtk_tree_view_button_press;
|
|
|
|
|
widget_class->button_release_event = gtk_tree_view_button_release;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
widget_class->motion_notify_event = gtk_tree_view_motion;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
widget_class->expose_event = gtk_tree_view_expose;
|
2001-05-09 22:23:12 +00:00
|
|
|
|
widget_class->key_press_event = gtk_tree_view_key_press;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
widget_class->enter_notify_event = gtk_tree_view_enter_notify;
|
|
|
|
|
widget_class->leave_notify_event = gtk_tree_view_leave_notify;
|
|
|
|
|
widget_class->focus_in_event = gtk_tree_view_focus_in;
|
|
|
|
|
widget_class->focus_out_event = gtk_tree_view_focus_out;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
widget_class->drag_begin = gtk_tree_view_drag_begin;
|
|
|
|
|
widget_class->drag_end = gtk_tree_view_drag_end;
|
|
|
|
|
widget_class->drag_data_get = gtk_tree_view_drag_data_get;
|
|
|
|
|
widget_class->drag_data_delete = gtk_tree_view_drag_data_delete;
|
|
|
|
|
widget_class->drag_leave = gtk_tree_view_drag_leave;
|
|
|
|
|
widget_class->drag_motion = gtk_tree_view_drag_motion;
|
|
|
|
|
widget_class->drag_drop = gtk_tree_view_drag_drop;
|
|
|
|
|
widget_class->drag_data_received = gtk_tree_view_drag_data_received;
|
2001-06-08 18:09:34 +00:00
|
|
|
|
widget_class->focus = gtk_tree_view_focus;
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GtkContainer signals */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
container_class->remove = gtk_tree_view_remove;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
container_class->forall = gtk_tree_view_forall;
|
|
|
|
|
container_class->set_focus_child = gtk_tree_view_set_focus_child;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
class->set_scroll_adjustments = gtk_tree_view_set_adjustments;
|
2001-06-01 22:57:30 +00:00
|
|
|
|
class->move_cursor = gtk_tree_view_real_move_cursor;
|
2001-06-08 23:51:21 +00:00
|
|
|
|
class->select_cursor_row = gtk_tree_view_real_select_cursor_row;
|
2001-06-07 00:07:32 +00:00
|
|
|
|
class->toggle_cursor_row = gtk_tree_view_real_toggle_cursor_row;
|
|
|
|
|
class->expand_collapse_cursor_row = gtk_tree_view_real_expand_collapse_cursor_row;
|
|
|
|
|
class->select_cursor_parent = gtk_tree_view_real_select_cursor_parent;
|
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
/* Properties */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-03-05 20:07:18 +00:00
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_MODEL,
|
2001-03-07 14:49:21 +00:00
|
|
|
|
g_param_spec_object ("model",
|
|
|
|
|
_("TreeView Model"),
|
|
|
|
|
_("The model for the tree view"),
|
|
|
|
|
GTK_TYPE_TREE_MODEL,
|
|
|
|
|
G_PARAM_READWRITE));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-03-05 20:07:18 +00:00
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_HADJUSTMENT,
|
|
|
|
|
g_param_spec_object ("hadjustment",
|
|
|
|
|
_("Horizontal Adjustment"),
|
2001-03-06 00:33:07 +00:00
|
|
|
|
_("Horizontal Adjustment for the widget"),
|
2001-03-05 20:07:18 +00:00
|
|
|
|
GTK_TYPE_ADJUSTMENT,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_VADJUSTMENT,
|
|
|
|
|
g_param_spec_object ("vadjustment",
|
|
|
|
|
_("Vertical Adjustment"),
|
2001-03-06 00:33:07 +00:00
|
|
|
|
_("Vertical Adjustment for the widget"),
|
2001-03-05 20:07:18 +00:00
|
|
|
|
GTK_TYPE_ADJUSTMENT,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_HEADERS_VISIBLE,
|
|
|
|
|
g_param_spec_boolean ("headers_visible",
|
|
|
|
|
_("Visible"),
|
2001-03-06 00:33:07 +00:00
|
|
|
|
_("Show the column header buttons"),
|
2001-03-05 20:07:18 +00:00
|
|
|
|
FALSE,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_HEADERS_CLICKABLE,
|
|
|
|
|
g_param_spec_boolean ("headers_clickable",
|
|
|
|
|
_("Headers Clickable"),
|
2001-03-06 00:33:07 +00:00
|
|
|
|
_("Column headers respond to click events"),
|
2001-03-05 20:07:18 +00:00
|
|
|
|
FALSE,
|
2001-04-28 05:17:31 +00:00
|
|
|
|
G_PARAM_WRITABLE));
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_EXPANDER_COLUMN,
|
2001-06-29 03:11:01 +00:00
|
|
|
|
g_param_spec_object ("expander_column",
|
|
|
|
|
_("Expander Column"),
|
|
|
|
|
_("Set the column for the expander column"),
|
|
|
|
|
GTK_TYPE_TREE_VIEW_COLUMN,
|
|
|
|
|
G_PARAM_READWRITE));
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_REORDERABLE,
|
|
|
|
|
g_param_spec_boolean ("reorderable",
|
|
|
|
|
_("Reorderable"),
|
|
|
|
|
_("View is reorderable"),
|
|
|
|
|
FALSE,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
2001-03-05 20:07:18 +00:00
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_RULES_HINT,
|
|
|
|
|
g_param_spec_boolean ("rules_hint",
|
|
|
|
|
_("Rules Hint"),
|
2001-03-06 00:33:07 +00:00
|
|
|
|
_("Set a hint to the theme engine to draw rows in alternating colors"),
|
2001-03-05 20:07:18 +00:00
|
|
|
|
FALSE,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_ENABLE_SEARCH,
|
|
|
|
|
g_param_spec_boolean ("enable_search",
|
|
|
|
|
_("Enable Search"),
|
|
|
|
|
_("View allows user to search through columns interactively"),
|
|
|
|
|
TRUE,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
|
|
|
|
g_object_class_install_property (o_class,
|
|
|
|
|
PROP_SEARCH_COLUMN,
|
|
|
|
|
g_param_spec_int ("search_column",
|
|
|
|
|
_("Search Column"),
|
|
|
|
|
_("Model column to search through when searching through code"),
|
|
|
|
|
-1,
|
|
|
|
|
G_MAXINT,
|
|
|
|
|
0,
|
|
|
|
|
G_PARAM_READWRITE));
|
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
/* Style properties */
|
|
|
|
|
/* the width of the column resize windows */
|
2001-07-22 20:09:00 +00:00
|
|
|
|
#define _TREE_VIEW_EXPANDER_SIZE 10
|
2001-06-01 22:57:30 +00:00
|
|
|
|
#define _TREE_VIEW_VERTICAL_SEPARATOR 2
|
|
|
|
|
#define _TREE_VIEW_HORIZONTAL_SEPARATOR 0
|
|
|
|
|
|
|
|
|
|
gtk_widget_class_install_style_property (widget_class,
|
2001-07-22 20:09:00 +00:00
|
|
|
|
g_param_spec_int ("expander_size",
|
|
|
|
|
_("Expander Size"),
|
|
|
|
|
_("Size of the expander arrow"),
|
2001-06-01 22:57:30 +00:00
|
|
|
|
0,
|
|
|
|
|
G_MAXINT,
|
2001-07-22 20:09:00 +00:00
|
|
|
|
_TREE_VIEW_EXPANDER_SIZE,
|
2001-06-01 22:57:30 +00:00
|
|
|
|
G_PARAM_READABLE));
|
2001-07-22 20:09:00 +00:00
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
gtk_widget_class_install_style_property (widget_class,
|
|
|
|
|
g_param_spec_int ("vertical_separator",
|
|
|
|
|
_("Vertical Separator Width"),
|
|
|
|
|
_("Vertical space between cells"),
|
|
|
|
|
0,
|
|
|
|
|
G_MAXINT,
|
|
|
|
|
_TREE_VIEW_VERTICAL_SEPARATOR,
|
|
|
|
|
G_PARAM_READABLE));
|
2001-07-22 20:09:00 +00:00
|
|
|
|
|
|
|
|
|
gtk_widget_class_install_style_property (widget_class,
|
2001-06-01 22:57:30 +00:00
|
|
|
|
g_param_spec_int ("horizontal_separator",
|
|
|
|
|
_("Horizontal Separator Width"),
|
|
|
|
|
_("Horizontal space between cells"),
|
|
|
|
|
0,
|
|
|
|
|
G_MAXINT,
|
|
|
|
|
_TREE_VIEW_HORIZONTAL_SEPARATOR,
|
|
|
|
|
G_PARAM_READABLE));
|
|
|
|
|
|
|
|
|
|
/* Signals */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
widget_class->set_scroll_adjustments_signal =
|
|
|
|
|
gtk_signal_new ("set_scroll_adjustments",
|
|
|
|
|
GTK_RUN_LAST,
|
|
|
|
|
GTK_CLASS_TYPE (object_class),
|
|
|
|
|
GTK_SIGNAL_OFFSET (GtkTreeViewClass, set_scroll_adjustments),
|
2001-03-07 14:49:21 +00:00
|
|
|
|
gtk_marshal_VOID__OBJECT_OBJECT,
|
2000-10-05 01:04:57 +00:00
|
|
|
|
GTK_TYPE_NONE, 2,
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
|
2001-03-16 22:59:24 +00:00
|
|
|
|
|
2001-04-02 23:38:54 +00:00
|
|
|
|
tree_view_signals[ROW_ACTIVATED] =
|
|
|
|
|
gtk_signal_new ("row_activated",
|
|
|
|
|
GTK_RUN_LAST | GTK_RUN_ACTION,
|
|
|
|
|
GTK_CLASS_TYPE (object_class),
|
|
|
|
|
GTK_SIGNAL_OFFSET (GtkTreeViewClass, row_activated),
|
|
|
|
|
gtk_marshal_VOID__BOXED_OBJECT,
|
|
|
|
|
GTK_TYPE_NONE, 2,
|
|
|
|
|
GTK_TYPE_TREE_PATH,
|
|
|
|
|
GTK_TYPE_TREE_VIEW_COLUMN);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-06-11 16:59:28 +00:00
|
|
|
|
tree_view_signals[TEST_EXPAND_ROW] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("test_expand_row",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, test_expand_row),
|
|
|
|
|
_gtk_boolean_handled_accumulator, NULL,
|
|
|
|
|
gtk_marshal_BOOLEAN__BOXED_BOXED,
|
|
|
|
|
G_TYPE_BOOLEAN, 2,
|
|
|
|
|
GTK_TYPE_TREE_ITER,
|
|
|
|
|
GTK_TYPE_TREE_PATH);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-06-11 16:59:28 +00:00
|
|
|
|
tree_view_signals[TEST_COLLAPSE_ROW] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("test_collapse_row",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, test_collapse_row),
|
|
|
|
|
_gtk_boolean_handled_accumulator, NULL,
|
|
|
|
|
gtk_marshal_BOOLEAN__BOXED_BOXED,
|
|
|
|
|
G_TYPE_BOOLEAN, 2,
|
|
|
|
|
GTK_TYPE_TREE_ITER,
|
|
|
|
|
GTK_TYPE_TREE_PATH);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-06-11 16:59:28 +00:00
|
|
|
|
tree_view_signals[ROW_EXPANDED] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("row_expanded",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, row_expanded),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_VOID__BOXED_BOXED,
|
|
|
|
|
GTK_TYPE_NONE, 2,
|
|
|
|
|
GTK_TYPE_TREE_ITER,
|
|
|
|
|
GTK_TYPE_TREE_PATH);
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
|
|
|
|
tree_view_signals[ROW_COLLAPSED] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("row_collapsed",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, row_collapsed),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_VOID__BOXED_BOXED,
|
|
|
|
|
GTK_TYPE_NONE, 2,
|
|
|
|
|
GTK_TYPE_TREE_ITER,
|
|
|
|
|
GTK_TYPE_TREE_PATH);
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
tree_view_signals[COLUMNS_CHANGED] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("columns_changed",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, columns_changed),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_NONE__NONE,
|
|
|
|
|
G_TYPE_NONE, 0);
|
2001-05-09 13:18:46 +00:00
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
tree_view_signals[MOVE_CURSOR] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("move_cursor",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST | GTK_RUN_ACTION,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, move_cursor),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_VOID__ENUM_INT,
|
|
|
|
|
GTK_TYPE_NONE, 2, GTK_TYPE_MOVEMENT_STEP, GTK_TYPE_INT);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-06-08 23:51:21 +00:00
|
|
|
|
tree_view_signals[SELECT_CURSOR_ROW] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("select_cursor_row",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST | GTK_RUN_ACTION,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, select_cursor_row),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_NONE__NONE,
|
|
|
|
|
GTK_TYPE_NONE, 0);
|
2001-06-08 23:51:21 +00:00
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
tree_view_signals[TOGGLE_CURSOR_ROW] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("toggle_cursor_row",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST | GTK_RUN_ACTION,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, toggle_cursor_row),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_NONE__NONE,
|
|
|
|
|
GTK_TYPE_NONE, 0);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
tree_view_signals[EXPAND_COLLAPSE_CURSOR_ROW] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("expand_collapse_cursor_row",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST | GTK_RUN_ACTION,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, expand_collapse_cursor_row),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_VOID__BOOLEAN_BOOLEAN_BOOLEAN,
|
|
|
|
|
GTK_TYPE_NONE, 3, GTK_TYPE_BOOL, GTK_TYPE_BOOL, GTK_TYPE_BOOL);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
tree_view_signals[SELECT_CURSOR_PARENT] =
|
2001-06-29 16:30:25 +00:00
|
|
|
|
g_signal_new ("select_cursor_parent",
|
|
|
|
|
G_TYPE_FROM_CLASS (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST | GTK_RUN_ACTION,
|
|
|
|
|
G_STRUCT_OFFSET (GtkTreeViewClass, select_cursor_parent),
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
gtk_marshal_NONE__NONE,
|
|
|
|
|
GTK_TYPE_NONE, 0);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
/* Key bindings */
|
2001-06-01 22:57:30 +00:00
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_Up, 0,
|
|
|
|
|
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_Down, 0,
|
|
|
|
|
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_p, GDK_CONTROL_MASK,
|
|
|
|
|
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_n, GDK_CONTROL_MASK,
|
|
|
|
|
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_Home, 0,
|
|
|
|
|
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_End, 0,
|
|
|
|
|
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_Page_Up, 0,
|
|
|
|
|
GTK_MOVEMENT_PAGES, -1);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_add_move_binding (binding_set, GDK_Page_Down, 0,
|
|
|
|
|
GTK_MOVEMENT_PAGES, 1);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
2001-06-08 23:51:21 +00:00
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_Right, 0, "move_cursor", 2,
|
|
|
|
|
GTK_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
|
|
|
|
GTK_TYPE_INT, 1);
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
2001-06-08 23:51:21 +00:00
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_Left, 0, "move_cursor", 2,
|
|
|
|
|
GTK_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
|
|
|
|
GTK_TYPE_INT, -1);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_f, GDK_CONTROL_MASK, "move_cursor", 2,
|
2001-06-07 00:07:32 +00:00
|
|
|
|
GTK_TYPE_ENUM, GTK_MOVEMENT_LOGICAL_POSITIONS,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
GTK_TYPE_INT, 1);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_b, GDK_CONTROL_MASK, "move_cursor", 2,
|
2001-06-07 00:07:32 +00:00
|
|
|
|
GTK_TYPE_ENUM, GTK_MOVEMENT_LOGICAL_POSITIONS,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
GTK_TYPE_INT, -1);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK, "toggle_cursor_row", 0);
|
|
|
|
|
|
2001-08-22 22:27:41 +00:00
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_SHIFT_MASK, "select_cursor_row", 0);
|
|
|
|
|
|
2001-06-08 23:51:21 +00:00
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_space, 0, "select_cursor_row", 0);
|
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
/* expand and collapse rows */
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_plus, 0, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE);
|
|
|
|
|
/* Not doable on US keyboards */
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_plus, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, 0, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_Right, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE);
|
|
|
|
|
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_minus, 0, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_minus, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, 0, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE);
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_Left, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, FALSE,
|
|
|
|
|
GTK_TYPE_BOOL, TRUE);
|
|
|
|
|
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, 0, "select_cursor_parent", 0);
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_init (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv = g_new0 (GtkTreeViewPrivate, 1);
|
|
|
|
|
|
|
|
|
|
GTK_WIDGET_SET_FLAGS (tree_view, GTK_CAN_FOCUS);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->flags = GTK_TREE_VIEW_IS_LIST | GTK_TREE_VIEW_SHOW_EXPANDERS | GTK_TREE_VIEW_DRAW_KEYFOCUS | GTK_TREE_VIEW_HEADERS_VISIBLE;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (tree_view), "expander_size", &tree_view->priv->tab_offset, NULL);
|
|
|
|
|
|
|
|
|
|
/* We need some padding */
|
|
|
|
|
tree_view->priv->tab_offset += EXPANDER_EXTRA_PADDING;
|
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
tree_view->priv->n_columns = 0;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
tree_view->priv->header_height = 1;
|
|
|
|
|
tree_view->priv->x_drag = 0;
|
|
|
|
|
tree_view->priv->drag_pos = -1;
|
2001-03-08 22:38:59 +00:00
|
|
|
|
tree_view->priv->header_has_focus = FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
tree_view->priv->pressed_button = -1;
|
|
|
|
|
tree_view->priv->press_start_x = -1;
|
|
|
|
|
tree_view->priv->press_start_y = -1;
|
2001-05-16 00:23:30 +00:00
|
|
|
|
tree_view->priv->reorderable = FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
gtk_tree_view_set_adjustments (tree_view, NULL, NULL);
|
2001-06-08 22:59:37 +00:00
|
|
|
|
tree_view->priv->selection = _gtk_tree_selection_new_with_tree_view (tree_view);
|
2001-02-23 23:00:52 +00:00
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
tree_view->priv->enable_search = TRUE;
|
|
|
|
|
tree_view->priv->search_column = -1;
|
|
|
|
|
tree_view->priv->search_dialog_position_func = gtk_tree_view_search_position_func;
|
|
|
|
|
tree_view->priv->search_equal_func = gtk_tree_view_search_equal_func;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GObject Methods
|
2001-01-21 18:45:20 +00:00
|
|
|
|
*/
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_set_property (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
const GValue *value,
|
|
|
|
|
GParamSpec *pspec)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (object);
|
|
|
|
|
|
|
|
|
|
switch (prop_id)
|
|
|
|
|
{
|
|
|
|
|
case PROP_MODEL:
|
2001-08-17 16:33:04 +00:00
|
|
|
|
gtk_tree_view_set_model (tree_view, g_value_get_object (value));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
|
|
|
|
case PROP_HADJUSTMENT:
|
2001-08-17 16:33:04 +00:00
|
|
|
|
gtk_tree_view_set_hadjustment (tree_view, g_value_get_object (value));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
|
|
|
|
case PROP_VADJUSTMENT:
|
2001-08-17 16:33:04 +00:00
|
|
|
|
gtk_tree_view_set_vadjustment (tree_view, g_value_get_object (value));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
|
|
|
|
case PROP_HEADERS_VISIBLE:
|
|
|
|
|
gtk_tree_view_set_headers_visible (tree_view, g_value_get_boolean (value));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_HEADERS_CLICKABLE:
|
|
|
|
|
gtk_tree_view_set_headers_clickable (tree_view, g_value_get_boolean (value));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_EXPANDER_COLUMN:
|
2001-08-17 16:33:04 +00:00
|
|
|
|
gtk_tree_view_set_expander_column (tree_view, g_value_get_object (value));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
2001-05-16 00:23:30 +00:00
|
|
|
|
case PROP_REORDERABLE:
|
|
|
|
|
gtk_tree_view_set_reorderable (tree_view, g_value_get_boolean (value));
|
|
|
|
|
break;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
case PROP_RULES_HINT:
|
|
|
|
|
gtk_tree_view_set_rules_hint (tree_view, g_value_get_boolean (value));
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
case PROP_ENABLE_SEARCH:
|
|
|
|
|
gtk_tree_view_set_enable_search (tree_view, g_value_get_boolean (value));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_SEARCH_COLUMN:
|
|
|
|
|
gtk_tree_view_set_search_column (tree_view, g_value_get_int (value));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_get_property (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
GValue *value,
|
|
|
|
|
GParamSpec *pspec)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (object);
|
|
|
|
|
|
|
|
|
|
switch (prop_id)
|
|
|
|
|
{
|
|
|
|
|
case PROP_MODEL:
|
|
|
|
|
g_value_set_object (value, G_OBJECT (tree_view->priv->model));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_HADJUSTMENT:
|
|
|
|
|
g_value_set_object (value, G_OBJECT (tree_view->priv->hadjustment));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_VADJUSTMENT:
|
|
|
|
|
g_value_set_object (value, G_OBJECT (tree_view->priv->vadjustment));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_HEADERS_VISIBLE:
|
|
|
|
|
g_value_set_boolean (value, gtk_tree_view_get_headers_visible (tree_view));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_EXPANDER_COLUMN:
|
2001-06-29 03:11:01 +00:00
|
|
|
|
g_value_set_object (value, G_OBJECT (tree_view->priv->expander_column));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
2001-05-16 00:23:30 +00:00
|
|
|
|
case PROP_REORDERABLE:
|
|
|
|
|
g_value_set_boolean (value, tree_view->priv->reorderable);
|
|
|
|
|
break;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
case PROP_RULES_HINT:
|
|
|
|
|
g_value_set_boolean (value, tree_view->priv->has_rules);
|
|
|
|
|
break;
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
case PROP_ENABLE_SEARCH:
|
|
|
|
|
g_value_set_boolean (value, tree_view->priv->enable_search);
|
|
|
|
|
break;
|
|
|
|
|
case PROP_SEARCH_COLUMN:
|
|
|
|
|
g_value_set_int (value, tree_view->priv->search_column);
|
|
|
|
|
break;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-01-21 18:45:20 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_finalize (GObject *object)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = (GtkTreeView *) object;
|
|
|
|
|
|
|
|
|
|
g_free (tree_view->priv);
|
2001-03-16 22:59:24 +00:00
|
|
|
|
|
2001-01-21 18:45:20 +00:00
|
|
|
|
if (G_OBJECT_CLASS (parent_class)->finalize)
|
|
|
|
|
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* GtkObject Methods
|
|
|
|
|
*/
|
|
|
|
|
|
2001-03-09 00:40:18 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_destroy (GtkObject *object)
|
|
|
|
|
{
|
2001-08-17 16:33:04 +00:00
|
|
|
|
GtkTreeView *tree_view = GTK_TREE_VIEW (object);
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
GtkWidget *search_dialog;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
GList *list;
|
|
|
|
|
|
2001-08-21 03:53:13 +00:00
|
|
|
|
if (tree_view->priv->columns != NULL)
|
|
|
|
|
{
|
2001-08-21 04:49:15 +00:00
|
|
|
|
list = tree_view->priv->columns;
|
|
|
|
|
while (list)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
column = GTK_TREE_VIEW_COLUMN (list->data);
|
|
|
|
|
list = list->next;
|
|
|
|
|
gtk_tree_view_remove_column (tree_view, column);
|
|
|
|
|
}
|
2001-08-21 03:53:13 +00:00
|
|
|
|
tree_view->priv->columns = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2001-08-17 16:33:04 +00:00
|
|
|
|
gtk_tree_view_set_model (tree_view, NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-03-16 22:59:24 +00:00
|
|
|
|
if (tree_view->priv->tree != NULL)
|
|
|
|
|
{
|
2001-06-18 23:44:41 +00:00
|
|
|
|
gtk_tree_view_unref_and_check_selection_tree (tree_view, tree_view->priv->tree);
|
2001-03-16 22:59:24 +00:00
|
|
|
|
_gtk_rbtree_free (tree_view->priv->tree);
|
|
|
|
|
tree_view->priv->tree = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->model != NULL)
|
|
|
|
|
{
|
|
|
|
|
g_object_unref (G_OBJECT (tree_view->priv->model));
|
|
|
|
|
tree_view->priv->model = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->selection != NULL)
|
|
|
|
|
{
|
|
|
|
|
_gtk_tree_selection_set_tree_view (tree_view->priv->selection, NULL);
|
|
|
|
|
g_object_unref (tree_view->priv->selection);
|
|
|
|
|
tree_view->priv->selection = NULL;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-03-16 22:59:24 +00:00
|
|
|
|
if (tree_view->priv->scroll_to_path != NULL)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_path_free (tree_view->priv->scroll_to_path);
|
|
|
|
|
tree_view->priv->scroll_to_path = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->drag_dest_row != NULL)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
|
|
|
|
|
tree_view->priv->drag_dest_row = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
|
2001-05-09 22:23:12 +00:00
|
|
|
|
if (tree_view->priv->column_drop_func_data &&
|
|
|
|
|
tree_view->priv->column_drop_func_data_destroy)
|
|
|
|
|
{
|
|
|
|
|
(* tree_view->priv->column_drop_func_data_destroy) (tree_view->priv->column_drop_func_data);
|
|
|
|
|
tree_view->priv->column_drop_func_data = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-26 17:01:53 +00:00
|
|
|
|
if (tree_view->priv->destroy_count_destroy &&
|
|
|
|
|
tree_view->priv->destroy_count_data)
|
|
|
|
|
{
|
|
|
|
|
(* tree_view->priv->destroy_count_destroy) (tree_view->priv->destroy_count_data);
|
|
|
|
|
tree_view->priv->destroy_count_data = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
|
|
|
|
tree_view->priv->cursor = NULL;
|
|
|
|
|
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->anchor);
|
|
|
|
|
tree_view->priv->anchor = NULL;
|
|
|
|
|
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
/* destroy interactive search dialog */
|
|
|
|
|
search_dialog = gtk_object_get_data (GTK_OBJECT (tree_view), "search-dialog");
|
|
|
|
|
if (search_dialog)
|
|
|
|
|
gtk_tree_view_search_dialog_destroy (search_dialog,
|
|
|
|
|
tree_view);
|
|
|
|
|
|
2001-03-16 22:59:24 +00:00
|
|
|
|
if (GTK_OBJECT_CLASS (parent_class)->destroy)
|
|
|
|
|
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* GtkWidget Methods
|
2001-03-05 20:07:18 +00:00
|
|
|
|
*/
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
/* GtkWidget::map helper */
|
2001-03-05 20:07:18 +00:00
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_map_buttons (GtkTreeView *tree_view)
|
2001-03-05 20:07:18 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GList *list;
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_WIDGET_MAPPED (tree_view));
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
|
2001-03-05 20:07:18 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
|
|
|
|
if (GTK_WIDGET_VISIBLE (column->button) &&
|
|
|
|
|
!GTK_WIDGET_MAPPED (column->button))
|
|
|
|
|
gtk_widget_map (column->button);
|
|
|
|
|
}
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
|
|
|
|
if (column->visible == FALSE)
|
|
|
|
|
continue;
|
2001-06-25 23:48:51 +00:00
|
|
|
|
if (column->column_type == GTK_TREE_VIEW_COLUMN_RESIZABLE)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
gdk_window_raise (column->window);
|
|
|
|
|
gdk_window_show (column->window);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
gdk_window_hide (column->window);
|
|
|
|
|
}
|
|
|
|
|
gdk_window_show (tree_view->priv->header_window);
|
2001-03-05 20:07:18 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_map (GtkWidget *widget)
|
2001-03-05 20:07:18 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GList *tmp_list;
|
2001-03-05 20:07:18 +00:00
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
|
|
|
|
GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
|
|
|
|
|
|
|
|
|
|
tmp_list = tree_view->priv->children;
|
|
|
|
|
while (tmp_list)
|
2001-03-05 20:07:18 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewChild *child = tmp_list->data;
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_VISIBLE (child->widget))
|
|
|
|
|
{
|
|
|
|
|
if (!GTK_WIDGET_MAPPED (child->widget))
|
|
|
|
|
gtk_widget_map (child->widget);
|
|
|
|
|
}
|
2001-03-05 20:07:18 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_show (tree_view->priv->bin_window);
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_map_buttons (tree_view);
|
|
|
|
|
|
|
|
|
|
gdk_window_show (widget->window);
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_realize (GtkWidget *widget)
|
|
|
|
|
{
|
|
|
|
|
GList *tmp_list;
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GdkGCValues values;
|
|
|
|
|
GdkWindowAttr attributes;
|
|
|
|
|
gint attributes_mask;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_check_dirty (GTK_TREE_VIEW (widget));
|
|
|
|
|
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
|
|
|
|
|
|
|
|
|
|
/* Make the main, clipping window */
|
|
|
|
|
attributes.window_type = GDK_WINDOW_CHILD;
|
|
|
|
|
attributes.x = widget->allocation.x;
|
|
|
|
|
attributes.y = widget->allocation.y;
|
|
|
|
|
attributes.width = widget->allocation.width;
|
|
|
|
|
attributes.height = widget->allocation.height;
|
|
|
|
|
attributes.wclass = GDK_INPUT_OUTPUT;
|
|
|
|
|
attributes.visual = gtk_widget_get_visual (widget);
|
|
|
|
|
attributes.colormap = gtk_widget_get_colormap (widget);
|
|
|
|
|
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK;
|
|
|
|
|
|
|
|
|
|
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
|
|
|
|
|
|
|
|
|
|
widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
|
|
|
|
|
&attributes, attributes_mask);
|
|
|
|
|
gdk_window_set_user_data (widget->window, widget);
|
|
|
|
|
|
|
|
|
|
/* Make the window for the tree */
|
|
|
|
|
attributes.x = 0;
|
|
|
|
|
attributes.y = 0;
|
|
|
|
|
attributes.width = tree_view->priv->width;
|
|
|
|
|
attributes.height = tree_view->priv->height + TREE_VIEW_HEADER_HEIGHT (tree_view);
|
|
|
|
|
attributes.event_mask = GDK_EXPOSURE_MASK |
|
|
|
|
|
GDK_SCROLL_MASK |
|
|
|
|
|
GDK_POINTER_MOTION_MASK |
|
|
|
|
|
GDK_ENTER_NOTIFY_MASK |
|
|
|
|
|
GDK_LEAVE_NOTIFY_MASK |
|
|
|
|
|
GDK_BUTTON_PRESS_MASK |
|
|
|
|
|
GDK_BUTTON_RELEASE_MASK |
|
|
|
|
|
gtk_widget_get_events (widget);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->bin_window = gdk_window_new (widget->window,
|
|
|
|
|
&attributes, attributes_mask);
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->bin_window, widget);
|
|
|
|
|
|
|
|
|
|
/* Make the column header window */
|
|
|
|
|
attributes.x = 0;
|
|
|
|
|
attributes.y = 0;
|
|
|
|
|
attributes.width = MAX (tree_view->priv->width, widget->allocation.width);
|
|
|
|
|
attributes.height = tree_view->priv->header_height;
|
|
|
|
|
attributes.event_mask = (GDK_EXPOSURE_MASK |
|
|
|
|
|
GDK_SCROLL_MASK |
|
|
|
|
|
GDK_BUTTON_PRESS_MASK |
|
|
|
|
|
GDK_BUTTON_RELEASE_MASK |
|
|
|
|
|
GDK_KEY_PRESS_MASK |
|
|
|
|
|
GDK_KEY_RELEASE_MASK) |
|
|
|
|
|
gtk_widget_get_events (widget);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->header_window = gdk_window_new (widget->window,
|
|
|
|
|
&attributes, attributes_mask);
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->header_window, widget);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
values.foreground = (widget->style->white.pixel==0 ?
|
|
|
|
|
widget->style->black:widget->style->white);
|
|
|
|
|
values.function = GDK_XOR;
|
|
|
|
|
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
|
|
|
|
|
tree_view->priv->xor_gc = gdk_gc_new_with_values (widget->window,
|
|
|
|
|
&values,
|
|
|
|
|
GDK_GC_FOREGROUND |
|
|
|
|
|
GDK_GC_FUNCTION |
|
|
|
|
|
GDK_GC_SUBWINDOW);
|
|
|
|
|
/* Add them all up. */
|
|
|
|
|
widget->style = gtk_style_attach (widget->style, widget->window);
|
|
|
|
|
gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
|
|
|
|
|
gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
|
|
|
|
|
gtk_style_set_background (widget->style, tree_view->priv->header_window, GTK_STATE_NORMAL);
|
|
|
|
|
|
|
|
|
|
tmp_list = tree_view->priv->children;
|
|
|
|
|
while (tmp_list)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewChild *child = tmp_list->data;
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
|
|
|
|
|
|
gtk_widget_set_parent_window (child->widget, tree_view->priv->bin_window);
|
|
|
|
|
}
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
|
|
|
|
for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
|
|
|
|
|
_gtk_tree_view_column_realize_button (GTK_TREE_VIEW_COLUMN (tmp_list->data));
|
|
|
|
|
|
2001-02-23 23:00:52 +00:00
|
|
|
|
_gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
|
|
|
|
if (tree_view->priv->scroll_to_path != NULL ||
|
|
|
|
|
tree_view->priv->scroll_to_column != NULL)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_scroll_to_cell (tree_view,
|
|
|
|
|
tree_view->priv->scroll_to_path,
|
|
|
|
|
tree_view->priv->scroll_to_column,
|
|
|
|
|
tree_view->priv->scroll_to_row_align,
|
|
|
|
|
tree_view->priv->scroll_to_col_align);
|
|
|
|
|
if (tree_view->priv->scroll_to_path)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_path_free (tree_view->priv->scroll_to_path);
|
|
|
|
|
tree_view->priv->scroll_to_path = NULL;
|
|
|
|
|
}
|
|
|
|
|
tree_view->priv->scroll_to_column = NULL;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_unrealize (GtkWidget *widget)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
2001-03-02 00:49:32 +00:00
|
|
|
|
GList *list;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
if (tree_view->priv->scroll_timeout != 0)
|
|
|
|
|
{
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->scroll_timeout);
|
|
|
|
|
tree_view->priv->scroll_timeout = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->open_dest_timeout != 0)
|
|
|
|
|
{
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->open_dest_timeout);
|
|
|
|
|
tree_view->priv->open_dest_timeout = 0;
|
|
|
|
|
}
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
if (tree_view->priv->expand_collapse_timeout != 0)
|
|
|
|
|
{
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->expand_collapse_timeout);
|
|
|
|
|
tree_view->priv->expand_collapse_timeout = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2001-03-02 00:49:32 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
_gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data));
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
gdk_window_set_user_data (tree_view->priv->bin_window, NULL);
|
|
|
|
|
gdk_window_destroy (tree_view->priv->bin_window);
|
|
|
|
|
tree_view->priv->bin_window = NULL;
|
|
|
|
|
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->header_window, NULL);
|
|
|
|
|
gdk_window_destroy (tree_view->priv->header_window);
|
|
|
|
|
tree_view->priv->header_window = NULL;
|
|
|
|
|
|
2001-04-26 23:17:36 +00:00
|
|
|
|
if (tree_view->priv->drag_window)
|
|
|
|
|
{
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->drag_window, NULL);
|
|
|
|
|
gdk_window_destroy (tree_view->priv->drag_window);
|
|
|
|
|
tree_view->priv->drag_window = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->drag_highlight_window)
|
|
|
|
|
{
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->drag_highlight_window, NULL);
|
|
|
|
|
gdk_window_destroy (tree_view->priv->drag_highlight_window);
|
|
|
|
|
tree_view->priv->drag_highlight_window = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
if (tree_view->priv->cursor_drag)
|
|
|
|
|
{
|
|
|
|
|
gdk_cursor_destroy (tree_view->priv->cursor_drag);
|
|
|
|
|
tree_view->priv->cursor_drag = NULL;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
if (tree_view->priv->xor_gc)
|
|
|
|
|
{
|
|
|
|
|
gdk_gc_destroy (tree_view->priv->xor_gc);
|
|
|
|
|
tree_view->priv->xor_gc = NULL;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
/* GtkWidget::unrealize destroys children and widget->window */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
if (GTK_WIDGET_CLASS (parent_class)->unrealize)
|
|
|
|
|
(* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GtkWidget::size_request helper */
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_size_request_buttons (GtkTreeView *tree_view)
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
{
|
|
|
|
|
GList *list;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->header_height = 1;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-08-17 16:33:04 +00:00
|
|
|
|
if (tree_view->priv->model)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
GtkRequisition requisition;
|
2001-05-25 23:10:49 +00:00
|
|
|
|
GtkTreeViewColumn *column = list->data;
|
|
|
|
|
|
|
|
|
|
if (column->button == NULL)
|
|
|
|
|
continue;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
column = list->data;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
gtk_widget_size_request (column->button, &requisition);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (column, MAX (column->width, requisition.width));
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
tree_view->priv->header_height = MAX (tree_view->priv->header_height, requisition.height);
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_size_request (GtkWidget *widget,
|
|
|
|
|
GtkRequisition *requisition)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GList *tmp_list;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
2001-05-25 20:41:46 +00:00
|
|
|
|
requisition->width = tree_view->priv->width;
|
|
|
|
|
requisition->height = tree_view->priv->height + tree_view->priv->header_height;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
tmp_list = tree_view->priv->children;
|
|
|
|
|
|
|
|
|
|
while (tmp_list)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewChild *child = tmp_list->data;
|
|
|
|
|
GtkRequisition child_requisition;
|
|
|
|
|
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
if (GTK_WIDGET_VISIBLE (child->widget))
|
|
|
|
|
gtk_widget_size_request (child->widget, &child_requisition);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
|
|
|
|
|
gtk_tree_view_size_request_buttons (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GtkWidget::size_allocate helper */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_size_allocate_buttons (GtkWidget *widget)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
GtkAllocation allocation;
|
|
|
|
|
gint width = 0;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
|
|
|
|
allocation.y = 0;
|
|
|
|
|
allocation.height = tree_view->priv->header_height;
|
|
|
|
|
|
2001-02-23 23:00:52 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list != NULL; list = list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
|
|
|
|
|
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
allocation.x = width;
|
2001-02-23 23:00:52 +00:00
|
|
|
|
allocation.width = column->displayed_width;
|
2001-01-04 23:36:19 +00:00
|
|
|
|
width += column->width;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
gtk_widget_size_allocate (column->button, &allocation);
|
|
|
|
|
|
|
|
|
|
if (column->window)
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
gdk_window_move_resize (column->window,
|
2001-02-23 23:00:52 +00:00
|
|
|
|
allocation.x + allocation.width - TREE_VIEW_DRAG_WIDTH/2,
|
|
|
|
|
allocation.y,
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
TREE_VIEW_DRAG_WIDTH, allocation.height);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_size_allocate (GtkWidget *widget,
|
|
|
|
|
GtkAllocation *allocation)
|
|
|
|
|
{
|
|
|
|
|
GList *tmp_list;
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
|
|
|
|
|
|
|
|
|
|
widget->allocation = *allocation;
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
gtk_tree_view_check_dirty (tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
tmp_list = tree_view->priv->children;
|
|
|
|
|
|
|
|
|
|
while (tmp_list)
|
|
|
|
|
{
|
|
|
|
|
GtkAllocation allocation;
|
|
|
|
|
GtkRequisition requisition;
|
|
|
|
|
|
|
|
|
|
GtkTreeViewChild *child = tmp_list->data;
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
|
|
|
|
|
|
allocation.x = child->x;
|
|
|
|
|
allocation.y = child->y;
|
|
|
|
|
gtk_widget_get_child_requisition (child->widget, &requisition);
|
|
|
|
|
allocation.width = requisition.width;
|
|
|
|
|
allocation.height = requisition.height;
|
|
|
|
|
|
|
|
|
|
gtk_widget_size_allocate (child->widget, &allocation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_REALIZED (widget))
|
|
|
|
|
{
|
|
|
|
|
gdk_window_move_resize (widget->window,
|
|
|
|
|
allocation->x, allocation->y,
|
|
|
|
|
allocation->width, allocation->height);
|
2001-05-09 13:18:46 +00:00
|
|
|
|
gdk_window_resize (tree_view->priv->header_window,
|
|
|
|
|
MAX (tree_view->priv->width, allocation->width),
|
|
|
|
|
tree_view->priv->header_height);
|
2001-02-23 23:00:52 +00:00
|
|
|
|
if (tree_view->priv->width < allocation->width)
|
2001-05-09 13:18:46 +00:00
|
|
|
|
gdk_window_resize (tree_view->priv->bin_window,
|
|
|
|
|
allocation->width,
|
|
|
|
|
tree_view->priv->height + TREE_VIEW_HEADER_HEIGHT (tree_view));
|
2001-02-23 23:00:52 +00:00
|
|
|
|
|
|
|
|
|
_gtk_tree_view_update_col_width (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-02-23 23:00:52 +00:00
|
|
|
|
gtk_tree_view_size_allocate_buttons (widget);
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
tree_view->priv->hadjustment->page_size = allocation->width;
|
2001-06-07 18:06:08 +00:00
|
|
|
|
tree_view->priv->hadjustment->page_increment = allocation->width;
|
|
|
|
|
tree_view->priv->hadjustment->step_increment = allocation->width / 10;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
tree_view->priv->hadjustment->lower = 0;
|
|
|
|
|
tree_view->priv->hadjustment->upper = tree_view->priv->width;
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
if (tree_view->priv->hadjustment->value + allocation->width > tree_view->priv->width)
|
|
|
|
|
tree_view->priv->hadjustment->value = MAX (tree_view->priv->width - allocation->width, 0);
|
|
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->hadjustment), "changed");
|
|
|
|
|
|
|
|
|
|
tree_view->priv->vadjustment->page_size = allocation->height - TREE_VIEW_HEADER_HEIGHT (tree_view);
|
2001-06-07 18:06:08 +00:00
|
|
|
|
tree_view->priv->vadjustment->step_increment = (tree_view->priv->vadjustment->page_size) / 10;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
tree_view->priv->vadjustment->page_increment = (allocation->height - TREE_VIEW_HEADER_HEIGHT (tree_view)) / 2;
|
|
|
|
|
tree_view->priv->vadjustment->lower = 0;
|
|
|
|
|
tree_view->priv->vadjustment->upper = tree_view->priv->height;
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
if (tree_view->priv->vadjustment->value + allocation->height > tree_view->priv->height)
|
|
|
|
|
gtk_adjustment_set_value (tree_view->priv->vadjustment,
|
2001-03-19 21:06:38 +00:00
|
|
|
|
MAX (tree_view->priv->height - allocation->height, 0));
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->vadjustment), "changed");
|
2001-02-17 00:16:08 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_button_press (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeView *tree_view;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
GList *list;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewColumn *column = NULL;
|
|
|
|
|
gint i;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
GdkRectangle background_area;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GdkRectangle cell_area;
|
|
|
|
|
gint vertical_separator;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
g_return_val_if_fail (event != NULL, FALSE);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
gtk_widget_style_get (widget, "vertical_separator", &vertical_separator, NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (event->window == tree_view->priv->bin_window)
|
|
|
|
|
{
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
gchar *path_string;
|
|
|
|
|
gint depth;
|
|
|
|
|
gint new_y;
|
|
|
|
|
gint y_offset;
|
|
|
|
|
GtkTreeViewColumn *column = NULL;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!GTK_WIDGET_HAS_FOCUS (widget))
|
|
|
|
|
gtk_widget_grab_focus (widget);
|
|
|
|
|
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* are we in an arrow? */
|
|
|
|
|
if (tree_view->priv->prelight_node &&
|
|
|
|
|
GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT))
|
|
|
|
|
{
|
|
|
|
|
if (event->button == 1)
|
|
|
|
|
{
|
|
|
|
|
gtk_grab_add (widget);
|
|
|
|
|
tree_view->priv->button_pressed_node = tree_view->priv->prelight_node;
|
|
|
|
|
tree_view->priv->button_pressed_tree = tree_view->priv->prelight_tree;
|
|
|
|
|
gtk_tree_view_draw_arrow (GTK_TREE_VIEW (widget),
|
|
|
|
|
tree_view->priv->prelight_tree,
|
|
|
|
|
tree_view->priv->prelight_node,
|
|
|
|
|
event->x,
|
|
|
|
|
event->y);
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* find the node that was clicked */
|
|
|
|
|
new_y = ((gint)event->y<TREE_VIEW_HEADER_HEIGHT (tree_view))?TREE_VIEW_HEADER_HEIGHT (tree_view):(gint)event->y;
|
|
|
|
|
y_offset = -_gtk_rbtree_find_offset (tree_view->priv->tree,
|
|
|
|
|
TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, new_y),
|
|
|
|
|
&tree,
|
|
|
|
|
&node) + new_y - (gint)event->y;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node == NULL)
|
|
|
|
|
/* We clicked in dead space */
|
|
|
|
|
return TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Get the path and the node */
|
|
|
|
|
path = _gtk_tree_view_find_path (tree_view, tree, node);
|
|
|
|
|
depth = gtk_tree_path_get_depth (path);
|
|
|
|
|
background_area.y = y_offset + event->y + vertical_separator;
|
|
|
|
|
background_area.height = GTK_RBNODE_GET_HEIGHT (node) - vertical_separator;
|
|
|
|
|
background_area.x = 0;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-06-12 18:12:08 +00:00
|
|
|
|
/* Let the column have a chance at selecting it. */
|
2001-06-29 03:11:01 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeIter iter;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
column = list->data;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
background_area.width = column->displayed_width;
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, column) &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_DRAW_EXPANDERS(tree_view))
|
|
|
|
|
{
|
|
|
|
|
cell_area = background_area;
|
|
|
|
|
cell_area.x += depth*tree_view->priv->tab_offset;
|
|
|
|
|
cell_area.width -= depth*tree_view->priv->tab_offset;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
cell_area = background_area;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if ((background_area.x > (gint) event->x) ||
|
|
|
|
|
(background_area.y > (gint) event->y) ||
|
|
|
|
|
(background_area.x + background_area.width <= (gint) event->x) ||
|
|
|
|
|
(background_area.y + background_area.height <= (gint) event->y))
|
|
|
|
|
{
|
|
|
|
|
background_area.x += background_area.width;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-06-12 18:12:08 +00:00
|
|
|
|
gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_set_cell_data (column,
|
|
|
|
|
tree_view->priv->model,
|
2001-08-19 04:19:56 +00:00
|
|
|
|
&iter,
|
|
|
|
|
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
|
|
|
|
|
node->children?TRUE:FALSE);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
path_string = gtk_tree_path_to_string (path);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-05-25 23:10:49 +00:00
|
|
|
|
if (gtk_tree_view_column_cell_event (column,
|
|
|
|
|
(GdkEvent *)event,
|
|
|
|
|
path_string,
|
|
|
|
|
&background_area,
|
|
|
|
|
&cell_area, 0))
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
g_free (path_string);
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
g_free (path_string);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column == NULL)
|
|
|
|
|
return FALSE;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-06-12 18:12:08 +00:00
|
|
|
|
/* The columns didn't want the event. We handle it */
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Save press to possibly begin a drag
|
|
|
|
|
*/
|
|
|
|
|
if (tree_view->priv->pressed_button < 0)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->pressed_button = event->button;
|
|
|
|
|
tree_view->priv->press_start_x = event->x;
|
|
|
|
|
tree_view->priv->press_start_y = event->y;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-08-22 22:27:41 +00:00
|
|
|
|
if (event->state & GDK_CONTROL_MASK)
|
2001-08-21 06:59:55 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, path, FALSE);
|
|
|
|
|
gtk_tree_view_real_toggle_cursor_row (tree_view);
|
|
|
|
|
}
|
2001-08-22 22:27:41 +00:00
|
|
|
|
else if (event->state & GDK_SHIFT_MASK)
|
2001-08-21 06:59:55 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, path, FALSE);
|
|
|
|
|
gtk_tree_view_real_select_cursor_row (tree_view);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, path, TRUE);
|
|
|
|
|
}
|
2001-08-22 22:27:41 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (event->button == 1 && event->type == GDK_2BUTTON_PRESS)
|
2001-06-12 18:12:08 +00:00
|
|
|
|
{
|
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT))
|
|
|
|
|
{
|
|
|
|
|
if (node->children == NULL)
|
|
|
|
|
gtk_tree_view_real_expand_row (tree_view, path,
|
|
|
|
|
tree, node, FALSE);
|
|
|
|
|
else
|
|
|
|
|
gtk_tree_view_real_collapse_row (GTK_TREE_VIEW (widget), path,
|
|
|
|
|
tree, node);
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-08-21 06:59:55 +00:00
|
|
|
|
gtk_tree_view_row_activated (tree_view, path, column);
|
2001-06-12 18:12:08 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
return TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-12 18:12:08 +00:00
|
|
|
|
/* We didn't click in the window. Let's check to see if we clicked on a column resize window.
|
|
|
|
|
*/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (i = 0, list = tree_view->priv->columns; list; list = list->next, i++)
|
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
|
|
|
|
if (event->window == column->window &&
|
2001-06-25 23:48:51 +00:00
|
|
|
|
column->column_type == GTK_TREE_VIEW_COLUMN_RESIZABLE &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
column->window)
|
|
|
|
|
{
|
|
|
|
|
gpointer drag_data;
|
|
|
|
|
|
|
|
|
|
if (gdk_pointer_grab (column->window, FALSE,
|
|
|
|
|
GDK_POINTER_MOTION_HINT_MASK |
|
|
|
|
|
GDK_BUTTON1_MOTION_MASK |
|
|
|
|
|
GDK_BUTTON_RELEASE_MASK,
|
|
|
|
|
NULL, NULL, event->time))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
gtk_grab_add (widget);
|
|
|
|
|
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE);
|
|
|
|
|
|
|
|
|
|
/* block attached dnd signal handler */
|
|
|
|
|
drag_data = gtk_object_get_data (GTK_OBJECT (widget), "gtk-site-data");
|
|
|
|
|
if (drag_data)
|
|
|
|
|
gtk_signal_handler_block_by_data (GTK_OBJECT (widget), drag_data);
|
|
|
|
|
|
|
|
|
|
if (!GTK_WIDGET_HAS_FOCUS (widget))
|
|
|
|
|
gtk_widget_grab_focus (widget);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->drag_pos = i;
|
|
|
|
|
tree_view->priv->x_drag = (column->button->allocation.x + column->button->allocation.width);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GtkWidget::button_release_event helper */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static gboolean
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_button_release_drag_column (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkAllocation allocation;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
allocation = tree_view->priv->drag_column->button->allocation;
|
|
|
|
|
allocation.x = tree_view->priv->drag_column_x;
|
|
|
|
|
gdk_pointer_ungrab (GDK_CURRENT_TIME);
|
2001-05-09 22:23:12 +00:00
|
|
|
|
gdk_keyboard_ungrab (GDK_CURRENT_TIME);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_reparent (tree_view->priv->drag_column->button->window,
|
|
|
|
|
tree_view->priv->header_window,
|
|
|
|
|
tree_view->priv->drag_column_x,
|
|
|
|
|
tree_view->priv->drag_column->button->allocation.y);
|
|
|
|
|
gtk_widget_set_parent_window (tree_view->priv->drag_column->button, tree_view->priv->header_window);
|
2001-05-02 05:25:09 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_size_allocate (tree_view->priv->drag_column->button, &allocation);
|
2001-05-09 22:23:12 +00:00
|
|
|
|
gtk_widget_grab_focus (tree_view->priv->drag_column->button);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-05-02 05:25:09 +00:00
|
|
|
|
if (tree_view->priv->cur_reorder &&
|
|
|
|
|
tree_view->priv->cur_reorder->left_column != tree_view->priv->drag_column)
|
2001-05-01 23:09:50 +00:00
|
|
|
|
gtk_tree_view_move_column_after (tree_view, tree_view->priv->drag_column,
|
|
|
|
|
tree_view->priv->cur_reorder->left_column);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->drag_column = NULL;
|
|
|
|
|
gdk_window_hide (tree_view->priv->drag_window);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_list_foreach (tree_view->priv->column_drag_info, (GFunc) g_free, NULL);
|
|
|
|
|
g_list_free (tree_view->priv->column_drag_info);
|
|
|
|
|
tree_view->priv->column_drag_info = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_hide (tree_view->priv->drag_highlight_window);
|
2001-05-09 13:18:46 +00:00
|
|
|
|
|
|
|
|
|
/* Reset our flags */
|
|
|
|
|
tree_view->priv->drag_column_window_state = DRAG_COLUMN_WINDOW_STATE_UNSET;
|
2001-05-02 05:25:09 +00:00
|
|
|
|
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* GtkWidget::button_release_event helper */
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_button_release_column_resize (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
gpointer drag_data;
|
|
|
|
|
gint width;
|
|
|
|
|
gint x;
|
|
|
|
|
gint i;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
i = tree_view->priv->drag_pos;
|
|
|
|
|
tree_view->priv->drag_pos = -1;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* unblock attached dnd signal handler */
|
|
|
|
|
drag_data = gtk_object_get_data (GTK_OBJECT (widget), "gtk-site-data");
|
|
|
|
|
if (drag_data)
|
|
|
|
|
gtk_signal_handler_unblock_by_data (GTK_OBJECT (widget), drag_data);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE);
|
|
|
|
|
gtk_widget_get_pointer (widget, &x, NULL);
|
|
|
|
|
gtk_grab_remove (widget);
|
|
|
|
|
gdk_pointer_ungrab (event->time);
|
2001-02-17 00:16:08 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
width = gtk_tree_view_new_column_width (GTK_TREE_VIEW (widget), i, &x);
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (gtk_tree_view_get_column (GTK_TREE_VIEW (widget), i), width);
|
2001-02-17 00:16:08 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_button_release (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
g_return_val_if_fail (event != NULL, FALSE);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG))
|
|
|
|
|
return gtk_tree_view_button_release_drag_column (widget, event);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->pressed_button == event->button)
|
|
|
|
|
tree_view->priv->pressed_button = -1;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE))
|
|
|
|
|
return gtk_tree_view_button_release_column_resize (widget, event);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->button_pressed_node == NULL)
|
|
|
|
|
return FALSE;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (event->button == 1)
|
|
|
|
|
{
|
|
|
|
|
gtk_grab_remove (widget);
|
|
|
|
|
if (tree_view->priv->button_pressed_node == tree_view->priv->prelight_node &&
|
|
|
|
|
GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT))
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreePath *path = NULL;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-07 17:22:15 +00:00
|
|
|
|
path = _gtk_tree_view_find_path (tree_view,
|
|
|
|
|
tree_view->priv->button_pressed_tree,
|
|
|
|
|
tree_view->priv->button_pressed_node);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Actually activate the node */
|
|
|
|
|
if (tree_view->priv->button_pressed_node->children == NULL)
|
2001-06-07 17:22:15 +00:00
|
|
|
|
gtk_tree_view_real_expand_row (tree_view, path,
|
|
|
|
|
tree_view->priv->button_pressed_tree,
|
|
|
|
|
tree_view->priv->button_pressed_node,
|
|
|
|
|
FALSE);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
else
|
2001-06-07 17:22:15 +00:00
|
|
|
|
gtk_tree_view_real_collapse_row (GTK_TREE_VIEW (widget), path,
|
|
|
|
|
tree_view->priv->button_pressed_tree,
|
|
|
|
|
tree_view->priv->button_pressed_node);
|
|
|
|
|
gtk_tree_path_free (path);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-07 17:22:15 +00:00
|
|
|
|
tree_view->priv->button_pressed_tree = NULL;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->button_pressed_node = NULL;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
|
|
|
|
|
/* GtkWidget::motion_event function set.
|
|
|
|
|
*/
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
coords_are_over_arrow (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
/* these are in tree window coords */
|
|
|
|
|
gint x,
|
|
|
|
|
gint y)
|
|
|
|
|
{
|
|
|
|
|
GdkRectangle arrow;
|
|
|
|
|
gint x2;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!GTK_WIDGET_REALIZED (tree_view))
|
|
|
|
|
return FALSE;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if ((node->flags & GTK_RBNODE_IS_PARENT) == 0)
|
|
|
|
|
return FALSE;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
arrow.y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
arrow.height = BACKGROUND_HEIGHT (node);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_arrow_xrange (tree_view, &arrow.x, &x2);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
arrow.width = x2 - arrow.x;
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return (x >= arrow.x &&
|
2001-07-22 20:09:00 +00:00
|
|
|
|
x < (arrow.x + arrow.width) &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
y >= arrow.y &&
|
|
|
|
|
y < (arrow.y + arrow.height));
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
do_unprelight (GtkTreeView *tree_view,
|
|
|
|
|
/* these are in tree window coords */
|
|
|
|
|
gint x,
|
|
|
|
|
gint y)
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->prelight_node == NULL)
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GTK_RBNODE_UNSET_FLAG (tree_view->priv->prelight_node, GTK_RBNODE_IS_PRELIT);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT) &&
|
|
|
|
|
!coords_are_over_arrow (tree_view,
|
|
|
|
|
tree_view->priv->prelight_tree,
|
|
|
|
|
tree_view->priv->prelight_node,
|
|
|
|
|
x,
|
|
|
|
|
y))
|
|
|
|
|
/* We need to unprelight the old arrow. */
|
|
|
|
|
{
|
|
|
|
|
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_ARROW_PRELIT);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
gtk_tree_view_draw_arrow (tree_view,
|
|
|
|
|
tree_view->priv->prelight_tree,
|
|
|
|
|
tree_view->priv->prelight_node,
|
|
|
|
|
x,
|
2001-03-09 00:40:18 +00:00
|
|
|
|
y);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
tree_view->priv->prelight_node = NULL;
|
|
|
|
|
tree_view->priv->prelight_tree = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
do_prelight (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
/* these are in tree window coords */
|
|
|
|
|
gint x,
|
|
|
|
|
gint y)
|
|
|
|
|
{
|
|
|
|
|
if (coords_are_over_arrow (tree_view, tree, node, x, y))
|
|
|
|
|
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_ARROW_PRELIT);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->prelight_node = node;
|
|
|
|
|
tree_view->priv->prelight_tree = tree;
|
|
|
|
|
|
|
|
|
|
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PRELIT);
|
|
|
|
|
}
|
|
|
|
|
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
static void
|
|
|
|
|
ensure_unprelighted (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
do_unprelight (tree_view, -1000, -1000); /* coords not possibly over an arrow */
|
2001-06-18 23:44:41 +00:00
|
|
|
|
g_assert (tree_view->priv->prelight_node == NULL);
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
|
|
|
|
/* Our motion arrow is either a box (in the case of the original spot)
|
2001-07-22 20:09:00 +00:00
|
|
|
|
* or an arrow. It is expander_size wide.
|
2001-04-26 23:17:36 +00:00
|
|
|
|
*/
|
|
|
|
|
/*
|
|
|
|
|
* 11111111111111
|
|
|
|
|
* 01111111111110
|
|
|
|
|
* 00111111111100
|
|
|
|
|
* 00011111111000
|
|
|
|
|
* 00001111110000
|
|
|
|
|
* 00000111100000
|
|
|
|
|
* 00000111100000
|
|
|
|
|
* 00000111100000
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* ~ ~ ~ ~ ~ ~ ~
|
2001-04-26 23:17:36 +00:00
|
|
|
|
* 00000111100000
|
|
|
|
|
* 00000111100000
|
|
|
|
|
* 00000111100000
|
|
|
|
|
* 00001111110000
|
|
|
|
|
* 00011111111000
|
|
|
|
|
* 00111111111100
|
|
|
|
|
* 01111111111110
|
|
|
|
|
* 11111111111111
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumnReorder *reorder = tree_view->priv->cur_reorder;
|
|
|
|
|
GtkWidget *widget = GTK_WIDGET (tree_view);
|
|
|
|
|
GdkBitmap *mask = NULL;
|
|
|
|
|
gint x;
|
|
|
|
|
gint y;
|
|
|
|
|
gint width;
|
|
|
|
|
gint height;
|
2001-05-09 13:18:46 +00:00
|
|
|
|
gint arrow_type = DRAG_COLUMN_WINDOW_STATE_UNSET;
|
|
|
|
|
GdkWindowAttr attributes;
|
|
|
|
|
guint attributes_mask;
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
|
|
|
|
if (!reorder ||
|
|
|
|
|
reorder->left_column == tree_view->priv->drag_column ||
|
|
|
|
|
reorder->right_column == tree_view->priv->drag_column)
|
2001-05-09 13:18:46 +00:00
|
|
|
|
arrow_type = DRAG_COLUMN_WINDOW_STATE_ORIGINAL;
|
|
|
|
|
else if (reorder->left_column || reorder->right_column)
|
|
|
|
|
{
|
|
|
|
|
GdkRectangle visible_rect;
|
|
|
|
|
gtk_tree_view_get_visible_rect (tree_view, &visible_rect);
|
|
|
|
|
if (reorder->left_column)
|
|
|
|
|
x = reorder->left_column->button->allocation.x + reorder->left_column->button->allocation.width;
|
|
|
|
|
else
|
|
|
|
|
x = reorder->right_column->button->allocation.x;
|
|
|
|
|
if (x < visible_rect.x)
|
|
|
|
|
arrow_type = DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT;
|
|
|
|
|
else if (x > visible_rect.x + visible_rect.width)
|
|
|
|
|
arrow_type = DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT;
|
|
|
|
|
else
|
|
|
|
|
arrow_type = DRAG_COLUMN_WINDOW_STATE_ARROW;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We want to draw the rectangle over the initial location. */
|
|
|
|
|
if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ORIGINAL)
|
2001-04-26 23:17:36 +00:00
|
|
|
|
{
|
|
|
|
|
GdkGC *gc;
|
|
|
|
|
GdkColor col;
|
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ORIGINAL)
|
|
|
|
|
{
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
if (tree_view->priv->drag_highlight_window)
|
|
|
|
|
gdk_window_destroy (tree_view->priv->drag_highlight_window);
|
|
|
|
|
|
|
|
|
|
attributes.window_type = GDK_WINDOW_CHILD;
|
|
|
|
|
attributes.wclass = GDK_INPUT_OUTPUT;
|
|
|
|
|
attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK;
|
|
|
|
|
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
|
|
|
|
|
tree_view->priv->drag_highlight_window = gdk_window_new (tree_view->priv->header_window, &attributes, attributes_mask);
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
|
|
|
|
|
|
|
|
|
|
width = tree_view->priv->drag_column->button->allocation.width;
|
|
|
|
|
height = tree_view->priv->drag_column->button->allocation.height;
|
|
|
|
|
gdk_window_move_resize (tree_view->priv->drag_highlight_window,
|
|
|
|
|
tree_view->priv->drag_column_x, 0, width, height);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
mask = gdk_pixmap_new (tree_view->priv->drag_highlight_window, width, height, 1);
|
|
|
|
|
gc = gdk_gc_new (mask);
|
|
|
|
|
col.pixel = 1;
|
|
|
|
|
gdk_gc_set_foreground (gc, &col);
|
|
|
|
|
gdk_draw_rectangle (mask, gc, TRUE, 0, 0, width, height);
|
|
|
|
|
col.pixel = 0;
|
|
|
|
|
gdk_gc_set_foreground(gc, &col);
|
|
|
|
|
gdk_draw_rectangle (mask, gc, TRUE, 2, 2, width - 4, height - 4);
|
|
|
|
|
gdk_gc_destroy (gc);
|
|
|
|
|
|
|
|
|
|
gdk_window_shape_combine_mask (tree_view->priv->drag_highlight_window,
|
|
|
|
|
mask, 0, 0);
|
|
|
|
|
if (mask) gdk_pixmap_unref (mask);
|
|
|
|
|
tree_view->priv->drag_column_window_state = DRAG_COLUMN_WINDOW_STATE_ORIGINAL;
|
|
|
|
|
}
|
2001-04-26 23:17:36 +00:00
|
|
|
|
}
|
2001-05-09 13:18:46 +00:00
|
|
|
|
else if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW)
|
2001-04-26 23:17:36 +00:00
|
|
|
|
{
|
|
|
|
|
gint i, j = 1;
|
|
|
|
|
GdkGC *gc;
|
|
|
|
|
GdkColor col;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
gint expander_size;
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
|
|
|
|
gtk_widget_style_get (widget,
|
2001-07-22 20:09:00 +00:00
|
|
|
|
"expander_size", &expander_size,
|
2001-04-26 23:17:36 +00:00
|
|
|
|
NULL);
|
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
width = expander_size;
|
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
/* Get x, y, width, height of arrow */
|
2001-04-26 23:17:36 +00:00
|
|
|
|
if (reorder->left_column)
|
|
|
|
|
{
|
|
|
|
|
gdk_window_get_origin (reorder->left_column->button->window, &x, &y);
|
|
|
|
|
x += reorder->left_column->button->allocation.width - width/2;
|
|
|
|
|
height = reorder->left_column->button->allocation.height;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gdk_window_get_origin (reorder->right_column->button->window, &x, &y);
|
|
|
|
|
x -= width/2;
|
|
|
|
|
height = reorder->right_column->button->allocation.height;
|
|
|
|
|
}
|
2001-07-22 20:09:00 +00:00
|
|
|
|
y -= expander_size/2; /* The arrow takes up only half the space */
|
|
|
|
|
height += expander_size;
|
2001-05-09 13:18:46 +00:00
|
|
|
|
|
|
|
|
|
/* Create the new window */
|
|
|
|
|
if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW)
|
2001-04-26 23:17:36 +00:00
|
|
|
|
{
|
2001-05-09 13:18:46 +00:00
|
|
|
|
if (tree_view->priv->drag_highlight_window)
|
|
|
|
|
gdk_window_destroy (tree_view->priv->drag_highlight_window);
|
|
|
|
|
|
|
|
|
|
attributes.window_type = GDK_WINDOW_TEMP;
|
|
|
|
|
attributes.wclass = GDK_INPUT_OUTPUT;
|
|
|
|
|
attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK;
|
|
|
|
|
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
|
|
|
|
|
attributes.width = width;
|
|
|
|
|
attributes.height = height;
|
|
|
|
|
tree_view->priv->drag_highlight_window = gdk_window_new (NULL, &attributes, attributes_mask);
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
|
|
|
|
|
|
|
|
|
|
mask = gdk_pixmap_new (tree_view->priv->drag_highlight_window, width, height, 1);
|
|
|
|
|
gc = gdk_gc_new (mask);
|
|
|
|
|
col.pixel = 1;
|
|
|
|
|
gdk_gc_set_foreground (gc, &col);
|
|
|
|
|
gdk_draw_rectangle (mask, gc, TRUE, 0, 0, width, height);
|
|
|
|
|
|
|
|
|
|
/* Draw the 2 arrows as per above */
|
|
|
|
|
col.pixel = 0;
|
|
|
|
|
gdk_gc_set_foreground (gc, &col);
|
|
|
|
|
for (i = 0; i < width; i ++)
|
|
|
|
|
{
|
|
|
|
|
if (i == (width/2 - 1))
|
|
|
|
|
continue;
|
|
|
|
|
gdk_draw_line (mask, gc, i, j, i, height - j);
|
|
|
|
|
if (i < (width/2 - 1))
|
|
|
|
|
j++;
|
|
|
|
|
else
|
|
|
|
|
j--;
|
|
|
|
|
}
|
|
|
|
|
gdk_gc_destroy (gc);
|
|
|
|
|
gdk_window_shape_combine_mask (tree_view->priv->drag_highlight_window,
|
|
|
|
|
mask, 0, 0);
|
|
|
|
|
if (mask) gdk_pixmap_unref (mask);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
}
|
2001-05-09 13:18:46 +00:00
|
|
|
|
|
|
|
|
|
tree_view->priv->drag_column_window_state = DRAG_COLUMN_WINDOW_STATE_ARROW;
|
|
|
|
|
gdk_window_move (tree_view->priv->drag_highlight_window, x, y);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
}
|
2001-05-09 13:18:46 +00:00
|
|
|
|
else if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT ||
|
|
|
|
|
arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
|
|
|
|
|
{
|
|
|
|
|
gint i, j = 1;
|
|
|
|
|
GdkGC *gc;
|
|
|
|
|
GdkColor col;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
gint expander_size;
|
2001-05-09 13:18:46 +00:00
|
|
|
|
|
|
|
|
|
gtk_widget_style_get (widget,
|
2001-07-22 20:09:00 +00:00
|
|
|
|
"expander_size", &expander_size,
|
2001-05-09 13:18:46 +00:00
|
|
|
|
NULL);
|
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
width = expander_size;
|
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
/* Get x, y, width, height of arrow */
|
|
|
|
|
width = width/2; /* remember, the arrow only takes half the available width */
|
|
|
|
|
gdk_window_get_origin (widget->window, &x, &y);
|
|
|
|
|
if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
|
|
|
|
|
x += widget->allocation.width - width;
|
|
|
|
|
|
|
|
|
|
if (reorder->left_column)
|
|
|
|
|
height = reorder->left_column->button->allocation.height;
|
|
|
|
|
else
|
|
|
|
|
height = reorder->right_column->button->allocation.height;
|
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
y -= expander_size;
|
|
|
|
|
height += 2*expander_size;
|
2001-05-09 13:18:46 +00:00
|
|
|
|
|
|
|
|
|
/* Create the new window */
|
|
|
|
|
if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT &&
|
|
|
|
|
tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->drag_highlight_window)
|
|
|
|
|
gdk_window_destroy (tree_view->priv->drag_highlight_window);
|
|
|
|
|
|
|
|
|
|
attributes.window_type = GDK_WINDOW_TEMP;
|
|
|
|
|
attributes.wclass = GDK_INPUT_OUTPUT;
|
|
|
|
|
attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK;
|
|
|
|
|
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
|
|
|
|
|
attributes.width = width;
|
|
|
|
|
attributes.height = height;
|
|
|
|
|
tree_view->priv->drag_highlight_window = gdk_window_new (NULL, &attributes, attributes_mask);
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
|
|
|
|
|
|
|
|
|
|
mask = gdk_pixmap_new (tree_view->priv->drag_highlight_window, width, height, 1);
|
|
|
|
|
gc = gdk_gc_new (mask);
|
|
|
|
|
col.pixel = 1;
|
|
|
|
|
gdk_gc_set_foreground (gc, &col);
|
|
|
|
|
gdk_draw_rectangle (mask, gc, TRUE, 0, 0, width, height);
|
|
|
|
|
|
|
|
|
|
/* Draw the 2 arrows as per above */
|
|
|
|
|
col.pixel = 0;
|
|
|
|
|
gdk_gc_set_foreground (gc, &col);
|
2001-07-22 20:09:00 +00:00
|
|
|
|
j = expander_size;
|
2001-05-09 13:18:46 +00:00
|
|
|
|
for (i = 0; i < width; i ++)
|
|
|
|
|
{
|
|
|
|
|
gint k;
|
|
|
|
|
if (arrow_type == DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT)
|
|
|
|
|
k = width - i - 1;
|
|
|
|
|
else
|
|
|
|
|
k = i;
|
|
|
|
|
gdk_draw_line (mask, gc, k, j, k, height - j);
|
2001-07-22 20:09:00 +00:00
|
|
|
|
gdk_draw_line (mask, gc, k, 0, k, expander_size - j);
|
|
|
|
|
gdk_draw_line (mask, gc, k, height, k, height - expander_size + j);
|
2001-05-09 13:18:46 +00:00
|
|
|
|
j--;
|
|
|
|
|
}
|
|
|
|
|
gdk_gc_destroy (gc);
|
|
|
|
|
gdk_window_shape_combine_mask (tree_view->priv->drag_highlight_window,
|
|
|
|
|
mask, 0, 0);
|
|
|
|
|
if (mask) gdk_pixmap_unref (mask);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tree_view->priv->drag_column_window_state = arrow_type;
|
2001-06-07 00:07:32 +00:00
|
|
|
|
gdk_window_move (tree_view->priv->drag_highlight_window, x, y);
|
2001-05-09 13:18:46 +00:00
|
|
|
|
}
|
2001-04-26 23:17:36 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
g_warning (G_STRLOC"Invalid GtkTreeViewColumnReorder struct");
|
|
|
|
|
gdk_window_hide (tree_view->priv->drag_highlight_window);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gdk_window_show (tree_view->priv->drag_highlight_window);
|
|
|
|
|
gdk_window_raise (tree_view->priv->drag_highlight_window);
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_motion_resize_column (GtkWidget *widget,
|
|
|
|
|
GdkEventMotion *event)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
2001-05-01 23:09:50 +00:00
|
|
|
|
gint x;
|
|
|
|
|
gint new_width;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
if (event->is_hint || event->window != widget->window)
|
|
|
|
|
gtk_widget_get_pointer (widget, &x, NULL);
|
|
|
|
|
else
|
|
|
|
|
x = event->x;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
new_width = gtk_tree_view_new_column_width (GTK_TREE_VIEW (widget),
|
|
|
|
|
GTK_TREE_VIEW (widget)->priv->drag_pos, &x);
|
|
|
|
|
if (x != GTK_TREE_VIEW (widget)->priv->x_drag)
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (gtk_tree_view_get_column (GTK_TREE_VIEW (widget), GTK_TREE_VIEW (widget)->priv->drag_pos), new_width);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
/* FIXME: Do we need to scroll */
|
|
|
|
|
_gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_update_current_reorder (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumnReorder *reorder = NULL;
|
|
|
|
|
GList *list;
|
|
|
|
|
gint mouse_x;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
gdk_window_get_pointer (tree_view->priv->bin_window, &mouse_x, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
for (list = tree_view->priv->column_drag_info; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
reorder = (GtkTreeViewColumnReorder *) list->data;
|
|
|
|
|
if (mouse_x >= reorder->left_align && mouse_x < reorder->right_align)
|
|
|
|
|
break;
|
|
|
|
|
reorder = NULL;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
/* if (reorder && reorder == tree_view->priv->cur_reorder)
|
|
|
|
|
return;*/
|
|
|
|
|
|
|
|
|
|
tree_view->priv->cur_reorder = reorder;
|
|
|
|
|
gtk_tree_view_motion_draw_column_motion_arrow (tree_view);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_horizontal_autoscroll (GtkTreeView *tree_view)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
2001-05-01 23:09:50 +00:00
|
|
|
|
GdkRectangle visible_rect;
|
|
|
|
|
gint x;
|
|
|
|
|
gint offset;
|
|
|
|
|
gfloat value;
|
|
|
|
|
|
|
|
|
|
gdk_window_get_pointer (tree_view->priv->bin_window, &x, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_get_visible_rect (tree_view, &visible_rect);
|
|
|
|
|
|
|
|
|
|
/* See if we are near the edge. */
|
|
|
|
|
offset = x - (visible_rect.x + SCROLL_EDGE_SIZE);
|
|
|
|
|
if (offset > 0)
|
|
|
|
|
{
|
|
|
|
|
offset = x - (visible_rect.x + visible_rect.width - SCROLL_EDGE_SIZE);
|
|
|
|
|
if (offset < 0)
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
offset = offset/3;
|
|
|
|
|
|
|
|
|
|
value = CLAMP (tree_view->priv->hadjustment->value + offset,
|
|
|
|
|
0.0, tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size);
|
|
|
|
|
gtk_adjustment_set_value (tree_view->priv->hadjustment, value);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-23 23:03:53 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_motion_drag_column (GtkWidget *widget,
|
|
|
|
|
GdkEventMotion *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = (GtkTreeView *) widget;
|
|
|
|
|
GtkTreeViewColumn *column = tree_view->priv->drag_column;
|
|
|
|
|
gint x, y;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
/* Sanity Check */
|
|
|
|
|
if ((column == NULL) ||
|
|
|
|
|
(event->window != tree_view->priv->drag_window))
|
2001-04-23 23:03:53 +00:00
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
/* Handle moving the header */
|
2001-04-23 23:03:53 +00:00
|
|
|
|
gdk_window_get_position (tree_view->priv->drag_window, &x, &y);
|
|
|
|
|
x = CLAMP (x + (gint)event->x - column->drag_x, 0,
|
|
|
|
|
MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width) - column->button->allocation.width);
|
|
|
|
|
gdk_window_move (tree_view->priv->drag_window, x, y);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
/* autoscroll, if needed */
|
|
|
|
|
gtk_tree_view_horizontal_autoscroll (tree_view);
|
|
|
|
|
/* Update the current reorder position and arrow; */
|
|
|
|
|
gtk_tree_view_update_current_reorder (tree_view);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_motion_bin_window (GtkWidget *widget,
|
|
|
|
|
GdkEventMotion *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
gint new_y;
|
|
|
|
|
GtkRBTree *old_prelight_tree;
|
|
|
|
|
GtkRBNode *old_prelight_node;
|
2001-08-19 23:46:59 +00:00
|
|
|
|
gboolean old_arrow_prelit;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
tree_view = (GtkTreeView *) widget;
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_maybe_begin_dragging_row (tree_view, event);
|
|
|
|
|
|
|
|
|
|
old_prelight_tree = tree_view->priv->prelight_tree;
|
|
|
|
|
old_prelight_node = tree_view->priv->prelight_node;
|
2001-08-19 23:46:59 +00:00
|
|
|
|
old_arrow_prelit = GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
do_unprelight (tree_view, event->x, event->y);
|
|
|
|
|
|
|
|
|
|
new_y = ((gint)event->y<TREE_VIEW_HEADER_HEIGHT (tree_view))?TREE_VIEW_HEADER_HEIGHT (tree_view):(gint)event->y;
|
|
|
|
|
|
|
|
|
|
_gtk_rbtree_find_offset (tree_view->priv->tree,
|
|
|
|
|
TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, new_y),
|
|
|
|
|
&tree,
|
|
|
|
|
&node);
|
|
|
|
|
|
|
|
|
|
if (tree == NULL)
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
/* If we are currently pressing down a button, we don't want to prelight anything else. */
|
|
|
|
|
if ((tree_view->priv->button_pressed_node != NULL) &&
|
|
|
|
|
(tree_view->priv->button_pressed_node != node))
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do_prelight (tree_view, tree, node, event->x, new_y);
|
|
|
|
|
|
|
|
|
|
if (old_prelight_node != tree_view->priv->prelight_node)
|
|
|
|
|
{
|
|
|
|
|
if (old_prelight_node)
|
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view,
|
|
|
|
|
old_prelight_tree,
|
|
|
|
|
old_prelight_node,
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->prelight_node)
|
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view,
|
|
|
|
|
tree_view->priv->prelight_tree,
|
|
|
|
|
tree_view->priv->prelight_node,
|
|
|
|
|
NULL);
|
|
|
|
|
}
|
2001-08-19 23:46:59 +00:00
|
|
|
|
else if (old_arrow_prelit != GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT))
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->prelight_node)
|
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view,
|
|
|
|
|
tree_view->priv->prelight_tree,
|
|
|
|
|
tree_view->priv->prelight_node,
|
|
|
|
|
NULL);
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_motion (GtkWidget *widget,
|
|
|
|
|
GdkEventMotion *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
|
|
|
|
tree_view = (GtkTreeView *) widget;
|
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
/* Resizing a column */
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE))
|
|
|
|
|
return gtk_tree_view_motion_resize_column (widget, event);
|
|
|
|
|
|
|
|
|
|
/* Drag column */
|
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG))
|
|
|
|
|
return gtk_tree_view_motion_drag_column (widget, event);
|
|
|
|
|
|
|
|
|
|
/* Sanity check it */
|
|
|
|
|
if (event->window == tree_view->priv->bin_window)
|
|
|
|
|
return gtk_tree_view_motion_bin_window (widget, event);
|
2001-05-01 23:09:50 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
/* Draws the focus rectangle around the cursor row */
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_draw_focus (GtkWidget *widget)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkTreePath *cursor_path;
|
|
|
|
|
GtkRBTree *tree = NULL;
|
|
|
|
|
GtkRBNode *node = NULL;
|
|
|
|
|
gint x, y;
|
|
|
|
|
gint width, height;
|
|
|
|
|
gint vertical_separator;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
gtk_widget_style_get (widget, "vertical_separator", &vertical_separator, NULL);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
if (! GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS))
|
|
|
|
|
return;
|
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
if (! gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path, &tree, &node);
|
|
|
|
|
|
|
|
|
|
if (tree == NULL)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gdk_drawable_get_size (tree_view->priv->bin_window,
|
|
|
|
|
&width, NULL);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x = 0;
|
|
|
|
|
y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
|
|
|
|
|
gdk_drawable_get_size (tree_view->priv->bin_window,
|
|
|
|
|
&width, NULL);
|
|
|
|
|
width = width - 1;
|
|
|
|
|
height = BACKGROUND_HEIGHT (node) - 1;
|
|
|
|
|
if (tree_view->priv->focus_column != NULL)
|
|
|
|
|
{
|
2001-06-27 23:44:53 +00:00
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
|
|
|
|
|
gtk_tree_model_get_iter (tree_view->priv->model, &iter, cursor_path);
|
2001-08-19 04:19:56 +00:00
|
|
|
|
gtk_tree_view_column_cell_set_cell_data (tree_view->priv->focus_column,
|
|
|
|
|
tree_view->priv->model,
|
|
|
|
|
&iter,
|
|
|
|
|
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
|
|
|
|
|
node->children?TRUE:FALSE);
|
2001-06-27 23:44:53 +00:00
|
|
|
|
|
|
|
|
|
if (gtk_tree_view_column_cell_can_focus (tree_view->priv->focus_column))
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
GdkRectangle cell_area;
|
|
|
|
|
gint x_offset;
|
|
|
|
|
gint y_offset;
|
|
|
|
|
|
|
|
|
|
cell_area.x = tree_view->priv->focus_column->button->allocation.x;
|
|
|
|
|
cell_area.y = y;
|
|
|
|
|
cell_area.width = tree_view->priv->focus_column->displayed_width;
|
|
|
|
|
cell_area.height = CELL_HEIGHT (node, vertical_separator);
|
|
|
|
|
|
2001-06-27 23:44:53 +00:00
|
|
|
|
gtk_tree_view_column_cell_get_size (tree_view->priv->focus_column,
|
|
|
|
|
&cell_area, &x_offset, &y_offset, &width, &height);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
width += 2;
|
|
|
|
|
height += 2;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
x = cell_area.x + x_offset - 1;
|
|
|
|
|
y = cell_area.y + y_offset - 1 + vertical_separator/2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gtk_paint_focus (widget->style,
|
|
|
|
|
tree_view->priv->bin_window,
|
|
|
|
|
NULL,
|
|
|
|
|
widget,
|
2001-07-22 20:09:00 +00:00
|
|
|
|
"treeview",
|
2001-04-28 00:29:34 +00:00
|
|
|
|
x, y, width, height);
|
|
|
|
|
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Warning: Very scary function.
|
|
|
|
|
* Modify at your own risk
|
|
|
|
|
*/
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_bin_expose (GtkWidget *widget,
|
|
|
|
|
GdkEventExpose *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
GtkRBNode *cursor = NULL;
|
|
|
|
|
GtkRBTree *cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *drag_highlight = NULL;
|
|
|
|
|
GtkRBTree *drag_highlight_tree = NULL;
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
gint new_y;
|
|
|
|
|
gint y_offset, x_offset, cell_offset;
|
2001-06-29 03:11:01 +00:00
|
|
|
|
gint max_height;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint depth;
|
|
|
|
|
GdkRectangle background_area;
|
|
|
|
|
GdkRectangle cell_area;
|
|
|
|
|
guint flags;
|
|
|
|
|
gint highlight_x;
|
|
|
|
|
gint bin_window_width;
|
|
|
|
|
GtkTreePath *cursor_path;
|
|
|
|
|
GtkTreePath *drag_dest_path;
|
|
|
|
|
GList *last_column;
|
|
|
|
|
gint vertical_separator;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
gtk_widget_style_get (widget, "vertical_separator", &vertical_separator, NULL);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_check_dirty (GTK_TREE_VIEW (widget));
|
|
|
|
|
/* we want to account for a potential HEADER offset.
|
|
|
|
|
* That is, if the header exists, we want to offset our event by its
|
|
|
|
|
* height to find the right node.
|
|
|
|
|
*/
|
|
|
|
|
new_y = (event->area.y<TREE_VIEW_HEADER_HEIGHT (tree_view))?TREE_VIEW_HEADER_HEIGHT (tree_view):event->area.y;
|
|
|
|
|
|
|
|
|
|
/* y_offset is the */
|
|
|
|
|
|
|
|
|
|
y_offset = -_gtk_rbtree_find_offset (tree_view->priv->tree,
|
|
|
|
|
TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, new_y),
|
|
|
|
|
&tree,
|
|
|
|
|
&node) + new_y - event->area.y;
|
|
|
|
|
if (node == NULL)
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
/* find the path for the node */
|
|
|
|
|
path = _gtk_tree_view_find_path ((GtkTreeView *)widget,
|
|
|
|
|
tree,
|
|
|
|
|
node);
|
|
|
|
|
gtk_tree_model_get_iter (tree_view->priv->model,
|
|
|
|
|
&iter,
|
|
|
|
|
path);
|
|
|
|
|
depth = gtk_tree_path_get_depth (path);
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
|
|
|
|
|
cursor_path = NULL;
|
|
|
|
|
drag_dest_path = NULL;
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->cursor)
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
if (cursor_path)
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path,
|
|
|
|
|
&cursor_tree, &cursor);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->drag_dest_row)
|
|
|
|
|
drag_dest_path = gtk_tree_row_reference_get_path (tree_view->priv->drag_dest_row);
|
|
|
|
|
|
|
|
|
|
if (drag_dest_path)
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, drag_dest_path,
|
|
|
|
|
&drag_highlight_tree, &drag_highlight);
|
|
|
|
|
|
|
|
|
|
gdk_drawable_get_size (tree_view->priv->bin_window,
|
|
|
|
|
&bin_window_width, NULL);
|
|
|
|
|
|
|
|
|
|
for (last_column = g_list_last (tree_view->priv->columns);
|
|
|
|
|
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)
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
/* Actually process the expose event. To do this, we want to
|
|
|
|
|
* start at the first node of the event, and walk the tree in
|
|
|
|
|
* order, drawing each successive node.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
gboolean parity;
|
|
|
|
|
|
|
|
|
|
max_height = BACKGROUND_HEIGHT (node);
|
|
|
|
|
|
|
|
|
|
x_offset = -event->area.x;
|
|
|
|
|
cell_offset = 0;
|
|
|
|
|
highlight_x = 0; /* should match x coord of first cell */
|
|
|
|
|
|
|
|
|
|
background_area.y = y_offset + event->area.y;
|
|
|
|
|
background_area.height = max_height;
|
|
|
|
|
flags = 0;
|
|
|
|
|
|
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PRELIT))
|
|
|
|
|
flags |= GTK_CELL_RENDERER_PRELIT;
|
|
|
|
|
|
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
|
|
|
|
|
flags |= GTK_CELL_RENDERER_SELECTED;
|
|
|
|
|
|
2001-05-25 23:10:49 +00:00
|
|
|
|
parity = _gtk_rbtree_node_find_parity (tree, node);
|
2001-06-15 23:03:27 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column = list->data;
|
|
|
|
|
const gchar *detail = NULL;
|
|
|
|
|
|
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (cell_offset > event->area.x + event->area.width ||
|
|
|
|
|
cell_offset + column->displayed_width < event->area.x)
|
|
|
|
|
{
|
|
|
|
|
cell_offset += column->displayed_width;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (column->show_sort_indicator)
|
|
|
|
|
flags |= GTK_CELL_RENDERER_SORTED;
|
|
|
|
|
else
|
|
|
|
|
flags &= ~GTK_CELL_RENDERER_SORTED;
|
|
|
|
|
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_set_cell_data (column,
|
|
|
|
|
tree_view->priv->model,
|
2001-08-19 04:19:56 +00:00
|
|
|
|
&iter,
|
|
|
|
|
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
|
|
|
|
|
node->children?TRUE:FALSE);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
background_area.x = cell_offset;
|
|
|
|
|
background_area.width = column->displayed_width;
|
|
|
|
|
|
|
|
|
|
cell_area = background_area;
|
|
|
|
|
cell_area.y += vertical_separator / 2;
|
|
|
|
|
cell_area.height -= vertical_separator;
|
|
|
|
|
|
|
|
|
|
/* Select the detail for drawing the cell. relevant
|
|
|
|
|
* factors are parity, sortedness, and whether to
|
|
|
|
|
* display rules.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* FIXME when we have style properties, clean this up.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->has_rules)
|
|
|
|
|
{
|
|
|
|
|
if (flags & GTK_CELL_RENDERER_SORTED)
|
|
|
|
|
{
|
|
|
|
|
if (parity)
|
|
|
|
|
detail = "cell_odd_ruled_sorted";
|
|
|
|
|
else
|
|
|
|
|
detail = "cell_even_ruled_sorted";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (parity)
|
|
|
|
|
detail = "cell_odd_ruled";
|
|
|
|
|
else
|
|
|
|
|
detail = "cell_even_ruled";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (flags & GTK_CELL_RENDERER_SORTED)
|
|
|
|
|
{
|
|
|
|
|
if (parity)
|
|
|
|
|
detail = "cell_odd_sorted";
|
|
|
|
|
else
|
|
|
|
|
detail = "cell_even_sorted";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (parity)
|
|
|
|
|
detail = "cell_odd";
|
|
|
|
|
else
|
|
|
|
|
detail = "cell_even";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_assert (detail);
|
|
|
|
|
|
|
|
|
|
/* Draw background */
|
|
|
|
|
gtk_paint_flat_box (widget->style,
|
|
|
|
|
event->window,
|
|
|
|
|
(flags & GTK_CELL_RENDERER_SELECTED) ?
|
|
|
|
|
GTK_STATE_SELECTED : GTK_STATE_NORMAL,
|
|
|
|
|
GTK_SHADOW_NONE,
|
|
|
|
|
&event->area,
|
|
|
|
|
widget,
|
|
|
|
|
detail,
|
|
|
|
|
background_area.x,
|
|
|
|
|
background_area.y,
|
|
|
|
|
background_area.width,
|
|
|
|
|
background_area.height);
|
|
|
|
|
|
2001-06-30 02:38:17 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, column) &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_DRAW_EXPANDERS(tree_view))
|
|
|
|
|
{
|
|
|
|
|
cell_area.x += depth*tree_view->priv->tab_offset;
|
|
|
|
|
cell_area.width -= depth*tree_view->priv->tab_offset;
|
|
|
|
|
|
|
|
|
|
/* If we have an expander column, the highlight underline
|
|
|
|
|
* starts with that column, so that it indicates which
|
|
|
|
|
* level of the tree we're dropping at.
|
|
|
|
|
*/
|
|
|
|
|
highlight_x = cell_area.x;
|
|
|
|
|
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_render (column,
|
|
|
|
|
event->window,
|
|
|
|
|
&background_area,
|
|
|
|
|
&cell_area,
|
|
|
|
|
&event->area,
|
|
|
|
|
flags);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if ((node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT)
|
|
|
|
|
{
|
|
|
|
|
gint x, y;
|
|
|
|
|
gdk_window_get_pointer (tree_view->priv->bin_window, &x, &y, 0);
|
|
|
|
|
gtk_tree_view_draw_arrow (GTK_TREE_VIEW (widget),
|
|
|
|
|
tree,
|
|
|
|
|
node,
|
|
|
|
|
x, y);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_render (column,
|
|
|
|
|
event->window,
|
|
|
|
|
&background_area,
|
|
|
|
|
&cell_area,
|
|
|
|
|
&event->area,
|
|
|
|
|
flags);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
|
|
|
|
cell_offset += column->displayed_width;
|
|
|
|
|
}
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node == cursor && GTK_WIDGET_HAS_FOCUS (widget))
|
|
|
|
|
gtk_tree_view_draw_focus (widget);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node == drag_highlight)
|
|
|
|
|
{
|
|
|
|
|
/* Draw indicator for the drop
|
|
|
|
|
*/
|
|
|
|
|
gint highlight_y = -1;
|
|
|
|
|
GtkRBTree *tree = NULL;
|
|
|
|
|
GtkRBNode *node = NULL;
|
|
|
|
|
gint width;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
switch (tree_view->priv->drag_dest_pos)
|
|
|
|
|
{
|
|
|
|
|
case GTK_TREE_VIEW_DROP_BEFORE:
|
|
|
|
|
highlight_y = background_area.y - vertical_separator/2;
|
|
|
|
|
break;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
case GTK_TREE_VIEW_DROP_AFTER:
|
|
|
|
|
highlight_y = background_area.y + background_area.height + vertical_separator/2;
|
|
|
|
|
break;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE:
|
|
|
|
|
case GTK_TREE_VIEW_DROP_INTO_OR_AFTER:
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, drag_dest_path, &tree, &node);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
break;
|
|
|
|
|
gdk_drawable_get_size (tree_view->priv->bin_window,
|
|
|
|
|
&width, NULL);
|
|
|
|
|
gtk_paint_focus (widget->style,
|
|
|
|
|
tree_view->priv->bin_window,
|
|
|
|
|
NULL,
|
|
|
|
|
widget,
|
2001-07-22 20:09:00 +00:00
|
|
|
|
"treeview-drop-indicator",
|
2001-04-28 00:29:34 +00:00
|
|
|
|
0, BACKGROUND_FIRST_PIXEL (tree_view, tree, node),
|
|
|
|
|
width - 1, BACKGROUND_HEIGHT (node) - 1);
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (highlight_y >= 0)
|
|
|
|
|
{
|
|
|
|
|
gdk_draw_line (event->window,
|
|
|
|
|
widget->style->black_gc,
|
|
|
|
|
highlight_x,
|
|
|
|
|
highlight_y,
|
|
|
|
|
bin_window_width - highlight_x,
|
|
|
|
|
highlight_y);
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
y_offset += max_height;
|
|
|
|
|
if (node->children)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeIter parent = iter;
|
|
|
|
|
gboolean has_child;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree = node->children;
|
|
|
|
|
node = tree->root;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_assert (node != tree->nil);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (node->left != tree->nil)
|
|
|
|
|
node = node->left;
|
|
|
|
|
has_child = gtk_tree_model_iter_children (tree_view->priv->model,
|
|
|
|
|
&iter,
|
|
|
|
|
&parent);
|
|
|
|
|
depth++;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Sanity Check! */
|
|
|
|
|
TREE_VIEW_INTERNAL_ASSERT (has_child, FALSE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gboolean done = FALSE;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
node = _gtk_rbtree_next (tree, node);
|
|
|
|
|
if (node != NULL)
|
|
|
|
|
{
|
|
|
|
|
gboolean has_next = gtk_tree_model_iter_next (tree_view->priv->model, &iter);
|
|
|
|
|
done = TRUE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Sanity Check! */
|
|
|
|
|
TREE_VIEW_INTERNAL_ASSERT (has_next, FALSE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
GtkTreeIter parent_iter = iter;
|
|
|
|
|
gboolean has_parent;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
node = tree->parent_node;
|
|
|
|
|
tree = tree->parent_tree;
|
|
|
|
|
if (tree == NULL)
|
|
|
|
|
/* we've run out of tree. It's okay to return though, as
|
|
|
|
|
* we'd only break out of the while loop below. */
|
|
|
|
|
return TRUE;
|
|
|
|
|
has_parent = gtk_tree_model_iter_parent (tree_view->priv->model,
|
|
|
|
|
&iter,
|
|
|
|
|
&parent_iter);
|
|
|
|
|
depth--;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Sanity check */
|
|
|
|
|
TREE_VIEW_INTERNAL_ASSERT (has_parent, FALSE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
while (!done);
|
|
|
|
|
}
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (y_offset < event->area.height);
|
|
|
|
|
|
|
|
|
|
if (cursor_path)
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
|
|
|
|
|
if (drag_dest_path)
|
|
|
|
|
gtk_tree_path_free (drag_dest_path);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-23 23:03:53 +00:00
|
|
|
|
static gboolean
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_expose (GtkWidget *widget,
|
|
|
|
|
GdkEventExpose *event)
|
2001-04-23 23:03:53 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
|
|
|
|
if (event->window == tree_view->priv->bin_window)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return gtk_tree_view_bin_expose (widget, event);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-05-09 22:23:12 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_key_press (GtkWidget *widget,
|
|
|
|
|
GdkEventKey *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = (GtkTreeView *) widget;
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
gint retval;
|
2001-05-09 22:23:12 +00:00
|
|
|
|
|
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG))
|
|
|
|
|
{
|
|
|
|
|
if (event->keyval == GDK_Escape)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->cur_reorder = NULL;
|
|
|
|
|
gtk_tree_view_button_release_drag_column (widget, NULL);
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
|
|
|
|
|
retval = (* GTK_WIDGET_CLASS (parent_class)->key_press_event) (widget, event);
|
|
|
|
|
|
|
|
|
|
if (! retval)
|
|
|
|
|
gtk_tree_view_interactive_search (tree_view, event);
|
|
|
|
|
|
|
|
|
|
return retval;
|
2001-05-09 22:23:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
/* FIXME Is this function necessary? Can I get an enter_notify event
|
|
|
|
|
* w/o either an expose event or a mouse motion event?
|
2000-10-05 01:04:57 +00:00
|
|
|
|
*/
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_enter_notify (GtkWidget *widget,
|
|
|
|
|
GdkEventCrossing *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
gint new_y;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
|
|
|
|
/* Sanity check it */
|
|
|
|
|
if (event->window != tree_view->priv->bin_window)
|
|
|
|
|
return FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if ((tree_view->priv->button_pressed_node != NULL) &&
|
|
|
|
|
(tree_view->priv->button_pressed_node != node))
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
/* find the node internally */
|
|
|
|
|
new_y = ((gint)event->y<TREE_VIEW_HEADER_HEIGHT (tree_view))?TREE_VIEW_HEADER_HEIGHT (tree_view):(gint)event->y;
|
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
_gtk_rbtree_find_offset (tree_view->priv->tree,
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, new_y),
|
2001-01-19 22:39:19 +00:00
|
|
|
|
&tree,
|
|
|
|
|
&node);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
if (node == NULL)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
do_prelight (tree_view, tree, node, event->x, new_y);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
if (tree_view->priv->prelight_node)
|
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view,
|
|
|
|
|
tree_view->priv->prelight_tree,
|
|
|
|
|
tree_view->priv->prelight_node,
|
|
|
|
|
NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_leave_notify (GtkWidget *widget,
|
|
|
|
|
GdkEventCrossing *event)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
if (tree_view->priv->prelight_node)
|
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view,
|
|
|
|
|
tree_view->priv->prelight_tree,
|
|
|
|
|
tree_view->priv->prelight_node,
|
|
|
|
|
NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
ensure_unprelighted (tree_view);
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
|
|
|
|
|
return TRUE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
static gint
|
|
|
|
|
gtk_tree_view_focus_in (GtkWidget *widget,
|
|
|
|
|
GdkEventFocus *event)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
g_return_val_if_fail (event != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_queue_draw (widget);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static gint
|
|
|
|
|
gtk_tree_view_focus_out (GtkWidget *widget,
|
|
|
|
|
GdkEventFocus *event)
|
|
|
|
|
{
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
GtkWidget *search_dialog;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
g_return_val_if_fail (event != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
|
|
|
|
|
|
|
|
|
|
gtk_widget_queue_draw (widget);
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
|
|
|
|
|
/* destroy interactive search dialog */
|
|
|
|
|
search_dialog = gtk_object_get_data (GTK_OBJECT (widget), "search-dialog");
|
|
|
|
|
if (search_dialog)
|
|
|
|
|
gtk_tree_view_search_dialog_destroy (search_dialog,
|
|
|
|
|
GTK_TREE_VIEW (widget));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Drag-and-drop */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
set_source_row (GdkDragContext *context,
|
|
|
|
|
GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *source_row)
|
|
|
|
|
{
|
|
|
|
|
g_object_set_data_full (G_OBJECT (context),
|
|
|
|
|
"gtk-tree-view-source-row",
|
|
|
|
|
source_row ? gtk_tree_row_reference_new (model, source_row) : NULL,
|
|
|
|
|
(GDestroyNotify) (source_row ? gtk_tree_row_reference_free : NULL));
|
|
|
|
|
}
|
2001-03-16 22:59:24 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static GtkTreePath*
|
|
|
|
|
get_source_row (GdkDragContext *context)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeRowReference *ref =
|
|
|
|
|
g_object_get_data (G_OBJECT (context), "gtk-tree-view-source-row");
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (ref)
|
|
|
|
|
return gtk_tree_row_reference_get_path (ref);
|
|
|
|
|
else
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
set_dest_row (GdkDragContext *context,
|
|
|
|
|
GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *dest_row)
|
|
|
|
|
{
|
|
|
|
|
g_object_set_data_full (G_OBJECT (context),
|
|
|
|
|
"gtk-tree-view-dest-row",
|
|
|
|
|
dest_row ? gtk_tree_row_reference_new (model, dest_row) : NULL,
|
|
|
|
|
(GDestroyNotify) (dest_row ? gtk_tree_row_reference_free : NULL));
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static GtkTreePath*
|
|
|
|
|
get_dest_row (GdkDragContext *context)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeRowReference *ref =
|
|
|
|
|
g_object_get_data (G_OBJECT (context), "gtk-tree-view-dest-row");
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (ref)
|
|
|
|
|
return gtk_tree_row_reference_get_path (ref);
|
|
|
|
|
else
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Get/set whether drag_motion requested the drag data and
|
|
|
|
|
* drag_data_received should thus not actually insert the data,
|
|
|
|
|
* since the data doesn't result from a drop.
|
|
|
|
|
*/
|
|
|
|
|
static void
|
|
|
|
|
set_status_pending (GdkDragContext *context,
|
|
|
|
|
GdkDragAction suggested_action)
|
|
|
|
|
{
|
|
|
|
|
g_object_set_data (G_OBJECT (context),
|
|
|
|
|
"gtk-tree-view-status-pending",
|
|
|
|
|
GINT_TO_POINTER (suggested_action));
|
|
|
|
|
}
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static GdkDragAction
|
|
|
|
|
get_status_pending (GdkDragContext *context)
|
|
|
|
|
{
|
|
|
|
|
return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (context),
|
|
|
|
|
"gtk-tree-view-status-pending"));
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static TreeViewDragInfo*
|
|
|
|
|
get_info (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
return g_object_get_data (G_OBJECT (tree_view), "gtk-tree-view-drag-info");
|
|
|
|
|
}
|
2001-03-16 22:59:24 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
clear_source_info (TreeViewDragInfo *di)
|
|
|
|
|
{
|
|
|
|
|
if (di->source_target_list)
|
|
|
|
|
gtk_target_list_unref (di->source_target_list);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di->row_draggable_closure)
|
|
|
|
|
g_closure_unref (di->row_draggable_closure);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di->source_target_list = NULL;
|
|
|
|
|
di->row_draggable_closure = NULL;
|
|
|
|
|
}
|
2001-03-16 22:59:24 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
clear_dest_info (TreeViewDragInfo *di)
|
|
|
|
|
{
|
|
|
|
|
if (di->location_droppable_closure)
|
|
|
|
|
g_closure_unref (di->location_droppable_closure);
|
2001-03-16 23:22:46 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di->dest_target_list)
|
|
|
|
|
gtk_target_list_unref (di->dest_target_list);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di->location_droppable_closure = NULL;
|
|
|
|
|
di->dest_target_list = NULL;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
destroy_info (TreeViewDragInfo *di)
|
|
|
|
|
{
|
|
|
|
|
clear_source_info (di);
|
|
|
|
|
clear_dest_info (di);
|
|
|
|
|
g_free (di);
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static TreeViewDragInfo*
|
|
|
|
|
ensure_info (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
TreeViewDragInfo *di;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di == NULL)
|
|
|
|
|
{
|
|
|
|
|
di = g_new0 (TreeViewDragInfo, 1);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_set_data_full (G_OBJECT (tree_view),
|
|
|
|
|
"gtk-tree-view-drag-info",
|
|
|
|
|
di,
|
|
|
|
|
(GDestroyNotify) destroy_info);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
return di;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
remove_info (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_object_set_data (G_OBJECT (tree_view), "gtk-tree-view-drag-info", NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2001-07-18 22:43:41 +00:00
|
|
|
|
#if 0
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gint
|
|
|
|
|
drag_scan_timeout (gpointer data)
|
2001-04-26 23:17:36 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint x, y;
|
|
|
|
|
GdkModifierType state;
|
|
|
|
|
GtkTreePath *path = NULL;
|
|
|
|
|
GtkTreeViewColumn *column = NULL;
|
|
|
|
|
GdkRectangle visible_rect;
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-07-18 22:43:41 +00:00
|
|
|
|
GDK_THREADS_ENTER ();
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (data);
|
|
|
|
|
|
|
|
|
|
gdk_window_get_pointer (tree_view->priv->bin_window,
|
|
|
|
|
&x, &y, &state);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_get_visible_rect (tree_view, &visible_rect);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* See if we are near the edge. */
|
|
|
|
|
if ((x - visible_rect.x) < SCROLL_EDGE_SIZE ||
|
|
|
|
|
(visible_rect.x + visible_rect.width - x) < SCROLL_EDGE_SIZE ||
|
|
|
|
|
(y - visible_rect.y) < SCROLL_EDGE_SIZE ||
|
|
|
|
|
(visible_rect.y + visible_rect.height - y) < SCROLL_EDGE_SIZE)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_get_path_at_pos (tree_view,
|
|
|
|
|
tree_view->priv->bin_window,
|
|
|
|
|
x, y,
|
|
|
|
|
&path,
|
|
|
|
|
&column,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path != NULL)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_scroll_to_cell (tree_view,
|
|
|
|
|
path,
|
|
|
|
|
column,
|
|
|
|
|
0.5, 0.5);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-07-18 22:43:41 +00:00
|
|
|
|
GDK_THREADS_LEAVE ();
|
|
|
|
|
|
2001-04-26 23:17:36 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2001-07-18 22:43:41 +00:00
|
|
|
|
#endif /* 0 */
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
remove_scroll_timeout (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->scroll_timeout != 0)
|
|
|
|
|
{
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->scroll_timeout);
|
|
|
|
|
tree_view->priv->scroll_timeout = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static gboolean
|
2001-04-28 00:29:34 +00:00
|
|
|
|
check_model_dnd (GtkTreeModel *model,
|
|
|
|
|
GType required_iface,
|
|
|
|
|
const gchar *signal)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (model == NULL || !G_TYPE_CHECK_INSTANCE_TYPE ((model), required_iface))
|
|
|
|
|
{
|
|
|
|
|
g_warning ("You must override the default '%s' handler "
|
|
|
|
|
"on GtkTreeView when using models that don't support "
|
|
|
|
|
"the %s interface and enabling drag-and-drop. The simplest way to do this "
|
|
|
|
|
"is to connect to '%s' and call "
|
|
|
|
|
"gtk_signal_emit_stop_by_name() in your signal handler to prevent "
|
|
|
|
|
"the default handler from running. Look at the source code "
|
|
|
|
|
"for the default handler in gtktreeview.c to get an idea what "
|
|
|
|
|
"your handler should do. (gtktreeview.c is in the GTK source "
|
|
|
|
|
"code.) If you're using GTK from a language other than C, "
|
|
|
|
|
"there may be a more natural way to override default handlers, e.g. via derivation.",
|
|
|
|
|
signal, g_type_name (required_iface), signal);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
remove_open_timeout (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->open_dest_timeout != 0)
|
|
|
|
|
{
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->open_dest_timeout);
|
|
|
|
|
tree_view->priv->open_dest_timeout = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gint
|
|
|
|
|
open_row_timeout (gpointer data)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = data;
|
|
|
|
|
GtkTreePath *dest_path = NULL;
|
|
|
|
|
GtkTreeViewDropPosition pos;
|
2001-07-18 22:43:41 +00:00
|
|
|
|
gboolean result = FALSE;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-07-18 22:43:41 +00:00
|
|
|
|
GDK_THREADS_ENTER ();
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_drag_dest_row (tree_view,
|
|
|
|
|
&dest_path,
|
|
|
|
|
&pos);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (dest_path &&
|
|
|
|
|
(pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER ||
|
|
|
|
|
pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE))
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_expand_row (tree_view, dest_path, FALSE);
|
|
|
|
|
tree_view->priv->open_dest_timeout = 0;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (dest_path);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (dest_path)
|
|
|
|
|
gtk_tree_path_free (dest_path);
|
2001-07-18 22:43:41 +00:00
|
|
|
|
|
|
|
|
|
result = TRUE;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2001-07-18 22:43:41 +00:00
|
|
|
|
|
|
|
|
|
GDK_THREADS_LEAVE ();
|
|
|
|
|
|
|
|
|
|
return result;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Returns TRUE if event should not be propagated to parent widgets */
|
|
|
|
|
static gboolean
|
|
|
|
|
set_destination_row (GtkTreeView *tree_view,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
GdkDragAction *suggested_action,
|
|
|
|
|
GdkAtom *target)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *path = NULL;
|
|
|
|
|
GtkTreeViewDropPosition pos;
|
|
|
|
|
GtkTreeViewDropPosition old_pos;
|
|
|
|
|
TreeViewDragInfo *di;
|
|
|
|
|
GtkWidget *widget;
|
|
|
|
|
GtkTreePath *old_dest_path = NULL;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*suggested_action = 0;
|
|
|
|
|
*target = GDK_NONE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
widget = GTK_WIDGET (tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
2001-04-02 23:38:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di == NULL)
|
|
|
|
|
{
|
|
|
|
|
/* someone unset us as a drag dest, note that if
|
|
|
|
|
* we return FALSE drag_leave isn't called
|
|
|
|
|
*/
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_set_drag_dest_row (tree_view,
|
|
|
|
|
NULL,
|
|
|
|
|
GTK_TREE_VIEW_DROP_BEFORE);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
remove_scroll_timeout (GTK_TREE_VIEW (widget));
|
|
|
|
|
remove_open_timeout (GTK_TREE_VIEW (widget));
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return FALSE; /* no longer a drop site */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*target = gtk_drag_dest_find_target (widget, context, di->dest_target_list);
|
|
|
|
|
if (*target == GDK_NONE)
|
|
|
|
|
{
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2001-03-23 00:35:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!gtk_tree_view_get_dest_row_at_pos (tree_view,
|
|
|
|
|
x, y,
|
|
|
|
|
&path,
|
|
|
|
|
&pos))
|
2001-03-23 00:35:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* can't drop here */
|
|
|
|
|
remove_open_timeout (tree_view);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
|
|
|
|
|
NULL,
|
|
|
|
|
GTK_TREE_VIEW_DROP_BEFORE);
|
|
|
|
|
|
|
|
|
|
/* don't propagate to parent though */
|
|
|
|
|
return TRUE;
|
2001-03-23 00:35:19 +00:00
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_assert (path);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* If we left the current row's "open" zone, unset the timeout for
|
|
|
|
|
* opening the row
|
|
|
|
|
*/
|
|
|
|
|
gtk_tree_view_get_drag_dest_row (tree_view,
|
|
|
|
|
&old_dest_path,
|
|
|
|
|
&old_pos);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (old_dest_path &&
|
|
|
|
|
(gtk_tree_path_compare (path, old_dest_path) != 0 ||
|
|
|
|
|
!(pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER ||
|
|
|
|
|
pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)))
|
|
|
|
|
remove_open_timeout (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (old_dest_path)
|
|
|
|
|
gtk_tree_path_free (old_dest_path);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (TRUE /* FIXME if the location droppable predicate */)
|
|
|
|
|
{
|
|
|
|
|
GtkWidget *source_widget;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*suggested_action = context->suggested_action;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
source_widget = gtk_drag_get_source_widget (context);
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (source_widget == widget)
|
|
|
|
|
{
|
|
|
|
|
/* Default to MOVE, unless the user has
|
|
|
|
|
* pressed ctrl or alt to affect available actions
|
|
|
|
|
*/
|
|
|
|
|
if ((context->actions & GDK_ACTION_MOVE) != 0)
|
|
|
|
|
*suggested_action = GDK_ACTION_MOVE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
|
|
|
|
|
path, pos);
|
|
|
|
|
}
|
|
|
|
|
else
|
2001-03-15 23:21:39 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* can't drop here */
|
|
|
|
|
remove_open_timeout (tree_view);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
|
|
|
|
|
NULL,
|
|
|
|
|
GTK_TREE_VIEW_DROP_BEFORE);
|
2001-03-15 23:21:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
static GtkTreePath*
|
|
|
|
|
get_logical_dest_row (GtkTreeView *tree_view)
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
/* adjust path to point to the row the drop goes in front of */
|
|
|
|
|
GtkTreePath *path = NULL;
|
|
|
|
|
GtkTreeViewDropPosition pos;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_drag_dest_row (tree_view, &path, &pos);
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path == NULL)
|
|
|
|
|
return NULL;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (pos == GTK_TREE_VIEW_DROP_BEFORE)
|
|
|
|
|
; /* do nothing */
|
|
|
|
|
else if (pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE ||
|
|
|
|
|
pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER)
|
|
|
|
|
{
|
|
|
|
|
/* get first child, drop before it */
|
|
|
|
|
gtk_tree_path_append_index (path, 0);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
g_assert (pos == GTK_TREE_VIEW_DROP_AFTER);
|
|
|
|
|
gtk_tree_path_next (path);
|
|
|
|
|
}
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return path;
|
|
|
|
|
}
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_maybe_begin_dragging_row (GtkTreeView *tree_view,
|
|
|
|
|
GdkEventMotion *event)
|
|
|
|
|
{
|
|
|
|
|
GdkDragContext *context;
|
|
|
|
|
TreeViewDragInfo *di;
|
|
|
|
|
GtkTreePath *path = NULL;
|
|
|
|
|
gint button;
|
|
|
|
|
gint cell_x, cell_y;
|
|
|
|
|
GtkTreeModel *model;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di == NULL)
|
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->pressed_button < 0)
|
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!gtk_drag_check_threshold (GTK_WIDGET (tree_view),
|
|
|
|
|
tree_view->priv->press_start_x,
|
|
|
|
|
tree_view->priv->press_start_y,
|
|
|
|
|
event->x, event->y))
|
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
model = gtk_tree_view_get_model (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (model == NULL)
|
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
button = tree_view->priv->pressed_button;
|
|
|
|
|
tree_view->priv->pressed_button = -1;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_path_at_pos (tree_view,
|
|
|
|
|
tree_view->priv->bin_window,
|
|
|
|
|
tree_view->priv->press_start_x,
|
|
|
|
|
tree_view->priv->press_start_y,
|
|
|
|
|
&path,
|
|
|
|
|
NULL,
|
|
|
|
|
&cell_x,
|
|
|
|
|
&cell_y);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path == NULL)
|
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* FIXME if the path doesn't match the row_draggable predicate,
|
|
|
|
|
* return FALSE and free path
|
|
|
|
|
*/
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* FIXME Check whether we're a start button, if not return FALSE and
|
|
|
|
|
* free path
|
|
|
|
|
*/
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
context = gtk_drag_begin (GTK_WIDGET (tree_view),
|
|
|
|
|
di->source_target_list,
|
|
|
|
|
di->source_actions,
|
|
|
|
|
button,
|
|
|
|
|
(GdkEvent*)event);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_drag_set_icon_default (context);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
GdkPixmap *row_pix;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
row_pix = gtk_tree_view_create_row_drag_icon (tree_view,
|
|
|
|
|
path);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_drag_set_icon_pixmap (context,
|
|
|
|
|
gdk_drawable_get_colormap (row_pix),
|
|
|
|
|
row_pix,
|
|
|
|
|
NULL,
|
|
|
|
|
/* the + 1 is for the black border in the icon */
|
|
|
|
|
tree_view->priv->press_start_x + 1,
|
|
|
|
|
cell_y + 1);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_pixmap_unref (row_pix);
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
set_source_row (context, model, path);
|
|
|
|
|
gtk_tree_path_free (path);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_drag_begin (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context)
|
|
|
|
|
{
|
|
|
|
|
/* do nothing */
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_drag_end (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context)
|
|
|
|
|
{
|
|
|
|
|
/* do nothing */
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Default signal implementations for the drag signals */
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_drag_data_get (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
GtkSelectionData *selection_data,
|
|
|
|
|
guint info,
|
|
|
|
|
guint time)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkTreeModel *model;
|
|
|
|
|
TreeViewDragInfo *di;
|
|
|
|
|
GtkTreePath *source_row;
|
2001-03-13 02:00:37 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
model = gtk_tree_view_get_model (tree_view);
|
2001-03-13 02:00:37 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (model == NULL)
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (GTK_TREE_VIEW (widget));
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di == NULL)
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
source_row = get_source_row (context);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (source_row == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* We can implement the GTK_TREE_MODEL_ROW target generically for
|
|
|
|
|
* any model; for DragSource models there are some other targets
|
|
|
|
|
* we also support.
|
2000-10-05 01:04:57 +00:00
|
|
|
|
*/
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_IS_TREE_DRAG_SOURCE (model) &&
|
|
|
|
|
gtk_tree_drag_source_drag_data_get (GTK_TREE_DRAG_SOURCE (model),
|
|
|
|
|
source_row,
|
|
|
|
|
selection_data))
|
|
|
|
|
goto done;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* If drag_data_get does nothing, try providing row data. */
|
|
|
|
|
if (selection_data->target == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE))
|
|
|
|
|
{
|
|
|
|
|
gtk_selection_data_set_tree_row (selection_data,
|
|
|
|
|
model,
|
|
|
|
|
source_row);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
done:
|
|
|
|
|
gtk_tree_path_free (source_row);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-03-23 00:35:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_drag_data_delete (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TreeViewDragInfo *di;
|
|
|
|
|
GtkTreeModel *model;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
GtkTreeView *tree_view;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreePath *source_row;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
model = gtk_tree_view_get_model (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_SOURCE, "drag_data_delete"))
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di == NULL)
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
source_row = get_source_row (context);
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (source_row == NULL)
|
|
|
|
|
return;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (model),
|
|
|
|
|
source_row);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (source_row);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
set_source_row (context, NULL, NULL);
|
|
|
|
|
}
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_drag_leave (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
guint time)
|
|
|
|
|
{
|
|
|
|
|
TreeViewDragInfo *di;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (GTK_TREE_VIEW (widget));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* unset any highlight row */
|
|
|
|
|
gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
|
|
|
|
|
NULL,
|
|
|
|
|
GTK_TREE_VIEW_DROP_BEFORE);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
remove_scroll_timeout (GTK_TREE_VIEW (widget));
|
|
|
|
|
remove_open_timeout (GTK_TREE_VIEW (widget));
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_drag_motion (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
guint time)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *path = NULL;
|
|
|
|
|
GtkTreeViewDropPosition pos;
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GdkDragAction suggested_action = 0;
|
|
|
|
|
GdkAtom target;
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
|
|
|
|
|
|
|
|
|
if (!set_destination_row (tree_view, context, x, y, &suggested_action, &target))
|
|
|
|
|
return FALSE;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
// gtk_tree_view_ensure_scroll_timeout (tree_view);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_drag_dest_row (tree_view, &path, &pos);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path == NULL)
|
|
|
|
|
{
|
|
|
|
|
/* Can't drop here. */
|
|
|
|
|
gdk_drag_status (context, 0, time);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
else
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->open_dest_timeout == 0 &&
|
|
|
|
|
(pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER ||
|
|
|
|
|
pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE))
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->open_dest_timeout =
|
|
|
|
|
gtk_timeout_add (500, open_row_timeout, tree_view);
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (target == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE))
|
|
|
|
|
{
|
|
|
|
|
/* Request data so we can use the source row when
|
|
|
|
|
* determining whether to accept the drop
|
|
|
|
|
*/
|
|
|
|
|
set_status_pending (context, suggested_action);
|
|
|
|
|
gtk_drag_get_data (widget, context, target, time);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
set_status_pending (context, 0);
|
|
|
|
|
gdk_drag_status (context, suggested_action, time);
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
gtk_tree_path_free (path);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_drag_drop (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
guint time)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
GdkDragAction suggested_action = 0;
|
|
|
|
|
GdkAtom target = GDK_NONE;
|
|
|
|
|
TreeViewDragInfo *di;
|
|
|
|
|
GtkTreeModel *model;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
model = gtk_tree_view_get_model (tree_view);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
remove_scroll_timeout (GTK_TREE_VIEW (widget));
|
|
|
|
|
remove_open_timeout (GTK_TREE_VIEW (widget));
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di == NULL)
|
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_DEST, "drag_drop"))
|
2001-03-15 23:21:39 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!set_destination_row (tree_view, context, x, y, &suggested_action, &target))
|
2001-03-15 23:21:39 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
path = get_logical_dest_row (tree_view);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (target != GDK_NONE && path != NULL)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* in case a motion had requested drag data, change things so we
|
|
|
|
|
* treat drag data receives as a drop.
|
|
|
|
|
*/
|
|
|
|
|
set_status_pending (context, 0);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
set_dest_row (context, model, path);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
gtk_tree_path_free (path);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Unset this thing */
|
|
|
|
|
gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
|
|
|
|
|
NULL,
|
|
|
|
|
GTK_TREE_VIEW_DROP_BEFORE);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (target != GDK_NONE)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_drag_get_data (widget, context, target, time);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
else
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_drag_data_received (GtkWidget *widget,
|
|
|
|
|
GdkDragContext *context,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
GtkSelectionData *selection_data,
|
|
|
|
|
guint info,
|
|
|
|
|
guint time)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
TreeViewDragInfo *di;
|
|
|
|
|
gboolean accepted = FALSE;
|
|
|
|
|
GtkTreeModel *model;
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkTreePath *dest_row;
|
|
|
|
|
GdkDragAction suggested_action;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
model = gtk_tree_view_get_model (tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_DEST, "drag_data_received"))
|
|
|
|
|
return;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di == NULL)
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
suggested_action = get_status_pending (context);
|
|
|
|
|
|
|
|
|
|
if (suggested_action)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* We are getting this data due to a request in drag_motion,
|
|
|
|
|
* rather than due to a request in drag_drop, so we are just
|
|
|
|
|
* supposed to call drag_status, not actually paste in the
|
|
|
|
|
* data.
|
|
|
|
|
*/
|
|
|
|
|
path = get_logical_dest_row (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path == NULL)
|
|
|
|
|
suggested_action = 0;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (suggested_action)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeModel *src_model = NULL;
|
|
|
|
|
GtkTreePath *src_path = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!gtk_selection_data_get_tree_row (selection_data,
|
|
|
|
|
&src_model,
|
|
|
|
|
&src_path))
|
|
|
|
|
suggested_action = 0;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (suggested_action)
|
|
|
|
|
{
|
|
|
|
|
if (!gtk_tree_drag_dest_row_drop_possible (GTK_TREE_DRAG_DEST (model),
|
|
|
|
|
src_model,
|
|
|
|
|
src_path,
|
|
|
|
|
path))
|
|
|
|
|
suggested_action = 0;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (src_path);
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_drag_status (context, suggested_action, time);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
gtk_tree_path_free (path);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* If you can't drop, remove user drop indicator until the next motion */
|
|
|
|
|
if (suggested_action == 0)
|
|
|
|
|
gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
|
|
|
|
|
NULL,
|
|
|
|
|
GTK_TREE_VIEW_DROP_BEFORE);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
dest_row = get_dest_row (context);
|
|
|
|
|
|
|
|
|
|
if (dest_row == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (selection_data->length >= 0)
|
|
|
|
|
{
|
|
|
|
|
if (gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (model),
|
|
|
|
|
dest_row,
|
|
|
|
|
selection_data))
|
|
|
|
|
accepted = TRUE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_drag_finish (context,
|
|
|
|
|
accepted,
|
|
|
|
|
(context->action == GDK_ACTION_MOVE),
|
|
|
|
|
time);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (dest_row);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* drop dest_row */
|
|
|
|
|
set_dest_row (context, NULL, NULL);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* GtkContainer Methods
|
2000-10-05 01:04:57 +00:00
|
|
|
|
*/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_remove (GtkContainer *container,
|
|
|
|
|
GtkWidget *widget)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkTreeViewChild *child = NULL;
|
|
|
|
|
GList *tmp_list;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (container));
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (container);
|
|
|
|
|
|
|
|
|
|
tmp_list = tree_view->priv->children;
|
|
|
|
|
while (tmp_list)
|
|
|
|
|
{
|
|
|
|
|
child = tmp_list->data;
|
|
|
|
|
if (child->widget == widget)
|
2001-03-05 19:43:24 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_widget_unparent (widget);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->children = g_list_remove_link (tree_view->priv->children, tmp_list);
|
|
|
|
|
g_list_free_1 (tmp_list);
|
|
|
|
|
g_free (child);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
|
}
|
|
|
|
|
|
2001-03-05 19:43:24 +00:00
|
|
|
|
tmp_list = tree_view->priv->columns;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-03-05 19:43:24 +00:00
|
|
|
|
while (tmp_list)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
column = tmp_list->data;
|
2001-03-05 19:43:24 +00:00
|
|
|
|
if (column->button == widget)
|
|
|
|
|
{
|
|
|
|
|
gtk_widget_unparent (widget);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
tmp_list = tmp_list->next;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-03-05 19:43:24 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_forall (GtkContainer *container,
|
|
|
|
|
gboolean include_internals,
|
|
|
|
|
GtkCallback callback,
|
|
|
|
|
gpointer callback_data)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkTreeViewChild *child = NULL;
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
GList *tmp_list;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (container));
|
|
|
|
|
g_return_if_fail (callback != NULL);
|
|
|
|
|
|
|
|
|
|
tree_view = GTK_TREE_VIEW (container);
|
|
|
|
|
|
|
|
|
|
tmp_list = tree_view->priv->children;
|
|
|
|
|
while (tmp_list)
|
|
|
|
|
{
|
|
|
|
|
child = tmp_list->data;
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
|
|
|
|
|
|
(* callback) (child->widget, callback_data);
|
|
|
|
|
}
|
|
|
|
|
if (include_internals == FALSE)
|
|
|
|
|
return;
|
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-03-09 00:40:18 +00:00
|
|
|
|
column = tmp_list->data;
|
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
if (column->button)
|
|
|
|
|
(* callback) (column->button, callback_data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Returns TRUE if the focus is within the headers, after the focus operation is
|
|
|
|
|
* done
|
2000-10-05 01:04:57 +00:00
|
|
|
|
*/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_header_focus (GtkTreeView *tree_view,
|
|
|
|
|
GtkDirectionType dir)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkWidget *focus_child;
|
|
|
|
|
GtkContainer *container;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GList *last_column, *first_column;
|
|
|
|
|
GList *tmp_list;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (! GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
|
|
|
|
|
return FALSE;
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
focus_child = GTK_CONTAINER (tree_view)->focus_child;
|
|
|
|
|
container = GTK_CONTAINER (tree_view);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
last_column = g_list_last (tree_view->priv->columns);
|
|
|
|
|
while (last_column)
|
|
|
|
|
{
|
|
|
|
|
if (GTK_WIDGET_CAN_FOCUS (GTK_TREE_VIEW_COLUMN (last_column->data)->button) &&
|
|
|
|
|
GTK_TREE_VIEW_COLUMN (last_column->data)->visible)
|
|
|
|
|
break;
|
|
|
|
|
last_column = last_column->prev;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* No headers are visible, or are focusable. We can't focus in or out.
|
2000-10-05 01:04:57 +00:00
|
|
|
|
*/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (last_column == NULL)
|
|
|
|
|
return FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
first_column = tree_view->priv->columns;
|
|
|
|
|
while (first_column)
|
|
|
|
|
{
|
|
|
|
|
if (GTK_WIDGET_CAN_FOCUS (GTK_TREE_VIEW_COLUMN (first_column->data)->button) &&
|
|
|
|
|
GTK_TREE_VIEW_COLUMN (first_column->data)->visible)
|
|
|
|
|
break;
|
|
|
|
|
first_column = first_column->next;
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
switch (dir)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
case GTK_DIR_TAB_BACKWARD:
|
|
|
|
|
case GTK_DIR_TAB_FORWARD:
|
|
|
|
|
case GTK_DIR_UP:
|
|
|
|
|
case GTK_DIR_DOWN:
|
|
|
|
|
if (focus_child == NULL)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->focus_column != NULL)
|
|
|
|
|
focus_child = tree_view->priv->focus_column->button;
|
|
|
|
|
else
|
|
|
|
|
focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
|
|
|
|
|
gtk_widget_grab_focus (focus_child);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
case GTK_DIR_LEFT:
|
|
|
|
|
case GTK_DIR_RIGHT:
|
|
|
|
|
if (focus_child == NULL)
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->focus_column != NULL)
|
|
|
|
|
focus_child = tree_view->priv->focus_column->button;
|
|
|
|
|
else if (dir == GTK_DIR_LEFT)
|
|
|
|
|
focus_child = GTK_TREE_VIEW_COLUMN (last_column->data)->button;
|
|
|
|
|
else
|
|
|
|
|
focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
|
|
|
|
|
gtk_widget_grab_focus (focus_child);
|
|
|
|
|
break;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-02-13 05:44:47 +00:00
|
|
|
|
|
2001-06-08 18:09:34 +00:00
|
|
|
|
if (gtk_widget_child_focus (focus_child, dir))
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
/* The focus moves inside the button. */
|
|
|
|
|
/* This is probably a great example of bad UI */
|
|
|
|
|
break;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* 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;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
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);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (tmp_list)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (dir == GTK_DIR_RIGHT)
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
|
else
|
|
|
|
|
tmp_list = tmp_list->prev;
|
2001-02-28 21:37:50 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_list == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_warning ("Internal button not found");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
column = tmp_list->data;
|
|
|
|
|
if (column->button &&
|
|
|
|
|
column->visible &&
|
|
|
|
|
GTK_WIDGET_CAN_FOCUS (column->button))
|
|
|
|
|
{
|
|
|
|
|
focus_child = column->button;
|
|
|
|
|
gtk_widget_grab_focus (column->button);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
g_assert_not_reached ();
|
|
|
|
|
break;
|
|
|
|
|
}
|
2001-02-28 21:37:50 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* if focus child is non-null, we assume it's been set to the current focus child
|
|
|
|
|
*/
|
|
|
|
|
if (focus_child)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
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;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (tmp_list->data);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* If the following isn't true, then the view is smaller then the scrollpane.
|
|
|
|
|
*/
|
|
|
|
|
if ((focus_child->allocation.x + focus_child->allocation.width) <=
|
|
|
|
|
(tree_view->priv->hadjustment->upper))
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Scroll to the button, if needed */
|
|
|
|
|
if ((tree_view->priv->hadjustment->value + tree_view->priv->hadjustment->page_size) <
|
|
|
|
|
(focus_child->allocation.x + focus_child->allocation.width))
|
|
|
|
|
gtk_adjustment_set_value (tree_view->priv->hadjustment,
|
|
|
|
|
focus_child->allocation.x + focus_child->allocation.width -
|
|
|
|
|
tree_view->priv->hadjustment->page_size);
|
|
|
|
|
else if (tree_view->priv->hadjustment->value > focus_child->allocation.x)
|
|
|
|
|
gtk_adjustment_set_value (tree_view->priv->hadjustment,
|
|
|
|
|
focus_child->allocation.x);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return (focus_child != NULL);
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* We make the assumption that if container->focus_child != NULL, the focus must
|
|
|
|
|
* be in the header. For now, this is accurate. It may not be in the future.
|
|
|
|
|
*/
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* The sordid relationship between focus_column and scroll_column:
|
|
|
|
|
*
|
|
|
|
|
* The focus_column represents the column that currently has keyboard focus, and
|
|
|
|
|
* is used when navigating columns by keyboard. scroll_column is used for
|
|
|
|
|
* handling scrolling by keyboard, such that in cases.
|
|
|
|
|
*/
|
|
|
|
|
static gint
|
2001-06-08 18:09:34 +00:00
|
|
|
|
gtk_tree_view_focus (GtkWidget *widget,
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkDirectionType direction)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
|
|
|
|
GtkWidget *focus_child;
|
2001-06-08 23:51:21 +00:00
|
|
|
|
GtkContainer *container;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-06-08 18:09:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
|
|
|
|
|
g_return_val_if_fail (GTK_WIDGET_VISIBLE (widget), FALSE);
|
2001-03-15 23:21:39 +00:00
|
|
|
|
|
2001-06-08 18:09:34 +00:00
|
|
|
|
container = GTK_CONTAINER (widget);
|
|
|
|
|
tree_view = GTK_TREE_VIEW (widget);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
if (!GTK_WIDGET_IS_SENSITIVE (container))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
focus_child = container->focus_child;
|
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
/* Case 1. Headers currently have focus. */
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (focus_child)
|
|
|
|
|
{
|
|
|
|
|
switch (direction)
|
|
|
|
|
{
|
|
|
|
|
case GTK_DIR_LEFT:
|
|
|
|
|
case GTK_DIR_RIGHT:
|
2001-06-01 22:57:30 +00:00
|
|
|
|
gtk_tree_view_header_focus (tree_view, direction);
|
|
|
|
|
return TRUE;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
case GTK_DIR_TAB_BACKWARD:
|
|
|
|
|
case GTK_DIR_UP:
|
|
|
|
|
return FALSE;
|
|
|
|
|
case GTK_DIR_TAB_FORWARD:
|
|
|
|
|
case GTK_DIR_DOWN:
|
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
return FALSE;
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_focus_to_cursor (tree_view);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Case 2. We don't have focus at all. */
|
|
|
|
|
if (!GTK_WIDGET_HAS_FOCUS (container))
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-06-01 22:57:30 +00:00
|
|
|
|
if (tree_view->priv->tree == NULL &&
|
|
|
|
|
(direction == GTK_DIR_TAB_BACKWARD ||
|
|
|
|
|
direction == GTK_DIR_UP))
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return gtk_tree_view_header_focus (tree_view, direction);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
if (((direction == GTK_DIR_TAB_FORWARD) ||
|
|
|
|
|
(direction == GTK_DIR_RIGHT) ||
|
|
|
|
|
(direction == GTK_DIR_DOWN) ||
|
|
|
|
|
(direction == GTK_DIR_LEFT)) &&
|
|
|
|
|
gtk_tree_view_header_focus (tree_view, direction))
|
|
|
|
|
return TRUE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
return FALSE;
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_focus_to_cursor (tree_view);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Case 3. We have focus already. */
|
|
|
|
|
if (tree_view->priv->tree == NULL)
|
2001-06-01 22:57:30 +00:00
|
|
|
|
return gtk_tree_view_header_focus (tree_view, direction);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (direction == GTK_DIR_TAB_BACKWARD)
|
|
|
|
|
return (gtk_tree_view_header_focus (tree_view, direction));
|
|
|
|
|
else if (direction == GTK_DIR_TAB_FORWARD)
|
|
|
|
|
return FALSE;
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
/* Other directions caught by the keybindings */
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_focus_to_cursor (tree_view);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
return TRUE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_set_focus_child (GtkContainer *container,
|
|
|
|
|
GtkWidget *child)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = GTK_TREE_VIEW (container);
|
|
|
|
|
GList *list;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_TREE_VIEW_COLUMN (list->data)->button == child)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->focus_column = GTK_TREE_VIEW_COLUMN (list->data);
|
|
|
|
|
break;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
(* parent_class->set_focus_child) (container, child);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_set_adjustments (GtkTreeView *tree_view,
|
|
|
|
|
GtkAdjustment *hadj,
|
|
|
|
|
GtkAdjustment *vadj)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gboolean need_adjust = FALSE;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (hadj)
|
|
|
|
|
g_return_if_fail (GTK_IS_ADJUSTMENT (hadj));
|
|
|
|
|
else
|
|
|
|
|
hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
|
|
|
|
|
if (vadj)
|
|
|
|
|
g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
|
|
|
|
|
else
|
|
|
|
|
vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->hadjustment && (tree_view->priv->hadjustment != hadj))
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_signal_disconnect_by_data (GTK_OBJECT (tree_view->priv->hadjustment), tree_view);
|
|
|
|
|
gtk_object_unref (GTK_OBJECT (tree_view->priv->hadjustment));
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->vadjustment && (tree_view->priv->vadjustment != vadj))
|
2001-03-09 00:19:11 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_signal_disconnect_by_data (GTK_OBJECT (tree_view->priv->vadjustment), tree_view);
|
|
|
|
|
gtk_object_unref (GTK_OBJECT (tree_view->priv->vadjustment));
|
|
|
|
|
}
|
2001-03-09 00:19:11 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->hadjustment != hadj)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->hadjustment = hadj;
|
|
|
|
|
gtk_object_ref (GTK_OBJECT (tree_view->priv->hadjustment));
|
|
|
|
|
gtk_object_sink (GTK_OBJECT (tree_view->priv->hadjustment));
|
2001-03-09 00:19:11 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_signal_connect (GTK_OBJECT (tree_view->priv->hadjustment), "value_changed",
|
|
|
|
|
(GtkSignalFunc) gtk_tree_view_adjustment_changed,
|
|
|
|
|
tree_view);
|
|
|
|
|
need_adjust = TRUE;
|
|
|
|
|
}
|
2001-03-09 00:19:11 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->vadjustment != vadj)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->vadjustment = vadj;
|
|
|
|
|
gtk_object_ref (GTK_OBJECT (tree_view->priv->vadjustment));
|
|
|
|
|
gtk_object_sink (GTK_OBJECT (tree_view->priv->vadjustment));
|
2001-03-09 00:19:11 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_signal_connect (GTK_OBJECT (tree_view->priv->vadjustment), "value_changed",
|
|
|
|
|
(GtkSignalFunc) gtk_tree_view_adjustment_changed,
|
|
|
|
|
tree_view);
|
|
|
|
|
need_adjust = TRUE;
|
2001-03-09 00:19:11 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
if (need_adjust)
|
|
|
|
|
gtk_tree_view_adjustment_changed (NULL, tree_view);
|
2001-03-09 00:19:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_real_move_cursor (GtkTreeView *tree_view,
|
|
|
|
|
GtkMovementStep step,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gint count)
|
2001-06-01 22:57:30 +00:00
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (step == GTK_MOVEMENT_LOGICAL_POSITIONS ||
|
|
|
|
|
step == GTK_MOVEMENT_VISUAL_POSITIONS ||
|
|
|
|
|
step == GTK_MOVEMENT_DISPLAY_LINES ||
|
|
|
|
|
step == GTK_MOVEMENT_PAGES ||
|
|
|
|
|
step == GTK_MOVEMENT_BUFFER_ENDS);
|
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS);
|
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
switch (step)
|
|
|
|
|
{
|
|
|
|
|
/* currently we make no distinction. When we go bi-di, we need to */
|
|
|
|
|
case GTK_MOVEMENT_LOGICAL_POSITIONS:
|
|
|
|
|
case GTK_MOVEMENT_VISUAL_POSITIONS:
|
2001-06-07 00:07:32 +00:00
|
|
|
|
gtk_tree_view_move_cursor_left_right (tree_view, count);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
break;
|
|
|
|
|
case GTK_MOVEMENT_DISPLAY_LINES:
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_move_cursor_up_down (tree_view, count);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
break;
|
|
|
|
|
case GTK_MOVEMENT_PAGES:
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_move_cursor_page_up_down (tree_view, count);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
break;
|
|
|
|
|
case GTK_MOVEMENT_BUFFER_ENDS:
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_move_cursor_start_end (tree_view, count);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
g_assert_not_reached ();
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
/* TreeModel Callbacks
|
|
|
|
|
*/
|
|
|
|
|
|
2001-03-09 00:19:11 +00:00
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_range_changed (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
GtkTreePath *end_path,
|
|
|
|
|
GtkTreeIter *end_iter,
|
|
|
|
|
gpointer data)
|
2001-03-09 00:19:11 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeView *tree_view = (GtkTreeView *)data;
|
|
|
|
|
GtkRBTree *tree;
|
2001-03-09 00:19:11 +00:00
|
|
|
|
GtkRBNode *node;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint height;
|
|
|
|
|
gboolean dirty_marked;
|
|
|
|
|
gboolean free_path = FALSE;
|
|
|
|
|
gint vertical_separator;
|
2001-03-09 00:19:11 +00:00
|
|
|
|
|
2001-05-25 23:10:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (path != NULL || iter != NULL);
|
2001-03-09 00:19:11 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (data), "vertical_separator", &vertical_separator, NULL);
|
2001-03-09 00:19:11 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path == NULL)
|
|
|
|
|
{
|
|
|
|
|
path = gtk_tree_model_get_path (model, iter);
|
|
|
|
|
free_path = TRUE;
|
|
|
|
|
}
|
|
|
|
|
else if (iter == NULL)
|
|
|
|
|
gtk_tree_model_get_iter (model, iter, path);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (_gtk_tree_view_find_node (tree_view,
|
|
|
|
|
path,
|
|
|
|
|
&tree,
|
|
|
|
|
&node))
|
|
|
|
|
/* We aren't actually showing the node */
|
|
|
|
|
goto done;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
goto done;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
dirty_marked = gtk_tree_view_discover_dirty_iter (tree_view,
|
|
|
|
|
iter,
|
|
|
|
|
gtk_tree_path_get_depth (path),
|
2001-08-19 04:19:56 +00:00
|
|
|
|
&height,
|
|
|
|
|
node);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_RBNODE_GET_HEIGHT (node) != height + vertical_separator)
|
2001-04-23 23:03:53 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_rbtree_node_set_height (tree, node, height + vertical_separator);
|
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (data));
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
if (dirty_marked)
|
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (data));
|
|
|
|
|
else
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
done:
|
|
|
|
|
if (free_path)
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
}
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_inserted (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gpointer data)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = (GtkTreeView *) data;
|
|
|
|
|
gint *indices;
|
|
|
|
|
GtkRBTree *tmptree, *tree;
|
|
|
|
|
GtkRBNode *tmpnode = NULL;
|
|
|
|
|
gint max_height;
|
|
|
|
|
gint depth;
|
|
|
|
|
gint i = 0;
|
|
|
|
|
gboolean free_path = FALSE;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
tree_view->priv->tree = _gtk_rbtree_new ();
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tmptree = tree = tree_view->priv->tree;
|
|
|
|
|
g_return_if_fail (path != NULL || iter != NULL);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path == NULL)
|
|
|
|
|
{
|
|
|
|
|
path = gtk_tree_model_get_path (model, iter);
|
|
|
|
|
free_path = TRUE;
|
|
|
|
|
}
|
|
|
|
|
else if (iter == NULL)
|
|
|
|
|
gtk_tree_model_get_iter (model, iter, path);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Update all row-references */
|
|
|
|
|
gtk_tree_row_reference_inserted (G_OBJECT (data), path);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
depth = gtk_tree_path_get_depth (path);
|
|
|
|
|
indices = gtk_tree_path_get_indices (path);
|
|
|
|
|
|
|
|
|
|
/* First, find the parent tree */
|
|
|
|
|
while (i < depth - 1)
|
2001-04-23 23:03:53 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmptree == NULL)
|
|
|
|
|
{
|
|
|
|
|
/* We aren't showing the node */
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tmpnode = _gtk_rbtree_find_count (tmptree, indices[i] + 1);
|
|
|
|
|
if (tmpnode == NULL)
|
2001-04-23 23:03:53 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_warning ("A node was inserted with a parent that's not in the tree.\n" \
|
|
|
|
|
"This possibly means that a GtkTreeModel inserted a child node\n" \
|
|
|
|
|
"before the parent was inserted.");
|
|
|
|
|
goto done;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
else if (!GTK_RBNODE_FLAG_SET (tmpnode, GTK_RBNODE_IS_PARENT))
|
2001-04-23 23:03:53 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* FIXME enforce correct behavior on model, probably */
|
|
|
|
|
/* In theory, the model should have emitted has_child_toggled here. We
|
|
|
|
|
* try to catch it anyway, just to be safe, in case the model hasn't.
|
|
|
|
|
*/
|
|
|
|
|
GtkTreePath *tmppath = _gtk_tree_view_find_path (tree_view,
|
|
|
|
|
tree,
|
|
|
|
|
tmpnode);
|
|
|
|
|
gtk_tree_view_has_child_toggled (model, tmppath, NULL, data);
|
|
|
|
|
gtk_tree_path_free (tmppath);
|
|
|
|
|
goto done;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
tmptree = tmpnode->children;
|
|
|
|
|
tree = tmptree;
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree == NULL)
|
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
|
|
/* ref the node */
|
|
|
|
|
gtk_tree_model_ref_node (tree_view->priv->model, iter);
|
|
|
|
|
max_height = gtk_tree_view_insert_iter_height (tree_view,
|
|
|
|
|
tree,
|
|
|
|
|
iter,
|
|
|
|
|
depth);
|
|
|
|
|
if (indices[depth - 1] == 0)
|
|
|
|
|
{
|
|
|
|
|
tmpnode = _gtk_rbtree_find_count (tree, 1);
|
|
|
|
|
_gtk_rbtree_insert_before (tree, tmpnode, max_height);
|
2001-04-12 16:11:54 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tmpnode = _gtk_rbtree_find_count (tree, indices[depth - 1]);
|
|
|
|
|
_gtk_rbtree_insert_after (tree, tmpnode, max_height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
if (free_path)
|
|
|
|
|
gtk_tree_path_free (path);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_has_child_toggled (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gpointer data)
|
2001-04-23 23:03:53 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeView *tree_view = (GtkTreeView *)data;
|
|
|
|
|
GtkTreeIter real_iter;
|
|
|
|
|
gboolean has_child;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
gboolean free_path = FALSE;
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (path != NULL || iter != NULL);
|
2001-04-23 23:03:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (iter)
|
|
|
|
|
real_iter = *iter;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path == NULL)
|
2001-04-12 16:11:54 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
path = gtk_tree_model_get_path (model, iter);
|
|
|
|
|
free_path = TRUE;
|
|
|
|
|
}
|
|
|
|
|
else if (iter == NULL)
|
|
|
|
|
gtk_tree_model_get_iter (model, &real_iter, path);
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (_gtk_tree_view_find_node (tree_view,
|
|
|
|
|
path,
|
|
|
|
|
&tree,
|
|
|
|
|
&node))
|
|
|
|
|
/* We aren't actually showing the node */
|
|
|
|
|
goto done;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
goto done;
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
has_child = gtk_tree_model_iter_has_child (model, &real_iter);
|
|
|
|
|
/* Sanity check.
|
|
|
|
|
*/
|
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT) == has_child)
|
|
|
|
|
goto done;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (has_child)
|
|
|
|
|
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PARENT);
|
|
|
|
|
else
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_PARENT);
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (has_child && GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IS_LIST))
|
|
|
|
|
{
|
|
|
|
|
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_IS_LIST);
|
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_SHOW_EXPANDERS))
|
|
|
|
|
{
|
|
|
|
|
GList *list;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
if (GTK_TREE_VIEW_COLUMN (list->data)->visible)
|
|
|
|
|
{
|
|
|
|
|
GTK_TREE_VIEW_COLUMN (list->data)->dirty = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* FIXME: Just redraw the node */
|
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
done:
|
|
|
|
|
if (free_path)
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
}
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-06-26 17:01:53 +00:00
|
|
|
|
static void
|
|
|
|
|
count_children_helper (GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
gpointer data)
|
|
|
|
|
{
|
|
|
|
|
if (node->children)
|
|
|
|
|
_gtk_rbtree_traverse (node->children, node->children->root, G_POST_ORDER, count_children_helper, data);
|
2001-06-27 23:44:53 +00:00
|
|
|
|
(*((gint *)data))++;
|
2001-06-26 17:01:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_deleted (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
gpointer data)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = (GtkTreeView *)data;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
GList *list;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (path != NULL);
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (_gtk_tree_view_find_node (tree_view, path, &tree, &node))
|
|
|
|
|
return;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
return;
|
2001-04-12 16:11:54 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_row_reference_deleted (G_OBJECT (data), path);
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
/* Change the selection */
|
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
|
|
|
|
|
g_signal_emit_by_name (G_OBJECT (tree_view->priv->selection), "changed");
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
if (((GtkTreeViewColumn *)list->data)->visible &&
|
|
|
|
|
((GtkTreeViewColumn *)list->data)->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
|
|
|
|
|
((GtkTreeViewColumn *)list->data)->dirty = TRUE;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Ensure we don't have a dangling pointer to a dead node */
|
|
|
|
|
ensure_unprelighted (tree_view);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
/* If we have a node expanded/collapsed timeout, remove it */
|
|
|
|
|
if (tree_view->priv->expand_collapse_timeout != 0)
|
|
|
|
|
{
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->expand_collapse_timeout);
|
|
|
|
|
tree_view->priv->expand_collapse_timeout = 0;
|
|
|
|
|
|
|
|
|
|
/* Reset node */
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED);
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED);
|
|
|
|
|
tree_view->priv->expanded_collapsed_node = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-26 17:01:53 +00:00
|
|
|
|
if (tree_view->priv->destroy_count_func)
|
|
|
|
|
{
|
|
|
|
|
gint child_count = 0;
|
|
|
|
|
if (node->children)
|
|
|
|
|
_gtk_rbtree_traverse (node->children, node->children->root, G_POST_ORDER, count_children_helper, &child_count);
|
|
|
|
|
(* tree_view->priv->destroy_count_func) (tree_view, path, child_count, tree_view->priv->destroy_count_data);
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree->root->count == 1)
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->tree == tree)
|
|
|
|
|
tree_view->priv->tree = NULL;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_rbtree_remove (tree);
|
2001-01-21 18:45:20 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_rbtree_remove_node (tree, node);
|
2001-01-21 18:45:20 +00:00
|
|
|
|
}
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_update_size (GTK_TREE_VIEW (data));
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2000-10-05 01:04:57 +00:00
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_reordered (GtkTreeModel *model,
|
|
|
|
|
GtkTreePath *parent,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint *new_order,
|
|
|
|
|
gpointer data)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeView *tree_view = GTK_TREE_VIEW (data);
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
gint len;
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
len = gtk_tree_model_iter_n_children (model, iter);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (len < 2)
|
2000-10-17 23:06:56 +00:00
|
|
|
|
return;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_row_reference_reordered (G_OBJECT (data),
|
|
|
|
|
parent,
|
|
|
|
|
iter,
|
|
|
|
|
new_order);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (_gtk_tree_view_find_node (tree_view,
|
|
|
|
|
parent,
|
|
|
|
|
&tree,
|
|
|
|
|
&node))
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* We need to special case the parent path */
|
|
|
|
|
if (tree == NULL)
|
|
|
|
|
tree = tree_view->priv->tree;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
else
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree = node->children;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
return;
|
2001-02-23 23:00:52 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* FIXME: we need to unprelight our tree, if it's prelit. */
|
|
|
|
|
_gtk_rbtree_reorder (tree, new_order, len);
|
2001-02-23 23:00:52 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
2001-02-23 23:00:52 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Internal tree functions
|
|
|
|
|
*/
|
2001-02-23 23:00:52 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_get_background_xrange (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeViewColumn *column,
|
|
|
|
|
gint *x1,
|
|
|
|
|
gint *x2)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewColumn *tmp_column = NULL;
|
|
|
|
|
gint total_width;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
GList *list;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x1)
|
|
|
|
|
*x1 = 0;
|
2001-04-26 23:17:36 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x2)
|
|
|
|
|
*x2 = 0;
|
2001-02-23 23:00:52 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
total_width = 0;
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tmp_column = list->data;
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_column == column)
|
|
|
|
|
break;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_column->visible)
|
|
|
|
|
total_width += tmp_column->width;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_column != column)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_warning (G_STRLOC": passed-in column isn't in the tree");
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x1)
|
|
|
|
|
*x1 = total_width;
|
2001-02-23 23:00:52 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x2)
|
|
|
|
|
{
|
|
|
|
|
if (column->visible)
|
|
|
|
|
*x2 = total_width + column->width;
|
|
|
|
|
else
|
|
|
|
|
*x2 = total_width; /* width of 0 */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_get_cell_xrange (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeViewColumn *column,
|
|
|
|
|
gint *x1,
|
|
|
|
|
gint *x2)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *tmp_column = NULL;
|
|
|
|
|
gint total_width;
|
|
|
|
|
GList *list;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x1)
|
|
|
|
|
*x1 = 0;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x2)
|
|
|
|
|
*x2 = 0;
|
|
|
|
|
|
|
|
|
|
total_width = 0;
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tmp_column = list->data;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_column == column)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (tmp_column->visible)
|
|
|
|
|
total_width += tmp_column->width;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_column != column)
|
|
|
|
|
{
|
|
|
|
|
g_warning (G_STRLOC": passed-in column isn't in the tree");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Remember we're getting the cell range, i.e. the cell_area passed
|
|
|
|
|
* to the cell renderer.
|
|
|
|
|
*/
|
2000-10-16 03:18:49 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, column))
|
2001-04-28 00:29:34 +00:00
|
|
|
|
total_width += tree_view->priv->tab_offset * _gtk_rbtree_get_depth (tree);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x1)
|
|
|
|
|
*x1 = total_width;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x2)
|
|
|
|
|
{
|
|
|
|
|
if (column->visible)
|
|
|
|
|
*x2 = total_width + column->displayed_width;
|
|
|
|
|
else
|
|
|
|
|
*x2 = total_width; /* width of 0 */
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_get_arrow_xrange (GtkTreeView *tree_view,
|
|
|
|
|
gint *x1,
|
|
|
|
|
gint *x2)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint x_offset = 0;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeViewColumn *tmp_column = NULL;
|
|
|
|
|
gint total_width;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
total_width = 0;
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
tmp_column = list->data;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, tmp_column))
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
x_offset = total_width;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_column->visible)
|
|
|
|
|
total_width += tmp_column->width;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (x1)
|
|
|
|
|
*x1 = x_offset;
|
|
|
|
|
|
|
|
|
|
if (tmp_column && tmp_column->visible)
|
|
|
|
|
{
|
|
|
|
|
/* +1 because x2 isn't included in the range. */
|
|
|
|
|
if (x2)
|
|
|
|
|
*x2 = x_offset + tree_view->priv->tab_offset + 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* return an empty range, the expander column is hidden */
|
|
|
|
|
if (x2)
|
|
|
|
|
*x2 = x_offset;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gint
|
|
|
|
|
gtk_tree_view_insert_iter_height (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
GList *list;
|
|
|
|
|
gint max_height = 0;
|
|
|
|
|
gint vertical_separator;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
|
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (tree_view), "vertical_separator", &vertical_separator, NULL);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* do stuff with node */
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
gint height = 0, width = 0;
|
|
|
|
|
column = list->data;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
|
2001-06-29 03:11:01 +00:00
|
|
|
|
continue;
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-08-19 04:19:56 +00:00
|
|
|
|
gtk_tree_view_column_cell_set_cell_data (column, tree_view->priv->model, iter,
|
|
|
|
|
gtk_tree_model_iter_has_child (tree_view->priv->model, iter),
|
|
|
|
|
FALSE);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_get_size (column, NULL, NULL, NULL, &width, &height);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
max_height = MAX (max_height, vertical_separator + height);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, column) &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_DRAW_EXPANDERS (tree_view))
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (column,
|
2001-04-28 00:29:34 +00:00
|
|
|
|
MAX (column->width, depth * tree_view->priv->tab_offset + width));
|
|
|
|
|
else
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (column,
|
2001-04-28 00:29:34 +00:00
|
|
|
|
MAX (column->width, width));
|
|
|
|
|
}
|
|
|
|
|
return max_height;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_build_tree (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth,
|
|
|
|
|
gboolean recurse,
|
|
|
|
|
gboolean calc_bounds)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBNode *temp = NULL;
|
|
|
|
|
gint max_height;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
max_height = 0;
|
|
|
|
|
if (calc_bounds)
|
|
|
|
|
max_height = gtk_tree_view_insert_iter_height (tree_view,
|
|
|
|
|
tree,
|
|
|
|
|
iter,
|
|
|
|
|
depth);
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_model_ref_node (tree_view->priv->model, iter);
|
|
|
|
|
temp = _gtk_rbtree_insert_after (tree, temp, max_height);
|
|
|
|
|
if (recurse)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeIter child;
|
|
|
|
|
|
|
|
|
|
if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter))
|
|
|
|
|
{
|
|
|
|
|
temp->children = _gtk_rbtree_new ();
|
|
|
|
|
temp->children->parent_tree = tree;
|
|
|
|
|
temp->children->parent_node = temp;
|
|
|
|
|
gtk_tree_view_build_tree (tree_view, temp->children, &child, depth + 1, recurse, calc_bounds);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (gtk_tree_model_iter_has_child (tree_view->priv->model, iter))
|
|
|
|
|
{
|
|
|
|
|
if ((temp->flags>K_RBNODE_IS_PARENT) != GTK_RBNODE_IS_PARENT)
|
|
|
|
|
temp->flags ^= GTK_RBNODE_IS_PARENT;
|
|
|
|
|
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_IS_LIST);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
while (gtk_tree_model_iter_next (tree_view->priv->model, iter));
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_calc_size (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBNode *temp;
|
|
|
|
|
GtkTreeIter child;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
gint max_height;
|
|
|
|
|
gint vertical_separator;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_INTERNAL_ASSERT_VOID (tree != NULL);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (tree_view), "vertical_separator", &vertical_separator, NULL);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
temp = tree->root;
|
|
|
|
|
while (temp->left != tree->nil)
|
|
|
|
|
temp = temp->left;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
do
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
max_height = 0;
|
|
|
|
|
/* Do stuff with node */
|
2001-06-29 03:11:01 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
gint height = 0, width = 0;
|
|
|
|
|
column = list->data;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-08-19 04:19:56 +00:00
|
|
|
|
gtk_tree_view_column_cell_set_cell_data (column, tree_view->priv->model, iter,
|
|
|
|
|
GTK_RBNODE_FLAG_SET (temp, GTK_RBNODE_IS_PARENT),
|
|
|
|
|
temp->children?TRUE:FALSE);
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_get_size (column, NULL, NULL, NULL, &width, &height);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
max_height = MAX (max_height, vertical_separator + height);
|
|
|
|
|
|
|
|
|
|
/* FIXME: I'm getting the width of all nodes here. )-: */
|
|
|
|
|
if (column->dirty == FALSE)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, column) &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_DRAW_EXPANDERS (tree_view))
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (column,
|
2001-04-28 00:29:34 +00:00
|
|
|
|
MAX (column->width, depth * tree_view->priv->tab_offset + width));
|
|
|
|
|
else
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (column, MAX (column->width, width));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_gtk_rbtree_node_set_height (tree, temp, max_height);
|
|
|
|
|
|
|
|
|
|
if (temp->children != NULL &&
|
|
|
|
|
gtk_tree_model_iter_children (tree_view->priv->model, &child, iter))
|
|
|
|
|
gtk_tree_view_calc_size (tree_view, temp->children, &child, depth + 1);
|
|
|
|
|
temp = _gtk_rbtree_next (tree, temp);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (gtk_tree_model_iter_next (tree_view->priv->model, iter));
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth,
|
2001-08-19 04:19:56 +00:00
|
|
|
|
gint *height,
|
|
|
|
|
GtkRBNode *node)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
GList *list;
|
|
|
|
|
gboolean retval = FALSE;
|
|
|
|
|
gint tmpheight;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (height)
|
|
|
|
|
*height = 0;
|
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint width;
|
|
|
|
|
column = list->data;
|
|
|
|
|
if (column->dirty == TRUE || column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
|
|
|
|
|
continue;
|
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
2001-08-19 04:19:56 +00:00
|
|
|
|
|
|
|
|
|
gtk_tree_view_column_cell_set_cell_data (column, tree_view->priv->model, iter,
|
|
|
|
|
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
|
|
|
|
|
node->children?TRUE:FALSE);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
if (height)
|
|
|
|
|
{
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_get_size (column,
|
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
|
&width, &tmpheight);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*height = MAX (*height, tmpheight);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2001-05-25 23:10:49 +00:00
|
|
|
|
gtk_tree_view_column_cell_get_size (column,
|
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
|
&width, NULL);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, column) &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_DRAW_EXPANDERS (tree_view))
|
|
|
|
|
{
|
|
|
|
|
if (depth * tree_view->priv->tab_offset + width > column->width)
|
|
|
|
|
{
|
|
|
|
|
column->dirty = TRUE;
|
|
|
|
|
retval = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (width > column->width)
|
|
|
|
|
{
|
|
|
|
|
column->dirty = TRUE;
|
|
|
|
|
retval = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return retval;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_discover_dirty (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint depth)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBNode *temp = tree->root;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
GtkTreeViewColumn *column;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeIter child;
|
|
|
|
|
gboolean is_all_dirty;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_INTERNAL_ASSERT_VOID (tree != NULL);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (temp->left != tree->nil)
|
|
|
|
|
temp = temp->left;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
do
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-06-07 00:07:32 +00:00
|
|
|
|
TREE_VIEW_INTERNAL_ASSERT_VOID (temp != NULL);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
is_all_dirty = TRUE;
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
column = list->data;
|
|
|
|
|
if (column->dirty == FALSE)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
is_all_dirty = FALSE;
|
|
|
|
|
break;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (is_all_dirty)
|
|
|
|
|
return;
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_discover_dirty_iter (tree_view,
|
|
|
|
|
iter,
|
|
|
|
|
depth,
|
2001-08-19 04:19:56 +00:00
|
|
|
|
FALSE,
|
|
|
|
|
temp);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter) &&
|
|
|
|
|
temp->children != NULL)
|
|
|
|
|
gtk_tree_view_discover_dirty (tree_view, temp->children, &child, depth + 1);
|
|
|
|
|
temp = _gtk_rbtree_next (tree, temp);
|
|
|
|
|
}
|
|
|
|
|
while (gtk_tree_model_iter_next (tree_view->priv->model, iter));
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_check_dirty (GtkTreeView *tree_view)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreePath *path;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
gboolean dirty = FALSE;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeViewColumn *column;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeIter iter;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column->dirty)
|
|
|
|
|
{
|
|
|
|
|
dirty = TRUE;
|
|
|
|
|
if (column->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
|
|
|
|
|
{
|
|
|
|
|
gint w = 1;
|
|
|
|
|
|
|
|
|
|
if (column->button)
|
|
|
|
|
w = MAX (w, column->button->requisition.width);
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_width (column, w);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (dirty == FALSE)
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->model == NULL)
|
|
|
|
|
return;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
path = gtk_tree_path_new_root ();
|
|
|
|
|
if (gtk_tree_model_get_iter (tree_view->priv->model, &iter, path))
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_calc_size (tree_view, tree_view->priv->tree, &iter, 1);
|
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (path);
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
|
|
|
|
column->dirty = FALSE;
|
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Make sure the node is visible vertically */
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint offset;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
/* We process updates because we want to clear old selected items when we scroll.
|
|
|
|
|
* if this is removed, we get a "selection streak" at the bottom. */
|
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
|
|
|
|
gdk_window_process_updates (tree_view->priv->bin_window, TRUE);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
offset = _gtk_rbtree_node_find_offset (tree, node);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* we reverse the order, b/c in the unusual case of the
|
|
|
|
|
* node's height being taller then the visible area, we'd rather
|
|
|
|
|
* have the node flush to the top
|
|
|
|
|
*/
|
|
|
|
|
if (offset + GTK_RBNODE_GET_HEIGHT (node) >
|
|
|
|
|
tree_view->priv->vadjustment->value + tree_view->priv->vadjustment->page_size)
|
|
|
|
|
gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment),
|
|
|
|
|
offset + GTK_RBNODE_GET_HEIGHT (node) -
|
|
|
|
|
tree_view->priv->vadjustment->page_size);
|
|
|
|
|
if (offset < tree_view->priv->vadjustment->value)
|
|
|
|
|
gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment),
|
|
|
|
|
offset);
|
2001-06-08 22:59:37 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2000-10-16 03:18:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* This function could be more efficient.
|
|
|
|
|
* I'll optimize it if profiling seems to imply that
|
|
|
|
|
* it's important
|
|
|
|
|
*/
|
|
|
|
|
GtkTreePath *
|
|
|
|
|
_gtk_tree_view_find_path (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node)
|
2000-10-16 03:18:49 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
GtkRBTree *tmp_tree;
|
|
|
|
|
GtkRBNode *tmp_node, *last;
|
|
|
|
|
gint count;
|
2001-03-13 02:00:37 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
path = gtk_tree_path_new ();
|
2001-03-05 19:43:24 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (node != NULL, path);
|
|
|
|
|
g_return_val_if_fail (node != tree->nil, path);
|
2000-10-16 03:18:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
count = 1 + node->left->count;
|
2001-03-05 19:43:24 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
last = node;
|
|
|
|
|
tmp_node = node->parent;
|
|
|
|
|
tmp_tree = tree;
|
|
|
|
|
while (tmp_tree)
|
2001-03-05 19:43:24 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (tmp_node != tmp_tree->nil)
|
2001-03-05 19:43:24 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_node->right == last)
|
|
|
|
|
count += 1 + tmp_node->left->count;
|
|
|
|
|
last = tmp_node;
|
|
|
|
|
tmp_node = tmp_node->parent;
|
|
|
|
|
}
|
|
|
|
|
gtk_tree_path_prepend_index (path, count - 1);
|
|
|
|
|
last = tmp_tree->parent_node;
|
|
|
|
|
tmp_tree = tmp_tree->parent_tree;
|
|
|
|
|
if (last)
|
|
|
|
|
{
|
|
|
|
|
count = 1 + last->left->count;
|
|
|
|
|
tmp_node = last->parent;
|
2001-03-05 19:43:24 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return path;
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
}
|
2000-10-16 03:18:49 +00:00
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
/* Returns TRUE if we ran out of tree before finding the path. If the path is
|
|
|
|
|
* invalid (ie. points to a node that's not in the tree), *tree and *node are
|
|
|
|
|
* both set to NULL.
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
_gtk_tree_view_find_node (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkRBTree **tree,
|
|
|
|
|
GtkRBNode **node)
|
2000-10-16 03:18:49 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBNode *tmpnode = NULL;
|
|
|
|
|
GtkRBTree *tmptree = tree_view->priv->tree;
|
|
|
|
|
gint *indices = gtk_tree_path_get_indices (path);
|
|
|
|
|
gint depth = gtk_tree_path_get_depth (path);
|
|
|
|
|
gint i = 0;
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*node = NULL;
|
|
|
|
|
*tree = NULL;
|
2001-03-05 19:43:24 +00:00
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
if (depth == 0 || tmptree == NULL)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
do
|
2001-03-05 19:43:24 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tmpnode = _gtk_rbtree_find_count (tmptree, indices[i] + 1);
|
|
|
|
|
++i;
|
2001-08-19 23:46:59 +00:00
|
|
|
|
if (tmpnode == NULL)
|
|
|
|
|
{
|
|
|
|
|
*tree = NULL;
|
|
|
|
|
*node = NULL;
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (i >= depth)
|
|
|
|
|
{
|
2001-08-19 23:46:59 +00:00
|
|
|
|
*tree = tmptree;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*node = tmpnode;
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2001-08-19 23:46:59 +00:00
|
|
|
|
*tree = tmptree;
|
|
|
|
|
*node = tmpnode;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tmptree = tmpnode->children;
|
2001-08-19 23:46:59 +00:00
|
|
|
|
if (tmptree == NULL)
|
|
|
|
|
return TRUE;
|
2001-03-05 19:43:24 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (1);
|
2000-10-16 03:18:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_is_expander_column (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column)
|
|
|
|
|
{
|
|
|
|
|
GList *list;
|
|
|
|
|
|
2001-06-30 02:38:17 +00:00
|
|
|
|
if (tree_view->priv->expander_column != NULL)
|
|
|
|
|
{
|
|
|
|
|
if (tree_view->priv->expander_column == column)
|
|
|
|
|
return TRUE;
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
if (((GtkTreeViewColumn *)list->data)->visible)
|
|
|
|
|
break;
|
|
|
|
|
if (list && list->data == column)
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2001-06-29 03:11:01 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_add_move_binding (GtkBindingSet *binding_set,
|
|
|
|
|
guint keyval,
|
|
|
|
|
guint modmask,
|
|
|
|
|
GtkMovementStep step,
|
|
|
|
|
gint count)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
"move_cursor", 2,
|
2001-06-01 22:57:30 +00:00
|
|
|
|
GTK_TYPE_ENUM, step,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
GTK_TYPE_INT, count);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_binding_entry_add_signal (binding_set, keyval, GDK_SHIFT_MASK,
|
|
|
|
|
"move_cursor", 2,
|
2001-06-01 22:57:30 +00:00
|
|
|
|
GTK_TYPE_ENUM, step,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
GTK_TYPE_INT, count);
|
|
|
|
|
|
|
|
|
|
if ((modmask & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
|
|
|
|
"move_cursor", 2,
|
|
|
|
|
GTK_TYPE_ENUM, step,
|
|
|
|
|
GTK_TYPE_INT, count);
|
|
|
|
|
|
|
|
|
|
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK,
|
|
|
|
|
"move_cursor", 2,
|
|
|
|
|
GTK_TYPE_ENUM, step,
|
|
|
|
|
GTK_TYPE_INT, count);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
static gint
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_unref_tree_helper (GtkTreeModel *model,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node)
|
2001-03-02 00:49:32 +00:00
|
|
|
|
{
|
2001-06-18 23:44:41 +00:00
|
|
|
|
gint retval = FALSE;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
do
|
|
|
|
|
{
|
2001-06-18 23:44:41 +00:00
|
|
|
|
g_return_val_if_fail (node != NULL, FALSE);
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node->children)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeIter child;
|
|
|
|
|
GtkRBTree *new_tree;
|
|
|
|
|
GtkRBNode *new_node;
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
new_tree = node->children;
|
|
|
|
|
new_node = new_tree->root;
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (new_node && new_node->left != new_tree->nil)
|
|
|
|
|
new_node = new_node->left;
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
g_return_val_if_fail (gtk_tree_model_iter_children (model, &child, iter), FALSE);
|
|
|
|
|
retval = retval || gtk_tree_view_unref_tree_helper (model, &child, new_tree, new_node);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
|
|
|
|
|
retval = TRUE;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_model_unref_node (model, iter);
|
|
|
|
|
node = _gtk_rbtree_next (tree, node);
|
2001-03-02 00:49:32 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (gtk_tree_model_iter_next (model, iter));
|
2001-06-18 23:44:41 +00:00
|
|
|
|
|
|
|
|
|
return retval;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
static gint
|
|
|
|
|
gtk_tree_view_unref_and_check_selection_tree (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
GtkRBNode *node;
|
2001-06-18 23:44:41 +00:00
|
|
|
|
gint retval;
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
node = tree->root;
|
|
|
|
|
while (node && node->left != tree->nil)
|
|
|
|
|
node = node->left;
|
2001-03-02 00:49:32 +00:00
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
g_return_val_if_fail (node != NULL, FALSE);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
path = _gtk_tree_view_find_path (tree_view, tree, node);
|
|
|
|
|
gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_view->priv->model),
|
|
|
|
|
&iter, path);
|
2001-06-18 23:44:41 +00:00
|
|
|
|
retval = gtk_tree_view_unref_tree_helper (GTK_TREE_MODEL (tree_view->priv->model), &iter, tree, node);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_free (path);
|
2001-06-18 23:44:41 +00:00
|
|
|
|
|
|
|
|
|
return retval;
|
2001-03-02 00:49:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_set_column_drag_info (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewColumn *left_column;
|
2001-05-25 23:10:49 +00:00
|
|
|
|
GtkTreeViewColumn *cur_column = NULL;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewColumnReorder *reorder;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GList *tmp_list;
|
|
|
|
|
gint left;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* We want to precalculate the motion list such that we know what column slots
|
|
|
|
|
* are available.
|
|
|
|
|
*/
|
|
|
|
|
left_column = NULL;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* First, identify all possible drop spots */
|
|
|
|
|
tmp_list = tree_view->priv->columns;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (tmp_list)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_assert (tmp_list);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
cur_column = GTK_TREE_VIEW_COLUMN (tmp_list->data);
|
|
|
|
|
tmp_list = tmp_list->next;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (cur_column->visible == FALSE)
|
|
|
|
|
continue;
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
/* If it's not the column moving and func tells us to skip over the column, we continue. */
|
|
|
|
|
if (left_column != column && cur_column != column &&
|
|
|
|
|
tree_view->priv->column_drop_func &&
|
|
|
|
|
! (* tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
|
2001-05-09 22:23:12 +00:00
|
|
|
|
{
|
|
|
|
|
left_column = cur_column;
|
|
|
|
|
continue;
|
2001-06-07 00:07:32 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
reorder = g_new (GtkTreeViewColumnReorder, 1);
|
|
|
|
|
reorder->left_column = left_column;
|
|
|
|
|
left_column = reorder->right_column = cur_column;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->column_drag_info = g_list_append (tree_view->priv->column_drag_info, reorder);
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Add the last one */
|
2001-05-16 00:23:30 +00:00
|
|
|
|
if (tree_view->priv->column_drop_func == NULL ||
|
|
|
|
|
((left_column != column) &&
|
|
|
|
|
(* tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data)))
|
|
|
|
|
{
|
|
|
|
|
reorder = g_new (GtkTreeViewColumnReorder, 1);
|
|
|
|
|
reorder->left_column = left_column;
|
|
|
|
|
reorder->right_column = NULL;
|
|
|
|
|
tree_view->priv->column_drag_info = g_list_append (tree_view->priv->column_drag_info, reorder);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We quickly check to see if it even makes sense to reorder columns. */
|
|
|
|
|
/* If there is nothing that can be moved, then we return */
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->column_drag_info == NULL)
|
|
|
|
|
return;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
/* We know there are always 2 slots possbile, as you can always return column. */
|
|
|
|
|
/* If that's all there is, return */
|
|
|
|
|
if (tree_view->priv->column_drag_info->next->next == NULL &&
|
|
|
|
|
((GtkTreeViewColumnReorder *)tree_view->priv->column_drag_info->data)->right_column == column &&
|
|
|
|
|
((GtkTreeViewColumnReorder *)tree_view->priv->column_drag_info->next->data)->left_column == column)
|
|
|
|
|
{
|
|
|
|
|
for (tmp_list = tree_view->priv->column_drag_info; tmp_list; tmp_list = tmp_list->next)
|
|
|
|
|
g_free (tmp_list->data);
|
|
|
|
|
g_list_free (tree_view->priv->column_drag_info);
|
|
|
|
|
tree_view->priv->column_drag_info = NULL;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
/* We fill in the ranges for the columns, now that we've isolated them */
|
2001-04-28 00:29:34 +00:00
|
|
|
|
left = - TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER (tree_view);
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (tmp_list = tree_view->priv->column_drag_info; tmp_list; tmp_list = tmp_list->next)
|
|
|
|
|
{
|
|
|
|
|
reorder = (GtkTreeViewColumnReorder *) tmp_list->data;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
reorder->left_align = left;
|
|
|
|
|
if (tmp_list->next != NULL)
|
|
|
|
|
{
|
|
|
|
|
g_assert (tmp_list->next->data);
|
|
|
|
|
left = reorder->right_align = (reorder->right_column->button->allocation.x +
|
|
|
|
|
reorder->right_column->button->allocation.width +
|
|
|
|
|
((GtkTreeViewColumnReorder *)tmp_list->next->data)->left_column->button->allocation.x)/2;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gint width;
|
|
|
|
|
|
|
|
|
|
gdk_window_get_size (tree_view->priv->header_window, &width, NULL);
|
|
|
|
|
reorder->right_align = width + TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER (tree_view);
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_column_start_drag (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GdkEvent send_event;
|
|
|
|
|
GtkAllocation allocation;
|
|
|
|
|
gint x, y, width, height;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (tree_view->priv->column_drag_info == NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_set_column_drag_info (tree_view, column);
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->column_drag_info == NULL)
|
|
|
|
|
return;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->drag_window == NULL)
|
2001-01-21 18:45:20 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GdkWindowAttr attributes;
|
|
|
|
|
guint attributes_mask;
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
attributes.window_type = GDK_WINDOW_CHILD;
|
|
|
|
|
attributes.wclass = GDK_INPUT_OUTPUT;
|
|
|
|
|
attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view));
|
|
|
|
|
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK;
|
|
|
|
|
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
|
2001-01-21 18:45:20 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->drag_window = gdk_window_new (tree_view->priv->bin_window,
|
|
|
|
|
&attributes,
|
|
|
|
|
attributes_mask);
|
|
|
|
|
gdk_window_set_user_data (tree_view->priv->drag_window, GTK_WIDGET (tree_view));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_pointer_ungrab (GDK_CURRENT_TIME);
|
|
|
|
|
gdk_keyboard_ungrab (GDK_CURRENT_TIME);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_grab_remove (column->button);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
send_event.crossing.type = GDK_LEAVE_NOTIFY;
|
|
|
|
|
send_event.crossing.send_event = TRUE;
|
|
|
|
|
send_event.crossing.window = column->button->window;
|
|
|
|
|
send_event.crossing.subwindow = NULL;
|
|
|
|
|
send_event.crossing.detail = GDK_NOTIFY_ANCESTOR;
|
|
|
|
|
send_event.crossing.time = GDK_CURRENT_TIME;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_propagate_event (column->button, &send_event);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
send_event.button.type = GDK_BUTTON_RELEASE;
|
|
|
|
|
send_event.button.window = GDK_ROOT_PARENT ();
|
|
|
|
|
send_event.button.send_event = TRUE;
|
|
|
|
|
send_event.button.time = GDK_CURRENT_TIME;
|
|
|
|
|
send_event.button.x = -1;
|
|
|
|
|
send_event.button.y = -1;
|
|
|
|
|
send_event.button.axes = NULL;
|
|
|
|
|
send_event.button.state = 0;
|
|
|
|
|
send_event.button.button = 1;
|
|
|
|
|
send_event.button.device = gdk_core_pointer;
|
|
|
|
|
send_event.button.x_root = 0;
|
|
|
|
|
send_event.button.y_root = 0;
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_propagate_event (column->button, &send_event);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_move_resize (tree_view->priv->drag_window,
|
|
|
|
|
column->button->allocation.x,
|
|
|
|
|
column->button->allocation.y + column->button->allocation.height,
|
|
|
|
|
column->button->allocation.width,
|
|
|
|
|
column->button->allocation.height);
|
|
|
|
|
gdk_window_reparent (column->button->window, tree_view->priv->drag_window, 0, 0);
|
|
|
|
|
tree_view->priv->drag_column_x = column->button->allocation.x;
|
|
|
|
|
allocation = column->button->allocation;
|
|
|
|
|
allocation.x = 0;
|
|
|
|
|
gtk_widget_size_allocate (column->button, &allocation);
|
|
|
|
|
gtk_widget_set_parent_window (column->button, tree_view->priv->drag_window);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->drag_column = column;
|
|
|
|
|
gdk_window_show (tree_view->priv->drag_window);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_get_origin (tree_view->priv->header_window, &x, &y);
|
|
|
|
|
gdk_window_get_size (tree_view->priv->header_window, &width, &height);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (gtk_events_pending ())
|
|
|
|
|
gtk_main_iteration ();
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG);
|
|
|
|
|
gdk_pointer_grab (tree_view->priv->drag_window,
|
|
|
|
|
FALSE,
|
|
|
|
|
GDK_POINTER_MOTION_MASK|GDK_BUTTON_RELEASE_MASK,
|
|
|
|
|
NULL, NULL, GDK_CURRENT_TIME);
|
2001-05-09 22:23:12 +00:00
|
|
|
|
gdk_keyboard_grab (tree_view->priv->drag_window,
|
|
|
|
|
FALSE,
|
|
|
|
|
GDK_CURRENT_TIME);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_queue_draw_arrow (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
GdkRectangle *clip_rect)
|
|
|
|
|
{
|
|
|
|
|
GdkRectangle rect;
|
|
|
|
|
|
|
|
|
|
if (!GTK_WIDGET_REALIZED (tree_view))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
rect.x = 0;
|
|
|
|
|
rect.width = MAX (tree_view->priv->tab_offset, GTK_WIDGET (tree_view)->allocation.width);
|
|
|
|
|
|
|
|
|
|
rect.y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
|
|
|
|
|
rect.height = BACKGROUND_HEIGHT (node);
|
|
|
|
|
|
|
|
|
|
if (clip_rect)
|
|
|
|
|
{
|
|
|
|
|
GdkRectangle new_rect;
|
|
|
|
|
|
|
|
|
|
gdk_rectangle_intersect (clip_rect, &rect, &new_rect);
|
|
|
|
|
|
|
|
|
|
gdk_window_invalidate_rect (tree_view->priv->bin_window, &new_rect, TRUE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gdk_window_invalidate_rect (tree_view->priv->bin_window, &rect, TRUE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_queue_draw_node (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
GdkRectangle *clip_rect)
|
|
|
|
|
{
|
|
|
|
|
GdkRectangle rect;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!GTK_WIDGET_REALIZED (tree_view))
|
|
|
|
|
return;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
rect.x = 0;
|
2001-06-08 22:59:37 +00:00
|
|
|
|
rect.width = MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
rect.y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
|
|
|
|
|
rect.height = BACKGROUND_HEIGHT (node);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (clip_rect)
|
|
|
|
|
{
|
|
|
|
|
GdkRectangle new_rect;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_rectangle_intersect (clip_rect, &rect, &new_rect);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_invalidate_rect (tree_view->priv->bin_window, &new_rect, TRUE);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_invalidate_rect (tree_view->priv->bin_window, &rect, TRUE);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_queue_draw_path (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GdkRectangle *clip_rect)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *tree = NULL;
|
|
|
|
|
GtkRBNode *node = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree)
|
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view, tree, node, clip_rect);
|
2000-10-26 00:36:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* x and y are the mouse position
|
|
|
|
|
*/
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GdkRectangle area;
|
|
|
|
|
GtkStateType state;
|
|
|
|
|
GtkWidget *widget;
|
|
|
|
|
gint x_offset = 0;
|
|
|
|
|
gint vertical_separator;
|
2001-07-22 20:09:00 +00:00
|
|
|
|
gint expander_size;
|
|
|
|
|
GtkExpanderStyle expander_style;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (tree_view),
|
|
|
|
|
"vertical_separator", &vertical_separator,
|
2001-07-22 20:09:00 +00:00
|
|
|
|
"expander_size", &expander_size,
|
2001-04-28 00:29:34 +00:00
|
|
|
|
NULL);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (! GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT))
|
|
|
|
|
return;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
widget = GTK_WIDGET (tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_arrow_xrange (tree_view, &x_offset, NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
area.x = x_offset;
|
|
|
|
|
area.y = CELL_FIRST_PIXEL (tree_view, tree, node, vertical_separator);
|
2001-07-22 20:09:00 +00:00
|
|
|
|
area.width = expander_size + 2;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
area.height = CELL_HEIGHT (node, vertical_separator);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node == tree_view->priv->button_pressed_node)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x >= area.x && x <= (area.x + area.width) &&
|
|
|
|
|
y >= area.y && y <= (area.y + area.height))
|
|
|
|
|
state = GTK_STATE_ACTIVE;
|
|
|
|
|
else
|
|
|
|
|
state = GTK_STATE_NORMAL;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
else
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node == tree_view->priv->prelight_node &&
|
|
|
|
|
GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT))
|
|
|
|
|
state = GTK_STATE_PRELIGHT;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
else
|
2001-04-28 00:29:34 +00:00
|
|
|
|
state = GTK_STATE_NORMAL;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SEMI_EXPANDED))
|
|
|
|
|
expander_style = GTK_EXPANDER_SEMI_EXPANDED;
|
|
|
|
|
else if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SEMI_COLLAPSED))
|
|
|
|
|
expander_style = GTK_EXPANDER_SEMI_COLLAPSED;
|
|
|
|
|
else if (node->children != NULL)
|
|
|
|
|
expander_style = GTK_EXPANDER_EXPANDED;
|
|
|
|
|
else
|
|
|
|
|
expander_style = GTK_EXPANDER_COLLAPSED;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_paint_expander (widget->style,
|
|
|
|
|
tree_view->priv->bin_window,
|
|
|
|
|
state,
|
|
|
|
|
&area,
|
|
|
|
|
widget,
|
|
|
|
|
"treeview",
|
2001-07-22 20:09:00 +00:00
|
|
|
|
area.x + area.width / 2,
|
|
|
|
|
area.y + area.height / 2,
|
|
|
|
|
expander_style);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
static void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_update_col_width (GtkTreeView *tree_view)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GList *list, *last_column;
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
gint width = 0;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (last_column = g_list_last (tree_view->priv->columns);
|
|
|
|
|
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)
|
|
|
|
|
;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (last_column == NULL)
|
|
|
|
|
return;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list != last_column; list = list->next)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
column = GTK_TREE_VIEW_COLUMN (list->data);
|
|
|
|
|
if (! column->visible)
|
|
|
|
|
continue;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
width += column->width;
|
|
|
|
|
column->displayed_width = (CLAMP (column->width, (column->min_width!=-1)?column->min_width:column->width, (column->max_width!=-1)?column->max_width:column->width));
|
|
|
|
|
}
|
|
|
|
|
column = GTK_TREE_VIEW_COLUMN (last_column->data);
|
|
|
|
|
column->displayed_width = MAX (GTK_WIDGET (tree_view)->allocation.width, tree_view->priv->width) - width;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-06-01 22:57:30 +00:00
|
|
|
|
static void
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_focus_to_cursor (GtkTreeView *tree_view)
|
2001-06-01 22:57:30 +00:00
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *cursor_path;
|
|
|
|
|
|
|
|
|
|
if ((tree_view->priv->tree == NULL) ||
|
|
|
|
|
(! GTK_WIDGET_REALIZED (tree_view)))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS);
|
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
|
|
|
|
|
|
|
|
|
cursor_path = NULL;
|
|
|
|
|
if (tree_view->priv->cursor)
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
if (cursor_path == NULL)
|
|
|
|
|
{
|
2001-08-22 22:27:41 +00:00
|
|
|
|
cursor_path = gtk_tree_path_new_root ();
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
|
2001-08-22 22:27:41 +00:00
|
|
|
|
if (tree_view->priv->selection->type == GTK_TREE_SELECTION_SINGLE)
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, cursor_path, TRUE);
|
|
|
|
|
else
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, cursor_path, FALSE);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
}
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gint count)
|
2001-06-01 22:57:30 +00:00
|
|
|
|
{
|
|
|
|
|
GtkRBTree *cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *cursor_node = NULL;
|
2001-06-05 15:30:53 +00:00
|
|
|
|
GtkRBTree *new_cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *new_cursor_node = NULL;
|
2001-06-01 22:57:30 +00:00
|
|
|
|
GtkTreePath *cursor_path = NULL;
|
|
|
|
|
|
|
|
|
|
cursor_path = NULL;
|
2001-06-20 23:21:46 +00:00
|
|
|
|
if (!gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
2001-08-19 23:46:59 +00:00
|
|
|
|
/* FIXME: we lost the cursor; should we get the first? */
|
2001-06-05 15:30:53 +00:00
|
|
|
|
return;
|
|
|
|
|
|
2001-06-20 23:21:46 +00:00
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path,
|
2001-06-05 15:30:53 +00:00
|
|
|
|
&cursor_tree, &cursor_node);
|
2001-06-20 23:21:46 +00:00
|
|
|
|
gtk_tree_path_free (cursor_path);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
if (cursor_tree == NULL)
|
|
|
|
|
/* FIXME: we lost the cursor; should we get the first? */
|
|
|
|
|
return;
|
2001-06-01 22:57:30 +00:00
|
|
|
|
if (count == -1)
|
|
|
|
|
_gtk_rbtree_prev_full (cursor_tree, cursor_node,
|
2001-06-05 15:30:53 +00:00
|
|
|
|
&new_cursor_tree, &new_cursor_node);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
else
|
|
|
|
|
_gtk_rbtree_next_full (cursor_tree, cursor_node,
|
2001-06-05 15:30:53 +00:00
|
|
|
|
&new_cursor_tree, &new_cursor_node);
|
2001-06-01 22:57:30 +00:00
|
|
|
|
|
2001-06-05 15:30:53 +00:00
|
|
|
|
if (new_cursor_node)
|
2001-06-01 22:57:30 +00:00
|
|
|
|
{
|
2001-06-05 15:30:53 +00:00
|
|
|
|
cursor_path = _gtk_tree_view_find_path (tree_view, new_cursor_tree, new_cursor_node);
|
2001-06-20 23:21:46 +00:00
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, cursor_path, TRUE);
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
2001-06-05 15:30:53 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2001-06-01 22:57:30 +00:00
|
|
|
|
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
|
|
|
|
|
}
|
2001-06-05 15:30:53 +00:00
|
|
|
|
|
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
2001-06-01 22:57:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gint count)
|
2001-06-07 00:07:32 +00:00
|
|
|
|
{
|
2001-06-20 23:21:46 +00:00
|
|
|
|
GtkRBTree *cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *cursor_node = NULL;
|
|
|
|
|
GtkTreePath *cursor_path = NULL;
|
|
|
|
|
gint y;
|
|
|
|
|
gint vertical_separator;
|
|
|
|
|
|
|
|
|
|
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
else
|
|
|
|
|
/* This is sorta weird. Focus in should give us a cursor */
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (tree_view), "vertical_separator", &vertical_separator, NULL);
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path,
|
|
|
|
|
&cursor_tree, &cursor_node);
|
|
|
|
|
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
if (cursor_tree == NULL)
|
|
|
|
|
/* FIXME: we lost the cursor. Should we try to get one? */
|
|
|
|
|
return;
|
2001-06-20 23:21:46 +00:00
|
|
|
|
g_return_if_fail (cursor_node != NULL);
|
|
|
|
|
|
|
|
|
|
y = CELL_FIRST_PIXEL (tree_view, cursor_tree, cursor_node, vertical_separator);
|
|
|
|
|
y += count * tree_view->priv->vadjustment->page_size;
|
|
|
|
|
y = CLAMP (y, (gint)tree_view->priv->vadjustment->lower, (gint)tree_view->priv->vadjustment->upper - vertical_separator);
|
|
|
|
|
|
|
|
|
|
_gtk_rbtree_find_offset (tree_view->priv->tree, y, &cursor_tree, &cursor_node);
|
|
|
|
|
cursor_path = _gtk_tree_view_find_path (tree_view, cursor_tree, cursor_node);
|
|
|
|
|
g_return_if_fail (cursor_path != NULL);
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view,
|
|
|
|
|
cursor_path,
|
|
|
|
|
TRUE);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
|
|
|
|
|
gint count)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *cursor_node = NULL;
|
|
|
|
|
GtkTreePath *cursor_path = NULL;
|
|
|
|
|
|
|
|
|
|
g_print ("gtk_tree_view_move_cursor_left_right\n");
|
|
|
|
|
|
2001-06-20 23:21:46 +00:00
|
|
|
|
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
2001-06-07 00:07:32 +00:00
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
2001-06-20 23:21:46 +00:00
|
|
|
|
else
|
2001-06-07 00:07:32 +00:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path,
|
|
|
|
|
&cursor_tree, &cursor_node);
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_move_cursor_start_end (GtkTreeView *tree_view,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gint count)
|
2001-06-07 00:07:32 +00:00
|
|
|
|
{
|
|
|
|
|
GtkRBTree *cursor_tree;
|
|
|
|
|
GtkRBNode *cursor_node;
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (tree_view->priv->tree != NULL);
|
|
|
|
|
|
|
|
|
|
if (count == -1)
|
|
|
|
|
{
|
|
|
|
|
cursor_tree = tree_view->priv->tree;
|
|
|
|
|
cursor_node = cursor_tree->root;
|
|
|
|
|
while (cursor_node && cursor_node->left != cursor_tree->nil)
|
|
|
|
|
cursor_node = cursor_node->left;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
cursor_tree = tree_view->priv->tree;
|
|
|
|
|
cursor_node = cursor_tree->root;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
while (cursor_node && cursor_node->right != cursor_tree->nil)
|
|
|
|
|
cursor_node = cursor_node->right;
|
|
|
|
|
if (cursor_node->children == NULL)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
cursor_tree = cursor_node->children;
|
|
|
|
|
cursor_node = cursor_tree->root;
|
|
|
|
|
}
|
|
|
|
|
while (1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
path = _gtk_tree_view_find_path (tree_view, cursor_tree, cursor_node);
|
|
|
|
|
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
|
|
|
|
|
cursor_node,
|
|
|
|
|
cursor_tree,
|
|
|
|
|
path,
|
2001-06-08 22:59:37 +00:00
|
|
|
|
FALSE?GDK_SHIFT_MASK:0);
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
|
|
|
|
tree_view->priv->cursor = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, path);
|
|
|
|
|
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-08 23:51:21 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *cursor_node = NULL;
|
|
|
|
|
GtkTreePath *cursor_path = NULL;
|
2001-08-22 22:27:41 +00:00
|
|
|
|
GdkModifierType state = 0;
|
2001-06-08 23:51:21 +00:00
|
|
|
|
|
|
|
|
|
cursor_path = NULL;
|
|
|
|
|
if (tree_view->priv->cursor)
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
if (cursor_path == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path,
|
|
|
|
|
&cursor_tree, &cursor_node);
|
|
|
|
|
if (cursor_tree == NULL)
|
2001-08-19 23:46:59 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2001-08-22 22:27:41 +00:00
|
|
|
|
|
|
|
|
|
gtk_get_current_event_state (&state);
|
2001-06-08 23:51:21 +00:00
|
|
|
|
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
|
|
|
|
|
cursor_node,
|
|
|
|
|
cursor_tree,
|
|
|
|
|
cursor_path,
|
2001-08-22 22:27:41 +00:00
|
|
|
|
state);
|
2001-06-08 23:51:21 +00:00
|
|
|
|
|
|
|
|
|
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
|
|
|
|
|
|
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-07 00:07:32 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *cursor_node = NULL;
|
|
|
|
|
GtkTreePath *cursor_path = NULL;
|
|
|
|
|
|
|
|
|
|
cursor_path = NULL;
|
|
|
|
|
if (tree_view->priv->cursor)
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
if (cursor_path == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path,
|
|
|
|
|
&cursor_tree, &cursor_node);
|
|
|
|
|
if (cursor_tree == NULL)
|
2001-08-19 23:46:59 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
|
|
|
|
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
|
|
|
|
|
cursor_node,
|
|
|
|
|
cursor_tree,
|
|
|
|
|
cursor_path,
|
|
|
|
|
GDK_CONTROL_MASK);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
|
|
|
|
|
|
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_real_expand_collapse_cursor_row (GtkTreeView *tree_view,
|
|
|
|
|
gboolean logical,
|
|
|
|
|
gboolean expand,
|
|
|
|
|
gboolean open_all)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *cursor_path = NULL;
|
|
|
|
|
|
|
|
|
|
cursor_path = NULL;
|
|
|
|
|
if (tree_view->priv->cursor)
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
if (cursor_path == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (expand)
|
|
|
|
|
gtk_tree_view_expand_row (tree_view, cursor_path, open_all);
|
|
|
|
|
else
|
|
|
|
|
gtk_tree_view_collapse_row (tree_view, cursor_path);
|
|
|
|
|
|
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *cursor_tree = NULL;
|
|
|
|
|
GtkRBNode *cursor_node = NULL;
|
|
|
|
|
GtkTreePath *cursor_path = NULL;
|
|
|
|
|
|
|
|
|
|
cursor_path = NULL;
|
|
|
|
|
if (tree_view->priv->cursor)
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
if (cursor_path == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, cursor_path,
|
|
|
|
|
&cursor_tree, &cursor_node);
|
|
|
|
|
if (cursor_tree == NULL)
|
2001-08-19 23:46:59 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
|
|
|
|
if (cursor_tree->parent_node)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
|
|
|
|
cursor_node = cursor_tree->parent_node;
|
|
|
|
|
cursor_tree = cursor_tree->parent_tree;
|
|
|
|
|
|
|
|
|
|
gtk_tree_path_up (cursor_path);
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
|
|
|
|
tree_view->priv->cursor = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, cursor_path);
|
|
|
|
|
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
|
|
|
|
|
cursor_node,
|
|
|
|
|
cursor_tree,
|
|
|
|
|
cursor_path,
|
|
|
|
|
0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
|
|
|
|
|
|
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
void
|
|
|
|
|
_gtk_tree_view_update_size (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
gint width, height;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
gint vertical_separator;
|
|
|
|
|
gint i;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (tree_view), "vertical_separator", &vertical_separator, NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->model == NULL)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->width = 0;
|
|
|
|
|
tree_view->priv->height = 0;
|
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
width = 0;
|
|
|
|
|
for (list = tree_view->priv->columns, i = 0; list; list = list->next, i++)
|
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
|
|
|
|
width += TREE_VIEW_COLUMN_WIDTH (column);
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
height = 0;
|
|
|
|
|
else
|
|
|
|
|
height = tree_view->priv->tree->root->offset + vertical_separator;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->width != width)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->width = width;
|
|
|
|
|
tree_view->priv->hadjustment->upper = width;
|
|
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->hadjustment), "changed");
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->height != height)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->height = height;
|
|
|
|
|
tree_view->priv->vadjustment->upper = tree_view->priv->height;
|
|
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->vadjustment), "changed");
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_resize (tree_view->priv->bin_window, MAX (width, GTK_WIDGET (tree_view)->allocation.width), height + TREE_VIEW_HEADER_HEIGHT (tree_view));
|
|
|
|
|
gdk_window_resize (tree_view->priv->header_window, MAX (width, GTK_WIDGET (tree_view)->allocation.width), tree_view->priv->header_height);
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_update_col_width (tree_view);
|
|
|
|
|
}
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* this function returns the new width of the column being resized given
|
|
|
|
|
* the column and x position of the cursor; the x cursor position is passed
|
|
|
|
|
* in as a pointer and automagicly corrected if it's beyond min/max limits
|
|
|
|
|
*/
|
|
|
|
|
static gint
|
|
|
|
|
gtk_tree_view_new_column_width (GtkTreeView *tree_view,
|
|
|
|
|
gint i,
|
|
|
|
|
gint *x)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
gint width;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* first translate the x position from widget->window
|
|
|
|
|
* to clist->clist_window
|
|
|
|
|
*/
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
column = g_list_nth (tree_view->priv->columns, i)->data;
|
|
|
|
|
width = *x - column->button->allocation.x;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Clamp down the value */
|
|
|
|
|
if (column->min_width == -1)
|
|
|
|
|
width = MAX (column->button->requisition.width,
|
|
|
|
|
width);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
else
|
2001-04-28 00:29:34 +00:00
|
|
|
|
width = MAX (column->min_width,
|
|
|
|
|
width);
|
|
|
|
|
if (column->max_width != -1)
|
|
|
|
|
width = MIN (width, column->max_width != -1);
|
|
|
|
|
*x = column->button->allocation.x + width;
|
|
|
|
|
|
|
|
|
|
return width;
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-01 23:09:50 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Callbacks */
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
|
2001-05-09 13:18:46 +00:00
|
|
|
|
GtkTreeView *tree_view)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_move (tree_view->priv->bin_window,
|
|
|
|
|
- tree_view->priv->hadjustment->value,
|
|
|
|
|
- tree_view->priv->vadjustment->value);
|
|
|
|
|
gdk_window_move (tree_view->priv->header_window,
|
|
|
|
|
- tree_view->priv->hadjustment->value,
|
|
|
|
|
0);
|
|
|
|
|
|
|
|
|
|
gdk_window_process_updates (tree_view->priv->bin_window, TRUE);
|
|
|
|
|
gdk_window_process_updates (tree_view->priv->header_window, TRUE);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Public methods
|
|
|
|
|
*/
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_new:
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Creates a new #GtkTreeView widget.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Return value: A newly created #GtkTreeView widget.
|
2001-01-19 22:39:19 +00:00
|
|
|
|
**/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkWidget *
|
|
|
|
|
gtk_tree_view_new (void)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeView *tree_view;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (gtk_type_new (gtk_tree_view_get_type ()));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return GTK_WIDGET (tree_view);
|
|
|
|
|
}
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_new_with_model:
|
|
|
|
|
* @model: the model.
|
|
|
|
|
*
|
|
|
|
|
* Creates a new #GtkTreeView widget with the model initialized to @model.
|
|
|
|
|
*
|
|
|
|
|
* Return value: A newly created #GtkTreeView widget.
|
|
|
|
|
**/
|
|
|
|
|
GtkWidget *
|
|
|
|
|
gtk_tree_view_new_with_model (GtkTreeModel *model)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view = GTK_TREE_VIEW (gtk_type_new (gtk_tree_view_get_type ()));
|
|
|
|
|
gtk_tree_view_set_model (tree_view, model);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return GTK_WIDGET (tree_view);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Public Accessors
|
|
|
|
|
*/
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_get_model:
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
* @tree_view: a #GtkTreeView
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Returns the model the the #GtkTreeView is based on. Returns NULL if the
|
|
|
|
|
* model is unset.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Return value: A #GtkTreeModel, or NULL if none is currently being used.
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
**/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeModel *
|
|
|
|
|
gtk_tree_view_get_model (GtkTreeView *tree_view)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->model;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_model:
|
|
|
|
|
* @tree_view: A #GtkTreeNode.
|
|
|
|
|
* @model: The model.
|
|
|
|
|
*
|
|
|
|
|
* Sets the model for a #GtkTreeView. If the @tree_view already has a model
|
|
|
|
|
* set, it will remove it before setting the new model. If @model is NULL, then
|
|
|
|
|
* it will unset the old model.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_model (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeModel *model)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (model == tree_view->priv->model)
|
|
|
|
|
return;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-08-17 16:33:04 +00:00
|
|
|
|
if (tree_view->priv->model)
|
|
|
|
|
{
|
|
|
|
|
g_signal_handlers_disconnect_by_func (G_OBJECT (tree_view->priv->model),
|
|
|
|
|
gtk_tree_view_range_changed, tree_view);
|
|
|
|
|
g_signal_handlers_disconnect_by_func (G_OBJECT (tree_view->priv->model),
|
|
|
|
|
gtk_tree_view_inserted, tree_view);
|
|
|
|
|
g_signal_handlers_disconnect_by_func (G_OBJECT (tree_view->priv->model),
|
|
|
|
|
gtk_tree_view_has_child_toggled, tree_view);
|
|
|
|
|
g_signal_handlers_disconnect_by_func (G_OBJECT (tree_view->priv->model),
|
|
|
|
|
gtk_tree_view_deleted, tree_view);
|
|
|
|
|
g_signal_handlers_disconnect_by_func (G_OBJECT (tree_view->priv->model),
|
|
|
|
|
gtk_tree_view_reordered, tree_view);
|
|
|
|
|
if (tree_view->priv->tree)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
2001-08-17 16:33:04 +00:00
|
|
|
|
_gtk_rbtree_free (tree_view->priv->tree);
|
|
|
|
|
tree_view->priv->tree = NULL;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2001-08-22 23:05:07 +00:00
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
|
|
|
|
|
tree_view->priv->drag_dest_row = NULL;
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
|
|
|
|
tree_view->priv->cursor = NULL;
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->anchor);
|
|
|
|
|
tree_view->priv->anchor = NULL;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_unref (tree_view->priv->model);
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
tree_view->priv->search_column = -1;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->model = model;
|
|
|
|
|
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
|
2001-08-17 16:33:04 +00:00
|
|
|
|
if (tree_view->priv->model)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
gint i;
|
2001-08-17 16:33:04 +00:00
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
|
|
|
|
|
if (tree_view->priv->search_column == -1)
|
|
|
|
|
{
|
|
|
|
|
for (i = 0; i < gtk_tree_model_get_n_columns (model); i++)
|
|
|
|
|
{
|
|
|
|
|
if (gtk_tree_model_get_column_type (model, i) == G_TYPE_STRING)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->search_column = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-08-17 16:33:04 +00:00
|
|
|
|
g_object_ref (tree_view->priv->model);
|
|
|
|
|
g_signal_connect (tree_view->priv->model,
|
|
|
|
|
"range_changed",
|
|
|
|
|
G_CALLBACK (gtk_tree_view_range_changed),
|
|
|
|
|
tree_view);
|
|
|
|
|
g_signal_connect (tree_view->priv->model,
|
|
|
|
|
"inserted",
|
|
|
|
|
G_CALLBACK (gtk_tree_view_inserted),
|
|
|
|
|
tree_view);
|
|
|
|
|
g_signal_connect (tree_view->priv->model,
|
|
|
|
|
"has_child_toggled",
|
|
|
|
|
G_CALLBACK (gtk_tree_view_has_child_toggled),
|
|
|
|
|
tree_view);
|
|
|
|
|
g_signal_connect (tree_view->priv->model,
|
|
|
|
|
"deleted",
|
|
|
|
|
G_CALLBACK (gtk_tree_view_deleted),
|
|
|
|
|
tree_view);
|
|
|
|
|
g_signal_connect (tree_view->priv->model,
|
|
|
|
|
"reordered",
|
|
|
|
|
G_CALLBACK (gtk_tree_view_reordered),
|
|
|
|
|
tree_view);
|
|
|
|
|
|
|
|
|
|
path = gtk_tree_path_new_root ();
|
|
|
|
|
if (gtk_tree_model_get_iter (tree_view->priv->model, &iter, path))
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->tree = _gtk_rbtree_new ();
|
|
|
|
|
gtk_tree_view_build_tree (tree_view, tree_view->priv->tree, &iter, 1, FALSE, GTK_WIDGET_REALIZED (tree_view));
|
|
|
|
|
}
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
|
|
|
|
|
/* FIXME: do I need to do this? gtk_tree_view_create_buttons (tree_view); */
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-08-17 16:33:04 +00:00
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "model");
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-10-16 03:18:49 +00:00
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_get_selection:
|
2000-10-16 03:18:49 +00:00
|
|
|
|
* @tree_view: A #GtkTreeView.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Gets the #GtkTreeSelection associated with @tree_view.
|
|
|
|
|
*
|
|
|
|
|
* Return value: A #GtkTreeSelection object.
|
2000-10-16 03:18:49 +00:00
|
|
|
|
**/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeSelection *
|
|
|
|
|
gtk_tree_view_get_selection (GtkTreeView *tree_view)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->selection;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_hadjustment:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
*
|
|
|
|
|
* Gets the #GtkAdjustment currently being used for the horizontal aspect.
|
|
|
|
|
*
|
|
|
|
|
* Return value: A #GtkAdjustment object, or NULL if none is currently being
|
|
|
|
|
* used.
|
|
|
|
|
**/
|
|
|
|
|
GtkAdjustment *
|
|
|
|
|
gtk_tree_view_get_hadjustment (GtkTreeView *tree_view)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->hadjustment == NULL)
|
|
|
|
|
gtk_tree_view_set_hadjustment (tree_view, NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->hadjustment;
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-10-16 03:18:49 +00:00
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_set_hadjustment:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @adjustment: The #GtkAdjustment to set, or NULL
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Sets the #GtkAdjustment for the current horizontal aspect.
|
2000-10-16 03:18:49 +00:00
|
|
|
|
**/
|
2000-10-05 01:04:57 +00:00
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_set_hadjustment (GtkTreeView *tree_view,
|
|
|
|
|
GtkAdjustment *adjustment)
|
2000-10-05 01:04:57 +00:00
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_set_adjustments (tree_view,
|
|
|
|
|
adjustment,
|
|
|
|
|
tree_view->priv->vadjustment);
|
2000-10-05 01:04:57 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "hadjustment");
|
2000-10-05 01:04:57 +00:00
|
|
|
|
}
|
2000-10-30 23:21:38 +00:00
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_get_vadjustment:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Gets the #GtkAdjustment currently being used for the vertical aspect.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Return value: A #GtkAdjustment object, or NULL if none is currently being
|
|
|
|
|
* used.
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
**/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkAdjustment *
|
|
|
|
|
gtk_tree_view_get_vadjustment (GtkTreeView *tree_view)
|
2000-10-30 23:21:38 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
2000-10-30 23:21:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->vadjustment == NULL)
|
|
|
|
|
gtk_tree_view_set_vadjustment (tree_view, NULL);
|
2000-10-30 23:21:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->vadjustment;
|
2000-10-30 23:21:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_set_vadjustment:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @adjustment: The #GtkAdjustment to set, or NULL
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Sets the #GtkAdjustment for the current vertical aspect.
|
Port to GObject, can go back in gdk-pixbuf after setting up a
2000-12-16 Havoc Pennington <hp@pobox.com>
* gtk/gdk-pixbuf-loader.h, gtk/gdk-pixbuf-loader.c:
Port to GObject, can go back in gdk-pixbuf after setting up
a gdk-pixbuf-marshal.h header over there.
* gtk/gtktreeview.c: s/SEPERATOR/SEPARATOR/g;
(gtk_tree_view_class_init): specify GTK_TYPE_ADJUSTMENT for signal
args
(gtk_tree_view_init): don't unset GTK_NO_WINDOW, it shouldn't be
set
(gtk_tree_view_realize_buttons): don't gtk_widget_show() buttons
here, do it when we create the buttons later
(gtk_tree_view_realize_buttons): add some g_return_if_fail
(gtk_tree_view_map): paranoia checks that column->button is shown
and unmapped
(gtk_tree_view_size_request): only request visible children.
Move header size calculation in here, for cleanliness, and
to maintain invariants for child widgets if we eventually
let users set different children inside the buttons
(gtk_tree_view_map_buttons): factor out code to map buttons,
since it was being called several times
(gtk_tree_view_size_allocate_buttons): move_resize the drag
windows instead of just moving them; their height may change
if we allow random widgets in there, or the theme changes.
(gtk_tree_view_size_allocate): move button size allocation
above emitting the scroll signals, to ensure a sane state when we
hit user code
(gtk_tree_view_button_release): remove queue_resize after
tree_view_set_size(), set_size() will handle any resize queuing
that's needed
(gtk_tree_view_focus_in): just queue a draw, don't fool with
draw_focus goo
(gtk_tree_view_focus): use gtk_get_current_event() and
gdk_event_get_state()
(gtk_tree_view_deleted): don't queue_resize() after calling set_size()
(gtk_tree_view_build_tree): fix a "if (foo); {}" bug - i.e. remove
semicolon
(gtk_tree_view_create_button): show the button here
(gtk_tree_view_button_clicked): actually emit the clicked signal
on the column
(_gtk_tree_view_set_size): return right away if the size is
unchanged, as a cheesy optimization
(gtk_tree_view_setup_model): rename set_model_realized to
setup_model to match the flag that indicates whether we've
called it
(gtk_tree_view_get_hadjustment): create adjustment if it doesn't
exist, because set_scroll_adjustment does that and it shouldn't
matter what order you call these in
(gtk_tree_view_get_vadjustment): ditto
(gtk_tree_view_set_headers_visible): canonicalize the bool,
for paranoia
(gtk_tree_view_set_headers_visible): call
gtk_tree_view_map_buttons() instead of using cut-and-paste code
(gtk_tree_view_append_column): clarify whether the return value
is the count of columns before or after, and do the increment
separately from the return statement so you can tell from the code.
(gtk_tree_view_remove_column): ditto
(gtk_tree_view_insert_column): ditto
(gtk_tree_view_get_column): remove g_return_if_fail for columns
outside the existing range, the docs say that outside-range
columns are allowed, so we handle them as documented. (Presumably
this allows a nice loop with column != NULL as test.)
(gtk_tree_view_move_to): document what 0.0, 0.5, 1.0 alignments
mean (left/right/center etc.).
(gtk_tree_view_collapse_all): only queue a draw if we're mapped
(gtk_tree_view_expand_row): add docs
(gtk_tree_view_collapse_row): add docs
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_clicked): new
function to emit the clicked signal on a column
* gdk/gdkevents.c (gdk_event_get_state): new function, to get the
state of an event
(gdk_event_get_time): don't treat GDK_SCROLL
as a button event, remove default case from switch so gcc
will whine if we don't explicitly handle all event types
* gtk/gtktreeselection.h: added some FIXME
* gtk/gtktreeprivate.h (struct _GtkTreeViewPrivate): rename
"columns" to "n_columns" and "column" to "columns" for clarity
2000-12-17 23:50:00 +00:00
|
|
|
|
**/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_vadjustment (GtkTreeView *tree_view,
|
|
|
|
|
GtkAdjustment *adjustment)
|
2000-10-30 23:21:38 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_set_adjustments (tree_view,
|
|
|
|
|
tree_view->priv->hadjustment,
|
|
|
|
|
adjustment);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "vadjustment");
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Column and header operations */
|
2000-10-30 23:21:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_headers_visible:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
*
|
|
|
|
|
* Returns TRUE if the headers on the @tree_view are visible.
|
|
|
|
|
*
|
|
|
|
|
* Return value: Whether the headers are visible or not.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_get_headers_visible (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
2000-10-30 23:21:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE);
|
2000-10-30 23:21:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_set_headers_visible:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @headers_visible: TRUE if the headers are visible
|
2001-01-19 22:39:19 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Sets the the visibility state of the headers.
|
2001-01-19 22:39:19 +00:00
|
|
|
|
**/
|
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_set_headers_visible (GtkTreeView *tree_view,
|
|
|
|
|
gboolean headers_visible)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint x, y;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeViewColumn *column;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
headers_visible = !! headers_visible;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE) == headers_visible)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (headers_visible)
|
|
|
|
|
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE);
|
|
|
|
|
else
|
|
|
|
|
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE);
|
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_get_position (tree_view->priv->bin_window, &x, &y);
|
|
|
|
|
if (headers_visible)
|
|
|
|
|
{
|
|
|
|
|
gdk_window_move_resize (tree_view->priv->bin_window, x, y, tree_view->priv->width, tree_view->priv->height + TREE_VIEW_HEADER_HEIGHT (tree_view));
|
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_MAPPED (tree_view))
|
|
|
|
|
gtk_tree_view_map_buttons (tree_view);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gdk_window_move_resize (tree_view->priv->bin_window, x, y, tree_view->priv->width, tree_view->priv->height);
|
|
|
|
|
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
column = list->data;
|
|
|
|
|
gtk_widget_unmap (column->button);
|
|
|
|
|
}
|
|
|
|
|
gdk_window_hide (tree_view->priv->header_window);
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
tree_view->priv->vadjustment->page_size = GTK_WIDGET (tree_view)->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view);
|
|
|
|
|
tree_view->priv->vadjustment->page_increment = (GTK_WIDGET (tree_view)->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view)) / 2;
|
|
|
|
|
tree_view->priv->vadjustment->lower = 0;
|
|
|
|
|
tree_view->priv->vadjustment->upper = tree_view->priv->height;
|
|
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->vadjustment), "changed");
|
|
|
|
|
|
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
|
|
|
|
|
|
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "headers_visible");
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_columns_autosize:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Resizes all columns to their optimal width.
|
2001-01-19 22:39:19 +00:00
|
|
|
|
**/
|
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_columns_autosize (GtkTreeView *tree_view)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gboolean dirty = FALSE;
|
|
|
|
|
GList *list;
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
column = list->data;
|
|
|
|
|
if (column->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
|
|
|
|
|
continue;
|
|
|
|
|
column->dirty = TRUE;
|
|
|
|
|
dirty = TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (dirty)
|
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_set_headers_clickable:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @setting: TRUE if the columns are clickable.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Allow the column title buttons to be clicked.
|
2001-01-19 22:39:19 +00:00
|
|
|
|
**/
|
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_set_headers_clickable (GtkTreeView *tree_view,
|
|
|
|
|
gboolean setting)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GList *list;
|
|
|
|
|
|
2001-01-19 22:39:19 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (tree_view->priv->model != NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (list->data), setting);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "headers_clickable");
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_rules_hint
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @setting: %TRUE if the tree requires reading across rows
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
* This function tells GTK+ that the user interface for your
|
|
|
|
|
* application requires users to read across tree rows and associate
|
|
|
|
|
* cells with one another. By default, GTK+ will then render the tree
|
|
|
|
|
* with alternating row colors. <emphasis>DO NOT</emphasis> use it
|
|
|
|
|
* just because you prefer the appearance of the ruled tree; that's a
|
|
|
|
|
* question for the theme. Some themes will draw tree rows in
|
|
|
|
|
* alternating colors even when rules are turned off, and users who
|
|
|
|
|
* prefer that appearance all the time can choose those themes. You
|
|
|
|
|
* should call this function only as a <emphasis>semantic</emphasis>
|
|
|
|
|
* hint to the theme engine that your tree makes alternating colors
|
|
|
|
|
* useful from a functional standpoint (since it has lots of columns,
|
|
|
|
|
* generally).
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_rules_hint (GtkTreeView *tree_view,
|
|
|
|
|
gboolean setting)
|
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
setting = setting != FALSE;
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->has_rules != setting)
|
|
|
|
|
{
|
|
|
|
|
tree_view->priv->has_rules = setting;
|
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "rules_hint");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_rules_hint
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
*
|
|
|
|
|
* Gets the setting set by gtk_tree_view_set_rules_hint().
|
|
|
|
|
*
|
|
|
|
|
* Return value: %TRUE if rules are useful for the user of this tree
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_get_rules_hint (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
|
|
|
|
|
|
|
|
|
return tree_view->priv->has_rules;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Public Column functions
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_append_column:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @column: The #GtkTreeViewColumn to add.
|
|
|
|
|
*
|
|
|
|
|
* Appends @column to the list of columns.
|
|
|
|
|
*
|
|
|
|
|
* Return value: The number of columns in @tree_view after appending.
|
|
|
|
|
**/
|
|
|
|
|
gint
|
|
|
|
|
gtk_tree_view_append_column (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (column), -1);
|
|
|
|
|
g_return_val_if_fail (column->tree_view == NULL, -1);
|
|
|
|
|
|
|
|
|
|
return gtk_tree_view_insert_column (tree_view, column, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_remove_column:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @column: The #GtkTreeViewColumn to remove.
|
|
|
|
|
*
|
|
|
|
|
* Removes @column from @tree_view.
|
|
|
|
|
*
|
|
|
|
|
* Return value: The number of columns in @tree_view after removing.
|
|
|
|
|
**/
|
|
|
|
|
gint
|
|
|
|
|
gtk_tree_view_remove_column (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (column), -1);
|
|
|
|
|
g_return_val_if_fail (column->tree_view == GTK_WIDGET (tree_view), -1);
|
|
|
|
|
|
|
|
|
|
_gtk_tree_view_column_unset_tree_view (column);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->focus_column == column)
|
|
|
|
|
tree_view->priv->focus_column = NULL;
|
|
|
|
|
|
|
|
|
|
tree_view->priv->columns = g_list_remove (tree_view->priv->columns, column);
|
|
|
|
|
tree_view->priv->n_columns--;
|
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
|
|
|
|
{
|
|
|
|
|
GList *list;
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_unrealize_button (column);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
2001-07-31 19:55:02 +00:00
|
|
|
|
GtkTreeViewColumn *tmp_column;
|
|
|
|
|
|
|
|
|
|
tmp_column = GTK_TREE_VIEW_COLUMN (list->data);
|
|
|
|
|
if (tmp_column->visible)
|
|
|
|
|
tmp_column->dirty = TRUE;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->n_columns == 0 &&
|
|
|
|
|
gtk_tree_view_get_headers_visible (tree_view))
|
|
|
|
|
gdk_window_hide (tree_view->priv->header_window);
|
|
|
|
|
|
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
g_object_unref (G_OBJECT (column));
|
2001-05-09 13:18:46 +00:00
|
|
|
|
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[COLUMNS_CHANGED], 0);
|
2001-05-16 00:23:30 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->n_columns;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_insert_column:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @column: The #GtkTreeViewColumn to be inserted.
|
|
|
|
|
* @position: The position to insert @column in.
|
|
|
|
|
*
|
|
|
|
|
* This inserts the @column into the @tree_view at @position. If @position is
|
|
|
|
|
* -1, then the column is inserted at the end.
|
|
|
|
|
*
|
|
|
|
|
* Return value: The number of columns in @tree_view after insertion.
|
|
|
|
|
**/
|
|
|
|
|
gint
|
|
|
|
|
gtk_tree_view_insert_column (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column,
|
|
|
|
|
gint position)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (column), -1);
|
|
|
|
|
g_return_val_if_fail (column->tree_view == NULL, -1);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_ref (G_OBJECT (column));
|
2001-08-19 06:58:11 +00:00
|
|
|
|
gtk_object_sink (GTK_OBJECT (column));
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->n_columns == 0 &&
|
|
|
|
|
GTK_WIDGET_REALIZED (tree_view) &&
|
|
|
|
|
gtk_tree_view_get_headers_visible (tree_view))
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_window_show (tree_view->priv->header_window);
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
}
|
2001-03-05 20:07:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->columns = g_list_insert (tree_view->priv->columns,
|
|
|
|
|
column, position);
|
|
|
|
|
tree_view->priv->n_columns++;
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_set_tree_view (column, tree_view);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
|
|
|
|
{
|
|
|
|
|
GList *list;
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
_gtk_tree_view_column_realize_button (column);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
column = GTK_TREE_VIEW_COLUMN (list->data);
|
|
|
|
|
if (column->visible)
|
|
|
|
|
column->dirty = TRUE;
|
|
|
|
|
}
|
|
|
|
|
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[COLUMNS_CHANGED], 0);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->n_columns;
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* gtk_tree_view_insert_column_with_attributes:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @position: The position to insert the new column in.
|
|
|
|
|
* @title: The title to set the header to.
|
|
|
|
|
* @cell: The #GtkCellRenderer.
|
|
|
|
|
* @Varargs: A NULL terminated list of attributes.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Creates a new #GtkTreeViewColumn and inserts it into the @tree_view at
|
|
|
|
|
* @position. If @position is -1, then the newly created column is inserted at
|
|
|
|
|
* the end. The column is initialized with the attributes given.
|
2001-03-09 00:40:18 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Return value: The number of columns in @tree_view after insertion.
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
**/
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint
|
|
|
|
|
gtk_tree_view_insert_column_with_attributes (GtkTreeView *tree_view,
|
|
|
|
|
gint position,
|
|
|
|
|
gchar *title,
|
|
|
|
|
GtkCellRenderer *cell,
|
|
|
|
|
...)
|
remove validation idle
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_destroy_layout): remove
validation idle
* demos/gtk-demo/main.c (create_tree): adjust to changes in text
cell renderer
* demos/pixbuf-demo.c (timeout): remove deprecated
gtk_widget_draw
* demos/testpixbuf-save.c (main): remove deprecated
gtk_drawing_area_size
* gtk/gtktreeview.c (gtk_tree_view_size_allocate): allocate
buttons even if the model isn't setup. gtk_tree_view_check_dirty()
at the start of the allocation.
(gtk_tree_view_check_dirty): handle column->button == NULL, handle
unsetup or NULL model.
* gtk/gtkstyle.c (gtk_default_draw_flat_box): drawing for the
even/odd/sorted cells in the tree view.
* gtk/gtktreeselection.c (gtk_tree_selection_real_unselect_all):
bugfixes
* gtk/gtktreeview.c: assorted bugfixy stuff. Draw the row
backgrounds with draw_flat_box using different detail for even/odd
rows.
* gtk/gtkrbtree.c, gtkrbtree.h: Keep track of the parity of each
row, so we can draw the alternating colors thing
* gtk/gtktexttag.c (gtk_text_tag_set_property): if we change a
property from a synonym property, notify for the synonym.
Also, nuke the background_gdk_set and foreground_gdk_set synonyms
(gtk_text_tag_get_property): Always return the font, even if
all its fields aren't set
* gtk/gtkcellrenderertext.h (struct _GtkCellRendererText): don't
store the attr list; it leaves us with no way to change attributes
in _render according to the render flags, and no way to implement
get_property. Instead store all the specific text attributes.
Separate whether an attribute is enabled from its value. Sync all
properties with GtkTextTag, make them all consistent, etc.
* gtk/gtkcellrenderer.h: Add a flag GTK_CELL_RENDERER_SORTED so
renderers can highlight the sort row/column
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_get_property): use
accessor functions to get values; this has the side effect of
showing up which accessor functions were missing. Added those.
* gtk/gtktreeviewcolumn.h: Replace set_justification with
set_alignment, to be consistent with GtkLabel, GtkMisc
* gtk/gtktreeviewcolumn.c: Added code to display sort indicator
arrow.
* gtk/Makefile.am (gtk_public_h_sources): add gtktreesortable.h
* gtk/gtktreesortable.h: updates in here
2001-02-08 23:36:53 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
gchar *attribute;
|
|
|
|
|
va_list args;
|
|
|
|
|
gint column_id;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
column = gtk_tree_view_column_new ();
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_column_set_title (column, title);
|
|
|
|
|
gtk_tree_view_column_set_cell_renderer (column, cell);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
va_start (args, cell);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
attribute = va_arg (args, gchar *);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
while (attribute != NULL)
|
|
|
|
|
{
|
|
|
|
|
column_id = va_arg (args, gint);
|
2001-06-27 23:44:53 +00:00
|
|
|
|
gtk_tree_view_column_add_attribute (column, cell, attribute, column_id);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
attribute = va_arg (args, gchar *);
|
|
|
|
|
}
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
va_end (args);
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_insert_column (tree_view, column, position);
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->n_columns;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-05-25 20:41:46 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_insert_column_with_data_func:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @position: Position to insert, -1 for append
|
|
|
|
|
* @title: column title
|
|
|
|
|
* @cell: cell renderer for column
|
|
|
|
|
* @func: function to set attributes of cell renderer
|
|
|
|
|
* @data: data for @func
|
|
|
|
|
* @dnotify: destroy notifier for @data
|
2001-06-07 00:07:32 +00:00
|
|
|
|
*
|
2001-05-25 20:41:46 +00:00
|
|
|
|
* Convenience function that inserts a new column into the #GtkTreeView
|
|
|
|
|
* with the given cell renderer and a #GtkCellDataFunc to set cell renderer
|
|
|
|
|
* attributes (normally using data from the model). See also
|
|
|
|
|
* gtk_tree_view_column_set_cell_data_func(), gtk_tree_view_column_set_cell_renderer().
|
2001-06-07 00:07:32 +00:00
|
|
|
|
*
|
2001-05-25 20:41:46 +00:00
|
|
|
|
* Return value: number of columns in the tree view post-insert
|
|
|
|
|
**/
|
|
|
|
|
gint
|
|
|
|
|
gtk_tree_view_insert_column_with_data_func (GtkTreeView *tree_view,
|
|
|
|
|
gint position,
|
|
|
|
|
gchar *title,
|
|
|
|
|
GtkCellRenderer *cell,
|
2001-06-01 22:57:30 +00:00
|
|
|
|
GtkTreeCellDataFunc func,
|
2001-05-25 20:41:46 +00:00
|
|
|
|
gpointer data,
|
|
|
|
|
GDestroyNotify dnotify)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
|
|
|
|
|
|
|
|
|
|
column = gtk_tree_view_column_new ();
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_column_set_title (column, title);
|
|
|
|
|
gtk_tree_view_column_set_cell_renderer (column, cell);
|
2001-06-27 23:44:53 +00:00
|
|
|
|
gtk_tree_view_column_set_cell_data_func (column, cell, func, data, dnotify);
|
2001-05-25 20:41:46 +00:00
|
|
|
|
|
|
|
|
|
gtk_tree_view_insert_column (tree_view, column, position);
|
|
|
|
|
|
|
|
|
|
return tree_view->priv->n_columns;
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_column:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @n: The position of the column, counting from 0.
|
|
|
|
|
*
|
|
|
|
|
* Gets the #GtkTreeViewColumn at the given position in the #tree_view.
|
|
|
|
|
*
|
|
|
|
|
* Return value: The #GtkTreeViewColumn, or NULL if the position is outside the
|
|
|
|
|
* range of columns.
|
|
|
|
|
**/
|
|
|
|
|
GtkTreeViewColumn *
|
|
|
|
|
gtk_tree_view_get_column (GtkTreeView *tree_view,
|
|
|
|
|
gint n)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (n < 0 || n >= tree_view->priv->n_columns)
|
|
|
|
|
return NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->columns == NULL)
|
|
|
|
|
return NULL;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return GTK_TREE_VIEW_COLUMN (g_list_nth (tree_view->priv->columns, n)->data);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
2001-04-30 16:16:02 +00:00
|
|
|
|
* gtk_tree_view_get_columns:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
*
|
|
|
|
|
* Returns a #GList of all the #GtkTreeViewColumn s currently in @tree_view.
|
|
|
|
|
* The returned list must be freed with g_list_free ().
|
|
|
|
|
*
|
|
|
|
|
* Return value: A list of #GtkTreeViewColumn s
|
|
|
|
|
**/
|
|
|
|
|
GList *
|
|
|
|
|
gtk_tree_view_get_columns (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
|
|
|
|
|
|
|
|
|
return g_list_copy (tree_view->priv->columns);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_move_column_after:
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @column: The #GtkTreeViewColumn to be moved.
|
|
|
|
|
* @base_column: The #GtkTreeViewColumn to be moved relative to.
|
2001-06-07 00:07:32 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Moves @column to be after to @base_column. If @base_column is NULL, then
|
|
|
|
|
* @column is placed in the first position.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_move_column_after (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column,
|
|
|
|
|
GtkTreeViewColumn *base_column)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-05-01 23:09:50 +00:00
|
|
|
|
GList *column_list_el, *base_el = NULL;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
column_list_el = g_list_find (tree_view->priv->columns, column);
|
|
|
|
|
g_return_if_fail (column_list_el != NULL);
|
|
|
|
|
|
|
|
|
|
if (base_column)
|
|
|
|
|
{
|
|
|
|
|
base_el = g_list_find (tree_view->priv->columns, base_column);
|
|
|
|
|
g_return_if_fail (base_el != NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (column_list_el->prev == base_el)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
tree_view->priv->columns = g_list_remove_link (tree_view->priv->columns, column_list_el);
|
|
|
|
|
if (base_el == NULL)
|
|
|
|
|
{
|
|
|
|
|
column_list_el->prev = NULL;
|
|
|
|
|
column_list_el->next = tree_view->priv->columns;
|
2001-05-02 05:25:09 +00:00
|
|
|
|
if (column_list_el->next)
|
|
|
|
|
column_list_el->next->prev = column_list_el;
|
2001-05-01 23:09:50 +00:00
|
|
|
|
tree_view->priv->columns = column_list_el;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
column_list_el->prev = base_el;
|
|
|
|
|
column_list_el->next = base_el->next;
|
2001-05-02 05:25:09 +00:00
|
|
|
|
if (column_list_el->next)
|
|
|
|
|
column_list_el->next->prev = column_list_el;
|
2001-05-01 23:09:50 +00:00
|
|
|
|
base_el->next = column_list_el;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_REALIZED (tree_view))
|
2001-05-09 13:18:46 +00:00
|
|
|
|
{
|
|
|
|
|
//gtk_widget_queue_resize (GTK_WIDGET (tree_view));
|
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
|
|
|
|
gtk_tree_view_size_allocate_buttons (GTK_WIDGET (tree_view));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[COLUMNS_CHANGED], 0);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_expander_column:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
2001-06-29 03:11:01 +00:00
|
|
|
|
* @column: NULL, or the column to draw the expander arrow at.
|
|
|
|
|
*
|
|
|
|
|
* Sets the column to draw the expander arrow at. It must be in @tree_view. If
|
|
|
|
|
* @column is %NULL, then the expander arrow is fixed at the first column.
|
2001-04-28 00:29:34 +00:00
|
|
|
|
**/
|
|
|
|
|
void
|
2001-06-29 03:11:01 +00:00
|
|
|
|
gtk_tree_view_set_expander_column (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumn *column)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (column != NULL)
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (column));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (tree_view->priv->expander_column != column)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
2001-06-29 03:11:01 +00:00
|
|
|
|
GList *list;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (column)
|
|
|
|
|
{
|
|
|
|
|
/* Confirm that column is in tree_view */
|
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
if (list->data == column)
|
|
|
|
|
break;
|
|
|
|
|
g_return_if_fail (list != NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tree_view->priv->expander_column = column;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "expander_column");
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_expander_column:
|
2001-06-29 03:11:01 +00:00
|
|
|
|
* @tree_view: A #GtkTreeView
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*
|
2001-06-29 03:11:01 +00:00
|
|
|
|
* Returns the column that is the current expander column. This
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* column has the expander arrow drawn next to it.
|
|
|
|
|
*
|
2001-06-29 03:11:01 +00:00
|
|
|
|
* Return value: The expander column.
|
2001-04-28 00:29:34 +00:00
|
|
|
|
**/
|
2001-06-29 03:11:01 +00:00
|
|
|
|
GtkTreeViewColumn *
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_expander_column (GtkTreeView *tree_view)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-06-29 03:11:01 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return tree_view->priv->expander_column;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-05-09 22:23:12 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_column_drag_function:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @func: A function to determine which columns are reorderable, or NULL.
|
|
|
|
|
* @user_data: User data to be passed to @func, or NULL
|
|
|
|
|
* @destroy: Destroy notifier for @user_data, or NULL
|
2001-06-07 00:07:32 +00:00
|
|
|
|
*
|
2001-05-09 22:23:12 +00:00
|
|
|
|
* Sets a user function for determining where a column may be dropped when
|
|
|
|
|
* dragged. This function is called on every column pair in turn at the
|
|
|
|
|
* beginning of a column drag to determine where a drop can take place. The
|
|
|
|
|
* arguments passed to @func are: the @tree_view, the #GtkTreeViewColumn being
|
|
|
|
|
* dragged, the two #GtkTreeViewColumn s determining the drop spot, and
|
|
|
|
|
* @user_data. If either of the #GtkTreeViewColumn arguments for the drop spot
|
|
|
|
|
* are NULL, then they indicate an edge. If @func is set to be NULL, then
|
|
|
|
|
* @tree_view reverts to the default behavior of allowing all columns to be
|
|
|
|
|
* dropped everywhere.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_column_drag_function (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewColumnDropFunc func,
|
|
|
|
|
gpointer user_data,
|
|
|
|
|
GtkDestroyNotify destroy)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->column_drop_func_data_destroy)
|
|
|
|
|
(* tree_view->priv->column_drop_func_data_destroy) (tree_view->priv->column_drop_func_data);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->column_drop_func = func;
|
|
|
|
|
tree_view->priv->column_drop_func_data = user_data;
|
|
|
|
|
tree_view->priv->column_drop_func_data_destroy = destroy;
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_scroll_to_point:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @tree_x: X coordinate of new top-left pixel of visible area
|
|
|
|
|
* @tree_y: Y coordinate of new top-left pixel of visible area
|
|
|
|
|
*
|
|
|
|
|
* Scrolls the tree view such that the top-left corner of the visible
|
|
|
|
|
* area is @tree_x, @tree_y, where @tree_x and @tree_y are specified
|
|
|
|
|
* in tree window coordinates. The @tree_view must be realized before
|
|
|
|
|
* this function is called. If it isn't, you probably want ot be
|
|
|
|
|
* using gtk_tree_view_scroll_to_cell.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_scroll_to_point (GtkTreeView *tree_view,
|
|
|
|
|
gint tree_x,
|
|
|
|
|
gint tree_y)
|
|
|
|
|
{
|
|
|
|
|
GtkAdjustment *hadj;
|
|
|
|
|
GtkAdjustment *vadj;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (GTK_WIDGET_REALIZED (tree_view));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
hadj = tree_view->priv->hadjustment;
|
|
|
|
|
vadj = tree_view->priv->vadjustment;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_adjustment_set_value (hadj, CLAMP (tree_x, hadj->lower, hadj->upper));
|
|
|
|
|
gtk_adjustment_set_value (vadj, CLAMP (tree_y, vadj->lower, vadj->upper));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_scroll_to_cell
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @path: The path of the row to move to.
|
|
|
|
|
* @column: The #GtkTreeViewColumn to move horizontally to.
|
|
|
|
|
* @row_align: The vertical alignment of the row specified by @path.
|
|
|
|
|
* @col_align: The horizontal alignment of the column specified by @column.
|
|
|
|
|
*
|
|
|
|
|
* Moves the alignments of @tree_view to the position specified by
|
|
|
|
|
* @column and @path. If @column is NULL, then no horizontal
|
|
|
|
|
* scrolling occurs. Likewise, if @path is NULL no vertical scrolling
|
|
|
|
|
* occurs. @row_align determines where the row is placed, and
|
|
|
|
|
* @col_align determines where @column is placed. Both are expected
|
|
|
|
|
* to be between 0.0 and 1.0. 0.0 means left/top alignment, 1.0 means
|
|
|
|
|
* right/bottom alignment, 0.5 means center.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_scroll_to_cell (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeViewColumn *column,
|
|
|
|
|
gfloat row_align,
|
|
|
|
|
gfloat col_align)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GdkRectangle cell_rect;
|
|
|
|
|
GdkRectangle vis_rect;
|
|
|
|
|
gint dest_x, dest_y;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* FIXME work on unmapped/unrealized trees? maybe implement when
|
|
|
|
|
* we do incremental reflow for trees
|
|
|
|
|
*/
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-06-30 21:15:27 +00:00
|
|
|
|
g_return_if_fail (row_align >= 0.0 && row_align <= 1.0);
|
|
|
|
|
g_return_if_fail (col_align >= 0.0 && col_align <= 1.0);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (path != NULL || column != NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
row_align = CLAMP (row_align, 0.0, 1.0);
|
|
|
|
|
col_align = CLAMP (col_align, 0.0, 1.0);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (! GTK_WIDGET_REALIZED (tree_view))
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
tree_view->priv->scroll_to_path = gtk_tree_path_copy (path);
|
|
|
|
|
if (column)
|
|
|
|
|
tree_view->priv->scroll_to_column = column;
|
|
|
|
|
tree_view->priv->scroll_to_row_align = row_align;
|
|
|
|
|
tree_view->priv->scroll_to_col_align = col_align;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_cell_area (tree_view, path, column, &cell_rect);
|
|
|
|
|
gtk_tree_view_get_visible_rect (tree_view, &vis_rect);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
dest_x = vis_rect.x;
|
|
|
|
|
dest_y = vis_rect.y;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
{
|
|
|
|
|
dest_x = cell_rect.x +
|
|
|
|
|
cell_rect.width * row_align -
|
|
|
|
|
vis_rect.width * row_align;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
dest_y = cell_rect.y +
|
|
|
|
|
cell_rect.height * col_align -
|
|
|
|
|
vis_rect.height * col_align;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
gtk_tree_view_scroll_to_point (tree_view, dest_x, dest_y);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_row_activated:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @path: The #GtkTreePath to be activated.
|
|
|
|
|
* @column: The #GtkTreeViewColumn to be activated.
|
|
|
|
|
*
|
|
|
|
|
* Activates the cell determined by @path and @column.
|
|
|
|
|
**/
|
2001-01-19 22:39:19 +00:00
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_row_activated (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeViewColumn *column)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* FIXME: Actually activate the path internally, not just emit the signal */
|
2001-05-05 13:21:22 +00:00
|
|
|
|
/* g_warning ("FIXME: Actually activate the path internally, not just emit the signal\n"); */
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_signal_emit (G_OBJECT(tree_view), tree_view_signals[ROW_ACTIVATED], 0, path, column);
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_expand_all_helper (GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
gpointer data)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = data;
|
|
|
|
|
|
|
|
|
|
if (node->children)
|
|
|
|
|
_gtk_rbtree_traverse (node->children,
|
|
|
|
|
node->children->root,
|
|
|
|
|
G_PRE_ORDER,
|
|
|
|
|
gtk_tree_view_expand_all_helper,
|
|
|
|
|
data);
|
|
|
|
|
else if ((node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT && node->children == NULL)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
GtkTreeIter child;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
node->children = _gtk_rbtree_new ();
|
|
|
|
|
node->children->parent_tree = tree;
|
|
|
|
|
node->children->parent_node = node;
|
|
|
|
|
path = _gtk_tree_view_find_path (tree_view, tree, node);
|
|
|
|
|
gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
|
|
|
|
|
gtk_tree_model_iter_children (tree_view->priv->model, &child, &iter);
|
|
|
|
|
gtk_tree_view_build_tree (tree_view,
|
|
|
|
|
node->children,
|
|
|
|
|
&child,
|
|
|
|
|
gtk_tree_path_get_depth (path) + 1,
|
|
|
|
|
TRUE,
|
|
|
|
|
GTK_WIDGET_REALIZED (tree_view));
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_expand_all:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
*
|
|
|
|
|
* Recursively expands all nodes in the @tree_view.
|
|
|
|
|
**/
|
2001-01-19 22:39:19 +00:00
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_expand_all (GtkTreeView *tree_view)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (tree_view->priv->tree != NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_rbtree_traverse (tree_view->priv->tree,
|
|
|
|
|
tree_view->priv->tree->root,
|
|
|
|
|
G_PRE_ORDER,
|
|
|
|
|
gtk_tree_view_expand_all_helper,
|
|
|
|
|
tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_collapse_all_helper (GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
gpointer data)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node->children)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
GtkTreeIter iter;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
path = _gtk_tree_view_find_path (GTK_TREE_VIEW (data),
|
|
|
|
|
node->children,
|
|
|
|
|
node->children->root);
|
|
|
|
|
gtk_tree_model_get_iter (GTK_TREE_VIEW (data)->priv->model,
|
|
|
|
|
&iter,
|
|
|
|
|
path);
|
|
|
|
|
gtk_tree_view_discover_dirty (GTK_TREE_VIEW (data),
|
|
|
|
|
node->children,
|
|
|
|
|
&iter,
|
|
|
|
|
gtk_tree_path_get_depth (path));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Ensure we don't have a dangling pointer to a dead node */
|
|
|
|
|
ensure_unprelighted (GTK_TREE_VIEW (data));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_rbtree_remove (node->children);
|
|
|
|
|
gtk_tree_path_free (path);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
/* Timeout to animate the expander during expands and collapses */
|
|
|
|
|
static gboolean
|
|
|
|
|
expand_collapse_timeout (gpointer data)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = data;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
gboolean expanding;
|
|
|
|
|
gboolean redraw;
|
|
|
|
|
|
|
|
|
|
GDK_THREADS_ENTER ();
|
|
|
|
|
|
|
|
|
|
redraw = FALSE;
|
|
|
|
|
expanding = TRUE;
|
|
|
|
|
|
|
|
|
|
node = tree_view->priv->expanded_collapsed_node;
|
|
|
|
|
tree = tree_view->priv->expanded_collapsed_tree;
|
|
|
|
|
|
|
|
|
|
if (node->children == NULL)
|
|
|
|
|
expanding = FALSE;
|
|
|
|
|
|
|
|
|
|
if (expanding)
|
|
|
|
|
{
|
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SEMI_COLLAPSED))
|
|
|
|
|
{
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_SEMI_COLLAPSED);
|
|
|
|
|
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_SEMI_EXPANDED);
|
|
|
|
|
|
|
|
|
|
redraw = TRUE;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SEMI_EXPANDED))
|
|
|
|
|
{
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_SEMI_EXPANDED);
|
|
|
|
|
|
|
|
|
|
redraw = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SEMI_EXPANDED))
|
|
|
|
|
{
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_SEMI_EXPANDED);
|
|
|
|
|
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_SEMI_COLLAPSED);
|
|
|
|
|
|
|
|
|
|
redraw = TRUE;
|
|
|
|
|
}
|
|
|
|
|
else if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SEMI_COLLAPSED))
|
|
|
|
|
{
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_SEMI_COLLAPSED);
|
|
|
|
|
|
|
|
|
|
redraw = TRUE;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (redraw)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_queue_draw_arrow (tree_view, tree, node, NULL);
|
|
|
|
|
|
|
|
|
|
GDK_THREADS_LEAVE ();
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GDK_THREADS_LEAVE ();
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_collapse_all:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
*
|
|
|
|
|
* Recursively collapses all visible, expanded nodes in @tree_view.
|
|
|
|
|
**/
|
2001-01-19 22:39:19 +00:00
|
|
|
|
void
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_collapse_all (GtkTreeView *tree_view)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (tree_view->priv->tree != NULL);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_rbtree_traverse (tree_view->priv->tree,
|
|
|
|
|
tree_view->priv->tree->root,
|
|
|
|
|
G_PRE_ORDER,
|
|
|
|
|
gtk_tree_view_collapse_all_helper,
|
|
|
|
|
tree_view);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_WIDGET_MAPPED (tree_view))
|
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* FIXME the bool return values for expand_row and collapse_row are
|
|
|
|
|
* not analagous; they should be TRUE if the row had children and
|
|
|
|
|
* was not already in the requested state.
|
|
|
|
|
*/
|
|
|
|
|
|
2001-06-07 17:22:15 +00:00
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_real_expand_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node,
|
|
|
|
|
gboolean open_all)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkTreeIter iter;
|
2001-06-22 18:11:04 +00:00
|
|
|
|
GtkTreeIter temp;
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gboolean expand;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (node->children)
|
|
|
|
|
return TRUE;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
|
|
|
|
|
if (! gtk_tree_model_iter_has_child (tree_view->priv->model, &iter))
|
|
|
|
|
return FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-06-11 16:59:28 +00:00
|
|
|
|
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[TEST_EXPAND_ROW], 0, &iter, path, &expand);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (expand)
|
|
|
|
|
return FALSE;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
node->children = _gtk_rbtree_new ();
|
|
|
|
|
node->children->parent_tree = tree;
|
|
|
|
|
node->children->parent_node = node;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-06-22 18:11:04 +00:00
|
|
|
|
gtk_tree_model_iter_children (tree_view->priv->model, &temp, &iter);
|
2001-06-27 23:44:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_build_tree (tree_view,
|
|
|
|
|
node->children,
|
2001-06-22 18:11:04 +00:00
|
|
|
|
&temp,
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_get_depth (path) + 1,
|
|
|
|
|
open_all,
|
|
|
|
|
GTK_WIDGET_REALIZED (tree_view));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
if (tree_view->priv->expand_collapse_timeout)
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->expand_collapse_timeout);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->expanded_collapsed_node != NULL)
|
|
|
|
|
{
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED);
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tree_view->priv->expand_collapse_timeout = gtk_timeout_add (50, expand_collapse_timeout, tree_view);
|
|
|
|
|
tree_view->priv->expanded_collapsed_node = node;
|
|
|
|
|
tree_view->priv->expanded_collapsed_tree = tree;
|
|
|
|
|
|
|
|
|
|
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_SEMI_COLLAPSED);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_WIDGET_MAPPED (tree_view))
|
2001-06-07 17:22:15 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
|
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
|
|
|
|
}
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
|
|
|
|
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[ROW_EXPANDED], 0, &iter, path);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
2001-06-07 17:22:15 +00:00
|
|
|
|
* gtk_tree_view_expand_row:
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* @tree_view: a #GtkTreeView
|
2001-06-07 17:22:15 +00:00
|
|
|
|
* @path: path to a row
|
|
|
|
|
* @open_all: whether to recursively expand, or just expand immediate children
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*
|
2001-06-07 17:22:15 +00:00
|
|
|
|
* Opens the row so its children are visible
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*
|
2001-06-07 17:22:15 +00:00
|
|
|
|
* Return value: %TRUE if the row existed and had children
|
2001-04-28 00:29:34 +00:00
|
|
|
|
**/
|
2001-01-19 22:39:19 +00:00
|
|
|
|
gboolean
|
2001-06-07 17:22:15 +00:00
|
|
|
|
gtk_tree_view_expand_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
gboolean open_all)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
2001-06-07 17:22:15 +00:00
|
|
|
|
g_return_val_if_fail (tree_view->priv->model != NULL, FALSE);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (path != NULL, FALSE);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (_gtk_tree_view_find_node (tree_view,
|
|
|
|
|
path,
|
|
|
|
|
&tree,
|
|
|
|
|
&node))
|
|
|
|
|
return FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
if (tree != NULL)
|
|
|
|
|
return gtk_tree_view_real_expand_row (tree_view, path, tree, node, open_all);
|
|
|
|
|
else
|
|
|
|
|
return FALSE;
|
2001-06-07 17:22:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkRBNode *node)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeIter iter;
|
2001-06-22 18:11:04 +00:00
|
|
|
|
GtkTreeIter children;
|
2001-06-07 17:22:15 +00:00
|
|
|
|
gboolean collapse;
|
2001-08-19 23:46:59 +00:00
|
|
|
|
gint x, y;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-06-11 16:59:28 +00:00
|
|
|
|
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[TEST_COLLAPSE_ROW], 0, &iter, path, &collapse);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (collapse)
|
2001-03-09 00:40:18 +00:00
|
|
|
|
return FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
/* if the prelighted node is a child of us, we want to unprelight it. We have
|
|
|
|
|
* a chance to prelight the correct node below */
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->prelight_tree)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *parent_tree;
|
|
|
|
|
GtkRBNode *parent_node;
|
|
|
|
|
|
|
|
|
|
parent_tree = tree_view->priv->prelight_tree->parent_tree;
|
|
|
|
|
parent_node = tree_view->priv->prelight_tree->parent_node;
|
|
|
|
|
while (parent_tree)
|
|
|
|
|
{
|
|
|
|
|
if (parent_tree == tree && parent_node == node)
|
|
|
|
|
{
|
|
|
|
|
ensure_unprelighted (tree_view);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
parent_node = parent_tree->parent_node;
|
|
|
|
|
parent_tree = parent_tree->parent_tree;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-22 18:11:04 +00:00
|
|
|
|
TREE_VIEW_INTERNAL_ASSERT (gtk_tree_model_iter_children (tree_view->priv->model, &children, &iter), FALSE);
|
2001-06-27 23:44:53 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_discover_dirty (tree_view,
|
|
|
|
|
node->children,
|
2001-06-22 18:11:04 +00:00
|
|
|
|
&children,
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_path_get_depth (path));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-06-26 17:01:53 +00:00
|
|
|
|
if (tree_view->priv->destroy_count_func)
|
|
|
|
|
{
|
2001-07-30 05:34:55 +00:00
|
|
|
|
GtkTreePath *child_path;
|
2001-06-26 17:01:53 +00:00
|
|
|
|
gint child_count = 0;
|
2001-07-30 05:34:55 +00:00
|
|
|
|
child_path = gtk_tree_path_copy (path);
|
|
|
|
|
gtk_tree_path_append_index (child_path, 0);
|
2001-06-26 17:01:53 +00:00
|
|
|
|
if (node->children)
|
|
|
|
|
_gtk_rbtree_traverse (node->children, node->children->root, G_POST_ORDER, count_children_helper, &child_count);
|
2001-07-30 05:34:55 +00:00
|
|
|
|
(* tree_view->priv->destroy_count_func) (tree_view, child_path, child_count, tree_view->priv->destroy_count_data);
|
|
|
|
|
gtk_tree_path_free (child_path);
|
2001-06-26 17:01:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
if (gtk_tree_view_unref_and_check_selection_tree (tree_view, node->children))
|
|
|
|
|
g_signal_emit_by_name (G_OBJECT (tree_view->priv->selection), "changed", 0);
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_rbtree_remove (node->children);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-07-22 20:09:00 +00:00
|
|
|
|
if (tree_view->priv->expand_collapse_timeout)
|
|
|
|
|
gtk_timeout_remove (tree_view->priv->expand_collapse_timeout);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->expanded_collapsed_node != NULL)
|
|
|
|
|
{
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED);
|
|
|
|
|
GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tree_view->priv->expand_collapse_timeout = gtk_timeout_add (50, expand_collapse_timeout, tree_view);
|
|
|
|
|
tree_view->priv->expanded_collapsed_node = node;
|
|
|
|
|
tree_view->priv->expanded_collapsed_tree = tree;
|
|
|
|
|
|
|
|
|
|
GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_SEMI_EXPANDED);
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (GTK_WIDGET_MAPPED (tree_view))
|
2001-06-07 17:22:15 +00:00
|
|
|
|
{
|
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
|
|
|
|
|
_gtk_tree_view_update_size (tree_view);
|
|
|
|
|
}
|
2001-06-11 16:59:28 +00:00
|
|
|
|
|
2001-06-18 23:44:41 +00:00
|
|
|
|
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
|
|
|
|
|
if (gtk_tree_path_is_ancestor (path, cursor_path))
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
|
|
|
|
tree_view->priv->cursor = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view),
|
|
|
|
|
tree_view->priv->model,
|
|
|
|
|
path);
|
|
|
|
|
}
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gtk_tree_row_reference_valid (tree_view->priv->anchor))
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *anchor_path = gtk_tree_row_reference_get_path (tree_view->priv->anchor);
|
|
|
|
|
if (gtk_tree_path_is_ancestor (path, anchor_path))
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->anchor);
|
|
|
|
|
tree_view->priv->anchor = NULL;
|
|
|
|
|
}
|
|
|
|
|
gtk_tree_path_free (anchor_path);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-11 16:59:28 +00:00
|
|
|
|
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[ROW_COLLAPSED], 0, &iter, path);
|
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
/* now that we've collapsed all rows, we want to try to set the prelight
|
|
|
|
|
* again. To do this, we fake a motion event and send it to ourselves. */
|
|
|
|
|
|
|
|
|
|
if (gdk_window_at_pointer (&x, &y) == tree_view->priv->bin_window)
|
|
|
|
|
{
|
|
|
|
|
GdkEventMotion event;
|
|
|
|
|
event.window = tree_view->priv->bin_window;
|
|
|
|
|
event.x = x;
|
|
|
|
|
event.y = y;
|
|
|
|
|
|
|
|
|
|
/* despite the fact this isn't a real event, I'm almost positive it will
|
|
|
|
|
* never trigger a drag event. maybe_drag is the only function that uses
|
|
|
|
|
* more than just event.x and event.y. */
|
|
|
|
|
gtk_tree_view_motion_bin_window (GTK_WIDGET (tree_view), &event);
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-07 17:22:15 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_collapse_row:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @path: path to a row in the @tree_view
|
|
|
|
|
*
|
|
|
|
|
* Collapses a row (hides its child rows, if they exist.)
|
|
|
|
|
*
|
|
|
|
|
* Return value: %TRUE if the row was collapsed.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_collapse_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
|
|
|
|
g_return_val_if_fail (tree_view->priv->tree != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (path != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
if (_gtk_tree_view_find_node (tree_view,
|
|
|
|
|
path,
|
|
|
|
|
&tree,
|
|
|
|
|
&node))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
2001-08-19 23:46:59 +00:00
|
|
|
|
if (tree == NULL || node->children == NULL)
|
2001-06-07 17:22:15 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
return gtk_tree_view_real_collapse_row (tree_view, path, tree, node);
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_map_expanded_rows_helper (GtkTreeView *tree_view,
|
|
|
|
|
GtkRBTree *tree,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeViewMappingFunc func,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
gint *indices;
|
|
|
|
|
gint depth;
|
|
|
|
|
gint i = 0;
|
|
|
|
|
|
|
|
|
|
if (tree == NULL || tree->root == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
node = tree->root;
|
|
|
|
|
|
|
|
|
|
indices = gtk_tree_path_get_indices (path);
|
|
|
|
|
depth = gtk_tree_path_get_depth (path);
|
|
|
|
|
|
|
|
|
|
while (node && node->left != tree->nil)
|
|
|
|
|
node = node->left;
|
2001-06-07 00:07:32 +00:00
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
while (node)
|
|
|
|
|
{
|
|
|
|
|
if (node->children)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_path_append_index (path, 0);
|
|
|
|
|
gtk_tree_view_map_expanded_rows_helper (tree_view, node->children, path, func, user_data);
|
|
|
|
|
gtk_tree_path_up (path);
|
|
|
|
|
(* func) (tree_view, path, user_data);
|
|
|
|
|
}
|
|
|
|
|
i++;
|
|
|
|
|
indices[depth -1] = i;
|
|
|
|
|
node = _gtk_rbtree_next (tree, node);
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2001-05-09 13:18:46 +00:00
|
|
|
|
* gtk_tree_view_map_expanded_rows:
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @func: A function to be called
|
|
|
|
|
* @data: User data to be passed to the function.
|
|
|
|
|
*
|
|
|
|
|
* Calls @func on all expanded rows.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_map_expanded_rows (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewMappingFunc func,
|
2001-05-09 13:18:46 +00:00
|
|
|
|
gpointer user_data)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
2001-05-09 13:18:46 +00:00
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (func != NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-05-09 13:18:46 +00:00
|
|
|
|
path = gtk_tree_path_new_root ();
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_map_expanded_rows_helper (tree_view,
|
|
|
|
|
tree_view->priv->tree,
|
|
|
|
|
path, func, user_data);
|
|
|
|
|
|
|
|
|
|
gtk_tree_path_free (path);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-06-19 00:08:48 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_row_expanded:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @path: A #GtkTreePath to test expansion state.
|
|
|
|
|
*
|
|
|
|
|
* Returns TRUE if the node pointed to by @path is expanded in @tree_view.
|
|
|
|
|
*
|
|
|
|
|
* Return value: TRUE if #path is expanded.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_row_expanded (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path)
|
|
|
|
|
{
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
|
2001-06-20 23:21:46 +00:00
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
|
|
|
|
g_return_val_if_fail (path != NULL, FALSE);
|
2001-06-19 00:08:48 +00:00
|
|
|
|
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
|
|
|
|
|
|
|
|
|
|
if (node == NULL)
|
2001-06-20 23:21:46 +00:00
|
|
|
|
return FALSE;
|
2001-06-19 00:08:48 +00:00
|
|
|
|
|
|
|
|
|
return (node->children != NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
static GtkTargetEntry row_targets[] = {
|
|
|
|
|
{ "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
2001-06-24 15:34:48 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_reorderable:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
*
|
|
|
|
|
* Retrieves whether the user can reorder the tree via drag-and-drop. See
|
|
|
|
|
* gtk_tree_view_set_reorderable().
|
|
|
|
|
*
|
|
|
|
|
* Return value: %TRUE if the tree can be reordered.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_get_reorderable (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
|
|
|
|
|
|
|
|
|
return tree_view->priv->reorderable;
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_reorderable:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @reorderable: TRUE, if the tree can be reordered.
|
2001-06-07 00:07:32 +00:00
|
|
|
|
*
|
2001-05-16 00:23:30 +00:00
|
|
|
|
* This function is a convenience function to allow you to reorder models that
|
|
|
|
|
* support the #GtkDragSourceIface and the #GtkDragDestIface. Both
|
|
|
|
|
* #GtkTreeStore and #GtkListStore support these. If @reorderable is TRUE, then
|
|
|
|
|
* the user can reorder the model by dragging and dropping columns. The
|
|
|
|
|
* developer will can listen to these changes by connecting to the model's
|
|
|
|
|
* signals.
|
|
|
|
|
*
|
|
|
|
|
* This function does not give you any degree of control over the order -- any
|
|
|
|
|
* reorderering is allowed. If more control is needed, you should probably
|
|
|
|
|
* handle drag and drop manually.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_reorderable (GtkTreeView *tree_view,
|
|
|
|
|
gboolean reorderable)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->reorderable == (reorderable?TRUE:FALSE))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_set_rows_drag_source (tree_view,
|
|
|
|
|
GDK_BUTTON1_MASK,
|
|
|
|
|
row_targets,
|
|
|
|
|
G_N_ELEMENTS (row_targets),
|
|
|
|
|
GDK_ACTION_MOVE,
|
|
|
|
|
NULL, NULL);
|
|
|
|
|
gtk_tree_view_set_rows_drag_dest (tree_view,
|
|
|
|
|
row_targets,
|
|
|
|
|
G_N_ELEMENTS (row_targets),
|
|
|
|
|
GDK_ACTION_MOVE,
|
|
|
|
|
NULL, NULL);
|
|
|
|
|
|
|
|
|
|
g_object_notify (G_OBJECT (tree_view), "reorderable");
|
|
|
|
|
}
|
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
static void
|
2001-06-12 18:12:08 +00:00
|
|
|
|
gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
2001-06-20 23:21:46 +00:00
|
|
|
|
gboolean clear_and_select)
|
2001-06-08 22:59:37 +00:00
|
|
|
|
{
|
|
|
|
|
GtkRBTree *tree = NULL;
|
|
|
|
|
GtkRBNode *node = NULL;
|
2001-08-22 22:27:41 +00:00
|
|
|
|
GdkModifierType state = 0;
|
2001-06-08 22:59:37 +00:00
|
|
|
|
|
2001-06-20 23:21:46 +00:00
|
|
|
|
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *cursor_path;
|
|
|
|
|
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
|
|
|
|
gtk_tree_path_free (cursor_path);
|
|
|
|
|
}
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
|
|
|
|
|
2001-08-22 22:27:41 +00:00
|
|
|
|
gtk_get_current_event_state (&state);
|
|
|
|
|
|
2001-06-08 22:59:37 +00:00
|
|
|
|
tree_view->priv->cursor = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view),
|
|
|
|
|
tree_view->priv->model,
|
|
|
|
|
path);
|
|
|
|
|
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
|
|
|
|
|
if (tree == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
2001-08-22 22:27:41 +00:00
|
|
|
|
if (clear_and_select && !((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK))
|
2001-06-20 23:21:46 +00:00
|
|
|
|
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
|
|
|
|
|
node, tree, path,
|
2001-08-22 22:27:41 +00:00
|
|
|
|
state);
|
2001-06-08 22:59:37 +00:00
|
|
|
|
gtk_tree_view_clamp_node_visible (tree_view, tree, node);
|
|
|
|
|
gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_cursor:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @path: A #GtkTreePath
|
2001-06-11 16:59:28 +00:00
|
|
|
|
*
|
2001-06-12 18:12:08 +00:00
|
|
|
|
* Sets the current keyboard focus to be at @path, and selects it. This is
|
|
|
|
|
* useful when you want to focus the user's attention on a particular row. If
|
|
|
|
|
* you want to give the user keyboard focus in the tree_view, you should use
|
|
|
|
|
* this function to set the correct path, and gtk_widget_grab_focus (GTK_WIDGET
|
|
|
|
|
* (tree_view)) to actually give focus to the @tree_view.
|
2001-06-08 22:59:37 +00:00
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_cursor (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (path != NULL);
|
|
|
|
|
|
2001-06-20 23:21:46 +00:00
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, path, TRUE);
|
2001-06-08 22:59:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_path_at_pos:
|
|
|
|
|
* @tree_view: A #GtkTreeView.
|
|
|
|
|
* @window: The #GdkWindow to check against.
|
|
|
|
|
* @x: The x position to be identified.
|
|
|
|
|
* @y: The y position to be identified.
|
|
|
|
|
* @path: A pointer to a #GtkTreePath pointer to be filled in, or %NULL
|
|
|
|
|
* @column: A pointer to a #GtkTreeViewColumn pointer to be filled in, or %NULL
|
|
|
|
|
* @cell_x: A pointer where the X coordinate relative to the cell can be placed, or %NULL
|
|
|
|
|
* @cell_y: A pointer where the Y coordinate relative to the cell can be placed, or %NULL
|
|
|
|
|
*
|
|
|
|
|
* Finds the path at the point (@x, @y) relative to @window. If @window is
|
|
|
|
|
* NULL, then the point is found relative to the widget coordinates. This
|
|
|
|
|
* function is expected to be called after an event, with event->window being
|
|
|
|
|
* passed in as @window. It is primarily for things like popup menus. If @path
|
|
|
|
|
* is non-NULL, then it will be filled with the #GtkTreePath at that point.
|
|
|
|
|
* This path should be freed with #gtk_tree_path_free. If @column is non-NULL,
|
|
|
|
|
* then it will be filled with the column at that point. @cell_x and @cell_y
|
|
|
|
|
* return the coordinates relative to the cell background (i.e. the
|
|
|
|
|
* background_area passed to gtk_cell_renderer_render()). This function only
|
|
|
|
|
* works if @tree_view is realized.
|
|
|
|
|
*
|
|
|
|
|
* Return value: TRUE if a row exists at that coordinate.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_get_path_at_pos (GtkTreeView *tree_view,
|
|
|
|
|
GdkWindow *window,
|
|
|
|
|
gint x,
|
|
|
|
|
gint y,
|
|
|
|
|
GtkTreePath **path,
|
|
|
|
|
GtkTreeViewColumn **column,
|
|
|
|
|
gint *cell_x,
|
|
|
|
|
gint *cell_y)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
gint y_offset;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (tree_view != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (tree_view->priv->tree != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (tree_view->priv->bin_window != NULL, FALSE);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (window)
|
|
|
|
|
g_return_val_if_fail (window == tree_view->priv->bin_window, FALSE);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
*path = NULL;
|
|
|
|
|
if (column)
|
|
|
|
|
*column = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x > tree_view->priv->hadjustment->upper)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
return FALSE;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (x < 0 || y < 0)
|
2001-01-31 00:57:49 +00:00
|
|
|
|
return FALSE;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column || cell_x)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *tmp_column;
|
|
|
|
|
GtkTreeViewColumn *last_column = NULL;
|
|
|
|
|
GList *list;
|
|
|
|
|
gint remaining_x = x;
|
|
|
|
|
gboolean found = FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
|
|
|
|
{
|
|
|
|
|
tmp_column = list->data;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tmp_column->visible == FALSE)
|
|
|
|
|
continue;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
last_column = tmp_column;
|
|
|
|
|
if (remaining_x <= tmp_column->width)
|
|
|
|
|
{
|
|
|
|
|
found = TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column)
|
|
|
|
|
*column = tmp_column;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (cell_x)
|
|
|
|
|
*cell_x = remaining_x;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
remaining_x -= tmp_column->width;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!found)
|
|
|
|
|
{
|
|
|
|
|
if (column)
|
|
|
|
|
*column = last_column;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (cell_x)
|
|
|
|
|
*cell_x = last_column->width + remaining_x;
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (window)
|
|
|
|
|
{
|
|
|
|
|
y_offset = _gtk_rbtree_find_offset (tree_view->priv->tree,
|
|
|
|
|
TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, y),
|
|
|
|
|
&tree, &node);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (y < TREE_VIEW_HEADER_HEIGHT (tree_view))
|
|
|
|
|
return FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
y_offset = _gtk_rbtree_find_offset (tree_view->priv->tree,
|
|
|
|
|
TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, y + tree_view->priv->vadjustment->value),
|
|
|
|
|
&tree, &node);
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
return FALSE;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (cell_y)
|
|
|
|
|
*cell_y = y_offset;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
*path = _gtk_tree_view_find_path (tree_view, tree, node);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
return TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_cell_area:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @path: a #GtkTreePath for the row, or %NULL to get only horizontal coordinates
|
|
|
|
|
* @column: a #GtkTreeViewColumn for the column, or %NULL to get only vertical coordiantes
|
|
|
|
|
* @rect: rectangle to fill with cell rect
|
|
|
|
|
*
|
|
|
|
|
* Fills the bounding rectangle in tree window coordinates for the cell at the
|
|
|
|
|
* row specified by @path and the column specified by @column. If @path is
|
|
|
|
|
* %NULL, the y and height fields of the rectangle will be filled with 0. If
|
|
|
|
|
* @column is %NULL, the x and width fields will be filled with 0. The sum of
|
|
|
|
|
* all cell rects does not cover the entire tree; there are extra pixels in
|
|
|
|
|
* between rows, for example. The returned rectangle is equivalent to the
|
|
|
|
|
* @cell_area passed to gtk_cell_renderer_render(). This function is only valid
|
|
|
|
|
* if #tree_view is realized.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_get_cell_area (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeViewColumn *column,
|
|
|
|
|
GdkRectangle *rect)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBTree *tree = NULL;
|
|
|
|
|
GtkRBNode *node = NULL;
|
|
|
|
|
gint vertical_separator;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (column == NULL || GTK_IS_TREE_VIEW_COLUMN (column));
|
|
|
|
|
g_return_if_fail (rect != NULL);
|
2001-08-21 04:49:15 +00:00
|
|
|
|
g_return_if_fail (column->tree_view == (GtkWidget *) tree_view);
|
2001-08-21 03:53:13 +00:00
|
|
|
|
g_return_if_fail (GTK_WIDGET_REALIZED (tree_view));
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_style_get (GTK_WIDGET (tree_view), "vertical_separator", &vertical_separator, NULL);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
rect->x = 0;
|
|
|
|
|
rect->y = 0;
|
|
|
|
|
rect->width = 0;
|
|
|
|
|
rect->height = 0;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
{
|
|
|
|
|
/* Get vertical coords */
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_warning (G_STRLOC": no row corresponding to path");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Remember that the rbtree stores node height including the vertical
|
|
|
|
|
* separator, see comment at top of file.
|
|
|
|
|
*/
|
|
|
|
|
rect->y = CELL_FIRST_PIXEL (tree_view, tree, node, vertical_separator);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
rect->height = CELL_HEIGHT (node, vertical_separator);
|
|
|
|
|
}
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-08-21 03:53:13 +00:00
|
|
|
|
rect->x = column->button->allocation.x;
|
|
|
|
|
rect->width = column->button->allocation.width;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_background_area:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @path: a #GtkTreePath for the row, or %NULL to get only horizontal coordinates
|
|
|
|
|
* @column: a #GtkTreeViewColumn for the column, or %NULL to get only vertical coordiantes
|
|
|
|
|
* @rect: rectangle to fill with cell background rect
|
|
|
|
|
*
|
|
|
|
|
* Fills the bounding rectangle in tree window coordinates for the
|
|
|
|
|
* cell at the row specified by @path and the column specified by
|
|
|
|
|
* @column. If @path is %NULL, the y and height fields of the
|
|
|
|
|
* rectangle will be filled with 0. If @column is %NULL, the x and
|
|
|
|
|
* width fields will be filled with 0. The returned rectangle is
|
|
|
|
|
* equivalent to the @background_area passed to
|
|
|
|
|
* gtk_cell_renderer_render(). These background areas tile to cover
|
|
|
|
|
* the entire tree window (except for the area used for header
|
|
|
|
|
* buttons). Contrast with the cell_area, returned by
|
|
|
|
|
* gtk_tree_view_get_cell_area(), which returns only the cell itself,
|
|
|
|
|
* excluding surrounding borders and the tree expander area.
|
|
|
|
|
*
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_get_background_area (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeViewColumn *column,
|
|
|
|
|
GdkRectangle *rect)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkRBTree *tree = NULL;
|
|
|
|
|
GtkRBNode *node = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (column == NULL || GTK_IS_TREE_VIEW_COLUMN (column));
|
|
|
|
|
g_return_if_fail (rect != NULL);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
rect->x = 0;
|
|
|
|
|
rect->y = 0;
|
|
|
|
|
rect->width = 0;
|
|
|
|
|
rect->height = 0;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
{
|
|
|
|
|
/* Get vertical coords */
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_warning (G_STRLOC": no row corresponding to path");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
rect->y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
rect->height = BACKGROUND_HEIGHT (node);
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (column)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint x2 = 0;
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_get_background_xrange (tree_view, tree, column, &rect->x, &x2);
|
|
|
|
|
rect->width = x2 - rect->x;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_visible_rect:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @visible_rect: rectangle to fill
|
|
|
|
|
*
|
|
|
|
|
* Fills @visible_rect with the currently-visible region of the
|
|
|
|
|
* buffer, in tree coordinates. Convert to widget coordinates with
|
|
|
|
|
* gtk_tree_view_tree_to_widget_coords(). Tree coordinates start at
|
|
|
|
|
* 0,0 for row 0 of the tree, and cover the entire scrollable area of
|
|
|
|
|
* the tree.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_get_visible_rect (GtkTreeView *tree_view,
|
|
|
|
|
GdkRectangle *visible_rect)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
GtkWidget *widget;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
widget = GTK_WIDGET (tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (visible_rect)
|
|
|
|
|
{
|
|
|
|
|
visible_rect->x = tree_view->priv->hadjustment->value;
|
|
|
|
|
visible_rect->y = tree_view->priv->vadjustment->value;
|
|
|
|
|
visible_rect->width = widget->allocation.width;
|
|
|
|
|
visible_rect->height = widget->allocation.height - TREE_VIEW_HEADER_HEIGHT (tree_view);
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_widget_to_tree_coords:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @wx: widget X coordinate
|
|
|
|
|
* @wy: widget Y coordinate
|
|
|
|
|
* @tx: return location for tree X coordinate
|
|
|
|
|
* @ty: return location for tree Y coordinate
|
|
|
|
|
*
|
|
|
|
|
* Converts widget coordinates to coordinates for the
|
|
|
|
|
* tree window (the full scrollable area of the tree).
|
|
|
|
|
*
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_widget_to_tree_coords (GtkTreeView *tree_view,
|
|
|
|
|
gint wx,
|
|
|
|
|
gint wy,
|
|
|
|
|
gint *tx,
|
|
|
|
|
gint *ty)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tx)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*tx = wx + tree_view->priv->hadjustment->value;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
if (ty)
|
2001-01-27 00:50:38 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*ty = wy + tree_view->priv->vadjustment->value;
|
2001-01-27 00:50:38 +00:00
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_tree_to_widget_coords:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @tx: tree X coordinate
|
|
|
|
|
* @ty: tree Y coordinate
|
|
|
|
|
* @wx: return location for widget X coordinate
|
|
|
|
|
* @wy: return location for widget Y coordinate
|
|
|
|
|
*
|
|
|
|
|
* Converts tree coordinates (coordinates in full scrollable area of the tree)
|
|
|
|
|
* to widget coordinates.
|
|
|
|
|
*
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_tree_to_widget_coords (GtkTreeView *tree_view,
|
|
|
|
|
gint tx,
|
|
|
|
|
gint ty,
|
|
|
|
|
gint *wx,
|
|
|
|
|
gint *wy)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (wx)
|
|
|
|
|
{
|
|
|
|
|
*wx = tx - tree_view->priv->hadjustment->value;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (wy)
|
|
|
|
|
{
|
|
|
|
|
*wy = ty - tree_view->priv->vadjustment->value;
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_rows_drag_source (GtkTreeView *tree_view,
|
|
|
|
|
GdkModifierType start_button_mask,
|
|
|
|
|
const GtkTargetEntry *targets,
|
|
|
|
|
gint n_targets,
|
|
|
|
|
GdkDragAction actions,
|
|
|
|
|
GtkTreeViewDraggableFunc row_draggable_func,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
TreeViewDragInfo *di;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = ensure_info (tree_view);
|
|
|
|
|
clear_source_info (di);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di->start_button_mask = start_button_mask;
|
|
|
|
|
di->source_target_list = gtk_target_list_new (targets, n_targets);
|
|
|
|
|
di->source_actions = actions;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (row_draggable_func)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di->row_draggable_closure = g_cclosure_new ((GCallback) row_draggable_func,
|
|
|
|
|
user_data, NULL);
|
|
|
|
|
g_closure_ref (di->row_draggable_closure);
|
|
|
|
|
g_closure_sink (di->row_draggable_closure);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di->source_set = TRUE;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_rows_drag_dest (GtkTreeView *tree_view,
|
|
|
|
|
const GtkTargetEntry *targets,
|
|
|
|
|
gint n_targets,
|
|
|
|
|
GdkDragAction actions,
|
|
|
|
|
GtkTreeViewDroppableFunc location_droppable_func,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
TreeViewDragInfo *di;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_drag_dest_set (GTK_WIDGET (tree_view),
|
|
|
|
|
0,
|
|
|
|
|
NULL,
|
|
|
|
|
0,
|
|
|
|
|
actions);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = ensure_info (tree_view);
|
|
|
|
|
clear_dest_info (di);
|
2001-01-27 00:50:38 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (targets)
|
|
|
|
|
di->dest_target_list = gtk_target_list_new (targets, n_targets);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (location_droppable_func)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di->location_droppable_closure = g_cclosure_new ((GCallback) location_droppable_func,
|
|
|
|
|
user_data, NULL);
|
|
|
|
|
g_closure_ref (di->location_droppable_closure);
|
|
|
|
|
g_closure_sink (di->location_droppable_closure);
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di->dest_set = TRUE;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_unset_rows_drag_source (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
TreeViewDragInfo *di;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
|
|
|
|
|
|
|
|
|
if (di)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di->source_set)
|
|
|
|
|
{
|
|
|
|
|
clear_source_info (di);
|
|
|
|
|
di->source_set = FALSE;
|
|
|
|
|
}
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!di->dest_set && !di->source_set)
|
|
|
|
|
remove_info (tree_view);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_unset_rows_drag_dest (GtkTreeView *tree_view)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TreeViewDragInfo *di;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
di = get_info (tree_view);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (di->dest_set)
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_drag_dest_unset (GTK_WIDGET (tree_view));
|
|
|
|
|
clear_dest_info (di);
|
|
|
|
|
di->dest_set = FALSE;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!di->dest_set && !di->source_set)
|
|
|
|
|
remove_info (tree_view);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
}
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_drag_dest_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path,
|
|
|
|
|
GtkTreeViewDropPosition pos)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *current_dest;
|
|
|
|
|
/* Note; this function is exported to allow a custom DND
|
|
|
|
|
* implementation, so it can't touch TreeViewDragInfo
|
|
|
|
|
*/
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
current_dest = NULL;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->drag_dest_row)
|
|
|
|
|
current_dest = gtk_tree_row_reference_get_path (tree_view->priv->drag_dest_row);
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (current_dest)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, current_dest, NULL);
|
|
|
|
|
gtk_tree_path_free (current_dest);
|
|
|
|
|
}
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->drag_dest_row)
|
|
|
|
|
gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->drag_dest_pos = pos;
|
|
|
|
|
|
|
|
|
|
if (path)
|
2001-01-31 00:57:49 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->drag_dest_row =
|
|
|
|
|
gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, path);
|
|
|
|
|
gtk_tree_view_queue_draw_path (tree_view, path, NULL);
|
2001-01-31 00:57:49 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tree_view->priv->drag_dest_row = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_get_drag_dest_row (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath **path,
|
|
|
|
|
GtkTreeViewDropPosition *pos)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
if (path)
|
2001-01-31 00:57:49 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree_view->priv->drag_dest_row)
|
|
|
|
|
*path = gtk_tree_row_reference_get_path (tree_view->priv->drag_dest_row);
|
|
|
|
|
else
|
|
|
|
|
*path = NULL;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (pos)
|
|
|
|
|
*pos = tree_view->priv->drag_dest_pos;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_get_dest_row_at_pos (GtkTreeView *tree_view,
|
|
|
|
|
gint drag_x,
|
|
|
|
|
gint drag_y,
|
|
|
|
|
GtkTreePath **path,
|
|
|
|
|
GtkTreeViewDropPosition *pos)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gint cell_y;
|
|
|
|
|
gdouble offset_into_row;
|
|
|
|
|
gdouble quarter;
|
|
|
|
|
gint x, y;
|
|
|
|
|
GdkRectangle cell;
|
|
|
|
|
GtkTreeViewColumn *column = NULL;
|
|
|
|
|
GtkTreePath *tmp_path = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* Note; this function is exported to allow a custom DND
|
|
|
|
|
* implementation, so it can't touch TreeViewDragInfo
|
|
|
|
|
*/
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
g_return_val_if_fail (tree_view != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (drag_x >= 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (drag_y >= 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (tree_view->priv->bin_window != NULL, FALSE);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (path)
|
|
|
|
|
*path = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-05-16 00:23:30 +00:00
|
|
|
|
if (tree_view->priv->tree == NULL)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* remember that drag_x and drag_y are in widget coords, convert to tree window */
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_widget_to_tree_coords (tree_view, drag_x, drag_y,
|
|
|
|
|
&x, &y);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* If in the top quarter of a row, we drop before that row; if
|
|
|
|
|
* in the bottom quarter, drop after that row; if in the middle,
|
|
|
|
|
* and the row has children, drop into the row.
|
|
|
|
|
*/
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!gtk_tree_view_get_path_at_pos (tree_view,
|
|
|
|
|
tree_view->priv->bin_window,
|
|
|
|
|
x, y,
|
|
|
|
|
&tmp_path,
|
|
|
|
|
&column,
|
|
|
|
|
NULL,
|
|
|
|
|
&cell_y))
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
return FALSE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_tree_view_get_background_area (tree_view, tmp_path, column,
|
|
|
|
|
&cell);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
offset_into_row = cell_y;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
|
|
|
|
if (path)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
*path = tmp_path;
|
|
|
|
|
else
|
|
|
|
|
gtk_tree_path_free (tmp_path);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
tmp_path = NULL;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
quarter = cell.height / 4.0;
|
|
|
|
|
|
|
|
|
|
if (pos)
|
2001-01-19 22:39:19 +00:00
|
|
|
|
{
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (offset_into_row < quarter)
|
|
|
|
|
{
|
|
|
|
|
*pos = GTK_TREE_VIEW_DROP_BEFORE;
|
|
|
|
|
}
|
|
|
|
|
else if (offset_into_row < quarter * 2)
|
|
|
|
|
{
|
|
|
|
|
*pos = GTK_TREE_VIEW_DROP_INTO_OR_BEFORE;
|
|
|
|
|
}
|
|
|
|
|
else if (offset_into_row < quarter * 3)
|
|
|
|
|
{
|
|
|
|
|
*pos = GTK_TREE_VIEW_DROP_INTO_OR_AFTER;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*pos = GTK_TREE_VIEW_DROP_AFTER;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
|
|
|
|
return TRUE;
|
2001-01-19 22:39:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
/* KEEP IN SYNC WITH GTK_TREE_VIEW_BIN_EXPOSE */
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_create_row_drag_icon:
|
|
|
|
|
* @tree_view: a #GtkTreeView
|
|
|
|
|
* @path: a #GtkTreePath in @tree_view
|
2001-06-07 00:07:32 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Creates a GdkPixmap representation of the row at @path. This image is used
|
|
|
|
|
* for a drag icon.
|
2001-06-07 00:07:32 +00:00
|
|
|
|
*
|
2001-04-28 00:29:34 +00:00
|
|
|
|
* Return value: a newly allocatdd pixmap of the drag icon.
|
|
|
|
|
**/
|
|
|
|
|
GdkPixmap *
|
|
|
|
|
gtk_tree_view_create_row_drag_icon (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreePath *path)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
GtkRBTree *tree;
|
|
|
|
|
GtkRBNode *node;
|
|
|
|
|
gint cell_offset;
|
|
|
|
|
GList *list;
|
|
|
|
|
GdkRectangle background_area;
|
|
|
|
|
GtkWidget *widget;
|
|
|
|
|
gint depth;
|
|
|
|
|
/* start drawing inside the black outline */
|
|
|
|
|
gint x = 1, y = 1;
|
|
|
|
|
GdkDrawable *drawable;
|
|
|
|
|
gint bin_window_width;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
widget = GTK_WIDGET (tree_view);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
depth = gtk_tree_path_get_depth (path);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
_gtk_tree_view_find_node (tree_view,
|
|
|
|
|
path,
|
|
|
|
|
&tree,
|
|
|
|
|
&node);
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (tree == NULL)
|
|
|
|
|
return NULL;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!gtk_tree_model_get_iter (tree_view->priv->model,
|
|
|
|
|
&iter,
|
|
|
|
|
path))
|
|
|
|
|
return NULL;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
cell_offset = x;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
background_area.y = y;
|
|
|
|
|
background_area.height = BACKGROUND_HEIGHT (node);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_drawable_get_size (tree_view->priv->bin_window,
|
|
|
|
|
&bin_window_width, NULL);
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
drawable = gdk_pixmap_new (tree_view->priv->bin_window,
|
|
|
|
|
bin_window_width + 2,
|
|
|
|
|
background_area.height + 2,
|
|
|
|
|
-1);
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_draw_rectangle (drawable,
|
2001-06-27 23:44:53 +00:00
|
|
|
|
widget->style->base_gc [GTK_WIDGET_STATE (widget)],
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TRUE,
|
|
|
|
|
0, 0,
|
|
|
|
|
bin_window_width + 2,
|
|
|
|
|
background_area.height + 2);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gdk_draw_rectangle (drawable,
|
|
|
|
|
widget->style->black_gc,
|
|
|
|
|
FALSE,
|
|
|
|
|
0, 0,
|
|
|
|
|
bin_window_width + 1,
|
|
|
|
|
background_area.height + 1);
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
for (list = tree_view->priv->columns; list; list = list->next)
|
2001-04-28 00:29:34 +00:00
|
|
|
|
{
|
|
|
|
|
GtkTreeViewColumn *column = list->data;
|
|
|
|
|
GdkRectangle cell_area;
|
|
|
|
|
gint vertical_separator;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
if (!column->visible)
|
|
|
|
|
continue;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-08-19 04:19:56 +00:00
|
|
|
|
gtk_tree_view_column_cell_set_cell_data (column, tree_view->priv->model, &iter,
|
|
|
|
|
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
|
|
|
|
|
node->children?TRUE:FALSE);
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
background_area.x = cell_offset;
|
|
|
|
|
background_area.width = column->displayed_width;
|
adapt to handle PangoColor
2001-01-26 Havoc Pennington <hp@redhat.com>
* gtk/gtktextlayout.c (convert_color): adapt to handle PangoColor
* gtk/gtktreeview.c (gtk_tree_view_widget_to_tree_coords): fix to
not offset by TREE_VIEW_HEADER_HEIGHT
(gtk_tree_view_tree_to_widget_coords): fix to not offset by
TREE_VIEW_HEADER_HEIGHT
* configure.in (included_loaders): for me, --with-included-loaders
generates the error "the specified loader yes does not exist",
i.e. the arg defaults to "yes", so change test for value ""
to test for value "yes", and include all loaders in that case.
* gtk/gtkrbtree.c (_gtk_rbtree_get_depth): new function
* gtk/gtktreeview.c (gtk_tree_view_get_cell_rect): fix to properly
handle TREE_VIEW_VERTICAL_SEPARATOR
(gtk_tree_view_bin_expose): fix to consider the row offset as
pointing halfway into vertical separator.
(gtk_tree_view_draw_node_focus_rect): ditto
* gtk/gtkdebug.h, gtk/gtkmain.c (gtk_init_check): Add
--gtk-debug=updates, which causes gdk_window_set_debug_updates
(TRUE) to be called.
* gdk/gdkwindow.c (gdk_window_set_debug_updates): Allow enabling a
debug mode where the invalid region is colored in on invalidate,
so you can see the flicker and know whether your redraw code is
doing a good job.
* gtk/gtktreeview.c (gtk_tree_view_queue_draw_node): Work in
tree window coordinates (clip rect is in tree window coords)
* gtk/Makefile.am: add gtktreednd.[hc]
* gtk/gtkliststore.c: implement gtktreednd interfaces.
* gtk/gtktreednd.c, gtk/gtktreednd.h: New interface to support
drag-and-drop data operations on a model (so we can set up tree
drag-and-drop automatically)
* gtk/testgtk.c: Add a window to change sensitivity in the
GtkLabel test; add a way to change the entry frame in GtkEntry
test
* gtk/gtkentry.c (gtk_entry_set_has_frame):
(gtk_entry_get_has_frame): new functions to remove the frame
around an entry
(gtk_entry_size_request): shrink requisition if no frame
(gtk_entry_draw_focus): don't draw frame if no frame
* gtk/gtkstyle.c (gtk_default_draw_check): draw custom look for
checks inside a cell renderer
(gtk_default_draw_option): ditto for options
* gtk/gtktreeviewcolumn.c (update_button_contents): add/remove
children from the alignment, not the button
(gtk_tree_view_column_init): ref/sink the column, to emulate
GObject refcounting.
* gtk/gtkcellrenderer.c (gtk_cell_renderer_init): ref/sink
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render):
Use theme functions to draw the toggles
* gdk/gdkpango.c (gdk_pango_get_gc): use GdkRGB to alloc colors
* gdk/gdkpango.h, gdk/gdkpango.c: Add GdkPangoAttrStipple and
GdkPangoAttrEmbossed to use in rendering insensitive text
* gdk/gdkpango.c (gdk_draw_layout_line): render new properties
* gtk/gtkstyle.c (gtk_default_draw_layout): handle sensitivity
using new GDK features
2001-01-26 21:12:05 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
cell_area = background_area;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
gtk_widget_style_get (widget, "vertical_separator", &vertical_separator, NULL);
|
|
|
|
|
cell_area.y += vertical_separator / 2;
|
|
|
|
|
cell_area.height -= vertical_separator;
|
2001-03-09 00:40:18 +00:00
|
|
|
|
|
2001-06-29 03:11:01 +00:00
|
|
|
|
if (gtk_tree_view_is_expander_column (tree_view, column) &&
|
2001-04-28 00:29:34 +00:00
|
|
|
|
TREE_VIEW_DRAW_EXPANDERS(tree_view))
|
|
|
|
|
{
|
|
|
|
|
cell_area.x += depth * tree_view->priv->tab_offset;
|
|
|
|
|
cell_area.width -= depth * tree_view->priv->tab_offset;
|
|
|
|
|
}
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-06-27 23:44:53 +00:00
|
|
|
|
if (gtk_tree_view_column_cell_is_visible (column))
|
|
|
|
|
gtk_tree_view_column_cell_render (column,
|
|
|
|
|
drawable,
|
|
|
|
|
&background_area,
|
|
|
|
|
&cell_area,
|
|
|
|
|
NULL,
|
|
|
|
|
0);
|
2001-01-19 22:39:19 +00:00
|
|
|
|
|
2001-04-28 00:29:34 +00:00
|
|
|
|
cell_offset += column->displayed_width;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return drawable;
|
2001-01-31 00:57:49 +00:00
|
|
|
|
}
|
2001-04-28 00:29:34 +00:00
|
|
|
|
|
2001-06-26 17:01:53 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_destroy_count_func:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @func: Function to be called when a view row is destroyed, or NULL
|
|
|
|
|
* @data: User data to be passed to @func, or NULL
|
|
|
|
|
* @destroy: Destroy notifier for @data, or NULL
|
|
|
|
|
*
|
|
|
|
|
* This function should almost never be used. It is meant for private use by
|
2001-06-30 02:38:17 +00:00
|
|
|
|
* ATK for determining the number of visible children that are removed when the
|
|
|
|
|
* user collapses a row, or a row is deleted.
|
2001-06-26 17:01:53 +00:00
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_destroy_count_func (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeDestroyCountFunc func,
|
|
|
|
|
gpointer data,
|
|
|
|
|
GtkDestroyNotify destroy)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->destroy_count_destroy)
|
|
|
|
|
(* tree_view->priv->destroy_count_destroy) (tree_view->priv->destroy_count_data);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->destroy_count_func = func;
|
|
|
|
|
tree_view->priv->destroy_count_data = data;
|
|
|
|
|
tree_view->priv->destroy_count_destroy = destroy;
|
|
|
|
|
}
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Interactive search
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_enable_search:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @enable_search: %TRUE, if the user can search interactively
|
|
|
|
|
*
|
|
|
|
|
* If @enable_search is set, then the user can type in text to search through
|
|
|
|
|
* the tree interactively.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_enable_search (GtkTreeView *tree_view,
|
|
|
|
|
gboolean enable_search)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
tree_view->priv->enable_search = !!enable_search;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_enable_search:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
*
|
|
|
|
|
* Returns whether or not the tree allows interactive searching.
|
|
|
|
|
*
|
|
|
|
|
* Return value: whether or not to let the user search interactively
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
gtk_tree_view_get_enable_search (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
|
|
|
|
|
|
|
|
|
return tree_view->priv->enable_search;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_get_search_column:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
*
|
|
|
|
|
* Gets the column searched on by the interactive search code.
|
|
|
|
|
*
|
|
|
|
|
* Return value: the column the interactive search code searches in.
|
|
|
|
|
*/
|
|
|
|
|
gint
|
|
|
|
|
gtk_tree_view_get_search_column (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), 0);
|
|
|
|
|
|
|
|
|
|
return (tree_view->priv->search_column);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_search_column:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @column: the column to search in
|
|
|
|
|
*
|
|
|
|
|
* Sets @column as the column where the interactive search code should search
|
|
|
|
|
* in. Additionally, turns on interactive searching.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_search_column (GtkTreeView *tree_view,
|
|
|
|
|
gint column)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (column >= 0);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->search_column == column)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
tree_view->priv->search_column = column;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_search_get_search_equal_func:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
*
|
|
|
|
|
* Returns the compare function currently in use.
|
|
|
|
|
*
|
|
|
|
|
* Return value: the currently used compare function for the search code.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
GtkTreeViewSearchEqualFunc
|
|
|
|
|
gtk_tree_view_get_search_equal_func (GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
|
|
|
|
|
|
|
|
|
return tree_view->priv->search_equal_func;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gtk_tree_view_set_search_equal_func:
|
|
|
|
|
* @tree_view: A #GtkTreeView
|
|
|
|
|
* @compare_func: the compare function to use during the search
|
|
|
|
|
*
|
|
|
|
|
* Sets the compare function to use to search the TreeView.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gtk_tree_view_set_search_equal_func (GtkTreeView *tree_view,
|
|
|
|
|
GtkTreeViewSearchEqualFunc search_equal_func,
|
|
|
|
|
gpointer search_user_data,
|
|
|
|
|
GtkDestroyNotify search_destroy)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
g_return_if_fail (search_equal_func !=NULL);
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->search_destroy)
|
|
|
|
|
(* tree_view->priv->search_destroy) (tree_view->priv->search_user_data);
|
|
|
|
|
|
|
|
|
|
tree_view->priv->search_equal_func = search_equal_func;
|
|
|
|
|
tree_view->priv->search_user_data = search_user_data;
|
|
|
|
|
tree_view->priv->search_destroy = search_destroy;
|
|
|
|
|
if (tree_view->priv->search_equal_func == NULL)
|
|
|
|
|
tree_view->priv->search_equal_func = gtk_tree_view_search_equal_func;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_search_dialog_destroy (GtkWidget *search_dialog,
|
|
|
|
|
GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
/* remove data from tree_view */
|
|
|
|
|
gtk_object_remove_data (GTK_OBJECT (tree_view), "search-dialog");
|
|
|
|
|
|
|
|
|
|
gtk_widget_destroy (search_dialog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_search_position_func (GtkTreeView *tree_view,
|
|
|
|
|
GtkWidget *search_dialog)
|
|
|
|
|
{
|
|
|
|
|
gint tree_x, tree_y;
|
|
|
|
|
gint tree_width, tree_height;
|
|
|
|
|
GdkWindow *tree_window = GTK_WIDGET (tree_view)->window;
|
|
|
|
|
GtkRequisition requisition;
|
|
|
|
|
|
|
|
|
|
/* put window in the lower right corner */
|
|
|
|
|
gdk_window_get_origin (tree_window, &tree_x, &tree_y);
|
|
|
|
|
gdk_window_get_size (tree_window,
|
|
|
|
|
&tree_width,
|
|
|
|
|
&tree_height);
|
|
|
|
|
gtk_widget_size_request (search_dialog, &requisition);
|
|
|
|
|
gtk_window_move (GTK_WINDOW (search_dialog),
|
|
|
|
|
tree_x + tree_width - requisition.width,
|
|
|
|
|
tree_y + tree_height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_interactive_search (GtkTreeView *tree_view,
|
|
|
|
|
GdkEventKey *event)
|
|
|
|
|
{
|
|
|
|
|
GtkWidget *window;
|
|
|
|
|
GtkWidget *entry;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
switch (event->keyval)
|
|
|
|
|
{
|
|
|
|
|
case GDK_Shift_L:
|
|
|
|
|
case GDK_Shift_R:
|
|
|
|
|
case GDK_Control_L:
|
|
|
|
|
case GDK_Control_R:
|
|
|
|
|
case GDK_Caps_Lock:
|
|
|
|
|
case GDK_Shift_Lock:
|
|
|
|
|
case GDK_Meta_L:
|
|
|
|
|
case GDK_Meta_R:
|
|
|
|
|
case GDK_Alt_L:
|
|
|
|
|
case GDK_Alt_R:
|
|
|
|
|
case GDK_Super_L:
|
|
|
|
|
case GDK_Super_R:
|
|
|
|
|
case GDK_Hyper_L:
|
|
|
|
|
case GDK_Hyper_R:
|
|
|
|
|
case GDK_Mode_switch:
|
|
|
|
|
return;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tree_view->priv->enable_search == FALSE ||
|
|
|
|
|
tree_view->priv->search_column < 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* set up window */
|
|
|
|
|
window = gtk_window_new (GTK_WINDOW_POPUP);
|
|
|
|
|
gtk_window_set_title (GTK_WINDOW (window), "search dialog");
|
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (window), 3);
|
|
|
|
|
gtk_window_set_modal (GTK_WINDOW (window), TRUE);
|
|
|
|
|
gtk_signal_connect
|
|
|
|
|
(GTK_OBJECT (window), "delete_event",
|
|
|
|
|
GTK_SIGNAL_FUNC (gtk_tree_view_search_delete_event),
|
|
|
|
|
tree_view);
|
|
|
|
|
gtk_signal_connect
|
|
|
|
|
(GTK_OBJECT (window), "key_press_event",
|
|
|
|
|
GTK_SIGNAL_FUNC (gtk_tree_view_search_key_press_event),
|
|
|
|
|
tree_view);
|
|
|
|
|
gtk_signal_connect
|
|
|
|
|
(GTK_OBJECT (window), "button_press_event",
|
|
|
|
|
GTK_SIGNAL_FUNC (gtk_tree_view_search_button_press_event),
|
|
|
|
|
tree_view);
|
|
|
|
|
|
|
|
|
|
/* add entry */
|
|
|
|
|
entry = gtk_entry_new ();
|
|
|
|
|
gtk_widget_show (entry);
|
|
|
|
|
gtk_signal_connect
|
|
|
|
|
(GTK_OBJECT (entry), "changed",
|
|
|
|
|
GTK_SIGNAL_FUNC (gtk_tree_view_search_init),
|
|
|
|
|
tree_view);
|
|
|
|
|
gtk_container_add (GTK_CONTAINER (window), entry);
|
|
|
|
|
|
|
|
|
|
/* done, show it */
|
|
|
|
|
tree_view->priv->search_dialog_position_func (tree_view, window);
|
|
|
|
|
gtk_widget_show_all (window);
|
|
|
|
|
gtk_widget_grab_focus (entry);
|
|
|
|
|
|
|
|
|
|
gtk_widget_event (entry, (GdkEvent *) event);
|
|
|
|
|
|
|
|
|
|
/* position window */
|
|
|
|
|
|
|
|
|
|
gtk_object_set_data (GTK_OBJECT (window), "text",
|
|
|
|
|
gtk_entry_get_text (GTK_ENTRY (entry)));
|
|
|
|
|
gtk_object_set_data (GTK_OBJECT (tree_view), "search-dialog", window);
|
|
|
|
|
|
|
|
|
|
/* search first matching iter */
|
|
|
|
|
gtk_tree_view_search_init (entry, tree_view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_search_delete_event (GtkWidget *widget,
|
|
|
|
|
GdkEventAny *event,
|
|
|
|
|
GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_search_dialog_destroy (widget, tree_view);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_search_button_press_event (GtkWidget *widget,
|
|
|
|
|
GdkEventButton *event,
|
|
|
|
|
GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
|
|
|
|
|
|
|
|
|
gtk_tree_view_search_dialog_destroy (widget, tree_view);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_search_key_press_event (GtkWidget *widget,
|
|
|
|
|
GdkEventKey *event,
|
|
|
|
|
GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
|
|
|
|
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
|
|
|
|
|
|
|
|
|
|
/* close window */
|
|
|
|
|
if (event->keyval == GDK_Escape || event->keyval == GDK_Return
|
|
|
|
|
|| event->keyval == GDK_Tab)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_search_dialog_destroy (widget, tree_view);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* select previous matching iter */
|
|
|
|
|
if (event->keyval == GDK_Up)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_search_move (widget,
|
|
|
|
|
tree_view,
|
|
|
|
|
TRUE);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* select next matching iter */
|
|
|
|
|
if (event->keyval == GDK_Down)
|
|
|
|
|
{
|
|
|
|
|
gtk_tree_view_search_move (widget,
|
|
|
|
|
tree_view,
|
|
|
|
|
FALSE);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_search_move (GtkWidget *window,
|
|
|
|
|
GtkTreeView *tree_view,
|
|
|
|
|
gboolean up)
|
|
|
|
|
{
|
|
|
|
|
gboolean ret;
|
|
|
|
|
gint *selected_iter;
|
|
|
|
|
gint len;
|
|
|
|
|
gint count = 0;
|
|
|
|
|
gchar *text;
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
GtkTreeModel *model;
|
|
|
|
|
GtkTreeSelection *selection;
|
|
|
|
|
|
|
|
|
|
text = gtk_object_get_data (GTK_OBJECT (window), "text");
|
|
|
|
|
selected_iter = gtk_object_get_data (GTK_OBJECT (window), "selected-iter");
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (text != NULL);
|
|
|
|
|
|
|
|
|
|
if (!selected_iter || (up && *selected_iter == 1))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
len = strlen (text);
|
|
|
|
|
|
|
|
|
|
if (len < 1)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
model = gtk_tree_view_get_model (tree_view);
|
|
|
|
|
selection = gtk_tree_view_get_selection (tree_view);
|
|
|
|
|
|
|
|
|
|
/* search */
|
|
|
|
|
gtk_tree_selection_unselect_all (selection);
|
|
|
|
|
gtk_tree_model_get_iter_root (model, &iter);
|
|
|
|
|
|
|
|
|
|
ret = gtk_tree_view_search_iter (model, selection, &iter, text,
|
|
|
|
|
&count, up?((*selected_iter) - 1):((*selected_iter + 1)));
|
|
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
|
/* found */
|
|
|
|
|
*selected_iter += up?(-1):(1);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* return to old iter */
|
|
|
|
|
count = 0;
|
|
|
|
|
gtk_tree_model_get_iter_root (model, &iter);
|
|
|
|
|
gtk_tree_view_search_iter (model, selection,
|
|
|
|
|
&iter, text,
|
|
|
|
|
&count, *selected_iter);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_search_equal_func (GtkTreeModel *model,
|
|
|
|
|
gint column,
|
|
|
|
|
gchar *key,
|
|
|
|
|
GtkTreeIter *iter)
|
|
|
|
|
{
|
|
|
|
|
gboolean retval = TRUE;
|
|
|
|
|
gchar *normalized_string;
|
|
|
|
|
gchar *normalized_key;
|
|
|
|
|
gchar *case_normalized_string;
|
|
|
|
|
gchar *case_normalized_key;
|
|
|
|
|
GValue value = {0,};
|
|
|
|
|
gint key_len;
|
|
|
|
|
|
|
|
|
|
gtk_tree_model_get_value (model, iter, column, &value);
|
2001-08-18 00:07:42 +00:00
|
|
|
|
normalized_string = g_utf8_normalize (g_value_get_string (&value), -1, G_NORMALIZE_ALL);
|
|
|
|
|
normalized_key = g_utf8_normalize (key, -1, G_NORMALIZE_ALL);
|
|
|
|
|
case_normalized_string = g_utf8_casefold (normalized_string, -1);
|
|
|
|
|
case_normalized_key = g_utf8_casefold (normalized_key, -1);
|
Add heavily modified patch from Kristian Rietveld to handle interactive
Fri Aug 17 19:30:14 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeprivate.h:
* gtk/gtktreeview.c: (gtk_tree_view_class_init),
(gtk_tree_view_init), (gtk_tree_view_set_property),
(gtk_tree_view_get_property), (gtk_tree_view_destroy),
(gtk_tree_view_key_press), (gtk_tree_view_leave_notify),
(gtk_tree_view_focus_out), (gtk_tree_view_set_model),
(gtk_tree_view_set_destroy_count_func),
(gtk_tree_view_set_enable_search),
(gtk_tree_view_get_enable_search),
(gtk_tree_view_get_search_column),
(gtk_tree_view_set_search_column),
(gtk_tree_view_get_search_equal_func),
(gtk_tree_view_set_search_equal_func),
(gtk_tree_view_search_dialog_destroy),
(gtk_tree_view_search_position_func),
(gtk_tree_view_interactive_search),
(gtk_tree_view_search_delete_event),
(gtk_tree_view_search_button_press_event),
(gtk_tree_view_search_key_press_event),
(gtk_tree_view_search_move), (gtk_tree_view_search_equal_func),
(gtk_tree_view_search_iter), (gtk_tree_view_search_init):
* gtk/gtktreeview.h:
Add heavily modified patch from Kristian Rietveld to handle
interactive searching.
2001-08-17 23:35:52 +00:00
|
|
|
|
|
|
|
|
|
key_len = strlen (case_normalized_key);
|
|
|
|
|
|
|
|
|
|
if (!strncmp (case_normalized_key, case_normalized_string, key_len))
|
|
|
|
|
retval = FALSE;
|
|
|
|
|
|
|
|
|
|
g_value_unset (&value);
|
|
|
|
|
g_free (normalized_key);
|
|
|
|
|
g_free (normalized_string);
|
|
|
|
|
g_free (case_normalized_key);
|
|
|
|
|
g_free (case_normalized_string);
|
|
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
gtk_tree_view_search_iter (GtkTreeModel *model,
|
|
|
|
|
GtkTreeSelection *selection,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gchar *text,
|
|
|
|
|
gint *count,
|
|
|
|
|
gint n)
|
|
|
|
|
{
|
|
|
|
|
GtkTreeView *tree_view = gtk_tree_selection_get_tree_view (selection);
|
|
|
|
|
GtkTreeViewColumn *column =
|
|
|
|
|
gtk_tree_view_get_column (tree_view, tree_view->priv->search_column);
|
|
|
|
|
|
|
|
|
|
if (! tree_view->priv->search_equal_func (model, tree_view->priv->search_column, text, iter))
|
|
|
|
|
{
|
|
|
|
|
(*count)++;
|
|
|
|
|
|
|
|
|
|
if (*count == n)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
|
|
|
|
|
gtk_tree_selection_select_iter (selection, iter);
|
|
|
|
|
|
|
|
|
|
path = gtk_tree_model_get_path (model, iter);
|
|
|
|
|
gtk_tree_view_scroll_to_cell (tree_view, path, column, 0.5, 0.5);
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, path, FALSE);
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gtk_tree_model_iter_has_child (model, iter))
|
|
|
|
|
{
|
|
|
|
|
gboolean ret;
|
|
|
|
|
GtkTreeIter child;
|
|
|
|
|
|
|
|
|
|
gtk_tree_model_iter_children (model, &child, iter);
|
|
|
|
|
ret = gtk_tree_view_search_iter (model, selection,
|
|
|
|
|
&child, text,
|
|
|
|
|
count, n);
|
|
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
|
return TRUE; /* iter found and selected */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (gtk_tree_model_iter_next (model, iter))
|
|
|
|
|
{
|
|
|
|
|
if (! tree_view->priv->search_equal_func (model, tree_view->priv->search_column, text, iter))
|
|
|
|
|
{
|
|
|
|
|
(*count)++;
|
|
|
|
|
if (*count == n)
|
|
|
|
|
{
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
|
|
|
|
|
gtk_tree_selection_select_iter (selection, iter);
|
|
|
|
|
|
|
|
|
|
path = gtk_tree_model_get_path (model, iter);
|
|
|
|
|
gtk_tree_view_scroll_to_cell (tree_view, path, column, 0.5, 0.5);
|
|
|
|
|
gtk_tree_view_real_set_cursor (tree_view, path, FALSE);
|
|
|
|
|
gtk_tree_path_free (path);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gtk_tree_model_iter_has_child (model, iter))
|
|
|
|
|
{
|
|
|
|
|
gboolean ret;
|
|
|
|
|
GtkTreeIter child;
|
|
|
|
|
|
|
|
|
|
gtk_tree_model_iter_children (model, &child, iter);
|
|
|
|
|
ret = gtk_tree_view_search_iter (model, selection,
|
|
|
|
|
&child, text,
|
|
|
|
|
count, n);
|
|
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
|
return TRUE; /* iter found and selected */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gtk_tree_view_search_init (GtkWidget *entry,
|
|
|
|
|
GtkTreeView *tree_view)
|
|
|
|
|
{
|
|
|
|
|
gint ret;
|
|
|
|
|
gint *selected_iter;
|
|
|
|
|
gint len;
|
|
|
|
|
gint count = 0;
|
|
|
|
|
gchar *text;
|
|
|
|
|
GtkWidget *window;
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
GtkTreeModel *model;
|
|
|
|
|
GtkTreeSelection *selection;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GTK_IS_ENTRY (entry));
|
|
|
|
|
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
|
|
|
|
|
|
|
|
|
window = gtk_widget_get_parent (entry);
|
|
|
|
|
text = gtk_entry_get_text (GTK_ENTRY (entry));
|
|
|
|
|
len = strlen (text);
|
|
|
|
|
model = gtk_tree_view_get_model (tree_view);
|
|
|
|
|
selection = gtk_tree_view_get_selection (tree_view);
|
|
|
|
|
|
|
|
|
|
/* search */
|
|
|
|
|
gtk_tree_selection_unselect_all (selection);
|
|
|
|
|
selected_iter = gtk_object_get_data (GTK_OBJECT (window), "selected-iter");
|
|
|
|
|
if (selected_iter)
|
|
|
|
|
g_free (selected_iter);
|
|
|
|
|
gtk_object_remove_data (GTK_OBJECT (window), "selected-iter");
|
|
|
|
|
|
|
|
|
|
if (len < 1)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
gtk_tree_model_get_iter_root (model, &iter);
|
|
|
|
|
|
|
|
|
|
ret = gtk_tree_view_search_iter (model, selection,
|
|
|
|
|
&iter, text,
|
|
|
|
|
&count, 1);
|
|
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
|
{
|
|
|
|
|
selected_iter = g_malloc (sizeof (int));
|
|
|
|
|
*selected_iter = 1;
|
|
|
|
|
gtk_object_set_data (GTK_OBJECT (window), "selected-iter",
|
|
|
|
|
selected_iter);
|
|
|
|
|
}
|
|
|
|
|
}
|