boris-behav-obs 9.3.3__tar.gz → 9.3.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. {boris_behav_obs-9.3.3/boris_behav_obs.egg-info → boris_behav_obs-9.3.5}/PKG-INFO +2 -2
  2. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/config.py +2 -0
  3. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/core.py +21 -103
  4. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/core_qrc.py +6580 -6784
  5. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/dialog.py +78 -9
  6. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/edit_event.py +47 -27
  7. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/edit_event_ui.py +69 -36
  8. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/event_operations.py +52 -47
  9. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/observation.py +1 -2
  10. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/observation_operations.py +34 -12
  11. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/project.py +11 -9
  12. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/project_functions.py +39 -15
  13. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/select_observations.py +7 -1
  14. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/state_events.py +1 -1
  15. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/utilities.py +1 -1
  16. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/version.py +2 -2
  17. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5/boris_behav_obs.egg-info}/PKG-INFO +2 -2
  18. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris_behav_obs.egg-info/requires.txt +1 -1
  19. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/pyproject.toml +3 -3
  20. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/LICENSE.TXT +0 -0
  21. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/MANIFEST.in +0 -0
  22. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/README.TXT +0 -0
  23. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/README.md +0 -0
  24. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/__init__.py +0 -0
  25. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/__main__.py +0 -0
  26. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/about.py +0 -0
  27. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/add_modifier.py +0 -0
  28. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/add_modifier_ui.py +0 -0
  29. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/advanced_event_filtering.py +0 -0
  30. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/analysis_plugins/__init__.py +0 -0
  31. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/analysis_plugins/_latency.py +0 -0
  32. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/analysis_plugins/number_of_occurences.py +0 -0
  33. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/analysis_plugins/number_of_occurences_by_independent_variable.py +0 -0
  34. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/analysis_plugins/time_budget.py +0 -0
  35. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/behav_coding_map_creator.py +0 -0
  36. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/behavior_binary_table.py +0 -0
  37. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/behaviors_coding_map.py +0 -0
  38. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/boris_cli.py +0 -0
  39. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/cmd_arguments.py +0 -0
  40. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/coding_pad.py +0 -0
  41. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/config_file.py +0 -0
  42. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/connections.py +0 -0
  43. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/converters.py +0 -0
  44. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/converters_ui.py +0 -0
  45. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/cooccurence.py +0 -0
  46. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/core_ui.py +0 -0
  47. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/db_functions.py +0 -0
  48. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/dev.py +0 -0
  49. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/duration_widget.py +0 -0
  50. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/events_cursor.py +0 -0
  51. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/events_snapshots.py +0 -0
  52. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/exclusion_matrix.py +0 -0
  53. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/export_events.py +0 -0
  54. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/export_observation.py +0 -0
  55. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/external_processes.py +0 -0
  56. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/geometric_measurement.py +0 -0
  57. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/gui_utilities.py +0 -0
  58. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/image_overlay.py +0 -0
  59. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/import_observations.py +0 -0
  60. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/irr.py +0 -0
  61. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/latency.py +0 -0
  62. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/measurement_widget.py +0 -0
  63. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/media_file.py +0 -0
  64. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/menu_options.py +0 -0
  65. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/modifier_coding_map_creator.py +0 -0
  66. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/modifiers_coding_map.py +0 -0
  67. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/mpv-1.0.3.py +0 -0
  68. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/mpv.py +0 -0
  69. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/mpv2.py +0 -0
  70. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/observation_ui.py +0 -0
  71. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/observations_list.py +0 -0
  72. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/otx_parser.py +0 -0
  73. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/param_panel.py +0 -0
  74. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/param_panel_ui.py +0 -0
  75. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/player_dock_widget.py +0 -0
  76. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/plot_data_module.py +0 -0
  77. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/plot_events.py +0 -0
  78. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/plot_events_rt.py +0 -0
  79. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/plot_spectrogram_rt.py +0 -0
  80. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/plot_waveform_rt.py +0 -0
  81. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/plugins.py +0 -0
  82. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/portion/__init__.py +0 -0
  83. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/portion/const.py +0 -0
  84. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/portion/dict.py +0 -0
  85. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/portion/func.py +0 -0
  86. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/portion/interval.py +0 -0
  87. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/portion/io.py +0 -0
  88. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/preferences.py +0 -0
  89. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/preferences_ui.py +0 -0
  90. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/project_import_export.py +0 -0
  91. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/project_ui.py +0 -0
  92. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/qrc_boris.py +0 -0
  93. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/qrc_boris5.py +0 -0
  94. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/select_modifiers.py +0 -0
  95. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/select_subj_behav.py +0 -0
  96. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/subjects_pad.py +0 -0
  97. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/synthetic_time_budget.py +0 -0
  98. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/time_budget_functions.py +0 -0
  99. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/time_budget_widget.py +0 -0
  100. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/transitions.py +0 -0
  101. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/video_equalizer.py +0 -0
  102. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/video_equalizer_ui.py +0 -0
  103. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/video_operations.py +0 -0
  104. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/view_df.py +0 -0
  105. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/view_df_ui.py +0 -0
  106. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris/write_event.py +0 -0
  107. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris_behav_obs.egg-info/SOURCES.txt +0 -0
  108. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
  109. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris_behav_obs.egg-info/entry_points.txt +0 -0
  110. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/boris_behav_obs.egg-info/top_level.txt +0 -0
  111. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/setup.cfg +0 -0
  112. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_db_functions.py +0 -0
  113. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_export_observation.py +0 -0
  114. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_irr.py +0 -0
  115. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_observation_gui.py +0 -0
  116. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_otx_parser.py +0 -0
  117. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_preferences_gui.py +0 -0
  118. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_project_functions.py +0 -0
  119. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_time_budget.py +0 -0
  120. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_utilities.py +0 -0
  121. {boris_behav_obs-9.3.3 → boris_behav_obs-9.3.5}/tests/test_utilities2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boris-behav-obs
