Anchor-annotator 0.4.0__py3-none-any.whl → 0.6.0__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Anchor_annotator
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: Anchor annotator is a program for inspecting corpora for the Montreal Forced Aligner and correcting transcriptions and pronunciations.
5
5
  Home-page: https://github.com/MontrealCorpusTools/Anchor-annotator
6
6
  Author: Montreal Corpus Tools
@@ -0,0 +1,22 @@
1
+ anchor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ anchor/__main__.py,sha256=5ufG8lcx2x1am-04xI991AG7saJd24dxPw5JzjmB878,45
3
+ anchor/_version.py,sha256=2JKwcA-YQ0okV2N-gwTWy_n51igWrPcsKQFm0cnqsvw,411
4
+ anchor/command_line.py,sha256=EucG805HyWk_zkMO9RXv9Yj0I0JVdDLZb1_DX2_ISjM,503
5
+ anchor/db.py,sha256=ef4lO6HtCKoxC9CorIc0ZbPxKpjHa576a0ZIBOWNU9E,4956
6
+ anchor/main.py,sha256=t4vREjcD_qj5362wDchCFcA4ecBBfcTAjmC_Ok0P1yM,126411
7
+ anchor/models.py,sha256=tYtj_doI9LokNOo624b1OmVLTFpIdKBVPfAzCO90ou4,96315
8
+ anchor/plot.py,sha256=t1LZ-BsmCJlz3v4zyyCoPm42N_jP0ic8w4hXI8DGVkg,112449
9
+ anchor/resources_rc.py,sha256=tzJHrJw3MpjAlnj-DtCmaR4A8gAaLF966XEXs5HNIjc,8464375
10
+ anchor/settings.py,sha256=4ucr440O7wJhkatP1a2eK6lVGRgkVh2UUI2zs-JDlno,51883
11
+ anchor/ui_corpus_manager.py,sha256=e3ybOd4UdYarrLBATxI8vIFnioa4R_BHrbsEz5mJ5eA,8564
12
+ anchor/ui_error_dialog.py,sha256=HKbjGT_jtdb9jfn9THQMbl1fmcdWyjYDazM4hCwZ5Yo,3931
13
+ anchor/ui_main_window.py,sha256=q7dsxdvjhMy-W_7qEqV9EalWUZsca1OwfdrU0EVz8d0,36574
14
+ anchor/ui_preferences.py,sha256=g3tcjAMFKIAqUJNEke7ww4LkdeTFA1zb8_lrhF6k5fo,43271
15
+ anchor/undo.py,sha256=HUrTT8N-y1jFrSBX4wSNSGF3G0YiBeKUqKJQQg1qffI,32919
16
+ anchor/widgets.py,sha256=q_yfANJ68zvZ5t-4vF8hMHmLFHGp6GCHPSDesdw9iJA,158420
17
+ anchor/workers.py,sha256=YhJ2EEeqzi3xu2NYPdFrYzgnWcyXhFtjnjxgwfeLSqo,172456
18
+ Anchor_annotator-0.6.0.dist-info/LICENSE,sha256=C0oIsblENEgWQ7XMNdYoXyXsIA5wa3YF0I9lK3H7A1s,1076
19
+ Anchor_annotator-0.6.0.dist-info/METADATA,sha256=DuhOE6l8IrlLxszFmFjWfy_FVy3VhzaTQ66K2aAylN8,1500
20
+ Anchor_annotator-0.6.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
21
+ Anchor_annotator-0.6.0.dist-info/top_level.txt,sha256=wX6ZKxImGRZKFQjs3f6XYw_TfbAp6Xs3SmbLfLbFAJ0,7
22
+ Anchor_annotator-0.6.0.dist-info/RECORD,,
anchor/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.4.0'
16
- __version_tuple__ = version_tuple = (0, 4, 0)
15
+ __version__ = version = '0.6.0'
16
+ __version_tuple__ = version_tuple = (0, 6, 0)
anchor/main.py CHANGED
@@ -103,6 +103,9 @@ class MainWindow(QtWidgets.QMainWindow):
103
103
  self.status_indicator.setFixedWidth(self.ui.statusbar.height())
104
104
  self.ui.statusbar.addPermanentWidget(self.status_indicator, 0)
