Split out the actual filtering from the MultiFilterSortModel.
Create a DiveFilter class that does the actual filtering.
Currently, mobile and desktop have their own version of this
class, though ultimately we may want to merge them.
The idea here is that the trip-model and undo-commands have
direct access to the filter-function and thus can take care
of keeping track of the number of shown dives, etc.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
The filter-model was catching dives-added / dives-deleted signals
from the models to keep track of the number of shown dives.
To simplify the data flow, do this directly in the undo-command.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
We mark hidden/shown dives in the core but store the number
of shown dives in the MultiFilterSortModel. Move this datum
to the core for improved locality.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Previously this created a bogus Subsurface.app.zip.zip file and then
failed to upload it to the release.
The upload / download pair of default actions is happier with just the folder.
And then the creation of the zip file needs the '-r' switch. Oops.
Finally, the pull-request specific uploads as build artifact are completely
redundant since we already do this to move the data from the macOS build to the
container that runs our own publish action in the first place.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
According to the man page, fopen and fclose return
the error number in the global variable errno.
Fixes CID 350115
Signed-off-by: Robert C. Helling <helling@atdotde.de>
This fixes another thing Coverty found. I am not 100% sure
I understand the semantics of cylinder_t.manually_added
but looking at other instance I guess true is the correct
value for a cylinder from a csv file for a Poseidon
rebreather.
Fixes CID 350734
Signed-off-by: Robert C. Helling <helling@atdotde.de>
Coverty found that in the export functions, we initialize
the planner deco state with NULL and then possibly later
access its content. This makes sure, we don't do that.
Let's see if this makes Coverty happy or I missed somehting
else.
Fixes CID 350736
Fixes CID 350735
Signed-off-by: Robert C. Helling <helling@atdotde.de>
Remove modification of style sheet for "Dive mode" box in info tab.
This fixes a broken UI layout under Windows.
Signed-off-by: Stefan Fuchs <sfuchs@gmx.de>
Three minor changes in tab widget UI layout and txt:
- Remove leading space in string "Gas name"
- Remove duplicate <item> entry
- Correct "leftMargin" and "rightMargin" to 0 everywhere
Signed-off-by: Stefan Fuchs <sfuchs@gmx.de>
Introduce a DiveTripModelBase::clear() function that cleanly
clears all dive data inside a beginResetModel()/endResetModel()
pair. Thus, the UI will be cleanly reset and we can remove
explicit calls to
- graphics->setEmptyState()
- mainTab->clearTabs()
- mainTab->clearTabs()
- diveList->reload()
from MainWindow::closeCurrentFile().
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
The tooltip's plotInfo was not cleared when clearing the profile.
With the new cylinder code, this lead to crashes, because the
displayed_dive's cylinder array is now cleared. The old code would
happily read stale data from the fixed-size cylinders array.
Clear the plotInfo explicitly.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
It makes no sense to have a non-NULL current_dive once all dives
have been deleted. Therefore, clear current_dive implicitly in
clear_dive_file_data() and don't depend on the caller performing
this.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
The latter was the only caller of the former and there seems
to be no clear separation between the two. By making a single
function out of this the code is easier to follow and duplicate
code can be more easily detected. Matter of fact, the profile
was cleared twice.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit did the "right" thing by implementing Qt mode semantics
as intended, but for unknown reasons the profile is not properly
cleared on close-file anymore. This code is so convoluted that there
is not point in fighting it at the moment. Revert to remove-rows
instead of reset-model.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
In get_gas_used() the use was left uninitialized if there are neither
user- nor computer-supplied values. This gives random SACs in the UI.
Initialize to 0.
Fixes#2376.
Reported-by: Stefan Fuchs <sfuchs@gmx.de>
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
DiveTripModelTree::topLevelChanged() has pretty complex code, as
it has to handle the fact that when adding/removing a dive from
a trip, the trip can change its position.
The code did not account for the fact that when moving an object
back in the top level list, one has to subtract one from the new
index, because the object was removed somewhere in the front of
the list.
To make matters worse, when an entry stayed where it was, this
was realized by moving the entry right behind itself, which of
course means that it stays where it is. But this meant that in
the by far most common case (no moving) the wrong entry was
updated.
Fix this by subtracting 1 from the new index when moving an
entry to the back.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
In the future we might want to use undo-commands for mobile as
well (even if not implementing undo).
Therefore, move the undo-command source from desktop-widgets
to their own commands top-level folder.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Kirigami 5.62 uses QtQuick.Controls 2.5, which were introduced in
Qt 5.12 (see https://doc.qt.io/qt-5/qtquickcontrols-index.html)
update CMakeList.txt to demand min. 5.12 when building SUBSURFACE-MOBILE
update INSTALL text
Signed-off-by: Jan Iversen <jan@casacondor.com>
We used to only keep sites with dives around. This changed when
implementing the dive site tab. The paste-dive code was written
using the old semantics and thus, when overwriting dive sites,
it deleted unused dive sites.
To make things consistent, remove that code. It would be very
weird when dive sites are deleted by pasting, but not by setting
a different dive site manually.
Bonus: no more dependencies on desktop-includes in the undo code.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This file included "desktop-widgets/divelistview.h" without needing
it. If we want to use the undo commands on mobile we shouldn't
include desktop headers. Therefore, remove the include.
This has the unintended side-effect that the Qt debug headers are
not included indirectly anymore. Thus, change a few
"qWarning() << ..." instances to "qWarning(...)".
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Removing / moving a dive computer needs a profile replot. This
was done explicitly in DiveComputerBase::redoit(). This is
unnecessary, as a profile replot is performed implicitly by the
setSelection() call.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Dives used to be added from a special dive-edit screen. Thus, the
undo command had to close that screen. This is no longer the case.
Remove the calls.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
clang correctly warns about std::move()ing objects returned from
functions. This is a pessimization, because the compiler can't
copy elide the object. Remove.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
commit 5ce4b3d5e set minimum Qt level to 5.11 for Subsurface-mobile
commit 3df2be5c1 set minimum Qt level to 5.9.1 for Subsurface
update INSTALL to reflect to new Qt versions
Signed-off-by: Jan Iversen <jan@casacondor.com>
The determination of minimum pressure in calculate_max_limits_new()
in profile.c was wrong for a long time. Since the loop went over all
cylinders (even unused ones), the minimum pressure was always zero.
Since we loop only over used cylinders, the minimum pressure was
initialized to the lowest starting pressure of any cylinder.
If there were no events with pressure change, the minimum pressure
stayed unchanged, resulting in a funky scaling.
Instead, let's initialize the minimum pressure to the lowest ending
pressure.
Reported-by: Willem Ferguson <willemferguson@zoology.up.ac.za>
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
In the information tab, presenting atmospheric pressure is a bit
unintuitive because the diver cannot easily relate that to altitude.
For the Atm. Pressure widget in the Information tab this code does:
If the atmospheric pressure for a dive exists and the user selects
the 'm' or 'ft' option from the combobox, then the estimated altitude
is shown in the text box.
Signed-off-by: willemferguson <willemferguson@zoology.up.ac.za>
To test whether an entry is a trip, we passed a pointer to the
trip through a QVariant and tested that for null-ity.
Passing pointers through QVariants has given us myriads of
problems in QML, therefore introduce a bool IS_TRIP_ROLE
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
default parameter values is not supported as this syntax was introduced
in ECMA-262 6th edition while QML only implements the fifth edition
(as of Qt 5.11).
remove default parameter and check for undefined instead.
Signed-off-by: Jan Iversen <jan@casacondor.com>
Currently the top righthand part of the notes tab is used for
showing and editing air teperature and water temperature. But
these fields were moved over to the Information tab and are not
required in the Notes tab any more. Rather use this space for the
depth and duration data for manually-entered dives. Currently
extra vertical space is created in the Notes tab for showing this
field, resulting in inefficient use of screen space and
inelegant layout. This code moves the Duration and Depth fields
into the top righthand of the Notes tab.
Signed-off-by: willemferguson <willemferguson@zoology.up.ac.za>
The undo stack is preserved.
This is in preparation of removing temperatures from the Notes tab.
Signed-off-by: willemferguson <willemferguson@zoology.up.ac.za>
1) Reorganise the existing widgets in the Information tab
2) Move divemode widget and visibility widget from Notes tab to
Information tab
3) Translate water density to a word indicating water type
4) Reorganise the Notes tab to compensate for the moving the
divemode and visibility widgets to the Information tab
5) Remove the problems in showing a QGroupBox in Qt Windows. I do
this by removing the CSS specifying border characteristics
Signed-off-by: willemferguson <willemferguson@zoology.up.ac.za>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This is even easier and more obvious than copying the logs on the About page
and then manually creating an email and pasting those logs.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
When parsing of a timestamp failed (shouldn't happen) set the
timestamp to zero. This should give less unpredictable results
and silence a compiler warning.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Instead of accessing the cylinder table directly, use the get_cylinder()
function. This gives less unwieldy expressions. But more importantly,
the function does bound checking. This is crucial for now as the code
hasn't be properly audited since the change to arbitrarily sized
cylinder tables. Accesses of invalid cylinder indexes may lead to
silent data-corruption that is sometimes not even noticed by
valgrind. Returning NULL instead of an invalid pointer will make
debugging much easier.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
The cylinderList() function collects all cylinder descriptions.
Instead of adding all cylinders, then sort, then removed duplicates,
keep a sorted list and only add non-existing elements. Find
existing elements by a binary search.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
The tab was crashing if there were no cylinders because
1) per_cylinder_mean_depth() would access non-existing cylinders.
2) TabDiveInformation::updateProfile() would access a non-existing
mean.
Fix both of these crash conditions by checking whether the dive
actually has cylinders.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
TankItem would happily access a non-existing cylinder and crash.
But freedives for example have no cylinders. Thus, handle that
situation gracefully by exiting early if there is no cylinder.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
In getFormattedWeight() and getFormattedCylinder(), the indexes
were passed as unsigned ints. This makes no sense as the only
callers were using signed ints. Change the parameters to signed.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
As a convenience, return the cylinder from add_empty_cylinder()
to spare the caller from the nasty expression to fetch the
last cylinder.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Most callers of this function accessed the newly generated cylinder
immediately after calling this function. Thus, for convenience,
return the added cylinder. This avoids a number of verbose expressions.
On the flip side, cylinder_start() now has to be cast to
function returning void in a the "nesting" function table.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Instead of using fixed size arrays, use a new cylinder_table structure.
The code copies the weightsystem code, but is significantly more complex
because cylinders are such an integral part of the core.
Two functions to access the cylinders were added:
get_cylinder() and get_or_create_cylinder()
The former does a simple array access and supposes that the cylinder
exists. The latter is used by the parser(s) and if a cylinder with
the given id does not exist, cylinders up to that id are generated.
One point will make C programmers cringe: the cylinder structure is
passed by value. This is due to the way the table-macros work. A
refactoring of the table macros is planned. It has to be noted that
the size of a cylinder_t is 64 bytes, i.e. 8 long words on a 64-bit
architecture, so passing on the stack is probably not even significantly
slower than passing as reference.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>