]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement selection API and events
authorRobert Roebling <robert@roebling.de>
Sun, 19 Aug 2007 22:57:13 +0000 (22:57 +0000)
committerRobert Roebling <robert@roebling.de>
Sun, 19 Aug 2007 22:57:13 +0000 (22:57 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48209 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/dataview/dataview.cpp
src/gtk/dataview.cpp

index 1f0708a56a84fdae868e9132198cab76569b9dfd..694cb30d8b1ee5dd9b9d72d7fd82f1b0dae9fccd 100644 (file)
@@ -429,6 +429,7 @@ public:
     void OnExpanded( wxDataViewEvent &event );
     void OnCollapsing( wxDataViewEvent &event );
     void OnCollapsed( wxDataViewEvent &event );
+    void OnSelected( wxDataViewEvent &event );
     
     void OnHeaderClick( wxDataViewEvent &event );
     void OnHeaderRightClick( wxDataViewEvent &event );
@@ -464,7 +465,7 @@ bool MyApp::OnInit(void)
 
     // build the first frame
     MyFrame *frame = 
-        new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 700, 440);
+        new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 40, 40, 700, 440);
     frame->Show(true);
 
     SetTopWindow(frame);
@@ -516,6 +517,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_DATAVIEW_ITEM_EXPANDED(ID_MUSIC_CTRL, MyFrame::OnExpanded)
     EVT_DATAVIEW_ITEM_COLLAPSING(ID_MUSIC_CTRL, MyFrame::OnCollapsing)
     EVT_DATAVIEW_ITEM_COLLAPSED(ID_MUSIC_CTRL, MyFrame::OnCollapsed)
+    EVT_DATAVIEW_ITEM_SELECTED(ID_MUSIC_CTRL, MyFrame::OnSelected)
     
     EVT_DATAVIEW_COLUMN_HEADER_CLICK(ID_MUSIC_CTRL, MyFrame::OnHeaderClick)
     EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(ID_MUSIC_CTRL, MyFrame::OnHeaderRightClick)
@@ -669,6 +671,14 @@ void MyFrame::OnActivated( wxDataViewEvent &event )
     wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, Item Id: %d;  Column: %d", event.GetItem().GetID(), event.GetColumn());
 }
 
+void MyFrame::OnSelected( wxDataViewEvent &event )
+{
+    if(!m_log)
+        return;
+
+    wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED, Item Id: %d", event.GetItem().GetID() );
+}
+
 void MyFrame::OnExpanding( wxDataViewEvent &event )
 {
     if (!m_log)
index e9850d0bbe926f70f6da3e37be0986b75e15b3ac..c74207cd42464426eea0a1d9b67566afeb78a4d3 100644 (file)
@@ -632,7 +632,7 @@ void     wxgtk_tree_model_set_sort_column_id  (GtkTreeSortable        *sortable,
 
     wxDataViewCtrl *dv = tree_model->internal->GetOwner();    
     wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, dv->GetId() );
-    // event.SetDataViewColumn( column );
+    // TODO event.SetDataViewColumn( column );
     event.SetModel( dv->GetModel() );
     dv->GetEventHandler()->ProcessEvent( event );
 }
@@ -2720,7 +2720,7 @@ wxdataview_selection_changed_callback( GtkTreeSelection* selection, wxDataViewCt
         return;
 
     wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED, dv->GetId() );
-    // TODO: item
+    event.SetItem( dv->GetSelection() );
     event.SetModel( dv->GetModel() );
     dv->GetEventHandler()->ProcessEvent( event );
 }
