bool sc_navigate_index(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); zathura_t* zathura = session->global.data; g_return_val_if_fail(argument != NULL, false); g_return_val_if_fail(zathura->document != NULL, false); if(zathura->ui.index == NULL) { return false; } GtkTreeView *tree_view = gtk_container_get_children(GTK_CONTAINER(zathura->ui.index))->data; GtkTreePath *path; gtk_tree_view_get_cursor(tree_view, &path, NULL); if (path == NULL) { return false; } GtkTreeModel *model = gtk_tree_view_get_model(tree_view); GtkTreeIter iter; GtkTreeIter child_iter; gboolean is_valid_path = TRUE; switch(argument->n) { case TOP: /* go to the first node */ gtk_tree_path_free(path); path = gtk_tree_path_new_first(); break; case BOTTOM: /* go to the last visiible node */ gtk_tree_path_free(path); path = gtk_tree_path_new_from_indices(gtk_tree_model_iter_n_children(model, NULL) - 1, -1); gtk_tree_model_get_iter(model, &iter, path); while (gtk_tree_model_iter_has_child(model, &iter) == TRUE && gtk_tree_view_row_expanded(tree_view, path) == TRUE) { gtk_tree_path_append_index(path, gtk_tree_model_iter_n_children(model, &iter) - 1); } break; case UP: if (gtk_tree_path_prev(path) == FALSE) { /* For some reason gtk_tree_path_up returns TRUE although we're not * moving anywhere. */ is_valid_path = gtk_tree_path_up(path) && (gtk_tree_path_get_depth(path) > 0); } else { /* row above */ while (gtk_tree_view_row_expanded(tree_view, path)) { gtk_tree_model_get_iter(model, &iter, path); /* select last child */ gtk_tree_model_iter_nth_child(model, &child_iter, &iter, gtk_tree_model_iter_n_children(model, &iter)-1); gtk_tree_path_free(path); path = gtk_tree_model_get_path(model, &child_iter); } } break; case COLLAPSE: if (gtk_tree_view_collapse_row(tree_view, path) == FALSE && gtk_tree_path_get_depth(path) > 1) { gtk_tree_path_up(path); gtk_tree_view_collapse_row(tree_view, path); } break; case DOWN: if (gtk_tree_view_row_expanded(tree_view, path) == TRUE) { gtk_tree_path_down(path); } else { do { gtk_tree_model_get_iter(model, &iter, path); if (gtk_tree_model_iter_next(model, &iter)) { gtk_tree_path_free(path); path = gtk_tree_model_get_path(model, &iter); break; } } while((is_valid_path = (gtk_tree_path_get_depth(path) > 1)) && gtk_tree_path_up(path)); } break; case EXPAND: if (gtk_tree_view_expand_row(tree_view, path, FALSE)) { gtk_tree_path_down(path); } break; case EXPAND_ALL: gtk_tree_view_expand_all(tree_view); break; case COLLAPSE_ALL: gtk_tree_view_collapse_all(tree_view); gtk_tree_path_free(path); path = gtk_tree_path_new_first(); gtk_tree_view_set_cursor(tree_view, path, NULL, FALSE); break; case TOGGLE: gtk_tree_model_get_iter(model, &iter, path); if (gtk_tree_model_iter_has_child(model, &iter) == TRUE) { if (gtk_tree_view_row_expanded(tree_view, path) == TRUE) { gtk_tree_view_collapse_row(tree_view, path); } else { gtk_tree_view_expand_row(tree_view, path, FALSE); } break; } case SELECT: cb_index_row_activated(tree_view, path, NULL, zathura); gtk_tree_path_free(path); return false; } if (is_valid_path == TRUE) { gtk_tree_view_set_cursor(tree_view, path, NULL, FALSE); } gtk_tree_path_free(path); return false; }
static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, PidginLogViewer *viewer) { if (gtk_tree_view_row_expanded(tv, path)) gtk_tree_view_collapse_row(tv, path); else gtk_tree_view_expand_row(tv, path, FALSE); }
static gboolean gossip_cell_renderer_expander_activate (GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path_string, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) { GossipCellRendererExpander *expander; GossipCellRendererExpanderPriv *priv; GtkTreePath *path; GtkSettings *settings; gboolean animate = FALSE; gboolean expanding; gboolean in_cell; int mouse_x; int mouse_y; expander = GOSSIP_CELL_RENDERER_EXPANDER (cell); priv = GET_PRIV (cell); if (!GTK_IS_TREE_VIEW (widget) || !priv->activatable) return FALSE; path = gtk_tree_path_new_from_string (path_string); gtk_widget_get_pointer (widget, &mouse_x, &mouse_y); gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW (widget), mouse_x, mouse_y, &mouse_x, &mouse_y); /* check if click is within the cell */ if (mouse_x - cell_area->x >= 0 && mouse_x - cell_area->x <= cell_area->width) { in_cell = TRUE; } else { in_cell = FALSE; } if (! in_cell) { return FALSE; } #if 0 if (gtk_tree_path_get_depth (path) > 1) { gtk_tree_path_free (path); return TRUE; } #endif settings = gtk_widget_get_settings (GTK_WIDGET (widget)); if (g_object_class_find_property (G_OBJECT_GET_CLASS (settings), "gtk-enable-animations")) { g_object_get (settings, "gtk-enable-animations", &animate, NULL); } if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (widget), path)) { gtk_tree_view_collapse_row (GTK_TREE_VIEW (widget), path); expanding = FALSE; } else { gtk_tree_view_expand_row (GTK_TREE_VIEW (widget), path, FALSE); expanding = TRUE; } if (animate) { gossip_cell_renderer_expander_start_animation (expander, GTK_TREE_VIEW (widget), path, expanding, background_area); } gtk_tree_path_free (path); return TRUE; }
static void roster_view_gtk_update_groups (RosterViewGtk *view, GtkTreeIter *heap_iter) { GtkTreeModel *model = NULL; GtkTreePath *path = NULL; GtkTreeIter iter; GSList *existing_group = NULL; int timeout = 0; gboolean go_on = FALSE; gchar *name = NULL; model = GTK_TREE_MODEL (view->priv->store); if (gtk_tree_model_iter_nth_child (model, &iter, heap_iter, 0)) { do { // If this node has children, see if it must be // folded or unfolded if (gtk_tree_model_iter_has_child (model, &iter)) { update_offline_count (view, &iter); gtk_tree_model_get (model, &iter, COLUMN_GROUP_NAME, &name, -1); if (name) { if (view->priv->folded_groups) existing_group = g_slist_find_custom (view->priv->folded_groups, name, (GCompareFunc) g_ascii_strcasecmp); path = gtk_tree_model_get_path (model, heap_iter); gtk_tree_view_expand_row (view->priv->tree_view, path, FALSE); gtk_tree_path_free (path); path = gtk_tree_model_get_path (model, &iter); if (path) { if (existing_group == NULL) { if (!gtk_tree_view_row_expanded (view->priv->tree_view, path)) { gtk_tree_view_expand_row (view->priv->tree_view, path, TRUE); } } else { if (gtk_tree_view_row_expanded (view->priv->tree_view, path)) { gtk_tree_view_collapse_row (view->priv->tree_view, path); } } gtk_tree_path_free (path); } go_on = gtk_tree_model_iter_next (model, &iter); } g_free (name); } // else remove the node (no children) else { gtk_tree_model_get (GTK_TREE_MODEL (view->priv->store), &iter, COLUMN_TIMEOUT, &timeout, -1); go_on = gtk_tree_store_remove (view->priv->store, &iter); } } while (go_on); } }
gboolean music_tree_event_cb(GtkWidget * widget, GdkEvent * event, gpointer user_data) { GtkTreeIter iter; GtkTreeModel * model; if (event->type != GDK_KEY_PRESS && event->type != GDK_KEY_RELEASE && event->type != GDK_BUTTON_PRESS && event->type != GDK_2BUTTON_PRESS) { return FALSE; } /* global handlers */ if (event->type == GDK_2BUTTON_PRESS) { if (gtk_tree_selection_get_selected(music_select, NULL, &iter)) { music_store_iter_addlist_defmode(&iter, NULL, 0/*new_tab*/); } return TRUE; } if (event->type == GDK_KEY_PRESS) { GdkEventKey * kevent = (GdkEventKey *)event; switch (kevent->keyval) { case GDK_KP_Enter: case GDK_Return: if (gtk_tree_selection_get_selected(music_select, &model, &iter)) { GtkTreePath * path = gtk_tree_model_get_path(model, &iter); if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(music_tree), path)) { gtk_tree_view_collapse_row(GTK_TREE_VIEW(music_tree), path); } else { gtk_tree_view_expand_row(GTK_TREE_VIEW(music_tree), path, FALSE); } gtk_tree_path_free(path); } return TRUE; case GDK_w: case GDK_W: toolbar__collapse_cb(NULL); return TRUE; case GDK_f: case GDK_F: toolbar__search_cb(NULL); return TRUE; } } if (event->type == GDK_BUTTON_PRESS) { GtkTreePath * path = NULL; GdkEventButton * bevent = (GdkEventButton *)event; if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(music_tree), bevent->x, bevent->y, &path, NULL, NULL, NULL)) { gtk_tree_selection_select_path(music_select, path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(music_tree), path, NULL, FALSE); gtk_tree_path_free(path); if (gtk_tree_selection_get_selected(music_select, NULL, &iter)) { if (bevent->button == 2) { music_store_iter_addlist_defmode(&iter, NULL, 1/*new_tab*/); return TRUE; } } } else { if (bevent->button == 3) { gtk_menu_popup(GTK_MENU(blank_menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); } return TRUE; } } /* pass event to the selected store */ if (gtk_tree_selection_get_selected(music_select, &model, &iter)) { GtkTreePath * path = gtk_tree_model_get_path(model, &iter); switch (iter_get_store_type(&iter)) { case STORE_TYPE_FILE: store_file_event_cb(event, &iter, path); break; #ifdef HAVE_CDDA case STORE_TYPE_CDDA: store_cdda_event_cb(event, &iter, path); break; #endif /* HAVE_CDDA */ #ifdef HAVE_PODCAST case STORE_TYPE_PODCAST: store_podcast_event_cb(event, &iter, path); break; #endif /* HAVE_PODCAST */ } gtk_tree_path_free(path); } return FALSE; }
static gboolean key_press_callback (GtkWidget *widget, GdkEventKey *event, gpointer callback_data) { FMDirectoryView *view; //GdkEventButton button_event = { 0 }; gboolean handled; GtkTreeView *tree_view; GtkTreePath *path; tree_view = GTK_TREE_VIEW (widget); view = FM_DIRECTORY_VIEW (callback_data); handled = FALSE; switch (event->keyval) { case GDK_KEY_F10: if (event->state & GDK_CONTROL_MASK) { fm_directory_view_do_popup_menu (view, (GdkEventButton *) event); handled = TRUE; } break; case GDK_KEY_Right: gtk_tree_view_get_cursor (tree_view, &path, NULL); if (path) { gtk_tree_view_expand_row (tree_view, path, FALSE); gtk_tree_path_free (path); } handled = TRUE; break; case GDK_KEY_Left: gtk_tree_view_get_cursor (tree_view, &path, NULL); if (path) { gtk_tree_view_collapse_row (tree_view, path); gtk_tree_path_free (path); } handled = TRUE; break; case GDK_KEY_space: if (event->state & GDK_CONTROL_MASK) { handled = FALSE; break; } if (!gtk_widget_has_focus (GTK_WIDGET (tree_view))) { handled = FALSE; break; } if ((event->state & GDK_SHIFT_MASK) != 0) { /* alternate */ fm_directory_view_activate_selected_items (view, MARLIN_WINDOW_OPEN_FLAG_NEW_TAB); } else { fm_directory_view_preview_selected_items (view); } handled = TRUE; break; case GDK_KEY_Return: case GDK_KEY_KP_Enter: if ((event->state & GDK_SHIFT_MASK) != 0) { /* alternate */ fm_directory_view_activate_selected_items (view, MARLIN_WINDOW_OPEN_FLAG_NEW_TAB); } else { fm_directory_view_activate_selected_items (view, MARLIN_WINDOW_OPEN_FLAG_DEFAULT); } handled = TRUE; break; default: handled = FALSE; } return handled; }
// start helpers static void swap_buses (GtkTreeModel *tm, GtkTreeSelection *sel, bus_layout_D *dialog, GtkTreePath *tpSrc, GtkTreePath *tpDst) { int Nix ; GtkTreeIter itr ; SWAP_BUSES_STRUCT src, dst ; SWAP_BUSES_STRUCT *min = NULL, *max = NULL ; EXP_ARRAY *ar_bSelSrc = NULL, *ar_bSelDst = NULL ; gboolean bDstExpanded = TRUE ; if (!gtk_tree_model_get_iter (tm, &(src.itr), tpSrc)) return ; src.tp = gtk_tree_path_copy (tpSrc) ; src.icChildren = gtk_tree_model_iter_n_children (tm, &(src.itr)) ; if (!gtk_tree_model_get_iter (tm, &(dst.itr), tpDst)) { gtk_tree_path_free (src.tp) ; return ; } dst.tp = gtk_tree_path_copy (tpDst) ; dst.icChildren = gtk_tree_model_iter_n_children (tm, &(dst.itr)) ; if (dst.icChildren < src.icChildren) { min = &dst ; max = &src ; } else { min = &src ; max = &dst ; } bDstExpanded = gtk_tree_view_row_expanded (gtk_tree_selection_get_tree_view (sel), dst.tp) ; g_signal_handlers_block_matched (G_OBJECT (sel), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, (gpointer)tree_view_selection_changed, NULL) ; for (Nix = 0 ; Nix < max->icChildren - min->icChildren ; Nix++) gtk_tree_store_append (GTK_TREE_STORE (tm), &itr, &(min->itr)) ; gtk_tree_path_down (src.tp) ; gtk_tree_path_down (dst.tp) ; ar_bSelSrc = exp_array_new (sizeof (gboolean), 1) ; ar_bSelDst = exp_array_new (sizeof (gboolean), 1) ; exp_array_1d_insert_vals (ar_bSelSrc, NULL, max->icChildren, 0) ; exp_array_1d_insert_vals (ar_bSelDst, NULL, max->icChildren, 0) ; for (Nix = 0 ; Nix < max->icChildren ; Nix++) { exp_array_index_1d (ar_bSelSrc, gboolean, Nix) = gtk_tree_selection_path_is_selected (sel, src.tp) ; exp_array_index_1d (ar_bSelDst, gboolean, Nix) = gtk_tree_selection_path_is_selected (sel, dst.tp) ; gtk_tree_path_next (src.tp) ; gtk_tree_path_next (dst.tp) ; } if (!gtk_tree_path_up (src.tp)) goto swap_buses_quit ; if (!gtk_tree_path_up (dst.tp)) goto swap_buses_quit ; gtk_tree_path_down (src.tp) ; gtk_tree_path_down (dst.tp) ; for (Nix = 0 ; Nix < max->icChildren ; Nix++) { if (exp_array_index_1d (ar_bSelDst, gboolean, Nix)) gtk_tree_view_expand_to_path (gtk_tree_selection_get_tree_view (sel), src.tp) ; if (exp_array_index_1d (ar_bSelSrc, gboolean, Nix)) gtk_tree_view_expand_to_path (gtk_tree_selection_get_tree_view (sel), dst.tp) ; gtk_tree_path_next (src.tp) ; gtk_tree_path_next (dst.tp) ; } if (!gtk_tree_path_up (src.tp)) goto swap_buses_quit ; if (!gtk_tree_path_up (dst.tp)) goto swap_buses_quit ; gtk_tree_path_down (src.tp) ; gtk_tree_path_down (dst.tp) ; for (Nix = 0 ; Nix < max->icChildren ; Nix++) { swap_model_paths_contents (tm, src.tp, dst.tp) ; gtk_tree_path_next (src.tp) ; gtk_tree_path_next (dst.tp) ; } if (!gtk_tree_path_up (src.tp)) goto swap_buses_quit ; if (!gtk_tree_path_up (dst.tp)) goto swap_buses_quit ; gtk_tree_path_down (src.tp) ; gtk_tree_path_down (dst.tp) ; for (Nix = 0 ; Nix < max->icChildren ; Nix++) { GTK_TREE_SELECTION_SET_PATH_SELECTED (sel, src.tp, exp_array_index_1d (ar_bSelDst, gboolean, Nix)) ; GTK_TREE_SELECTION_SET_PATH_SELECTED (sel, dst.tp, exp_array_index_1d (ar_bSelSrc, gboolean, Nix)) ; gtk_tree_path_next (src.tp) ; gtk_tree_path_next (dst.tp) ; } if (!gtk_tree_path_up (src.tp)) goto swap_buses_quit ; if (!gtk_tree_path_up (dst.tp)) goto swap_buses_quit ; swap_model_paths_contents (tm, src.tp, dst.tp) ; gtk_tree_path_down (src.tp) ; gtk_tree_path_down (dst.tp) ; for (Nix = 0 ; Nix < min->icChildren ; Nix++) gtk_tree_path_next (max->tp) ; if (gtk_tree_model_get_iter (tm, &itr, max->tp)) while (gtk_tree_store_remove (GTK_TREE_STORE (tm), &itr)) ; if (!bDstExpanded) { for (Nix = 0 ; Nix < ar_bSelDst->icUsed ; Nix++) if (exp_array_index_1d (ar_bSelDst, gboolean, Nix)) break ; if (Nix == ar_bSelDst->icUsed) if (gtk_tree_path_up (src.tp)) gtk_tree_view_collapse_row (gtk_tree_selection_get_tree_view (sel), src.tp) ; } swap_buses_quit: exp_array_free (ar_bSelSrc) ; exp_array_free (ar_bSelDst) ; gtk_tree_path_free (src.tp) ; gtk_tree_path_free (dst.tp) ; g_signal_handlers_unblock_matched (G_OBJECT (sel), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, (gpointer)tree_view_selection_changed, NULL) ; tree_view_selection_changed (sel, dialog) ; }
gboolean on_dir_tree_view_key_press( GtkWidget* view, GdkEventKey* evt, PtkFileBrowser* browser ) { VFSFileInfo* file; GtkTreeModel *model; GtkTreeIter iter; GtkTreeSelection *select = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); if(!gtk_tree_selection_get_selected(select, &model, &iter)) return FALSE; int keymod = ( evt->state & ( GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_SUPER_MASK | GDK_HYPER_MASK | GDK_META_MASK ) ); GtkTreePath *path = gtk_tree_model_get_path(model, &iter); switch( evt->keyval ) { case GDK_KEY_Left: if(gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), path)) { gtk_tree_view_collapse_row(GTK_TREE_VIEW(view), path); } else if(gtk_tree_path_up(path)) { gtk_tree_selection_select_path(select, path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(view), path, NULL, FALSE); } else { gtk_tree_path_free( path ); return FALSE; } break; case GDK_KEY_Right: if(!gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), path)) { gtk_tree_view_expand_row(GTK_TREE_VIEW(view), path, FALSE); } else { gtk_tree_path_down(path); gtk_tree_selection_select_path(select, path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(view), path, NULL, FALSE); } break; case GDK_KEY_F10: case GDK_KEY_Menu: if ( evt->keyval == GDK_KEY_F10 && keymod != GDK_SHIFT_MASK ) { gtk_tree_path_free( path ); return FALSE; } char* dir_path = ptk_dir_tree_view_get_selected_dir( GTK_TREE_VIEW( view ) ); if ( ptk_file_browser_chdir( browser, dir_path, PTK_FB_CHDIR_ADD_HISTORY ) ) { /* show right-click menu * This simulates a right-click in the file list when * no files are selected (even if some are) since * actions are to be taken on the dir itself. */ GtkWidget* popup = ptk_file_menu_new( NULL, browser, NULL, NULL, dir_path, NULL ); if ( popup ) gtk_menu_popup( GTK_MENU( popup ), NULL, NULL, NULL, NULL, 3, 0 ); } /* this old method operates on the wrong files gtk_tree_model_get( gtk_tree_view_get_model( GTK_TREE_VIEW( view ) ), &iter, COL_DIR_TREE_INFO, &file, -1 ); if ( file ) { GtkWidget * popup; char* file_path; GList* sel_files; char* dir_name; file_path = ptk_dir_view_get_dir_path( gtk_tree_view_get_model( GTK_TREE_VIEW( view ) ), &iter ); sel_files = g_list_prepend( NULL, vfs_file_info_ref(file) ); dir_name = g_path_get_dirname( file_path ); popup = ptk_file_menu_new( NULL, browser, file_path, file, dir_name, sel_files ); g_free( dir_name ); g_free( file_path ); if ( popup ) gtk_menu_popup( GTK_MENU( popup ), NULL, NULL, NULL, NULL, 3, evt->time ); vfs_file_info_unref( file ); } */ break; default: gtk_tree_path_free( path ); return FALSE; } gtk_tree_path_free( path ); return TRUE; }
static void ref_count_three_levels (void) { GtkTreeIter grandparent1, grandparent2, parent1, parent2; GtkTreeIter iter_parent1, iter_parent2; GtkTreeModel *model; GtkTreeModelRefCount *ref_model; GtkTreeModel *sort_model; GtkTreePath *path; GtkWidget *tree_view; model = gtk_tree_model_ref_count_new (); ref_model = GTK_TREE_MODEL_REF_COUNT (model); /* + grandparent1 * + grandparent2 * + parent1 * + iter_parent1 * + parent2 * + iter_parent2 * + iter_parent2 */ gtk_tree_store_append (GTK_TREE_STORE (model), &grandparent1, NULL); gtk_tree_store_append (GTK_TREE_STORE (model), &grandparent2, NULL); gtk_tree_store_append (GTK_TREE_STORE (model), &parent1, &grandparent2); gtk_tree_store_append (GTK_TREE_STORE (model), &iter_parent1, &parent1); gtk_tree_store_append (GTK_TREE_STORE (model), &parent2, &grandparent2); gtk_tree_store_append (GTK_TREE_STORE (model), &iter_parent2, &parent2); gtk_tree_store_append (GTK_TREE_STORE (model), &iter_parent2, &parent2); assert_entire_model_unreferenced (ref_model); sort_model = gtk_tree_model_sort_new_with_model (model); tree_view = gtk_tree_view_new_with_model (sort_model); assert_root_level_referenced (ref_model, 1); assert_node_ref_count (ref_model, &parent1, 0); assert_node_ref_count (ref_model, &parent2, 0); assert_level_unreferenced (ref_model, &parent1); assert_level_unreferenced (ref_model, &parent2); path = gtk_tree_path_new_from_indices (1, -1); gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path, FALSE); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 1); assert_node_ref_count (ref_model, &parent2, 1); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 0); gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path, TRUE); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 2); assert_node_ref_count (ref_model, &parent2, 2); assert_node_ref_count (ref_model, &iter_parent1, 1); assert_node_ref_count (ref_model, &iter_parent2, 1); gtk_tree_view_collapse_all (GTK_TREE_VIEW (tree_view)); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 1); assert_node_ref_count (ref_model, &parent2, 1); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 0); gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (sort_model)); assert_root_level_referenced (ref_model, 1); assert_node_ref_count (ref_model, &parent1, 0); assert_node_ref_count (ref_model, &parent2, 0); gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path, FALSE); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 1); assert_node_ref_count (ref_model, &parent2, 1); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 0); gtk_tree_path_append_index (path, 1); gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path, FALSE); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 1); assert_node_ref_count (ref_model, &parent2, 2); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 1); gtk_tree_view_collapse_row (GTK_TREE_VIEW (tree_view), path); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 1); assert_node_ref_count (ref_model, &parent2, 2); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 0); gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (sort_model)); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 1); assert_node_ref_count (ref_model, &parent2, 1); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 0); gtk_tree_path_up (path); gtk_tree_view_collapse_row (GTK_TREE_VIEW (tree_view), path); gtk_tree_path_free (path); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 2); assert_node_ref_count (ref_model, &parent1, 0); assert_node_ref_count (ref_model, &parent2, 0); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 0); gtk_tree_model_sort_clear_cache (GTK_TREE_MODEL_SORT (sort_model)); assert_node_ref_count (ref_model, &grandparent1, 1); assert_node_ref_count (ref_model, &grandparent2, 1); assert_node_ref_count (ref_model, &parent1, 0); assert_node_ref_count (ref_model, &parent2, 0); assert_node_ref_count (ref_model, &iter_parent1, 0); assert_node_ref_count (ref_model, &iter_parent2, 0); gtk_widget_destroy (tree_view); assert_entire_model_unreferenced (ref_model); g_object_unref (sort_model); g_object_unref (ref_model); }
gboolean on_dir_tree_view_button_press( GtkWidget* view, GdkEventButton* evt, PtkFileBrowser* browser ) { GtkTreeModel* model; GtkTreePath* tree_path; GtkTreeViewColumn* tree_col; GtkTreeIter it; if ( evt->type == GDK_BUTTON_PRESS && ( evt->button == 1 || evt->button == 3 ) ) { // middle click 2 handled in ptk-file-browser.c on_dir_tree_button_press model = gtk_tree_view_get_model( GTK_TREE_VIEW( view ) ); if ( gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW( view ), evt->x, evt->y, &tree_path, &tree_col, NULL, NULL ) ) { if ( gtk_tree_model_get_iter( model, &it, tree_path ) ) { gtk_tree_view_set_cursor( GTK_TREE_VIEW( view ), tree_path, tree_col, FALSE ); if ( evt->button == 3 ) { // right click char* dir_path = ptk_dir_tree_view_get_selected_dir( GTK_TREE_VIEW( view ) ); if ( ptk_file_browser_chdir( browser, dir_path, PTK_FB_CHDIR_ADD_HISTORY ) ) { /* show right-click menu * This simulates a right-click in the file list when * no files are selected (even if some are) since * actions are to be taken on the dir itself. */ GtkWidget* popup = ptk_file_menu_new( NULL, browser, NULL, NULL, dir_path, NULL ); if ( popup ) gtk_menu_popup( GTK_MENU( popup ), NULL, NULL, NULL, NULL, 3, 0 ); gtk_tree_path_free( tree_path ); return TRUE; } } else gtk_tree_view_row_activated( GTK_TREE_VIEW( view ), tree_path, tree_col ); } gtk_tree_path_free( tree_path ); } } else if ( evt->type == GDK_2BUTTON_PRESS && evt->button == 1 ) { // double click - expand/collapse if ( gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW( view ), evt->x, evt->y, &tree_path, NULL, NULL, NULL ) ) { if ( gtk_tree_view_row_expanded( GTK_TREE_VIEW( view ), tree_path ) ) gtk_tree_view_collapse_row( GTK_TREE_VIEW( view ), tree_path ); else gtk_tree_view_expand_row( GTK_TREE_VIEW( view ), tree_path, FALSE ); gtk_tree_path_free( tree_path ); return TRUE; } } return FALSE; }
static VALUE rg_collapse_row(VALUE self, VALUE path) { return CBOOL2RVAL(gtk_tree_view_collapse_row(_SELF(self), RVAL2GTKTREEPATH(path))); }
gboolean on_dir_tree_view_key_press( GtkWidget* view, GdkEventKey* evt, PtkFileBrowser* browser ) { VFSFileInfo* file; GtkTreeModel *model; GtkTreeIter iter; GtkTreeSelection *select = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); if(!gtk_tree_selection_get_selected(select, &model, &iter)) return FALSE; int keymod = ( evt->state & ( GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_SUPER_MASK | GDK_HYPER_MASK | GDK_META_MASK ) ); GtkTreePath *path = gtk_tree_model_get_path(model, &iter); switch( evt->keyval ) { case GDK_KEY_Left: if(gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), path)) { gtk_tree_view_collapse_row(GTK_TREE_VIEW(view), path); } else if(gtk_tree_path_up(path)) { gtk_tree_selection_select_path(select, path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(view), path, NULL, FALSE); } else { gtk_tree_path_free( path ); return FALSE; } break; case GDK_KEY_Right: if(!gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), path)) { gtk_tree_view_expand_row(GTK_TREE_VIEW(view), path, FALSE); } else { gtk_tree_path_down(path); gtk_tree_selection_select_path(select, path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(view), path, NULL, FALSE); } break; case GDK_KEY_F10: case GDK_KEY_Menu: if ( evt->keyval == GDK_KEY_F10 && keymod != GDK_SHIFT_MASK ) { gtk_tree_path_free( path ); return FALSE; } gtk_tree_model_get( gtk_tree_view_get_model( GTK_TREE_VIEW( view ) ), &iter, COL_DIR_TREE_INFO, &file, -1 ); if ( file ) { GtkWidget * popup; char* file_path; GList* sel_files; char* dir_name; file_path = ptk_dir_view_get_dir_path( gtk_tree_view_get_model( GTK_TREE_VIEW( view ) ), &iter ); sel_files = g_list_prepend( NULL, vfs_file_info_ref(file) ); dir_name = g_path_get_dirname( file_path ); popup = ptk_file_menu_new( NULL, browser, file_path, file, dir_name, sel_files ); g_free( dir_name ); g_free( file_path ); if ( popup ) gtk_menu_popup( GTK_MENU( popup ), NULL, NULL, NULL, NULL, 3, evt->time ); vfs_file_info_unref( file ); } break; default: gtk_tree_path_free( path ); return FALSE; } gtk_tree_path_free( path ); return TRUE; }
gboolean on_dir_tree_view_button_press( GtkWidget* view, GdkEventButton* evt, PtkFileBrowser* browser ) { GtkTreeModel* model; GtkTreePath* tree_path; GtkTreeViewColumn* tree_col; GtkTreeIter it; if ( evt->type == GDK_BUTTON_PRESS && ( evt->button == 1 || evt->button == 3 ) ) { // middle click 2 handled in ptk-file-browser.c on_dir_tree_button_press model = gtk_tree_view_get_model( GTK_TREE_VIEW( view ) ); if ( gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW( view ), evt->x, evt->y, &tree_path, &tree_col, NULL, NULL ) ) { if ( gtk_tree_model_get_iter( model, &it, tree_path ) ) { gtk_tree_view_set_cursor( GTK_TREE_VIEW( view ), tree_path, tree_col, FALSE ); gtk_tree_view_row_activated( GTK_TREE_VIEW( view ), tree_path, tree_col ); if ( evt->button == 3 ) { // right click VFSFileInfo * file; gtk_tree_model_get( model, &it, COL_DIR_TREE_INFO, &file, -1 ); if ( file ) { GtkWidget * popup; char* file_path; GList* sel_files; char* dir_name; file_path = ptk_dir_view_get_dir_path( model, &it ); sel_files = g_list_prepend( NULL, vfs_file_info_ref(file) ); dir_name = g_path_get_dirname( file_path ); /* FIXME: New|Tab Here and New|File etc work on the * wrong location because dir_name is really incorrect. * But if set to cur dir it breaks Copy, etc. */ popup = ptk_file_menu_new( NULL, browser, file_path, file, dir_name, sel_files ); g_free( dir_name ); g_free( file_path ); if ( popup ) gtk_menu_popup( GTK_MENU( popup ), NULL, NULL, NULL, NULL, 3, evt->time ); vfs_file_info_unref( file ); gtk_tree_path_free( tree_path ); return TRUE; } } } gtk_tree_path_free( tree_path ); } } else if ( evt->type == GDK_2BUTTON_PRESS && evt->button == 1 ) { // double click - expand/collapse if ( gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW( view ), evt->x, evt->y, &tree_path, NULL, NULL, NULL ) ) { if ( gtk_tree_view_row_expanded( GTK_TREE_VIEW( view ), tree_path ) ) gtk_tree_view_collapse_row( GTK_TREE_VIEW( view ), tree_path ); else gtk_tree_view_expand_row( GTK_TREE_VIEW( view ), tree_path, FALSE ); gtk_tree_path_free( tree_path ); return TRUE; } } return FALSE; }
static gboolean on_modules_list_button_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { GtkTreeSelection *selection; GtkTreeIter selected; GtkTreeModel *model; gchar *mod = NULL; gchar *caption = NULL; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sidebar.module_list)); if (!gtk_tree_selection_get_selected(selection, &model, &selected)) return FALSE; gtk_tree_model_get(GTK_TREE_MODEL(model), &selected, 2, &caption, 3, &mod, -1); //uncomment the following two lines if you want to see how it looks without //triangls or plus symbols //gtk_tree_view_set_show_expanders(sidebar.module_list, FALSE); //gtk_tree_view_set_level_indentation(sidebar.module_list, 12); GtkTreePath *path = gtk_tree_model_get_path(model, &selected); if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(sidebar.module_list), path)) gtk_tree_view_collapse_row(GTK_TREE_VIEW(sidebar.module_list), path); else gtk_tree_view_expand_row(GTK_TREE_VIEW(sidebar.module_list), path, FALSE); gtk_tree_path_free(path); switch (event->button) { case 1: main_mod_treeview_button_one(model, selected); break; case 2: if (mod && (g_utf8_collate(mod, _("Parallel View"))) && (g_utf8_collate(mod, _("Standard View")))) gui_open_module_in_new_tab(mod); break; case 3: if (mod && (g_utf8_collate(mod, _("Parallel View"))) && (g_utf8_collate(mod, _("Standard View"))) //) { && (main_get_mod_type(mod) != PRAYERLIST_TYPE)) { buf_module = mod; create_menu_modules(); /*gtk_menu_popup(GTK_MENU(sidebar.menu_modules), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); */ g_free(caption); return FALSE; } if (caption && (!g_utf8_collate(caption, _("Prayer List/Journal")))) { gui_menu_prayerlist_popup(NULL, NULL); g_free(mod); return FALSE; } if (mod && (main_get_mod_type(mod) == PRAYERLIST_TYPE)) { buf_module = mod; gtk_menu_popup(GTK_MENU(sidebar.menu_prayerlist_mod), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); g_free(caption); return FALSE; } break; } g_free(caption); g_free(mod); return FALSE; }