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.
- draftomen/__init__.py +17 -0
- draftomen/assets/draftomen.icns +0 -0
- draftomen/assets/draftomen.ico +0 -0
- draftomen/assets/draftomen_logo.png +0 -0
- draftomen/audit.py +606 -0
- draftomen/backtest.py +449 -0
- draftomen/benchmark.py +834 -0
- draftomen/carddb.py +1869 -0
- draftomen/cardimages.py +313 -0
- draftomen/cli.py +891 -0
- draftomen/config.py +133 -0
- draftomen/deckbuilder.py +2723 -0
- draftomen/events.py +772 -0
- draftomen/logfollow.py +451 -0
- draftomen/mock_session.py +745 -0
- draftomen/paths.py +120 -0
- draftomen/pickengine.py +1117 -0
- draftomen/pool.py +1259 -0
- draftomen/preferences.py +289 -0
- draftomen/qml/AboutDialog.qml +156 -0
- draftomen/qml/AppBar.qml +120 -0
- draftomen/qml/BacktestView.qml +316 -0
- draftomen/qml/BuildView.qml +1151 -0
- draftomen/qml/CardPreview.qml +434 -0
- draftomen/qml/DimensionalButton.qml +42 -0
- draftomen/qml/DimensionalComboBox.qml +182 -0
- draftomen/qml/DimensionalSurface.qml +118 -0
- draftomen/qml/DimensionalTabButton.qml +41 -0
- draftomen/qml/LiveDraftView.qml +468 -0
- draftomen/qml/Main.qml +175 -0
- draftomen/qml/NavigationRail.qml +226 -0
- draftomen/qml/PoolSummaryPanel.qml +322 -0
- draftomen/qml/PrivacyDialog.qml +96 -0
- draftomen/qml/RecentPickThumbnail.qml +83 -0
- draftomen/qml/RecentPicksGallery.qml +333 -0
- draftomen/qml/RecommendationRow.qml +404 -0
- draftomen/qml/SettingsSwitch.qml +141 -0
- draftomen/qml/SettingsView.qml +531 -0
- draftomen/qml/StateBanner.qml +189 -0
- draftomen/qml/StatusStrip.qml +84 -0
- draftomen/qml/Theme.qml +71 -0
- draftomen/qml/qmldir +23 -0
- draftomen/qt_adapter.py +884 -0
- draftomen/qt_gui.py +338 -0
- draftomen/qt_mock.py +63 -0
- draftomen/ranking.py +126 -0
- draftomen/replay.py +480 -0
- draftomen/session.py +3668 -0
- draftomen/setinfo.py +26 -0
- draftomen/seventeen.py +2766 -0
- draftomen/splash.py +617 -0
- draftomen/tui.py +4007 -0
- draftomen/watch.py +336 -0
- draftomen-0.3.0.dist-info/METADATA +156 -0
- draftomen-0.3.0.dist-info/RECORD +59 -0
- draftomen-0.3.0.dist-info/WHEEL +5 -0
- draftomen-0.3.0.dist-info/entry_points.txt +6 -0
- draftomen-0.3.0.dist-info/licenses/LICENSE +21 -0
- 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
|
+
}
|