LayerView.qml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. // Copyright (c) 2017 Ultimaker B.V.
  2. // Cura is released under the terms of the LGPLv3 or higher.
  3. import QtQuick 2.4
  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 if (UM.Preferences.getValue("layerview/layer_view_type") == 0) {
  23. return UM.Theme.getSize("layerview_menu_size_material_color_mode").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height)
  24. } else {
  25. return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height)
  26. }
  27. }
  28. property var buttonTarget: {
  29. if(parent != null)
  30. {
  31. var force_binding = parent.y; // ensure this gets reevaluated when the panel moves
  32. return base.mapFromItem(parent.parent, parent.buttonTarget.x, parent.buttonTarget.y)
  33. }
  34. return Qt.point(0,0)
  35. }
  36. visible: parent != null ? !parent.parent.monitoringPrint: true
  37. UM.PointingRectangle {
  38. id: layerViewMenu
  39. anchors.right: parent.right
  40. anchors.top: parent.top
  41. width: parent.width
  42. height: parent.height
  43. z: slider.z - 1
  44. color: UM.Theme.getColor("tool_panel_background")
  45. borderWidth: UM.Theme.getSize("default_lining").width
  46. borderColor: UM.Theme.getColor("lining")
  47. arrowSize: 0 // hide arrow until weird issue with first time rendering is fixed
  48. ColumnLayout {
  49. id: view_settings
  50. property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|")
  51. property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves")
  52. property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers")
  53. property bool show_skin: UM.Preferences.getValue("layerview/show_skin")
  54. property bool show_infill: UM.Preferences.getValue("layerview/show_infill")
  55. // if we are in compatibility mode, we only show the "line type"
  56. property bool show_legend: UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type") == 1
  57. property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers")
  58. property int top_layer_count: UM.Preferences.getValue("view/top_layer_count")
  59. anchors.top: parent.top
  60. anchors.topMargin: UM.Theme.getSize("default_margin").height
  61. anchors.left: parent.left
  62. anchors.leftMargin: UM.Theme.getSize("default_margin").width
  63. spacing: UM.Theme.getSize("layerview_row_spacing").height
  64. anchors.right: parent.right
  65. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  66. Label
  67. {
  68. id: layerViewTypesLabel
  69. anchors.left: parent.left
  70. text: catalog.i18nc("@label","Color scheme")
  71. font: UM.Theme.getFont("default");
  72. visible: !UM.LayerView.compatibilityMode
  73. Layout.fillWidth: true
  74. color: UM.Theme.getColor("setting_control_text")
  75. }
  76. ListModel // matches LayerView.py
  77. {
  78. id: layerViewTypes
  79. }
  80. Component.onCompleted:
  81. {
  82. layerViewTypes.append({
  83. text: catalog.i18nc("@label:listbox", "Material Color"),
  84. type_id: 0
  85. })
  86. layerViewTypes.append({
  87. text: catalog.i18nc("@label:listbox", "Line Type"),
  88. type_id: 1 // these ids match the switching in the shader
  89. })
  90. }
  91. ComboBox
  92. {
  93. id: layerTypeCombobox
  94. anchors.left: parent.left
  95. Layout.fillWidth: true
  96. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  97. model: layerViewTypes
  98. visible: !UM.LayerView.compatibilityMode
  99. style: UM.Theme.styles.combobox
  100. anchors.right: parent.right
  101. anchors.rightMargin: 10 * screenScaleFactor
  102. onActivated:
  103. {
  104. UM.Preferences.setValue("layerview/layer_view_type", index);
  105. }
  106. Component.onCompleted:
  107. {
  108. currentIndex = UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type");
  109. updateLegends(currentIndex);
  110. }
  111. function updateLegends(type_id)
  112. {
  113. // update visibility of legends
  114. view_settings.show_legend = UM.LayerView.compatibilityMode || (type_id == 1);
  115. }
  116. }
  117. Label
  118. {
  119. id: compatibilityModeLabel
  120. anchors.left: parent.left
  121. text: catalog.i18nc("@label","Compatibility Mode")
  122. font: UM.Theme.getFont("default")
  123. color: UM.Theme.getColor("text")
  124. visible: UM.LayerView.compatibilityMode
  125. Layout.fillWidth: true
  126. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height
  127. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  128. }
  129. Label
  130. {
  131. id: space2Label
  132. anchors.left: parent.left
  133. text: " "
  134. font.pointSize: 0.5
  135. }
  136. Connections {
  137. target: UM.Preferences
  138. onPreferenceChanged:
  139. {
  140. layerTypeCombobox.currentIndex = UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type");
  141. layerTypeCombobox.updateLegends(layerTypeCombobox.currentIndex);
  142. view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|");
  143. view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves");
  144. view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers");
  145. view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin");
  146. view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill");
  147. view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers");
  148. view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count");
  149. }
  150. }
  151. Repeater {
  152. model: Cura.ExtrudersModel{}
  153. CheckBox {
  154. id: extrudersModelCheckBox
  155. checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == ""
  156. onClicked: {
  157. view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0
  158. UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|"));
  159. }
  160. visible: !UM.LayerView.compatibilityMode
  161. enabled: index + 1 <= 4
  162. Rectangle {
  163. anchors.verticalCenter: parent.verticalCenter
  164. anchors.right: extrudersModelCheckBox.right
  165. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  166. width: UM.Theme.getSize("layerview_legend_size").width
  167. height: UM.Theme.getSize("layerview_legend_size").height
  168. color: model.color
  169. radius: width / 2
  170. border.width: UM.Theme.getSize("default_lining").width
  171. border.color: UM.Theme.getColor("lining")
  172. visible: !view_settings.show_legend
  173. }
  174. Layout.fillWidth: true
  175. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height
  176. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  177. style: UM.Theme.styles.checkbox
  178. Label
  179. {
  180. text: model.name
  181. elide: Text.ElideRight
  182. color: UM.Theme.getColor("setting_control_text")
  183. font: UM.Theme.getFont("default")
  184. anchors.verticalCenter: parent.verticalCenter
  185. anchors.left: extrudersModelCheckBox.left;
  186. anchors.right: extrudersModelCheckBox.right;
  187. anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2
  188. anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2
  189. }
  190. }
  191. }
  192. Repeater {
  193. model: ListModel {
  194. id: typesLegenModel
  195. Component.onCompleted:
  196. {
  197. typesLegenModel.append({
  198. label: catalog.i18nc("@label", "Show Travels"),
  199. initialValue: view_settings.show_travel_moves,
  200. preference: "layerview/show_travel_moves",
  201. colorId: "layerview_move_combing"
  202. });
  203. typesLegenModel.append({
  204. label: catalog.i18nc("@label", "Show Helpers"),
  205. initialValue: view_settings.show_helpers,
  206. preference: "layerview/show_helpers",
  207. colorId: "layerview_support"
  208. });
  209. typesLegenModel.append({
  210. label: catalog.i18nc("@label", "Show Shell"),
  211. initialValue: view_settings.show_skin,
  212. preference: "layerview/show_skin",
  213. colorId: "layerview_inset_0"
  214. });
  215. typesLegenModel.append({
  216. label: catalog.i18nc("@label", "Show Infill"),
  217. initialValue: view_settings.show_infill,
  218. preference: "layerview/show_infill",
  219. colorId: "layerview_infill"
  220. });
  221. }
  222. }
  223. CheckBox {
  224. id: legendModelCheckBox
  225. checked: model.initialValue
  226. onClicked: {
  227. UM.Preferences.setValue(model.preference, checked);
  228. }
  229. Rectangle {
  230. anchors.verticalCenter: parent.verticalCenter
  231. anchors.right: legendModelCheckBox.right
  232. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  233. width: UM.Theme.getSize("layerview_legend_size").width
  234. height: UM.Theme.getSize("layerview_legend_size").height
  235. color: UM.Theme.getColor(model.colorId)
  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 + UM.Theme.getSize("default_lining").height
  242. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  243. style: UM.Theme.styles.checkbox
  244. Label
  245. {
  246. text: label
  247. font: UM.Theme.getFont("default")
  248. elide: Text.ElideRight
  249. color: UM.Theme.getColor("setting_control_text")
  250. anchors.verticalCenter: parent.verticalCenter
  251. anchors.left: legendModelCheckBox.left;
  252. anchors.right: legendModelCheckBox.right;
  253. anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2
  254. anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2
  255. }
  256. }
  257. }
  258. CheckBox {
  259. checked: view_settings.only_show_top_layers
  260. onClicked: {
  261. UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0);
  262. }
  263. text: catalog.i18nc("@label", "Only Show Top Layers")
  264. visible: UM.LayerView.compatibilityMode
  265. style: UM.Theme.styles.checkbox
  266. }
  267. CheckBox {
  268. checked: view_settings.top_layer_count == 5
  269. onClicked: {
  270. UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1);
  271. }
  272. text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top")
  273. visible: UM.LayerView.compatibilityMode
  274. style: UM.Theme.styles.checkbox
  275. }
  276. Repeater {
  277. model: ListModel {
  278. id: typesLegenModelNoCheck
  279. Component.onCompleted:
  280. {
  281. typesLegenModelNoCheck.append({
  282. label: catalog.i18nc("@label", "Top / Bottom"),
  283. colorId: "layerview_skin",
  284. });
  285. typesLegenModelNoCheck.append({
  286. label: catalog.i18nc("@label", "Inner Wall"),
  287. colorId: "layerview_inset_x",
  288. });
  289. }
  290. }
  291. Label {
  292. text: label
  293. visible: view_settings.show_legend
  294. id: typesLegendModelLabel
  295. Rectangle {
  296. anchors.verticalCenter: parent.verticalCenter
  297. anchors.right: typesLegendModelLabel.right
  298. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  299. width: UM.Theme.getSize("layerview_legend_size").width
  300. height: UM.Theme.getSize("layerview_legend_size").height
  301. color: UM.Theme.getColor(model.colorId)
  302. border.width: UM.Theme.getSize("default_lining").width
  303. border.color: UM.Theme.getColor("lining")
  304. visible: view_settings.show_legend
  305. }
  306. Layout.fillWidth: true
  307. Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height
  308. Layout.preferredWidth: UM.Theme.getSize("layerview_row").width
  309. color: UM.Theme.getColor("setting_control_text")
  310. font: UM.Theme.getFont("default")
  311. }
  312. }
  313. }
  314. LayerSlider {
  315. id: slider
  316. width: UM.Theme.getSize("slider_handle").width
  317. height: UM.Theme.getSize("layerview_menu_size").height
  318. anchors {
  319. top: parent.bottom
  320. topMargin: UM.Theme.getSize("slider_layerview_margin").height
  321. right: layerViewMenu.right
  322. rightMargin: UM.Theme.getSize("slider_layerview_margin").width
  323. }
  324. // custom properties
  325. upperValue: UM.LayerView.currentLayer
  326. lowerValue: UM.LayerView.minimumLayer
  327. maximumValue: UM.LayerView.numLayers
  328. handleSize: UM.Theme.getSize("slider_handle").width
  329. trackThickness: UM.Theme.getSize("slider_groove").width
  330. trackColor: UM.Theme.getColor("slider_groove")
  331. trackBorderColor: UM.Theme.getColor("slider_groove_border")
  332. upperHandleColor: UM.Theme.getColor("slider_handle")
  333. lowerHandleColor: UM.Theme.getColor("slider_handle")
  334. rangeHandleColor: UM.Theme.getColor("slider_groove_fill")
  335. handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width
  336. layersVisible: UM.LayerView.layerActivity && CuraApplication.platformActivity ? true : false
  337. // update values when layer data changes
  338. Connections {
  339. target: UM.LayerView
  340. onMaxLayersChanged: slider.setUpperValue(UM.LayerView.currentLayer)
  341. onMinimumLayerChanged: slider.setLowerValue(UM.LayerView.minimumLayer)
  342. onCurrentLayerChanged: slider.setUpperValue(UM.LayerView.currentLayer)
  343. }
  344. // make sure the slider handlers show the correct value after switching views
  345. Component.onCompleted: {
  346. slider.setLowerValue(UM.LayerView.minimumLayer)
  347. slider.setUpperValue(UM.LayerView.currentLayer)
  348. }
  349. }
  350. }
  351. FontMetrics {
  352. id: fontMetrics
  353. font: UM.Theme.getFont("default")
  354. }
  355. }