blob: b4d78139e12e284cd93ca3982a9f0c2e7b5bbafe [file] [log] [blame]
Akron52ed22d2018-07-11 17:05:19 +02001define(['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {
2 "use strict";
3
Akrondefa5e82018-07-10 12:09:46 +02004 return {
5 /**
6 * Create button group
7 */
8 create : function (classes) {
9 return Object.create(this)._init(classes);
10 },
11
12 // Initialize button group
13 _init : function (classes) {
14 var e = document.createElement('div');
15 var cl = e.classList;
Akron4d926f12018-07-16 15:30:25 +020016 if (classes) {
Akrondefa5e82018-07-10 12:09:46 +020017 cl.add.apply(cl,classes);
18 };
19 cl.add('button-group');
20 this._element = e;
21 return this;
22 },
23
Akrond141a362018-07-10 18:12:13 +020024
Akrondefa5e82018-07-10 12:09:46 +020025 /**
26 * Return main element
27 */
28 element : function () {
29 return this._element;
30 },
31
Akrond141a362018-07-10 18:12:13 +020032
33 /**
hebasta40a85cf2020-07-15 18:10:08 +020034 * Upgrade this object to another object,
Akrond141a362018-07-10 18:12:13 +020035 * while private data stays intact.
hebasta40a85cf2020-07-15 18:10:08 +020036 *
Akrond141a362018-07-10 18:12:13 +020037 * @param {Object} An object with properties.
38 */
39 upgradeTo : function (props) {
40 for (var prop in props) {
41 this[prop] = props[prop];
42 };
43 return this;
44 },
45
46
Akrondefa5e82018-07-10 12:09:46 +020047 /**
48 * Add button in order
hebasta40a85cf2020-07-15 18:10:08 +020049 *
Akron52ed22d2018-07-11 17:05:19 +020050 * Returns the button element
Akrondefa5e82018-07-10 12:09:46 +020051 */
hebasta40a85cf2020-07-15 18:10:08 +020052 // TODO: Accept an object instead of a list
53 add : function (title, classes, cb, icon) {
Akrondefa5e82018-07-10 12:09:46 +020054 var b = this._element.addE('span');
Akrondefa5e82018-07-10 12:09:46 +020055 b.setAttribute('title',title);
56 if (classes !== undefined) {
57 b.classList.add.apply(b.classList, classes);
58 };
hebasta40a85cf2020-07-15 18:10:08 +020059
60 if (icon !== undefined){
61 b.setAttribute('data-icon', icon);
62 };
63
Akronbec4a6a2018-07-10 14:45:15 +020064 b.addE('span').addT(title);
Akrondefa5e82018-07-10 12:09:46 +020065
66 var that = this;
67 b.addEventListener('click', function (e) {
68
69 // Do not bubble
70 e.halt();
71
72 // Call callback
Akron52ed22d2018-07-11 17:05:19 +020073 var obj = that._bind || this;
74 obj.button = b;
75 cb.apply(obj, e)
Akrondefa5e82018-07-10 12:09:46 +020076 });
Akron52ed22d2018-07-11 17:05:19 +020077
78 return b;
Akrondefa5e82018-07-10 12:09:46 +020079 },
80
Akrond141a362018-07-10 18:12:13 +020081
Akrondefa5e82018-07-10 12:09:46 +020082 /**
Akron52ed22d2018-07-11 17:05:19 +020083 * Add button that spawns a list in order.
hebasta40a85cf2020-07-15 18:10:08 +020084 *
Akron52ed22d2018-07-11 17:05:19 +020085 * Returns the list object.
86 */
Akron8120ac12020-09-14 18:05:33 +020087 // TODO: Support icons by switching to a data object (see add())
Akron3b253d32018-07-15 10:16:06 +020088 addList : function (title, classes, itemClass = defaultItemClass) {
89 var list = treeMenuClass.create([], itemClass);
Akron52ed22d2018-07-11 17:05:19 +020090 this.add(title, classes, function (e) {
91 list.show();
92 list.button(this.button);
93 list.focus();
94 });
95
96 return list;
97 },
Akron858cbc82019-12-05 16:53:13 +010098
99 /**
100 * Add button that can toggle a state.
101 * The state has to be a state object.
102 */
103 addToggle : function (title, classes, state) {
104 let b = this._element.addE('span');
105 b.setAttribute('title',title);
106 if (classes !== undefined) {
107 b.classList.add.apply(b.classList, classes);
108 };
109
110 // Set check marker
111 let check = b.addE('span');
112 check.classList.add("check", "button-icon");
113 check.addE('span');
114
115 // Associate this object to state
116 // Add setState method to object
117 check.setState = function (value) {
118 if (value) {
119 this.classList.add("checked");
120 } else {
121 this.classList.remove("checked");
122 }
123 };
124 state.associate(check);
125
126 b.addE('span').addT(title);
127
128 let that = this;
129 b.addEventListener('click', function (e) {
130
131 // Do not bubble
132 e.halt();
133
134 // Toggle state
135 if (state.get()) {
136 state.set(false)
137 } else {
138 state.set(true);
139 }
140 });
141
142 return b;
143 },
Akron52ed22d2018-07-11 17:05:19 +0200144
145 /**
hebasta40a85cf2020-07-15 18:10:08 +0200146 * Bind an object to all callbacks of the button group.
147 * To get the button element inside the callback,
Akron52ed22d2018-07-11 17:05:19 +0200148 * use this.button
Akrondefa5e82018-07-10 12:09:46 +0200149 */
150 bind : function (obj) {
151 if (obj !== undefined) {
152 this._bind = obj;
Akronb23e2712018-07-13 18:17:37 +0200153 return this;
Akrondefa5e82018-07-10 12:09:46 +0200154 };
155 return this._bind || this;
Akrond141a362018-07-10 18:12:13 +0200156 },
157
158
159 /**
160 * Remove all defined buttons
161 */
162 clear : function () {
163 _removeChildren(this._element);
164 return this;
Akrondefa5e82018-07-10 12:09:46 +0200165 }
166 }
167});