Anchor-annotator 0.4.0__py3-none-any.whl → 0.5.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.5.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=aeBju2l8GTMwAhIRG_c2Q_oVPFacRkZZwGtxmvFCGPQ,411
4
+ anchor/command_line.py,sha256=EucG805HyWk_zkMO9RXv9Yj0I0JVdDLZb1_DX2_ISjM,503
5
+ anchor/db.py,sha256=ef4lO6HtCKoxC9CorIc0ZbPxKpjHa576a0ZIBOWNU9E,4956
6
+ anchor/main.py,sha256=ZJKMVgh1yFnuqcoCSSDXFWqmw5hxLcoQbA0JaNSK61Y,126473
7
+ anchor/models.py,sha256=tYtj_doI9LokNOo624b1OmVLTFpIdKBVPfAzCO90ou4,96315
8
+ anchor/plot.py,sha256=yNveJ6O52621xC5ggUhFeeSxFp-HWD8D3XVnBWc6vtE,112516
9
+ anchor/resources_rc.py,sha256=ad0TsmUT4851Rh4oWpwefIJ9Ijqhg3gwX8cnaRX_90w,8460639
10
+ anchor/settings.py,sha256=jyqvKYo2ZMeZkU7D6qmLxkF8xvnJsYh7eyk5_kQMKxY,51884
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=iadb6GgR2Q-1eTdle_IPaMyEnkOBXMqBvjC1U6pWtJo,156787
17
+ anchor/workers.py,sha256=rjUWKyRJ-NiZpGvgYgoNi5M9ESoMFXpd7zgnx-f0WBY,172378
18
+ Anchor_annotator-0.5.0.dist-info/LICENSE,sha256=C0oIsblENEgWQ7XMNdYoXyXsIA5wa3YF0I9lK3H7A1s,1076
19
+ Anchor_annotator-0.5.0.dist-info/METADATA,sha256=2ochFmVpqLnnTKHb15k3R4BRxNH2wrrwdZDO0NJFjUg,1500
20
+ Anchor_annotator-0.5.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
21
+ Anchor_annotator-0.5.0.dist-info/top_level.txt,sha256=wX6ZKxImGRZKFQjs3f6XYw_TfbAp6Xs3SmbLfLbFAJ0,7
22
+ Anchor_annotator-0.5.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.5.0'
16
+ __version_tuple__ = version_tuple = (0, 5, 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
  )
@@ -827,9 +830,6 @@ class MainWindow(QtWidgets.QMainWindow):
827
830
  self.ui.lockEditAct.toggled.connect(self.toggle_lock)
828
831
  self.ui.exportFilesAct.setEnabled(True)
829
832
  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
833
  self.ui.muteAct.triggered.connect(self.update_mute_status)
834
834
  self.volume_slider = QtWidgets.QSlider(QtCore.Qt.Orientation.Horizontal, self)
835
835
  self.volume_slider.setMaximum(100)
@@ -868,9 +868,9 @@ class MainWindow(QtWidgets.QMainWindow):
868
868
  self.ui.selectMappingFileAct.triggered.connect(self.change_custom_mapping)
869
869
 
870
870
  self.undo_act = self.undo_group.createUndoAction(self, "Undo")
871
- self.undo_act.setIcon(QtGui.QIcon(":undo.svg"))
871
+ self.undo_act.setIcon(QtGui.QIcon.fromTheme("edit-undo"))
872
872
  self.redo_act = self.undo_group.createRedoAction(self, "Redo")
873
- self.redo_act.setIcon(QtGui.QIcon(":redo.svg"))
873
+ self.redo_act.setIcon(QtGui.QIcon.fromTheme("edit-redo"))
874
874
  self.ui.menuEdit.addAction(self.undo_act)
875
875
  self.ui.menuEdit.addAction(self.redo_act)
876
876
  self.undo_group.setActiveStack(self.corpus_undo_stack)
@@ -1851,6 +1851,54 @@ class MainWindow(QtWidgets.QMainWindow):
1851
1851
 
1852
1852
  def refresh_style_sheets(self):
