audio-tuner-gui 0.10.0__py3-none-any.whl → 0.11.1__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.
Files changed (35) hide show
  1. audio_tuner_gui/__init__.py +1 -1
  2. audio_tuner_gui/analysis.py +107 -81
  3. audio_tuner_gui/common.py +77 -25
  4. audio_tuner_gui/file_selector.py +71 -21
  5. audio_tuner_gui/icons/fallback/README +4 -0
  6. audio_tuner_gui/icons/fallback/application-exit.svg +457 -0
  7. audio_tuner_gui/icons/fallback/audio-card.svg +434 -0
  8. audio_tuner_gui/icons/fallback/audio-x-generic.svg +180 -0
  9. audio_tuner_gui/icons/fallback/dialog-warning.svg +373 -0
  10. audio_tuner_gui/icons/fallback/document-save.svg +619 -0
  11. audio_tuner_gui/icons/fallback/edit-delete.svg +896 -0
  12. audio_tuner_gui/icons/fallback/folder.svg +424 -0
  13. audio_tuner_gui/icons/fallback/format-justify-left.svg +271 -0
  14. audio_tuner_gui/icons/fallback/go-home.svg +445 -0
  15. audio_tuner_gui/icons/fallback/go-next.svg +192 -0
  16. audio_tuner_gui/icons/fallback/go-previous.svg +854 -0
  17. audio_tuner_gui/icons/fallback/go-up.svg +196 -0
  18. audio_tuner_gui/icons/fallback/media-playback-pause.svg +641 -0
  19. audio_tuner_gui/icons/fallback/media-playback-start.svg +319 -0
  20. audio_tuner_gui/icons/fallback/media-playback-stop.svg +651 -0
  21. audio_tuner_gui/icons/fallback/media-seek-backward.svg +374 -0
  22. audio_tuner_gui/icons/fallback/media-seek-forward.svg +383 -0
  23. audio_tuner_gui/icons/fallback/preferences-system.svg +398 -0
  24. audio_tuner_gui/icons/fallback/process-stop.svg +336 -0
  25. audio_tuner_gui/option_panel.py +49 -21
  26. audio_tuner_gui/scripts/tuner_gui.py +137 -21
  27. {audio_tuner_gui-0.10.0.dist-info → audio_tuner_gui-0.11.1.dist-info}/METADATA +4 -3
  28. audio_tuner_gui-0.11.1.dist-info/RECORD +45 -0
  29. audio_tuner_gui/icons/folder.png +0 -0
  30. audio_tuner_gui/icons/preferences-other.png +0 -0
  31. audio_tuner_gui/icons/process-stop.png +0 -0
  32. audio_tuner_gui-0.10.0.dist-info/RECORD +0 -28
  33. {audio_tuner_gui-0.10.0.dist-info → audio_tuner_gui-0.11.1.dist-info}/WHEEL +0 -0
  34. {audio_tuner_gui-0.10.0.dist-info → audio_tuner_gui-0.11.1.dist-info}/entry_points.txt +0 -0
  35. {audio_tuner_gui-0.10.0.dist-info → audio_tuner_gui-0.11.1.dist-info}/licenses/COPYING +0 -0
