boris-behav-obs 8.27.6__py2.py3-none-any.whl → 8.27.7__py2.py3-none-any.whl

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.
boris/preferences.ui ADDED
@@ -0,0 +1,588 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ui version="4.0">
3
+ <class>prefDialog</class>
4
+ <widget class="QDialog" name="prefDialog">
5
+ <property name="windowModality">
6
+ <enum>Qt::WindowModal</enum>
7
+ </property>
8
+ <property name="geometry">
9
+ <rect>
10
+ <x>0</x>
11
+ <y>0</y>
12
+ <width>719</width>
13
+ <height>554</height>
14
+ </rect>
15
+ </property>
16
+ <property name="windowTitle">
17
+ <string>Preferences</string>
18
+ </property>
19
+ <layout class="QGridLayout" name="gridLayout">
20
+ <item row="0" column="0">
21
+ <layout class="QVBoxLayout" name="verticalLayout_2">
22
+ <item>
23
+ <widget class="QTabWidget" name="tabWidget">
24
+ <property name="enabled">
25
+ <bool>true</bool>
26
+ </property>
27
+ <property name="currentIndex">
28
+ <number>5</number>
29
+ </property>
30
+ <widget class="QWidget" name="tab_project">
31
+ <attribute name="title">
32
+ <string>Project</string>
33
+ </attribute>
34
+ <layout class="QVBoxLayout" name="verticalLayout_5">
35
+ <item>
36
+ <layout class="QHBoxLayout" name="horizontalLayout_14">
37
+ <item>
38
+ <widget class="QLabel" name="label">
39
+ <property name="text">
40
+ <string>Default project time format</string>
41
+ </property>
42
+ </widget>
43
+ </item>
44
+ <item>
45
+ <widget class="QComboBox" name="cbTimeFormat">
46
+ <item>
47
+ <property name="text">
48
+ <string>seconds</string>
49
+ </property>
50
+ </item>
51
+ <item>
52
+ <property name="text">
53
+ <string>hh:mm:ss.mss</string>
54
+ </property>
55
+ </item>
56
+ </widget>
57
+ </item>
58
+ </layout>
59
+ </item>
60
+ <item>
61
+ <layout class="QHBoxLayout" name="horizontalLayout_15">
62
+ <item>
63
+ <widget class="QLabel" name="label_6">
64
+ <property name="text">
65
+ <string>Auto-save project every (minutes)</string>
66
+ </property>
67
+ </widget>
68
+ </item>
69
+ <item>
70
+ <widget class="QSpinBox" name="sbAutomaticBackup">
71
+ <property name="minimum">
72
+ <number>-10000</number>
73
+ </property>
74
+ <property name="maximum">
75
+ <number>10000</number>
76
+ </property>
77
+ <property name="value">
78
+ <number>10</number>
79
+ </property>
80
+ </widget>
81
+ </item>
82
+ </layout>
83
+ </item>
84
+ <item>
85
+ <layout class="QHBoxLayout" name="horizontalLayout_13">
86
+ <item>
87
+ <widget class="QLabel" name="label_3">
88
+ <property name="text">
89
+ <string>Separator for behavioural strings (events export)</string>
90
+ </property>
91
+ </widget>
92
+ </item>
93
+ <item>
94
+ <widget class="QLineEdit" name="leSeparator">
95
+ <property name="text">
96
+ <string>|</string>
97
+ </property>
98
+ </widget>
99
+ </item>
100
+ </layout>
101
+ </item>
102
+ <item>
103
+ <widget class="QCheckBox" name="cbCheckForNewVersion">
104
+ <property name="text">
105
+ <string>Check for new version and news</string>
106
+ </property>
107
+ </widget>
108
+ </item>
109
+ <item>
110
+ <layout class="QHBoxLayout" name="horizontalLayout_11">
111
+ <item>
112
+ <widget class="QLabel" name="lb_hwdec">
113
+ <property name="text">
114
+ <string>MPV player hardware video decoding</string>
115
+ </property>
116
+ </widget>
117
+ </item>
118
+ <item>
119
+ <widget class="QComboBox" name="cb_hwdec"/>
120
+ </item>
121
+ </layout>
122
+ </item>
123
+ <item>
124
+ <layout class="QHBoxLayout" name="horizontalLayout_9">
125
+ <item>
126
+ <widget class="QLabel" name="lb_project_file_indent">
127
+ <property name="text">
128
+ <string>Project file indentation type</string>
129
+ </property>
130
+ </widget>
131
+ </item>
132
+ <item>
133
+ <widget class="QComboBox" name="combo_project_file_indentation"/>
134
+ </item>
135
+ </layout>
136
+ </item>
137
+ <item>
138
+ <spacer name="verticalSpacer_2">
139
+ <property name="orientation">
140
+ <enum>Qt::Vertical</enum>
141
+ </property>
142
+ <property name="sizeHint" stdset="0">
143
+ <size>
144
+ <width>20</width>
145
+ <height>40</height>
146
+ </size>
147
+ </property>
148
+ </spacer>
149
+ </item>
150
+ </layout>
151
+ </widget>
152
+ <widget class="QWidget" name="tab_observations">
153
+ <attribute name="title">
154
+ <string>Observations</string>
155
+ </attribute>
156
+ <layout class="QVBoxLayout" name="verticalLayout">
157
+ <item>
158
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
159
+ <item>
160
+ <widget class="QLabel" name="label_4">
161
+ <property name="text">
162
+ <string>Fast forward/backward value (seconds)</string>
163
+ </property>
164
+ </widget>
165
+ </item>
166
+ <item>
167
+ <widget class="QSpinBox" name="sbffSpeed">
168
+ <property name="minimum">
169
+ <number>0</number>
170
+ </property>
171
+ <property name="maximum">
172
+ <number>10000</number>
173
+ </property>
174
+ <property name="value">
175
+ <number>10</number>
176
+ </property>
177
+ </widget>
178
+ </item>
179
+ </layout>
180
+ </item>
181
+ <item>
182
+ <widget class="QCheckBox" name="cb_adapt_fast_jump">
183
+ <property name="text">
184
+ <string>Adapt the fast forward/backward jump to playback speed</string>
185
+ </property>
186
+ </widget>
187
+ </item>
188
+ <item>
189
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
190
+ <item>
191
+ <widget class="QLabel" name="label_5">
192
+ <property name="text">
193
+ <string>Playback speed step value</string>
194
+ </property>
195
+ </widget>
196
+ </item>
197
+ <item>
198
+ <widget class="QDoubleSpinBox" name="sbSpeedStep">
199
+ <property name="decimals">
200
+ <number>1</number>
201
+ </property>
202
+ <property name="minimum">
203
+ <double>0.100000000000000</double>
204
+ </property>
205
+ <property name="maximum">
206
+ <double>10.000000000000000</double>
207
+ </property>
208
+ <property name="singleStep">
209
+ <double>0.100000000000000</double>
210
+ </property>
211
+ <property name="value">
212
+ <double>0.100000000000000</double>
213
+ </property>
214
+ </widget>
215
+ </item>
216
+ </layout>
217
+ </item>
218
+ <item>
219
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
220
+ <item>
221
+ <widget class="QLabel" name="label_2">
222
+ <property name="text">
223
+ <string>Time offset for video/audio reposition (seconds)</string>
224
+ </property>
225
+ </widget>
226
+ </item>
227
+ <item>
228
+ <widget class="QSpinBox" name="sbRepositionTimeOffset">
229
+ <property name="minimum">
230
+ <number>-10000</number>
231
+ </property>
232
+ <property name="maximum">
233
+ <number>10000</number>
234
+ </property>
235
+ <property name="value">
236
+ <number>-3</number>
237
+ </property>
238
+ </widget>
239
+ </item>
240
+ </layout>
241
+ </item>
242
+ <item>
243
+ <widget class="QCheckBox" name="cbConfirmSound">
244
+ <property name="text">
245
+ <string>Play sound when a key is pressed</string>
246
+ </property>
247
+ </widget>
248
+ </item>
249
+ <item>
250
+ <widget class="QCheckBox" name="cbCloseSameEvent">
251
+ <property name="text">
252
+ <string>Close the same current event independently of modifiers</string>
253
+ </property>
254
+ </widget>
255
+ </item>
256
+ <item>
257
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
258
+ <item>
259
+ <widget class="QLabel" name="label_8">
260
+ <property name="text">
261
+ <string>Beep every (seconds)</string>
262
+ </property>
263
+ </widget>
264
+ </item>
265
+ <item>
266
+ <widget class="QSpinBox" name="sbBeepEvery"/>
267
+ </item>
268
+ </layout>
269
+ </item>
270
+ <item>
271
+ <widget class="QCheckBox" name="cb_display_subtitles">
272
+ <property name="text">
273
+ <string>Display subtitles</string>
274
+ </property>
275
+ </widget>
276
+ </item>
277
+ <item>
278
+ <widget class="QCheckBox" name="cbTrackingCursorAboveEvent">
279
+ <property name="text">
280
+ <string>Tracking cursor above current event</string>
281
+ </property>
282
+ </widget>
283
+ </item>
284
+ <item>
285
+ <widget class="QCheckBox" name="cbAlertNoFocalSubject">
286
+ <property name="text">
287
+ <string>Alert if focal subject is not set</string>
288
+ </property>
289
+ </widget>
290
+ </item>
291
+ <item>
292
+ <widget class="QCheckBox" name="cb_pause_before_addevent">
293
+ <property name="text">
294
+ <string>Pause media before &quot;Add event&quot; command</string>
295
+ </property>
296
+ </widget>
297
+ </item>
298
+ <item>
299
+ <spacer name="verticalSpacer_4">
300
+ <property name="orientation">
301
+ <enum>Qt::Vertical</enum>
302
+ </property>
303
+ <property name="sizeHint" stdset="0">
304
+ <size>
305
+ <width>20</width>
306
+ <height>391</height>
307
+ </size>
308
+ </property>
309
+ </spacer>
310
+ </item>
311
+ </layout>
312
+ </widget>
313
+ <widget class="QWidget" name="tab_ffmpeg">
314
+ <attribute name="title">
315
+ <string>FFmpeg framework</string>
316
+ </attribute>
317
+ <layout class="QVBoxLayout" name="verticalLayout_4">
318
+ <item>
319
+ <layout class="QVBoxLayout" name="verticalLayout_3">
320
+ <item>
321
+ <widget class="QLabel" name="lbFFmpegPath">
322
+ <property name="text">
323
+ <string>FFmpeg path:</string>
324
+ </property>
325
+ <property name="scaledContents">
326
+ <bool>false</bool>
327
+ </property>
328
+ <property name="wordWrap">
329
+ <bool>true</bool>
330
+ </property>
331
+ </widget>
332
+ </item>
333
+ <item>
334
+ <layout class="QHBoxLayout" name="horizontalLayout"/>
335
+ </item>
336
+ <item>
337
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
338
+ <item>
339
+ <widget class="QLabel" name="lbFFmpegCacheDir">
340
+ <property name="text">
341
+ <string>FFmpeg cache directory</string>
342
+ </property>
343
+ </widget>
344
+ </item>
345
+ <item>
346
+ <widget class="QLineEdit" name="leFFmpegCacheDir"/>
347
+ </item>
348
+ <item>
349
+ <widget class="QPushButton" name="pbBrowseFFmpegCacheDir">
350
+ <property name="text">
351
+ <string>...</string>
352
+ </property>
353
+ </widget>
354
+ </item>
355
+ </layout>
356
+ </item>
357
+ <item>
358
+ <spacer name="verticalSpacer">
359
+ <property name="orientation">
360
+ <enum>Qt::Vertical</enum>
361
+ </property>
362
+ <property name="sizeHint" stdset="0">
363
+ <size>
364
+ <width>20</width>
365
+ <height>40</height>
366
+ </size>
367
+ </property>
368
+ </spacer>
369
+ </item>
370
+ </layout>
371
+ </item>
372
+ </layout>
373
+ </widget>
374
+ <widget class="QWidget" name="tab_spectro">
375
+ <attribute name="title">
376
+ <string>Spectrogram/Wave form</string>
377
+ </attribute>
378
+ <layout class="QVBoxLayout" name="verticalLayout_8">
379
+ <item>
380
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
381
+ <item>
382
+ <widget class="QLabel" name="label_7">
383
+ <property name="text">
384
+ <string>Spectrogram color map</string>
385
+ </property>
386
+ </widget>
387
+ </item>
388
+ <item>
389
+ <widget class="QComboBox" name="cbSpectrogramColorMap"/>
390
+ </item>
391
+ </layout>
392
+ </item>
393
+ <item>
394
+ <layout class="QHBoxLayout" name="horizontalLayout_10">
395
+ <item>
396
+ <widget class="QLabel" name="label_12">
397
+ <property name="text">
398
+ <string>Default time interval (s)</string>
399
+ </property>
400
+ </widget>
401
+ </item>
402
+ <item>
403
+ <widget class="QSpinBox" name="sb_time_interval">
404
+ <property name="minimum">
405
+ <number>2</number>
406
+ </property>
407
+ <property name="maximum">
408
+ <number>360</number>
409
+ </property>
410
+ <property name="value">
411
+ <number>10</number>
412
+ </property>
413
+ </widget>
414
+ </item>
415
+ </layout>
416
+ </item>
417
+ <item>
418
+ <spacer name="verticalSpacer_3">
419
+ <property name="orientation">
420
+ <enum>Qt::Vertical</enum>
421
+ </property>
422
+ <property name="sizeHint" stdset="0">
423
+ <size>
424
+ <width>20</width>
425
+ <height>319</height>
426
+ </size>
427
+ </property>
428
+ </spacer>
429
+ </item>
430
+ </layout>
431
+ </widget>
432
+ <widget class="QWidget" name="tab_colors">
433
+ <attribute name="title">
434
+ <string>Plot colors</string>
435
+ </attribute>
436
+ <layout class="QVBoxLayout" name="verticalLayout_10">
437
+ <item>
438
+ <layout class="QHBoxLayout" name="horizontalLayout_12">
439
+ <item>
440
+ <layout class="QVBoxLayout" name="verticalLayout_6">
441
+ <item>
442
+ <widget class="QLabel" name="label_10">
443
+ <property name="text">
444
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;List of colors for behaviors. See &lt;a href=&quot;https://matplotlib.org/api/colors_api.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;matplotlib colors&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
445
+ </property>
446
+ <property name="openExternalLinks">
447
+ <bool>true</bool>
448
+ </property>
449
+ </widget>
450
+ </item>
451
+ <item>
452
+ <widget class="QPlainTextEdit" name="te_behav_colors"/>
453
+ </item>
454
+ <item>
455
+ <widget class="QPushButton" name="pb_reset_behav_colors">
456
+ <property name="text">
457
+ <string>Reset colors to default</string>
458
+ </property>
459
+ </widget>
460
+ </item>
461
+ </layout>
462
+ </item>
463
+ <item>
464
+ <layout class="QVBoxLayout" name="verticalLayout_9">
465
+ <item>
466
+ <widget class="QLabel" name="label_11">
467
+ <property name="text">
468
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;List of colors for behavioral categories. See &lt;a href=&quot;https://matplotlib.org/api/colors_api.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;matplotlib colors&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
469
+ </property>
470
+ <property name="openExternalLinks">
471
+ <bool>true</bool>
472
+ </property>
473
+ </widget>
474
+ </item>
475
+ <item>
476
+ <widget class="QPlainTextEdit" name="te_category_colors"/>
477
+ </item>
478
+ <item>
479
+ <widget class="QPushButton" name="pb_reset_category_colors">
480
+ <property name="text">
481
+ <string>Reset colors to default</string>
482
+ </property>
483
+ </widget>
484
+ </item>
485
+ </layout>
486
+ </item>
487
+ </layout>
488
+ </item>
489
+ </layout>
490
+ </widget>
491
+ <widget class="QWidget" name="tab_interface">
492
+ <attribute name="title">
493
+ <string>Interface</string>
494
+ </attribute>
495
+ <layout class="QVBoxLayout" name="verticalLayout_7">
496
+ <item>
497
+ <layout class="QFormLayout" name="formLayout">
498
+ <item row="0" column="0">
499
+ <widget class="QLabel" name="label_9">
500
+ <property name="text">
501
+ <string>Toolbar icons size</string>
502
+ </property>
503
+ </widget>
504
+ </item>
505
+ <item row="0" column="1">
506
+ <widget class="QSpinBox" name="sb_toolbar_icon_size">
507
+ <property name="minimum">
508
+ <number>12</number>
509
+ </property>
510
+ <property name="maximum">
511
+ <number>128</number>
512
+ </property>
513
+ <property name="value">
514
+ <number>24</number>
515
+ </property>
516
+ </widget>
517
+ </item>
518
+ </layout>
519
+ </item>
520
+ <item>
521
+ <widget class="QCheckBox" name="cb_darkmode">
522
+ <property name="text">
523
+ <string>Dark mode (should be necessary to relaunch BORIS)</string>
524
+ </property>
525
+ </widget>
526
+ </item>
527
+ <item>
528
+ <spacer name="verticalSpacer_5">
529
+ <property name="orientation">
530
+ <enum>Qt::Vertical</enum>
531
+ </property>
532
+ <property name="sizeHint" stdset="0">
533
+ <size>
534
+ <width>20</width>
535
+ <height>386</height>
536
+ </size>
537
+ </property>
538
+ </spacer>
539
+ </item>
540
+ </layout>
541
+ </widget>
542
+ </widget>
543
+ </item>
544
+ <item>
545
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
546
+ <item>
547
+ <spacer name="horizontalSpacer">
548
+ <property name="orientation">
549
+ <enum>Qt::Horizontal</enum>
550
+ </property>
551
+ <property name="sizeHint" stdset="0">
552
+ <size>
553
+ <width>241</width>
554
+ <height>20</height>
555
+ </size>
556
+ </property>
557
+ </spacer>
558
+ </item>
559
+ <item>
560
+ <widget class="QPushButton" name="pb_refresh">
561
+ <property name="text">
562
+ <string>Refresh</string>
563
+ </property>
564
+ </widget>
565
+ </item>
566
+ <item>
567
+ <widget class="QPushButton" name="pbCancel">
568
+ <property name="text">
569
+ <string>Cancel</string>
570
+ </property>
571
+ </widget>
572
+ </item>
573
+ <item>
574
+ <widget class="QPushButton" name="pbOK">
575
+ <property name="text">
576
+ <string>OK</string>
577
+ </property>
578
+ </widget>
579
+ </item>
580
+ </layout>
581
+ </item>
582
+ </layout>
583
+ </item>
584
+ </layout>
585
+ </widget>
586
+ <resources/>
587
+ <connections/>
588
+ </ui>
boris/project.py CHANGED
@@ -430,7 +430,7 @@ class projectDialog(QDialog, Ui_dlgProject):
430
430
  """
431
431
  return a color for the not editable column
432
432
  """