1853
1853
  self.setStyleSheet(self.settings.style_sheet)
1854
+ self.styleSheetChanged.emit(self.settings.style_sheet)
1855
+ self.ui.utteranceDetailWidget.plot_widget.refresh_theme()
1856
+ QtGui.QIcon.setThemeName("anchor_light")
1857
+ if self.settings.theme_preset == "Native":
1858
+ dark_mode = (
1859
+ QtGui.QGuiApplication.styleHints().colorScheme() == QtCore.Qt.ColorScheme.Dark
1860
+ )
1861
+ if dark_mode:
1862
+ QtGui.QIcon.setThemeName("anchor_dark")
1863
+ if False:
1864
+ self.ui.playAct.setIcon(
1865
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.MediaPlaybackStart)
1866
+ )
1867
+ self.ui.muteAct.setIcon(
1868
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.AudioVolumeMuted)
1869
+ )
1870
+ self.ui.zoomInAct.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ZoomIn))
1871
+ self.ui.zoomOutAct.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ZoomOut))
1872
+ self.ui.zoomToSelectionAct.setIcon(
1873
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ZoomFitBest)
1874
+ )
1875
+ self.ui.mergeUtterancesAct.setIcon(
1876
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.InputGaming)
1877
+ )
1878
+ self.ui.splitUtterancesAct.setIcon(
1879
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ViewFullscreen)
1880
+ )
1881
+ self.ui.deleteUtterancesAct.setIcon(
1882
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.EditDelete)
1883
+ )
1884
+ self.ui.exportFilesAct.setIcon(
1885
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.DocumentSave)
1886
+ )
1887
+ self.ui.lockEditAct.setIcon(
1888
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.SystemLockScreen)
1889
+ )
1890
+ self.ui.getHelpAct.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.HelpAbout))
1891
+ self.ui.reportBugAct.setIcon(
1892
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.MailForward)
1893
+ )
1894
+ self.ui.alignUtteranceAct.setIcon(
1895
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.FormatTextUnderline)
1896
+ )
1897
+ self.ui.cancelCorpusLoadAct.setIcon(
1898
+ QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.ProcessStop)
1899
+ )
1900
+ self.undo_act.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.EditUndo))
1901
+ self.redo_act.setIcon(QtGui.QIcon.fromTheme(QtGui.QIcon.ThemeIcon.EditRedo))
1854
1902
 
1855
1903
  def refresh_corpus_history(self):
1856
1904
  self.ui.loadRecentCorpusMenu.clear()
@@ -1869,8 +1917,7 @@ class MainWindow(QtWidgets.QMainWindow):
1869
1917
  self.ui.loadRecentCorpusMenu.addAction(a)
1870
1918
 
1871
1919
  def refresh_settings(self):
1872
- self.setStyleSheet(self.settings.style_sheet)
1873
- self.styleSheetChanged.emit(self.settings.style_sheet)
1920
+ self.refresh_style_sheets()
1874
1921
  self.refresh_shortcuts()
1875
1922
  self.corpus_model.set_limit(self.settings.value(self.settings.RESULTS_PER_PAGE))
1876
1923
  self.dictionary_model.set_limit(self.settings.value(self.settings.RESULTS_PER_PAGE))
@@ -1880,6 +1927,7 @@ class MainWindow(QtWidgets.QMainWindow):
1880
1927
  self.ui.dictionaryWidget.refresh_settings()
1881
1928
  self.ui.speakerWidget.refresh_settings()
1882
1929
  self.media_player.refresh_settings()
1930
+ self.ui.utteranceDetailWidget.plot_widget.refresh()
1883
1931
 
1884
1932
  def download_language_model(self):
