--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/qt/entry.cpp Sun Jul 20 22:04:39 2025 +0200 @@ -0,0 +1,180 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2025 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "entry.h" + +#include "container.h" +#include "../common/context.h" + +#include <QDoubleSpinBox> +#include <QSpinBox> + + + +UIWIDGET ui_spinner_create(UiObject *obj, UiSpinnerArgs *args) { + UiContainerPrivate *ctn = ui_obj_container(obj); + UI_APPLY_LAYOUT(ctn->layout, args); + + bool use_double = false; + UiVar *var = NULL; + if(args->varname) { + var = uic_get_var(obj->ctx, args->varname); + if(var->type == UI_VAR_DOUBLE) { + use_double = true; + } else if(var->type == UI_VAR_RANGE) { + use_double = true; + } else if(var->type != UI_VAR_INTEGER) { + var = NULL; + fprintf(stderr, "UI Error: var '%s' has wrong type (must be int/double/range)\n", args->varname); + } + } + + if(!var) { + if(args->intvalue) { + var = uic_widget_var(obj->ctx, obj->ctx, args->intvalue, NULL, UI_VAR_INTEGER); + } else if(args->doublevalue) { + var = uic_widget_var(obj->ctx, obj->ctx, args->doublevalue, NULL, UI_VAR_DOUBLE); + use_double = true; + } else if(args->rangevalue) { + var = uic_widget_var(obj->ctx, obj->ctx, args->rangevalue, NULL, UI_VAR_RANGE); + use_double = true; + } else { + if(args->digits > 0) { + use_double = true; + } + } + } + + QAbstractSpinBox *widget = nullptr; + if(use_double) { + QDoubleSpinBox *spinbox = new QDoubleSpinBox(); + spinbox->setDecimals(args->digits); + if(args->step != 0) { + spinbox->setSingleStep(args->step); + } + widget = spinbox; + } else { + QSpinBox *spinbox = new QSpinBox(); + if(args->step != 0) { + spinbox->setSingleStep(args->step); + } + widget = spinbox; + } + + if(var) { + if(var->type == UI_VAR_INTEGER) { + UiInteger *value = (UiInteger*)var->value; + value->obj = widget; + if(value->value != 0) { + QSpinBox *spinbox = (QSpinBox*)widget; + spinbox->setValue(value->value); + } + value->get = ui_spinbox_int_get; + value->set = ui_spinbox_int_set; + } else if(var->type == UI_VAR_DOUBLE) { + UiDouble *value = (UiDouble*)var->value; + value->obj = widget; + if(value->value != 0) { + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)widget; + spinbox->setValue(value->value); + } + value->get = ui_spinbox_double_get; + value->set = ui_spinbox_double_set; + } else if(var->type == UI_VAR_RANGE) { + UiRange *value = (UiRange*)var->value; + value->obj = widget; + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)widget; + if(value->value != 0) { + spinbox->setValue(value->value); + } + if(value->min != value->max) { + spinbox->setRange(value->min, value->max); + } + if(value->extent != 0) { + spinbox->setSingleStep(value->extent); + } + value->get = ui_spinbox_range_get; + value->set = ui_spinbox_range_set; + value->setrange = ui_spinbox_range_setrange; + value->setextent = ui_spinbox_range_setextent; + } + } + + + ctn->add(widget); + return widget; +} + +int64_t ui_spinbox_int_get(UiInteger *i) { + QSpinBox *spinbox = (QSpinBox*)i->obj; + i->value = spinbox->value(); + return i->value; +} + +void ui_spinbox_int_set(UiInteger *i, int64_t value) { + QSpinBox *spinbox = (QSpinBox*)i->obj; + spinbox->setValue(value); + i->value = spinbox->value(); +} + +double ui_spinbox_double_get(UiDouble *d) { + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)d->obj; + d->value = spinbox->value(); + return d->value; +} + +void ui_spinbox_double_set(UiDouble *d, double value) { + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)d->obj; + spinbox->setValue(value); + d->value = spinbox->value(); +} + +double ui_spinbox_range_get(UiRange *range) { + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)range->obj; + range->value = spinbox->value(); + return range->value; +} + +void ui_spinbox_range_set(UiRange *range, double value) { + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)range->obj; + spinbox->setValue(value); + range->value = spinbox->value(); +} + +void ui_spinbox_range_setrange(UiRange *range, double min, double max) { + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)range->obj; + spinbox->setRange(min, max); + range->min = min; + range->max = max; +} + +void ui_spinbox_range_setextent(UiRange *range, double extent) { + QDoubleSpinBox *spinbox = (QDoubleSpinBox*)range->obj; + spinbox->setSingleStep(extent); + range->extent = extent; +}