summaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2013-01-03Rewrite the nickname replacement functionGravatar Dirk Hohndel
This function had a couple of bugs. Two different off by one errors and on top of that it was matching only the deviceid instead of model and deviceid. So I simply rewrote it to match against the full pattern and take a much more straight forward approach to replacing the entry for the divecomputer under consideration. If the new nickname is entry this implementation allocates one extra byte - but that didn't seem worth the extra code to fix it. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-02Limit to 4 the number of cylinders shown in the data frameGravatar Salvador Cuñat
For dives with more than 4 cylinders, the frame got very crowded and we needed a magnifier to see the numbers. If we used more than four tanks, let's put the info in another frame, if not, print the OTUs, the maxcns and the weight sytem in the new frame. There is still room for two more short data. Changed naming of nitrox and trimix mixes. Changed cylinder description. There are issues with the size of some translations. Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-02Use old style (pre gtk-2.22) keysymsGravatar Dirk Hohndel
And include the compatibility header to build on newer versions. Reported-by: Salvador Cuñat <salvador.cunat@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-02Fix mixed dive/trip tree model groupingGravatar Linus Torvalds
In commit 96db56f89c76 ("Allow overlapping (and disjoint) dive trips") I allowed dives to be part of arbitrary dive trips regardless of date, which meant that the divelist tree model code needed to find the right parent for a dive as it was inserted. That code stupidly assumed that the top level of the dive list tree containted *only* trips, which is not at all the case. It happens to be true if you group all your dives into divetrips (the common case for autogroup=1, which real users do tend to have), but now that Dirk made the autogrouping be a per-xml-file setting, it became much easier to trigger the "mixed trips and non-trip dives" case, and that showed the stupid bug with the test dives. So instead of just blindly iterating to the 'n'th entry, search for the actual entry that is the dive trip we want to associate a dive with. Reported-by: Lubomir Ivanov <neolit123@gmail.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01Treat headings properly when importing Suunto logsGravatar Miika Turkia
This patch will convert a heading bookmark to Subsurface format. Suunto's bookmark uses "Heading: <degrees>°" format and was previously set as the full event name. Now the resulting event will look like: <event name="heading" value="333" time="0:58 min"/> Signed-off-by: Miika Turkia <miika.turkia@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01Keep the selected dive visible in the divelistGravatar Linus Torvalds
This patch makes the divelist behave more as you would expect it as you scroll up and down through its entries. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01Remove autogroup from the preferences and store per file insteadGravatar Dirk Hohndel
Having two spots to toggle autogroup had always been a clear sign of insanity. The inconsistent ludicrous semantic of when we remembered the state of autogroup was even worse. This finally gets rid of that disaster and drops the autogroup setting from the preferences and makes it instead a per file property. When you save a file, it saves the state of the autogroup toggle. This seems much more useful - you may have files where you want to create trips by default. And others, where you don't. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01Make sure remember_dc has its own copy of the model stringGravatar Dirk Hohndel
When called from the parser the model string is freed right after passing it to remember_dc. So we need to get our own copy. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01Add ability to remove a divecomputer from our data structuresGravatar Dirk Hohndel
Right now this isn't used but it will be needed for the yet to be written UI to manage our divecomputer database. This commit also fixes an oversight in the remember_dc function. Updates to nicknames weren't committed to the config. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01Merge branch 'updown'Gravatar Dirk Hohndel
Bring in the keyboard handling change
2013-01-01Use the Left and Right keys to switch between divecomputersGravatar Dirk Hohndel
The existing code had the somewhat retarded Ctrl-C binding for displaying the next divecomputer and no way to go back to the previous one. With this commit we use our keyboard grab to map Left and Right to previous and next divecomputer. Much nicer. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01Clear divecomputer saved status before saving the nicknames to XMLGravatar Dirk Hohndel
In commit c7169bd24f22 "Fix nickname saving in XML file to deal with utf8 characters" I added the helper function to clear the "this divecomputer has already been saved"-flag. But then forgot to call it from save_dives before saving the divecomputer nicknames. Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-01First step towards grabbing keys and handling them ourselvesGravatar Dirk Hohndel
This commit steals the cursor up and down keys away from gtk so regardless where gtk thinks the focus may be, we can still use the keys to change between dives. In the current UI design where all editing happens in separate windows this works as expected, as we only grab the keys for the main window. If we manage to re-enable in-place editing then we need to make sure that this doesn't cause problems (as gtk uses up/down for the ability to change drop down selections in combo boxes or values in spin buttons. So we must make sure that we stop stealing these keys once we start editing something (in which case simply switching to the next/prev dive wouldn't be a good thing, anyway). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-30First step in cleaning up cylinder pressure sensor logicGravatar Linus Torvalds
This clarifies/changes the meaning of our "cylinderindex" entry in our samples. It has been rather confused, because different dive computers have done things differently, and the naming really hasn't helped. There are two totally different - and independent - cylinder "indexes": - the pressure sensor index, which indicates which cylinder the sensor data is from. - the "active cylinder" index, which indicates which cylinder we actually breathe from. These two values really are totally independent, and have nothing what-so-ever to do with each other. The sensor index may well be fixed: many dive computers only support a single pressure sensor (whether wireless or wired), and the sensor index is thus always zero. Other dive computers may support multiple pressure sensors, and the gas switch event may - or may not - indicate that the sensor changed too. A dive computer might give the sensor data for *all* cylinders it can read, regardless of which one is the one we're actively breathing. In fact, some dive computers might give sensor data for not just *your* cylinder, but your buddies. This patch renames "cylinderindex" in the samples as "sensor", making it quite clear that it's about which sensor index the pressure data in the sample is about. The way we figure out which is the currently active gas is with an explicit has change event. If a computer (like the Uemis Zurich) joins the two concepts together, then a sensor change should also create a gas switch event. This patch also changes the Uemis importer to do that. Finally, it should be noted that the plot info works totally separately from the sample data, and is about what we actually *display*, not about the sample pressures etc. In the plot info, the "cylinderindex" does in fact mean the currently active cylinder, and while it is initially set to match the sensor information from the samples, we then walk the gas change events and fix it up - and if the active cylinder differs from the sensor cylinder, we clear the sensor data. [Dirk Hohndel: this conflicted with some of my recent changes - I think I merged things correctly...] Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-30Fix nickname saving in XML file to deal with utf8 charactersGravatar Dirk Hohndel
This makes the whole code much cleaner and simpler. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-30Allow overlapping (and disjoint) dive tripsGravatar Linus Torvalds
We used to have the rule that a dive trip has to have all dives in it in sequential order, even though our XML file really is much more flexible, and allows arbitrary nesting of dives within a dive trip. Put another way, the old model had fairly inflexible rules: - the dive array is sorted by time - a dive trip is always a contiguous slice of this sorted array which makes perfect sense when you think of the dive and trip list as a physical activity by one person, but leads to various very subtle issues in the general case when there are no guarantees that the user then uses subsurface that way. In particular, if you load the XML files of two divers that have overlapping dive trips, the end result is incredibly messy, and does not conform to the above model at all. There's two ways to enforce such conformance: - disallow that kind of behavior entirely. This is actually hard. Our XML files aren't date-based, they are based on XML nesting rules, and even a single XML file can have nesting that violates the date ordering. With multiple XML files, it's trivial to do in practice, and while we could just fail at loading, the failure would have to be a hard failure that leaves the user no way to use the data at all. - try to "fix it up" by sorting, splitting, and combining dive trips automatically. Dirk had a patch to do this, but it really does destroy the actual dive data: if you load both mine and Dirk's dive trips, you ended up with a result that followed the above two technical rules, but that didn't actually make any *sense*. So this patch doesn't try to enforce the rules, and instead just changes them to be more generic: - the dive array is still sorted by dive time - a dive trip is just an arbitrary collection of dives. The relaxed rules means that mixing dives and dive trips for two people is trivial, and we can easily handle any XML file. The dive trip is defined by the XML nesting level, and is totally independent of any date-based sorting. It does require a few things: - when we save our dive data, we have to do it hierarchically by dive trip, not just by walking the dive array linearly. - similarly, when we create the dive tree model, we can't just blindly walk the array of dives one by one, we have to look up the correct trip (parent) - when we try to merge two dives that are adjacent (by date sorting), we can't do it if they are in different trips. but apart from that, nothing else really changes. NOTE! Despite the new relaxed model, creating totally disjoing dive trips is not all that easy (nor is there any *reason* for it to be easty). Our GUI interfaces still are "add dive to trip above" etc, and the automatic adding of dives to dive trips is obviously still based on date. So this does not really change the expected normal usage, the relaxed data structure rules just mean that we don't need to worry about the odd cases as much, because we can just let them be. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-30Update deco handlingGravatar Dirk Hohndel
This commit makes deco handling in Subsurface more compatible with the way libdivecomputer creates the data. Previously we assumed that having a stopdepth or stoptime and no ndl meant that we were in deco. But libdivecomputer supports many dive computers that provide the deco state of the diver but with no information about the next stop or the time needed there. In order to be able to model this in Subsurface this adds an in_deco flag to the samples. This is only stored to the XML file when it changes so it doesn't add much overhead but will allow us to display some deco information on dive computers like the Atomic Aquatics Cobalt or many of the Suuntos (among others). The commit also removes the old event based deco code that was commented out already. And fixes the code so that the deco / ndl information is stored for the very last sample as well. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-30Add time stamp to the debugging printout of vendor specific samplesGravatar Dirk Hohndel
They are useful for debugging things in libdivecomputer and this way it's easier to match the data to specific points in the dive profile. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-29Make the tooltip text for gaschange events more informativeGravatar Dirk Hohndel
We now print out "air", "nn% O2", or "(nn/xx)" for trimix. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-29Make sure the model is non-NULL before comparing with itGravatar Dirk Hohndel
In commit 194a05b18911 "Correct the detection of existing dives in the Uemis downloader" I forgot to add that check before calling strcmp. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Allow sorting dives by date - without the dive trips in the dive listGravatar Linus Torvalds
We used to enable dive trips whenever we sorted by date, which can be a bit annoying. Sometimes you really just want to sort all your dives by date, without necessarily seeing the trip data. So this changes the default sort to be the "dive number" table, and then does *not* actually sort by the dive number, but instead enables the trips, and then sorts the result by date. So the "dive number" column - which used to be non-sortable - becomes semantically equivalent to the old date column sorting. And now sorting by date makes it act like sorting by depth or any other attribute - we hide the dive trip tree, and just show the plain list of dives (sorted by date, obviously). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28When libdivecomputer reports a DECOSTOP or DEEPSTOP, set ndl to 0Gravatar Dirk Hohndel
Without this deco could be mistaken as safety stop (in the case where between two samples we go from a positive ndl to suddenly having a stop - so we never reach ndl of 0) Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Don't store notes that are just one space on the UemisGravatar Dirk Hohndel
Sometimes the Uemis appears to return " " as notes instead of no notes. This patch filters this out (otherwise redownloading divecomputers can cause silly things like notes that say "(existing note) or ( )" ) Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Correct the detection of existing dives in the Uemis downloaderGravatar Dirk Hohndel
This didn't take multiple divecomputers into account and didn't compare the model as well as the deviceid to match a divecomputer. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Don't match existing dives by date if the dive computers are known to be ↵Gravatar Linus Torvalds
different When downloading from a dive computer, we fall back on matching the exact date of the dive if we can't tell whether we already have that exact dive computer data some other way. However, if you have multiple dive computers and they are sufficiently well synchronized, they might actually have the exact same date, despite the fact that we do want to download both dive computers. We do check the dive start to the exact second, so this sounds unlikely, but with dive computers rounding time to the next minute etc, it's not as unlikely as you'd think. Dirk hit it. So when we match against date, do check that the dive computer might actually be one we've already downloaded from. If we have full model information, we can dismiss the "match date" logic. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Make add_dc_to_string() skip redundant entriesGravatar Linus Torvalds
There is no point writing out divecomputer nicknames that do not exist (or that match the dive computer model), so don't. Also, make the function to do this static to save-xml.c, which is the only user (I initially didn't _find_ the function to create the XML string because it was illogically hidden in gtk-gui.c), and change the calling convention to be more direct (pass in a string and return a result, rather than modify a "pointer to string"). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Added some extra space for the "or" word when merging two stringsGravatar Lubomir I. Ivanov
dive.c:merge_text(): When "or" is translated into other languages it may be longer than 2 letters, therefore there is a need for a slightly larger buffer to be reserved. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Free trip notes memory when deleting a tripGravatar Lubomir I. Ivanov
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Don't allocate an intermediate buffer for most parsed xmlNode contentsGravatar Lubomir I. Ivanov
parse-xml.c: Instead of always allocating a buffer when parsing a node, only do so for "strings" in the utf8_string() function. Also move the whitespace trimming of node contents in there. This change also requires that most parsing functions don't free the passed buffer, as it will be part of memory allocated by libxml2. visit_one_node(), now also has a xmlIsBlankNode() check, where if 1 is returned, the node contains only whitespace or is empty and should not be processed. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Support tank size information download from Atomic Aquatics CobaltGravatar Dirk Hohndel
This should really be done in libdivecomputer, but that can't happen until the API there gets extended to support tank sizes. So for now with this code we manually parse the raw dive data (if downloaded via libdivecomputer from a Cobalt) and setup the tank size ourselves. This had relatively limited testing so far. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-28Divecomputer entries with deviceid 0 should be ignored for nicknamesGravatar Dirk Hohndel
Those only come from a number of development versions of Subsurface that didn't include the deviceid in the divecomputer entry. There is no way of telling different dive computers (of the same model) apart, so assigning a nickname to such an entry then creates incorrect output when loading an XML file from someone else (e.g. Linus and I both have a Uemis SDA and both may have entries for our own SDA with deviceid 0; then the nickname Subsurface shows for any Uemis SDA entry with a deviceid of 0 depends on whether I last loaded his XML file or mine; that makes no sense). This should only affect the develoers who stored XML files with one of the development version of Subsurface that didn't store deviceids. Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-27Fix incorrect memory access in nickname handlingGravatar Dirk Hohndel
There was one code path where we didn't strdup the nickname - and this got triggered when parsing XML files with divecomputerid entries for dive computers that were already in the config. The nickname is then replaced with the nickname from the parser - and that memory is later reused... We should cleanup that nickname, anyway, and that also takes care of making sure we have our own copy. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-27Clear redundant "description" when merging two cylinder typesGravatar Lubomir I. Ivanov
dive.c: merge_cyclinder_type() can cause a small memory leak if two cylinder types are about to be merged, but the redundant one has a "description" string allocated. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-27When a dive computer is deleted also clear its modelGravatar Lubomir I. Ivanov
dive.c: A dive computer may have its model allocated in memory. Let's clear that as well when calling free_dc(). Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-27Small changes in the memory management when dive-mergingGravatar Lubomir I. Ivanov
This patch makes a couple of modifications: 1) divelist.c:delete_single_dive() now tries to free all memory associated with a dive, such as the string values for divemaster, location, notes & etc. 2) dive.c:merge_text(), now always makes a copy in memory for the returned string - either combined or one of the two which are passed to the function. The reason for the above two changes is that when (say) importing the same data over and over, technically a merge will occur for the contained dives, but mapped pointers can go out of scope. main.c:report_dives() calls try_to_merge() and if succeeds the two dives that were merged are deleted from the table. when we delete a dive, we now make sure all string data is cleared with it, but also in the actual merge itself, which precedes, copies of the merged texts are made (with merge_text()), so that the new, resulted dive has his own text allocations. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-27Clear memory allocated for event namesGravatar Lubomir I. Ivanov
parse-xml.c: When parsing events, we allocate memory for the event 'name' attribute, but also have to free this memory eventually. Let's do that in event_end() right after add_event() is called. Fixes a long-running memory leak in the parser. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-26Fix crash when trip info changes across remember/restore tree stateGravatar Dirk Hohndel
Interesting crash. Importing a file gets us to a stage where we have a trip tree note with a date that doesn't exist as trip date. That's clearly bogus. And in import_files() we assume that all is still fine and try to restore the old expanded / selected state for the various trips. There is clearly a bigger issue here, this patch at least prevents the actual crash from happening by making sure the pointer is non-NULL before dereferencing it. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-26Add settings section to XML file format and store dive computer IDsGravatar Dirk Hohndel
We only store the model/deviceid/nickname for those dive computers that are mentioned in the XML file. This should make the XML files nicely selfcontained. This also changes the code to consistently use model & deviceid to identify a dive computer. The deviceid is NOT guaranteed to be collision free between different libdivecomputer backends... Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-23Different is different from the same (fix silly bug in nickname handling)Gravatar Dirk Hohndel
Trying to simplify the API for nickname handling I went a bit too far. We indeed need to different API calls, one that returns an entry in the nicknamelist for the deviceid that we have. And one that looks if there is an entry for a different deviceid but the same model that we have. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-22Next improvement of the nickname codeGravatar Dirk Hohndel
Now it is able to replace nicknames for existing entries (which will be needed by the yet to be written UI). This commit fixes a couple issues with the previous code: - a potential SIGSEGV with malformed config entries - missing closing parenthesis in the dialog box text Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-22Add some text in statistics.c for translationGravatar Lubomir I. Ivanov
Some UI texts were missing translation, such as: "for selected dive" "for all dives" Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-22Make it possible to translate strings containing subscript "2"Gravatar Lubomir I. Ivanov
The "Tec settings" dialog contains some strings with the subscript "2" character, which have to be translated. While the "2" is part of the string xgettext doesn't seem to recognize such. To trick it we use a temporary buffer and c-format: sprintf(utf8_buf, _("Show pO%s graph"), UTF8_SUBSCRIPT_2); button = gtk_check_button_new_with_label(utf8_buf); Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-22Free some nickname related memory in gtk-gui.cGravatar Lubomir I. Ivanov
init_ui(): We add the char pointer "conf_copy" and free it afterwards, since once "next_token" is changed it no longer points to the allocated heap location the mapper returned. [Dirk Hohndel: original patch rewritten to have better variable names and to match the recent changes to this code] Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-22Fix some small memory leaks related to gtk_tree_model_get_path()Gravatar Lubomir I. Ivanov
From the GTK docs on gtk_tree_model_get_path(): "Returns a newly-created GtkTreePath referenced by iter. This path should be freed with gtk_tree_path_free()." Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-22Imrpove the nickname handlingGravatar Dirk Hohndel
We now store the model information together with the deviceid and nickname in order to be able to check if we have a record for any dive computer with the same model (as that now triggers our nickname dialog). This changes the format of the config entries for nicknames - the best solution might be to just delete those and start again. What is still missing is the code to store the nicknames in the XML file. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-21Remove nickname from divecomputer data structureGravatar Dirk Hohndel
Having it there with the model information seemed to make sense but on second thought it's the wrong spot to keep that information, especially since we were storing it in the XML file in every single dive. This change removes the nickname member from the divecomputer and makes the rest of the code reasonably self consistent. It does not add much of the new code for the new design to handle nicknames. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-20Correctly calculate OTUs when pO2 is recorded in the samplesGravatar Dirk Hohndel
This will normally happen for CCR dives with a set pO2. The old calculations was only valid for OC dives. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-20If no dives are selected, clear the stats widgetGravatar Dirk Hohndel
Previously we had lots of zeros and some non-sensical data displayed (the temp values were actually not zeroed out). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-20Show which dives are covered by the statisticsGravatar Dirk Hohndel
If all selected dives appear to have numbers that make sense, assemble a string that lists the selected dives (and try to be smart about finding ranges) and display those in the frame of the statistics widget. The code sets an arbitrary length limit on that list of dive numbers and tries to be smart about creating an ellipsis if necessary. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-12-19Initial Russian translation for Subsurface.Gravatar Sergey Starosek
Some acronyms (SAC, OLF, OTU) were not translated since there's no settled/common ones in russian. Signed-off-by: Sergey Starosek <sergey.starosek@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>