105
105
  self.settings = AnchorSettings()
106
+ self.settings.themeUpdated.connect(self.refresh_style_sheets)
107
+ self.style_hints = QtGui.QGuiApplication.styleHints()
108
+ self.style_hints.colorSchemeChanged.connect(self.refresh_style_sheets)
106
109
  self.model_manager = ModelManager(
107
110
  token=self.settings.value(AnchorSettings.GITHUB_TOKEN), ignore_cache=True
108
111
  )
@@ -120,6 +123,7 @@ class MainWindow(QtWidgets.QMainWindow):
120
123
  self.media_player = MediaPlayer(self)
121
124
  self.media_player.playbackStateChanged.connect(self.handleAudioState)
122
125
  self.media_player.audioReady.connect(self.file_loaded)
126
+ self.media_player.playingChanged.connect(self.update_play_button)
123
127
  self.media_player.timeChanged.connect(
124
128
  self.ui.utteranceDetailWidget.plot_widget.audio_plot.update_play_line
125
129
  )
@@ -342,14 +346,11 @@ class MainWindow(QtWidgets.QMainWindow):
342
346
  session.commit()
343
347
 
344
348
  def file_loaded(self, ready):
345
- if ready:
346
- self.ui.playAct.setEnabled(ready)
347
- self.ui.muteAct.setEnabled(ready)
348
- else:
349
- self.ui.playAct.setEnabled(False)
350
- self.ui.playAct.setChecked(False)
351
- self.ui.muteAct.setChecked(False)
352
- self.ui.muteAct.setEnabled(False)
349
+ self.ui.playAct.setEnabled(ready)
350
+ self.ui.muteAct.setEnabled(ready)
351
+
352
+ def update_play_button(self, playing):
353
+ self.ui.playAct.setChecked(playing)
353
354
 
354
355
  def corpus_changed(self, clean):
355
356
  if clean:
@@ -827,9 +828,6 @@ class MainWindow(QtWidgets.QMainWindow):
827
828
  self.ui.lockEditAct.toggled.connect(self.toggle_lock)
828
829
  self.ui.exportFilesAct.setEnabled(True)
829
830
  self.ui.exportFilesAct.triggered.connect(self.export_files)
830
- self.ui.showAllSpeakersAct.triggered.connect(
831
- self.ui.utteranceDetailWidget.plot_widget.update_show_speakers
832
- )
833
831
  self.ui.muteAct.triggered.connect(self.update_mute_status)
834
832
  self.volume_slider = QtWidgets.QSlider(QtCore.Qt.Orientation.Horizontal, self)
835
833
  self.volume_slider.setMaximum(100)
@@ -868,9 +866,9 @@ class MainWindow(QtWidgets.QMainWindow):
868
866
  self.ui.selectMappingFileAct.triggered.connect(self.change_custom_mapping)
869
867
 
870
868
  self.undo_act = self.undo_group.createUndoAction(self, "Undo")
871
- self.undo_act.setIcon(QtGui.QIcon(":undo.svg"))
869
+ self.undo_act.setIcon(QtGui.QIcon.fromTheme("edit-undo"))
872
870
  self.redo_act = self.undo_group.createRedoAction(self, "Redo")
873
- self.redo_act.setIcon(QtGui.QIcon(":redo.svg"))
871
+ self.redo_act.setIcon(QtGui.QIcon.fromTheme("edit-redo"))
874
872
  self.ui.menuEdit.addAction(self.undo_act)
875
873
  self.ui.menuEdit.addAction(self.redo_act)
876
874
  self.undo_group.setActiveStack(self.corpus_undo_stack)
@@ -1851,6 +1849,54 @@ class MainWindow(QtWidgets.QMainWindow):
1851
1849
 
1852
1850
  def refresh_style_sheets(self):
1853
1851
  self.setStyleSheet(self.settings.style_sheet)