@@ -2995,6 +2995,22 @@ wxDataViewItem wxDataViewCtrl::GetSelection()
     
     if (m_windowStyle & wxDV_MULTIPLE)
     {
+        // Report the first one
+        GtkTreeModel *model;
+        GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+    
+        if (list)
+        {
+            GtkTreePath *path = (GtkTreePath*) list->data;
+            GtkTreeIter iter;
+            m_internal->get_iter( &iter, path );
+            
+            // delete list
+            g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
+            g_list_free( list );
+            
+            return wxDataViewItem( (void*) iter.user_data );
+        }
     }
     else
     {
@@ -3011,32 +3027,124 @@ wxDataViewItem wxDataViewCtrl::GetSelection()
 
 int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const
 {
+    sel.Clear();
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    if (HasFlag(wxDV_MULTIPLE))
+    {
+        GtkTreeModel *model;
+        GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+
+        int count = 0;
+        while (list)
+        {
+            GtkTreePath *path = (GtkTreePath*) list->data;
+            
+            GtkTreeIter iter;
+            m_internal->get_iter( &iter, path );
+
+            sel.Add( wxDataViewItem( (void*) iter.user_data ) );
+
+            list = g_list_next( list );
+            count++;
+        }
+
+        // delete list
+        g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
+        g_list_free( list );
+
+        return count;
+    }
+    else
+    {
+        GtkTreeModel *model;
+        GtkTreeIter iter;
+        gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+        if (has_selection)
+        {
+            sel.Add( wxDataViewItem( (void*) iter.user_data) );
+            return 1;
+        }
+    }
+
     return 0;
 }
 
 void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel )
 {
+    GtkDisableSelectionEvents();
+    
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+    gtk_tree_selection_unselect_all( selection );
+    
+    size_t i;
+    for (i = 0; i < sel.GetCount(); i++)
+    {
+        GtkTreeIter iter;
+        iter.user_data = (gpointer) sel[i].GetID();
+        gtk_tree_selection_select_iter( selection, &iter );
+    }
+    
+    GtkEnableSelectionEvents();
 }
 
 void wxDataViewCtrl::Select( const wxDataViewItem & item )
 {
+    GtkDisableSelectionEvents();
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+    GtkTreeIter iter;
+    iter.user_data = (gpointer) item.GetID();
+    gtk_tree_selection_select_iter( selection, &iter );
+
+    GtkEnableSelectionEvents();
 }
 
 void wxDataViewCtrl::Unselect( const wxDataViewItem & item )
 {
+    GtkDisableSelectionEvents();
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+    GtkTreeIter iter;
+    iter.user_data = (gpointer) item.GetID();
+    gtk_tree_selection_unselect_iter( selection, &iter );
+
+    GtkEnableSelectionEvents();
 }
 
 bool wxDataViewCtrl::IsSelected( const wxDataViewItem & item ) const
 {
-    return false;
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+    GtkTreeIter iter;
+    iter.user_data = (gpointer) item.GetID();
+    
+    return gtk_tree_selection_iter_is_selected( selection, &iter );
 }
 
 void wxDataViewCtrl::SelectAll()
 {
+    GtkDisableSelectionEvents();
+    
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    
+    gtk_tree_selection_select_all( selection );
+    
+    GtkEnableSelectionEvents();
 }
 
 void wxDataViewCtrl::UnselectAll()
 {
+    GtkDisableSelectionEvents();
+    
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    
+    gtk_tree_selection_unselect_all( selection );
+    
+    GtkEnableSelectionEvents();
 }
 
 void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, wxDataViewColumn *column )
@@ -3059,15 +3167,15 @@ void wxDataViewCtrl::DoSetIndent()
 void wxDataViewCtrl::GtkDisableSelectionEvents()
 {
     GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
-    g_signal_connect_after (selection, "changed",
-                            G_CALLBACK (wxdataview_selection_changed_callback), this);
+    g_signal_handlers_disconnect_by_func( selection,
+                            (gpointer) (wxdataview_selection_changed_callback), this);
 }
 
 void wxDataViewCtrl::GtkEnableSelectionEvents()
 {
     GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
-    g_signal_handlers_disconnect_by_func( selection,
-                            (gpointer) (wxdataview_selection_changed_callback), this);
+    g_signal_connect_after (selection, "changed",
+                            G_CALLBACK (wxdataview_selection_changed_callback), this);
 }
 
 // static