1// SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4import QtQuick.Controls 2.0
5import QtQuick 2.6
6import "../../constants" 1.0
7
8SpinBox {
9    id: control
10    from: -41
11    to: 41
12    anchors.verticalCenter: parent.verticalCenter
13    editable: false
14
15    background: Rectangle {
16        implicitWidth: 160
17        color: Num.sysPalette.base
18    }
19
20    contentItem: Text {
21        z: 2
22        text: control.textFromValue(control.value, control.locale)
23        anchors.verticalCenter: parent.verticalCenter
24
25        font: control.font
26        color: Num.sysPalette.text
27        horizontalAlignment: Qt.AlignHCenter
28        verticalAlignment: Qt.AlignVCenter
29    }
30
31    property int spacingg: 0
32
33    Connections {
34        target: up
35        onPressed: {
36            console.log(up.pressed)
37        }
38    }
39
40    up.indicator: Rectangle {
41        z: 0
42        x: control.mirrored ? -spacingg : parent.width - width + spacingg
43        anchors.verticalCenter: parent.verticalCenter
44        implicitWidth: 37
45        implicitHeight: 37
46        color: up.pressed || !enabled ? Num.sysPalette.light : Num.sysPalette.base
47        border.color: up.pressed || !enabled ? Num.sysPalette.base : Num.sysPalette.light
48        radius: 5
49
50        Text {
51            z: 1
52            text: "+"
53            font.pixelSize: control.font.pixelSize * 2
54            color: up.pressed || !enabled ? Num.sysPalette.dark : Num.sysPalette.text
55            anchors.fill: parent
56            fontSizeMode: Text.Fit
57            horizontalAlignment: Text.AlignHCenter
58            verticalAlignment: Text.AlignVCenter
59        }
60    }
61
62    down.indicator: Rectangle {
63        z: 0
64        x: control.mirrored ? parent.width - width + spacingg : -spacingg
65        anchors.verticalCenter: parent.verticalCenter
66        implicitWidth: 37
67        implicitHeight: 37
68        color: down.pressed || !enabled ? Num.sysPalette.light : Num.sysPalette.base
69        border.color: down.pressed || !enabled ? Num.sysPalette.base : Num.sysPalette.light
70        radius: 5
71
72        Text {
73            text: "-"
74            font.pixelSize: control.font.pixelSize * 2
75            color: down.pressed || !enabled ? Num.sysPalette.dark : Num.sysPalette.text
76            anchors.fill: parent
77            fontSizeMode: Text.Fit
78            horizontalAlignment: Text.AlignHCenter
79            verticalAlignment: Text.AlignVCenter
80        }
81    }
82
83    property bool daysOnly: false
84
85    onDaysOnlyChanged: {
86        setDaysOnly()
87    }
88
89    Component.onCompleted: {
90        setDaysOnly()
91    }
92
93    property double secs_per_day: 86400.0
94    property double sidereal_year: 31558149.77
95    property double tropical_year: 31556925.19
96
97    property var timeString: []
98    property var timeScale: []
99
100    //TimeUnit control
101    property int unitValue: 1
102    property int allunits: 8
103    property int dayunits: 5
104    property int minUnitValue
105    property int maxUnitValue
106    property var unitStep: []
107
108    function setDaysOnly() {
109        var i = 0; //index for timeScale values
110
111        timeScale[0] = 0.0
112        if(!daysOnly) {
113            timeScale[1] = 0.1;          // 0.1 sec
114            timeScale[2] = 0.25;         // 0.25 sec
115            timeScale[3] = 0.5;          // 0.5 sec
116            timeScale[4] = 1.0;          // 1 sec (real-time)
117            timeScale[5] = 2.0;          // 2 sec
118            timeScale[6] = 5.0;          // 5 sec
119            timeScale[7] = 10.0;         // 10 sec
120            timeScale[8] = 20.0;         // 20 sec
121            timeScale[9] = 30.0;         // 30 sec
122            timeScale[10] = 60.0;        // 1 min
123            timeScale[11] = 120.0;       // 2 min
124            timeScale[12] = 300.0;       // 5 min
125            timeScale[13] = 600.0;       // 10 min
126            timeScale[14] = 900.0;       // 15 min
127            timeScale[15] = 1800.0;      // 30 min
128            timeScale[16] = 3600.0;      // 1 hr
129            timeScale[17] = 7200.0;      // 2 hr
130            timeScale[18] = 10800.0;     // 3 hr
131            timeScale[19] = 21600.0;     // 6 hr
132            timeScale[20] = 43200.0;     // 12 hr
133            i = 20;
134        }
135
136        timeScale[i+1] = 86164.1;     // 23 hr 56 min
137        timeScale[i+2] = secs_per_day;     // 1 day
138        timeScale[i+3] = 2.*secs_per_day;  // 2 days
139        timeScale[i+4] = 3.*secs_per_day;  // 3 days
140        timeScale[i+5] = 5.*secs_per_day;  // 5 days
141        timeScale[i+6] = 7.*secs_per_day;  // 1 week
142        timeScale[i+7] = 14.*secs_per_day; //2 weeks
143        timeScale[i+8] = 21.*secs_per_day; //3 weeks
144        //Months aren't a simple measurement of time; I'll just use fractions of a year
145        timeScale[i+9] = sidereal_year/12.0; // 1 month
146        timeScale[i+10] = sidereal_year/6.0;  // 2 months
147        timeScale[i+11] = 0.25*sidereal_year; // 3 months
148        timeScale[i+12] = sidereal_year/3.0;  // 4 months
149        timeScale[i+13] = 0.5*sidereal_year;  // 6 months
150        timeScale[i+14] = 0.75*sidereal_year; // 9 months
151        timeScale[i+15] = sidereal_year;       // 1 year
152        timeScale[i+16] = 2.0*sidereal_year;   // 2 years
153        timeScale[i+17] = 3.0*sidereal_year;   // 3 years
154        timeScale[i+18] = 5.0*sidereal_year;   // 5 years
155        timeScale[i+19] = 10.0*sidereal_year;  // 10 years
156        timeScale[i+20] = 25.0*sidereal_year;  // 25 years
157        timeScale[i+21] = 50.0*sidereal_year;  // 50 years
158        timeScale[i+22] = 100.0*sidereal_year; // 100 years
159
160        timeString = []
161        if ( ! daysOnly ) {
162            timeString.push( i18n( "0 secs" ));
163            timeString.push( i18n( "0.1 secs" ));
164            timeString.push( i18n( "0.25 secs" ));
165            timeString.push( i18n( "0.5 secs" ));
166            timeString.push( i18n( "1 sec" ));
167            timeString.push( i18n( "2 secs" ));
168            timeString.push( i18n( "5 secs" ));
169            timeString.push( i18n( "10 secs" ));
170            timeString.push( i18n( "20 secs" ));
171            timeString.push( i18n( "30 secs" ));
172            timeString.push( i18n( "1 min" ));
173            timeString.push( i18n( "2 mins" ));
174            timeString.push( i18n( "5 mins" ));
175            timeString.push( i18n( "10 mins" ));
176            timeString.push( i18n( "15 mins" ));
177            timeString.push( i18n( "30 mins" ));
178            timeString.push( i18n( "1 hour" ));
179            timeString.push( i18n( "2 hrs" ));
180            timeString.push( i18n( "3 hrs" ));
181            timeString.push( i18n( "6 hrs" ));
182            timeString.push( i18n( "12 hrs" ));
183        } else {
184            timeString.push( i18n( "0 days" ));
185        }
186        timeString.push( i18n( "1 sid day" ));
187        timeString.push( i18n( "1 day" ));
188        timeString.push( i18n( "2 days" ));
189        timeString.push( i18n( "3 days" ));
190        timeString.push( i18n( "5 days" ));
191        timeString.push( i18n( "1 week" ));
192        timeString.push( i18n( "2 wks" ));
193        timeString.push( i18n( "3 wks" ));
194        timeString.push( i18n( "1 month" ));
195        timeString.push( i18n( "2 mths" ));
196        timeString.push( i18n( "3 mths" ));
197        timeString.push( i18n( "4 mths" ));
198        timeString.push( i18n( "6 mths" ));
199        timeString.push( i18n( "9 mths" ));
200        timeString.push( i18n( "1 year" ));
201        timeString.push( i18n( "2 yrs" ));
202        timeString.push( i18n( "3 yrs" ));
203        timeString.push( i18n( "5 yrs" ));
204        timeString.push( i18n( "10 yrs" ));
205        timeString.push( i18n( "25 yrs" ));
206        timeString.push( i18n( "50 yrs" ));
207        timeString.push( i18n( "100 yrs" ));
208
209        if ( !daysOnly ) {
210            from = -41
211            to = 41
212        } else {
213            from = -21
214            to = 21
215        }
216
217        if ( daysOnly ) {
218            minUnitValue = 1-dayunits
219            maxUnitValue = dayunits-1
220            unitValue = 1 // Start out with days units
221
222            unitStep[0] = 0;
223            unitStep[1] = 1;
224            unitStep[2] = 5;
225            unitStep[3] = 8;
226            unitStep[4] = 14;
227        } else {
228            minUnitValue = 1-allunits
229            maxUnitValue = allunits-1
230            unitValue = 1 // Start out with seconds units
231
232            unitStep[0] = 0;
233            unitStep[1] = 4;
234            unitStep[2] = 10;
235            unitStep[3] = 16;
236            unitStep[4] = 21;
237            unitStep[5] = 25;
238            unitStep[6] = 28;
239            unitStep[7] = 34;
240        }
241
242        value = 4
243    }
244
245    function increaseTimeUnit() {
246        if(unitValue < maxUnitValue) {
247            unitValue = unitValue + 1
248            value = getUnitValue()
249        }
250    }
251
252    function decreaseTimeUnit() {
253        if(unitValue > minUnitValue) {
254            unitValue = unitValue - 1
255            value = getUnitValue()
256        }
257    }
258
259    function getUnitValue() {
260        var uval;
261        if ( unitValue >= 0 ) uval = unitStep[ unitValue ];
262        else uval = -1*unitStep[ Math.abs( unitValue ) ];
263        return uval;
264    }
265
266    function unitValueFromNum( val ) {
267        if ( val >= 0 ) return unitStep[ val ];
268        else return -1*unitStep[ Math.abs( val ) ];
269    }
270
271    function getTimeScale() {
272        return value > 0 ? timeScale[ value ] : -1.*timeScale[ Math.abs(value) ];
273    }
274
275    function reportChange() {
276        console.log("Reporting new timestep value: " + getTimeScale())
277        KStarsLite.scaleChanged( getTimeScale() )
278    }
279
280    textFromValue: function(value) {
281        var result
282        var posval = Math.abs( value )
283        if ( posval > timeString.length - 1 ) posval = 4;
284
285        result = timeString[ posval ];
286
287    if ( value < 0 ) { result = '-' + result; }
288
289        reportChange()
290        return result;
291    }
292
293    valueFromText: function(text) {
294
295        for (var i = 0; i < timeString.length; ++i) {
296            if (text === timeString[i]) return i
297            if (text.substring(1) === timeString[i]) return -1*i
298        }
299
300        return 0
301    }
302}
303