1852
+ self.styleSheetChanged.emit(self.settings.style_sheet)
1853
+ self.ui.utteranceDetailWidget.plot_widget.refresh_theme()
1854
+ QtGui.QIcon.setThemeName("anchor_light")
1855
+ if self.settings.theme_preset == "Native":
1856
+ dark_mode = (
1857
+ QtGui.QGuiApplication.styleHints().colorScheme() == QtCore.Qt.ColorScheme.Dark
1858
+ )
1859
+ if dark_mode:
1860
+ QtGui.QIcon.setThemeName("anchor_dark")
1861
+ if False:
1862
+ self.ui.playAct.setIcon(
1863
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.MediaPlaybackStart)
1864
+ )
1865
+ self.ui.muteAct.setIcon(
1866
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.AudioVolumeMuted)
1867
+ )
1868
+ self.ui.zoomInAct.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ZoomIn))
1869
+ self.ui.zoomOutAct.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ZoomOut))
1870
+ self.ui.zoomToSelectionAct.setIcon(
1871
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ZoomFitBest)
1872
+ )
1873
+ self.ui.mergeUtterancesAct.setIcon(
1874
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.InputGaming)
1875
+ )
1876
+ self.ui.splitUtterancesAct.setIcon(
1877
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ViewFullscreen)
1878
+ )
1879
+ self.ui.deleteUtterancesAct.setIcon(
1880
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.EditDelete)
1881
+ )
1882
+ self.ui.exportFilesAct.setIcon(
1883
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.DocumentSave)
1884
+ )
1885
+ self.ui.lockEditAct.setIcon(
1886
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.SystemLockScreen)
1887
+ )
1888
+ self.ui.getHelpAct.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.HelpAbout))
1889
+ self.ui.reportBugAct.setIcon(
1890
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.MailForward)
1891
+ )
1892
+ self.ui.alignUtteranceAct.setIcon(
1893
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.FormatTextUnderline)
1894
+ )
1895
+ self.ui.cancelCorpusLoadAct.setIcon(
1896
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ProcessStop)
1897
+ )
1898
+ self.undo_act.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.EditUndo))
1899
+ self.redo_act.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.EditRedo))
1854
1900
 
1855
1901
  def refresh_corpus_history(self):
1856
1902
  self.ui.loadRecentCorpusMenu.clear()
@@ -1869,8 +1915,7 @@ class MainWindow(QtWidgets.QMainWindow):
1869
1915
  self.ui.loadRecentCorpusMenu.addAction(a)
1870
1916
 
1871
1917
  def refresh_settings(self):
1872
- self.setStyleSheet(self.settings.style_sheet)
1873
- self.styleSheetChanged.emit(self.settings.style_sheet)
1918
+ self.refresh_style_sheets()
1874
1919
  self.refresh_shortcuts()
1875
1920
  self.corpus_model.set_limit(self.settings.value(self.settings.RESULTS_PER_PAGE))
1876
1921
  self.dictionary_model.set_limit(self.settings.value(self.settings.RESULTS_PER_PAGE))
@@ -1880,6 +1925,7 @@ class MainWindow(QtWidgets.QMainWindow):
1880
1925
  self.ui.dictionaryWidget.refresh_settings()
1881
1926
  self.ui.speakerWidget.refresh_settings()
1882
1927
  self.media_player.refresh_settings()
1928
+ self.ui.utteranceDetailWidget.plot_widget.refresh()
1883
1929
 
1884
1930
  def download_language_model(self):
