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