draftomen 0.3.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.
Files changed (59) hide show
  1. draftomen/__init__.py +17 -0
  2. draftomen/assets/draftomen.icns +0 -0
  3. draftomen/assets/draftomen.ico +0 -0
  4. draftomen/assets/draftomen_logo.png +0 -0
  5. draftomen/audit.py +606 -0
  6. draftomen/backtest.py +449 -0
  7. draftomen/benchmark.py +834 -0
  8. draftomen/carddb.py +1869 -0
  9. draftomen/cardimages.py +313 -0
  10. draftomen/cli.py +891 -0
  11. draftomen/config.py +133 -0
  12. draftomen/deckbuilder.py +2723 -0
  13. draftomen/events.py +772 -0
  14. draftomen/logfollow.py +451 -0
  15. draftomen/mock_session.py +745 -0
  16. draftomen/paths.py +120 -0
  17. draftomen/pickengine.py +1117 -0
  18. draftomen/pool.py +1259 -0
  19. draftomen/preferences.py +289 -0
  20. draftomen/qml/AboutDialog.qml +156 -0
  21. draftomen/qml/AppBar.qml +120 -0
  22. draftomen/qml/BacktestView.qml +316 -0
  23. draftomen/qml/BuildView.qml +1151 -0
  24. draftomen/qml/CardPreview.qml +434 -0
  25. draftomen/qml/DimensionalButton.qml +42 -0
  26. draftomen/qml/DimensionalComboBox.qml +182 -0
  27. draftomen/qml/DimensionalSurface.qml +118 -0
  28. draftomen/qml/DimensionalTabButton.qml +41 -0
  29. draftomen/qml/LiveDraftView.qml +468 -0
  30. draftomen/qml/Main.qml +175 -0
  31. draftomen/qml/NavigationRail.qml +226 -0
  32. draftomen/qml/PoolSummaryPanel.qml +322 -0
  33. draftomen/qml/PrivacyDialog.qml +96 -0
  34. draftomen/qml/RecentPickThumbnail.qml +83 -0
  35. draftomen/qml/RecentPicksGallery.qml +333 -0
  36. draftomen/qml/RecommendationRow.qml +404 -0
  37. draftomen/qml/SettingsSwitch.qml +141 -0
  38. draftomen/qml/SettingsView.qml +531 -0
  39. draftomen/qml/StateBanner.qml +189 -0
  40. draftomen/qml/StatusStrip.qml +84 -0
  41. draftomen/qml/Theme.qml +71 -0
  42. draftomen/qml/qmldir +23 -0
  43. draftomen/qt_adapter.py +884 -0
  44. draftomen/qt_gui.py +338 -0
  45. draftomen/qt_mock.py +63 -0
  46. draftomen/ranking.py +126 -0
  47. draftomen/replay.py +480 -0
  48. draftomen/session.py +3668 -0
  49. draftomen/setinfo.py +26 -0
  50. draftomen/seventeen.py +2766 -0
  51. draftomen/splash.py +617 -0
  52. draftomen/tui.py +4007 -0
  53. draftomen/watch.py +336 -0
  54. draftomen-0.3.0.dist-info/METADATA +156 -0
  55. draftomen-0.3.0.dist-info/RECORD +59 -0
  56. draftomen-0.3.0.dist-info/WHEEL +5 -0
  57. draftomen-0.3.0.dist-info/entry_points.txt +6 -0
  58. draftomen-0.3.0.dist-info/licenses/LICENSE +21 -0
  59. draftomen-0.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,531 @@