1885
1931
  self.download_worker.set_params(
@@ -2285,6 +2331,10 @@ class DetailedMessageBox(QtWidgets.QDialog): # pragma: no cover
2285
2331
  self.ui = Ui_ErrorDialog()
2286
2332
  self.ui.setupUi(self)
2287
2333
  self.settings = AnchorSettings()
2334
+ icon = QtGui.QIcon.fromTheme("emblem-important")
2335
+ size = self.ui.iconLabel.size()
2336
+ self.ui.iconLabel.setPixmap(icon.pixmap(size))
2337
+ self.setWindowIcon(icon)
2288
2338
  self.ui.detailed_message.setText(detailed_message)
2289
2339
  self.ui.buttonBox.report_bug_button.clicked.connect(self.reportBug.emit)
2290
2340
  self.ui.buttonBox.rejected.connect(self.reject)
@@ -2300,6 +2350,14 @@ class ManagerDialog(QtWidgets.QDialog):
2300
2350
  self.ui.setupUi(self)
2301
2351
  self.ui.tabWidget.setCurrentIndex(0)
2302
2352
  self.settings = AnchorSettings()
2353
+ QtGui.QIcon.setThemeName("anchor_light")
2354
+ if self.settings.theme_preset == "Native":
2355
+ dark_mode = (
2356
+ QtGui.QGuiApplication.styleHints().colorScheme() == QtCore.Qt.ColorScheme.Dark
2357
+ )
2358
+ if dark_mode:
2359
+ QtGui.QIcon.setThemeName("anchor_dark")
2360
+
2303
2361
  self.model_manager = model_manager
2304
2362
 
2305
2363
  self.db_engine = db_engine
@@ -2381,33 +2439,10 @@ class OptionsDialog(QtWidgets.QDialog):
2381
2439
  self.ui.setupUi(self)
2382
2440
  self.settings = AnchorSettings()
2383
2441
 
2384
- self.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
2442
+ self.initial_theme = self.settings.current_theme
2385
2443
 
2386
- self.ui.primaryBaseEdit.set_color(self.settings.value(self.settings.PRIMARY_BASE_COLOR))
2387
- self.ui.primaryLightEdit.set_color(self.settings.value(self.settings.PRIMARY_LIGHT_COLOR))
2388
- self.ui.primaryDarkEdit.set_color(self.settings.value(self.settings.PRIMARY_DARK_COLOR))
2389
- self.ui.primaryVeryLightEdit.set_color(
2390
- self.settings.value(self.settings.PRIMARY_VERY_LIGHT_COLOR)
2391
- )
2392
- self.ui.primaryVeryDarkEdit.set_color(
2393
- self.settings.value(self.settings.PRIMARY_VERY_DARK_COLOR)
2394
- )
2395
-
2396
- self.ui.accentBaseEdit.set_color(self.settings.value(self.settings.ACCENT_BASE_COLOR))
2397
- self.ui.accentLightEdit.set_color(self.settings.value(self.settings.ACCENT_LIGHT_COLOR))
2398
- self.ui.accentDarkEdit.set_color(self.settings.value(self.settings.ACCENT_DARK_COLOR))
2399
- self.ui.accentVeryLightEdit.set_color(
2400
- self.settings.value(self.settings.ACCENT_VERY_LIGHT_COLOR)
2401
- )
2402
- self.ui.accentVeryDarkEdit.set_color(
2403
- self.settings.value(self.settings.ACCENT_VERY_DARK_COLOR)
2404
- )
2405
-
2406
- self.ui.mainTextColorEdit.set_color(self.settings.value(self.settings.MAIN_TEXT_COLOR))
2407
- self.ui.selectedTextColorEdit.set_color(
2408
- self.settings.value(self.settings.SELECTED_TEXT_COLOR)
2409
- )
2410
- self.ui.errorColorEdit.set_color(self.settings.value(self.settings.ERROR_COLOR))
2444
+ self.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
2445
+ self.ui.errorColorEdit.colorChanged.connect(self.update_theme)
2411
2446
 
2412
2447
  self.ui.fontEdit.set_font(self.settings.font)
2413
2448
 
@@ -2456,6 +2491,11 @@ class OptionsDialog(QtWidgets.QDialog):
2456
2491
  self.settings.value(self.settings.TIME_DIRECTION)
2457
2492
  )
2458
2493
  )
2494
+ self.ui.visibleSpeakerComboBox.setCurrentIndex(
2495
+ self.ui.visibleSpeakerComboBox.findText(
2496
+ str(self.settings.value(self.settings.TIER_MAX_SPEAKERS))
2497
+ )
2498
+ )
2459
2499
 
2460
2500
  self.ui.dynamicRangeEdit.setValue(self.settings.value(self.settings.SPEC_DYNAMIC_RANGE))
2461
2501
  self.ui.specMaxTimeEdit.setText(str(self.settings.value(self.settings.SPEC_MAX_TIME)))
@@ -2472,6 +2512,11 @@ class OptionsDialog(QtWidgets.QDialog):
2472
2512
  self.ui.frameLengthEdit.setValue(self.settings.value(self.settings.PITCH_FRAME_LENGTH))
2473
2513
  self.ui.penaltyEdit.setText(str(self.settings.value(self.settings.PITCH_PENALTY_FACTOR)))
