SettingCategory.qml 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. // Copyright (c) 2018 Ultimaker B.V.
  2. // Cura is released under the terms of the LGPLv3 or higher.
  3. import QtQuick 2.7
  4. import QtQuick.Controls 2.0
  5. import UM 1.1 as UM
  6. import Cura 1.0 as Cura
  7. Button
  8. {
  9. id: base
  10. anchors.left: parent.left
  11. anchors.right: parent.right
  12. anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width
  13. anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width
  14. background: Rectangle
  15. {
  16. id: backgroundRectangle
  17. implicitHeight: UM.Theme.getSize("section").height
  18. color: {
  19. if (base.color) {
  20. return base.color;
  21. } else if (!base.enabled) {
  22. return UM.Theme.getColor("setting_category_disabled");
  23. } else if (base.hovered && base.checkable && base.checked) {
  24. return UM.Theme.getColor("setting_category_active_hover");
  25. } else if (base.pressed || (base.checkable && base.checked)) {
  26. return UM.Theme.getColor("setting_category_active");
  27. } else if (base.hovered) {
  28. return UM.Theme.getColor("setting_category_hover");
  29. } else {
  30. return UM.Theme.getColor("setting_category");
  31. }
  32. }
  33. Behavior on color { ColorAnimation { duration: 50; } }
  34. Rectangle
  35. {
  36. id: backgroundLiningRectangle
  37. height: UM.Theme.getSize("default_lining").height
  38. width: parent.width
  39. anchors.bottom: parent.bottom
  40. color: {
  41. if (!base.enabled) {
  42. return UM.Theme.getColor("setting_category_disabled_border");
  43. } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) {
  44. return UM.Theme.getColor("setting_category_active_hover_border");
  45. } else if (base.pressed || (base.checkable && base.checked)) {
  46. return UM.Theme.getColor("setting_category_active_border");
  47. } else if (base.hovered || base.activeFocus) {
  48. return UM.Theme.getColor("setting_category_hover_border");
  49. } else {
  50. return UM.Theme.getColor("setting_category_border");
  51. }
  52. }
  53. }
  54. }
  55. signal showTooltip(string text)
  56. signal hideTooltip()
  57. signal contextMenuRequested()
  58. signal showAllHiddenInheritedSettings(string category_id)
  59. signal focusReceived()
  60. signal setActiveFocusToNextSetting(bool forward)
  61. property var focusItem: base
  62. contentItem: Item {
  63. anchors.fill: parent
  64. anchors.left: parent.left
  65. Label {
  66. id: settingNameLabel
  67. anchors
  68. {
  69. left: parent.left
  70. leftMargin: 2 * UM.Theme.getSize("default_margin").width + UM.Theme.getSize("section_icon").width
  71. right: parent.right;
  72. verticalCenter: parent.verticalCenter;
  73. }
  74. text: definition.label
  75. textFormat: Text.PlainText
  76. renderType: Text.NativeRendering
  77. font: UM.Theme.getFont("setting_category")
  78. color:
  79. {
  80. if (!base.enabled) {
  81. return UM.Theme.getColor("setting_category_disabled_text");
  82. } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) {
  83. return UM.Theme.getColor("setting_category_active_hover_text");
  84. } else if (base.pressed || (base.checkable && base.checked)) {
  85. return UM.Theme.getColor("setting_category_active_text");
  86. } else if (base.hovered || base.activeFocus) {
  87. return UM.Theme.getColor("setting_category_hover_text");
  88. } else {
  89. return UM.Theme.getColor("setting_category_text");
  90. }
  91. }
  92. fontSizeMode: Text.HorizontalFit
  93. minimumPointSize: 8
  94. }
  95. UM.RecolorImage
  96. {
  97. id: category_arrow
  98. anchors.verticalCenter: parent.verticalCenter
  99. anchors.right: parent.right
  100. anchors.rightMargin: UM.Theme.getSize("default_margin").width
  101. width: UM.Theme.getSize("standard_arrow").width
  102. height: UM.Theme.getSize("standard_arrow").height
  103. sourceSize.width: width
  104. sourceSize.height: width
  105. color:
  106. {
  107. if (!base.enabled) {
  108. return UM.Theme.getColor("setting_category_disabled_text");
  109. } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) {
  110. return UM.Theme.getColor("setting_category_active_hover_text");
  111. } else if (base.pressed || (base.checkable && base.checked)) {
  112. return UM.Theme.getColor("setting_category_active_text");
  113. } else if (base.hovered || base.activeFocus) {
  114. return UM.Theme.getColor("setting_category_hover_text");
  115. } else {
  116. return UM.Theme.getColor("setting_category_text");
  117. }
  118. }
  119. source: base.checked ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_left")
  120. }
  121. }
  122. UM.RecolorImage
  123. {
  124. id: icon
  125. anchors.verticalCenter: parent.verticalCenter
  126. anchors.left: parent.left
  127. anchors.leftMargin: UM.Theme.getSize("default_margin").width
  128. color:
  129. {
  130. if (!base.enabled) {
  131. return UM.Theme.getColor("setting_category_disabled_text");
  132. } else if((base.hovered || base.activeFocus) && base.checkable && base.checked) {
  133. return UM.Theme.getColor("setting_category_active_hover_text");
  134. } else if(base.pressed || (base.checkable && base.checked)) {
  135. return UM.Theme.getColor("setting_category_active_text");
  136. } else if(base.hovered || base.activeFocus) {
  137. return UM.Theme.getColor("setting_category_hover_text");
  138. } else {
  139. return UM.Theme.getColor("setting_category_text");
  140. }
  141. }
  142. source: UM.Theme.getIcon(definition.icon)
  143. width: UM.Theme.getSize("section_icon").width;
  144. height: UM.Theme.getSize("section_icon").height;
  145. sourceSize.width: width + 15 * screenScaleFactor
  146. sourceSize.height: width + 15 * screenScaleFactor
  147. }
  148. checkable: true
  149. checked: definition.expanded
  150. onClicked:
  151. {
  152. if (definition.expanded) {
  153. settingDefinitionsModel.collapse(definition.key);
  154. } else {
  155. settingDefinitionsModel.expandRecursive(definition.key);
  156. }
  157. //Set focus so that tab navigation continues from this point on.
  158. //NB: This must be set AFTER collapsing/expanding the category so that the scroll position is correct.
  159. forceActiveFocus();
  160. }
  161. onActiveFocusChanged:
  162. {
  163. if(activeFocus)
  164. {
  165. base.focusReceived();
  166. }
  167. }
  168. Keys.onTabPressed:
  169. {
  170. base.setActiveFocusToNextSetting(true)
  171. }
  172. Keys.onBacktabPressed:
  173. {
  174. base.setActiveFocusToNextSetting(false)
  175. }
  176. UM.SimpleButton
  177. {
  178. id: settingsButton
  179. visible: base.hovered || settingsButton.hovered
  180. height: Math.round(base.height * 0.6)
  181. width: Math.round(base.height * 0.6)
  182. anchors {
  183. right: inheritButton.visible ? inheritButton.left : parent.right
  184. // use 1.9 as the factor because there is a 0.1 difference between the settings and inheritance warning icons
  185. rightMargin: inheritButton.visible ? Math.round(UM.Theme.getSize("default_margin").width / 2) : category_arrow.width + Math.round(UM.Theme.getSize("default_margin").width * 1.9)
  186. verticalCenter: parent.verticalCenter
  187. }
  188. color: UM.Theme.getColor("setting_control_button")
  189. hoverColor: UM.Theme.getColor("setting_control_button_hover")
  190. iconSource: UM.Theme.getIcon("settings")
  191. onClicked: {
  192. Cura.Actions.configureSettingVisibility.trigger(definition)
  193. }
  194. }
  195. UM.SimpleButton
  196. {
  197. id: inheritButton
  198. anchors.verticalCenter: parent.verticalCenter
  199. anchors.right: parent.right
  200. anchors.rightMargin: category_arrow.width + UM.Theme.getSize("default_margin").width * 2
  201. visible:
  202. {
  203. if (Cura.SettingInheritanceManager.settingsWithInheritanceWarning.indexOf(definition.key) >= 0)
  204. {
  205. var children_with_override = Cura.SettingInheritanceManager.getChildrenKeysWithOverride(definition.key)
  206. for (var i = 0; i < children_with_override.length; i++)
  207. {
  208. if (!settingDefinitionsModel.getVisible(children_with_override[i]))
  209. {
  210. return true
  211. }
  212. }
  213. return false
  214. }
  215. return false
  216. }
  217. height: Math.round(parent.height / 2)
  218. width: height
  219. onClicked:
  220. {
  221. settingDefinitionsModel.expandRecursive(definition.key);
  222. base.checked = true;
  223. base.showAllHiddenInheritedSettings(definition.key);
  224. }
  225. color: UM.Theme.getColor("setting_control_button")
  226. hoverColor: UM.Theme.getColor("setting_control_button_hover")
  227. iconSource: UM.Theme.getIcon("notice")
  228. onEntered:
  229. {
  230. base.showTooltip(catalog.i18nc("@label","Some hidden settings use values different from their normal calculated value.\n\nClick to make these settings visible."))
  231. }
  232. onExited:
  233. {
  234. base.hideTooltip();
  235. }
  236. UM.I18nCatalog { id: catalog; name: "cura" }
  237. }
  238. }