-
Notifications
You must be signed in to change notification settings - Fork 4
/
sfv-gauge.c
80 lines (74 loc) · 2.35 KB
/
sfv-gauge.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
* SPDX-FileCopyrightText: 2021 Samuel Cuella <samuel.cuella@gmail.com>
*
* This file is part of SoFIS - an open source EFIS
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#include "sfv-gauge.h"
/* A base class for all gauges that have a single float value
* Factor out setting the value with regard to animations and
* getting the value while animations are running
*
* Derivatives are juste supposed to wrap up the setter function
* if some filtering/clamping is neeeded and let client code use
* the getter.
*
* No virtual functions are implemented, derivatives init/dispose
* with base_gauge_init/base_gauge_dispose as if they where direct
* descents of BaseGauge.
* */
/**
* @brief Sets the value either direcly or triggering a standard
* duration animation.
*
* Intented to be called be derivatives if wrapping is needed or
* by client code if the derived class doesn't provide a specific
* setter.
*
* @param self a SfvGauge or derivative
* @param value the value to set
* @animated true to use an animation from the current value to @p value
* @returns true on success, false otherwise.
*/
bool sfv_gauge_set_value(SfvGauge *self, float value, bool animated)
{
bool rv = true;
BaseAnimation *animation;
// printf("%s %p value: %f\n",__FUNCTION__, self, self->value);
if(animated){
if(BASE_GAUGE(self)->nanimations == 0){
animation = base_animation_new(TYPE_FLOAT, 1, &self->value);
base_gauge_add_animation(BASE_GAUGE(self), animation);
}else{
animation = BASE_GAUGE(self)->animations[0];
}
base_animation_start(animation, self->value, value, DEFAULT_DURATION);
}else{
if(value != self->value){
self->value = value;
BASE_GAUGE(self)->dirty = true;
}
}
return rv;
}
/**
* @brief Retreives the value that has been set to the gauge.
*
* If an animation is currently running, this function will return
* the value that has been set to the gauge and not the current frame's
* intermediate displayed value.
*
* @param self a SfvGauge
* @return the value
*/
float sfv_gauge_get_value(SfvGauge *self)
{
BaseAnimation *animation;
if(BASE_GAUGE(self)->nanimations > 0){
animation = BASE_GAUGE(self)->animations[0];
if(!animation->finished)
return animation->end;
}
return self->value;
}