2474
2514
  self.ui.pitchDeltaEdit.setText(str(self.settings.value(self.settings.PITCH_DELTA_PITCH)))
2515
+ self.ui.presetThemeEdit.setCurrentIndex(
2516
+ self.ui.presetThemeEdit.findText(str(self.settings.value(self.settings.THEME_PRESET)))
2517
+ )
2518
+ self.ui.presetThemeEdit.currentIndexChanged.connect(self.update_preset_theme)
2519
+ self.ui.presetThemeEdit.currentIndexChanged.connect(self.update_theme)
2475
2520
 
2476
2521
  self.ui.audioDeviceEdit.clear()
2477
2522
  for o in QtMultimedia.QMediaDevices.audioOutputs():
@@ -2486,6 +2531,82 @@ class OptionsDialog(QtWidgets.QDialog):
2486
2531
  # self.setFont(self.settings.font)
2487
2532
  # self.setStyleSheet(self.settings.style_sheet)
2488
2533
 
2534
+ def set_theme(self, theme):
2535
+ self.ui.primaryBaseEdit.set_color(theme[self.settings.PRIMARY_BASE_COLOR])
2536
+ self.ui.primaryLightEdit.set_color(theme[self.settings.PRIMARY_LIGHT_COLOR])
2537
+ self.ui.primaryDarkEdit.set_color(theme[self.settings.PRIMARY_DARK_COLOR])
2538
+ self.ui.primaryVeryLightEdit.set_color(theme[self.settings.PRIMARY_VERY_LIGHT_COLOR])
2539
+ self.ui.primaryVeryDarkEdit.set_color(theme[self.settings.PRIMARY_VERY_DARK_COLOR])
2540
+
2541
+ self.ui.accentBaseEdit.set_color(theme[self.settings.ACCENT_BASE_COLOR])
2542
+ self.ui.accentLightEdit.set_color(theme[self.settings.ACCENT_LIGHT_COLOR])
2543
+ self.ui.accentDarkEdit.set_color(theme[self.settings.ACCENT_DARK_COLOR])
2544
+ self.ui.accentVeryLightEdit.set_color(theme[self.settings.ACCENT_VERY_LIGHT_COLOR])
2545
+ self.ui.accentVeryDarkEdit.set_color(theme[self.settings.ACCENT_VERY_DARK_COLOR])
2546
+
2547
+ self.ui.mainTextColorEdit.set_color(theme[self.settings.MAIN_TEXT_COLOR])
2548
+ self.ui.selectedTextColorEdit.set_color(theme[self.settings.SELECTED_TEXT_COLOR])
2549
+ self.ui.errorColorEdit.set_color(theme[self.settings.ERROR_COLOR])
2550
+
2551
+ def update_preset_theme(self):
2552
+ theme = self.ui.presetThemeEdit.currentText()
2553
+ self.ui.primaryBaseEdit.setEnabled(False)
2554
+ self.ui.primaryLightEdit.setEnabled(False)
2555
+ self.ui.primaryDarkEdit.setEnabled(False)
2556
+ self.ui.primaryVeryLightEdit.setEnabled(False)
2557
+ self.ui.primaryVeryDarkEdit.setEnabled(False)
2558
+ self.ui.accentBaseEdit.setEnabled(False)
2559
+ self.ui.accentLightEdit.setEnabled(False)
2560
+ self.ui.accentDarkEdit.setEnabled(False)
2561
+ self.ui.accentVeryLightEdit.setEnabled(False)
2562
+ self.ui.accentVeryDarkEdit.setEnabled(False)
2563
+ self.ui.mainTextColorEdit.setEnabled(False)
2564
+ self.ui.selectedTextColorEdit.setEnabled(False)
2565
+ self.ui.errorColorEdit.setEnabled(False)
2566
+ if theme == "MFA":
2567
+ self.set_theme(self.settings.mfa_theme)
2568
+ self.settings.set_mfa_theme()
2569
+ elif theme != "Native":
2570
+ self.ui.primaryBaseEdit.setEnabled(True)
2571
+ self.ui.primaryLightEdit.setEnabled(True)
2572
+ self.ui.primaryDarkEdit.setEnabled(True)
2573
+ self.ui.primaryVeryLightEdit.setEnabled(True)
2574
+ self.ui.primaryVeryDarkEdit.setEnabled(True)
2575
+ self.ui.accentBaseEdit.setEnabled(True)
2576
+ self.ui.accentLightEdit.setEnabled(True)
2577
+ self.ui.accentDarkEdit.setEnabled(True)
2578
+ self.ui.accentVeryLightEdit.setEnabled(True)
2579
+ self.ui.accentVeryDarkEdit.setEnabled(True)
2580
+ self.ui.mainTextColorEdit.setEnabled(True)
2581
+ self.ui.selectedTextColorEdit.setEnabled(True)
2582
+ self.ui.errorColorEdit.setEnabled(True)
2583
+
2584
+ def update_theme(self):
2585
+ preset_theme = self.ui.presetThemeEdit.currentText()
2586
+ self.settings.setValue(self.settings.THEME_PRESET, preset_theme)
2587
+ if preset_theme != "Native":
2588
+ self.settings.set_theme(self.current_theme)
2589
+ else:
2590
+ self.settings.themeUpdated.emit()
2591
+
2592
+ @property
2593
+ def current_theme(self):
2594
+ return {
2595
+ AnchorSettings.MAIN_TEXT_COLOR: self.ui.mainTextColorEdit.color,
2596
+ AnchorSettings.SELECTED_TEXT_COLOR: self.ui.selectedTextColorEdit.color,
2597
+ AnchorSettings.ERROR_COLOR: self.ui.errorColorEdit.color,
2598
+ AnchorSettings.PRIMARY_BASE_COLOR: self.ui.primaryBaseEdit.color,
2599
+ AnchorSettings.PRIMARY_LIGHT_COLOR: self.ui.primaryLightEdit.color,
2600
+ AnchorSettings.PRIMARY_DARK_COLOR: self.ui.primaryDarkEdit.color,
2601
+ AnchorSettings.PRIMARY_VERY_LIGHT_COLOR: self.ui.primaryVeryLightEdit.color,
2602
+ AnchorSettings.PRIMARY_VERY_DARK_COLOR: self.ui.primaryVeryDarkEdit.color,
2603
+ AnchorSettings.ACCENT_BASE_COLOR: self.ui.accentBaseEdit.color,
2604
+ AnchorSettings.ACCENT_LIGHT_COLOR: self.ui.accentLightEdit.color,
2605
+ AnchorSettings.ACCENT_DARK_COLOR: self.ui.accentDarkEdit.color,
2606
+ AnchorSettings.ACCENT_VERY_LIGHT_COLOR: self.ui.accentVeryLightEdit.color,
2607
+ AnchorSettings.ACCENT_VERY_DARK_COLOR: self.ui.accentVeryDarkEdit.color,
2608
+ }
2609
+
2489
2610
  def accept(self) -> None:
