mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Merge branch 'updown'
Bring in the keyboard handling change
This commit is contained in:
commit
1c72d90b37
4 changed files with 149 additions and 1 deletions
99
divelist.c
99
divelist.c
|
@ -2627,3 +2627,102 @@ void remove_autogen_trips()
|
|||
remove_dive_from_trip(dive);
|
||||
}
|
||||
}
|
||||
|
||||
struct iteridx {
|
||||
int idx;
|
||||
GtkTreeIter *iter;
|
||||
};
|
||||
|
||||
static gboolean iter_has_idx(GtkTreeModel *model, GtkTreePath *path,
|
||||
GtkTreeIter *iter, gpointer _data)
|
||||
{
|
||||
struct iteridx *iteridx = _data;
|
||||
int idx;
|
||||
/* Get the dive number */
|
||||
gtk_tree_model_get(model, iter, DIVE_INDEX, &idx, -1);
|
||||
if (idx == iteridx->idx) {
|
||||
iteridx->iter = gtk_tree_iter_copy(iter);
|
||||
return TRUE; /* end foreach */
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GtkTreeIter *get_iter_from_idx(int idx)
|
||||
{
|
||||
struct iteridx iteridx = {idx, };
|
||||
gtk_tree_model_foreach(MODEL(dive_list), iter_has_idx, &iteridx);
|
||||
return iteridx.iter;
|
||||
}
|
||||
|
||||
void select_next_dive(void)
|
||||
{
|
||||
GtkTreeIter *nextiter;
|
||||
GtkTreeIter *iter = get_iter_from_idx(selected_dive);
|
||||
GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view));
|
||||
GtkTreePath *treepath;
|
||||
int idx;
|
||||
|
||||
if (!iter)
|
||||
return;
|
||||
nextiter = gtk_tree_iter_copy(iter);
|
||||
if (!gtk_tree_model_iter_next(MODEL(dive_list), nextiter)) {
|
||||
if (!gtk_tree_model_iter_parent(MODEL(dive_list), nextiter, iter))
|
||||
/* we're at the last top level node */
|
||||
return;
|
||||
if (!gtk_tree_model_iter_next(MODEL(dive_list), nextiter))
|
||||
/* last trip */
|
||||
return;
|
||||
gtk_tree_model_get(MODEL(dive_list), nextiter, DIVE_INDEX, &idx, -1);
|
||||
if (idx < 0) {
|
||||
/* need the first child */
|
||||
GtkTreeIter *parent = gtk_tree_iter_copy(nextiter);
|
||||
if (! gtk_tree_model_iter_children(MODEL(dive_list), nextiter, parent))
|
||||
return;
|
||||
}
|
||||
}
|
||||
treepath = gtk_tree_model_get_path(MODEL(dive_list), nextiter);
|
||||
gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath);
|
||||
gtk_tree_selection_select_iter(selection, nextiter);
|
||||
gtk_tree_selection_unselect_iter(selection, iter);
|
||||
gtk_tree_path_free(treepath);
|
||||
}
|
||||
|
||||
void select_prev_dive(void)
|
||||
{
|
||||
GtkTreeIter previter;
|
||||
GtkTreeIter *iter = get_iter_from_idx(selected_dive);
|
||||
GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view));
|
||||
GtkTreePath *treepath;
|
||||
int idx;
|
||||
|
||||
if (!iter)
|
||||
return;
|
||||
treepath = gtk_tree_model_get_path(MODEL(dive_list), iter);
|
||||
if (!gtk_tree_path_prev(treepath)) {
|
||||
if (!gtk_tree_model_iter_parent(MODEL(dive_list), &previter, iter))
|
||||
/* we're at the last top level node */
|
||||
return;
|
||||
treepath = gtk_tree_model_get_path(MODEL(dive_list), &previter);
|
||||
if (!gtk_tree_path_prev(treepath))
|
||||
/* first trip */
|
||||
return;
|
||||
if (!gtk_tree_model_get_iter(MODEL(dive_list), &previter, treepath))
|
||||
return;
|
||||
gtk_tree_model_get(MODEL(dive_list), &previter, DIVE_INDEX, &idx, -1);
|
||||
if (idx < 0) {
|
||||
/* need the last child */
|
||||
GtkTreeIter *parent = gtk_tree_iter_copy(&previter);
|
||||
if (! gtk_tree_model_iter_nth_child(MODEL(dive_list), &previter, parent,
|
||||
gtk_tree_model_iter_n_children(MODEL(dive_list), parent) - 1))
|
||||
return;
|
||||
}
|
||||
treepath = gtk_tree_model_get_path(MODEL(dive_list), &previter);
|
||||
} else {
|
||||
if (!gtk_tree_model_get_iter(MODEL(dive_list), &previter, treepath))
|
||||
return;
|
||||
}
|
||||
gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath);
|
||||
gtk_tree_selection_select_iter(selection, &previter);
|
||||
gtk_tree_selection_unselect_iter(selection, iter);
|
||||
gtk_tree_path_free(treepath);
|
||||
}
|
||||
|
|
|
@ -13,4 +13,6 @@ extern int unsaved_changes(void);
|
|||
extern void remove_autogen_trips(void);
|
||||
extern void remember_tree_state(void);
|
||||
extern void restore_tree_state(void);
|
||||
extern void select_next_dive(void);
|
||||
extern void select_prev_dive(void);
|
||||
#endif
|
||||
|
|
36
gtk-gui.c
36
gtk-gui.c
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
#include <libintl.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <gdk/gdkkeysyms.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -1020,6 +1021,13 @@ static void toggle_zoom(GtkWidget *w, gpointer data)
|
|||
repaint_dive();
|
||||
}
|
||||
|
||||
static void prev_dc(GtkWidget *w, gpointer data)
|
||||
{
|
||||
dc_number--;
|
||||
/* If the dc number underflows, we'll "wrap around" and use the last dc */
|
||||
repaint_dive();
|
||||
}
|
||||
|
||||
static void next_dc(GtkWidget *w, gpointer data)
|
||||
{
|
||||
dc_number++;
|
||||
|
@ -1052,7 +1060,8 @@ static GtkActionEntry menu_items[] = {
|
|||
{ "ViewProfile", NULL, N_("Profile"), CTRLCHAR "2", NULL, G_CALLBACK(view_profile) },
|
||||
{ "ViewInfo", NULL, N_("Info"), CTRLCHAR "3", NULL, G_CALLBACK(view_info) },
|
||||
{ "ViewThree", NULL, N_("Three"), CTRLCHAR "4", NULL, G_CALLBACK(view_three) },
|
||||
{ "NextDC", NULL, N_("Next DC"), CTRLCHAR "C", NULL, G_CALLBACK(next_dc) },
|
||||
{ "PrevDC", NULL, N_("Prev DC"), NULL, NULL, G_CALLBACK(prev_dc) },
|
||||
{ "NextDC", NULL, N_("Next DC"), NULL, NULL, G_CALLBACK(next_dc) },
|
||||
};
|
||||
static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
|
||||
|
||||
|
@ -1094,6 +1103,7 @@ static const gchar* ui_string = " \
|
|||
<menuitem name=\"Profile\" action=\"ViewProfile\" /> \
|
||||
<menuitem name=\"Info\" action=\"ViewInfo\" /> \
|
||||
<menuitem name=\"Paned\" action=\"ViewThree\" /> \
|
||||
<menuitem name=\"PrevDC\" action=\"PrevDC\" /> \
|
||||
<menuitem name=\"NextDC\" action=\"NextDC\" /> \
|
||||
</menu> \
|
||||
</menu> \
|
||||
|
@ -1130,6 +1140,27 @@ static void switch_page(GtkNotebook *notebook, gint arg1, gpointer user_data)
|
|||
repaint_dive();
|
||||
}
|
||||
|
||||
static gboolean on_key_press(GtkWidget *w, GdkEventKey *event, GtkWidget *divelist)
|
||||
{
|
||||
if (event->type != GDK_KEY_PRESS)
|
||||
return FALSE;
|
||||
switch (event->keyval) {
|
||||
case GDK_KEY_Up:
|
||||
select_prev_dive();
|
||||
return TRUE;
|
||||
case GDK_KEY_Down:
|
||||
select_next_dive();
|
||||
return TRUE;
|
||||
case GDK_KEY_Left:
|
||||
prev_dc(NULL, NULL);
|
||||
return TRUE;
|
||||
case GDK_KEY_Right:
|
||||
next_dc(NULL, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void init_ui(int *argcp, char ***argvp)
|
||||
{
|
||||
GtkWidget *win;
|
||||
|
@ -1325,6 +1356,9 @@ void init_ui(int *argcp, char ***argvp)
|
|||
nb_page = total_stats_widget();
|
||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new(_("Stats")));
|
||||
|
||||
/* handle some keys globally (to deal with gtk focus issues) */
|
||||
g_signal_connect (G_OBJECT (win), "key_press_event", G_CALLBACK (on_key_press), dive_list);
|
||||
|
||||
gtk_widget_set_app_paintable(win, TRUE);
|
||||
gtk_widget_show_all(win);
|
||||
|
||||
|
|
13
profile.c
13
profile.c
|
@ -1800,11 +1800,24 @@ static void plot_set_scale(scale_mode_t scale)
|
|||
}
|
||||
}
|
||||
|
||||
/* make sure you pass this the FIRST dc - it just walks the list */
|
||||
static int nr_dcs(struct divecomputer *main)
|
||||
{
|
||||
int i = 1;
|
||||
struct divecomputer *dc = main;
|
||||
|
||||
while ((dc = dc->next) != NULL)
|
||||
i++;
|
||||
return i;
|
||||
}
|
||||
|
||||
static struct divecomputer *select_dc(struct divecomputer *main)
|
||||
{
|
||||
int i = dc_number;
|
||||
struct divecomputer *dc = main;
|
||||
|
||||
while (i < 0)
|
||||
i += nr_dcs(main);
|
||||
do {
|
||||
if (--i < 0)
|
||||
return dc;
|
||||
|
|
Loading…
Add table
Reference in a new issue