// SPDX-FileCopyrightText: Copyright (c) Kitware Inc.
// SPDX-FileCopyrightText: Copyright (c) Sandia Corporation
// SPDX-License-Identifier: BSD-3-Clause

#ifndef pqSignalAdaptors_h
#define pqSignalAdaptors_h

#include <QObject>
#include <QString>
#include <QVariant>
class QComboBox;
class QSlider;
class QTextEdit;
class QSpinBox;

#include "pqWidgetsModule.h"

/**
 * signal adaptor to allow getting/setting/observing of a pseudo 'currentText' property of a combo
 * box
 * the QComboBox currentIndexChanged signal is forwarded to this currentTextChanged signal
 */
class PQWIDGETS_EXPORT pqSignalAdaptorComboBox : public QObject
{
  Q_OBJECT
  Q_PROPERTY(QString currentText READ currentText WRITE setCurrentText)
  Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex)
  Q_PROPERTY(QVariant currentData READ currentData WRITE setCurrentData)

public:
  /**
   * constructor requires a QComboBox
   */
  pqSignalAdaptorComboBox(QComboBox* p);
  /**
   * get the current text of a combo box
   */
  QString currentText() const;
  /**
   * get the current index of a combo box.
   */
  int currentIndex() const;

  /**
   * get the user data associated with the current index.
   */
  QVariant currentData() const;

Q_SIGNALS:
  /**
   * signal text changed in a combo box
   */
  void currentTextChanged(const QString&);

  void currentIndexChanged(int);
public Q_SLOTS:
  /**
   * set the current text of a combo box (actually sets the index for the text)
   */
  void setCurrentText(const QString&);

  /**
   * set the current index of a combox box.
   */
  void setCurrentIndex(int index);

  /**
   * set the current index to the index with user data as the argument.
   */
  void setCurrentData(const QVariant& data);

protected:
};

/**
 * signal adaptor to allow getting/setting/observing of an rgba (0.0 - 1.0 range)
 */
class PQWIDGETS_EXPORT pqSignalAdaptorColor : public QObject
{
  Q_OBJECT
  Q_PROPERTY(QVariant color READ color WRITE setColor)
public:
  /**
   * constructor requires a QObject, the name of the QColor property, and a signal for property
   * changes
   */
  pqSignalAdaptorColor(QObject* p, const char* colorProperty, const char* signal, bool enableAlpha);
  /**
   * get the color components
   */
  QVariant color() const;

Q_SIGNALS:
  /**
   * signal the color changed
   */
  void colorChanged(const QVariant&);
public Q_SLOTS:
  /**
   * set the red component
   */
  void setColor(const QVariant&);
protected Q_SLOTS:
  void handleColorChanged();

protected: // NOLINT(readability-redundant-access-specifiers)
  QByteArray PropertyName;
  bool EnableAlpha;
};

/**
 * signal adaptor to adjust the range of a int slider to (0.0-1.0)
 */
class PQWIDGETS_EXPORT pqSignalAdaptorSliderRange : public QObject
{
  Q_OBJECT
  Q_PROPERTY(double value READ value WRITE setValue)
public:
  /**
   * constructor requires the QSlider
   */
  pqSignalAdaptorSliderRange(QSlider* p);
  /**
   * get the value components
   */
  double value() const;
Q_SIGNALS:
  /**
   * signal the color changed
   */
  void valueChanged(double val);
public Q_SLOTS:
  /**
   * set the red component
   */
  void setValue(double val);
protected Q_SLOTS:
  void handleValueChanged();
};

/**
 * signal adaptor that lets us get the text inside a QTextEdit
 */
class PQWIDGETS_EXPORT pqSignalAdaptorTextEdit : public QObject
{
  Q_OBJECT
  Q_PROPERTY(QString text READ text WRITE setText)

public:
  /**
   * constructor
   */
  pqSignalAdaptorTextEdit(QTextEdit* p);
  /**
   * get the current text
   */
  QString text() const;
Q_SIGNALS:
  /**
   * signal text changed
   */
  void textChanged();
public Q_SLOTS:
  void setText(const QString&);

protected:
};

/**
 * signal adaptor that lets us set/get the integer value inside a QSpinBox
 */
class PQWIDGETS_EXPORT pqSignalAdaptorSpinBox : public QObject
{
  Q_OBJECT
  Q_PROPERTY(int value READ value WRITE setValue)

public:
  /**
   * constructor
   */
  pqSignalAdaptorSpinBox(QSpinBox* p);
  /**
   * get the current text
   */
  int value() const;
Q_SIGNALS:
  /**
   * signal text changed
   */
  void valueChanged(int val);
public Q_SLOTS:
  void setValue(int val);

protected:
};

#endif