@@ -0,0 +1,336 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+ <svg
4
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
5
+ xmlns:cc="http://creativecommons.org/ns#"
6
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7
+ xmlns:svg="http://www.w3.org/2000/svg"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ xmlns:xlink="http://www.w3.org/1999/xlink"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ width="48.000000px"
13
+ height="48.000000px"
14
+ id="svg6361"
15
+ sodipodi:version="0.32"
16
+ inkscape:version="0.46"
17
+ sodipodi:docbase="/home/jimmac/gfx/ximian/tango-icon-theme/scalable/actions"
18
+ sodipodi:docname="process-stop.svg"
19
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
20
+ <defs
21
+ id="defs3">
22
+ <inkscape:perspective
23
+ sodipodi:type="inkscape:persp3d"
24
+ inkscape:vp_x="0 : 24 : 1"
25
+ inkscape:vp_y="0 : 1000 : 0"
26
+ inkscape:vp_z="48 : 24 : 1"
27
+ inkscape:persp3d-origin="24 : 16 : 1"
28
+ id="perspective52" />
29
+ <linearGradient
30
+ id="linearGradient2256">
31
+ <stop
32
+ style="stop-color:#ff0202;stop-opacity:1;"
33
+ offset="0"
34
+ id="stop2258" />
35
+ <stop
36
+ style="stop-color:#ff9b9b;stop-opacity:1;"
37
+ offset="1"
38
+ id="stop2260" />
39
+ </linearGradient>
40
+ <linearGradient
41
+ inkscape:collect="always"
42
+ id="linearGradient2248">
43
+ <stop
44
+ style="stop-color:#ffffff;stop-opacity:1;"
45
+ offset="0"
46
+ id="stop2250" />
47
+ <stop
48
+ style="stop-color:#ffffff;stop-opacity:0;"
49
+ offset="1"
50
+ id="stop2252" />
51
+ </linearGradient>
52
+ <linearGradient
53
+ id="linearGradient9647">
54
+ <stop
55
+ style="stop-color:#ffffff;stop-opacity:1;"
56
+ offset="0"
57
+ id="stop9649" />
58
+ <stop
59
+ style="stop-color:#dbdbdb;stop-opacity:1;"
60
+ offset="1"
61
+ id="stop9651" />
62
+ </linearGradient>
63
+ <linearGradient
64
+ inkscape:collect="always"
65
+ id="linearGradient21644">
66
+ <stop
67
+ style="stop-color:#000000;stop-opacity:1;"
68
+ offset="0"
69
+ id="stop21646" />
70
+ <stop
71
+ style="stop-color:#000000;stop-opacity:0;"
72
+ offset="1"
73
+ id="stop21648" />
74
+ </linearGradient>
75
+ <radialGradient
76
+ inkscape:collect="always"
77
+ xlink:href="#linearGradient21644"
78
+ id="radialGradient21650"
79
+ cx="25.125"
80
+ cy="36.75"
81
+ fx="25.125"
82
+ fy="36.75"
83
+ r="15.75"
84
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.595238,-2.300678e-15,14.87500)"
85
+ gradientUnits="userSpaceOnUse" />
86
+ <linearGradient
87
+ inkscape:collect="always"
88
+ id="linearGradient7895">
89
+ <stop
90
+ style="stop-color:#ffffff;stop-opacity:1;"
91
+ offset="0"
92
+ id="stop7897" />
93
+ <stop
94
+ style="stop-color:#ffffff;stop-opacity:0;"
95
+ offset="1"
96
+ id="stop7899" />
97
+ </linearGradient>
98
+ <linearGradient
99
+ id="linearGradient4981">
100
+ <stop
101
+ style="stop-color:#cc0000;stop-opacity:1;"
102
+ offset="0"
103
+ id="stop4983" />
104
+ <stop
105
+ style="stop-color:#b30000;stop-opacity:1.0000000;"
106
+ offset="1.0000000"
107
+ id="stop4985" />
108
+ </linearGradient>
109
+ <linearGradient
110
+ id="linearGradient15762"
111
+ inkscape:collect="always">
112
+ <stop
113
+ id="stop15764"
114
+ offset="0"
115
+ style="stop-color:#ffffff;stop-opacity:1;" />
116
+ <stop
117
+ id="stop15766"
118
+ offset="1"
119
+ style="stop-color:#ffffff;stop-opacity:0;" />
120
+ </linearGradient>
121
+ <linearGradient
122
+ id="linearGradient14236">
123
+ <stop
124
+ id="stop14238"
125
+ offset="0.0000000"
126
+ style="stop-color:#ed4040;stop-opacity:1.0000000;" />
127
+ <stop
128
+ id="stop14240"
129
+ offset="1.0000000"
130
+ style="stop-color:#a40000;stop-opacity:1.0000000;" />
131
+ </linearGradient>
132
+ <linearGradient
133
+ id="linearGradient11780">
134
+ <stop
135
+ style="stop-color:#ff8b8b;stop-opacity:1.0000000;"
136
+ offset="0.0000000"
137
+ id="stop11782" />
138
+ <stop
139
+ style="stop-color:#ec1b1b;stop-opacity:1.0000000;"
140
+ offset="1.0000000"
141
+ id="stop11784" />
142
+ </linearGradient>
143
+ <linearGradient
144
+ id="linearGradient11014">
145
+ <stop
146
+ style="stop-color:#a80000;stop-opacity:1.0000000;"
147
+ offset="0.0000000"
148
+ id="stop11016" />
149
+ <stop
150
+ style="stop-color:#c60000;stop-opacity:1.0000000;"
151
+ offset="0.0000000"
152
+ id="stop13245" />
153
+ <stop
154
+ style="stop-color:#e50000;stop-opacity:1.0000000;"
155
+ offset="1.0000000"
156
+ id="stop11018" />
157
+ </linearGradient>
158
+ <linearGradient
159
+ y2="9.6507530"
160
+ x2="9.8940229"
161
+ y1="5.3855424"
162
+ x1="5.7365270"
163
+ gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,31.72170,31.29079)"
164
+ gradientUnits="userSpaceOnUse"
165
+ id="linearGradient15772"
166
+ xlink:href="#linearGradient15762"
167
+ inkscape:collect="always" />
168
+ <linearGradient
169
+ inkscape:collect="always"
170
+ xlink:href="#linearGradient11780"
171
+ id="linearGradient2057"
172
+ x1="15.737001"
173
+ y1="12.503600"
174
+ x2="53.570126"
175
+ y2="47.374317"
176
+ gradientUnits="userSpaceOnUse"
177
+ gradientTransform="translate(0.000000,-2.000000)" />
178
+ <linearGradient
179
+ inkscape:collect="always"
180
+ xlink:href="#linearGradient4981"
181
+ id="linearGradient4987"
182
+ x1="23.995985"
183
+ y1="20.105337"
184
+ x2="41.047836"
185
+ y2="37.959785"
186
+ gradientUnits="userSpaceOnUse"
187
+ gradientTransform="translate(0.000000,-2.000000)" />
188
+ <linearGradient
189
+ inkscape:collect="always"
190
+ xlink:href="#linearGradient7895"
191
+ id="linearGradient7901"
192
+ x1="15.578875"
193
+ y1="16.285088"
194
+ x2="32.166405"
195
+ y2="28.394291"
196
+ gradientUnits="userSpaceOnUse" />
197
+ <radialGradient
198
+ inkscape:collect="always"
199
+ xlink:href="#linearGradient9647"
200
+ id="radialGradient2239"
201
+ cx="24.30225"
202
+ cy="33.30225"
203
+ fx="24.30225"
204
+ fy="33.30225"
205
+ r="12.30225"
206
+ gradientUnits="userSpaceOnUse"
207
+ gradientTransform="matrix(1.693981,-5.775714e-16,5.775714e-16,1.693981,-16.86529,-25.11111)" />
208
+ <linearGradient
209
+ inkscape:collect="always"
210
+ xlink:href="#linearGradient4981"
211
+ id="linearGradient2243"
212
+ gradientUnits="userSpaceOnUse"
213
+ x1="23.995985"
214
+ y1="20.105337"
215
+ x2="41.047836"
216
+ y2="37.959785"
217
+ gradientTransform="matrix(0.988373,0.000000,0.000000,0.988373,0.279002,0.278984)" />
218
+ <radialGradient
219
+ inkscape:collect="always"
220
+ xlink:href="#linearGradient2248"
221
+ id="radialGradient2254"
222
+ cx="16.75"
223
+ cy="10.666344"
224
+ fx="16.75"
225
+ fy="10.666344"
226
+ r="21.25"
227
+ gradientTransform="matrix(4.154957,-2.979206e-24,3.255657e-24,3.198723,-52.84553,-23.50921)"
228
+ gradientUnits="userSpaceOnUse" />
229
+ <linearGradient
230
+ inkscape:collect="always"
231
+ xlink:href="#linearGradient2256"
232
+ id="linearGradient2262"
233
+ x1="21.75"
234
+ y1="15.80225"
235
+ x2="24.30225"
236
+ y2="35.05225"
237
+ gradientUnits="userSpaceOnUse"
238
+ gradientTransform="translate(0.000000,-2.000000)" />
239
+ </defs>
240
+ <sodipodi:namedview
241
+ inkscape:guide-bbox="true"
242
+ showguides="true"
243
+ id="base"
244
+ pagecolor="#ffffff"
245
+ bordercolor="#666666"
246
+ borderopacity="0.15294118"
247
+ inkscape:pageopacity="0.0"
248
+ inkscape:pageshadow="2"
249
+ inkscape:zoom="4"
250
+ inkscape:cx="0.007276"
251
+ inkscape:cy="7.0544576"
252
+ inkscape:current-layer="layer1"
253
+ showgrid="false"
254
+ inkscape:grid-bbox="true"
255
+ inkscape:document-units="px"
256
+ inkscape:window-width="786"
257
+ inkscape:window-height="688"
258
+ inkscape:window-x="488"
259
+ inkscape:window-y="160"
260
+ inkscape:showpageshadow="false" />
261
+ <metadata
262
+ id="metadata4">
263
+ <rdf:RDF>
264
+ <cc:Work
265
+ rdf:about="">
266
+ <dc:format>image/svg+xml</dc:format>
267
+ <dc:type
268
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
269
+ <dc:title>Stop</dc:title>
270
+ <dc:date>2005-10-16</dc:date>
271
+ <dc:creator>
272
+ <cc:Agent>
273
+ <dc:title>Andreas Nilsson</dc:title>
274
+ </cc:Agent>
275
+ </dc:creator>
276
+ <dc:subject>
277
+ <rdf:Bag>
278
+ <rdf:li>stop</rdf:li>
279
+ <rdf:li>halt</rdf:li>
280
+ <rdf:li>error</rdf:li>
281
+ </rdf:Bag>
282
+ </dc:subject>
283
+ <cc:license
284
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
285
+ <dc:contributor>
286
+ <cc:Agent>
287
+ <dc:title>Jakub Steiner</dc:title>
288
+ </cc:Agent>
289
+ </dc:contributor>
290
+ </cc:Work>
291
+ <cc:License
292
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
293
+ <cc:permits
294
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
295
+ <cc:permits
296
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
297
+ <cc:permits
298
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
299
+ </cc:License>
300
+ </rdf:RDF>
301
+ </metadata>
302
+ <g
303
+ id="layer1"
304
+ inkscape:label="Layer 1"
305
+ inkscape:groupmode="layer">
306
+ <path
307
+ sodipodi:type="arc"
308
+ style="opacity:0.63068183;color:#000000;fill:url(#radialGradient21650);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
309
+ id="path21642"
310
+ sodipodi:cx="25.125"
311
+ sodipodi:cy="36.75"
312
+ sodipodi:rx="15.75"
313
+ sodipodi:ry="9.375"
314
+ d="M 40.875 36.75 A 15.75 9.375 0 1 1 9.375,36.75 A 15.75 9.375 0 1 1 40.875 36.75 z"
315
+ transform="matrix(1.173803,0.000000,0.000000,0.600000,-5.265866,19.57500)" />
316
+ <path
317
+ style="fill:url(#linearGradient4987);fill-opacity:1;fill-rule:evenodd;stroke:#860000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
318
+ d="M 15.591006,0.4919213 L 32.676311,0.4919213 L 45.497585,13.586385 L 45.497585,31.48003 L 32.848986,43.496929 L 15.418649,43.496929 L 2.4943857,30.658264 L 2.4943857,13.464078 L 15.591006,0.4919213 z "
319
+ id="path9480"
320
+ sodipodi:nodetypes="ccccccccc" />
321
+ <path
322
+ style="opacity:0.81318683;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2057);stroke-width:1.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
323
+ d="M 16.020655,1.5003424 L 32.248563,1.5003424 L 44.496456,13.922717 L 44.496456,31.037001 L 32.638472,42.48783 L 15.870253,42.48783 L 3.5090792,30.208718 L 3.5090792,13.84561 L 16.020655,1.5003424 z "
324
+ id="path9482"
325
+ sodipodi:nodetypes="ccccccccc" />
326
+ <path
327
+ style="opacity:0.28977272;fill:url(#radialGradient2254);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
328
+ d="M 15.6875,0.75 L 2.75,13.5625 L 2.75,30.5625 L 5.6875,33.46875 C 22.450041,33.526299 22.164665,20.450067 45.25,21.59375 L 45.25,13.6875 L 32.5625,0.75 L 15.6875,0.75 z "
329
+ id="path2241"
330
+ sodipodi:nodetypes="cccccccc" />
331
+ <path
332
+ style="fill:url(#radialGradient2239);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2262);stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
333
+ d="M 16.767175,10.5 L 12.5,14.767175 L 20.035075,22.30225 L 12.5,29.837325 L 16.767175,34.104501 L 24.30225,26.569425 L 31.837325,34.104501 L 36.104501,29.837325 L 28.569425,22.30225 L 36.104501,14.767175 L 31.837325,10.5 L 24.30225,18.035075 L 16.767175,10.5 z "
334
+ id="path2787" />
335
+ </g>
336
+ </svg>
@@ -29,8 +29,11 @@ __all__ = [
29
29
  ]
