I've made something like this in Embuary. But it's a little complex.
xml:
>
<include name="CustomWidgetConfigTemplate">
<control type="button" id="101">
<include>SettingsButton</include>
<onclick>Skin.SetString(UserWidget$PARAM[nr]_name)</onclick>
<label>$LOCALIZE[21864]</label>
<label2>$INFO[Skin.String(UserWidget$PARAM[nr]_name)]</label2>
</control>
<control type="button" id="102">
<include>SettingsButton</include>
<onclick>SetProperty(Dialog.1.Label,$LOCALIZE[3])</onclick>
<onclick>SetProperty(Dialog.1.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_target,videos)||Skin.SetString(UserWidget$PARAM[nr]_target.label,$LOCALIZE[3]))</onclick>
<onclick>SetProperty(Dialog.2.Label,$LOCALIZE[2])</onclick>
<onclick>SetProperty(Dialog.2.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_target,music)||Skin.SetString(UserWidget$PARAM[nr]_target.label,$LOCALIZE[2]))</onclick>
<onclick>SetProperty(Dialog.3.Label,$LOCALIZE[1])</onclick>
<onclick>SetProperty(Dialog.3.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_target,pictures)||Skin.SetString(UserWidget$PARAM[nr]_target.label,$LOCALIZE[1]))</onclick>
<onclick>SetProperty(Dialog.4.Label,$LOCALIZE[29921])</onclick>
<onclick>SetProperty(Dialog.4.BuiltIn,Skin.Reset(UserWidget$PARAM[nr]_target)||Skin.SetString(UserWidget$PARAM[nr]_target.label,$LOCALIZE[29921]))</onclick>
<onclick>RunScript(script.embuary.helper,action=createselect,header=$LOCALIZE[467])</onclick>
<label>$LOCALIZE[467]</label>
<label2>$INFO[Skin.String(UserWidget$PARAM[nr]_target.label)]</label2>
</control>
<control type="button" id="103">
<include>SettingsButton</include>
<onclick>SetProperty(Dialog.1.Label,$LOCALIZE[20021])</onclick>
<onclick>SetProperty(Dialog.1.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_layout,HomePosterWidget)||Skin.SetString(UserWidget$PARAM[nr]_layout.label,$LOCALIZE[20021]))</onclick>
<onclick>SetProperty(Dialog.2.Label,$LOCALIZE[31004])</onclick>
<onclick>SetProperty(Dialog.2.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_layout,HomeWideWidget)||Skin.SetString(UserWidget$PARAM[nr]_layout.label,$LOCALIZE[31004]))</onclick>
<onclick>SetProperty(Dialog.3.Label,$LOCALIZE[31005])</onclick>
<onclick>SetProperty(Dialog.3.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_layout,HomeSquareWidget)||Skin.SetString(UserWidget$PARAM[nr]_layout.label,$LOCALIZE[31005]))</onclick>
<onclick>RunScript(script.embuary.helper,action=createselect,header=$LOCALIZE[31101])</onclick>
<label>$LOCALIZE[31101]</label>
<label2>$INFO[Skin.String(UserWidget$PARAM[nr]_layout.label)]</label2>
</control>
<control type="radiobutton" id="104">
<include>SettingsButton</include>
<onclick>Skin.ToggleSetting(UserWidget$PARAM[nr]_forceIcon)</onclick>
<label>$LOCALIZE[31344]</label>
<selected>Skin.HasSetting(UserWidget$PARAM[nr]_forceIcon)</selected>
</control>
<control type="button" id="105">
<include>SettingsButton</include>
<label>$LOCALIZE[581]</label>
<onclick>SetProperty(Dialog.1.Label,$LOCALIZE[571])</onclick>
<onclick>SetProperty(Dialog.1.BuiltIn,Skin.Reset(UserWidget$PARAM[nr]_sortby))</onclick>
<onclick>SetProperty(Dialog.2.Label,Label)</onclick>
<onclick>SetProperty(Dialog.2.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,label))</onclick>
<onclick>SetProperty(Dialog.3.Label,Title)</onclick>
<onclick>SetProperty(Dialog.3.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,title))</onclick>
<onclick>SetProperty(Dialog.4.Label,TVShowTitle)</onclick>
<onclick>SetProperty(Dialog.4.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,tvshowtitle))</onclick>
<onclick>SetProperty(Dialog.5.Label,SortTitle)</onclick>
<onclick>SetProperty(Dialog.5.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,sorttitle))</onclick>
<onclick>SetProperty(Dialog.6.Label,Artist)</onclick>
<onclick>SetProperty(Dialog.6.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,artist))</onclick>
<onclick>SetProperty(Dialog.7.Label,Album)</onclick>
<onclick>SetProperty(Dialog.7.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,album))</onclick>
<onclick>SetProperty(Dialog.8.Label,Random)</onclick>
<onclick>SetProperty(Dialog.8.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,random))</onclick>
<onclick>SetProperty(Dialog.9.Label,Year)</onclick>
<onclick>SetProperty(Dialog.9.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,year))</onclick>
<onclick>SetProperty(Dialog.10.Label,DateAdded)</onclick>
<onclick>SetProperty(Dialog.10.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,dateadded))</onclick>
<onclick>SetProperty(Dialog.11.Label,LastPlayed)</onclick>
<onclick>SetProperty(Dialog.11.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,lastplayed))</onclick>
<onclick>SetProperty(Dialog.12.Label,PlayCount)</onclick>
<onclick>SetProperty(Dialog.12.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,playcount))</onclick>
<onclick>SetProperty(Dialog.13.Label,Season)</onclick>
<onclick>SetProperty(Dialog.13.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,season))</onclick>
<onclick>SetProperty(Dialog.14.Label,Episode)</onclick>
<onclick>SetProperty(Dialog.14.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,episode))</onclick>
<onclick>SetProperty(Dialog.15.Label,TrackNumber)</onclick>
<onclick>SetProperty(Dialog.15.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortby,tracknumber))</onclick>
<onclick>RunScript(script.embuary.helper,action=createselect,header=$LOCALIZE[581])</onclick>
<label2>$INFO[Skin.String(UserWidget$PARAM[nr]_sortby),',']</label2>
</control>
<control type="button" id="106">
<include>SettingsButton</include>
<label>$LOCALIZE[580]</label>
<onclick>SetProperty(Dialog.1.Label,$LOCALIZE[571])</onclick>
<onclick>SetProperty(Dialog.1.BuiltIn,Skin.Reset(UserWidget$PARAM[nr]_sortorder))</onclick>
<onclick>SetProperty(Dialog.2.Label,$LOCALIZE[584])</onclick>
<onclick>SetProperty(Dialog.2.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortorder,ascending))</onclick>
<onclick>SetProperty(Dialog.3.Label,$LOCALIZE[585])</onclick>
<onclick>SetProperty(Dialog.3.BuiltIn,Skin.SetString(UserWidget$PARAM[nr]_sortorder,descending))</onclick>
<onclick>RunScript(script.embuary.helper,action=createselect,header=$LOCALIZE[580])</onclick>
<label2>$INFO[Skin.String(UserWidget$PARAM[nr]_sortorder),',']</label2>
</control>
<control type="button" id="107">
<include>SettingsButton</include>
<label>$LOCALIZE[21427]</label>
<onclick>Skin.SetNumeric(UserWidget$PARAM[nr]_limit)</onclick>
<label2>$INFO[Skin.String(UserWidget$PARAM[nr]_limit)]</label2>
</control>
</include>
xml:
<include name="W_Custom_Template">
<include condition="!Skin.HasSetting(UserWidget$PARAM[nr]_forceIcon) + [String.IsEqual(Skin.String(UserWidget$PARAM[nr]_layout),HomePosterWidget) | String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_layout))]" content="PosterWidget">
<param name="visible" value="!String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_path))"/>
<param name="id" value="$PARAM[id]"/>
<param name="onup" value="$PARAM[onup]"/>
<param name="ondown" value="$PARAM[ondown]"/>
<param name="headline" value="$INFO[Skin.String(UserWidget$PARAM[nr]_name)]"/>
<param name="widget_target" value="$INFO[Skin.String(UserWidget$PARAM[nr]_target)]"/>
<param name="sortby" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortby)]"/>
<param name="sortorder" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortorder)]"/>
<param name="limit" value="$INFO[Skin.String(UserWidget$PARAM[nr]_limit)]"/>
<param name="content" value="$VAR[CWidgetReloadPath$PARAM[nr]]"/>
</include>
<include condition="!Skin.HasSetting(UserWidget$PARAM[nr]_forceIcon) + String.IsEqual(Skin.String(UserWidget$PARAM[nr]_layout),HomeWideWidget)" content="WideWidget">
<param name="visible" value="!String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_path))"/>
<param name="id" value="$PARAM[id]"/>
<param name="onup" value="$PARAM[onup]"/>
<param name="ondown" value="$PARAM[ondown]"/>
<param name="headline" value="$INFO[Skin.String(UserWidget$PARAM[nr]_name)]"/>
<param name="widget_target" value="$INFO[Skin.String(UserWidget$PARAM[nr]_target)]"/>
<param name="sortby" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortby)]"/>
<param name="sortorder" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortorder)]"/>
<param name="limit" value="$INFO[Skin.String(UserWidget$PARAM[nr]_limit)]"/>
<param name="content" value="$VAR[CWidgetReloadPath$PARAM[nr]]"/>
</include>
<include condition="!Skin.HasSetting(UserWidget$PARAM[nr]_forceIcon) + String.IsEqual(Skin.String(UserWidget$PARAM[nr]_layout),HomeSquareWidget)" content="SquareWidget">
<param name="visible" value="!String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_path))"/>
<param name="id" value="$PARAM[id]"/>
<param name="onup" value="$PARAM[onup]"/>
<param name="ondown" value="$PARAM[ondown]"/>
<param name="headline" value="$INFO[Skin.String(UserWidget$PARAM[nr]_name)]"/>
<param name="widget_target" value="$INFO[Skin.String(UserWidget$PARAM[nr]_target)]"/>
<param name="sortby" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortby)]"/>
<param name="sortorder" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortorder)]"/>
<param name="limit" value="$INFO[Skin.String(UserWidget$PARAM[nr]_limit)]"/>
<param name="content" value="$VAR[CWidgetReloadPath$PARAM[nr]]"/>
</include>
<include condition="Skin.HasSetting(UserWidget$PARAM[nr]_forceIcon) + [String.IsEqual(Skin.String(UserWidget$PARAM[nr]_layout),HomePosterWidget) | String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_layout))]" content="PosterWidget">
<param name="visible" value="!String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_path))"/>
<param name="id" value="$PARAM[id]"/>
<param name="onup" value="$PARAM[onup]"/>
<param name="ondown" value="$PARAM[ondown]"/>
<param name="headline" value="$INFO[Skin.String(UserWidget$PARAM[nr]_name)]"/>
<param name="widget_target" value="$INFO[Skin.String(UserWidget$PARAM[nr]_target)]"/>
<param name="sortby" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortby)]"/>
<param name="sortorder" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortorder)]"/>
<param name="limit" value="$INFO[Skin.String(UserWidget$PARAM[nr]_limit)]"/>
<param name="icon" value="$VAR[CWidgetDefaultIcon]"/>
<param name="content" value="$VAR[CWidgetReloadPath$PARAM[nr]]"/>
</include>
<include condition="Skin.HasSetting(UserWidget$PARAM[nr]_forceIcon) + String.IsEqual(Skin.String(UserWidget$PARAM[nr]_layout),HomeWideWidget)" content="WideWidget">
<param name="visible" value="!String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_path))"/>
<param name="id" value="$PARAM[id]"/>
<param name="onup" value="$PARAM[onup]"/>
<param name="ondown" value="$PARAM[ondown]"/>
<param name="headline" value="$INFO[Skin.String(UserWidget$PARAM[nr]_name)]"/>
<param name="widget_target" value="$INFO[Skin.String(UserWidget$PARAM[nr]_target)]"/>
<param name="sortby" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortby)]"/>
<param name="sortorder" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortorder)]"/>
<param name="limit" value="$INFO[Skin.String(UserWidget$PARAM[nr]_limit)]"/>
<param name="icon" value="$VAR[CWidgetDefaultIcon]"/>
<param name="content" value="$VAR[CWidgetReloadPath$PARAM[nr]]"/>
</include>
<include condition="Skin.HasSetting(UserWidget$PARAM[nr]_forceIcon) + String.IsEqual(Skin.String(UserWidget$PARAM[nr]_layout),HomeSquareWidget)" content="SquareWidget">
<param name="visible" value="!String.IsEmpty(Skin.String(UserWidget$PARAM[nr]_path))"/>
<param name="id" value="$PARAM[id]"/>
<param name="onup" value="$PARAM[onup]"/>
<param name="ondown" value="$PARAM[ondown]"/>
<param name="headline" value="$INFO[Skin.String(UserWidget$PARAM[nr]_name)]"/>
<param name="widget_target" value="$INFO[Skin.String(UserWidget$PARAM[nr]_target)]"/>
<param name="sortby" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortby)]"/>
<param name="sortorder" value="$INFO[Skin.String(UserWidget$PARAM[nr]_sortorder)]"/>
<param name="limit" value="$INFO[Skin.String(UserWidget$PARAM[nr]_limit)]"/>
<param name="icon" value="$VAR[CWidgetDefaultIcon]"/>
<param name="content" value="$VAR[CWidgetReloadPath$PARAM[nr]]"/>
</include>
</include>