433
- if self.config_param[cfg.DARK_MODE]:
433
+ if self.config_param.get(cfg.DARK_MODE, cfg.DEFAULT_FRAME_MODE):
434
434
  return QColor(55, 65, 79)
435
435
  else:
436
436
  return QColor(230, 230, 230)
@@ -730,7 +730,7 @@ class projectDialog(QDialog, Ui_dlgProject):
730
730
  behavioral categories manager
731
731
  """
732
732
 
733
- bc = BehavioralCategories(self.pj, self.config_param[cfg.DARK_MODE])
733
+ bc = BehavioralCategories(self.pj, self.config_param.get(cfg.DARK_MODE, cfg.DEFAULT_FRAME_MODE))
734
734
 
735
735
  if bc.exec_():
736
736
  self.pj[cfg.BEHAVIORAL_CATEGORIES] = []
@@ -1836,10 +1836,9 @@ class projectDialog(QDialog, Ui_dlgProject):
1836
1836
  # check subjects
1837
1837
  for row in range(self.twSubjects.rowCount()):
1838
1838
  # check key
1839
+ key: str = ""
1839
1840
  if self.twSubjects.item(row, 0):
1840
1841
  key = self.twSubjects.item(row, 0).text()
1841
- else:
1842
- key = ""
1843
1842
 
1844
1843
  # check subject name
1845
1844
  if self.twSubjects.item(row, 1):
@@ -1865,7 +1864,7 @@ class projectDialog(QDialog, Ui_dlgProject):
1865
1864
  return
1866
1865
 
1867
1866
  # description
1868
- subjectDescription = ""
1867
+ subjectDescription: str = ""
1869
1868
  if self.twSubjects.item(row, 2):
1870
1869
  subjectDescription = self.twSubjects.item(row, 2).text().strip()
1871
1870
 
@@ -1875,6 +1874,25 @@ class projectDialog(QDialog, Ui_dlgProject):
1875
1874
  "description": subjectDescription,
1876
1875
  }
1877
1876
 
1877
+ # check if coded subjects are defined in the subjects list
1878
+ subjects_list: list = [self.subjects_conf[x]["name"] for x in self.subjects_conf]
1879
+ coded_subjects = set(
1880
+ util.flatten_list([[y[1] for y in self.pj[cfg.OBSERVATIONS][x].get(cfg.EVENTS, [])] for x in self.pj[cfg.OBSERVATIONS]])
1881
+ )
1882
+
1883
+ not_defined_subjects: list = []
1884
+ for subject in coded_subjects:
1885
+ if subject and subject not in subjects_list:
1886
+ not_defined_subjects.append(subject)
1887
+
1888
+ if not_defined_subjects:
1889
+ QMessageBox.warning(
1890
+ self,
1891
+ cfg.programName,
1892
+ f"The coded subject(s) <b>{', '.join(not_defined_subjects)}</b> is/are not defined in the subjects list.<br>You can use the <b>Explore project</b> to fix it.",
1893
+ )
1894
+ return
1895
+
1878
1896
  self.pj[cfg.SUBJECTS] = dict(self.subjects_conf)
1879
1897
 
1880
1898
  # check ethogram