PerObjectSettingsPanel.qml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. // Copyright (c) 2015 Ultimaker B.V.
  2. // Uranium is released under the terms of the AGPLv3 or higher.
  3. import QtQuick 2.2
  4. import QtQuick.Controls 1.2
  5. import QtQuick.Controls.Styles 1.2
  6. import QtQuick.Window 2.2
  7. import UM 1.1 as UM
  8. Item {
  9. id: base;
  10. property int currentIndex: UM.ActiveTool.properties.getValue("SelectedIndex")
  11. UM.I18nCatalog { id: catalog; name: "cura"; }
  12. width: childrenRect.width;
  13. height: childrenRect.height;
  14. Column {
  15. id: items
  16. anchors.top: parent.top;
  17. anchors.left: parent.left;
  18. spacing: UM.Theme.getSize("default_margin").height;
  19. Column {
  20. id: customisedSettings
  21. spacing: UM.Theme.getSize("default_lining").height;
  22. width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height/2;
  23. Repeater {
  24. id: settings;
  25. model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings
  26. UM.SettingItem {
  27. width: UM.Theme.getSize("setting").width;
  28. height: UM.Theme.getSize("setting").height;
  29. name: model.label;
  30. type: model.type;
  31. value: model.value;
  32. description: model.description;
  33. unit: model.unit;
  34. valid: model.valid;
  35. visible: !model.global_only
  36. options: model.options
  37. indent: false
  38. style: UM.Theme.styles.setting_item;
  39. onItemValueChanged: {
  40. settings.model.setSettingValue(model.key, value)
  41. }
  42. Button
  43. {
  44. anchors.left: parent.right;
  45. width: UM.Theme.getSize("setting").height;
  46. height: UM.Theme.getSize("setting").height;
  47. onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key)
  48. style: ButtonStyle
  49. {
  50. background: Rectangle
  51. {
  52. color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor;
  53. UM.RecolorImage
  54. {
  55. anchors.verticalCenter: parent.verticalCenter
  56. anchors.horizontalCenter: parent.horizontalCenter
  57. width: parent.width/2
  58. height: parent.height/2
  59. sourceSize.width: width
  60. sourceSize.height: width
  61. color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button")
  62. source: UM.Theme.getIcon("cross1")
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }
  69. }
  70. Button
  71. {
  72. id: customise_settings_button;
  73. height: UM.Theme.getSize("setting").height;
  74. visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
  75. text: catalog.i18nc("@action:button", "Add Setting");
  76. style: ButtonStyle
  77. {
  78. background: Rectangle
  79. {
  80. width: control.width;
  81. height: control.height;
  82. border.width: UM.Theme.getSize("default_lining").width;
  83. border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") :
  84. control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
  85. color: control.pressed ? UM.Theme.getColor("action_button_active") :
  86. control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
  87. }
  88. label: Label
  89. {
  90. text: control.text;
  91. color: UM.Theme.getColor("setting_control_text");
  92. anchors.centerIn: parent
  93. }
  94. }
  95. onClicked: settingPickDialog.visible = true;
  96. Connections
  97. {
  98. target: UM.Preferences;
  99. onPreferenceChanged:
  100. {
  101. customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
  102. }
  103. }
  104. }
  105. }
  106. UM.Dialog {
  107. id: settingPickDialog
  108. title: catalog.i18nc("@title:window", "Pick a Setting to Customize")
  109. TextField {
  110. id: filter;
  111. anchors {
  112. top: parent.top;
  113. left: parent.left;
  114. right: parent.right;
  115. }
  116. placeholderText: catalog.i18nc("@label:textbox", "Filter...");
  117. onTextChanged: settingCategoriesModel.filter(text);
  118. }
  119. ScrollView {
  120. id: view;
  121. anchors {
  122. top: filter.bottom;
  123. left: parent.left;
  124. right: parent.right;
  125. bottom: parent.bottom;
  126. }
  127. Column {
  128. width: view.width - UM.Theme.getSize("default_margin").width * 2;
  129. height: childrenRect.height;
  130. Repeater {
  131. id: settingList;
  132. model: UM.SettingCategoriesModel { id: settingCategoriesModel; }
  133. delegate: Item {
  134. id: delegateItem;
  135. width: parent.width;
  136. height: childrenRect.height;
  137. visible: model.visible && settingsColumn.childrenHeight != 0 //If all children are hidden, the height is 0, and then the category header must also be hidden.
  138. ToolButton {
  139. id: categoryHeader;
  140. text: model.name;
  141. checkable: true;
  142. width: parent.width;
  143. onCheckedChanged: settingsColumn.state != "" ? settingsColumn.state = "" : settingsColumn.state = "collapsed";
  144. style: ButtonStyle {
  145. background: Rectangle
  146. {
  147. width: control.width;
  148. height: control.height;
  149. color: control.hovered ? palette.highlight : "transparent";
  150. }
  151. label: Row
  152. {
  153. spacing: UM.Theme.getSize("default_margin").width;
  154. Image
  155. {
  156. anchors.verticalCenter: parent.verticalCenter;
  157. source: control.checked ? UM.Theme.getIcon("arrow_right") : UM.Theme.getIcon("arrow_bottom");
  158. }
  159. Label
  160. {
  161. text: control.text;
  162. font.bold: true;
  163. color: control.hovered ? palette.highlightedText : palette.text;
  164. }
  165. }
  166. }
  167. }
  168. property variant settingsModel: model.settings;
  169. Column {
  170. id: settingsColumn;
  171. anchors.top: categoryHeader.bottom;
  172. property real childrenHeight:
  173. {
  174. var h = 0.0;
  175. for(var i in children)
  176. {
  177. var item = children[i];
  178. h += children[i].height;
  179. if(item.settingVisible)
  180. {
  181. if(i > 0)
  182. {
  183. h += spacing;
  184. }
  185. }
  186. }
  187. return h;
  188. }
  189. width: childrenRect.width;
  190. height: childrenHeight;
  191. Repeater {
  192. model: delegateItem.settingsModel;
  193. delegate: ToolButton {
  194. id: button;
  195. x: model.depth * UM.Theme.getSize("default_margin").width;
  196. text: model.name;
  197. tooltip: model.description;
  198. visible: !model.global_only
  199. height: model.global_only ? 0 : undefined
  200. onClicked: {
  201. var object_id = UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id;
  202. UM.ActiveTool.properties.getValue("Model").addSettingOverride(object_id, model.key);
  203. settingPickDialog.visible = false;
  204. }
  205. states: State {
  206. name: "filtered"
  207. when: model.filtered || !model.visible || !model.enabled
  208. PropertyChanges { target: button; height: 0; opacity: 0; }
  209. }
  210. }
  211. }
  212. states: State {
  213. name: "collapsed";
  214. PropertyChanges { target: settingsColumn; opacity: 0; height: 0; }
  215. }
  216. }
  217. }
  218. }
  219. }
  220. }
  221. rightButtons: [
  222. Button {
  223. text: catalog.i18nc("@action:button", "Cancel");
  224. onClicked: {
  225. settingPickDialog.visible = false;
  226. }
  227. }
  228. ]
  229. }
  230. SystemPalette { id: palette; }
  231. }