Skip to content

Commit ec7ca18

Browse files
committed
Refs #9. Updated translations for MainWindow
Closes #41. Added GPLv3 license Refs #66. Added Import wizard from the start screen.
1 parent d1dfa4b commit ec7ca18

28 files changed

+1618
-279
lines changed

LICENSE.TXT

Lines changed: 674 additions & 0 deletions
Large diffs are not rendered by default.

python/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ SET(uis
5252
resources/ui/StreamWindow.ui
5353
resources/ui/ImportMatchDialog.ui
5454
resources/ui/CrashDialog.ui
55+
resources/ui/ImportDialogWizard.ui
5556
)
5657

5758
SET(qrcs
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from resources.ui.python.ImportDialogWizard_ui import Ui_dlgImportWizard
2+
3+
from PySide6.QtCore import Slot
4+
from PySide6.QtWidgets import QDialog, QFileDialog, QMessageBox
5+
6+
7+
class ImportDialogWizard(QDialog):
8+
useExisting = False
9+
databaseFilename: str = ''
10+
11+
def __init__(self, parent=None):
12+
super().__init__(parent)
13+
self.UI = Ui_dlgImportWizard()
14+
self.UI.setupUi(self)
15+
16+
self.UI.frameExisting.hide()
17+
self.UI.radioNewDataset.setChecked(True)
18+
19+
# Connect signals
20+
self.UI.radioExistingDataset.clicked.connect(self.radio_choice_changed)
21+
self.UI.radioNewDataset.clicked.connect(self.radio_choice_changed)
22+
self.UI.txtFilename.textChanged.connect(self.filename_changed)
23+
self.UI.btnBrowse.clicked.connect(self.browse_clicked)
24+
self.UI.btnNext.clicked.connect(self.next_clicked)
25+
self.UI.btnCancel.clicked.connect(self.cancel_clicked)
26+
27+
@Slot()
28+
def radio_choice_changed(self):
29+
self.UI.frameExisting.setVisible(self.UI.radioExistingDataset.isChecked())
30+
self.useExisting = self.UI.radioExistingDataset.isChecked()
31+
if self.UI.radioExistingDataset.isChecked():
32+
self.UI.btnNext.setEnabled(self.UI.txtFilename.text() != '')
33+
else:
34+
self.UI.btnNext.setEnabled(True)
35+
36+
@Slot()
37+
def browse_clicked(self):
38+
file_diag = QFileDialog.getOpenFileName(caption=self.tr('Dataset to import data into'), filter='*.oi')
39+
40+
if file_diag[0] != '':
41+
self.UI.txtFilename.setText(file_diag[0])
42+
43+
@Slot()
44+
def filename_changed(self):
45+
self.UI.btnNext.setEnabled(self.UI.txtFilename.text() != '')
46+
47+
@Slot()
48+
def next_clicked(self):
49+
if self.useExisting:
50+
self.databaseFilename = self.UI.txtFilename.text()
51+
52+
self.accept()
53+
54+
@Slot()
55+
def cancel_clicked(self):
56+
self.reject()

python/libopenimu/qt/ImportWindow.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,24 @@ class ImportWindow(QDialog):
2121

2222
dataSet = None
2323

24-
def __init__(self, dataset=None, parent=None, filename=None, showImport=False):
24+
def __init__(self, dataset=None, parent=None, filename=None, show_import=False):
2525
super().__init__(parent=parent)
2626
self.UI = Ui_ImportDialog()
2727
self.UI.setupUi(self)
2828

2929
# Manage data if present
3030
self.dataSet = dataset
3131
self.fileName = filename
32-
self.showImport = showImport
32+
self.showImport = show_import
3333
self.update_data()
3434

3535
# Signals / Slots connections
3636
self.UI.btnCancel.clicked.connect(self.cancel_clicked)
3737
self.UI.btnOK.clicked.connect(self.ok_clicked)
38+
self.UI.txtAuthor.textChanged.connect(self.validate)
39+
self.UI.txtName.textChanged.connect(self.validate)
40+
self.UI.txtFileName.textChanged.connect(self.validate)
41+
self.UI.dateData.dateChanged.connect(self.validate)
3842
# self.UI.btnAddFile.clicked.connect(self.addFile_clicked)
3943
# self.UI.btnDelFile.clicked.connect(self.removeFile_clicked)
4044
self.UI.btnBrowse.clicked.connect(self.browse_clicked)
@@ -43,14 +47,15 @@ def exec(self):
4347
# self.UI.frameImport.setVisible(not self.showImport)
4448
# self.UI.splitter.setVisible(not self.noImportUI)
4549
if self.showImport:
46-
self.UI.btnOK.setText("Suivant")
50+
self.UI.btnOK.setText(self.tr("Next"))
4751

4852
self.UI.btnBrowse.setVisible(not self.infosOnly)
4953
self.UI.txtFileName.setVisible(not self.infosOnly)
5054
self.UI.lblFile.setVisible(not self.infosOnly)
5155

5256
return QDialog.exec(self)
5357

58+
@Slot()
5459
def validate(self):
5560
rval = True
5661
if self.UI.txtFileName.text() == '' or self.UI.txtFileName.text()[-3:] != '.oi':
@@ -71,6 +76,7 @@ def validate(self):
7176
else:
7277
self.UI.txtAuthor.setStyleSheet('background-color: rgba(226, 226, 226, 90%);')
7378

79+
self.UI.btnOK.setEnabled(rval)
7480
return rval
7581

7682
def update_data(self):
@@ -84,10 +90,11 @@ def update_data(self):
8490
import os
8591
self.UI.txtAuthor.setText(os.getlogin())
8692
self.UI.txtFileName.setText(self.fileName)
93+
self.validate() # Show mandatory fields in red
8794

8895
@Slot()
8996
def browse_clicked(self):
90-
file_diag = QFileDialog.getSaveFileName(caption="Nom du fichier à enregistrer", filter="*.oi")
97+
file_diag = QFileDialog.getSaveFileName(caption=self.tr("Dataset filename"), filter="*.oi")
9198

9299
if file_diag[0] != '':
93100
self.UI.txtFileName.setText(file_diag[0])
@@ -111,7 +118,7 @@ def ok_clicked(self):
111118
self.dataSet.name = self.UI.txtName.text()
112119
self.dataSet.description = self.UI.txtDesc.toPlainText()
113120
self.dataSet.author = self.UI.txtAuthor.text()
114-
self.dataSet.upload_date = self.UI.dateData.date().toPyDate()
121+
self.dataSet.upload_date = self.UI.dateData.date().toPython()
115122

116123
db.set_dataset_infos(name=self.dataSet.name,
117124
desc=self.dataSet.description,
@@ -124,9 +131,8 @@ def ok_clicked(self):
124131
self.accept()
125132

126133
except (DBAPIError, DataError, DatabaseError):
127-
print('Error!')
128134
box = QMessageBox()
129-
box.setText('Erreur de création de DB, s.v.p. choisir une répertoire valide')
135+
box.setText(self.tr('Dataset file creation error - please choose a valid file and directory'))
130136
box.exec()
131137

132138
@Slot()

python/libopenimu/qt/MainWindow.py

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def __init__(self, filename: str, parent=None):
5858
self.UI.dockToolBar.setTitleBarWidget(QWidget())
5959
self.UI.dockLog.hide()
6060

61-
self.add_to_log(self.tr("OpenIMU - Prêt à travailler."), LogTypes.LOGTYPE_INFO)
61+
self.add_to_log(self.tr("OpenIMU - Ready."), LogTypes.LOGTYPE_INFO)
6262

6363
# Setup signals and slots
6464
self.setup_signals()
@@ -68,14 +68,14 @@ def __init__(self, filename: str, parent=None):
6868
self.dbMan = DBManager(self.currentFileName)
6969

7070
# Load data
71-
self.add_to_log(self.tr('Chargement des données...'), LogTypes.LOGTYPE_INFO)
71+
self.add_to_log(self.tr('Loading data...'), LogTypes.LOGTYPE_INFO)
7272
self.currentDataSet = self.dbMan.get_dataset()
7373
self.load_data_from_dataset()
7474
self.UI.treeDataSet.setCurrentItem(None)
7575
self.UI.treeDataSet.owner = self
7676

7777
# self.loadDemoData()
78-
self.add_to_log(self.tr("Données chargées!"), LogTypes.LOGTYPE_DONE)
78+
self.add_to_log(self.tr("Data loaded!"), LogTypes.LOGTYPE_DONE)
7979

8080
# If we need to import data, show the import dialog
8181
# if start_window.importing:
@@ -257,7 +257,7 @@ def export_csv_requested(self):
257257
exporter = ExportWindow(self.dbMan, self)
258258
exporter.setStyleSheet(self.styleSheet())
259259
if exporter.exec() == QDialog.Accepted:
260-
print("Accepted")
260+
pass
261261

262262
@Slot()
263263
def infos_requested(self):
@@ -286,14 +286,15 @@ def db_close_requested(self):
286286
msg.setIcon(QMessageBox.Question)
287287
msg.setStyleSheet("QPushButton{min-width: 100px; min-height: 40px;}")
288288

289-
msg.setText("Cet ensemble de données sera fermé. Désirez-vous poursuivre?")
290-
msg.setWindowTitle("Fermeture?")
289+
msg.setText(self.tr('This dataset will be closed. Do you want to continue?'))
290+
msg.setWindowTitle(self.tr('Close?'))
291291
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
292292

293293
rval = msg.exec()
294294
if rval == QMessageBox.Yes:
295295
self.dbMan.close()
296-
self.add_to_log("Fichier " + self.currentFileName + " fermé.", LogTypes.LOGTYPE_INFO)
296+
self.add_to_log(self.tr('File') + ' ' + self.currentFileName + ' ' + self.tr('was closed.'),
297+
LogTypes.LOGTYPE_INFO)
297298
# self.hide()
298299

299300
# self.show_start_window()
@@ -305,16 +306,16 @@ def db_compact_requested(self):
305306
msg.setIcon(QMessageBox.Question)
306307
msg.setStyleSheet("QPushButton{min-width: 100px; min-height: 40px;}")
307308

308-
msg.setText("Le fichier de données sera nettoyé. Ceci peut prendre un certain temps. \n"
309-
"Désirez-vous poursuivre?")
310-
msg.setWindowTitle("Compactage des données")
309+
msg.setText(self.tr('Database file will be cleaned up and optimized. This can take some time.') + '\n\r' +
310+
self.tr('Do you want to continue?'))
311+
msg.setWindowTitle(self.tr('Database cleanup'))
311312
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
312313

313314
rval = msg.exec()
314315
if rval == QMessageBox.Yes:
315-
task = SimpleTask("Compactage des données", self.dbMan.compact)
316+
task = SimpleTask(self.tr('Database cleanup'), self.dbMan.compact)
316317
process = BackgroundProcess([task])
317-
dialog = ProgressDialog(process, 'Nettoyage', self)
318+
dialog = ProgressDialog(process, self.tr('Cleanup'), self)
318319
process.start()
319320
dialog.exec()
320321

@@ -394,12 +395,12 @@ def data_was_saved(self):
394395
if item_type == "group":
395396
group = self.UI.frmMain.layout().itemAt(0).widget().group
396397
self.update_group(group)
397-
self.add_to_log("Groupe " + group.name + " mis à jour.", LogTypes.LOGTYPE_DONE)
398+
self.add_to_log(self.tr('Group') + ' ' + group.name + ' ' + self.tr('updated.'), LogTypes.LOGTYPE_DONE)
398399

399400
if item_type == "participant":
400401
part = self.UI.frmMain.layout().itemAt(0).widget().participant
401402
self.update_participant(part)
402-
self.add_to_log("Participant " + part.name + " mis à jour.", LogTypes.LOGTYPE_DONE)
403+
self.add_to_log(self.tr('Participant') + ' ' + part.name + ' ' + self.tr('updated.'), LogTypes.LOGTYPE_DONE)
403404

404405
@Slot()
405406
def data_was_cancelled(self):
@@ -425,9 +426,9 @@ def delete_requested(self):
425426
msg.setIcon(QMessageBox.Question)
426427
msg.setStyleSheet("QPushButton{min-width: 100px; min-height: 40px;}")
427428

428-
msg.setText("Désirez-vous vraiment supprimer \"" + self.UI.treeDataSet.currentItem().text(0) +
429-
"\" et tous les éléments associés?")
430-
msg.setWindowTitle("Confirmation de suppression")
429+
msg.setText(self.tr('Are you sure you want to delete') + '"' + self.UI.treeDataSet.currentItem().text(0) +
430+
'"' + self.tr('and all associated elements?'))
431+
msg.setWindowTitle(self.tr('Confirm deletion'))
431432
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
432433

433434
rval = msg.exec()
@@ -438,13 +439,13 @@ def delete_requested(self):
438439
if item_type == "group":
439440
group = self.UI.treeDataSet.groups[item_id]
440441
self.UI.treeDataSet.remove_group(group)
441-
task = SimpleTask("Suppression de '" + group.name + "'", self.dbMan.delete_group, group)
442+
task = SimpleTask(self.tr('Deleting') + '"' + group.name + '"', self.dbMan.delete_group, group)
442443
tasks.append(task)
443444

444445
if item_type == "participant":
445446
part = self.UI.treeDataSet.participants[item_id]
446447
self.UI.treeDataSet.remove_participant(part)
447-
task = SimpleTask("Suppression de '" + part.name + "'", self.dbMan.delete_participant, part)
448+
task = SimpleTask(self.tr('Deleting') + '"' + part.name + '"', self.dbMan.delete_participant, part)
448449
tasks.append(task)
449450

450451
if item_type == "recordset":
@@ -454,21 +455,23 @@ def delete_requested(self):
454455
for ref in result.processed_data_ref:
455456
if ref.recordset.id_recordset == item_id:
456457
self.UI.treeDataSet.remove_result(result)
457-
task = SimpleTask("Suppression de '" + result.name + "'",
458+
task = SimpleTask(self.tr('Deleting') + '"' + result.name + '"',
458459
self.dbMan.delete_processed_data, result)
459460
tasks.append(task)
460461
# self.dbMan.delete_processed_data(result)
461462
break
462463

463464
recordset = self.UI.treeDataSet.recordsets[item_id]
464-
task = SimpleTask("Suppression de '" + recordset.name + "'", self.dbMan.delete_recordset, recordset)
465+
task = SimpleTask(self.tr('Deleting') + '"' + recordset.name + '"', self.dbMan.delete_recordset,
466+
recordset)
465467
tasks.append(task)
466468
# self.dbMan.delete_recordset(recordset)
467469
self.UI.treeDataSet.remove_recordset(recordset)
468470

469471
if item_type == "result":
470472
result = self.UI.treeDataSet.results[item_id]
471-
task = SimpleTask("Suppression de '" + result.name + "'", self.dbMan.delete_processed_data, result)
473+
task = SimpleTask(self.tr('Deleting') + '"' + result.name + '"', self.dbMan.delete_processed_data,
474+
result)
472475
tasks.append(task)
473476
self.UI.treeDataSet.remove_result(result)
474477
# self.dbMan.delete_processed_data(result)
@@ -483,7 +486,7 @@ def delete_requested(self):
483486
for recordset in recordsets:
484487
if part_id is None:
485488
part_id = recordset.id_participant
486-
task = SimpleTask("Suppression de '" + recordset.name + "'",
489+
task = SimpleTask(self.tr('Deleting') + '"' + recordset.name + '"',
487490
self.dbMan.delete_recordset, recordset)
488491
tasks.append(task)
489492
self.UI.treeDataSet.remove_recordset(recordset)
@@ -495,7 +498,7 @@ def delete_requested(self):
495498
.currentItem().parent())]
496499
recordsets = self.dbMan.get_all_recordsets(participant=participant)
497500
for recordset in recordsets:
498-
task = SimpleTask("Suppression de '" + recordset.name + "'",
501+
task = SimpleTask(self.tr('Deleting') + '"' + recordset.name + '"',
499502
self.dbMan.delete_recordset, recordset)
500503
tasks.append(task)
501504
self.UI.treeDataSet.remove_recordset(recordset)
@@ -509,13 +512,13 @@ def delete_requested(self):
509512
if tasks:
510513
process = BackgroundProcess(tasks)
511514
# Create progress dialog
512-
dialog = ProgressDialog(process, 'Suppression', self)
515+
dialog = ProgressDialog(process, self.tr('Deleting'), self)
513516
# Start tasks
514517
process.start()
515518
dialog.exec()
516519
# self.dbMan.clean_db()
517520

518-
self.add_to_log(item_name + " a été supprimé.", LogTypes.LOGTYPE_DONE)
521+
self.add_to_log(item_name + ' ' + self.tr('was deleted.'), LogTypes.LOGTYPE_DONE)
519522
self.clear_main_widgets()
520523

521524
def closeEvent(self, event):

python/libopenimu/qt/StartWindow.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from resources.ui.python.StartDialog_ui import Ui_StartDialog
22

33
from libopenimu.qt.ImportWindow import ImportWindow
4+
from libopenimu.qt.ImportDialogWizard import ImportDialogWizard
5+
from libopenimu.qt.ImportBrowser import ImportBrowser
46

57
from PySide6.QtCore import Slot, Signal, QLocale
68
from PySide6.QtWidgets import QDialog, QFileDialog, QApplication
@@ -41,11 +43,17 @@ def __init__(self, parent=None):
4143

4244
@Slot()
4345
def import_clicked(self):
44-
importdialog = ImportWindow(parent=self)
45-
importdialog.showImport = True
46+
importdialog = ImportDialogWizard(parent=self) # ImportWindow(parent=self)
47+
# importdialog.showImport = True
4648

4749
if importdialog.exec() == QDialog.Accepted:
48-
self.open_file(importdialog.fileName)
50+
self.importing = True
51+
if importdialog.useExisting:
52+
self.open_file(importdialog.databaseFilename)
53+
else:
54+
importdialog = ImportWindow(parent=self)
55+
if importdialog.exec() == QDialog.Accepted:
56+
self.open_file(importdialog.fileName)
4957

5058
@Slot()
5159
def open_clicked(self):

python/resources/core.qrc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@
4646
<file>icons/bug.png</file>
4747
<file>icons/date.png</file>
4848
<file>LogoOpenIMU.png</file>
49+
<file>icons/ok.png</file>
50+
<file>icons/undo.png</file>
51+
<file>icons/new.png</file>
52+
<file>icons/next.png</file>
53+
<file>icons/previous.png</file>
54+
<file>icons/group_new.png</file>
55+
<file>icons/participant_new.png</file>
56+
<file>icons/database_new.png</file>
4957
</qresource>
5058
<qresource prefix="/">
5159
<file>stylesheet.qss</file>
6.97 KB
Loading

python/resources/icons/delete.png

46 KB
Loading

python/resources/icons/group.png

-1.6 KB
Loading

python/resources/icons/group_new.png

16 KB
Loading

python/resources/icons/import.png

-2.26 KB
Loading

python/resources/icons/new.png

27.1 KB
Loading

python/resources/icons/next.png

35.1 KB
Loading

python/resources/icons/ok.png

15.9 KB
Loading
19.5 KB
Loading
29.7 KB
Loading

python/resources/icons/previous.png

33.6 KB
Loading

python/resources/icons/undo.png

8.44 KB
Loading

0 commit comments

Comments
 (0)