2490
2611
  config.NUM_JOBS = self.ui.numJobsEdit.value()
2491
2612
  config.USE_MP = self.ui.useMpCheckBox.isChecked()
@@ -2524,32 +2645,8 @@ class OptionsDialog(QtWidgets.QDialog):
2524
2645
  self.settings.setValue(
2525
2646
  self.settings.PITCH_DELTA_PITCH, float(self.ui.pitchDeltaEdit.text())
2526
2647
  )
2527
-
2528
- self.settings.setValue(self.settings.PRIMARY_BASE_COLOR, self.ui.primaryBaseEdit.color)
2529
- self.settings.setValue(self.settings.PRIMARY_LIGHT_COLOR, self.ui.primaryLightEdit.color)
2530
- self.settings.setValue(self.settings.PRIMARY_DARK_COLOR, self.ui.primaryDarkEdit.color)
2531
- self.settings.setValue(
2532
- self.settings.PRIMARY_VERY_LIGHT_COLOR, self.ui.primaryVeryLightEdit.color
2533
- )
2534
- self.settings.setValue(
2535
- self.settings.PRIMARY_VERY_DARK_COLOR, self.ui.primaryVeryDarkEdit.color
2536
- )
2537
-
2538
- self.settings.setValue(self.settings.ACCENT_BASE_COLOR, self.ui.accentBaseEdit.color)
2539
- self.settings.setValue(self.settings.ACCENT_LIGHT_COLOR, self.ui.accentLightEdit.color)
2540
- self.settings.setValue(self.settings.ACCENT_DARK_COLOR, self.ui.accentDarkEdit.color)
2541
- self.settings.setValue(
2542
- self.settings.ACCENT_VERY_LIGHT_COLOR, self.ui.accentVeryLightEdit.color
2543
- )
2544
- self.settings.setValue(
2545
- self.settings.ACCENT_VERY_DARK_COLOR, self.ui.accentVeryDarkEdit.color
2546
- )
2547
-
2548
- self.settings.setValue(self.settings.MAIN_TEXT_COLOR, self.ui.mainTextColorEdit.color)
2549
- self.settings.setValue(
2550
- self.settings.SELECTED_TEXT_COLOR, self.ui.selectedTextColorEdit.color
2551
- )
2552
- self.settings.setValue(self.settings.ERROR_COLOR, self.ui.errorColorEdit.color)
2648
+ preset_theme = self.ui.presetThemeEdit.currentText()
2649
+ self.settings.setValue(self.settings.THEME_PRESET, preset_theme)
2553
2650
 