30
30
 
31
31
 
32
+ import copy
33
+
32
34
  from PyQt6.QtCore import (
33
35
  pyqtSignal,
36
+ Qt,
34
37
  )
35
38
  from PyQt6.QtWidgets import (
36
39
  QWidget,
@@ -231,8 +234,8 @@ class _OptionFloatSpinBox(_OptionIntSpinBox):
231
234
  def init_main_widget(self):
232
235
  widget = QDoubleSpinBox()
233
236
  widget.setDecimals(3)
234
- widget.setMinimum(0.25)
235
- widget.setMaximum(4.0)
237
+ widget.setMinimum(com.PITCH_TEMPO_MIN)
238
+ widget.setMaximum(com.PITCH_TEMPO_MAX)
236
239
  widget.setSingleStep(.001)
237
240
 
238
241
  self._revert_to_default = False
@@ -291,15 +294,16 @@ class _OptionComboBox(_OptionLineEdit):
291
294
 
292
295
  class OptionPanel(QWidget):
293
296
  """Panel full of option widgets. Inherits from QWidget. Includes a
294
- `Hold` checkbox to hold options at their current values, a `Revert
295
- to defaults` button and an `Apply to selected` button. The user can
296
- request that an individual widget return to it's default value by
297
- setting it's line edit box to a blank value (this only works for
298
- widgets that actually have a line edit box, and only if the widget's
299
- `default` attribute has been set, which can be done using the
300
- `is_defaults` parameter of the `set_options` method (The
301
- `set_default_options` convenience method, which is what the `Revert
302
- to defaults` button is connected to, does this automatically)).
297
+ `Hold` checkbox to hold options at their current values, a `Use in
298
+ next analysis` checkbox, a `Revert to defaults` button and an `Apply
299
+ to selected` button. The user can request that an individual widget
300
+ return to it's default value by setting it's line edit box to a
301
+ blank value (this only works for widgets that actually have a line
302
+ edit box, and only if the widget's `default` attribute has been set,
303
+ which can be done using the `is_defaults` parameter of the
304
+ `set_options` method (The `set_default_options` convenience method,
305
+ which is what the `Revert to defaults` button is connected to, does
306
+ this automatically)).
303
307
 
304
308
  Parameters
305
309
  ----------
@@ -376,7 +380,9 @@ class OptionPanel(QWidget):
376
380
 
377
381
  # Link button
378
382
  widget = QToolButton()
379
- widget.setText('&Link')
383
+ widget.setText('Link')
384
+ widget.setShortcut('=')
385
+ widget.setStatusTip('Link pitch and tempo (=)')
380
386
  widget.setCheckable(True)
381
387
  hbox.addWidget(widget)
382
388
  self._link = widget
@@ -487,14 +493,6 @@ class OptionPanel(QWidget):
487
493
  self._grid.addWidget(widget, 6, 1)
488
494
  self.widgets[title] = widget
489
495
 
490
- # Pad input
491
- title = gcom.OPTION_PAD
492
- widget = _OptionCheckBox(title)
493
- widget.setStatusTip("Pad the audio with zeros to ensure the FFT"
494
- " window doesn't miss the very beginning and end")
495
- self._grid.addWidget(widget, 7, 1)
496
- self.widgets[title] = widget
497
-
498
496
 
499
497
  self.widgets[gcom.OPTION_PITCH].widget.valueChanged.connect(
500
498
  self._pitch_changed)
@@ -509,9 +507,14 @@ class OptionPanel(QWidget):
509
507
  self._button_panel = QWidget(self)
510
508
  hbox = QHBoxLayout(self._button_panel)
511
509
 
512
- self._hold = QCheckBox('Hold')
510
+ self._hold = QCheckBox('Ho&ld')
513
511
  self._hold.setStatusTip("Don't update settings to reflect selection")
514
512
  hbox.addWidget(self._hold)
513
+ self._use = QCheckBox('&Use in next analysis')
514
+ self._use.setStatusTip('Use these settings to analyze the next'
515
+ ' file selected for analysis')
516
+ self._use.checkStateChanged.connect(self._use_changed)
517
+ hbox.addWidget(self._use)
515
518
  self._to_defaults = QPushButton('Revert to &defaults')
516
519
  self._to_defaults.clicked.connect(self.set_default_options)
517
520
  hbox.addWidget(self._to_defaults)
@@ -520,6 +523,10 @@ class OptionPanel(QWidget):
520
523
  hbox.addWidget(self._to_selected)
521
524
  hbox.setContentsMargins(0, 0, 0, 0)
522
525
 
526
+ def _use_changed(self, event):
527
+ if event == Qt.CheckState.Checked:
528
+ self._hold.setChecked(True)
529
+
523
530
  def _link_toggled(self, event):
524
531
  if event:
525
532
  self._link_ok = False
@@ -626,6 +633,17 @@ class OptionPanel(QWidget):
626
633
  factor = self.widgets[gcom.OPTION_PITCH].get()
627
634
  self.PitchChange.emit(factor)
628
635
 
636
+ def use_options(self) -> bool:
637
+ """Determine whether the 'Use in next analysis' checkbox is
638
+ checked.
639
+
640
+ Returns
641
+ -------
642
+ bool
643
+ True if checked, False if not.
644
+ """
645
+ return self._use.isChecked()
646
+
629
647
  def get_options(self) -> gcom.Options:
630
648
  """Get the values currently set in the option widgets.
631
649
 
@@ -673,6 +691,16 @@ class OptionPanel(QWidget):
673
691
  options.reread_requested = True
674
692
  self.PushOptions.emit(options, True)
675
693
 
694
+ def get_default_options(self) -> gcom.Options:
695
+ """Return a copy of the default options.
696
+
697
+ Returns
698
+ -------
699
+ audio_tuner_gui.common.Options
700
+ The default options.
701
+ """
702
+ return copy.copy(self._default_options)
703
+
676
704
  def set_default_options(self):
677
705
  """Set the widgets to the values passed in the constructor's
678
706
  `args` parameter. This calls `set_options` with force=True and