void wxListBox::DoSetSelection( int n, bool select ) { wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); wxGtkEventsDisabler<wxListBox> noEvents(this); GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview); // passing -1 to SetSelection() is documented to deselect all items if ( n == wxNOT_FOUND ) { gtk_tree_selection_unselect_all(selection); return; } wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetSelection") ); GtkTreeIter iter; wxCHECK_RET( GTKGetIteratorFor(n, &iter), wxT("Invalid index") ); if (select) gtk_tree_selection_select_iter(selection, &iter); else gtk_tree_selection_unselect_iter(selection, &iter); wxGtkTreePath path( gtk_tree_model_get_path(GTK_TREE_MODEL(m_liststore), &iter)); gtk_tree_view_scroll_to_cell(m_treeview, path, NULL, FALSE, 0.0f, 0.0f); }
// get GtkTreeEntry from position (note: you need to g_unref it if valid) wxTreeEntry* wxListBox::GTKGetEntry(unsigned n) const { GtkTreeIter iter; if ( !GTKGetIteratorFor(n, &iter) ) return NULL; return GetEntry(m_liststore, &iter, this); }
bool wxListBox::IsSelected( int n ) const { wxCHECK_MSG( m_treeview != NULL, false, wxT("invalid listbox") ); GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview); GtkTreeIter iter; wxCHECK_MSG( GTKGetIteratorFor(n, &iter), false, wxT("Invalid index") ); return gtk_tree_selection_iter_is_selected(selection, &iter) != 0; }
// get GtkTreeEntry from position (note: you need to g_unref it if valid) GtkTreeEntry *wxListBox::GTKGetEntry(unsigned n) const { GtkTreeIter iter; if ( !GTKGetIteratorFor(n, &iter) ) return NULL; GtkTreeEntry* entry = NULL; gtk_tree_model_get(GTK_TREE_MODEL(m_liststore), &iter, WXLISTBOX_DATACOLUMN, &entry, -1); return entry; }
void wxListBox::DoDeleteOneItem(unsigned int n) { wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); InvalidateBestSize(); wxGtkEventsDisabler<wxListBox> noEvents(this); GtkTreeIter iter; wxCHECK_RET( GTKGetIteratorFor(n, &iter), wxT("wrong listbox index") ); // this returns false if iter is invalid (e.g. deleting item at end) but // since we don't use iter, we ignore the return value gtk_list_store_remove(m_liststore, &iter); }
void wxListBox::SetString(unsigned int n, const wxString& label) { wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); GtkTreeIter iter; wxCHECK_RET(GTKGetIteratorFor(n, &iter), "invalid index"); wxTreeEntry* entry = GetEntry(m_liststore, &iter, this); // update the item itself wx_tree_entry_set_label(entry, wxGTK_CONV(label)); // signal row changed GtkTreeModel* tree_model = GTK_TREE_MODEL(m_liststore); wxGtkTreePath path(gtk_tree_model_get_path(tree_model, &iter)); gtk_tree_model_row_changed(tree_model, path, &iter); }
void wxListBox::SetString(unsigned int n, const wxString& label) { wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetString") ); wxCHECK_RET( m_treeview != NULL, wxT("invalid listbox") ); GtkTreeEntry* entry = GTKGetEntry(n); wxCHECK_RET( entry, wxT("wrong listbox index") ); // update the item itself gtk_tree_entry_set_label(entry, wxGTK_CONV(label)); // and update the model which will refresh the tree too GtkTreeIter iter; wxCHECK_RET( GTKGetIteratorFor(n, &iter), wxT("failed to get iterator") ); // FIXME: this resets the checked status of a wxCheckListBox item GTKSetItem(iter, entry); }
int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, unsigned int pos, void **clientData, wxClientDataType type) { wxCHECK_MSG( m_treeview != NULL, wxNOT_FOUND, wxT("invalid listbox") ); InvalidateBestSize(); GtkTreeIter* pIter = NULL; // append by default GtkTreeIter iter; if ( pos != GetCount() ) { wxCHECK_MSG( GTKGetIteratorFor(pos, &iter), wxNOT_FOUND, wxT("internal wxListBox error in insertion") ); pIter = &iter; } const unsigned int numItems = items.GetCount(); for ( unsigned int i = 0; i < numItems; ++i ) { GtkTreeEntry* entry = gtk_tree_entry_new(); gtk_tree_entry_set_label(entry, wxGTK_CONV(items[i])); gtk_tree_entry_set_destroy_func(entry, (GtkTreeEntryDestroy)gtk_tree_entry_destroy_cb, this); GtkTreeIter itercur; gtk_list_store_insert_before(m_liststore, &itercur, pIter); GTKSetItem(itercur, entry); g_object_unref (entry); if (clientData) AssignNewItemClientData(GTKGetIndexFor(itercur), clientData, i, type); } UpdateOldSelections(); return pos + numItems - 1; }
void wxListBox::DoScrollToCell(int n, float alignY, float alignX) { wxCHECK_RET( m_treeview, wxT("invalid listbox") ); wxCHECK_RET( IsValid(n), wxT("invalid index")); //RN: I have no idea why this line is needed... if (gtk_widget_has_grab(GTK_WIDGET(m_treeview))) return; GtkTreeIter iter; if ( !GTKGetIteratorFor(n, &iter) ) return; wxGtkTreePath path( gtk_tree_model_get_path(GTK_TREE_MODEL(m_liststore), &iter)); // Scroll to the desired cell (0.0 == topleft alignment) gtk_tree_view_scroll_to_cell(m_treeview, path, NULL, TRUE, alignY, alignX); }