3
- Version: 9.3.3
3
+ Version: 9.3.5
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License-Expression: GPL-3.0-only
@@ -24,7 +24,7 @@ Requires-Dist: matplotlib>=3.3.3
24
24
  Requires-Dist: pandas>=2.2.2
25
25
  Requires-Dist: tablib[cli,html,ods,pandas,xls,xlsx]>=3
26
26
  Requires-Dist: pyreadr
27
- Requires-Dist: pyside6==6.8.0.2
27
+ Requires-Dist: pyside6==6.9
28
28
  Requires-Dist: hachoir>=3.3.0
29
29
  Provides-Extra: dev
30
30
  Requires-Dist: ruff; extra == "dev"
@@ -37,6 +37,7 @@ SECONDS_PER_DAY: int = 86_400
37
37
  HOUR_CUTOFF: int = 7 * 24
38
38
  DATE_CUTOFF: int = HOUR_CUTOFF * 60 * 60 # 1 week
39
39
 
40
+ # cutoff for displaying time in HH:MM:SS.zzz format
40
41
  SMART_TIME_CUTOFF_DEFAULT: int = 300
41
42
 
42
43
  # minimal project version for handling observations from images
@@ -218,6 +219,7 @@ OVERLAY = "video overlay"
218
219
 
219
220
 
220
221
  USE_EXIF_DATE = "use_exif_date"
222
+ SUBSTRACT_FIRST_EXIF_DATE = "substract_first_exif_date"
221
223
  TIME_LAPSE = "time_lapse_delay"
222
224
 
223
225
 
@@ -308,9 +308,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
308
308
  play_rate_step: float = 0.1
309
309
  currentSubject: str = "" # contains the current subject of observation
310
310
 
311
- # FFmpeg
312
- memx = -1
313
- memy = -1
311
+ # geometric measurements
314
312
  mem_player = -1
315
313
 
316
314
  # path for ffmpeg/ffmpeg.exe program
@@ -339,6 +337,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
339
337
 
340
338
  mem_hash_obs: int = 0
341
339
 
