boris-behav-obs 8.26__tar.gz → 8.27__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.
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/PKG-INFO +1 -1
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/core.py +67 -12
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/preferences.py +0 -1
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/select_modifiers.py +32 -8
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/version.py +2 -2
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris_behav_obs.egg-info/PKG-INFO +1 -1
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/pyproject.toml +2 -2
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/LICENSE.TXT +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/MANIFEST.in +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/README.TXT +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/README.rst +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/__main__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/about.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/add_modifier.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/add_modifier_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/advanced_event_filtering.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/behav_coding_map_creator.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/behavior_binary_table.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/behaviors_coding_map.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/boris_cli.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/cmd_arguments.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/coding_pad.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/config.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/config_file.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/connections.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/converters.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/converters_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/cooccurence.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/core_qrc.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/core_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/db_functions.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/dev.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/dialog.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/duration_widget.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/edit_event.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/edit_event_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/event_operations.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/events_cursor.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/events_snapshots.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/exclusion_matrix.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/export_events.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/export_observation.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/external_processes.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/geometric_measurement.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/gui_utilities.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/image_overlay.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/import_observations.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/irr.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/latency.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/map_creator.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/measurement_widget.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/media_file.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/menu_options.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/modifiers_coding_map.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/mpv.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/mpv2.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/observation.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/observation_operations.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/observation_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/observations_list.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/otx_parser.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/param_panel.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/param_panel_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/player_dock_widget.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/plot_data_module.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/plot_events.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/plot_events_rt.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/plot_spectrogram_rt.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/plot_waveform_rt.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/portion/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/portion/const.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/portion/dict.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/portion/func.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/portion/interval.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/portion/io.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/preferences_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/project.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/project_functions.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/project_import_export.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/project_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/__main__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/colorsystem.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/dark/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/dark/darkstyle_rc.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/dark/palette.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/example/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/example/__main__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/example/ui/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/light/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/light/lightstyle_rc.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/light/palette.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/palette.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/utils/__init__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/utils/__main__.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/utils/images.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qdarkstyle/utils/scss.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qrc_boris.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/qrc_boris5.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/select_observations.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/select_subj_behav.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/state_events.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/subjects_pad.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/synthetic_time_budget.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/time_budget_functions.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/time_budget_widget.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/transitions.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/utilities.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/video_equalizer.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/video_equalizer_ui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/video_operations.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/vlc_local.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris/write_event.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris_behav_obs.egg-info/SOURCES.txt +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris_behav_obs.egg-info/entry_points.txt +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris_behav_obs.egg-info/requires.txt +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/boris_behav_obs.egg-info/top_level.txt +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/setup.cfg +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_db_functions.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_export_observation.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_irr.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_observation_gui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_otx_parser.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_preferences_gui.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_project_functions.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_time_budget.py +0 -0
- {boris_behav_obs-8.26 → boris_behav_obs-8.27}/tests/test_utilities.py +0 -0
|
@@ -53,6 +53,8 @@ import gzip
|
|
|
53
53
|
from collections import deque
|
|
54
54
|
|
|
55
55
|
import matplotlib
|
|
56
|
+
import zipfile
|
|
57
|
+
import shutil
|
|
56
58
|
|
|
57
59
|
matplotlib.use("Qt5Agg")
|
|
58
60
|
|
|
@@ -1360,28 +1362,81 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
1360
1362
|
def actionCheckUpdate_activated(self, flagMsgOnlyIfNew=False):
|
|
1361
1363
|
"""
|
|
1362
1364
|
check BORIS web site for updates
|
|
1365
|
+
ask user for updating
|
|
1363
1366
|
"""
|
|
1364
1367
|
|
|
1368
|
+
versionURL = "https://www.boris.unito.it/static/ver4.dat"
|
|
1365
1369
|
try:
|
|
1366
|
-
versionURL = "https://www.boris.unito.it/static/ver4.dat"
|
|
1367
1370
|
last_version = urllib.request.urlopen(versionURL).read().strip().decode("utf-8")
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1371
|
+
except Exception:
|
|
1372
|
+
QMessageBox.warning(self, cfg.programName, "Can not check for updates...")
|
|
1373
|
+
return
|
|
1374
|
+
|
|
1375
|
+
# record check timestamp
|
|
1376
|
+
config_file.save(self, lastCheckForNewVersion=int(time.mktime(time.localtime())))
|
|
1377
|
+
|
|
1378
|
+
if util.versiontuple(last_version) > util.versiontuple(__version__):
|
|
1379
|
+
if (
|
|
1380
|
+
dialog.MessageDialog(
|
|
1381
|
+
cfg.programName,
|
|
1382
|
+
(
|
|
1383
|
+
f"A new version is available: v. {last_version}.<br><br>"
|
|
1384
|
+
'For updating manually go to <a href="https://www.boris.unito.it">https://www.boris.unito.it</a>.<br>'
|
|
1385
|
+
),
|
|
1386
|
+
(cfg.CANCEL, "Update automatically"),
|
|
1373
1387
|
)
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1388
|
+
== cfg.CANCEL
|
|
1389
|
+
):
|
|
1390
|
+
return
|
|
1391
|
+
|
|
1392
|
+
else:
|
|
1393
|
+
msg = f"The version you are using is the last one: <b>{__version__}</b>"
|
|
1394
|
+
QMessageBox.information(self, cfg.programName, msg)
|
|
1395
|
+
|
|
1396
|
+
# any news?
|
|
1377
1397
|
newsURL = "https://www.boris.unito.it/static/news.dat"
|
|
1378
1398
|
news = urllib.request.urlopen(newsURL).read().strip().decode("utf-8")
|
|
1379
|
-
config_file.save(self, lastCheckForNewVersion=int(time.mktime(time.localtime())))
|
|
1380
|
-
QMessageBox.information(self, cfg.programName, msg)
|
|
1381
1399
|
if news:
|
|
1382
1400
|
QMessageBox.information(self, cfg.programName, news)
|
|
1401
|
+
return
|
|
1402
|
+
|
|
1403
|
+
# check if a .git is present
|
|
1404
|
+
if (pl.Path(__file__).parent.parent / pl.Path(".git")).is_dir():
|
|
1405
|
+
QMessageBox.critical(self, cfg.programName, "A .git directory is present, BORIS cannot be automatically updated.")
|
|
1406
|
+
return
|
|
1407
|
+
|
|
1408
|
+
# download zip archive
|
|
1409
|
+
try:
|
|
1410
|
+
zip_content = urllib.request.urlopen(f"https://github.com/olivierfriard/BORIS/archive/refs/tags/v{last_version}.zip").read()
|
|
1383
1411
|
except Exception:
|
|
1384
|
-
QMessageBox.
|
|
1412
|
+
QMessageBox.critical(self, cfg.programName, "Cannot download the new version")
|
|
1413
|
+
return
|
|
1414
|
+
|
|
1415
|
+
temp_zip = tempfile.NamedTemporaryFile(suffix=".zip")
|
|
1416
|
+
try:
|
|
1417
|
+
with open(temp_zip.name, "wb") as f_out:
|
|
1418
|
+
f_out.write(zip_content)
|
|
1419
|
+
except Exception:
|
|
1420
|
+
QMessageBox.critical(self, cfg.programName, "A problem occurred during saving the new version of BORIS.")
|
|
1421
|
+
return
|
|
1422
|
+
|
|
1423
|
+
# extract to temp dir
|
|
1424
|
+
try:
|
|
1425
|
+
temp_dir = tempfile.TemporaryDirectory()
|
|
1426
|
+
with zipfile.ZipFile(temp_zip.name, "r") as zip_ref:
|
|
1427
|
+
zip_ref.extractall(temp_dir.name)
|
|
1428
|
+
except Exception:
|
|
1429
|
+
QMessageBox.critical(self, cfg.programName, "A problem occurred during the unzip of the new version.")
|
|
1430
|
+
return
|
|
1431
|
+
|
|
1432
|
+
# copy from temp dir to current BORIS dir
|
|
1433
|
+
try:
|
|
1434
|
+
shutil.copytree(f"{temp_dir.name}/BORIS-{last_version}", pl.Path(__file__).parent.parent, dirs_exist_ok=True)
|
|
1435
|
+
except Exception:
|
|
1436
|
+
QMessageBox.critical(self, cfg.programName, "A problem occurred during the copy the new version of BORIS.")
|
|
1437
|
+
return
|
|
1438
|
+
|
|
1439
|
+
QMessageBox.information(self, cfg.programName, f"BORIS was updated to v. {last_version}. Restart the program to apply the changes.")
|
|
1385
1440
|
|
|
1386
1441
|
def seek_mediaplayer(self, new_time: dec, player=0) -> int:
|
|
1387
1442
|
"""
|
|
@@ -43,6 +43,10 @@ from . import utilities as util
|
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
class ModifiersList(QDialog):
|
|
46
|
+
"""
|
|
47
|
+
class for selection the modifier(s)
|
|
48
|
+
"""
|
|
49
|
+
|
|
46
50
|
def __init__(self, code: str, modifiers_dict: dict, currentModifier: str):
|
|
47
51
|
super().__init__()
|
|
48
52
|
self.setWindowTitle(cfg.programName)
|
|
@@ -60,11 +64,11 @@ class ModifiersList(QDialog):
|
|
|
60
64
|
self.modifiersSetNumber = 0
|
|
61
65
|
|
|
62
66
|
for idx in util.sorted_keys(modifiers_dict):
|
|
63
|
-
if self.modifiers_dict[idx]["type"] not in
|
|
67
|
+
if self.modifiers_dict[idx]["type"] not in (
|
|
64
68
|
cfg.SINGLE_SELECTION,
|
|
65
69
|
cfg.MULTI_SELECTION,
|
|
66
70
|
cfg.NUMERIC_MODIFIER,
|
|
67
|
-
|
|
71
|
+
):
|
|
68
72
|
continue
|
|
69
73
|
|
|
70
74
|
V2layout = QVBoxLayout()
|
|
@@ -75,10 +79,13 @@ class ModifiersList(QDialog):
|
|
|
75
79
|
lb.setText(f"Modifier <b>{self.modifiers_dict[idx]['name']}</b>")
|
|
76
80
|
V2layout.addWidget(lb)
|
|
77
81
|
|
|
78
|
-
|
|
82
|
+
lb = QLabel(f"<small>{self.modifiers_dict[idx]['description']}</small>")
|
|
83
|
+
V2layout.addWidget(lb)
|
|
84
|
+
|
|
85
|
+
if self.modifiers_dict[idx]["type"] in (
|
|
79
86
|
cfg.SINGLE_SELECTION,
|
|
80
87
|
cfg.MULTI_SELECTION,
|
|
81
|
-
|
|
88
|
+
):
|
|
82
89
|
lw = QListWidget()
|
|
83
90
|
self.modifiers_dict[idx]["widget"] = lw
|
|
84
91
|
lw.setObjectName(f"lw_modifiers_({self.modifiers_dict[idx]['type']})")
|
|
@@ -114,6 +121,7 @@ class ModifiersList(QDialog):
|
|
|
114
121
|
if self.modifiers_dict[idx]["type"] in [cfg.NUMERIC_MODIFIER]:
|
|
115
122
|
le = QLineEdit()
|
|
116
123
|
self.modifiers_dict[idx]["widget"] = le
|
|
124
|
+
le.setObjectName(f"le_modifiers_({self.modifiers_dict[idx]['type']})")
|
|
117
125
|
|
|
118
126
|
if currentModifierList != [""] and currentModifierList[int(idx)] != "None":
|
|
119
127
|
le.setText(currentModifierList[int(idx)])
|
|
@@ -160,10 +168,14 @@ class ModifiersList(QDialog):
|
|
|
160
168
|
|
|
161
169
|
# accept and close dialog if enter pressed
|
|
162
170
|
if ek == Qt.Key_Enter or ek == Qt.Key_Return: # enter or enter from numeric pad
|
|
163
|
-
self.
|
|
171
|
+
if not self.pbOK_clicked():
|
|
172
|
+
return False
|
|
164
173
|
return True
|
|
165
174
|
|
|
175
|
+
modifiersSetIndex = 0
|
|
166
176
|
for widget in self.children():
|
|
177
|
+
if "_modifiers" in widget.objectName():
|
|
178
|
+
modifiersSetIndex = modifiersSetIndex + 1
|
|
167
179
|
if "lw_modifiers" in widget.objectName():
|
|
168
180
|
if self.modifiersSetNumber == 1:
|
|
169
181
|
# check if modifiers have code
|
|
@@ -172,7 +184,7 @@ class ModifiersList(QDialog):
|
|
|
172
184
|
break
|
|
173
185
|
else:
|
|
174
186
|
# modifiers have no associated code: the modifier starting with hit key will be selected
|
|
175
|
-
if ek not in
|
|
187
|
+
if ek not in (Qt.Key_Down, Qt.Key_Up):
|
|
176
188
|
if ek == Qt.Key_Space and f"({cfg.MULTI_SELECTION})" in widget.objectName(): # checking using SPACE bar
|
|
177
189
|
if widget.item(widget.currentRow()).checkState() == Qt.Checked:
|
|
178
190
|
widget.item(widget.currentRow()).setCheckState(Qt.Unchecked)
|
|
@@ -198,6 +210,7 @@ class ModifiersList(QDialog):
|
|
|
198
210
|
return
|
|
199
211
|
|
|
200
212
|
for index in range(widget.count()):
|
|
213
|
+
# check function kesy (F1, F2...)
|
|
201
214
|
if ek in cfg.function_keys:
|
|
202
215
|
if f"({cfg.function_keys[ek]})" in widget.item(index).text().upper():
|
|
203
216
|
if f"({cfg.SINGLE_SELECTION})" in widget.objectName():
|
|
@@ -206,6 +219,10 @@ class ModifiersList(QDialog):
|
|
|
206
219
|
if self.modifiersSetNumber == 1:
|
|
207
220
|
self.accept()
|
|
208
221
|
return True
|
|
222
|
+
# else move to next set of mofifiers
|
|
223
|
+
elif modifiersSetIndex != self.modifiersSetNumber:
|
|
224
|
+
widget.parent().focusNextChild()
|
|
225
|
+
return True
|
|
209
226
|
|
|
210
227
|
if f"({cfg.MULTI_SELECTION})" in widget.objectName():
|
|
211
228
|
if widget.item(index).checkState() == Qt.Checked:
|
|
@@ -220,6 +237,10 @@ class ModifiersList(QDialog):
|
|
|
220
237
|
if self.modifiersSetNumber == 1:
|
|
221
238
|
self.accept()
|
|
222
239
|
return True
|
|
240
|
+
# else move to next set of mofifiers
|
|
241
|
+
elif modifiersSetIndex != self.modifiersSetNumber:
|
|
242
|
+
widget.parent().focusNextChild()
|
|
243
|
+
return True
|
|
223
244
|
|
|
224
245
|
if f"({cfg.MULTI_SELECTION})" in widget.objectName():
|
|
225
246
|
if widget.item(index).checkState() == Qt.Checked:
|
|
@@ -271,6 +292,9 @@ class ModifiersList(QDialog):
|
|
|
271
292
|
return self.modifiers_dict
|
|
272
293
|
|
|
273
294
|
def pbOK_clicked(self):
|
|
295
|
+
"""
|
|
296
|
+
OK button is clicked
|
|
297
|
+
"""
|
|
274
298
|
for idx in util.sorted_keys(self.modifiers_dict):
|
|
275
299
|
if self.modifiers_dict[idx]["type"] == cfg.NUMERIC_MODIFIER:
|
|
276
300
|
if self.modifiers_dict[idx]["widget"].text():
|
|
@@ -280,8 +304,8 @@ class ModifiersList(QDialog):
|
|
|
280
304
|
QMessageBox.warning(
|
|
281
305
|
self,
|
|
282
306
|
cfg.programName,
|
|
283
|
-
"<b>{}</b> is not a numeric value"
|
|
307
|
+
f"<b>{self.modifiers_dict[idx]['widget'].text()}</b> is not a numeric value",
|
|
284
308
|
)
|
|
285
|
-
return
|
|
309
|
+
return False
|
|
286
310
|
|
|
287
311
|
self.accept()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "boris-behav-obs"
|
|
3
|
-
version = "8.
|
|
3
|
+
version = "8.27"
|
|
4
4
|
description = "BORIS - Behavioral Observation Research Interactive Software"
|
|
5
5
|
authors = [{ name="Olivier Friard", email="olivier.friard@unito.it" }]
|
|
6
6
|
readme = "README.rst"
|
|
@@ -58,7 +58,7 @@ line-length = 140
|
|
|
58
58
|
exclude = ["*_ui.py", "mpv*"]
|
|
59
59
|
|
|
60
60
|
[tool.bumpver]
|
|
61
|
-
current_version = "8.
|
|
61
|
+
current_version = "8.27"
|
|
62
62
|
version_pattern = "MAJOR.MINOR.PATCH"
|
|
63
63
|
|
|
64
64
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|