LayerView.qml 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. // Copyright (c) 2015 Ultimaker B.V.
  2. // Cura is released under the terms of the AGPLv3 or higher.
  3. import QtQuick 2.2
  4. import QtQuick.Controls 1.2
  5. import QtQuick.Layouts 1.1
  6. import QtQuick.Controls.Styles 1.1
  7. import UM 1.0 as UM
  8. Item
  9. {
  10. width: {
  11. if (UM.LayerView.compatibilityMode) {
  12. return UM.Theme.getSize("layerview_menu_size_compatibility").width;
  13. } else {
  14. return UM.Theme.getSize("layerview_menu_size").width;
  15. }
  16. }
  17. height: {
  18. if (UM.LayerView.compatibilityMode) {
  19. return UM.Theme.getSize("layerview_menu_size_compatibility").height;
  20. } else {
  21. return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height)
  22. }
  23. }
  24. Rectangle {
  25. id: layerViewMenu
  26. anchors.left: parent.left
  27. anchors.top: parent.top
  28. width: parent.width
  29. height: parent.height
  30. z: slider.z - 1
  31. color: UM.Theme.getColor("tool_panel_background")
  32. ColumnLayout {
  33. id: view_settings
  34. property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|")
  35. property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves")
  36. property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers")
  37. property bool show_skin: UM.Preferences.getValue("layerview/show_skin")
  38. property bool show_infill: UM.Preferences.getValue("layerview/show_infill")
  39. property bool show_legend: UM.LayerView.compatibilityMode || UM.Preferences.getValue("layerview/layer_view_type") == 1
  40. property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers")
  41. property int top_layer_count: UM.Preferences.getValue("view/top_layer_count")
  42. anchors.top: parent.top
  43. anchors.topMargin: UM.Theme.getSize("default_margin").height
  44. anchors.left: parent.left
  45. anchors.leftMargin: UM.Theme.getSize("default_margin").width
  46. spacing: UM.Theme.getSize("layerview_row_spacing").height
  47. Label
  48. {
  49. id: layersLabel
  50. anchors.left: parent.left
  51. text: catalog.i18nc("@label","View Mode: Layers")
  52. font.bold: true
  53. }
  54. Label
  55. {
  56. id: spaceLabel
  57. anchors.left: parent.left
  58. text: " "
  59. font.pointSize: 0.5
  60. }
  61. Label
  62. {
  63. id: layerViewTypesLabel
  64. anchors.left: parent.left
  65. text: catalog.i18nc("@label","Color scheme")
  66. visible: !UM.LayerView.compatibilityMode
  67. Layout.fillWidth: true
  68. }
  69. ListModel // matches LayerView.py
  70. {
  71. id: layerViewTypes
  72. }
  73. Component.onCompleted:
  74. {
  75. layerViewTypes.append({
  76. text: catalog.i18nc("@label:listbox", "Material Color"),
  77. type_id: 0
  78. })
  79. layerViewTypes.append({
  80. text: catalog.i18nc("@label:listbox", "Line Type"),
  81. type_id: 1 // these ids match the switching in the shader
  82. })
  83. }
  84. ComboBox
  85. {
  86. id: layerTypeCombobox
  87. anchors.left: parent.left
  88. Layout.fillWidth: true
  89. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  90. model: layerViewTypes
  91. visible: !UM.LayerView.compatibilityMode
  92. property int layer_view_type: UM.Preferences.getValue("layerview/layer_view_type")
  93. currentIndex: layer_view_type // index matches type_id
  94. onActivated: {
  95. // Combobox selection
  96. var type_id = index;
  97. UM.Preferences.setValue("layerview/layer_view_type", type_id);
  98. updateLegend(type_id);
  99. }
  100. onModelChanged: {
  101. updateLegend(UM.Preferences.getValue("layerview/layer_view_type"));
  102. }
  103. // Update visibility of legend.
  104. function updateLegend(type_id) {
  105. if (UM.LayerView.compatibilityMode || (type_id == 1)) {
  106. // Line type
  107. view_settings.show_legend = true;
  108. } else {
  109. view_settings.show_legend = false;
  110. }
  111. }
  112. }
  113. Label
  114. {
  115. id: compatibilityModeLabel
  116. anchors.left: parent.left
  117. text: catalog.i18nc("@label","Compatibility Mode")
  118. visible: UM.LayerView.compatibilityMode
  119. Layout.fillWidth: true
  120. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  121. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  122. }
  123. Label
  124. {
  125. id: space2Label
  126. anchors.left: parent.left
  127. text: " "
  128. font.pointSize: 0.5
  129. }
  130. Connections {
  131. target: UM.Preferences
  132. onPreferenceChanged:
  133. {
  134. layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type");
  135. view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|");
  136. view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves");
  137. view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers");
  138. view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin");
  139. view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill");
  140. view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers");
  141. view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count");
  142. }
  143. }
  144. Repeater {
  145. model: UM.LayerView.extruderCount
  146. CheckBox {
  147. checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == ""
  148. onClicked: {
  149. view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0
  150. UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|"));
  151. }
  152. text: catalog.i18nc("@label", "Extruder %1").arg(index + 1)
  153. visible: !UM.LayerView.compatibilityMode
  154. enabled: index + 1 <= 4
  155. Layout.fillWidth: true
  156. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  157. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  158. }
  159. }
  160. CheckBox {
  161. checked: view_settings.show_travel_moves
  162. onClicked: {
  163. UM.Preferences.setValue("layerview/show_travel_moves", checked);
  164. }
  165. text: catalog.i18nc("@label", "Show Travels")
  166. Rectangle {
  167. anchors.top: parent.top
  168. anchors.topMargin: 2
  169. anchors.right: parent.right
  170. width: UM.Theme.getSize("layerview_legend_size").width
  171. height: UM.Theme.getSize("layerview_legend_size").height
  172. color: UM.Theme.getColor("layerview_move_combing")
  173. border.width: UM.Theme.getSize("default_lining").width
  174. border.color: UM.Theme.getColor("lining")
  175. visible: view_settings.show_legend
  176. }
  177. Layout.fillWidth: true
  178. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  179. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  180. }
  181. CheckBox {
  182. checked: view_settings.show_helpers
  183. onClicked: {
  184. UM.Preferences.setValue("layerview/show_helpers", checked);
  185. }
  186. text: catalog.i18nc("@label", "Show Helpers")
  187. Rectangle {
  188. anchors.top: parent.top
  189. anchors.topMargin: 2
  190. anchors.right: parent.right
  191. width: UM.Theme.getSize("layerview_legend_size").width
  192. height: UM.Theme.getSize("layerview_legend_size").height
  193. color: UM.Theme.getColor("layerview_support")
  194. border.width: UM.Theme.getSize("default_lining").width
  195. border.color: UM.Theme.getColor("lining")
  196. visible: view_settings.show_legend
  197. }
  198. Layout.fillWidth: true
  199. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  200. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  201. }
  202. CheckBox {
  203. checked: view_settings.show_skin
  204. onClicked: {
  205. UM.Preferences.setValue("layerview/show_skin", checked);
  206. }
  207. text: catalog.i18nc("@label", "Show Shell")
  208. Rectangle {
  209. anchors.top: parent.top
  210. anchors.topMargin: 2
  211. anchors.right: parent.right
  212. width: UM.Theme.getSize("layerview_legend_size").width
  213. height: UM.Theme.getSize("layerview_legend_size").height
  214. color: UM.Theme.getColor("layerview_inset_0")
  215. border.width: UM.Theme.getSize("default_lining").width
  216. border.color: UM.Theme.getColor("lining")
  217. visible: view_settings.show_legend
  218. }
  219. Layout.fillWidth: true
  220. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  221. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  222. }
  223. CheckBox {
  224. checked: view_settings.show_infill
  225. onClicked: {
  226. UM.Preferences.setValue("layerview/show_infill", checked);
  227. }
  228. text: catalog.i18nc("@label", "Show Infill")
  229. Rectangle {
  230. anchors.top: parent.top
  231. anchors.topMargin: 2
  232. anchors.right: parent.right
  233. width: UM.Theme.getSize("layerview_legend_size").width
  234. height: UM.Theme.getSize("layerview_legend_size").height
  235. color: UM.Theme.getColor("layerview_infill")
  236. border.width: UM.Theme.getSize("default_lining").width
  237. border.color: UM.Theme.getColor("lining")
  238. visible: view_settings.show_legend
  239. }
  240. Layout.fillWidth: true
  241. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  242. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  243. }
  244. CheckBox {
  245. checked: view_settings.only_show_top_layers
  246. onClicked: {
  247. UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0);
  248. }
  249. text: catalog.i18nc("@label", "Only Show Top Layers")
  250. visible: UM.LayerView.compatibilityMode
  251. }
  252. CheckBox {
  253. checked: view_settings.top_layer_count == 5
  254. onClicked: {
  255. UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1);
  256. }
  257. text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top")
  258. visible: UM.LayerView.compatibilityMode
  259. }
  260. Label
  261. {
  262. id: topBottomLabel
  263. anchors.left: parent.left
  264. text: catalog.i18nc("@label","Top / Bottom")
  265. Rectangle {
  266. anchors.top: parent.top
  267. anchors.topMargin: 2
  268. anchors.right: parent.right
  269. width: UM.Theme.getSize("layerview_legend_size").width
  270. height: UM.Theme.getSize("layerview_legend_size").height
  271. color: UM.Theme.getColor("layerview_skin")
  272. border.width: UM.Theme.getSize("default_lining").width
  273. border.color: UM.Theme.getColor("lining")
  274. }
  275. Layout.fillWidth: true
  276. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  277. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  278. visible: view_settings.show_legend
  279. }
  280. Label
  281. {
  282. id: innerWallLabel
  283. anchors.left: parent.left
  284. text: catalog.i18nc("@label","Inner Wall")
  285. Rectangle {
  286. anchors.top: parent.top
  287. anchors.topMargin: 2
  288. anchors.right: parent.right
  289. width: UM.Theme.getSize("layerview_legend_size").width
  290. height: UM.Theme.getSize("layerview_legend_size").height
  291. color: UM.Theme.getColor("layerview_inset_x")
  292. border.width: UM.Theme.getSize("default_lining").width
  293. border.color: UM.Theme.getColor("lining")
  294. visible: view_settings.show_legend
  295. }
  296. Layout.fillWidth: true
  297. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  298. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  299. visible: view_settings.show_legend
  300. }
  301. }
  302. Item
  303. {
  304. id: slider
  305. width: handleSize
  306. height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height
  307. anchors.top: parent.top
  308. anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height
  309. anchors.right: layerViewMenu.right
  310. anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width
  311. property real handleSize: UM.Theme.getSize("slider_handle").width
  312. property real handleRadius: handleSize / 2
  313. property real minimumRangeHandleSize: UM.Theme.getSize("slider_handle").width / 2
  314. property real trackThickness: UM.Theme.getSize("slider_groove").width
  315. property real trackRadius: trackThickness / 2
  316. property real trackBorderWidth: UM.Theme.getSize("default_lining").width
  317. property color upperHandleColor: UM.Theme.getColor("slider_handle")
  318. property color lowerHandleColor: UM.Theme.getColor("slider_handle")
  319. property color rangeHandleColor: UM.Theme.getColor("slider_groove_fill")
  320. property color trackColor: UM.Theme.getColor("slider_groove")
  321. property color trackBorderColor: UM.Theme.getColor("slider_groove_border")
  322. property real maximumValue: UM.LayerView.numLayers
  323. property real minimumValue: 0
  324. property real minimumRange: 0
  325. property bool roundValues: true
  326. property var activeHandle: upperHandle
  327. property bool layersVisible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false
  328. function getUpperValueFromHandle()
  329. {
  330. var result = upperHandle.y / (height - (2 * handleSize + minimumRangeHandleSize));
  331. result = maximumValue + result * (minimumValue - (maximumValue - minimumRange));
  332. result = roundValues ? Math.round(result) | 0 : result;
  333. return result;
  334. }
  335. function getLowerValueFromHandle()
  336. {
  337. var result = (lowerHandle.y - (handleSize + minimumRangeHandleSize)) / (height - (2 * handleSize + minimumRangeHandleSize));
  338. result = maximumValue - minimumRange + result * (minimumValue - (maximumValue - minimumRange));
  339. result = roundValues ? Math.round(result) : result;
  340. return result;
  341. }
  342. function setUpperValue(value)
  343. {
  344. var value = (value - maximumValue) / (minimumValue - maximumValue);
  345. var new_upper_y = Math.round(value * (height - (2 * handleSize + minimumRangeHandleSize)));
  346. if(new_upper_y != upperHandle.y)
  347. {
  348. upperHandle.y = new_upper_y;
  349. }
  350. rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height);
  351. }
  352. function setLowerValue(value)
  353. {
  354. var value = (value - maximumValue) / (minimumValue - maximumValue);
  355. var new_lower_y = Math.round((handleSize + minimumRangeHandleSize) + value * (height - (2 * handleSize + minimumRangeHandleSize)));
  356. if(new_lower_y != lowerHandle.y)
  357. {
  358. lowerHandle.y = new_lower_y;
  359. }
  360. rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height);
  361. }
  362. Connections
  363. {
  364. target: UM.LayerView
  365. onMinimumLayerChanged: slider.setLowerValue(UM.LayerView.minimumLayer)
  366. onCurrentLayerChanged: slider.setUpperValue(UM.LayerView.currentLayer)
  367. }
  368. Rectangle {
  369. width: parent.trackThickness
  370. height: parent.height - parent.handleSize
  371. radius: parent.trackRadius
  372. anchors.centerIn: parent
  373. color: parent.trackColor
  374. border.width: parent.trackBorderWidth;
  375. border.color: parent.trackBorderColor;
  376. }
  377. Item {
  378. id: rangeHandle
  379. y: upperHandle.y + upperHandle.height
  380. width: parent.handleSize
  381. height: parent.minimumRangeHandleSize
  382. anchors.horizontalCenter: parent.horizontalCenter
  383. visible: slider.layersVisible
  384. property real value: UM.LayerView.currentLayer
  385. function setValue(value)
  386. {
  387. var range = upperHandle.value - lowerHandle.value;
  388. value = Math.min(value, slider.maximumValue);
  389. value = Math.max(value, slider.minimumValue + range);
  390. UM.LayerView.setCurrentLayer(value);
  391. UM.LayerView.setMinimumLayer(value - range);
  392. }
  393. Rectangle {
  394. anchors.centerIn: parent
  395. width: parent.parent.trackThickness - 2 * parent.parent.trackBorderWidth
  396. height: parent.height + parent.parent.handleSize
  397. color: parent.parent.rangeHandleColor
  398. }
  399. MouseArea {
  400. anchors.fill: parent
  401. drag.target: parent
  402. drag.axis: Drag.YAxis
  403. drag.minimumY: upperHandle.height
  404. drag.maximumY: parent.parent.height - (parent.height + lowerHandle.height)
  405. onPressed: parent.parent.activeHandle = rangeHandle
  406. onPositionChanged:
  407. {
  408. upperHandle.y = parent.y - upperHandle.height
  409. lowerHandle.y = parent.y + parent.height
  410. var upper_value = slider.getUpperValueFromHandle();
  411. var lower_value = upper_value - (upperHandle.value - lowerHandle.value);
  412. UM.LayerView.setCurrentLayer(upper_value);
  413. UM.LayerView.setMinimumLayer(lower_value);
  414. }
  415. }
  416. }
  417. Rectangle {
  418. id: upperHandle
  419. y: parent.height - (parent.minimumRangeHandleSize + 2 * parent.handleSize)
  420. width: parent.handleSize
  421. height: parent.handleSize
  422. anchors.horizontalCenter: parent.horizontalCenter
  423. radius: parent.handleRadius
  424. color: parent.upperHandleColor
  425. visible: slider.layersVisible
  426. property real value: UM.LayerView.currentLayer
  427. function setValue(value)
  428. {
  429. UM.LayerView.setCurrentLayer(value);
  430. }
  431. MouseArea {
  432. anchors.fill: parent
  433. drag.target: parent
  434. drag.axis: Drag.YAxis
  435. drag.minimumY: 0
  436. drag.maximumY: parent.parent.height - (2 * parent.parent.handleSize + parent.parent.minimumRangeHandleSize)
  437. onPressed: parent.parent.activeHandle = upperHandle
  438. onPositionChanged:
  439. {
  440. if(lowerHandle.y - (upperHandle.y + upperHandle.height) < parent.parent.minimumRangeHandleSize)
  441. {
  442. lowerHandle.y = upperHandle.y + upperHandle.height + parent.parent.minimumRangeHandleSize;
  443. }
  444. rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height);
  445. UM.LayerView.setCurrentLayer(slider.getUpperValueFromHandle());
  446. }
  447. }
  448. }
  449. Rectangle {
  450. id: lowerHandle
  451. y: parent.height - parent.handleSize
  452. width: parent.handleSize
  453. height: parent.handleSize
  454. anchors.horizontalCenter: parent.horizontalCenter
  455. radius: parent.handleRadius
  456. color: parent.lowerHandleColor
  457. visible: slider.layersVisible
  458. property real value: UM.LayerView.minimumLayer
  459. function setValue(value)
  460. {
  461. UM.LayerView.setMinimumLayer(value);
  462. }
  463. MouseArea {
  464. anchors.fill: parent
  465. drag.target: parent
  466. drag.axis: Drag.YAxis
  467. drag.minimumY: upperHandle.height + parent.parent.minimumRangeHandleSize
  468. drag.maximumY: parent.parent.height - parent.height
  469. onPressed: parent.parent.activeHandle = lowerHandle
  470. onPositionChanged:
  471. {
  472. if(lowerHandle.y - (upperHandle.y + upperHandle.height) < parent.parent.minimumRangeHandleSize)
  473. {
  474. upperHandle.y = lowerHandle.y - (upperHandle.height + parent.parent.minimumRangeHandleSize);
  475. }
  476. rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height)
  477. UM.LayerView.setMinimumLayer(slider.getLowerValueFromHandle());
  478. }
  479. }
  480. }
  481. UM.PointingRectangle
  482. {
  483. x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2;
  484. y: Math.floor(slider.activeHandle.y + slider.activeHandle.height / 2 - height / 2);
  485. target: Qt.point(0, slider.activeHandle.y + slider.activeHandle.height / 2)
  486. arrowSize: UM.Theme.getSize("default_arrow").width
  487. height: (Math.floor(UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height) / 2) * 2 // Make sure height has an integer middle so drawing a pointy border is easier
  488. width: valueLabel.width + UM.Theme.getSize("default_margin").width
  489. Behavior on height { NumberAnimation { duration: 50; } }
  490. color: UM.Theme.getColor("lining");
  491. visible: slider.layersVisible
  492. UM.PointingRectangle
  493. {
  494. color: UM.Theme.getColor("tool_panel_background")
  495. target: Qt.point(0, height / 2 + UM.Theme.getSize("default_lining").width)
  496. arrowSize: UM.Theme.getSize("default_arrow").width
  497. anchors.fill: parent
  498. anchors.margins: UM.Theme.getSize("default_lining").width
  499. MouseArea //Catch all mouse events (so scene doesnt handle them)
  500. {
  501. anchors.fill: parent
  502. }
  503. }
  504. TextField
  505. {
  506. id: valueLabel
  507. property string maxValue: slider.maximumValue + 1
  508. text: slider.activeHandle.value + 1
  509. horizontalAlignment: TextInput.AlignRight;
  510. onEditingFinished:
  511. {
  512. // Ensure that the cursor is at the first position. On some systems the text isn't fully visible
  513. // Seems to have to do something with different dpi densities that QML doesn't quite handle.
  514. // Another option would be to increase the size even further, but that gives pretty ugly results.
  515. cursorPosition = 0;
  516. if(valueLabel.text != '')
  517. {
  518. slider.activeHandle.setValue(valueLabel.text - 1);
  519. }
  520. }
  521. validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; }
  522. anchors.left: parent.left;
  523. anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2;
  524. anchors.verticalCenter: parent.verticalCenter;
  525. width: Math.max(UM.Theme.getSize("line").width * maxValue.length + 2, 20);
  526. style: TextFieldStyle
  527. {
  528. textColor: UM.Theme.getColor("setting_control_text");
  529. font: UM.Theme.getFont("default");
  530. background: Item { }
  531. }
  532. Keys.onUpPressed: slider.activeHandle.setValue(slider.activeHandle.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1))
  533. Keys.onDownPressed: slider.activeHandle.setValue(slider.activeHandle.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1))
  534. }
  535. BusyIndicator
  536. {
  537. id: busyIndicator;
  538. anchors.left: parent.right;
  539. anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2;
  540. anchors.verticalCenter: parent.verticalCenter;
  541. width: UM.Theme.getSize("slider_handle").height;
  542. height: width;
  543. running: UM.LayerView.busy;
  544. visible: UM.LayerView.busy;
  545. }
  546. }
  547. }
  548. }
  549. }