mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 13:10:19 +00:00
Remove dive info frame
It has always been problematic, and I've been moving things in and out of it. And it just isn't a very powerful widget. You can't *do* anything with it. The information it shows you may be useful, but the core stuff already shows up in the dive list. And the dive list is actually a much superior widget over that static dive info frame. The information that shows up in the dive list can be sorted by column, for example. So when we show temperatures or SAC numbers in the dive info frame, that's actually a very bad place to show them: we would be much better off showing it in the dive list, and then we could sort by SAC or by temperature. In other words: just remove the thing. Instead, plan to extend the dive list to contain all the information. That will probably mean that we need to change the current pane widget to be a vertical pane, rather than a horizontal one, but what's wrong with that? Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
96005d20ea
commit
fefcbf125e
2 changed files with 7 additions and 231 deletions
233
info.c
233
info.c
|
@ -7,24 +7,11 @@
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "divelist.h"
|
#include "divelist.h"
|
||||||
|
|
||||||
static GtkWidget *info_frame;
|
|
||||||
static GtkWidget *depth, *duration, *temperature, *airconsumption;
|
|
||||||
static GtkEntry *location, *buddy, *divemaster;
|
static GtkEntry *location, *buddy, *divemaster;
|
||||||
static GtkTextBuffer *notes;
|
static GtkTextBuffer *notes;
|
||||||
static int location_changed = 1, notes_changed = 1;
|
static int location_changed = 1, notes_changed = 1;
|
||||||
static int divemaster_changed = 1, buddy_changed = 1;
|
static int divemaster_changed = 1, buddy_changed = 1;
|
||||||
|
|
||||||
#define EMPTY_AIRCONSUMPTION " \n "
|
|
||||||
#define AIRCON_WIDTH 20
|
|
||||||
|
|
||||||
static const char *weekday(int wday)
|
|
||||||
{
|
|
||||||
static const char wday_array[7][4] = {
|
|
||||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
|
||||||
};
|
|
||||||
return wday_array[wday];
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *get_text(GtkTextBuffer *buffer)
|
static char *get_text(GtkTextBuffer *buffer)
|
||||||
{
|
{
|
||||||
GtkTextIter start;
|
GtkTextIter start;
|
||||||
|
@ -35,86 +22,6 @@ static char *get_text(GtkTextBuffer *buffer)
|
||||||
return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
|
return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_air_info(char *buffer)
|
|
||||||
{
|
|
||||||
char markup[120];
|
|
||||||
|
|
||||||
if (! buffer)
|
|
||||||
buffer = EMPTY_AIRCONSUMPTION;
|
|
||||||
snprintf(markup, sizeof(markup), "<span font=\"8\">%s</span>",buffer);
|
|
||||||
gtk_label_set_markup(GTK_LABEL(airconsumption), markup);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return air usage (in liters).
|
|
||||||
*/
|
|
||||||
static double calculate_airuse(struct dive *dive)
|
|
||||||
{
|
|
||||||
double airuse = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_CYLINDERS; i++) {
|
|
||||||
cylinder_t *cyl = dive->cylinder + i;
|
|
||||||
int size = cyl->type.size.mliter;
|
|
||||||
double kilo_atm;
|
|
||||||
|
|
||||||
if (!size)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
kilo_atm = (cyl->start.mbar - cyl->end.mbar) / 1013250.0;
|
|
||||||
|
|
||||||
/* Liters of air at 1 atm == milliliters at 1k atm*/
|
|
||||||
airuse += kilo_atm * size;
|
|
||||||
}
|
|
||||||
return airuse;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void update_air_info_frame(struct dive *dive)
|
|
||||||
{
|
|
||||||
const double liters_per_cuft = 28.317;
|
|
||||||
const char *unit, *format, *desc;
|
|
||||||
double airuse;
|
|
||||||
char buffer1[80];
|
|
||||||
char buffer2[80];
|
|
||||||
int len;
|
|
||||||
|
|
||||||
airuse = calculate_airuse(dive);
|
|
||||||
if (!airuse) {
|
|
||||||
update_air_info(NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (output_units.volume) {
|
|
||||||
case LITER:
|
|
||||||
unit = "l";
|
|
||||||
format = "vol: %4.0f %s";
|
|
||||||
break;
|
|
||||||
case CUFT:
|
|
||||||
unit = "cuft";
|
|
||||||
format = "vol: %4.2f %s";
|
|
||||||
airuse /= liters_per_cuft;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
len = snprintf(buffer1, sizeof(buffer1), format, airuse, unit);
|
|
||||||
if (dive->duration.seconds) {
|
|
||||||
double pressure = 1 + (dive->meandepth.mm / 10000.0);
|
|
||||||
double sac = airuse / pressure * 60 / dive->duration.seconds;
|
|
||||||
snprintf(buffer1+len, sizeof(buffer1)-len,
|
|
||||||
"\nSAC: %4.2f %s/min", sac, unit);
|
|
||||||
}
|
|
||||||
len = 0;
|
|
||||||
desc = dive->cylinder[0].type.description;
|
|
||||||
if (desc || dive->cylinder[0].gasmix.o2.permille) {
|
|
||||||
int o2 = dive->cylinder[0].gasmix.o2.permille / 10;
|
|
||||||
if (!desc)
|
|
||||||
desc = "";
|
|
||||||
if (!o2)
|
|
||||||
o2 = 21;
|
|
||||||
len = snprintf(buffer2, sizeof(buffer2), "%s (%d%%): used ", desc, o2);
|
|
||||||
}
|
|
||||||
snprintf(buffer2+len, sizeof(buffer2)-len, buffer1);
|
|
||||||
update_air_info(buffer2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void flush_dive_info_changes(struct dive *dive)
|
void flush_dive_info_changes(struct dive *dive)
|
||||||
{
|
{
|
||||||
if (!dive)
|
if (!dive)
|
||||||
|
@ -141,138 +48,15 @@ void flush_dive_info_changes(struct dive *dive)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SET_TEXT_ENTRY(x) \
|
||||||
|
gtk_entry_set_text(x, dive && dive->x ? dive->x : "")
|
||||||
|
|
||||||
void show_dive_info(struct dive *dive)
|
void show_dive_info(struct dive *dive)
|
||||||
{
|
{
|
||||||
struct tm *tm;
|
SET_TEXT_ENTRY(divemaster);
|
||||||
char buffer[80];
|
SET_TEXT_ENTRY(buddy);
|
||||||
char *text;
|
SET_TEXT_ENTRY(location);
|
||||||
|
gtk_text_buffer_set_text(notes, dive && dive->notes ? dive->notes : "", -1);
|
||||||
if (!dive) {
|
|
||||||
gtk_label_set_text(GTK_LABEL(depth), "");
|
|
||||||
gtk_label_set_text(GTK_LABEL(duration), "");
|
|
||||||
gtk_label_set_text(GTK_LABEL(airconsumption), EMPTY_AIRCONSUMPTION);
|
|
||||||
gtk_label_set_width_chars(GTK_LABEL(airconsumption), AIRCON_WIDTH);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
text = buffer;
|
|
||||||
if (!dive->number)
|
|
||||||
text += 10; /* Skip the "Dive #0 - " part */
|
|
||||||
gtk_window_set_title(GTK_WINDOW(main_window), text);
|
|
||||||
|
|
||||||
/* the date goes in the frame label */
|
|
||||||
snprintf(buffer, sizeof(buffer), "%s %02d/%02d/%04d at %d:%02d",
|
|
||||||
weekday(tm->tm_wday),
|
|
||||||
tm->tm_mon+1, tm->tm_mday,
|
|
||||||
tm->tm_year+1900,
|
|
||||||
tm->tm_hour, tm->tm_min);
|
|
||||||
gtk_frame_set_label(GTK_FRAME(info_frame), buffer);
|
|
||||||
|
|
||||||
|
|
||||||
switch (output_units.length) {
|
|
||||||
case METERS:
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"%.1f m",
|
|
||||||
dive->maxdepth.mm / 1000.0);
|
|
||||||
break;
|
|
||||||
case FEET:
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"%d ft",
|
|
||||||
to_feet(dive->maxdepth));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
gtk_label_set_text(GTK_LABEL(depth), buffer);
|
|
||||||
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"%d min",
|
|
||||||
dive->duration.seconds / 60);
|
|
||||||
gtk_label_set_text(GTK_LABEL(duration), buffer);
|
|
||||||
|
|
||||||
*buffer = 0;
|
|
||||||
if (dive->watertemp.mkelvin) {
|
|
||||||
switch (output_units.temperature) {
|
|
||||||
case CELSIUS:
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"%d C",
|
|
||||||
to_C(dive->watertemp));
|
|
||||||
break;
|
|
||||||
case FAHRENHEIT:
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"%d F",
|
|
||||||
to_F(dive->watertemp));
|
|
||||||
break;
|
|
||||||
case KELVIN:
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"%d K",
|
|
||||||
to_K(dive->watertemp));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gtk_label_set_text(GTK_LABEL(temperature), buffer);
|
|
||||||
|
|
||||||
text = dive->location ? : "";
|
|
||||||
gtk_entry_set_text(location, text);
|
|
||||||
|
|
||||||
text = dive->divemaster ? : "";
|
|
||||||
gtk_entry_set_text(divemaster, text);
|
|
||||||
|
|
||||||
text = dive->buddy ? : "";
|
|
||||||
gtk_entry_set_text(buddy, text);
|
|
||||||
|
|
||||||
text = dive->notes ? : "";
|
|
||||||
gtk_text_buffer_set_text(notes, text, -1);
|
|
||||||
|
|
||||||
update_air_info_frame(dive);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GtkWidget *info_label(GtkWidget *box, const char *str, GtkJustification jtype)
|
|
||||||
{
|
|
||||||
GtkWidget *label = gtk_label_new(str);
|
|
||||||
gtk_label_set_justify(GTK_LABEL(label), jtype);
|
|
||||||
gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0);
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
GtkWidget *dive_info_frame(void)
|
|
||||||
{
|
|
||||||
GtkWidget *frame;
|
|
||||||
GtkWidget *hbox;
|
|
||||||
GtkWidget *vbox;
|
|
||||||
|
|
||||||
frame = gtk_frame_new("Dive info");
|
|
||||||
info_frame = frame;
|
|
||||||
gtk_widget_show(frame);
|
|
||||||
|
|
||||||
vbox = gtk_vbox_new(FALSE, 6);
|
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
|
|
||||||
gtk_container_add(GTK_CONTAINER(frame), vbox);
|
|
||||||
|
|
||||||
hbox = gtk_hbox_new(FALSE, 16);
|
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
|
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
|
|
||||||
|
|
||||||
depth = info_label(hbox, "depth", GTK_JUSTIFY_RIGHT);
|
|
||||||
duration = info_label(hbox, "duration", GTK_JUSTIFY_RIGHT);
|
|
||||||
temperature = info_label(hbox, "temperature", GTK_JUSTIFY_RIGHT);
|
|
||||||
airconsumption = info_label(hbox, "air", GTK_JUSTIFY_RIGHT);
|
|
||||||
gtk_misc_set_alignment(GTK_MISC(airconsumption), 1.0, 0.5);
|
|
||||||
gtk_label_set_width_chars(GTK_LABEL(airconsumption), AIRCON_WIDTH);
|
|
||||||
|
|
||||||
return frame;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkEntry *text_entry(GtkWidget *box, const char *label)
|
static GtkEntry *text_entry(GtkWidget *box, const char *label)
|
||||||
|
@ -330,8 +114,5 @@ GtkWidget *extended_dive_info_widget(void)
|
||||||
buddy = text_entry(hbox, "Buddy");
|
buddy = text_entry(hbox, "Buddy");
|
||||||
|
|
||||||
notes = text_view(vbox, "Notes");
|
notes = text_view(vbox, "Notes");
|
||||||
|
|
||||||
/* Add extended info here: name, description, yadda yadda */
|
|
||||||
show_dive_info(current_dive);
|
|
||||||
return vbox;
|
return vbox;
|
||||||
}
|
}
|
||||||
|
|
5
main.c
5
main.c
|
@ -422,7 +422,6 @@ int main(int argc, char **argv)
|
||||||
GtkWidget *paned;
|
GtkWidget *paned;
|
||||||
GtkWidget *info_box;
|
GtkWidget *info_box;
|
||||||
GtkWidget *notebook;
|
GtkWidget *notebook;
|
||||||
GtkWidget *frame;
|
|
||||||
GtkWidget *dive_info;
|
GtkWidget *dive_info;
|
||||||
GtkWidget *equipment;
|
GtkWidget *equipment;
|
||||||
GtkWidget *menubar;
|
GtkWidget *menubar;
|
||||||
|
@ -469,10 +468,6 @@ int main(int argc, char **argv)
|
||||||
info_box = gtk_vbox_new(FALSE, 6);
|
info_box = gtk_vbox_new(FALSE, 6);
|
||||||
gtk_paned_add2(GTK_PANED(paned), info_box);
|
gtk_paned_add2(GTK_PANED(paned), info_box);
|
||||||
|
|
||||||
/* Frame for minimal dive info */
|
|
||||||
frame = dive_info_frame();
|
|
||||||
gtk_box_pack_start(GTK_BOX(info_box), frame, FALSE, TRUE, 6);
|
|
||||||
|
|
||||||
/* Notebook for dive info vs profile vs .. */
|
/* Notebook for dive info vs profile vs .. */
|
||||||
notebook = gtk_notebook_new();
|
notebook = gtk_notebook_new();
|
||||||
g_signal_connect(notebook, "switch-page", G_CALLBACK(switch_page), NULL);
|
g_signal_connect(notebook, "switch-page", G_CALLBACK(switch_page), NULL);
|
||||||
|
|
Loading…
Reference in a new issue