LayerView.qml 29 KB

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