Sun, 20 Jul 2025 22:04:39 +0200
update toolkit, adjust UI code
/* * 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; }