void ABCIntervalIntWidget::setValue(const ABCInterval<int> &value)
{
    ABCInterval<int> oldValue = this->value();

    if (value != oldValue)
    {
        blockSignals(true);
        if (value.isFixedValue())
        {
            ui->ABC->setChecked(false);
            ui->stackedWidget->setCurrentWidget(ui->singleValuePage);
            ui->singleValue->setValue(value.firstBound());
        }
        else
        {
            ui->ABC->setChecked(true);
            ui->stackedWidget->setCurrentWidget(ui->intervalPage);
            ui->firstBound->setValue(value.firstBound());
            ui->secondBound->setValue(value.secondBound());
            ui->distribution->setCurrentIndex(value.distribution());
        }
        blockSignals(false);

        ABCInterval<int> newValue = this->value();

        // Signals emmiting
        if (newValue.isFixedValue())
        {
            emit singleValueChanged(newValue.minimum());
        }
        else
        {
            if (newValue.firstBound() != oldValue.firstBound())
            {
                emit firstBoundChanged(newValue.firstBound());
            }
            if (newValue.secondBound() != oldValue.secondBound())
            {
                emit secondBoundChanged(newValue.secondBound());
            }
            if (newValue.distribution() != newValue.distribution())
            {
                emit distributionChanged(newValue.distribution());
            }
        }
        emit valueChanged(newValue);
    }
}
void ABCIntervalIntWidget::on_distribution_currentIndexChanged(int index)
{
    emit distributionChanged(index);
    emit valueChanged(this->value());
}
RandomDistributionDialog::RandomDistributionDialog(QWidget *parent)
    : QDialog(parent), ui_(new Ui_RandomDistributionDialog) {
  ui_->setupUi(this);
  setWindowIcon(IconLoader::load("edit-random-dist", IconLoader::LightDark));
  ui_->distFormulaLabel->setAlignment(Qt::AlignCenter);
  setModal(true);

  // Theaming based pixmap loading
  (IconLoader::lumen_ < 100)
      ? distFormulaPath = QString(":icons/dark/distribution/")
      : distFormulaPath = QString(":icons/light/distribution/");

  // Set layout margins
  ui_->verticalLayout->setContentsMargins(3, 3, 3, 3);
  ui_->gridLayout->setContentsMargins(0, 0, 0, 0);

  // Add distributions
  ui_->distComboBox->addItem(tr("Gaussian Distribution"), Gaussian);
  // ui_->distComboBox->addItem(tr("Gaussian Tail Distribution"));
  ui_->distComboBox->addItem(tr("Exponential Distribution"), Exponential);
  ui_->distComboBox->addItem(tr("Laplace Distribution"), Laplace);
  ui_->distComboBox->addItem(tr("Exponential Power Distribution"),
                             ExponentialPower);
  ui_->distComboBox->addItem(tr("Cauchy Distribution"), Cauchy);
  ui_->distComboBox->addItem(tr("Rayleigh Distribution"), Rayleigh);
  ui_->distComboBox->addItem(tr("Rayleigh Tail Distribution"), RayleighTail);
  ui_->distComboBox->addItem(tr("Landau Distribution"), Landau);
  ui_->distComboBox->addItem(tr("Levy alpha-stable Distribution"),
                             LevyAlphaStable);
  ui_->distComboBox->addItem(tr("Levy skew alpha-stable Distribution"),
                             LevySkewAlphaStable);
  ui_->distComboBox->addItem(tr("Gamma Distribution"), Gamma);
  ui_->distComboBox->addItem(tr("Flat (Uniform) Distribution"), Flat);
  ui_->distComboBox->addItem(tr("Lognormal Distribution"), Lognormal);
  ui_->distComboBox->addItem(tr("Chi-squared Distribution"), ChiSquared);
  /*ui_->distComboBox->addItem(tr("F-distribution"), F);
  ui_->distComboBox->addItem(tr("t-distribution"), t);
  ui_->distComboBox->addItem(tr("Beta Distribution"), Beta);
  ui_->distComboBox->addItem(tr("Logistic Distribution"), Logistic);
  ui_->distComboBox->addItem(tr("Pareto Distribution"), Pareto);
  // ui_->distComboBox->addItem(tr("Spherical Vector Distributions"));
  ui_->distComboBox->addItem(tr("Weibull Distribution"), Weibull);
  ui_->distComboBox->addItem(tr("Type-1 Gumbel Distribution"), Gumbel1);
  ui_->distComboBox->addItem(tr("Type-2 Gumbel Distribution"), Gumbel2);
  // ui_->distComboBox->addItem(tr("Dirichlet Distribution"));
  // ui_->distComboBox->addItem(tr("General Discrete Distributions"));
  ui_->distComboBox->addItem(tr("Poisson Distribution"), Poisson);
  ui_->distComboBox->addItem(tr("Bernoulli Distribution"), Bernoulli);
  ui_->distComboBox->addItem(tr("Binomial Distribution"), Binomial);
  // ui_->distComboBox->addItem(tr("Multinomial Distribution"));
  ui_->distComboBox->addItem(tr("Negative Binomial Distribution"),
                             NegativeBinomial);
  ui_->distComboBox->addItem(tr("Pascal Distribution"), Pascal);
  ui_->distComboBox->addItem(tr("Geometric Distribution"), Geometric);
  ui_->distComboBox->addItem(tr("Hypergeometric Distribution"), Hypergeometric);
  ui_->distComboBox->addItem(tr("Logarithmic Distribution"), Logarithmic);*/

  // Load settings
  QSettings settings;
  settings.beginGroup("General");
  int distIndex = settings.value("RandomDistribution", 0).toInt();
  ui_->distComboBox->setCurrentIndex(distIndex);
  distributionChanged(distIndex);
  ui_->parameter1DbleSpinBox->setValue(
      settings.value("RandomDistributionParam-1").toDouble());
  ui_->parameter2DbleSpinBox->setValue(
      settings.value("RandomDistributionParam-2").toDouble());
  ui_->parameter3DbleSpinBox->setValue(
      settings.value("RandomDistributionParam-3").toDouble());
  settings.endGroup();

  // set parameter bounds (move to switch case for more control)
  ui_->parameter1DbleSpinBox->setMinimum(-INFINITY);
  ui_->parameter1DbleSpinBox->setMaximum(std::numeric_limits<double>::max());
  ui_->parameter2DbleSpinBox->setMinimum(-INFINITY);
  ui_->parameter2DbleSpinBox->setMaximum(std::numeric_limits<double>::max());
  ui_->parameter3DbleSpinBox->setMinimum(-INFINITY);
  ui_->parameter3DbleSpinBox->setMaximum(std::numeric_limits<double>::max());

  // Slot connections
  connect(ui_->distComboBox, SIGNAL(currentIndexChanged(int)),
          SLOT(distributionChanged(int)));
  connect(ui_->randomDistributionButtonBox, SIGNAL(accepted()), SLOT(ok()));
  connect(ui_->randomDistributionButtonBox, SIGNAL(rejected()), SLOT(cancel()));
}