subsurface/qt-models
Berthold Stoeger 396598430b desktop: fix saving of column-widths of device and site tables
Qt's memory management scheme is completely broken and messes
with common expectations.

QObjects are organized as a tree. The children are destroyed
in the destructor of QObject. This means that they are destructed
after the destructor of the parent object has run and its
sub-object were destructed. Obviously, this makes no sense as
the child objects should be able to access their parent at
any time.

To restore the commonly expected deterministic order of
construction and destruction, one might simply do away with
Qt's silly object tree and organise things using classical
subobjects. However, that breaks with the Qt-generated UI
classes: The objects generated by these classes are *not*
destructed with the UI class. Instead, they are attached
to the widget's QObject tree. Thus these are again destructed
*after* the widget! Who comes up with such a scheme?

In our case this means that we cannot have models used for
TableViews as subobjects, because the TableView needs the
model to save the column widths in the destructor. Which,
as detailed above is called *after* the desctructor of the
widget! Thus, turn these models into heap-allocated objects
and add them to the QObject tree.

Funilly, this exposes another insanity of Qt's QObject tree:
Children are destructed in order of construction! One would
expect that if objects are constructed in the sequence
A, B, C one can expect that C can, at any time, access B and A.
Not so in Qt: The destruction order is likewise A, B, C!

Thus, take care to init the widgets before the model. Jeez.