1885
1933
  self.download_worker.set_params(
@@ -2285,6 +2333,10 @@ class DetailedMessageBox(QtWidgets.QDialog): # pragma: no cover
2285
2333
  self.ui = Ui_ErrorDialog()
2286
2334
  self.ui.setupUi(self)
2287
2335
  self.settings = AnchorSettings()
2336
+ icon = QtGui.QIcon.fromTheme("emblem-important")
2337
+ size = self.ui.iconLabel.size()
2338
+ self.ui.iconLabel.setPixmap(icon.pixmap(size))
2339
+ self.setWindowIcon(icon)
2288
2340
  self.ui.detailed_message.setText(detailed_message)
2289
2341
  self.ui.buttonBox.report_bug_button.clicked.connect(self.reportBug.emit)
2290
2342
  self.ui.buttonBox.rejected.connect(self.reject)
@@ -2300,6 +2352,14 @@ class ManagerDialog(QtWidgets.QDialog):
2300
2352
  self.ui.setupUi(self)
2301
2353
  self.ui.tabWidget.setCurrentIndex(0)
2302
2354
  self.settings = AnchorSettings()
2355
+ QtGui.QIcon.setThemeName("anchor_light")
2356
+ if self.settings.theme_preset == "Native":
2357
+ dark_mode = (
2358
+ QtGui.QGuiApplication.styleHints().colorScheme() == QtCore.Qt.ColorScheme.Dark
2359
+ )
2360
+ if dark_mode:
2361
+ QtGui.QIcon.setThemeName("anchor_dark")
2362
+
2303
2363
  self.model_manager = model_manager
2304
2364
 
2305
2365
  self.db_engine = db_engine
@@ -2381,33 +2441,10 @@ class OptionsDialog(QtWidgets.QDialog):
2381
2441
  self.ui.setupUi(self)
2382
2442
  self.settings = AnchorSettings()
2383
2443
 
2384
- self.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
2385
-
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
- )
2444
+ self.initial_theme = self.settings.current_theme
2405
2445
 
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))
2446
+ self.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
2447
+ self.ui.errorColorEdit.colorChanged.connect(self.update_theme)
2411
2448
 
2412
2449
  self.ui.fontEdit.set_font(self.settings.font)
2413
2450
 
@@ -2456,6 +2493,11 @@ class OptionsDialog(QtWidgets.QDialog):
2456
2493
  self.settings.value(self.settings.TIME_DIRECTION)
2457
2494
  )
2458
2495
  )
2496
+ self.ui.visibleSpeakerComboBox.setCurrentIndex(
2497
+ self.ui.visibleSpeakerComboBox.findText(
2498
+ str(self.settings.value(self.settings.TIER_MAX_SPEAKERS))
2499
+ )
2500
+ )
2459
2501
 
2460
2502
  self.ui.dynamicRangeEdit.setValue(self.settings.value(self.settings.SPEC_DYNAMIC_RANGE))
2461
2503
  self.ui.specMaxTimeEdit.setText(str(self.settings.value(self.settings.SPEC_MAX_TIME)))
@@ -2472,6 +2514,11 @@ class OptionsDialog(QtWidgets.QDialog):
2472
2514
  self.ui.frameLengthEdit.setValue(self.settings.value(self.settings.PITCH_FRAME_LENGTH))
2473
2515
  self.ui.penaltyEdit.setText(str(self.settings.value(self.settings.PITCH_PENALTY_FACTOR)))
2474
2516
  self.ui.pitchDeltaEdit.setText(str(self.settings.value(self.settings.PITCH_DELTA_PITCH)))
2517
+ self.ui.presetThemeEdit.setCurrentIndex(
2518
+ self.ui.presetThemeEdit.findText(str(self.settings.value(self.settings.THEME_PRESET)))
2519
+ )
2520
+ self.ui.presetThemeEdit.currentIndexChanged.connect(self.update_preset_theme)
2521
+ self.ui.presetThemeEdit.currentIndexChanged.connect(self.update_theme)
2475
2522
 
2476
2523
  self.ui.audioDeviceEdit.clear()
2477
2524
  for o in QtMultimedia.QMediaDevices.audioOutputs():
@@ -2486,6 +2533,82 @@ class OptionsDialog(QtWidgets.QDialog):
2486
2533
  # self.setFont(self.settings.font)
2487
2534
  # self.setStyleSheet(self.settings.style_sheet)
2488
2535
 