2554
2651
  self.settings.setValue(self.settings.FONT, self.ui.fontEdit.font.toString())
2555
2652
 
@@ -2605,11 +2702,26 @@ class OptionsDialog(QtWidgets.QDialog):
2605
2702
  self.settings.setValue(
2606
2703
  self.settings.TIME_DIRECTION, self.ui.timeDirectionComboBox.currentText()
2607
2704
  )
2705
+ self.settings.setValue(
2706
+ self.settings.TIER_MAX_SPEAKERS, int(self.ui.visibleSpeakerComboBox.currentText())
2707
+ )
2608
2708
  self.settings.sync()
2609
- super(OptionsDialog, self).accept()
2709
+ if preset_theme != "Native":
2710
+ self.settings.set_theme(self.current_theme)
2711
+ else:
2712
+ self.settings.themeUpdated.emit()
2713
+ super().accept()
2714
+
2715
+ def reject(self):
2716
+ self.settings.set_theme(self.initial_theme)
2717
+ self.settings.sync()
2718
+ super().reject()
2610
2719
 
2611
2720
 
2612
2721
  class Application(QtWidgets.QApplication):
2722
+ def __init__(self, *args, **kwargs):
2723
+ super().__init__(*args, **kwargs)
2724
+
2613
2725
  def setActiveWindow(self, act):
2614
2726
  super().setActiveWindow(act)
2615
2727
  act.styleSheetChanged.connect(self.setStyleSheet)
anchor/models.py CHANGED
@@ -505,7 +505,13 @@ class FileUtterancesModel(QtCore.QAbstractListModel):
505
505
  normalized_text = ""
506
506
  speaker_id = None
507
507
  channel = None
508
+ prev_index = None
508
509
  for old_utt in sorted(utterances, key=lambda x: x.begin):
510
+ index = self.reversed_indices[old_utt.id]
511
+ if prev_index is not None:
512
+ if index - prev_index != 1:
513
+ return
514
+ prev_index = index
509
515
  if speaker_id is None:
510
516
  speaker_id = old_utt.speaker_id
511
517
  if channel is None:
@@ -567,7 +573,7 @@ class FileSelectionModel(QtCore.QItemSelectionModel):
567
573
  channelChanged = QtCore.Signal()
568
574
  resetView = QtCore.Signal()
569
575
  viewChanged = QtCore.Signal(object, object)
570
- selectionAudioChanged = QtCore.Signal()
576
+ selectionAudioChanged = QtCore.Signal(object)
571
577
  currentUtteranceChanged = QtCore.Signal()
572
578
  speakerRequested = QtCore.Signal(object)
573
579
 
@@ -606,6 +612,9 @@ class FileSelectionModel(QtCore.QItemSelectionModel):
606
612
  self.model().utterancesReady.connect(self.finalize_set_new_file)
607
613
  self.viewChanged.connect(self.load_audio_selection)
608
614
  self.model().selectionRequested.connect(self.update_selected_utterances)
