Skip to content

Commit 7198cdd

Browse files
Implement durationMode in TimeSpinner3D (#4379)
* Implemented durationMode in TimeSpinner3D Added setDurationMode(boolean) logic to toggle duration mode (0-24h range, no meridiem). Updated addComponents to include "hours" and "minutes" labels when in duration mode. Updated rebuildHours to adjust startHour/endHour for duration mode. Verified with TimeSpinner3DTest. * Implemented durationMode in TimeSpinner3D and added unit test. - In `TimeSpinner3D.java`: - Implemented `setDurationMode(boolean)` to update state and rebuild UI. - Updated `addComponents` to add "hours" and "minutes" labels in duration mode. - Updated `rebuildHours` to set correct hour range (0-24) for duration mode. - Added `TimeSpinner3DTest.java` in `maven/core-unittests` to verify duration mode behavior. --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
1 parent e5f712e commit 7198cdd

File tree

2 files changed

+98
-10
lines changed

2 files changed

+98
-10
lines changed

CodenameOne/src/com/codename1/ui/spinner/TimeSpinner3D.java

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -156,17 +156,30 @@ void addComponents() {
156156
setLayout(new LayeredLayout());
157157
addComponent(hour);
158158

159-
addComponent(minute);
160159
LayeredLayout ll = (LayeredLayout) getLayout();
161-
if (showMeridiem) {
162-
//content.addComponent(createSeparator());
163-
addComponent(amPM);
164-
ll.setInsets(hour, "0 67% 0 0")
165-
.setInsets(minute, "0 33% 0 33%")
166-
.setInsets(amPM, "0 0 0 67%");
160+
if (durationMode) {
161+
Label hoursLabel = new Label(getUIManager().localize("hours", "hours"), "TimeSpinnerHoursLabel");
162+
Label minutesLabel = new Label(getUIManager().localize("minutes", "minutes"), "TimeSpinnerMinutesLabel");
163+
addComponent(hoursLabel);
164+
addComponent(minute);
165+
addComponent(minutesLabel);
166+
167+
ll.setInsets(hour, "0 75% 0 0");
168+
ll.setInsets(hoursLabel, "0 50% 0 25%");
169+
ll.setInsets(minute, "0 25% 0 50%");
170+
ll.setInsets(minutesLabel, "0 0 0 75%");
167171
} else {
168-
ll.setInsets(hour, "0 50% 0 0")
169-
.setInsets(minute, "0 0 0 50%");
172+
addComponent(minute);
173+
if (showMeridiem) {
174+
//content.addComponent(createSeparator());
175+
addComponent(amPM);
176+
ll.setInsets(hour, "0 67% 0 0")
177+
.setInsets(minute, "0 33% 0 33%")
178+
.setInsets(amPM, "0 0 0 67%");
179+
} else {
180+
ll.setInsets(hour, "0 50% 0 0")
181+
.setInsets(minute, "0 0 0 50%");
182+
}
170183
}
171184

172185

@@ -352,7 +365,10 @@ public void setShowMeridiem(boolean showMeridiem) {
352365
}
353366

354367
private void rebuildHours() {
355-
if (showMeridiem) {
368+
if (durationMode) {
369+
startHour = 0;
370+
endHour = 24;
371+
} else if (showMeridiem) {
356372
startHour = 1;
357373
endHour = 12;
358374
} else {
@@ -449,6 +465,27 @@ public void setCurrentMeridiem(boolean currentMeridiem) {
449465
}
450466
}
451467

468+
/**
469+
* Duration mode uses the time spinner to indicate a duration in hours and minutes
470+
*
471+
* @return the durationMode
472+
*/
473+
public boolean isDurationMode() {
474+
return durationMode;
475+
}
476+
477+
/**
478+
* Duration mode uses the time spinner to indicate a duration in hours and minutes
479+
*
480+
* @param durationMode the durationMode to set
481+
*/
482+
public void setDurationMode(boolean durationMode) {
483+
this.durationMode = durationMode;
484+
if (durationMode) {
485+
showMeridiem = false;
486+
}
487+
rebuildHours();
488+
}
452489

453490
/**
454491
* Show or hide the hours spinner.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.codename1.ui.spinner;
2+
3+
import com.codename1.ui.Component;
4+
import com.codename1.ui.Display;
5+
import com.codename1.ui.Form;
6+
import com.codename1.ui.Label;
7+
import com.codename1.ui.layouts.LayeredLayout;
8+
import com.codename1.junit.UITestBase;
9+
import org.junit.jupiter.api.Assertions;
10+
import org.junit.jupiter.api.Test;
11+
12+
public class TimeSpinner3DTest extends UITestBase {
13+
14+
@Test
15+
public void testDurationMode() {
16+
TimeSpinner3D ts = new TimeSpinner3D();
17+
ts.setDurationMode(true);
18+
19+
Assertions.assertTrue(ts.isDurationMode(), "durationMode should be true");
20+
Assertions.assertFalse(ts.isShowMeridiem(), "showMeridiem should be false in duration mode");
21+
22+
// Check components
23+
// In duration mode we expect: Hour spinner, Hour label, Minute spinner, Minute label
24+
// That is 4 components.
25+
26+
Assertions.assertEquals(4, ts.getComponentCount(), "Should have 4 components in duration mode");
27+
28+
boolean foundHoursLabel = false;
29+
boolean foundMinutesLabel = false;
30+
31+
for (int i = 0; i < ts.getComponentCount(); i++) {
32+
Component c = ts.getComponentAt(i);
33+
if (c instanceof Label) {
34+
Label l = (Label) c;
35+
if ("hours".equals(l.getText()) || "hours".equals(l.getUIID())) {
36+
if ("TimeSpinnerHoursLabel".equals(l.getUIID())) {
37+
foundHoursLabel = true;
38+
}
39+
}
40+
if ("minutes".equals(l.getText()) || "minutes".equals(l.getUIID())) {
41+
if ("TimeSpinnerMinutesLabel".equals(l.getUIID())) {
42+
foundMinutesLabel = true;
43+
}
44+
}
45+
}
46+
}
47+
48+
Assertions.assertTrue(foundHoursLabel, "Should find hours label");
49+
Assertions.assertTrue(foundMinutesLabel, "Should find minutes label");
50+
}
51+
}

0 commit comments

Comments
 (0)