Sidebar.qml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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.1
  5. import QtQuick.Controls.Styles 1.1
  6. import QtQuick.Layouts 1.1
  7. import UM 1.2 as UM
  8. import Cura 1.0 as Cura
  9. import "Menus"
  10. Rectangle
  11. {
  12. id: base;
  13. property int currentModeIndex;
  14. property bool monitoringPrint: false
  15. property bool hideSettings: PrintInformation.preSliced
  16. Connections
  17. {
  18. target: Printer
  19. onShowPrintMonitor:
  20. {
  21. base.monitoringPrint = show;
  22. showSettings.checked = !show;
  23. showMonitor.checked = show;
  24. }
  25. }
  26. // Is there an output device for this printer?
  27. property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0
  28. property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands
  29. color: UM.Theme.getColor("sidebar")
  30. UM.I18nCatalog { id: catalog; name:"cura"}
  31. Timer {
  32. id: tooltipDelayTimer
  33. interval: 500
  34. repeat: false
  35. property var item
  36. property string text
  37. onTriggered:
  38. {
  39. base.showTooltip(base, {x:1, y:item.y}, text);
  40. }
  41. }
  42. function showTooltip(item, position, text)
  43. {
  44. tooltip.text = text;
  45. position = item.mapToItem(base, position.x, position.y);
  46. tooltip.show(position);
  47. }
  48. function hideTooltip()
  49. {
  50. tooltip.hide();
  51. }
  52. function strPadLeft(string, pad, length) {
  53. return (new Array(length + 1).join(pad) + string).slice(-length);
  54. }
  55. function getPrettyTime(time)
  56. {
  57. var hours = Math.floor(time / 3600)
  58. time -= hours * 3600
  59. var minutes = Math.floor(time / 60);
  60. time -= minutes * 60
  61. var seconds = Math.floor(time);
  62. var finalTime = strPadLeft(hours, "0", 2) + ':' + strPadLeft(minutes,'0',2)+ ':' + strPadLeft(seconds,'0',2);
  63. return finalTime;
  64. }
  65. MouseArea
  66. {
  67. anchors.fill: parent
  68. acceptedButtons: Qt.AllButtons;
  69. onWheel:
  70. {
  71. wheel.accepted = true;
  72. }
  73. }
  74. // Printer selection and mode selection buttons for changing between Setting & Monitor print mode
  75. Rectangle
  76. {
  77. id: sidebarHeaderBar
  78. anchors.left: parent.left
  79. anchors.right: parent.right
  80. height: childrenRect.height
  81. color: UM.Theme.getColor("sidebar_header_bar")
  82. Row
  83. {
  84. anchors.left: parent.left
  85. anchors.right: parent.right
  86. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  87. spacing: UM.Theme.getSize("default_margin").width
  88. ToolButton
  89. {
  90. id: machineSelection
  91. text: Cura.MachineManager.activeMachineName
  92. width: parent.width - (showSettings.width + showMonitor.width + 2 * UM.Theme.getSize("default_margin").width)
  93. height: UM.Theme.getSize("sidebar_header").height
  94. tooltip: Cura.MachineManager.activeMachineName
  95. anchors.verticalCenter: parent.verticalCenter
  96. style: ButtonStyle {
  97. background: Rectangle {
  98. color: {
  99. if(control.pressed) {
  100. return UM.Theme.getColor("sidebar_header_active");
  101. } else if(control.hovered) {
  102. return UM.Theme.getColor("sidebar_header_hover");
  103. } else {
  104. return UM.Theme.getColor("sidebar_header_bar");
  105. }
  106. }
  107. Behavior on color { ColorAnimation { duration: 50; } }
  108. Rectangle {
  109. id: underline;
  110. anchors.left: parent.left
  111. anchors.right: parent.right
  112. anchors.bottom: parent.bottom
  113. height: UM.Theme.getSize("sidebar_header_highlight").height
  114. color: UM.Theme.getColor("sidebar_header_highlight_hover")
  115. visible: control.hovered || control.pressed
  116. }
  117. UM.RecolorImage {
  118. id: downArrow
  119. anchors.verticalCenter: parent.verticalCenter
  120. anchors.right: parent.right
  121. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  122. width: UM.Theme.getSize("standard_arrow").width
  123. height: UM.Theme.getSize("standard_arrow").height
  124. sourceSize.width: width
  125. sourceSize.height: width
  126. color: UM.Theme.getColor("text_reversed")
  127. source: UM.Theme.getIcon("arrow_bottom")
  128. }
  129. Label {
  130. id: sidebarComboBoxLabel
  131. color: UM.Theme.getColor("text_reversed")
  132. text: control.text;
  133. elide: Text.ElideRight;
  134. anchors.left: parent.left;
  135. anchors.leftMargin: UM.Theme.getSize("default_margin").width
  136. anchors.right: downArrow.left;
  137. anchors.rightMargin: control.rightMargin;
  138. anchors.verticalCenter: parent.verticalCenter;
  139. font: UM.Theme.getFont("large")
  140. }
  141. }
  142. label: Label{}
  143. }
  144. menu: PrinterMenu { }
  145. }
  146. Button
  147. {
  148. id: showSettings
  149. width: height
  150. height: UM.Theme.getSize("sidebar_header").height
  151. onClicked: monitoringPrint = false
  152. iconSource: UM.Theme.getIcon("tab_settings");
  153. checkable: true
  154. checked: !monitoringPrint
  155. exclusiveGroup: sidebarHeaderBarGroup
  156. property string tooltipText: catalog.i18nc("@tooltip", "<b>Print Setup</b><br/><br/>Edit or review the settings for the active print job.")
  157. onHoveredChanged: {
  158. if (hovered)
  159. {
  160. tooltipDelayTimer.item = showSettings
  161. tooltipDelayTimer.text = tooltipText
  162. tooltipDelayTimer.start();
  163. }
  164. else
  165. {
  166. tooltipDelayTimer.stop();
  167. base.hideTooltip();
  168. }
  169. }
  170. style: UM.Theme.styles.sidebar_header_tab
  171. }
  172. Button
  173. {
  174. id: showMonitor
  175. width: height
  176. height: UM.Theme.getSize("sidebar_header").height
  177. onClicked: monitoringPrint = true
  178. iconSource: {
  179. if(!printerConnected)
  180. return UM.Theme.getIcon("tab_monitor");
  181. else if(!printerAcceptsCommands)
  182. return UM.Theme.getIcon("tab_monitor_unknown");
  183. if(Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance")
  184. {
  185. return UM.Theme.getIcon("tab_monitor_busy");
  186. }
  187. switch(Cura.MachineManager.printerOutputDevices[0].jobState)
  188. {
  189. case "printing":
  190. case "pre_print":
  191. case "wait_cleanup":
  192. return UM.Theme.getIcon("tab_monitor_busy");
  193. case "ready":
  194. case "":
  195. return UM.Theme.getIcon("tab_monitor_connected")
  196. case "paused":
  197. return UM.Theme.getIcon("tab_monitor_paused")
  198. case "error":
  199. return UM.Theme.getIcon("tab_monitor_stopped")
  200. case "offline":
  201. return UM.Theme.getIcon("tab_monitor_offline")
  202. default:
  203. return UM.Theme.getIcon("tab_monitor")
  204. }
  205. }
  206. checkable: true
  207. checked: monitoringPrint
  208. exclusiveGroup: sidebarHeaderBarGroup
  209. property string tooltipText: catalog.i18nc("@tooltip", "<b>Print Monitor</b><br/><br/>Monitor the state of the connected printer and the print job in progress.")
  210. onHoveredChanged: {
  211. if (hovered)
  212. {
  213. tooltipDelayTimer.item = showMonitor
  214. tooltipDelayTimer.text = tooltipText
  215. tooltipDelayTimer.start();
  216. }
  217. else
  218. {
  219. tooltipDelayTimer.stop();
  220. base.hideTooltip();
  221. }
  222. }
  223. style: UM.Theme.styles.sidebar_header_tab
  224. }
  225. ExclusiveGroup { id: sidebarHeaderBarGroup }
  226. }
  227. }
  228. SidebarHeader {
  229. id: header
  230. width: parent.width
  231. anchors.top: sidebarHeaderBar.bottom
  232. onShowTooltip: base.showTooltip(item, location, text)
  233. onHideTooltip: base.hideTooltip()
  234. }
  235. Rectangle {
  236. id: headerSeparator
  237. width: parent.width
  238. visible: !monitoringPrint
  239. height: visible ? UM.Theme.getSize("sidebar_lining").height : 0
  240. color: UM.Theme.getColor("sidebar_lining")
  241. anchors.top: header.bottom
  242. anchors.topMargin: visible ? UM.Theme.getSize("default_margin").height : 0
  243. }
  244. onCurrentModeIndexChanged:
  245. {
  246. UM.Preferences.setValue("cura/active_mode", currentModeIndex);
  247. if(modesListModel.count > base.currentModeIndex)
  248. {
  249. sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "replace": true });
  250. }
  251. }
  252. Label {
  253. id: settingsModeLabel
  254. text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified");
  255. anchors.left: parent.left
  256. anchors.leftMargin: UM.Theme.getSize("default_margin").width;
  257. anchors.top: headerSeparator.bottom
  258. anchors.topMargin: UM.Theme.getSize("default_margin").height
  259. width: parent.width * 0.45 - 2 * UM.Theme.getSize("default_margin").width
  260. font: UM.Theme.getFont("large")
  261. color: UM.Theme.getColor("text")
  262. visible: !monitoringPrint
  263. elide: Text.ElideRight
  264. }
  265. Rectangle {
  266. id: settingsModeSelection
  267. width: parent.width * 0.55
  268. height: UM.Theme.getSize("sidebar_header_mode_toggle").height
  269. anchors.right: parent.right
  270. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  271. anchors.top: headerSeparator.bottom
  272. anchors.topMargin: UM.Theme.getSize("default_margin").height
  273. visible: !monitoringPrint && !hideSettings
  274. Component{
  275. id: wizardDelegate
  276. Button {
  277. height: settingsModeSelection.height
  278. anchors.left: parent.left
  279. anchors.leftMargin: model.index * (settingsModeSelection.width / 2)
  280. anchors.verticalCenter: parent.verticalCenter
  281. width: 0.5 * parent.width - (model.showFilterButton ? toggleFilterButton.width : 0)
  282. text: model.text
  283. exclusiveGroup: modeMenuGroup;
  284. checkable: true;
  285. checked: base.currentModeIndex == index
  286. onClicked: base.currentModeIndex = index
  287. onHoveredChanged: {
  288. if (hovered)
  289. {
  290. tooltipDelayTimer.item = settingsModeSelection
  291. tooltipDelayTimer.text = model.tooltipText
  292. tooltipDelayTimer.start();
  293. }
  294. else
  295. {
  296. tooltipDelayTimer.stop();
  297. base.hideTooltip();
  298. }
  299. }
  300. style: ButtonStyle {
  301. background: Rectangle {
  302. border.width: UM.Theme.getSize("default_lining").width
  303. border.color: control.checked ? UM.Theme.getColor("toggle_checked_border") :
  304. control.pressed ? UM.Theme.getColor("toggle_active_border") :
  305. control.hovered ? UM.Theme.getColor("toggle_hovered_border") : UM.Theme.getColor("toggle_unchecked_border")
  306. color: control.checked ? UM.Theme.getColor("toggle_checked") :
  307. control.pressed ? UM.Theme.getColor("toggle_active") :
  308. control.hovered ? UM.Theme.getColor("toggle_hovered") : UM.Theme.getColor("toggle_unchecked")
  309. Behavior on color { ColorAnimation { duration: 50; } }
  310. Label {
  311. anchors.centerIn: parent
  312. color: control.checked ? UM.Theme.getColor("toggle_checked_text") :
  313. control.pressed ? UM.Theme.getColor("toggle_active_text") :
  314. control.hovered ? UM.Theme.getColor("toggle_hovered_text") : UM.Theme.getColor("toggle_unchecked_text")
  315. font: UM.Theme.getFont("default")
  316. text: control.text;
  317. }
  318. }
  319. label: Item { }
  320. }
  321. }
  322. }
  323. ExclusiveGroup { id: modeMenuGroup; }
  324. ListView{
  325. id: modesList
  326. property var index: 0
  327. model: modesListModel
  328. delegate: wizardDelegate
  329. anchors.top: parent.top
  330. anchors.left: parent.left
  331. width: parent.width
  332. }
  333. }
  334. Button
  335. {
  336. id: toggleFilterButton
  337. anchors.right: parent.right
  338. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  339. anchors.top: headerSeparator.bottom
  340. anchors.topMargin: UM.Theme.getSize("default_margin").height
  341. height: settingsModeSelection.height
  342. width: visible ? height : 0
  343. visible: !monitoringPrint && !hideSettings && modesListModel.get(base.currentModeIndex) != undefined && modesListModel.get(base.currentModeIndex).showFilterButton
  344. opacity: visible ? 1 : 0
  345. onClicked: sidebarContents.currentItem.toggleFilterField()
  346. style: ButtonStyle
  347. {
  348. background: Rectangle
  349. {
  350. border.width: UM.Theme.getSize("default_lining").width
  351. border.color: UM.Theme.getColor("toggle_checked_border")
  352. color: visible ? UM.Theme.getColor("toggle_checked") : UM.Theme.getColor("toggle_hovered")
  353. Behavior on color { ColorAnimation { duration: 50; } }
  354. }
  355. label: UM.RecolorImage
  356. {
  357. anchors.verticalCenter: parent.verticalCenter
  358. anchors.right: parent.right
  359. anchors.rightMargin: UM.Theme.getSize("default_margin").width / 2
  360. source: UM.Theme.getIcon("search")
  361. color: UM.Theme.getColor("toggle_checked_text")
  362. }
  363. }
  364. }
  365. Label {
  366. id: monitorLabel
  367. text: catalog.i18nc("@label","Printer Monitor");
  368. anchors.left: parent.left
  369. anchors.leftMargin: UM.Theme.getSize("default_margin").width;
  370. anchors.top: headerSeparator.bottom
  371. anchors.topMargin: UM.Theme.getSize("default_margin").height
  372. width: parent.width * 0.45
  373. font: UM.Theme.getFont("large")
  374. color: UM.Theme.getColor("text")
  375. visible: monitoringPrint
  376. }
  377. StackView
  378. {
  379. id: sidebarContents
  380. anchors.bottom: footerSeparator.top
  381. anchors.top: settingsModeSelection.bottom
  382. anchors.topMargin: UM.Theme.getSize("default_margin").height
  383. anchors.left: base.left
  384. anchors.right: base.right
  385. visible: !monitoringPrint && !hideSettings
  386. delegate: StackViewDelegate
  387. {
  388. function transitionFinished(properties)
  389. {
  390. properties.exitItem.opacity = 1
  391. }
  392. pushTransition: StackViewTransition
  393. {
  394. PropertyAnimation
  395. {
  396. target: enterItem
  397. property: "opacity"
  398. from: 0
  399. to: 1
  400. duration: 100
  401. }
  402. PropertyAnimation
  403. {
  404. target: exitItem
  405. property: "opacity"
  406. from: 1
  407. to: 0
  408. duration: 100
  409. }
  410. }
  411. }
  412. }
  413. Loader
  414. {
  415. anchors.bottom: footerSeparator.top
  416. anchors.top: monitorLabel.bottom
  417. anchors.topMargin: UM.Theme.getSize("default_margin").height
  418. anchors.left: base.left
  419. anchors.leftMargin: UM.Theme.getSize("default_margin").width
  420. anchors.right: base.right
  421. source: monitoringPrint ? "PrintMonitor.qml": "SidebarContents.qml"
  422. }
  423. Rectangle
  424. {
  425. id: footerSeparator
  426. width: parent.width
  427. height: UM.Theme.getSize("sidebar_lining").height
  428. color: UM.Theme.getColor("sidebar_lining")
  429. anchors.bottom: saveButton.top
  430. anchors.bottomMargin: UM.Theme.getSize("default_margin").height
  431. }
  432. SaveButton
  433. {
  434. id: saveButton
  435. implicitWidth: base.width
  436. implicitHeight: totalHeight
  437. anchors.bottom: parent.bottom
  438. visible: !monitoringPrint
  439. }
  440. MonitorButton
  441. {
  442. id: monitorButton
  443. implicitWidth: base.width
  444. implicitHeight: totalHeight
  445. anchors.bottom: parent.bottom
  446. visible: monitoringPrint
  447. }
  448. SidebarTooltip
  449. {
  450. id: tooltip;
  451. }
  452. ListModel
  453. {
  454. id: modesListModel;
  455. }
  456. SidebarSimple
  457. {
  458. id: sidebarSimple;
  459. visible: false;
  460. onShowTooltip: base.showTooltip(item, location, text)
  461. onHideTooltip: base.hideTooltip()
  462. }
  463. SidebarAdvanced
  464. {
  465. id: sidebarAdvanced;
  466. visible: false;
  467. onShowTooltip: base.showTooltip(item, location, text)
  468. onHideTooltip: base.hideTooltip()
  469. }
  470. Component.onCompleted:
  471. {
  472. modesListModel.append({
  473. text: catalog.i18nc("@title:tab", "Recommended"),
  474. tooltipText: catalog.i18nc("@tooltip", "<b>Recommended Print Setup</b><br/><br/>Print with the recommended settings for the selected printer, material and quality."),
  475. item: sidebarSimple,
  476. showFilterButton: false
  477. })
  478. modesListModel.append({
  479. text: catalog.i18nc("@title:tab", "Custom"),
  480. tooltipText: catalog.i18nc("@tooltip", "<b>Custom Print Setup</b><br/><br/>Print with finegrained control over every last bit of the slicing process."),
  481. item: sidebarAdvanced,
  482. showFilterButton: true
  483. })
  484. sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "immediate": true });
  485. var index = parseInt(UM.Preferences.getValue("cura/active_mode"))
  486. if(index)
  487. {
  488. currentModeIndex = index;
  489. }
  490. }
  491. UM.SettingPropertyProvider
  492. {
  493. id: machineExtruderCount
  494. containerStackId: Cura.MachineManager.activeMachineId
  495. key: "machine_extruder_count"
  496. watchedProperties: [ "value" ]
  497. storeIndex: 0
  498. }
  499. UM.SettingPropertyProvider
  500. {
  501. id: machineHeatedBed
  502. containerStackId: Cura.MachineManager.activeMachineId
  503. key: "machine_heated_bed"
  504. watchedProperties: [ "value" ]
  505. storeIndex: 0
  506. }
  507. }