[Fwd: Re: GtkTreeView and scroll bar]
- From: Javier Fernandez <jfernandez igalia com>
- To: gtk-app-devel <gtk-app-devel-list gnome org>
- Subject: [Fwd: Re: GtkTreeView and scroll bar]
- Date: Thu, 01 Apr 2004 11:32:03 +0200
-- 
Javier Fernandez <jfernandez igalia com>
Igalia
--- Begin Message ---
- From: Javier Fernandez <jfernandez igalia com>
- To: Federico Mena Quintero <federico ximian com>
- Subject: Re: GtkTreeView and scroll bar
- Date: Tue, 23 Mar 2004 09:17:55 +0100
El vie, 19-03-2004 a las 20:27, Federico Mena Quintero escribiÃ:
Hi, Federico
Tkanks for your attention.
If you use a GtkListStore or GtkTreeStore as your data model, you may be
able to just use gtk_tree_view_enable_model_drag_source() and
gtk_tree_view_enable_model_drag_dest() to enable automatic
drag-and-drop.  You may also need to do this:
I have define a widget that is subclass of GtkTreeView.
The instance_init method of this class, initialize drag&drop functions :
static void 
_f_widget_article_management_tree_view_init(FWidgetArticleManagementTreeView *f_tree, 
                                            FWidgetArticleManagementTreeViewClass *klass)
{
  GtkTreeView *treeview = GTK_TREE_VIEW(f_tree);
  GtkTreeSelection *select;
  f_tree->num_columns = 0;
  f_tree->column_ids = NULL;
  
  /* Enable drag and drop */
  gtk_tree_view_enable_model_drag_source (treeview,
                                          GDK_BUTTON1_MASK,
                                          row_targets,
                                          G_N_ELEMENTS (row_targets),
                                          GDK_ACTION_MOVE);
  gtk_tree_view_enable_model_drag_dest (treeview,
                                        row_targets,
                                        G_N_ELEMENTS (row_targets),
                                        GDK_ACTION_MOVE);
1. Create a derived class from GtkListStore or GtkTreeStore
I've create a FWidgetArticleManagementTreeViewModel class, that is 
a subclass of GtkTreeStore.
GType f_widget_article_management_tree_view_model_get_type(void)
{
  static GType type = 0;
  
  if (type == 0){
    static const GTypeInfo info = {
      sizeof (FWidgetArticleManagementTreeViewModelClass),
      NULL, /* base_init */
      NULL, /* base_finalize */
      (GClassInitFunc) _f_widget_article_management_tree_view_model_class_init,
      NULL, /* class_finalize */
      NULL, /* class_data */
      sizeof (FWidgetArticleManagementTreeViewModel),
      16,   /* n_preallocs */
      (GInstanceInitFunc) _f_widget_article_management_tree_view_model_init,
      NULL
    };
    static const GInterfaceInfo drag_source_info = {
      (GInterfaceInitFunc) _f_widget_article_management_tree_view_model_drag_source_init,
      NULL,
      NULL
    };
    
    static const GInterfaceInfo drag_dest_info = {
      (GInterfaceInitFunc)  _f_widget_article_management_tree_view_model_drag_dest_init,
      NULL,
      NULL
    };
    type = g_type_register_static (GTK_TYPE_TREE_STORE, 
                                   "FWidgetArticleManagementTreeViewModel", 
                                   &info, 
                                   (GTypeFlags) 0);
    g_type_add_interface_static (type,
                                 GTK_TYPE_TREE_DRAG_SOURCE,
                                 &drag_source_info);
    g_type_add_interface_static (type,
                                 GTK_TYPE_TREE_DRAG_DEST,
                                 &drag_dest_info);
  }
  else type = g_type_from_name ("FWidgetArticleManagementTreeViewModel");
  
  return type;
}
2. Create your own custom implementations of GtkTreeDragSourceIface or
GtkTreeDragDestIface, overriding the default ones.
I,ve  overriding this methods :
static void
_f_widget_article_management_tree_view_model_drag_source_init (GtkTreeDragSourceIface *iface)
{
  iface->drag_data_get =  _f_widget_article_management_tree_view_model_drag_data_get;
  iface->drag_data_delete =  _f_widget_article_management_tree_view_model_drag_data_delete;
}
static void
_f_widget_article_management_tree_view_model_drag_dest_init (GtkTreeDragDestIface *iface)
{
  iface->drag_data_received =  _f_widget_article_management_tree_view_model_drag_data_received;
  iface->row_drop_possible =  _f_widget_article_management_tree_view_model_row_drop_possible;
}
If you use gtk_tree_view_enable_model_drag_dest(), then the tree will be
scrolled automatically when you drag over it.
I thought that, but my treeview does not change scroll bar on drag&drop
operations.  
If this doesn't fit your needs, you have to handle the GtkWidget
drag-and-drop signals yourself.  GtkTreeView has some helper functions
that you can use to figure out the destination row and such; see
gtk_tree_view_get_dest_row_at_pos(), for example.  Scrolling by hand is
more complicated; you should look at the GtkTreeView sources to see how
it's done.
Triying to solve this, i've connect 
g_signal_connect (sections_widget, 
                  "drag_motion",
                  G_CALLBACK
(_f_warehouse_controller_article_management_on_drag_motion),
                  controller);
This function try tu move the scroll bar when drag_motion signal has
been emited. I use 
gtk_tree_view_scroll_to_point(treeview, 5, -1);
however the sroll bar does not move.
I don't know how is the problem. The drag&drop operations were performed
fine. The only problem is the scroll bar. 
Have you got an idea what's may be the problem ?
Thanks.
--
Javier Fernandez <jfernandez igalia com>
Igalia
--- End Message ---
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]