1
+ pragma ComponentBehavior: Bound
2
+
3
+ import QtQuick 2.15
4
+ import QtQuick.Controls 2.15
5
+ import QtQuick.Layouts 1.15
6
+
7
+ Item {
8
+ id: root
9
+
10
+ required property var sessionState
11
+ required property bool narrow
12
+ required property var displayPreferences
13
+ readonly property int effectiveSystemScalePercent: Math.round(
14
+ root.displayPreferences.applicationFontPixelSize
15
+ / Theme.baseFontPixelSize * 100
16
+ )
17
+ readonly property bool ratingsLoading: root.sessionState
18
+ && root.sessionState.ratings
19
+ && root.sessionState.ratings.phase === "loading"
20
+ readonly property bool ratingsProgressActive: root.ratingsLoading
21
+ && root.sessionState.progress
22
+ && root.sessionState.progress.operation === "ratings"
23
+ readonly property bool ratingsProgressDeterminate: root.activeRatingsProgress
24
+ && root.activeRatingsProgress.total !== null
25
+ && root.activeRatingsProgress.total !== undefined
26
+ readonly property var activeRatingsProgress: root.ratingsProgressActive
27
+ ? root.sessionState.progress : null
28
+
29
+ ScrollView {
30
+ id: settingsScroll
31
+ anchors.fill: parent
32
+ clip: true
33
+ contentWidth: availableWidth
34
+
35
+ ColumnLayout {
36
+ width: settingsScroll.availableWidth
37
+ spacing: Theme.gutter
38
+
39
+ Label {
40
+ text: "Settings"
41
+ color: Theme.text
42
+ font.pixelSize: Theme.textPixelSize(22)
43
+ font.bold: true
44
+ }
45
+ Label {
46
+ Layout.fillWidth: true
47
+ text: "Draft guidance uses the shared live session. Display choices are saved only for this desktop application."
48
+ color: Theme.textMuted
49
+ wrapMode: Text.WordWrap
50
+ }
51
+
52
+ Rectangle {
53
+ Layout.fillWidth: true
54
+ Layout.preferredHeight: guidanceLayout.implicitHeight + 32
55
+ color: Theme.surfaceLow
56
+ border.color: Theme.outline
57
+ border.width: 1
58
+ radius: Theme.radius
59
+
60
+ ColumnLayout {
61
+ id: guidanceLayout
62
+ anchors.fill: parent
63
+ anchors.margins: 16
64
+ spacing: 14
65
+
66
+ Label {
67
+ text: "DRAFT GUIDANCE"
68
+ color: Theme.primary
69
+ font.pixelSize: Theme.textPixelSize(10)
70
+ font.bold: true
71
+ font.letterSpacing: 1.1
72
+ }
73
+ RowLayout {
74
+ Layout.fillWidth: true
75
+ ColumnLayout {
76
+ Layout.fillWidth: true
77
+ Label { text: "Default ranking"; color: Theme.text; font.bold: true }
78
+ Label {
79
+ Layout.fillWidth: true
80
+ text: "Controls recommendation order and backtest comparison."
81
+ color: Theme.textMuted
82
+ font.pixelSize: Theme.textPixelSize(11)
83
+ wrapMode: Text.WordWrap
84
+ }
85
+ }
86
+ DimensionalComboBox {
87
+ id: defaultRanking
88
+ objectName: "settingsRankingSelector"
89
+ Layout.preferredWidth: root.narrow ? 140 : 168
90
+ model: [
91
+ { key: "score", label: "DO Score" },
92
+ { key: "win_rate", label: "17L WR" },
93
+ { key: "alsa", label: "ALSA" },
94
+ { key: "mana_value", label: "Mana value" }
95
+ ]
96
+ textRole: "label"
97
+ valueRole: "key"
98
+ currentIndex: {
99
+ for (let index = 0; index < model.length; index++)
100
+ if (model[index].key === root.sessionState.recommendations.ranking_mode)
101
+ return index
102
+ return 0
103
+ }
104
+ Accessible.name: "Default recommendation ranking"
105
+ Accessible.description: "Changes the shared live-session recommendation ranking."
106
+ onActivated: sessionProvider.changeRanking(currentValue)
107
+ }
108
+ }
109
+ RowLayout {
110
+ Layout.fillWidth: true
111
+ ColumnLayout {
112
+ Layout.fillWidth: true
113
+ Label { text: "Splash recommendations"; color: Theme.text; font.bold: true }
114
+ Label {
115
+ Layout.fillWidth: true
116
+ text: "Consider supported single-pip cards when fixing allows."
117
+ color: Theme.textMuted
118
+ font.pixelSize: Theme.textPixelSize(11)
119
+ wrapMode: Text.WordWrap
120
+ }
121
+ }
122
+ SettingsSwitch {
123
+ objectName: "settingsSplashSwitch"
124
+ checked: root.sessionState.recommendations.splash_enabled
125
+ Accessible.name: "Splash recommendations"
126
+ Accessible.description: "Changes the shared live-session splash preference."
127
+ onToggled: sessionProvider.setSplashEnabled(checked)
128
+ }
129
+ }
130
+ }
131
+ }
132
+
133
+ Rectangle {
134
+ Layout.fillWidth: true
135
+ Layout.preferredHeight: displayLayout.implicitHeight + 32
136
+ color: Theme.surfaceLow
137
+ border.color: Theme.outline
138
+ border.width: 1
139
+ radius: Theme.radius
140
+
141
+ ColumnLayout {
142
+ id: displayLayout
143
+ anchors.fill: parent
144
+ anchors.margins: 16
145
+ spacing: 12
146
+ Label {
147
+ text: "DISPLAY"
148
+ color: Theme.primary
149
+ font.pixelSize: Theme.textPixelSize(10)
150
+ font.bold: true
151
+ font.letterSpacing: 1.1
152
+ }
153
+ RowLayout {
154
+ Layout.fillWidth: true
155
+ ColumnLayout {
156
+ Layout.fillWidth: true
157
+ Label { text: "Show Backtest navigation"; color: Theme.text; font.bold: true }
158
+ Label { Layout.fillWidth: true; text: "Show the Backtest button in the navigation rail."; color: Theme.textMuted; font.pixelSize: Theme.textPixelSize(11); wrapMode: Text.WordWrap }
159
+ }
160
+ SettingsSwitch {
161
+ objectName: "settingsShowBacktestSwitch"
162
+ checked: root.displayPreferences.showBacktest
163
+ Accessible.name: "Show Backtest navigation"
164
+ Accessible.description: "Show the Backtest button in the navigation rail."
165
+ onToggled: root.displayPreferences.setShowBacktest(checked)
166
+ }
167
+ }
168
+ RowLayout {
169
+ Layout.fillWidth: true
170
+ ColumnLayout {
171
+ Layout.fillWidth: true
172
+ Label { text: "Compact density"; color: Theme.text; font.bold: true }
173
+ Label { Layout.fillWidth: true; text: "Reduce list spacing while retaining 40px targets."; color: Theme.textMuted; font.pixelSize: Theme.textPixelSize(11); wrapMode: Text.WordWrap }
174
+ }
175
+ SettingsSwitch {
176
+ objectName: "settingsCompactDensitySwitch"
177
+ checked: root.displayPreferences.compactDensity
178
+ Accessible.name: "Compact density"
179
+ Accessible.description: "Saved desktop display preference."
180
+ onToggled: root.displayPreferences.setCompactDensity(checked)
181
+ }
182
+ }
183
+ RowLayout {
184
+ Layout.fillWidth: true
185
+ ColumnLayout {
186
+ Layout.fillWidth: true
187
+ Label { text: "Secondary statistics"; color: Theme.text; font.bold: true }
188
+ Label { Layout.fillWidth: true; text: "Show ALSA, mana value, and source details."; color: Theme.textMuted; font.pixelSize: Theme.textPixelSize(11); wrapMode: Text.WordWrap }
189
+ }
190
+ SettingsSwitch {
191
+ objectName: "settingsSecondaryStatsSwitch"
192
+ checked: root.displayPreferences.secondaryStats
193
+ Accessible.name: "Secondary statistics"
194
+ Accessible.description: "Saved desktop display preference."
195
+ onToggled: root.displayPreferences.setSecondaryStats(checked)
196
+ }
197
+ }
198
+ RowLayout {
199
+ Layout.fillWidth: true
200
+ ColumnLayout {
201
+ Layout.fillWidth: true
202
+ Label { text: "Card image preview"; color: Theme.text; font.bold: true }
203
+ Label { Layout.fillWidth: true; text: "Keep the selected card image visible when space allows."; color: Theme.textMuted; font.pixelSize: Theme.textPixelSize(11); wrapMode: Text.WordWrap }
204
+ }
205
+ SettingsSwitch {
206
+ objectName: "settingsCardPreviewSwitch"
207
+ checked: root.displayPreferences.cardPreview
208
+ Accessible.name: "Card image preview"
209
+ Accessible.description: "Saved desktop display preference."
210
+ onToggled: root.displayPreferences.setCardPreview(checked)
211
+ }
212
+ }
213
+ RowLayout {
214
+ Layout.fillWidth: true
215
+ ColumnLayout {
216
+ Layout.fillWidth: true
217
+ Label { text: "Detailed build context"; color: Theme.text; font.bold: true }
218
+ Label { Layout.fillWidth: true; text: "Show pair reasoning and durable build warnings."; color: Theme.textMuted; font.pixelSize: Theme.textPixelSize(11); wrapMode: Text.WordWrap }
219
+ }
220
+ SettingsSwitch {
221
+ objectName: "settingsDetailedBuildContextSwitch"
222
+ checked: root.displayPreferences.detailedBuildContext
223
+ Accessible.name: "Detailed build context"
224
+ Accessible.description: "Saved desktop display preference."
225
+ onToggled: root.displayPreferences.setDetailedBuildContext(checked)
226
+ }
227
+ }
228
+ }
229
+ }
230
+
231
+ Rectangle {
232
+ Layout.fillWidth: true
233
+ Layout.preferredHeight: accessibilityLayout.implicitHeight + 32
234
+ color: Theme.surfaceLow
235
+ border.color: Theme.outline
236
+ border.width: 1
237
+ radius: Theme.radius
238
+ ColumnLayout {
239
+ id: accessibilityLayout
240
+ anchors.fill: parent
241
+ anchors.margins: 16
242
+ spacing: 8
243
+ Label { text: "ACCESSIBILITY"; color: Theme.primary; font.pixelSize: Theme.textPixelSize(10); font.bold: true; font.letterSpacing: 1.1 }
244
+ RowLayout {
245
+ Layout.fillWidth: true
246
+ ColumnLayout {
247
+ Layout.fillWidth: true
248
+ Label { text: "Follow system text size"; color: Theme.text; font.bold: true }
249
+ Label {
250
+ objectName: "settingsSystemTextScalingMessage"
251
+ Layout.fillWidth: true
252
+ text: {
253
+ const percent = root.effectiveSystemScalePercent
254
+ if (!root.displayPreferences.systemTextScaling)
255
+ return "Using Draft Omen's 100% baseline. The detected system scale is " + percent + "%."
256
+ if (percent === 100)
257
+ return "Following system text size. The detected 100% scale matches Draft Omen's default, so no visible size change is expected."
258
+ return "Following system text size at the detected " + percent + "% scale."
259
+ }
260
+ color: Theme.textMuted
261
+ wrapMode: Text.WordWrap
262
+ Accessible.name: text
263
+ Accessible.description: text
264
+ }
265
+ }
266
+ SettingsSwitch {
267
+ objectName: "settingsSystemTextScalingSwitch"
268
+ checked: root.displayPreferences.systemTextScaling
269
+ Accessible.name: "Follow system text size"
270
+ Accessible.description: "Use the resolved system text size instead of Draft Omen's 100% baseline."
271
+ onToggled: root.displayPreferences.setSystemTextScaling(checked)
272
+ }
273
+ }
274
+ }
275
+ }
276
+
277
+ Rectangle {
278
+ Layout.fillWidth: true
279
+ Layout.preferredHeight: dataLayout.implicitHeight + 32
280
+ color: Theme.surfaceLow
281
+ border.color: Theme.outline
282
+ border.width: 1
283
+ radius: Theme.radius
284
+ ColumnLayout {
285
+ id: dataLayout
286
+ anchors.fill: parent
287
+ anchors.margins: 16
288
+ spacing: 10
289
+ Label { text: "DATA STATUS"; color: Theme.primary; font.pixelSize: Theme.textPixelSize(10); font.bold: true; font.letterSpacing: 1.1 }
290
+ Label {
291
+ objectName: "settingsCardDataMessage"
292
+ text: root.sessionState.card_data.message
293
+ color: Theme.text
294
+ }
295
+ Label {
296
+ objectName: "settingsCardDataLastUpdated"
297
+ Layout.fillWidth: true
298
+ text: {
299
+ const prefix = qsTr("Card metadata updated") + " · "
300
+ const value = root.sessionState.card_data.last_successful_update
301
+ if (typeof value !== "string" || value.length === 0)
302
+ return prefix + qsTr("Never updated")
303
+ const date = new Date(value)
304
+ if (isNaN(date.getTime()))
305
+ return prefix + qsTr("Never updated")
306
+ return prefix + date.toLocaleString(Qt.locale())
307
+ }
308
+ color: Theme.textMuted
309
+ wrapMode: Text.WordWrap
310
+ Accessible.name: text
311
+ Accessible.description: qsTr("The latest successful card metadata update.")
312
+ }
313
+ Label {
314
+ objectName: "settingsRatingsMessage"
315
+ text: "Ratings · " + root.sessionState.ratings.message
316
+ color: Theme.textMuted
317
+ }
318
+ Label {
319
+ objectName: "settingsRatingsLastUpdated"
320
+ Layout.fillWidth: true
321
+ text: {
322
+ const prefix = qsTr("17Lands ratings updated") + " · "
323
+ const value = root.sessionState.ratings.last_successful_update
324
+ if (typeof value !== "string" || value.length === 0)
325
+ return prefix + qsTr("Never updated")
326
+ const date = new Date(value)
327
+ if (isNaN(date.getTime()))
328
+ return prefix + qsTr("Never updated")
329
+ return prefix + date.toLocaleString(Qt.locale())
330
+ }
331
+ color: Theme.textMuted
332
+ wrapMode: Text.WordWrap
333
+ Accessible.name: text
334
+ Accessible.description: qsTr("The latest successful 17Lands ratings update.")
335
+ }
336
+ ColumnLayout {
337
+ id: ratingsProgressContainer
338
+ objectName: "settingsRatingsProgressContainer"
339
+ Layout.fillWidth: true
340
+ visible: root.ratingsProgressActive
341
+ spacing: 6
342
+
343
+ Label {
344
+ objectName: "settingsRatingsProgressMessage"
345
+ Layout.fillWidth: true
346
+ text: root.activeRatingsProgress
347
+ ? root.activeRatingsProgress.message : ""
348
+ color: Theme.text
349
+ wrapMode: Text.WordWrap
350
+ Accessible.name: text
351
+ Accessible.description: "Current ratings download progress."
352
+ }
353
+
354
+ ProgressBar {
355
+ id: ratingsProgressBar
356
+ objectName: "settingsRatingsProgressBar"
357
+ Layout.fillWidth: true
358
+ implicitHeight: 8
359
+ from: 0
360
+ to: root.activeRatingsProgress
361
+ && root.ratingsProgressDeterminate
362
+ ? root.activeRatingsProgress.total : 1
363
+ value: root.activeRatingsProgress
364
+ && root.ratingsProgressDeterminate
365
+ && root.activeRatingsProgress.completed !== null
366
+ && root.activeRatingsProgress.completed !== undefined
367
+ ? root.activeRatingsProgress.completed : 0
368
+ indeterminate: root.ratingsProgressActive
369
+ && !root.ratingsProgressDeterminate
370
+ Accessible.name: root.activeRatingsProgress
371
+ ? root.activeRatingsProgress.message : ""
372
+
373
+ background: Rectangle {
374
+ objectName: "settingsRatingsProgressBarBackground"
375
+ implicitWidth: 280
376
+ implicitHeight: 8
377
+ color: Theme.surfaceHigh
378
+ border.color: Theme.outline
379
+ border.width: 1
380
+ radius: 4
381
+ }
382
+
383
+ contentItem: Item {
384
+ implicitWidth: 280
385
+ implicitHeight: 8
386
+ clip: true
387
+
388
+ Rectangle {
389
+ id: ratingsProgressFill
390
+ objectName: "settingsRatingsProgressBarFill"
391
+ width: root.ratingsProgressDeterminate
392
+ ? ratingsProgressBar.visualPosition * parent.width
393
+ : parent.width * 0.35
394
+ height: parent.height
395
+ x: root.ratingsProgressDeterminate ? 0 : -width
396
+ color: Theme.primary
397
+ radius: 4
398
+
399
+ SequentialAnimation on x {
400
+ running: root.ratingsProgressActive
401
+ && ratingsProgressBar.indeterminate
402
+ loops: Animation.Infinite
403
+ NumberAnimation {
404
+ from: -ratingsProgressFill.width
405
+ to: ratingsProgressFill.parent.width
406
+ duration: 900
407
+ }
408
+ }
409
+ }
410
+ }
411
+ }
412
+ }
413
+ DimensionalButton {
414
+ id: settingsRatingsDownloadButton
415
+ objectName: "settingsRatingsDownloadButton"
416
+ enabled: root.sessionState.ratings.set_code !== null && root.sessionState.ratings.set_code !== undefined && root.sessionState.ratings.phase !== "loading"
417
+ text: qsTr("Download 17Lands ratings")
418
+ Accessible.name: qsTr("Download 17Lands ratings")
419
+ Accessible.description: qsTr("Downloads text-only card performance ratings and color-pair win rates from 17Lands; no card images are downloaded.")
420
+ onClicked: {
421
+ ratingsDownloadDialog.returnFocusItem = settingsRatingsDownloadButton
422
+ ratingsDownloadDialog.open()
423
+ }
424
+ }
425
+ }
426
+ }
427
+ Item { Layout.preferredHeight: 12 }
428
+ }
429
+ }
430
+
431
+ Dialog {
432
+ id: ratingsDownloadDialog
433
+
434
+ property var returnFocusItem: null
435
+
436
+ objectName: "settingsRatingsDownloadDialog"
437
+ parent: Overlay.overlay
438
+ modal: true
439
+ focus: true
440
+ closePolicy: Popup.CloseOnEscape
441
+ title: qsTr("Download 17Lands ratings?")
442
+ width: Math.min(420, Math.max(300, parent ? parent.width - 32 : 420))
443
+ x: parent ? Math.max(16, Math.round((parent.width - width) / 2)) : 16
444
+ y: parent ? Math.max(16, Math.round((parent.height - height) / 2)) : 16
445
+ padding: 16
446
+
447
+ Overlay.modal: Rectangle {
448
+ color: "#99000000"
449
+ }
450
+
451
+ background: Rectangle {
452
+ objectName: "settingsRatingsDownloadDialogBackground"
453
+ color: Theme.surface
454
+ border.color: Theme.outline
455
+ border.width: 1
456
+ radius: Theme.radius
457
+ }
458
+
459
+ header: Rectangle {
460
+ objectName: "settingsRatingsDownloadDialogHeader"
461
+ implicitHeight: 52
462
+ color: Theme.surfaceHigh
463
+ border.color: Theme.outline
464
+ border.width: 1
465
+
466
+ Label {
467
+ objectName: "settingsRatingsDownloadDialogTitle"
468
+ anchors.fill: parent
469
+ anchors.leftMargin: 16
470
+ anchors.rightMargin: 16
471
+ text: ratingsDownloadDialog.title
472
+ color: Theme.text
473
+ font.pixelSize: Theme.textPixelSize(18)
474
+ font.bold: true
475
+ verticalAlignment: Text.AlignVCenter
476
+ Accessible.name: text
477
+ }
478
+ }
479
+
480
+ onClosed: {
481
+ const opener = returnFocusItem
482
+ returnFocusItem = null
483
+ if (opener && opener.visible && opener.enabled)
484
+ opener.forceActiveFocus()
485
+ }
486
+
487
+ contentItem: ColumnLayout {
488
+ spacing: 12
489
+ implicitWidth: 360
490
+
491
+ Label {
492
+ objectName: "settingsRatingsDownloadDialogMessage"
493
+ Layout.fillWidth: true
494
+ text: qsTr("Download text-only card performance ratings and color-pair win rates from 17Lands for %1? No card images are downloaded.").arg(root.sessionState.ratings.set_code)
495
+ color: Theme.text
496
+ wrapMode: Text.WordWrap
497
+ Accessible.name: text
498
+ }
499
+ }
500
+ footer: DialogButtonBox {
501
+ objectName: "settingsRatingsDownloadDialogFooter"
502
+ implicitHeight: 58
503
+ alignment: Qt.AlignRight
504
+ background: Rectangle {
505
+ objectName: "settingsRatingsDownloadDialogFooterBackground"
506
+ color: Theme.surfaceHigh
507
+ border.color: Theme.outline
508
+ border.width: 1
509
+ }
510
+
511
+ DimensionalButton {
512
+ objectName: "settingsRatingsDownloadCancelButton"
513
+ text: "Not now"
514
+ accented: false
515
+ implicitWidth: 96
516
+ Accessible.name: "Cancel ratings download"
517
+ onClicked: ratingsDownloadDialog.close()
518
+ }
519
+ DimensionalButton {
520
+ objectName: "settingsRatingsDownloadConfirmButton"
521
+ text: qsTr("Download 17Lands ratings")
522
+ implicitWidth: 144
523
+ Accessible.name: qsTr("Confirm 17Lands ratings download")
524
+ onClicked: {
525
+ sessionProvider.requestRatings()
526
+ ratingsDownloadDialog.close()
527
+ }
528
+ }
529
+ }
530
+ }
531
+ }