LayerView.qml 28 KB

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