Kalendářové hrátky
Pod dojmem toho, že když už mívá člověk často spuštěné Kodi, mohl by na něm vidět i nějaké zajímavé informce (datum, čas, počasí, ...) jsem doplnil do datumové části i jiné často očekávané informace, zejména pak informaci o tom, kdo má svátek, zda je volno a nově i informaci o tom, zda velké obchody mají zavřeno. Záhy jsem byl upozorněn na to, že je sice hezké vědět, že dnes mají ty obchody zavřeno, ale že
"taková informace je mi dnes už k prdu, daleko praktičtější informace je, zda obchody budou mít zavřeno zítra, kterou jsme ale měla dostat už včera". Proti tomu jsem nic namítat nemohl. Má, holka (jako ostatně většinou vždy), pravdu.
Kalendářové informace beru ze stránky
Vanio a používám api ve formátu json
https://svatky.vanio.cz/api/. Používám na to univerzální addon
Monitor, který běží na pozadí jako addon typu service a sbírá mi celou řadu infromací, které pak zobrazuji v Kodi. Co se týče informací o kalendáři, tak je addon zapisuje do Kodi windows properties
calendar_nameDay,
calendar_weekend,
calendar_holiday,
calendar_holidayName,
calendar_shops a v poslední době přidaného
calendar_shops_tomorrow.
Zobrazení data je ve skinu Estuary definováno v souboru
includes.xml, konkrétně v include
TopBar. Původní zobrazení data i dalších informací kolem něj sdružených jsem nahradil novým include
DateTimeWheater. Uvedu ho tady celý, protože obsahuje pár zajímavých postupů a na jeden tady zvlášť upozorním.
Kód:
<include name="DateTimeWheater"> <!-- EASY+ -->
<definition>
<control type="label"> <!-- EASY* [Monitor] System time - Monitor doesn't run -->
<font>font_clock</font>
<shadowcolor>text_shadow</shadowcolor>
<height>200</height>
<width>auto</width>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<label>[B]$INFO[System.Time(hh)]:$INFO[System.Time(mm)][/B]</label>
<!-- <visible>![Skin.HasSetting(show_monitor_runs) + String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)]</visible> <!-- EASY+ Monitor doesn't runs --> -->
<visible>![String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + System.HasAddon(service.monitor)]</visible>
</control>
<control type="label"> <!-- EASY+ [Monitor] System time - Monitor runs -->
<font>font_clock</font>
<height>200</height>
<width>auto</width>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<shadowcolor>text_shadow</shadowcolor>
<!-- <label>[COLOR red]$INFO[System.Time][/COLOR]</label> -->
<label>[B]$INFO[System.Time(hh)][COLOR red]:[/COLOR]$INFO[System.Time(mm)][/B]</label>
<!-- <visible>Skin.HasSetting(show_monitor_runs) + String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>String.IsEqual(Window(Home).Property(monitor_phase),ACTIVE) + System.HasAddon(service.monitor)</visible>
</control>
<control type="group"> <!-- EASY+ System time seconds -->
<width>45</width>
<control type="label">
<top>12</top>
<right>50</right>
<width>auto</width>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<shadowcolor>text_shadow</shadowcolor>
<label>[B]$INFO[System.Time(ss),:][/B]</label>
<!-- <visible>Skin.HasSetting(show_seconds)</visible> -->
</control>
</control>
<control type="group"> <!-- EASY+ Volume muted -->
<width>-10</width>
<control type="image" id="1">
<top>45</top>
<right>5</right>
<width>40</width>
<height>40</height>
<fadetime>300</fadetime>
<aspectratio aligny="center" align="center">keep</aspectratio>
<texture>dialogs/volume/mute.png</texture>
<visible>Player.Muted</visible>
</control>
</control>
<control type="group"> <!-- EASY+ Shops closed indicator -->
<visible>false</visible>
<!-- <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + System.HasAddon(service.monitor)</visible>
<width>16</width>
<control type="image">
<top>24</top>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
</control>
</control>
<control type="group"> <!-- EASY+ Shops closed indicator -->
<!-- <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>[String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) | String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)] + System.HasAddon(service.monitor)</visible>
<width>-10</width>
<control type="image">
<top>24</top>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
<visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + !String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
</control>
<control type="image">
<top>24</top>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
<visible>!String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
</control>
<control type="group">
<visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
<control type="image">
<top>22</top>
<left>2</left>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
</control>
<control type="image">
<top>24</top>
<left>-2</left>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
</control>
</control>
</control>
<control type="label"> <!-- EASY+ [Monitor] System Date - work day, not holiday -->
<font>font10</font>
<shadowcolor>text_shadow</shadowcolor>
<height>95</height>
<width>auto</width>
<aligny>center</aligny>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<label>$VAR[ShopsClosedSpace][B]$INFO[System.Date(dd. MMM)] $INFO[System.Date(DDD)][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
<!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + System.HasAddon(service.monitor)</visible>
</control>
<control type="label"> <!-- EASY+ [Monitor] System Date - weekend day, not holiday -->
<left>-25</left>
<font>font10</font>
<shadowcolor>text_shadow</shadowcolor>
<height>95</height>
<width>auto</width>
<aligny>center</aligny>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<label>$VAR[ShopsClosedSpace][B]$INFO[System.Date(dd. MMM)] [COLOR red]$INFO[System.Date(DDD)][/COLOR][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
<!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),NO) + System.HasAddon(service.monitor)</visible>
</control>
<control type="label"> <!-- EASY+ [Monitor] System Date - work day, holiday -->
<font>font10</font>
<shadowcolor>text_shadow</shadowcolor>
<height>95</height>
<width>auto</width>
<aligny>center</aligny>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<label>$VAR[ShopsClosedSpace][B][COLOR red]$INFO[System.Date(dd. MMM)][/COLOR] $INFO[System.Date(DDD)][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
<!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>String.IsEqual(Window(Home).Property(calendar_weekend),NO) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + System.HasAddon(service.monitor)</visible>
</control>
<control type="label"> <!-- EASY+ [Monitor] System Date - weekend, holiday -->
<font>font10</font>
<shadowcolor>text_shadow</shadowcolor>
<height>95</height>
<width>auto</width>
<aligny>center</aligny>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<label>$VAR[ShopsClosedSpace][B][COLOR red]$INFO[System.Date(dd. MMM)][/COLOR] [COLOR red]$INFO[System.Date(DDD)][/COLOR][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
<!-- <visible>Skin.HasSetting(show_date) + String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>String.IsEqual(Window(Home).Property(calendar_weekend),YES) + String.IsEqual(Window(Home).Property(calendar_holiday),YES) + System.HasAddon(service.monitor)</visible>
</control>
<control type="group"> <!-- EASY+ Weather -->
<visible>false</visible>
<top>0</top>
<right>15</right>
<align>right</align>
<width>80</width>
<!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)] + !Window.IsVisible(extendedprogressdialog)</visible> -->
<!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible> -->
<visible>Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
<animation effect="fade" time="150">VisibleChange</animation>
<control type="image">
<top>10</top>
<width>80</width>
<height>80</height>
<fadetime>300</fadetime>
<texture>$INFO[Weather.FanartCode,special://xbmc/addons/resource.images.weathericons.default/resources/,.png]</texture>
</control>
</control>
<control type="label"> <!-- EASY+ Weather Temperature-->
<font>font10</font>
<height>95</height>
<width>auto</width>
<aligny>center</aligny>
<animation effect="fade" start="100" end="0" time="300" condition="Window.Next(screencalibration)">WindowClose</animation>
<shadowcolor>text_shadow</shadowcolor>
<label>[B][CR]$INFO[Window(Weather).Property(Current.Temperature)]$INFO[System.TemperatureUnits, ][/B]</label>
<!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible> -->
<visible>Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
</control>
<control type="group"> <!-- EASY+ Weather Icon -->
<width>-10</width>
<!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible> -->
<visible>Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
<control type="image">
<top>10</top>
<right>5</right>
<align>right</align>
<width>40</width>
<height>40</height>
<fadetime>300</fadetime>
<texture>$INFO[Weather.FanartCode,special://xbmc/addons/resource.images.weathericons.default/resources/,.png]</texture>
</control>
</control>
<control type="group"> <!-- EASY+ Weather -->
<visible>false</visible>
<top>0</top>
<right>15</right>
<align>right</align>
<width>50</width>
<!-- <visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)] + !Window.IsVisible(extendedprogressdialog)</visible> -->
<visible>Skin.HasSetting(show_weathericon) + Skin.HasSetting(show_weatherinfo) + Weather.IsFetched + ![String.IsEqual(Weather.FanartCode,na)]</visible>
<animation effect="fade" time="150">VisibleChange</animation>
<control type="image">
<top>15</top>
<right>5</right>
<align>right</align>
<width>40</width>
<height>40</height>
<fadetime>300</fadetime>
<texture>$INFO[Weather.FanartCode,special://xbmc/addons/resource.images.weathericons.default/resources/,.png]</texture>
</control>
<control type="label">
<top>48</top>
<right>5</right>
<width>80</width>
<align>right</align>
<font>font10</font>
<shadowcolor>text_shadow</shadowcolor>
<label>[B]$INFO[Window(Weather).Property(Current.Temperature)]$INFO[System.TemperatureUnits, ][/B]</label>
</control>
<control type="label">
<top>48</top>
<right>5</right>
<width>80</width>
<align>right</align>
<font>font10</font>
<shadowcolor>text_shadow</shadowcolor>
<label>$INFO[Weather.Location] </label>
<visible>Skin.HasSetting(show_weatherlocation)</visible>
<visible>false</visible>
</control>
</control>
</definition>
</include>
Předně je tedy připomenout, že tento řádek informací je v
Estuary koncipován jako
grouplist, horizontálně řazený zprava do leva. Funguje tedy tak, že se jednotlivé informace řadí dynamicky zprava a jsou odděleny pevnou mezerou. To dynamicky znamená, že pokud je příslušná informace prázdná, tak se nezobrazí a ostatní se posunou tak, že po chybějící informaci nezvnikne mezera. Znamená to také, že pokud se šířka informace změní, příslušně se posunou i informace nalevo (protože seznam se řadí zprava) od ní.
Koncipoval jsem informace do skupin, z nichž jednu jsem vyhradil pro informace o datu, ve kterých by měly být zobrazeny postupně a ve dvou řádcích informace o zavřených obchodech dnes a zítra, den (číslo) a měsíc (text), den v týdnu (text) - to v prvním řádku - a jméno toho, kdo má v daný den svátek v řádku druhém. Zároveń jsem potřeboval, aby to celé bylo posuzováno jak jeden text a to i přesto, že symbol zavřených obchodů bude obrázek (ikona zámku). Rozdělení do dvou řádků nebyl problém, na to stačí do textu vložt metaznak
[CR]. Skin engin si s tím poradí a pokud se v tagu
<lenght> použije parametr
auto, nastaví šířku celého elementu podle šířky nejdelšího (v tomto případě ze dvou řádků) řádku. Co bylo složitější, to na začátek toho textu, a jestě podmíněně, vložit obrázek (obrázky) symboliztující zavřené obchody dnes, zítra a nebo dnes i zítra. Nakonec pomohl malý trik a použití proměnné skinu $VAR. V proměnné, která je podmíněně naplněna, podle toho zda dnes a/nebo zítra jsou zavřené obchody, mezerami, odpovídající šířce místa pro umístění obrázku symbolu zámku.
Vlastní obsah labelu obsahujícího texty tedy vypadá takto:
Kód:
<label>$VAR[ShopsClosedSpace][B]$INFO[System.Date(dd. MMM)] $INFO[System.Date(DDD)][CR]$INFO[Window(Home).Property(calendar_nameDay),, ][/B]</label>
Tato definice je tam vícekrát, protože kromě jiného ještě obsahuje varianty barev textu pro svátky a volné dny. Volné místo pro symbol zámku je v místě, kde je zobrazena hodnota proměnné
ShopsClosedSpace. Ta je plněná v definici proměnných, a to následovně:
Kód:
<variable name="ShopsClosedSpace"> <!-- EASY+ Shops are closed -->
<value condition="String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) | String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)">[B] [/B]</value>
<value></value>
</variable>
Zbývá tedy popsat, jak je do prostoru, vyhrazeného mezerami v definici proměnné
ShopsClosedSpace vložen příslušný symbol (-y). Tady jsme si pomohl trikem, který umožňuje v
grouplist seznamu posunout pozici elementu. Použitím tagu <left> to nejde, ale stačí použít konstrukci se zápornou šířkou (v případě horizontálního seznamu) a dosáhneme požadovaného výsledku. Vypadá to takto:
Kód:
<control type="group"> <!-- EASY+ Shops closed indicator -->
<!-- <visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + Skin.HasSetting(kodi_monitor) + System.HasAddon(service.monitor)</visible> -->
<visible>[String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) | String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)] + System.HasAddon(service.monitor)</visible>
<width>-10</width>
<control type="image">
<top>24</top>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
<visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + !String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
</control>
<control type="image">
<top>24</top>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
<visible>!String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
</control>
<control type="group">
<visible>String.IsEqual(Window(Home).Property(calendar_shops),CLOSED) + String.IsEqual(Window(Home).Property(calendar_shops_tomorrow),CLOSED)</visible>
<control type="image">
<top>22</top>
<left>2</left>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="grey">special://skin/extras/icons/status/lock.png</texture>
</control>
<control type="image">
<top>24</top>
<left>-2</left>
<width>16</width>
<height>16</height>
<aspectratio>keep</aspectratio>
<texture colordiffuse="button_focus">special://skin/extras/icons/status/lock.png</texture>
</control>
</control>
</control>
Výsledek je vidět na příložených screenshot-ech. Postupně zleva reálný stav, tedy
dnes i zítra obchody otevřené, a simulované stavy,
obchody zavřené dnes = modrý symbol zámku,
zítra = šedý symbol zámku a
dnes i zítra = modrý a pod ním částečně překrytý šedý symbol zámku.
Pokud by někoho zajímalo, jak ty stavy simuluji, tak k tomu mám vyrobenou definici uživatelského okna, do které si mohu vkládat různé definice pro simulované nastavení proměnných skinu a window properties. Momentálně okno vypadá takto:
A pokud by někoho zajímala definice tohoto testovacího okna, tak ta je zde (zatím bez dalšího komentáře a vysvětlení):
Kód:
<?xml version="1.0" encoding="utf-8"?>
<window type="dialog" id="1162"> <!-- EASY+ Skin & properties viewing and setting -->
<defaultcontrol always="true">1100</defaultcontrol>
<include>Animation_DialogPopupOpenClose</include>
<controls>
<control type="group">
<centerleft>50%</centerleft>
<width>1800</width>
<centertop>50%</centertop>
<height>780</height>
<include content="DialogBackgroundCommons">
<param name="width" value="100%" />
<param name="height" value="100%" />
<param name="header_label" value="Skin & properties viewing and setting" />
<param name="header_id" value="1" />
</include>
<control type="group">
<left>0</left>
<top>75</top>
<width>1800</width>
<height>700</height>
<control type="grouplist" id="1100">
<left>0</left>
<width>600</width>
<onleft>1300</onleft>
<onright>1200</onright>
<control type="radiobutton" id="1101">
<label>Master skin level</label>
<include>DefaultSettingButton</include>
<selected>Skin.HasSetting(skinlevel_master)</selected>
<onclick>Skin.ToggleSetting(skinlevel_master)</onclick>
</control>
</control>
<control type="grouplist" id="1200">
<left>600</left>
<width>600</width>
<onleft>1100</onleft>
<onright>1300</onright>
<control type="button" id="1201">
<label>Jmeniny</label>
<include>DefaultSettingButton</include>
<label2>$INFO[Window(Home).Property(calendar_nameDay)]</label2>
</control>
<control type="button" id="1202">
<label>St.svátek</label>
<include>DefaultSettingButton</include>
<label2>$INFO[Window(Home).Property(calendar_holidayName)]</label2>
<onclick>Skin.SetString(input,$INFO[Window(Home).Property(calendar_holidayName)])</onclick>
<onclick>Skin.SetString(input)</onclick>
<onclick>SetProperty(calendar_holidayName,$INFO[Skin.String(input)],Home)</onclick>
</control>
<control type="button" id="1203">
<label>Víkend</label>
<include>DefaultSettingButton</include>
<label2>$INFO[Window(Home).Property(calendar_weekend)]</label2>
<onclick condition="String.IsEmpty(Window(Home).Property(calendar_weekend)">SetProperty(calendar_weekend,YES,Home)</onclick>
<onclick condition="String.IsEqual(Window(Home).Property(calendar_weekend),YES">SetProperty(calendar_weekend,NO,Home)</onclick>
<onclick condition="String.IsEqual(Window(Home).Property(calendar_weekend),NO">ClearProperty(calendar_weekend,Home)</onclick>
</control>
<control type="button" id="1204">
<label>Svátek</label>
<include>DefaultSettingButton</include>
<label2>$INFO[Window(Home).Property(calendar_holiday)]</label2>
<onclick condition="String.IsEmpty(Window(Home).Property(calendar_holiday)">SetProperty(calendar_holiday,YES,Home)</onclick>
<onclick condition="String.IsEqual(Window(Home).Property(calendar_holiday),YES">SetProperty(calendar_holiday,NO,Home)</onclick>
<onclick condition="String.IsEqual(Window(Home).Property(calendar_holiday),NO">ClearProperty(calendar_holiday,Home)</onclick>
</control>
<control type="button" id="1205">
<label>Obchody</label>
<include>DefaultSettingButton</include>
<label2>$INFO[Window(Home).Property(calendar_shops)]</label2>
<onclick condition="String.IsEmpty(Window(Home).Property(calendar_shops)">SetProperty(calendar_shops,OPENED,Home)</onclick>
<onclick condition="String.IsEqual(Window(Home).Property(calendar_shops),OPENED">SetProperty(calendar_shops,CLOSED,Home)</onclick>
<onclick condition="String.IsEqual(Window(Home).Property(calendar_shops),CLOSED">ClearProperty(calendar_shops,Home)</onclick>
</control>
<control type="button" id="1206">
<label>Roční období</label>
<include>DefaultSettingButton</include>
<label2>$VAR[Season]</label2>
</control>
</control>
<control type="grouplist" id="1300">
<left>1200</left>
<width>600</width>
<onleft>1200</onleft>
<onright>1100</onright>
</control>
</control>
</control>
</controls>
</window>