#include "display-gtk.h"
#include "divelist.h"
-static GtkEntry *location, *buddy, *divemaster;
+static GtkEntry *location, *buddy, *divemaster, *rating;
static GtkTextView *notes;
-static GtkListStore *location_list, *people_list;
+static GtkListStore *location_list, *people_list, *star_list;
static char *get_text(GtkTextView *view)
{
#define SET_TEXT_VALUE(x) \
gtk_entry_set_text(x, dive && dive->x ? dive->x : "")
+static int divename(char *buf, size_t size, struct dive *dive)
+{
+ struct tm *tm = gmtime(&dive->when);
+ return snprintf(buf, size, "Dive #%d - %s %02d/%02d/%04d at %d:%02d",
+ dive->number,
+ weekday(tm->tm_wday),
+ tm->tm_mon+1, tm->tm_mday,
+ tm->tm_year+1900,
+ tm->tm_hour, tm->tm_min);
+}
+
void show_dive_info(struct dive *dive)
{
- struct tm *tm;
const char *text;
char buffer[80];
/* dive number and location (or lacking that, the date) go in the window title */
- tm = gmtime(&dive->when);
text = dive->location;
if (!text)
text = "";
if (*text) {
snprintf(buffer, sizeof(buffer), "Dive #%d - %s", dive->number, text);
} else {
- snprintf(buffer, sizeof(buffer), "Dive #%d - %s %02d/%02d/%04d at %d:%02d",
- dive->number,
- weekday(tm->tm_wday),
- tm->tm_mon+1, tm->tm_mday,
- tm->tm_year+1900,
- tm->tm_hour, tm->tm_min);
+ divename(buffer, sizeof(buffer), dive);
}
text = buffer;
if (!dive->number)
SET_TEXT_VALUE(divemaster);
SET_TEXT_VALUE(buddy);
SET_TEXT_VALUE(location);
+ gtk_entry_set_text(rating, star_strings[dive->rating]);
gtk_text_buffer_set_text(gtk_text_view_get_buffer(notes),
dive && dive->notes ? dive->notes : "", -1);
}
+static void info_menu_edit_cb(GtkMenuItem *menuitem, gpointer user_data)
+{
+ edit_dive_info(current_dive);
+}
+
+static void populate_popup_cb(GtkTextView *entry, GtkMenu *menu, gpointer user_data)
+{
+ GtkWidget *item = gtk_menu_item_new_with_label("Edit");
+ g_signal_connect(item, "activate", G_CALLBACK(info_menu_edit_cb), NULL);
+ gtk_widget_show(item); /* Yes, really */
+ gtk_menu_prepend(menu, item);
+}
+
static GtkEntry *text_value(GtkWidget *box, const char *label)
{
GtkWidget *widget;
gtk_widget_set_can_focus(widget, FALSE);
gtk_editable_set_editable(GTK_EDITABLE(widget), FALSE);
gtk_container_add(GTK_CONTAINER(frame), widget);
+ g_signal_connect(widget, "populate-popup", G_CALLBACK(populate_popup_cb), NULL);
return GTK_ENTRY(widget);
}
gtk_widget_set_can_focus(view, FALSE);
gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view), FALSE);
+ g_signal_connect(view, "populate-popup", G_CALLBACK(populate_popup_cb), NULL);
}
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
gtk_container_add(GTK_CONTAINER(scrolled_window), view);
add_string_list_entry(string, location_list);
}
+static int get_rating(const char *string)
+{
+ int rating = 0;
+ int i;
+
+ for (i = 0; i <= 5; i++)
+ if (!strcmp(star_strings[i],string))
+ rating = i;
+ return rating;
+}
+
struct dive_info {
- GtkComboBoxEntry *location, *divemaster, *buddy;
+ GtkComboBoxEntry *location, *divemaster, *buddy, *rating;
GtkTextView *notes;
};
static void save_dive_info_changes(struct dive *dive, struct dive_info *info)
{
char *old_text, *new_text;
+ char *rating_string;
int changed = 0;
new_text = get_combo_box_entry_text(info->location, &dive->location);
changed = 1;
}
+ rating_string = strdup(star_strings[dive->rating]);
+ new_text = get_combo_box_entry_text(info->rating, &rating_string);
+ if (new_text) {
+ dive->rating = get_rating(rating_string);
+ free(rating_string);
+ changed =1;
+ }
+
old_text = dive->notes;
dive->notes = get_text(info->notes);
if (text_changed(old_text,dive->notes))
static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info *info)
{
- GtkWidget *hbox;
+ GtkWidget *hbox, *label, *cylinder, *frame;
+ char buffer[80];
+
+ divename(buffer, sizeof(buffer), dive);
+ label = gtk_label_new(buffer);
+ gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0);
info->location = text_entry(box, "Location", location_list, dive->location);
info->divemaster = text_entry(hbox, "Dive master", people_list, dive->divemaster);
info->buddy = text_entry(hbox, "Buddy", people_list, dive->buddy);
+ info->rating = text_entry(hbox, "Rating", star_list, star_strings[dive->rating]);
info->notes = text_view(box, "Notes", READ_WRITE);
if (dive->notes && *dive->notes)
gtk_text_buffer_set_text(gtk_text_view_get_buffer(info->notes), dive->notes, -1);
+
+ frame = gtk_frame_new("Cylinder");
+ cylinder = cylinder_list_widget();
+ gtk_container_add(GTK_CONTAINER(frame), cylinder);
+ gtk_box_pack_start(GTK_BOX(box), frame, FALSE, TRUE, 0);
}
int edit_dive_info(struct dive *dive)
people_list = gtk_list_store_new(1, G_TYPE_STRING);
location_list = gtk_list_store_new(1, G_TYPE_STRING);
+ star_list = gtk_list_store_new(1, G_TYPE_STRING);
+ add_string_list_entry(ZERO_STARS, star_list);
+ add_string_list_entry(ONE_STARS, star_list);
+ add_string_list_entry(TWO_STARS, star_list);
+ add_string_list_entry(THREE_STARS, star_list);
+ add_string_list_entry(FOUR_STARS, star_list);
+ add_string_list_entry(FIVE_STARS, star_list);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
location = text_value(vbox, "Location");
divemaster = text_value(hbox, "Divemaster");
buddy = text_value(hbox, "Buddy");
+ rating = text_value(hbox, "Rating");
notes = text_view(vbox, "Notes", READ_ONLY);
return vbox;