9 #include "indielement.h"
11 #include "indiproperty.h"
12 #include "indigroup.h"
13 #include "indidevice.h"
16 #include "ksnotification.h"
20 #include <KSqueezedTextLabel>
21 #include <KLocalizedString>
23 #include <KMessageBox>
25 #include <QButtonGroup>
28 #include <QDoubleSpinBox>
29 #include <QFileDialog>
31 #include <QPushButton>
34 extern const char *libindi_strings_context;
39 INDI_E::INDI_E(
INDI_P *gProp, INDI::Property dProp) :
QWidget(gProp), guiProp(gProp), dataProp(dProp)
43 EHBox->setContentsMargins(0, 0, 0, 0);
46 void INDI_E::buildSwitch(
QButtonGroup *groupB, ISwitch *sw)
49 label =
i18nc(libindi_strings_context, sw->label);
51 if (label ==
"(I18N_EMPTY_MESSAGE)")
57 label =
i18nc(libindi_strings_context, sw->name);
59 if (label ==
"(I18N_EMPTY_MESSAGE)")
62 if (groupB ==
nullptr)
65 switch (guiProp->getGUIType())
69 push_w->setStyleSheet(
":checked {background-color: darkGreen}");
70 push_w->setCheckable(
true);
75 guiProp->addWidget(push_w);
79 if (dataProp.getPermission() == IP_RO)
80 push_w->setEnabled(sw->s == ISS_ON);
90 guiProp->addWidget(check_w);
94 if (dataProp.getPermission() == IP_RO)
95 check_w->setEnabled(sw->s == ISS_ON);
104 void INDI_E::buildMenuItem(ISwitch *sw)
106 buildSwitch(
nullptr, sw);
109 void INDI_E::buildText(IText *itp)
113 label =
i18nc(libindi_strings_context, itp->label);
115 if (label ==
"(I18N_EMPTY_MESSAGE)")
121 label =
i18nc(libindi_strings_context, itp->name);
123 if (label ==
"(I18N_EMPTY_MESSAGE)")
129 text =
i18nc(libindi_strings_context, tp->text);
131 switch (dataProp.getPermission())
134 setupElementRead(ELEMENT_READ_WIDTH *
KStars::Instance()->devicePixelRatio());
135 setupElementWrite(ELEMENT_WRITE_WIDTH *
KStars::Instance()->devicePixelRatio());
140 setupElementRead(ELEMENT_FULL_WIDTH *
KStars::Instance()->devicePixelRatio());
144 setupElementWrite(ELEMENT_FULL_WIDTH *
KStars::Instance()->devicePixelRatio());
148 guiProp->addLayout(EHBox);
151 void INDI_E::setupElementLabel()
156 label_w->setMinimumWidth(ELEMENT_LABEL_WIDTH *
KStars::Instance()->devicePixelRatio());
157 label_w->setMaximumWidth(ELEMENT_LABEL_WIDTH *
KStars::Instance()->devicePixelRatio());
158 label_w->setMargin(2);
160 palette.
setColor(label_w->backgroundRole(),
QColor(224, 232, 238));
161 label_w->setPalette(palette);
164 label_w->setWordWrap(
true);
166 label_w->setStyleSheet(
"border: 1px solid grey; border-radius: 2px");
170 QFont tempFont(label_w->font());
171 tempFont.setPointSize(tempFont.pointSize() - MED_INDI_FONT);
172 label_w->setFont(tempFont);
175 label_w->setText(label);
177 EHBox->addWidget(label_w);
180 void INDI_E::syncSwitch()
187 switch (guiProp->getGUIType())
192 push_w->setChecked(
true);
194 buttonFont = push_w->font();
196 push_w->setFont(buttonFont);
198 if (dataProp.getPermission() == IP_RO)
199 push_w->setEnabled(
true);
203 push_w->setChecked(
false);
205 buttonFont = push_w->font();
207 push_w->setFont(buttonFont);
209 if (dataProp.getPermission() == IP_RO)
210 push_w->setEnabled(
false);
217 check_w->setChecked(
true);
218 if (dataProp.getPermission() == IP_RO)
219 check_w->setEnabled(
true);
223 check_w->setChecked(
false);
224 if (dataProp.getPermission() == IP_RO)
225 check_w->setEnabled(
false);
234 void INDI_E::syncText()
239 if (dataProp.getPermission() != IP_WO)
242 read_w->setText(
i18nc(libindi_strings_context, tp->text));
244 read_w->setText(tp->text);
249 write_w->setText(tp->text);
253 void INDI_E::syncNumber()
255 char iNumber[MAXINDIFORMAT];
256 if (np ==
nullptr || read_w ==
nullptr)
259 numberFormat(iNumber, np->format, np->value);
263 read_w->setText(text);
267 if (np->min != spin_w->minimum())
269 if (np->max != spin_w->maximum())
274 void INDI_E::updateTP()
279 IUSaveText(tp, write_w->text().toHtmlEscaped().toLatin1().constData());
282 void INDI_E::updateNP()
287 if (write_w !=
nullptr)
289 if (write_w->text().isEmpty())
292 f_scansexa(write_w->text().replace(
',',
'.').toLatin1().constData(), &(np->value));
296 if (spin_w !=
nullptr)
297 np->value = spin_w->value();
300 void INDI_E::setText(
const QString &newText)
305 switch (dataProp.getPermission())
308 read_w->setText(newText);
315 read_w->setText(newText);
316 write_w->setText(newText);
321 void INDI_E::setValue(
double value)
323 if (spin_w ==
nullptr || np ==
nullptr)
326 if (value < np->min || value > np->max)
329 spin_w->setValue(value);
333 void INDI_E::buildBLOB(IBLOB *ibp)
336 label =
i18nc(libindi_strings_context, ibp->label);
338 if (label ==
"(I18N_EMPTY_MESSAGE)")
344 label =
i18nc(libindi_strings_context, ibp->name);
346 if (label ==
"(I18N_EMPTY_MESSAGE)")
351 text =
i18n(
"INDI DATA STREAM");
353 switch (dataProp.getPermission())
356 setupElementRead(ELEMENT_READ_WIDTH *
KStars::Instance()->devicePixelRatio());
357 setupElementWrite(ELEMENT_WRITE_WIDTH *
KStars::Instance()->devicePixelRatio());
362 setupElementRead(ELEMENT_FULL_WIDTH *
KStars::Instance()->devicePixelRatio());
366 setupElementWrite(ELEMENT_FULL_WIDTH *
KStars::Instance()->devicePixelRatio());
371 guiProp->addLayout(EHBox);
374 void INDI_E::buildNumber(INumber *inp)
377 char iNumber[MAXINDIFORMAT];
380 label =
i18nc(libindi_strings_context, inp->label);
382 if (label ==
"(I18N_EMPTY_MESSAGE)")
388 label =
i18nc(libindi_strings_context, inp->name);
390 if (label ==
"(I18N_EMPTY_MESSAGE)")
393 numberFormat(iNumber, np->format, np->value);
398 if (np->step != 0 && (np->max - np->min) / np->step <= 100)
401 switch (dataProp.getPermission())
404 setupElementRead(ELEMENT_READ_WIDTH *
KStars::Instance()->devicePixelRatio());
406 setupElementScale(ELEMENT_WRITE_WIDTH *
KStars::Instance()->devicePixelRatio());
408 setupElementWrite(ELEMENT_WRITE_WIDTH *
KStars::Instance()->devicePixelRatio());
410 guiProp->addLayout(EHBox);
414 setupElementRead(ELEMENT_READ_WIDTH *
KStars::Instance()->devicePixelRatio());
415 guiProp->addLayout(EHBox);
420 setupElementScale(ELEMENT_FULL_WIDTH *
KStars::Instance()->devicePixelRatio());
422 setupElementWrite(ELEMENT_FULL_WIDTH *
KStars::Instance()->devicePixelRatio());
424 guiProp->addLayout(EHBox);
430 void INDI_E::buildLight(ILight *ilp)
433 label =
i18nc(libindi_strings_context, ilp->label);
435 if (label ==
"(I18N_EMPTY_MESSAGE)")
441 label =
i18nc(libindi_strings_context, ilp->name);
443 if (label ==
"(I18N_EMPTY_MESSAGE)")
446 led_w =
new KLed(
this);
447 led_w->setMaximumSize(16, 16);
448 led_w->setLook(KLed::Sunken);
452 EHBox->addWidget(led_w);
456 guiProp->addLayout(EHBox);
459 void INDI_E::syncLight()
484 void INDI_E::setupElementScale(
int length)
489 int steps =
static_cast<int>((np->max - np->min) / np->step);
491 spin_w->setRange(np->min, np->max);
492 spin_w->setSingleStep(np->step);
493 spin_w->setValue(np->value);
494 spin_w->setDecimals(3);
497 slider_w->setRange(0, steps);
498 slider_w->setPageStep(1);
499 slider_w->setValue(
static_cast<int>((np->value - np->min) / np->step));
501 connect(spin_w, SIGNAL(valueChanged(
double)),
this, SLOT(spinChanged(
double)));
502 connect(slider_w, SIGNAL(sliderMoved(
int)),
this, SLOT(sliderChanged(
int)));
509 spin_w->setMinimumWidth(
static_cast<int>(length * 0.45));
510 slider_w->setMinimumWidth(
static_cast<int>(length * 0.55));
512 EHBox->addWidget(slider_w);
513 EHBox->addWidget(spin_w);
516 void INDI_E::spinChanged(
double value)
518 int slider_value =
static_cast<int>((value - np->min) / np->step);
519 slider_w->setValue(slider_value);
522 void INDI_E::sliderChanged(
int value)
524 double spin_value = (value * np->step) + np->min;
525 spin_w->setValue(spin_value);
528 void INDI_E::setMin()
532 spin_w->setMinimum(np->min);
533 spin_w->setValue(np->value);
537 slider_w->setMaximum(
static_cast<int>((np->max - np->min) / np->step));
538 slider_w->setMinimum(0);
539 slider_w->setPageStep(1);
540 slider_w->setValue(
static_cast<int>((np->value - np->min) / np->step));
544 void INDI_E::setMax()
548 spin_w->setMaximum(np->max);
549 spin_w->setValue(np->value);
553 slider_w->setMaximum(
static_cast<int>((np->max - np->min) / np->step));
554 slider_w->setMinimum(0);
555 slider_w->setPageStep(1);
556 slider_w->setValue(
static_cast<int>((np->value - np->min) / np->step));
560 void INDI_E::setupElementWrite(
int length)
564 write_w->setMinimumWidth(length);
565 write_w->setMaximumWidth(length);
567 write_w->setText(text);
569 QObject::connect(write_w, SIGNAL(returnPressed()), guiProp, SLOT(sendText()));
570 EHBox->addWidget(write_w);
573 void INDI_E::setupElementRead(
int length)
576 read_w->setMinimumWidth(length);
578 read_w->setCursorPosition(0);
580 read_w->setReadOnly(
true);
581 read_w->setText(text);
583 EHBox->addWidget(read_w);
586 void INDI_E::setupBrowseButton()
591 browse_w->setMinimumWidth(MIN_SET_WIDTH *
KStars::Instance()->devicePixelRatio());
592 browse_w->setMaximumWidth(MAX_SET_WIDTH *
KStars::Instance()->devicePixelRatio());
594 EHBox->addWidget(browse_w);
598 void INDI_E::browseBlob()
618 format = filename.
mid(pos, filename.
length());
624 KSNotification::error(
i18n(
"Cannot open file %1 for reading", filename));
628 bp->bloblen = bp->size = fp.
size();
630 bp->blob =
static_cast<uint8_t *
>(realloc(bp->blob, bp->size));
631 if (bp->blob ==
nullptr)
633 KSNotification::error(
i18n(
"Not enough memory for file %1", filename));
643 QString INDI_E::getWriteField()
646 return write_w->text();
654 return read_w->text();