I lied in the commit message for commit 0468535524a3 ("When editing multiple
files, don't override existing equipment entries"); the changes there did
not parallel the logic for the string entries. Now I think it does.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
I missed one instance where a callback function needed to be passed the widget
index w_idx in the signal_connect function. It got passed a pointer to the
model instead which of course blew up when trying to dereference the array with
that "index".
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Pull dive-trip grouping from Dirk Hohndel:
"This turned into an updated pull request for the tree2 branch where I
implemented the date based grouping - but is actually a very different
topic: this adds the ability to edit multiple dives (and fixes some
issues with the dive editing overall). The reason for that is that it
reuses some of the infrastructure that I implemented in the tree2
branch for tracking the selected dives. More details in the commit
messages."
* 'tree2' of git://git.hohndel.org/subsurface:
Switch from date based to dive trip based grouping
Redo dive editing
Fix selecting and unselecting summary items
Apply sort functions to the correct model, don't select summary entries
Maintain selected rows when switching between list model and tree model
Create duplicate list model so sorting by columns works again
Improve tree model implementation
Allow date based grouping
This commit addresses two issues:
We now can add / edit / delete equipment from the edit dive dialog
We now can edit multiple dives at once
The latter feature has some interesting design constraints:
It picks the 'selected_dive' as the one to start the edit from - so if
this dive already has some information filled in, that information needs
to be overwritten before it is stored in all of the dives. Similarly, only
changes to the cylinders or weightsystems are recorded. Also, the notes
field is not editable in the multi dive edit mode (as that didn't seem
useful).
The workflow seems to work best if using the multi-edit right after
importing new dives from a dive computer. The user then can select all the
new dives and only needs to edit things like location, divemaster, buddy,
weights, etc. once.
This commit will create some obvious conflicts with the commit that adds
exposure protection tracking. It was implemented on top of the tree_view
changes as it reuses some of the infrastructure for tracking the selected
dives.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This existed in the initial implementation to deal with an implementation
problem that was long since resolved. So now it just created just an ugly
empty line in the drop down menu for weightsystems.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
With this change, if the user adds a new weightsystem to a dive, on
subsequent edits the weight amount for this weightsystem no longer
defaults to 0 but to the last weight that was used with this weightsystem.
So when the program imports a set of dives from the divecomputer and the
user starts editing them, once they enter the weight for the "integrated"
weightsystem the first time, for each of the consecutive dives that same
weight is the default once "integrated" is selected - which usually will
be the correct amount.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Linus found this embarrassing bug: double clicking on a weight system in
order to edit it launched the edit function for the first cylinder
instead. Oops.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Commit f9bb3f7910 ("Clean up reference tank information table") had
cleaned up the tank info list so that you could sanely do tanks in
liters and with a working pressure in bar.
But the LP steel cylinders had somehow missed out on the ".psi =" part
of the equation, and as a result, what was supposed to be their working
pressure instead ended up being interpreted as their size in
milli-liters.
Oops.
Fix that, and also make the standard tank info filling code actually
verify the sanity of the reference tank table, so that if this happens
again, it will complain loudly instead of using nonsensical values.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Pull weight management from Dirk Hohndel:
"This is the fifth or sixth version of this code, I'm begining to lose
track. I still struggle with the balance between code duplication and
unnecessary indirectness and complexity. Maybe I'm just not finding
the right level of abstraction. Maybe I'm just trying too hard.
The code here is reasonably well tested. Works for me :-)
It can import DivingLog xml files with weight systems and correctly
parses those. It obviously can read and write weight systems in its
own file format. It adds a KG/lbs unit default (and correctly stores
that).
The thing I still worry about is the code in equipment.c. You'll see
that I tried to abstract things in a way that weight systems and
cylinders share quite a bit of code - but there's more very similar
code that isn't shared as my attempts to do so turned into ugly and
hard to read code. It always felt like trying to write C++ in C..."
* 'weight' of git://subsurface.hohndel.org/subsurface:
Add weight system tracking
Fix up some trivial conflicts due to various renaming of globals and
simplification in function interfaces.
- supports multiple weight systems per dive
- supports multiple weight system types
- supports import of weight as tracked by DivingLog
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
We never use the number of decimals that this function returns. So we
might as well not return them to begin with.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This is Henrik's list of common metric sized cylinders, although my
experience differs from this one. In Cyprus, I was diving double 12L
cylinders, but they were 200 bar, not the 232 bar ones Henrik has on the
list.
Also, I really think we should just have a checkbox for "double" instead
of naming them explicitly like this. Henrik does have the 12L 200 bar
ones in his singles list.
But as a stop-gap, I'm just taking the values from Henrik's patch, but
converted to the new cleaned-up reference tank model setup.
Based-on-patch-by: Henrik Brautaset Aronsen <subsurface@henrik.synth.no>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This makes the reference tanks ("struct tank_info") use a saner format
which specifies explicitly whether the size is in ml or cubic feet, and
whether the pressure is in psi or bar.
So instead of having magic rules ("size is in cuft if < 1000, otherwise
mliter"), just set the size explicitly:
{ "11.1 l", .ml = 11100 },
{ "AL80", .cuft = 80, .psi = 3000 },
and then the code can just convert to standard measurements without any
odd rules, and the initialization table becomes self-explanatory too.
This is in preparation for doing the metric tanks with pressure: Henrik
Aronsen sent a really ugly patch using the previous setup, I just
couldn't stand the additional hackery.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
They were never intended to be sortable, but using common code with the
dive list picked up that "sort by index" thing by mistake.
If we really want to be able to sort cylinders by O2 percentage (which
really doesn't seem to make much sense, considering that you usually
have just one or two cylinders) we will need to also handle the case of
editing the (differently sorted) cylinder table. Which we don't do now.
Reported-by: Henrik Brautaset Aronsen <subsurface@henrik.synth.no>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Henrik Aronsen points out that we've not made it possible to edit the He
percentages for trimix diving. It's easy enough to do, I just didn't
have any dives that needed it myself. So here goes.
Reported-by: Henrik Brautaset Aronsen <subsurface@henrik.synth.no>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Miika fixed the statistics code that didn't properly check for the "no
cylinder info" case - this cleans it up and just uses the helper
function in equipment.c.
Rename the helper to be slightly better named while at it.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This way, when you have a new dive that you just imported from your dive
computer, you can just double-click on the dive and fill out all the
relevant information: location, notes, buddies and cylinder info.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Now that the dive info window is read-only, we need to edit the dives
some other way. We bring up a dive info edit dialog when you
double-click on the dive list entry for that dive.
I do want to have an "edit" button or keyboard shortcut or something
too, though.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
We always keep the focus on the dive list, so that the random gtk focus
handling doesn't suddenly randomly make us edit the combo boxes when the
cursor up/down keys start changing them instead of the dive list.
This means that dive location, notes and buddy/divemaster aren't
editable at all any more, but I'll fix that by making a separate dive
edit popup window.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This grays out the pressure settings in the cylinder editing widget if
the pressure data has been taken from the samples. You can still
manually override the data, but you now need to enable that manual
override explicitly.
This makes the semantics of editing start/end pressures of dives with
pressure sample data a bit more intuitive, I think.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
For graying things out, we want a widget, not a spinbutton. Although
I'm sure we could just cast things back and forth. But let's be
consistent with what we do, and only ever cast from GtkWidget to
GtkSpinButton, and have the same logic as for the "o2" widget that also
needs to be explicitly enabled.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This is just in case I end up doing the graying out of implicit pressure
information: I wanted to clean things up a bit first.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
NOTE! When *editing* the cylinder data, the only thing shown is the
non-sample pressure. So the cylinder editing widget will show zero for
start/end pressure for a dive that has pressure saples without any
manually set pressure data.
This is intentional, so that you can clearly see that this is not a set
value. But it may be that we should gray out the spinputton and have an
"edit value" checkbox or something to make it really obvious.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
.. although in that case we can only ever show the volume in liters, and
cannot do a conversion to cubic feet even if the user has set imperial
units.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This makes us fill in the size/pressure data for a cylinder even if we
just type the name (rather than pick an entry from the list)
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This allows us to start typing the cylinder description and we'll get a
matching list that we can select. This is similar to selecting one from
the model, and works in addition to the explicit selection.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This way the cylinder model list will contain all the different
cylinders that we have ever seen, rather than only containing the models
that we have *edited*.
That makes it much more practical to add new dives with the same
cylinders that we've used before, because now those cylinders will show
up as cylinder models even if we haven't looked and edited the old dives
first.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
The cylinder model doesn't contain the start/end pressures, they just
contain the cylinder type information. So trying to read the start and
end pressure from the cylinder model change callback is totally bogus.
We need to set the start/end pressures from the cylinder info when we
create the cylinder widget, and not touch them when the type changes.
So split up the "set_cylinder_spinbuttons()" function in two: one that
sets the type information, and one that sets the start/end pressure.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Repainting the dive will end up touching the cylinder list store, so we
should finish setting the cylinder info before we repaint it.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Those changes may have changed cylinder sizes and beginning/end
pressures, so the dive profile and SAC rate may be different.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This finally allows you to set the start/end pressures by hand.
HOWEVER! Right now, if we have samples with pressures, those samples
will always end up overriding anything you set manually. Which can be
very annoying if your wireless air integration fails halfway through.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Instead of having to keep the index up-to-date as we edit entries
around, just figure out the entry index from the model itself. Gtk
seems to make it unnecessarily hard, but what else is new?
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
You can still just select them and click the "Edit" button too, but now
you can double-click them (or select them and press "enter") for editing
too.
It seems to be the natural interface.
Also, remove the index column (that was there for debugging), and add
grid lines.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Instead of passing it the model and iterator (which requires that we
create the new entry for an 'add' event even if we then cancel the
operation), just make the caller do the final cylinder list update.
This way we can make 'add' work more sanely: if you cancel the add, we
now do not create an empty cylinder entry at the end.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
It used to just update the cylinder list widget data, not the actual
dive information.
It still needs an "accept or cancel" dialog, I suspect.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This currently only does the same old things we used to do (so still no
start/end pressure or trimix support), but despite that this is already
more flexible than the old model:
- we can now add new cylinders, rather than just edit the information of
the first two cylinders of the dive
- because the cylinder editing is being done in a edit dialog, it is
now much more reasonable to use multiple lines and expand all the
things we can edit.
But to actually make this fully fledged, we'll need to add all the other
info to the cylinder edit dialog, and probably add a confirmation dialog
for the "delete cylinder" case too.
Oh, and right now deleting a cylinder doesn't mark the dive info changed.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
We don't actually fill the widget info correctly yet, nor do we take the
actual size from the changes, but this starts to hook things up.
Soon.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This is totally useless since you cannot actually *edit* the resulting
new dive yet, but we'll get there. And this already conceptually shows
a capability that we didn't use to have with the old interface.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This leaves the actual editing code unconnected, so now you can only see
the cylinder information, not actually edit it. However, with the big
re-organization I really do want to have this as a half-way point where
I have created the new cylinder tree-view.
I now need to connect the "add/edit" buttons to dialogs that then use
the editing widgets - so I've left that widget code around, because I'll
be able to reuse a lot of it. Not all, but the cylinder type model code
in particular will be re-used pretty much as-is.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
We don't handle doubles any different than single tanks - so while
200 cuft was a sane maximum size for a tank, once you dive with
doubles this logic fails.
We may or may not decide to implement special handling for doubles at some
point, but for now simply allow for tanks all the way up to double-150.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
The following are UI toolkit specific:
gtk-gui.c - overall layout, main window of the UI
divelist.c - list of dives subsurface maintains
equipment.c - equipment / tank information for each dive
info.c - detailed dive info
print.c - printing
The rest is independent of the UI:
main.c i - program frame
dive.c i - creates and maintaines the internal dive list structure
libdivecomputer.c
uemis.c
parse-xml.c
save-xml.c - interface with dive computers and the XML files
profile.c - creates the data for the profile and draws it using cairo
This commit should contain NO functional changes, just moving code around
and a couple of minor abstractions.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Passing it around is just annoying, and we only ever have one. Let's
not burden all the users with the silly thing.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
It's too damn easy to make mistakes and not even notice them (odd gtk
widget selection and keyboard input), or just start editing a cylinder
thing and realize it was wrong.
So instead of always saving the equipment information implicitly, add
explicit "Apply" and "Cancel" buttons that save the information (or
re-load it from the dive data structure)
So now you need to press an extra button for your changes to *really*
take effect. It can be a bit annoying, but it's better than the silent
accidental equipment change that could happen before.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Now we always create the MAX_CYLINDER sets of cylinder widgets. But we
don't actually pack them into the frame - that's a separate phase.
Right now we still do the stupid "always just pack two cylinders" thing,
but the idea is that we can pack just as many as the dive needs on a
per-dive basis.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This just always shows two cylinders, which is obviously bogus, but it's
a good test-case for the multi-cylinder case.
I need to figure out how to dynamically show the right number of
cylinders, but that also involves the notion of adding a cylinder in
order to fill out information that didn't use to exist.
That's lower priority - now the infrastructure seems to be there.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Ok, now we have an array of them, and most of the time we pass the right
pointer back and forth.
There's still a couple of places that hardcode "gtk_cylinder[0]" as the
data, but by now they are mostly things that should iterate over all the
cylinders.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Create a "struct cylinder_widget" so that when we handle multiple
cylinders, we can match them up with the actual cylinder data;
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Let's try to be consistent about this. Make the parent of each widget
be a box. Maybe the frames come with boxes, but since I have no clue
about gtk, I'm going to just always create them by hand.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
We really do want to "pack" them, rather than use up the whole size. I
think.
I may end up playing around more with this.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This adds a few more predefined cylinder types to the static list, but
perhaps more importantly, if we try to show a cylinder description that
we haven't seen before, we automatically add that description to the
list as well.
This way, if people have their own cylinder types, our cylinder
management will automatically figure them out and make it easy to enter
them.
NOTE! It might be best to add the new cylinder description at dive log
load time, rather than at 'show' time.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
We also need to actually fill the model store with the cylinder models
we have in our dive lists to begin with.
This makes it all *trivial* to add a new cylinder model: just use a new
description, fill in the size and working pressure, and you're done.
The type automatically gets filled in, unless that description already
existed (in which case we leave it alone).
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
If the output units are set to cuft and psi, then we should show the
cylinder size and pressure properly.
NOTE! In the absense of pressure data, we *always* show the cylinder
volume in liter. There's no way to convert it to imperial units, since
the imperial units are not in physical size, but in air volume
normalized to surface pressure..
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
It seems to be sufficiently useful to be worth updating the dive
information now.
This still doesn't handle multiple cylinders in any way. I need to
think about the interface for that.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This doesn't actually change the cylinder type info in the dive, because
it's too broken for that. Instead it prints out what it would change
things to.
The gtk2 notion of text input focus is *really* odd. Why is the
cylinder type sometimes selected, and sometimes not?
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Make it about general equipment management, and start hooking up
functions to show new equipment information when changing dives (and to
flush changes to equipment information for the previously active dive).
Nothing is hooked up yet, and it's now showing just one (really big)
cylinder choice, so this is all broken. But it should make it possible
to at least get somewhere some day.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>