340
+ # variables for list of observations
341
+ data: list = []
342
+ not_paired: list = []
343
+
342
344
  '''
343
345
  def add_button_menu(self, data, menu_obj):
344
346
  """
@@ -1342,21 +1344,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
1342
1344
  self.pj[cfg.BEHAVIORS_CODING_MAP][idx] = dict(behav_coding_map)
1343
1345
  return
1344
1346
 
1345
- """
1346
- QMessageBox.critical(
1347
- None,
1348
- cfg.programName,
1349
- (
1350
- "The current project already contains a behaviors coding map "
1351
- f"with the same name (<b>{behav_coding_map['name']}</b>)"
1352
- ),
1353
- QMessageBox.Ok | QMessageBox.Default,
1354
- QMessageBox.NoButton,
1355
- )
1356
-
1357
- return
1358
- """
1359
-
1360
1347
  self.pj[cfg.BEHAVIORS_CODING_MAP].append(behav_coding_map)
1361
1348
  QMessageBox.information(
1362
1349
  self,
@@ -1526,7 +1513,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
1526
1513
  jt.setWindowTitle("Jump to specific time")
1527
1514
  jt.label.setText("Set the time")
1528
1515
 
1529
- if jt.exec_():
1516
+ if jt.exec():
1530
1517
  new_time = jt.time_widget.get_time()
1531
1518
  if new_time < 0:
1532
1519
  return
@@ -1704,7 +1691,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
1704
1691
  QMessageBox.critical(
1705
1692
  None,
1706
1693
  cfg.programName,
1707
- ("The picture directory was changed since the creation of observation."),
1694
+ ("The picture directory has changed since the creation of observation."),
1708
1695
  QMessageBox.Ok | QMessageBox.Default,
1709
1696
  QMessageBox.NoButton,
1710
1697
  )
@@ -1718,15 +1705,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
1718
1705
  # extract EXIF tag
1719
1706
  if self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.USE_EXIF_DATE, False):
1720
1707
  date_time_original = util.extract_exif_DateTimeOriginal(self.images_list[self.image_idx])
1708
+
1721
1709
  if date_time_original != -1:
1722
1710
  msg += f"<br>EXIF Date/Time Original: <b>{datetime.datetime.fromtimestamp(date_time_original):%Y-%m-%d %H:%M:%S}</b>"
1723
- else:
1724
- msg += "<br>EXIF Date/Time Original: <b>NA</b>"
1725
1711
 
1726
- if self.image_idx == 0 and date_time_original != -1:
1727
- self.image_time_ref = date_time_original
1712
+ if self.image_idx == 0:
1713
+ self.image_time_ref = date_time_original
1728
1714
 
1729
- if date_time_original != -1:
1730
1715
  if self.image_time_ref is not None:
1731
1716
  seconds_from_1st = date_time_original - self.image_time_ref
1732
1717
 
@@ -1736,6 +1721,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
1736
1721
  seconds_from_1st_formated = seconds_from_1st
1737
1722
 
1738
1723
  else:
1724
+ msg += "<br>EXIF Date/Time Original: <b>NA</b>"
1739
1725
  seconds_from_1st_formated = cfg.NA
1740
1726
 
1741
1727
  msg += f"<br>Time from 1st image: <b>{seconds_from_1st_formated}</b>"
@@ -2311,11 +2297,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
2311
2297
  self.tv_events.setModel(model)
2312
2298
 
2313
2299
  # column width
2314
- # https://doc.qt.io/qtforpython-5/PySide2/QtWidgets/QHeaderView.html#more
2315
- self.tv_events.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
2316
-
2317
- # self.table.setSortingEnabled(True)
2318
- # self.table.sortByColumn(0, Qt.AscendingOrder)
2300
+ self.tv_events.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive)
2319
2301
 
2320
2302
  def load_tw_events(self, obs_id) -> None:
2321
2303
  """
@@ -2343,76 +2325,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
2343
2325
 
2344
2326
  return
2345
2327
 
2346
- """
2347
- DISABLED tableview component is used
2348
-
2349
- logging.debug(f"begin load events from obs in tablewidget: {obs_id}")
2350
-
2351
- t1 = time.time()
2352
-
2353
- self.twEvents.clear()
2354
-
2355
- self.twEvents.setColumnCount(len(cfg.TW_EVENTS_FIELDS[self.playerType]))
2356
- self.twEvents.setHorizontalHeaderLabels([s.capitalize() for s in cfg.TW_EVENTS_FIELDS[self.playerType]])
2357
-
2358
- for idx, field in enumerate(cfg.TW_EVENTS_FIELDS[self.playerType]):
2359
- if field not in self.config_param.get(f"{self.playerType} tw fields", cfg.TW_EVENTS_FIELDS[self.playerType]):
2360
- self.twEvents.horizontalHeader().hideSection(idx)
2361
- else:
2362
- self.twEvents.horizontalHeader().showSection(idx)
2363
-
2364
- self.twEvents.setRowCount(len(self.pj[cfg.OBSERVATIONS][obs_id][cfg.EVENTS]))
2365
- if self.filtered_behaviors or self.filtered_subjects:
2366
- self.twEvents.setRowCount(0)
2367
- row = 0
2368
-
2369
- for event_idx, event in enumerate(self.pj[cfg.OBSERVATIONS][obs_id][cfg.EVENTS]):
2370
- if self.filtered_behaviors and event[cfg.PJ_OBS_FIELDS[self.playerType][cfg.BEHAVIOR_CODE]] not in self.filtered_behaviors:
2371
- continue
2372
-
2373
- if self.filtered_subjects and event[cfg.PJ_OBS_FIELDS[self.playerType][cfg.SUBJECT]] not in self.filtered_subjects:
2374
- continue
2375
-
2376
- if self.filtered_behaviors or self.filtered_subjects:
2377
- self.twEvents.insertRow(self.twEvents.rowCount())
2378
-
2379
- for field_type in cfg.TW_EVENTS_FIELDS[self.playerType]:
2380
- if field_type in cfg.PJ_EVENTS_FIELDS[self.playerType]:
2381
- field = event_operations.read_event_field(event, self.playerType, field_type)
2382
-
2383
- if field_type == cfg.TIME:
2384
- item = QTableWidgetItem(str(util.convertTime(self.timeFormat, field)))
2385
-
2386
- # add index of project events
2387
- item.setData(Qt.UserRole, event_idx)
2388
- self.twEvents.setItem(row, cfg.TW_OBS_FIELD[self.playerType][field_type], item)
2389
- continue
2390
-
2391
- if field_type in (cfg.IMAGE_INDEX, cfg.FRAME_INDEX):
2392
- field = str(field)
2393
-
2394
- self.twEvents.setItem(
2395
- row,
2396
- cfg.TW_OBS_FIELD[self.playerType][field_type],
2397
- QTableWidgetItem(field),
2398
- )
2399
-
2400
- else:
2401
- self.twEvents.setItem(
2402
- row,
2403
- cfg.TW_OBS_FIELD[self.playerType][field_type],
2404
- QTableWidgetItem(""),
2405
- )
2406
-
2407
- row += 1
2408
-
2409
- self.update_events_start_stop()
2410
-
2411
- print("load twevent:", time.time() - t1)
2412
-
2413
- logging.debug("end load events from obs")
2414
- """
2415
-
2416
2328
  def close_tool_windows(self):
2417
2329
  """
2418
2330
  close tool windows:
@@ -3493,7 +3405,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
3493
3405
  return
3494
3406
 
3495
3407
  logging.debug(
3496
- f"{self.config_param[cfg.CHECK_PROJECT_INTEGRITY] if cfg.CHECK_PROJECT_INTEGRITY in self.config_param else "Check project integrity config NOT FOUND"=}"
3408
+ f"{self.config_param[cfg.CHECK_PROJECT_INTEGRITY] if cfg.CHECK_PROJECT_INTEGRITY in self.config_param else 'Check project integrity config NOT FOUND'=}"
3497
3409
  )
3498
3410
 
3499
3411
  if self.config_param.get(cfg.CHECK_PROJECT_INTEGRITY, True):
@@ -4707,7 +4619,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
4707
4619
  self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.USE_EXIF_DATE, False)
4708
4620
  and util.extract_exif_DateTimeOriginal(self.images_list[self.image_idx]) != -1
4709
4621
  ):
4710
- time_ = util.extract_exif_DateTimeOriginal(self.images_list[self.image_idx]) - self.image_time_ref
4622
+ time_ = util.extract_exif_DateTimeOriginal(self.images_list[self.image_idx])
4623
+ # check if first value must be substracted
4624
+ if self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.SUBSTRACT_FIRST_EXIF_DATE, True):
4625
+ time_ -= self.image_time_ref
4711
4626
 
4712
4627
  elif self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.TIME_LAPSE, 0):
4713
4628
  time_ = (self.image_idx + 1) * self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.TIME_LAPSE, 0)
@@ -4765,7 +4680,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
4765
4680
  self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.USE_EXIF_DATE, False)
4766
4681
  and util.extract_exif_DateTimeOriginal(self.images_list[self.image_idx]) != -1
4767
4682
  ):
4768
- time_ = util.extract_exif_DateTimeOriginal(self.images_list[self.image_idx]) - self.image_time_ref
4683
+ time_ = util.extract_exif_DateTimeOriginal(self.images_list[self.image_idx])
4684
+ # check if first value must be substracte
4685
+ if self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.SUBSTRACT_FIRST_EXIF_DATE, True):
4686
+ time_ -= self.image_time_ref
4769
4687
 
4770
4688
  elif self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.TIME_LAPSE, 0):
4771
4689
  time_ = (self.image_idx + 1) * self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.TIME_LAPSE, 0)