2536
+ def set_theme(self, theme):
2537
+ self.ui.primaryBaseEdit.set_color(theme[self.settings.PRIMARY_BASE_COLOR])
2538
+ self.ui.primaryLightEdit.set_color(theme[self.settings.PRIMARY_LIGHT_COLOR])
2539
+ self.ui.primaryDarkEdit.set_color(theme[self.settings.PRIMARY_DARK_COLOR])
2540
+ self.ui.primaryVeryLightEdit.set_color(theme[self.settings.PRIMARY_VERY_LIGHT_COLOR])
2541
+ self.ui.primaryVeryDarkEdit.set_color(theme[self.settings.PRIMARY_VERY_DARK_COLOR])
2542
+
2543
+ self.ui.accentBaseEdit.set_color(theme[self.settings.ACCENT_BASE_COLOR])
2544
+ self.ui.accentLightEdit.set_color(theme[self.settings.ACCENT_LIGHT_COLOR])
2545
+ self.ui.accentDarkEdit.set_color(theme[self.settings.ACCENT_DARK_COLOR])
2546
+ self.ui.accentVeryLightEdit.set_color(theme[self.settings.ACCENT_VERY_LIGHT_COLOR])
2547
+ self.ui.accentVeryDarkEdit.set_color(theme[self.settings.ACCENT_VERY_DARK_COLOR])
2548
+
2549
+ self.ui.mainTextColorEdit.set_color(theme[self.settings.MAIN_TEXT_COLOR])
2550
+ self.ui.selectedTextColorEdit.set_color(theme[self.settings.SELECTED_TEXT_COLOR])
2551
+ self.ui.errorColorEdit.set_color(theme[self.settings.ERROR_COLOR])
2552
+
2553
+ def update_preset_theme(self):
2554
+ theme = self.ui.presetThemeEdit.currentText()
2555
+ self.ui.primaryBaseEdit.setEnabled(False)
2556
+ self.ui.primaryLightEdit.setEnabled(False)
2557
+ self.ui.primaryDarkEdit.setEnabled(False)
2558
+ self.ui.primaryVeryLightEdit.setEnabled(False)
2559
+ self.ui.primaryVeryDarkEdit.setEnabled(False)
2560
+ self.ui.accentBaseEdit.setEnabled(False)
2561
+ self.ui.accentLightEdit.setEnabled(False)
2562
+ self.ui.accentDarkEdit.setEnabled(False)
2563
+ self.ui.accentVeryLightEdit.setEnabled(False)
2564
+ self.ui.accentVeryDarkEdit.setEnabled(False)
2565
+ self.ui.mainTextColorEdit.setEnabled(False)
2566
+ self.ui.selectedTextColorEdit.setEnabled(False)
2567
+ self.ui.errorColorEdit.setEnabled(False)
2568
+ if theme == "MFA":
2569
+ self.set_theme(self.settings.mfa_theme)
2570
+ self.settings.set_mfa_theme()
2571
+ elif theme != "Native":
2572
+ self.ui.primaryBaseEdit.setEnabled(True)
2573
+ self.ui.primaryLightEdit.setEnabled(True)
2574
+ self.ui.primaryDarkEdit.setEnabled(True)
2575
+ self.ui.primaryVeryLightEdit.setEnabled(True)
2576
+ self.ui.primaryVeryDarkEdit.setEnabled(True)
2577
+ self.ui.accentBaseEdit.setEnabled(True)
2578
+ self.ui.accentLightEdit.setEnabled(True)
2579
+ self.ui.accentDarkEdit.setEnabled(True)
2580
+ self.ui.accentVeryLightEdit.setEnabled(True)
2581
+ self.ui.accentVeryDarkEdit.setEnabled(True)
2582
+ self.ui.mainTextColorEdit.setEnabled(True)
2583
+ self.ui.selectedTextColorEdit.setEnabled(True)
2584
+ self.ui.errorColorEdit.setEnabled(True)
2585
+
2586
+ def update_theme(self):
2587
+ preset_theme = self.ui.presetThemeEdit.currentText()
2588
+ self.settings.setValue(self.settings.THEME_PRESET, preset_theme)
2589
+ if preset_theme != "Native":
2590
+ self.settings.set_theme(self.current_theme)
2591
+ else:
2592
+ self.settings.themeUpdated.emit()
2593
+
2594
+ @property
2595
+ def current_theme(self):
2596
+ return {
2597
+ AnchorSettings.MAIN_TEXT_COLOR: self.ui.mainTextColorEdit.color,
2598
+ AnchorSettings.SELECTED_TEXT_COLOR: self.ui.selectedTextColorEdit.color,
2599
+ AnchorSettings.ERROR_COLOR: self.ui.errorColorEdit.color,
2600
+ AnchorSettings.PRIMARY_BASE_COLOR: self.ui.primaryBaseEdit.color,
2601
+ AnchorSettings.PRIMARY_LIGHT_COLOR: self.ui.primaryLightEdit.color,
2602
+ AnchorSettings.PRIMARY_DARK_COLOR: self.ui.primaryDarkEdit.color,
2603
+ AnchorSettings.PRIMARY_VERY_LIGHT_COLOR: self.ui.primaryVeryLightEdit.color,
2604
+ AnchorSettings.PRIMARY_VERY_DARK_COLOR: self.ui.primaryVeryDarkEdit.color,
2605
+ AnchorSettings.ACCENT_BASE_COLOR: self.ui.accentBaseEdit.color,
2606
+ AnchorSettings.ACCENT_LIGHT_COLOR: self.ui.accentLightEdit.color,
2607
+ AnchorSettings.ACCENT_DARK_COLOR: self.ui.accentDarkEdit.color,
2608
+ AnchorSettings.ACCENT_VERY_LIGHT_COLOR: self.ui.accentVeryLightEdit.color,
2609
+ AnchorSettings.ACCENT_VERY_DARK_COLOR: self.ui.accentVeryDarkEdit.color,
2610
+ }
2611
+
2489
2612
  def accept(self) -> None:
2490
2613
  config.NUM_JOBS = self.ui.numJobsEdit.value()
2491
2614
  config.USE_MP = self.ui.useMpCheckBox.isChecked()
@@ -2524,32 +2647,8 @@ class OptionsDialog(QtWidgets.QDialog):
2524
2647
  self.settings.setValue(
2525
2648
  self.settings.PITCH_DELTA_PITCH, float(self.ui.pitchDeltaEdit.text())
2526
2649
  )
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)
2650
+ preset_theme = self.ui.presetThemeEdit.currentText()
2651
+ self.settings.setValue(self.settings.THEME_PRESET, preset_theme)
2553
2652
 
2554
2653
  self.settings.setValue(self.settings.FONT, self.ui.fontEdit.font.toString())
2555
2654
 
@@ -2605,11 +2704,26 @@ class OptionsDialog(QtWidgets.QDialog):
2605
2704
  self.settings.setValue(
2606
2705
  self.settings.TIME_DIRECTION, self.ui.timeDirectionComboBox.currentText()
2607
2706
  )
2707
+ self.settings.setValue(
2708
+ self.settings.TIER_MAX_SPEAKERS, int(self.ui.visibleSpeakerComboBox.currentText())
2709
+ )
2608
2710
  self.settings.sync()
2609
- super(OptionsDialog, self).accept()
2711
+ if preset_theme != "Native":
2712
+ self.settings.set_theme(self.current_theme)
2713
+ else:
2714
+ self.settings.themeUpdated.emit()
2715
+ super().accept()
2716
+
2717
+ def reject(self):
2718
+ self.settings.set_theme(self.initial_theme)
2719
+ self.settings.sync()
2720
+ super().reject()
2610
2721
 
2611
2722
 
2612
2723
  class Application(QtWidgets.QApplication):
2724
+ def __init__(self, *args, **kwargs):
2725
+ super().__init__(*args, **kwargs)
2726
+
2613
2727
  def setActiveWindow(self, act):
2614
2728
  super().setActiveWindow(act)
2615
2729
  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):