Finally, print a warning in the column-saving code of
TableWidget, so that these kind of subtleties are caught
in the future.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-11-07 11:37:51 -08:00
..
cleanertablemodel.cpp Cleanup: return directly from data() methods 2019-06-19 13:11:10 -07:00
cleanertablemodel.h CylindersModel: fold CHANGED() macro into setData() 2020-04-07 00:13:35 +02:00
CMakeLists.txt filter: add (very primitive) filterpresetmodel 2020-09-29 16:13:03 -07:00
completionmodels.cpp cleanup: SkipEmptyParts syntax has changed 2020-10-26 19:27:03 -07:00
completionmodels.h Add SPDX header to Qt models 2017-04-29 13:32:55 -07:00
cylindermodel.cpp Use correct pO2 when computing MOD in equipment tab 2020-09-29 15:46:55 -07:00
cylindermodel.h Make MND display depend on O2 narcotic preference 2020-07-11 10:37:49 -07:00
divecomputerextradatamodel.cpp cleanup: split out divecomputer functions from dive.c 2020-10-25 13:59:52 -07:00
divecomputerextradatamodel.h cleanup: generalize ExtraDataModel to display data of any dc 2020-05-07 08:46:15 -07:00
divecomputermodel.cpp cleanup: remove DiveComputerModel::remove 2020-10-25 13:59:04 -07:00
divecomputermodel.h cleanup: remove DiveComputerModel::remove 2020-10-25 13:59:04 -07:00
diveimportedmodel.cpp divecomputer: add device_table pointer to device_data_t 2020-10-24 09:51:37 -07:00
diveimportedmodel.h devices: add devices in Command::importTable() 2020-10-24 09:51:37 -07:00
divelocationmodel.cpp desktop: fix saving of column-widths of device and site tables 2020-11-07 11:37:51 -08:00
divelocationmodel.h desktop: fix saving of column-widths of device and site tables 2020-11-07 11:37:51 -08:00
divepicturemodel.cpp cleanup: use getDiveSelection() to loop over selected dives 2020-10-03 10:01:13 -07:00
divepicturemodel.h undo: make picture (media) deletion undoable 2020-05-06 13:58:09 -07:00
diveplannermodel.cpp cleanup: split out divecomputer functions from dive.c 2020-10-25 13:59:52 -07:00
diveplannermodel.h planner: send plan in calculatedPlanNotes 2020-05-04 10:42:07 +02:00
diveplotdatamodel.cpp cleanup: remove DivePlotDataModel::diveId 2020-04-30 14:14:13 -07:00
diveplotdatamodel.h cleanup: remove DivePlotDataModel::diveId 2020-04-30 14:14:13 -07:00
divesiteimportmodel.cpp Create DivesiteImportDialog to select sites to import 2019-05-06 10:48:44 +02:00
divesiteimportmodel.h Create DivesiteImportDialog to select sites to import 2019-05-06 10:48:44 +02:00
divesummarymodel.cpp cleanup: consistently use get_cylinder() accessor 2020-08-21 08:48:22 -07:00
divesummarymodel.h mobile/summary: add section headers 2020-02-08 10:29:36 -08:00
divetripmodel.cpp cleanup: fix over-eager Coverity warnings 2020-10-25 13:58:03 -07:00
divetripmodel.h cleanup: invert control-flow when resetting the core structures 2020-05-07 08:43:27 -07:00
filterconstraintmodel.cpp filter: add filter constraint model 2020-09-29 16:13:03 -07:00
filterconstraintmodel.h filter: add filter constraint model 2020-09-29 16:13:03 -07:00
filtermodels.cpp cleanup: invert control-flow when resetting the core structures 2020-05-07 08:43:27 -07:00
filtermodels.h cleanup: invert control-flow when resetting the core structures 2020-05-07 08:43:27 -07:00
filterpresetmodel.cpp filter: connect DiveListNotifier signals to filter preset model 2020-09-29 16:13:03 -07:00
filterpresetmodel.h filter: connect DiveListNotifier signals to filter preset model 2020-09-29 16:13:03 -07:00
gpslistmodel.cpp models: update DiveComputerModel when core data is reset 2020-10-25 13:59:04 -07:00
gpslistmodel.h Cleanup: Make constructor of singletons private 2019-10-04 09:19:10 -07:00
maplocationmodel.cpp Filter: split out filter from model 2019-11-19 21:13:40 -08:00
maplocationmodel.h Cleanup: lower-case filenames in core/subsurface-qt/ 2020-02-04 02:16:46 +01:00
messagehandlermodel.cpp debug output: ensure our debug output is captured on Android 2020-04-18 09:00:21 -07:00
messagehandlermodel.h Cleanup: reinstate override modifiers 2018-09-29 15:23:25 -07:00
mobilelistmodel.cpp mobile/models: add access to tags string 2020-05-14 12:57:08 -07:00
mobilelistmodel.h mobile/models: add access to tags string 2020-05-14 12:57:08 -07:00
models.cpp Cylinders: access cylinders with get_cylinder() 2019-11-09 19:19:04 +01:00
models.h Cleanup: remove includes from qt-models/models.h 2019-07-18 05:42:55 -07:00
tankinfomodel.cpp cleanup: invert control-flow when resetting the core structures 2020-05-07 08:43:27 -07:00
tankinfomodel.h Cleanup: remove biggerString() functions 2019-04-29 13:06:39 -07:00
treemodel.cpp Cleanup: make DiveTripModel a global object 2018-09-01 07:48:43 -07:00
treemodel.h Cleanup: reinstate override modifiers 2018-09-29 15:23:25 -07:00
weightmodel.cpp desktop: refine auto-fill of weights 2020-09-12 10:36:36 -07:00
weightmodel.h cleanup: replace to "dive.h" includes by more specific includes 2020-05-15 14:19:21 -07:00
weightsysteminfomodel.cpp cleanup: invert control-flow when resetting the core structures 2020-05-07 08:43:27 -07:00
weightsysteminfomodel.h Cleanup: implement proper Qt-model semantics in WeightInfoModel 2019-04-29 13:06:39 -07:00
yearlystatisticsmodel.cpp Core: dynamically allocate the result of get_gas_used() 2019-11-09 19:19:04 +01:00
yearlystatisticsmodel.h Show average max depth in yearly statistics 2018-12-17 12:18:26 +01:00