615
+ self.view_change_timer = QtCore.QTimer()
616
+ self.view_change_timer.setInterval(50)
617
+ self.view_change_timer.timeout.connect(self.send_selection_update)
609
618
 
610
619
  def selected_utterances(self):
611
620
  utts = []
@@ -728,22 +737,21 @@ class FileSelectionModel(QtCore.QItemSelectionModel):
728
737
  self.waveformReady.emit()
729
738
 
730
739
  def select_audio(self, begin, end):
731
- if end is not None and end - begin < 0.025:
740
+ if end is not None and end - begin < 0.05:
732
741
  end = None
733
742
  self.selected_min_time = begin
734
743
  self.selected_max_time = end
735
744
  if self.selected_min_time != self.min_time:
736
- self.selectionAudioChanged.emit()
745
+ self.selectionAudioChanged.emit(False)
737
746
 
738
- def request_start_time(self, start_time):
747
+ def request_start_time(self, start_time, update=False):
739
748
  if start_time >= self.max_time:
740
749
  return
741
750
  if start_time < self.min_time:
742
751
  return
743
752
  self.selected_min_time = start_time
744
753
  self.selected_max_time = None
745
- if self.selected_min_time != self.min_time:
746
- self.selectionAudioChanged.emit()
754
+ self.selectionAudioChanged.emit(update)
747
755
 
748
756
  def set_current_channel(self, channel):
749
757
  if channel == self.selected_channel:
@@ -813,7 +821,21 @@ class FileSelectionModel(QtCore.QItemSelectionModel):
813
821
 
814
822
  def zoom_to_selection(self):
815
823
  if self.selected_min_time is not None and self.selected_max_time is not None:
816
- self.set_view_times(self.selected_min_time, self.selected_max_time)
824
+ begin = self.selected_min_time
825
+ end = self.selected_max_time
826
+ elif len(self.selectedRows(0)) > 0:
827
+ m = self.model()
828
+ begin = 100000
829
+ end = 0
830
+ for index in self.selectedRows(0):
831
+ u = m.utterances[index.row()]
832
+ if u.begin < begin:
833
+ begin = u.begin
834
+ if u.end > end:
835
+ end = u.end
836
+ else:
837
+ return
838
+ self.set_view_times(begin, end)
817
839
 
818
840
  def update_from_slider(self, value):
819
841
  if not self.max_time:
@@ -821,16 +843,6 @@ class FileSelectionModel(QtCore.QItemSelectionModel):
821
843
  cur_window = self.max_time - self.min_time
822
844
  self.set_view_times(value, value + cur_window)
823
845
 
824
- def update_selection_audio(self, begin, end):
825
- if begin < self.min_time:
826
- begin = self.min_time
827
- if end > self.max_time:
828
- end = self.max_time
829
- self.selected_min_time = begin
830
- self.selected_max_time = end
831
- if self.selected_min_time != self.min_time:
832
- self.selectionAudioChanged.emit()
833
-
834
846
  def visible_utterances(self) -> typing.List[Utterance]:
835
847
  file_utts = []
836
848
  if not self.model().file:
@@ -866,6 +878,10 @@ class FileSelectionModel(QtCore.QItemSelectionModel):
866
878
  and not self.min_time <= self.selected_max_time <= self.max_time
867
879
  ):
868
880
  self.selected_max_time = None
881
+ self.view_change_timer.start()
882
+
883
+ def send_selection_update(self):
884
+ self.view_change_timer.stop()
869
885
  self.viewChanged.emit(self.min_time, self.max_time)
870
886
 
871
887
  def set_current_file(self, file_id, begin, end, utterance_id, speaker_id, force_update=False):
@@ -971,7 +987,7 @@ class CorpusSelectionModel(QtCore.QItemSelectionModel):
971
987
  self.currentRowChanged.connect(self.switch_utterance)
972
988
  # self.selectionChanged.connect(self.update_selection_audio)
973
989
  # self.selectionChanged.connect(self.update_selection_audio)
974
- self.model().newResults.connect(self.check_selection)
990
+ # self.model().newResults.connect(self.check_selection)
975
991
  self.model().unlockCorpus.connect(self.fileChanged.emit)
976
992
 
977
993
  def set_current_utterance(self, utterance_id):