Skip to content

Commit fbb267e

Browse files
committed
Support Switch elements for Dimmer items #168
1 parent 5da850f commit fbb267e

2 files changed

Lines changed: 44 additions & 18 deletions

File tree

source/sitemap/widgets/switch/SitemapSwitch.mc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ class SitemapSwitch extends SitemapWidget {
110110
var switchDisplayState = _mappings.lookup( _switchItem.getState() );
111111

112112
if( switchDisplayState == null ) {
113-
if( hasRemoteDisplayState() ) {
113+
if( _switchItem.getType().equals( "Dimmer" ) ) {
114+
switchDisplayState = _switchItem.getState() + _switchItem.getUnit();
115+
} else if( hasRemoteDisplayState() ) {
114116
// Second priority:
115117
// If we got the state from the server, then the remoteDisplayState
116118
// may be filled and we'll just use it.

source/user-interface/sitemap-menu/menu-items/switch/OnOffSwitchMenuItem.mc

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,27 @@ class OnOffSwitchMenuItem extends BaseSwitchMenuItem {
3434
processingMode as BasePageMenu.ProcessingMode
3535
) {
3636
var itemState = sitemapSwitch.getSwitchItem().getState();
37-
if( ! ( itemState.equals( SwitchItem.ITEM_STATE_ON )
38-
|| itemState.equals( SwitchItem.ITEM_STATE_OFF ) )
39-
) {
40-
throw new JsonParsingException( "Switch '" + sitemapSwitch.getLabel() + "': invalid state '" + itemState + "'" );
41-
}
4237
_isEnabled = parseItemState( itemState );
4338
_smallIcon = sitemapSwitch.getLinkedPage() != null;
4439
_stateDrawable = new OnOffStateDrawable( _isEnabled, _smallIcon );
4540

41+
if( sitemapSwitch.getSwitchItem().getType().equals( "Dimmer" ) ) {
42+
var displayState = sitemapSwitch.getDisplayState();
43+
System.println( displayState );
44+
var stateTextResponsive = sitemapSwitch.getSwitchItem().getType().equals( "Dimmer" )
45+
? sitemapSwitch.getDisplayState()
46+
: sitemapSwitch.hasRemoteDisplayState()
47+
? sitemapSwitch.getRemoteDisplayState()
48+
: null;
49+
System.println( stateTextResponsive );
50+
}
51+
4652
// Initialize the superclass
4753
// For the toggle switch we support the display
4854
// of a display state, if provided by the server
4955
BaseSwitchMenuItem.initialize( {
5056
:sitemapWidget => sitemapSwitch,
51-
:stateTextResponsive =>
52-
sitemapSwitch.hasRemoteDisplayState()
53-
? sitemapSwitch.getRemoteDisplayState()
54-
: null,
57+
:stateTextResponsive => getStateTextResponsive( sitemapSwitch ),
5558
:stateDrawable => _stateDrawable,
5659
:isActionable => false,
5760
:parent => parent,
@@ -68,16 +71,41 @@ class OnOffSwitchMenuItem extends BaseSwitchMenuItem {
6871
: SwitchItem.ITEM_STATE_ON;
6972
}
7073

74+
// Determines the display state of a toggle switch.
75+
// Special handling is applied for Dimmers, which are rendered manually
76+
// to ensure consistent appearance throughout the app.
77+
private static function getStateTextResponsive(
78+
sitemapSwitch as SitemapSwitch
79+
) as String? {
80+
return
81+
sitemapSwitch.getSwitchItem().getType().equals( "Dimmer" )
82+
? sitemapSwitch.getDisplayState()
83+
: sitemapSwitch.hasRemoteDisplayState()
84+
? sitemapSwitch.getRemoteDisplayState()
85+
: null;
86+
}
87+
7188
// Converts the string state to a Boolean for _isEnabled
72-
// ON => true; OFF => false
89+
// The widget supports string states:
90+
// "ON" => true; "OFF" => false
91+
// And numeric states:
92+
// 0 => false; 1-100 => true
7393
private function parseItemState( itemState as String ) as Boolean {
7494
if( itemState.equals( SwitchItem.ITEM_STATE_ON ) ) {
7595
return true;
7696
} else if( itemState.equals( SwitchItem.ITEM_STATE_OFF ) ) {
7797
return false;
7898
} else {
79-
throw new GeneralException( "OnOffSwitchMenuItem: state '" + itemState + "' is not supported" );
99+
var numericState = itemState.toNumber();
100+
if( numericState != null ) {
101+
if( numericState == 0 ) {
102+
return false;
103+
} else if( numericState > 0 && numericState <= 100 ) {
104+
return true;
105+
}
106+
}
80107
}
108+
throw new GeneralException( "OnOffSwitchMenuItem: state '" + itemState + "' is not supported" );
81109
}
82110

83111
// Update the member and Drawable
@@ -92,11 +120,7 @@ class OnOffSwitchMenuItem extends BaseSwitchMenuItem {
92120
public function updateWidget( sitemapWidget as SitemapWidget ) as Void {
93121
BaseSwitchMenuItem.updateWidget( sitemapWidget );
94122
_smallIcon = sitemapWidget.getLinkedPage() != null;
95-
// Update the display state provided by the server
96-
setStateTextResponsive(
97-
sitemapWidget.hasRemoteDisplayState()
98-
? sitemapWidget.getRemoteDisplayState()
99-
: null
100-
);
123+
// Update the display state
124+
setStateTextResponsive( getStateTextResponsive( sitemapWidget as SitemapSwitch ) );
101125
}
102126
}

0 commit comments

Comments
 (0)