1 /*
2  *  OpenSCAD (www.openscad.org)
3  *  Copyright (C) 2009-2014 Clifford Wolf <clifford@clifford.at> and
4  *                          Marius Kintel <marius@kintel.net>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  As a special exception, you have permission to link this program
12  *  with the CGAL library and distribute executables, as long as you
13  *  follow the requirements of the GNU GPL in regard to all of the
14  *  software in the executable aside from CGAL.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24  *
25  */
26 
27 #include <QWidget>
28 #include "ButtonConfigWidget.h"
29 #include "settings.h"
30 #include "QSettingsCached.h"
31 #include "input/InputDriverManager.h"
32 #include "SettingsWriter.h"
33 #include "WheelIgnorer.h"
34 
ButtonConfigWidget(QWidget * parent)35 ButtonConfigWidget::ButtonConfigWidget(QWidget *parent) : QWidget(parent)
36 {
37 	setupUi(this);
38 }
39 
~ButtonConfigWidget()40 ButtonConfigWidget::~ButtonConfigWidget()
41 {
42 }
43 
updateButtonState(int nr,bool pressed) const44 void ButtonConfigWidget::updateButtonState(int nr, bool pressed) const{
45 	QString style = pressed ? ButtonConfigWidget::ActiveStyleString : ButtonConfigWidget::EmptyString;
46 	std::string number = std::to_string(nr);
47 
48 	auto label = this->findChild<QLabel *>(QString("labelInputButton%1").arg(nr));
49 	if(label==nullptr) return;
50 	label->setStyleSheet(style);
51 }
52 
init()53 void ButtonConfigWidget::init() {
54 	for (int i = 0; i < InputEventMapper::getMaxButtons(); ++i ){
55 		std::string s = std::to_string(i);
56 		auto box = this->findChild<QComboBox *>(QString("comboBoxButton%1").arg(i));
57 		auto ent = Settings::Settings::inst()->getSettingEntryByName("button" +s);
58 		if(box && ent){
59 			initComboBox(box,*ent);
60 		}
61 	}
62 
63 	auto wheelIgnorer = new WheelIgnorer(this);
64 	auto comboBoxes = this->findChildren<QComboBox *>();
65 	for (auto comboBox : comboBoxes) {
66 		comboBox->installEventFilter(wheelIgnorer);
67 	}
68 
69 	initialized = true;
70 }
71 
on_comboBoxButton0_activated(int val)72 void ButtonConfigWidget::on_comboBoxButton0_activated(int val)
73 {
74 	applyComboBox(comboBoxButton0, val, Settings::Settings::inputButton0);
75         emit inputMappingChanged();
76 }
77 
on_comboBoxButton1_activated(int val)78 void ButtonConfigWidget::on_comboBoxButton1_activated(int val)
79 {
80 	applyComboBox(comboBoxButton1, val, Settings::Settings::inputButton1);
81         emit inputMappingChanged();
82 }
83 
on_comboBoxButton2_activated(int val)84 void ButtonConfigWidget::on_comboBoxButton2_activated(int val)
85 {
86 	applyComboBox(comboBoxButton2, val, Settings::Settings::inputButton2);
87         emit inputMappingChanged();
88 }
89 
on_comboBoxButton3_activated(int val)90 void ButtonConfigWidget::on_comboBoxButton3_activated(int val)
91 {
92 	applyComboBox(comboBoxButton3, val, Settings::Settings::inputButton3);
93         emit inputMappingChanged();
94 }
95 
on_comboBoxButton4_activated(int val)96 void ButtonConfigWidget::on_comboBoxButton4_activated(int val)
97 {
98 	applyComboBox(comboBoxButton4, val, Settings::Settings::inputButton4);
99         emit inputMappingChanged();
100 }
101 
on_comboBoxButton5_activated(int val)102 void ButtonConfigWidget::on_comboBoxButton5_activated(int val)
103 {
104 	applyComboBox(comboBoxButton5, val, Settings::Settings::inputButton5);
105         emit inputMappingChanged();
106 }
107 
on_comboBoxButton6_activated(int val)108 void ButtonConfigWidget::on_comboBoxButton6_activated(int val)
109 {
110 	applyComboBox(comboBoxButton6, val, Settings::Settings::inputButton6);
111         emit inputMappingChanged();
112 }
113 
on_comboBoxButton7_activated(int val)114 void ButtonConfigWidget::on_comboBoxButton7_activated(int val)
115 {
116 	applyComboBox(comboBoxButton7, val, Settings::Settings::inputButton7);
117         emit inputMappingChanged();
118 }
119 
on_comboBoxButton8_activated(int val)120 void ButtonConfigWidget::on_comboBoxButton8_activated(int val)
121 {
122 	applyComboBox(comboBoxButton8, val, Settings::Settings::inputButton8);
123         emit inputMappingChanged();
124 }
125 
on_comboBoxButton9_activated(int val)126 void ButtonConfigWidget::on_comboBoxButton9_activated(int val)
127 {
128 	applyComboBox(comboBoxButton9, val, Settings::Settings::inputButton9);
129         emit inputMappingChanged();
130 }
131 
on_comboBoxButton10_activated(int val)132 void ButtonConfigWidget::on_comboBoxButton10_activated(int val)
133 {
134 	applyComboBox(comboBoxButton10, val, Settings::Settings::inputButton10);
135         emit inputMappingChanged();
136 }
137 
on_comboBoxButton11_activated(int val)138 void ButtonConfigWidget::on_comboBoxButton11_activated(int val)
139 {
140 	applyComboBox(comboBoxButton11, val, Settings::Settings::inputButton11);
141         emit inputMappingChanged();
142 }
143 
on_comboBoxButton12_activated(int val)144 void ButtonConfigWidget::on_comboBoxButton12_activated(int val)
145 {
146 	applyComboBox(comboBoxButton12, val, Settings::Settings::inputButton12);
147         emit inputMappingChanged();
148 }
149 
on_comboBoxButton13_activated(int val)150 void ButtonConfigWidget::on_comboBoxButton13_activated(int val)
151 {
152 	applyComboBox(comboBoxButton13, val, Settings::Settings::inputButton13);
153         emit inputMappingChanged();
154 }
155 
on_comboBoxButton14_activated(int val)156 void ButtonConfigWidget::on_comboBoxButton14_activated(int val)
157 {
158 	applyComboBox(comboBoxButton14, val, Settings::Settings::inputButton14);
159         emit inputMappingChanged();
160 }
161 
on_comboBoxButton15_activated(int val)162 void ButtonConfigWidget::on_comboBoxButton15_activated(int val)
163 {
164 	applyComboBox(comboBoxButton15, val, Settings::Settings::inputButton15);
165         emit inputMappingChanged();
166 }
167 
applyComboBox(QComboBox * comboBox,int val,Settings::SettingsEntry & entry)168 void ButtonConfigWidget::applyComboBox(QComboBox *comboBox, int val, Settings::SettingsEntry& entry)
169 {
170 	QString s = comboBox->itemData(val).toString();
171 	Settings::Settings::inst()->set(entry, Value(s.toStdString()));
172 	writeSettings();
173 }
174 
updateComboBox(QComboBox * comboBox,const Settings::SettingsEntry & entry)175 void ButtonConfigWidget::updateComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry)
176 {
177 	Settings::Settings *s = Settings::Settings::inst();
178 
179 	const Value &value = s->get(entry);
180 	QString text = QString::fromStdString(value.toString());
181 	int idx = comboBox->findData(text);
182 	if (idx >= 0) {
183 		comboBox->setCurrentIndex(idx);
184 	} else {
185 		comboBox->addItem(QIcon::fromTheme("emblem-unreadable"), text + " " + _("(not supported)"), text);
186 		int defIdx = comboBox->findData(text);
187 		if (defIdx >= 0) {
188 			comboBox->setCurrentIndex(defIdx);
189 		} else {
190 			comboBox->setCurrentIndex(0);
191 		}
192 	}
193 }
194 
writeSettings()195 void ButtonConfigWidget::writeSettings()
196 {
197 	SettingsWriter settingsWriter;
198 	Settings::Settings::inst()->visit(settingsWriter);
199 }
200 
initComboBox(QComboBox * comboBox,const Settings::SettingsEntry & entry)201 void ButtonConfigWidget::initComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry)
202 {
203 	comboBox->clear();
204 
205 	// Create an empty icon, so that all comboboxes have the same alignment
206 	QPixmap map = QPixmap(16, 16);
207 	map.fill(Qt::transparent);
208 	const QIcon emptyIcon = QIcon(map);
209 
210 	for (const auto &v : entry.range().toVector()) {
211 		const auto icon = emptyIcon;
212 		const auto desc = QString::fromStdString(gettext(v[1].toString().c_str()));
213 		const auto actionName = QString::fromStdString(v[0].toString());
214 		comboBox->addItem(icon, desc, actionName);
215 	}
216 
217 	for (const auto &action : InputDriverManager::instance()->getActions()) {
218 		const auto icon = action.icon;
219 		const auto effectiveIcon = icon.isNull() ? emptyIcon : icon;
220 		const auto desc = QString(action.description).remove(QChar('&'));
221 		comboBox->addItem(effectiveIcon, desc, action.name);
222 	}
223 
224 	updateComboBox(comboBox, entry);
225 }
226 
updateStates()227 void ButtonConfigWidget::updateStates(){
228 	if(!initialized) return;
229 
230 	int cnt = InputDriverManager::instance()->getButtonCount();
231 	for (int i=0; i<InputEventMapper::getMaxButtons(); ++i) {
232 		auto label = this->findChild<QLabel *>(QString("labelInputButton%1").arg(i));
233 		QString style =(cnt <= i) ? ButtonConfigWidget::DisabledStyleString : ButtonConfigWidget::EmptyString;
234 		label->setStyleSheet(style);
235 	}
236 }
237