xbmc/utils/test/utilsTest.a \
xbmc/threads/test/threadTest.a \
xbmc/interfaces/python/test/pythonSwigTest.a \
- xbmc/windowing/tests/wayland/test_wayland.a \
xbmc/test/xbmc-test.a
+ifeq (@USE_WAYLAND@,1)
+CHECK_LIBS += xbmc/windowing/tests/wayland/test_wayland.a
+
ifeq (@USE_WAYLAND_TEST_EXTENSION@,1)
WAYLAND_TEST_MODULE = xbmc/windowing/tests/wayland/xbmc-wayland-test-extension.so
$(WAYLAND_TEST_MODULE): force
CHECK_EXTENSIONS = $(WAYLAND_TEST_MODULE)
CHECK_LIBADD=@WAYLAND_TEST_LIBS@
endif
+endif
CHECK_PROGRAMS = xbmc-test
7C1A85661520522500C63311 /* TextureCacheJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1A85631520522500C63311 /* TextureCacheJob.cpp */; };
7C1D682915A7D2FD00658B65 /* DatabaseManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1D682715A7D2FD00658B65 /* DatabaseManager.cpp */; };
7C1F6EBB13ECCFA7001726AB /* LibraryDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1F6EB913ECCFA7001726AB /* LibraryDirectory.cpp */; };
+ 7C2612711825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; };
+ 7C2612721825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; };
+ 7C2612731825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; };
+ 7C2612671820667C0086E04D /* ISettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2612631820667C0086E04D /* ISettingControl.cpp */; };
+ 7C2612681820667C0086E04D /* ISettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2612631820667C0086E04D /* ISettingControl.cpp */; };
+ 7C2612691820667C0086E04D /* ISettingControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2612631820667C0086E04D /* ISettingControl.cpp */; };
7C2D6AE40F35453E00DD2E85 /* SpecialProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2D6AE20F35453E00DD2E85 /* SpecialProtocol.cpp */; };
7C4458BD161E203800A905F6 /* Screenshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4458BB161E203800A905F6 /* Screenshot.cpp */; };
7C45DBE910F325C400D4BBF3 /* DAVDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C45DBE710F325C400D4BBF3 /* DAVDirectory.cpp */; };
7C89674613C03B22003631FE /* InfoBool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C89674313C03B22003631FE /* InfoBool.cpp */; };
7C8A14571154CB2600E5FCFA /* TextureCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8A14541154CB2600E5FCFA /* TextureCache.cpp */; };
7C8A187D115B2A8200E5FCFA /* TextureDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8A187A115B2A8200E5FCFA /* TextureDatabase.cpp */; };
+ 7C920CF9181669FF00DA1477 /* TextureOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */; };
+ 7C920CFA181669FF00DA1477 /* TextureOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */; };
+ 7C920CFB181669FF00DA1477 /* TextureOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */; };
7C99B6A4133D342100FC2B16 /* CircularCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C99B6A2133D342100FC2B16 /* CircularCache.cpp */; };
7C99B7951340723F00FC2B16 /* GUIDialogPlayEject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C99B7931340723F00FC2B16 /* GUIDialogPlayEject.cpp */; };
7CAA20511079C8160096DE39 /* BaseRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA204F1079C8160096DE39 /* BaseRenderer.cpp */; };
DFECFB11172D9CAB00A43CF7 /* SettingUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFB03172D9CAB00A43CF7 /* SettingUpdate.cpp */; };
DFECFB1C172D9D0100A43CF7 /* BooleanLogic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFB1A172D9D0100A43CF7 /* BooleanLogic.cpp */; };
DFECFB4C172D9D6D00A43CF7 /* NetworkServices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFB4A172D9D6D00A43CF7 /* NetworkServices.cpp */; };
+ DFEF0BAC180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */; };
+ DFEF0BAD180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */; };
+ DFEF0BAE180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */; };
+ DFEF0BC1180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */; };
+ DFEF0BC2180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */; };
+ DFEF0BC3180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */; };
DFF0EB54175280D1002DA3A4 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CE6131F5DC6000AD0F6 /* libz.dylib */; };
DFF0EB55175280E5002DA3A4 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F56C8CF2131F5DFD000AD0F6 /* libiconv.dylib */; };
DFF0EBB3175281CE002DA3A4 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E49910EC174E54D200741B6D /* AudioToolbox.framework */; };
7C1D682815A7D2FD00658B65 /* DatabaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseManager.h; sourceTree = "<group>"; };
7C1F6EB913ECCFA7001726AB /* LibraryDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LibraryDirectory.cpp; sourceTree = "<group>"; };
7C1F6EBA13ECCFA7001726AB /* LibraryDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LibraryDirectory.h; sourceTree = "<group>"; };
+ 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DatabaseQuery.cpp; sourceTree = "<group>"; };
+ 7C2612701825B6340086E04D /* DatabaseQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseQuery.h; sourceTree = "<group>"; };
+ 7C2612631820667C0086E04D /* ISettingControl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ISettingControl.cpp; sourceTree = "<group>"; };
+ 7C2612641820667C0086E04D /* ISettingControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISettingControl.h; sourceTree = "<group>"; };
+ 7C2612651820667C0086E04D /* ISettingControlCreator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISettingControlCreator.h; sourceTree = "<group>"; };
+ 7C2612661820667C0086E04D /* SettingDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingDefinitions.h; sourceTree = "<group>"; };
7C2D6AE20F35453E00DD2E85 /* SpecialProtocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpecialProtocol.cpp; sourceTree = "<group>"; };
7C2D6AE30F35453E00DD2E85 /* SpecialProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpecialProtocol.h; sourceTree = "<group>"; };
7C4458BB161E203800A905F6 /* Screenshot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Screenshot.cpp; sourceTree = "<group>"; };
7C8A14551154CB2600E5FCFA /* TextureCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextureCache.h; sourceTree = "<group>"; };
7C8A187A115B2A8200E5FCFA /* TextureDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextureDatabase.cpp; sourceTree = "<group>"; };
7C8A187B115B2A8200E5FCFA /* TextureDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextureDatabase.h; sourceTree = "<group>"; };
+ 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextureOperations.cpp; sourceTree = "<group>"; };
+ 7C920CF8181669FF00DA1477 /* TextureOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextureOperations.h; sourceTree = "<group>"; };
7C99B6A2133D342100FC2B16 /* CircularCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CircularCache.cpp; sourceTree = "<group>"; };
7C99B6A3133D342100FC2B16 /* CircularCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircularCache.h; sourceTree = "<group>"; };
7C99B7931340723F00FC2B16 /* GUIDialogPlayEject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogPlayEject.cpp; sourceTree = "<group>"; };
DFECFB1B172D9D0100A43CF7 /* BooleanLogic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BooleanLogic.h; sourceTree = "<group>"; };
DFECFB4A172D9D6D00A43CF7 /* NetworkServices.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkServices.cpp; sourceTree = "<group>"; };
DFECFB4B172D9D6D00A43CF7 /* NetworkServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkServices.h; sourceTree = "<group>"; };
+ DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileItemListModification.cpp; sourceTree = "<group>"; };
+ DFEF0BAA180ADE6400AEAED1 /* FileItemListModification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileItemListModification.h; sourceTree = "<group>"; };
+ DFEF0BAB180ADE6400AEAED1 /* IFileItemListModifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IFileItemListModifier.h; sourceTree = "<group>"; };
+ DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SmartPlaylistFileItemListModifier.cpp; sourceTree = "<group>"; };
+ DFEF0BC0180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmartPlaylistFileItemListModifier.h; sourceTree = "<group>"; };
DFF0EB8717528174002DA3A4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
DFF0EB8D17528174002DA3A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
DFF0EB9517528174002DA3A4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
18B7C92C129428CA009E7A26 /* PlayListXML.h */,
18B7C92D129428CA009E7A26 /* SmartPlayList.cpp */,
18B7C92E129428CA009E7A26 /* SmartPlayList.h */,
+ DFEF0BBF180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp */,
+ DFEF0BC0180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.h */,
);
path = playlists;
sourceTree = "<group>";
children = (
E38E16800D25F9FA00618676 /* Database.cpp */,
E38E16810D25F9FA00618676 /* Database.h */,
+ 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */,
+ 7C2612701825B6340086E04D /* DatabaseQuery.h */,
E38E1CD70D25F9FC00618676 /* dataset.cpp */,
E38E1CD80D25F9FC00618676 /* dataset.h */,
7C7B2B2E1134F36400713D6D /* mysqldataset.cpp */,
E38E168D0D25F9FA00618676 /* DynamicDll.h */,
E38E16920D25F9FA00618676 /* FileItem.cpp */,
E38E16930D25F9FA00618676 /* FileItem.h */,
+ DFEF0BA9180ADE6400AEAED1 /* FileItemListModification.cpp */,
+ DFEF0BAA180ADE6400AEAED1 /* FileItemListModification.h */,
DFBB4317178B5E6F006CC20A /* GitRevision.cpp */,
DFBB4318178B5E6F006CC20A /* GitRevision.h */,
E38E1E3E0D25F9FD00618676 /* GUIInfoManager.cpp */,
E38E17F20D25F9FA00618676 /* GUIPassword.cpp */,
E38E17F30D25F9FA00618676 /* GUIPassword.h */,
E38E17F60D25F9FA00618676 /* GUIUserMessages.h */,
+ DFEF0BAB180ADE6400AEAED1 /* IFileItemListModifier.h */,
E38E184F0D25F9FA00618676 /* IProgressCallback.h */,
E38E18580D25F9FA00618676 /* LangInfo.cpp */,
E38E18590D25F9FA00618676 /* LangInfo.h */,
DFECFAEE172D9CAB00A43CF7 /* ISetting.cpp */,
DFECFAEF172D9CAB00A43CF7 /* ISetting.h */,
DFECFAF0172D9CAB00A43CF7 /* ISettingCallback.h */,
+ 7C2612631820667C0086E04D /* ISettingControl.cpp */,
+ 7C2612641820667C0086E04D /* ISettingControl.h */,
+ 7C2612651820667C0086E04D /* ISettingControlCreator.h */,
DFECFAF1172D9CAB00A43CF7 /* ISettingCreator.h */,
DF8990141709BB2D00B35C21 /* ISettingsHandler.h */,
DF8990151709BB2D00B35C21 /* ISubSettings.h */,
DFECFAF9172D9CAB00A43CF7 /* SettingConditions.h */,
DFECFAFA172D9CAB00A43CF7 /* SettingControl.cpp */,
DFECFAFB172D9CAB00A43CF7 /* SettingControl.h */,
+ 7C2612661820667C0086E04D /* SettingDefinitions.h */,
DFECFAFC172D9CAB00A43CF7 /* SettingDependency.cpp */,
DFECFAFD172D9CAB00A43CF7 /* SettingDependency.h */,
DFECFAFE172D9CAB00A43CF7 /* SettingPath.cpp */,
DF00492C162DAEA200A971AD /* PVROperations.h */,
F5AE409613415D9E0004BD79 /* SystemOperations.cpp */,
F5AE409713415D9E0004BD79 /* SystemOperations.h */,
+ 7C920CF7181669FF00DA1477 /* TextureOperations.cpp */,
+ 7C920CF8181669FF00DA1477 /* TextureOperations.h */,
F5AE409813415D9E0004BD79 /* VideoLibrary.cpp */,
F5AE409913415D9E0004BD79 /* VideoLibrary.h */,
F5AE409A13415D9E0004BD79 /* XBMCOperations.cpp */,
DFD882F817DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */,
DFD882E917DD189E001516FE /* StringValidation.cpp in Sources */,
F500E35617F3412C004FC217 /* WinEvents.cpp in Sources */,
+ 7C2612711825B6340086E04D /* DatabaseQuery.cpp in Sources */,
+ 7C920CF9181669FF00DA1477 /* TextureOperations.cpp in Sources */,
+ DFEF0BAC180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */,
+ DFEF0BC1180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */,
+ 7C2612671820667C0086E04D /* ISettingControl.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DFD882F617DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */,
DFD882E717DD189E001516FE /* StringValidation.cpp in Sources */,
F500E35817F3412C004FC217 /* WinEvents.cpp in Sources */,
+ 7C2612731825B6340086E04D /* DatabaseQuery.cpp in Sources */,
+ 7C920CFB181669FF00DA1477 /* TextureOperations.cpp in Sources */,
+ DFEF0BAE180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */,
+ DFEF0BC3180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */,
+ 7C2612691820667C0086E04D /* ISettingControl.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DFD882F717DD1A5B001516FE /* AddonPythonInvoker.cpp in Sources */,
DFD882E817DD189E001516FE /* StringValidation.cpp in Sources */,
F500E35717F3412C004FC217 /* WinEvents.cpp in Sources */,
+ 7C2612721825B6340086E04D /* DatabaseQuery.cpp in Sources */,
+ 7C920CFA181669FF00DA1477 /* TextureOperations.cpp in Sources */,
+ DFEF0BAD180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */,
+ DFEF0BC2180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */,
+ 7C2612681820667C0086E04D /* ISettingControl.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_addons.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
<align>center</align>
<aligny>center</aligny>
</control>
- <control type="radiobutton" id ="5">
+ <control type="radiobutton" id="5">
<description>Enable auto-updates</description>
- <posx>0</posx>
- <posy>130</posy>
+ <left>0</left>
+ <top>130</top>
<include>ButtonCommonValues</include>
<label>24063</label>
</control>
- <control type="radiobutton" id ="6">
+ <control type="radiobutton" id="6">
<description>No notifications</description>
- <posx>0</posx>
- <posy>170</posy>
+ <left>0</left>
+ <top>170</top>
<include>ButtonCommonValues</include>
<label>25000</label>
</control>
- <control type="radiobutton" id ="7">
+ <control type="radiobutton" id="7">
<description>Hide foreign</description>
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<include>ButtonCommonValues</include>
<label>25001</label>
</control>
<defaultcontrol always="true">9000</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>185</posx>
- <posy>60</posy>
+ <left>185</left>
+ <top>60</top>
<origin x="185" y="10">!IsEmpty(ListItem.Property(Addon.broken))</origin>
</coordinates>
<include>dialogeffect</include>
<visible>!Window.isVisible(AddonSettings) + !Window.IsActive(TextViewer)</visible>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>920</width>
<height>600</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>840</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>840</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>830</posx>
- <posy>15</posy>
+ <left>830</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
<visible>system.getbool(input.enablemouse)</visible>
</control>
<control type="image">
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>220</width>
<height>220</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Addon Title value</description>
- <posx>280</posx>
- <posy>80</posy>
+ <left>280</left>
+ <top>80</top>
<width>580</width>
<height>30</height>
<align>left</align>
<scroll>true</scroll>
</control>
<control type="group">
- <posx>270</posx>
- <posy>130</posy>
+ <left>270</left>
+ <top>130</top>
<control type="label">
<description>Type txt</description>
- <posx>150</posx>
- <posy>0</posy>
+ <right>150</right>
+ <top>0</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[146]</label>
</control>
<control type="label">
<description>Type Value</description>
- <posx>160</posx>
- <posy>0</posy>
+ <left>160</left>
+ <top>0</top>
<width>440</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Type)]</label>
</control>
<control type="label">
<description>Author txt</description>
- <posx>150</posx>
- <posy>30</posy>
+ <right>150</right>
+ <top>30</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[21863]:</label>
</control>
<control type="label">
<description>Author Value</description>
- <posx>160</posx>
- <posy>30</posy>
+ <left>160</left>
+ <top>30</top>
<width>440</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Creator)]</label>
</control>
<control type="label">
<description>Version txt</description>
- <posx>150</posx>
- <posy>60</posy>
+ <right>150</right>
+ <top>60</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[24051]</label>
</control>
<control type="label">
<description>Version Value</description>
- <posx>160</posx>
- <posy>60</posy>
+ <left>160</left>
+ <top>60</top>
<width>440</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Version)]</label>
</control>
<control type="label">
<description>Rating txt</description>
- <posx>150</posx>
- <posy>90</posy>
+ <right>150</right>
+ <top>90</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[563]:</label>
</control>
<control type="image">
<description>Rating value</description>
- <posx>155</posx>
- <posy>90</posy>
+ <left>155</left>
+ <top>90</top>
<width>160</width>
<height>32</height>
<aspectratio align="left">keep</aspectratio>
</control>
<control type="label">
<description>Summary txt</description>
- <posx>150</posx>
- <posy>120</posy>
+ <right>150</right>
+ <top>120</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[20037]:</label>
</control>
<control type="fadelabel">
<description>Summary Value</description>
- <posx>160</posx>
- <posy>120</posy>
+ <left>160</left>
+ <top>120</top>
<width>440</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Summary)]</label>
<pauseatend>2000</pauseatend>
</control>
<control type="image">
- <posx>0</posx>
- <posy>160</posy>
+ <left>0</left>
+ <top>160</top>
<width>600</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
<description>Description txt</description>
- <posx>0</posx>
- <posy>170</posy>
+ <left>0</left>
+ <top>170</top>
<width>300</width>
<height>25</height>
<label>$LOCALIZE[21821]</label>
<visible>!IsEmpty(ListItem.Property(Addon.Disclaimer))</visible>
<control type="label">
<description>Description Page Count</description>
- <posx>610</posx>
- <posy>170</posy>
+ <right>610</right>
+ <top>170</top>
<width>300</width>
<height>25</height>
<label>$INFO[Container(400).CurrentPage, $LOCALIZE[31024] [COLOR=blue]([/COLOR]]$INFO[Container(400).NumPages,/,[COLOR=blue])[/COLOR]]</label>
</control>
<control type="textbox" id="400">
<description>Description</description>
- <posx>10</posx>
- <posy>195</posy>
+ <left>10</left>
+ <top>195</top>
<width>600</width>
<height>160</height>
<font>font12</font>
<pagecontrol>60</pagecontrol>
</control>
<control type="scrollbar" id="60">
- <posx>610</posx>
- <posy>190</posy>
+ <left>610</left>
+ <top>190</top>
<width>25</width>
<height>175</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>Disclaimer txt</description>
- <posx>0</posx>
- <posy>370</posy>
+ <left>0</left>
+ <top>370</top>
<width>600</width>
<height>25</height>
<label>$LOCALIZE[24052]</label>
</control>
<control type="textbox">
<description>Disclaimer</description>
- <posx>10</posx>
- <posy>395</posy>
+ <left>10</left>
+ <top>395</top>
<width>600</width>
<height>40</height>
<font>font12</font>
<visible>IsEmpty(ListItem.Property(Addon.Disclaimer))</visible>
<control type="label">
<description>Description Page Count</description>
- <posx>610</posx>
- <posy>170</posy>
+ <right>610</right>
+ <top>170</top>
<width>300</width>
<height>25</height>
<label>$INFO[Container(401).CurrentPage, $LOCALIZE[31024] [COLOR=blue]([/COLOR]]$INFO[Container(401).NumPages,/,[COLOR=blue])[/COLOR]]</label>
</control>
<control type="textbox" id="401">
<description>Description</description>
- <posx>10</posx>
- <posy>195</posy>
+ <left>10</left>
+ <top>195</top>
<width>600</width>
<height>250</height>
<font>font12</font>
<pagecontrol>61</pagecontrol>
</control>
<control type="scrollbar" id="61">
- <posx>610</posx>
- <posy>190</posy>
+ <left>610</left>
+ <top>190</top>
<width>25</width>
<height>250</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
</control>
<control type="grouplist" id="9000">
- <posx>30</posx>
- <posy>310</posy>
+ <left>30</left>
+ <top>310</top>
<width>220</width>
<height>270</height>
<onleft>60</onleft>
<align>center</align>
<font>font12_title</font>
</control>
- <control type="button" id ="6">
+ <control type="button" id="6">
<description>Install/UnInstall Addon button</description>
<width>220</width>
<height>43</height>
</control>
<control type="group">
<visible>!IsEmpty(ListItem.Property(Addon.broken))</visible>
- <posx>0</posx>
- <posy>600</posy>
+ <left>0</left>
+ <top>600</top>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>920</width>
<height>100</height>
<texture border="20">OverlayDialogBackground.png</texture>
</control>
<control type="image">
<description>Icon image</description>
- <posx>20</posx>
- <posy>20</posy>
+ <left>20</left>
+ <top>20</top>
<width>60</width>
<height>60</height>
<texture>DefaultIconError.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>100</posx>
- <posy>15</posy>
+ <left>100</left>
+ <top>15</top>
<width>800</width>
<height>25</height>
<font>font12_title</font>
</control>
<control type="textbox">
<description>Reason label</description>
- <posx>100</posx>
- <posy>35</posy>
+ <left>100</left>
+ <top>35</top>
<width>800</width>
<height>50</height>
<font>font13</font>
<defaultcontrol always="true">9</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>60</posy>
+ <left>240</left>
+ <top>60</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>600</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>600</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="20">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="grouplist" id="9">
<description>button area</description>
- <posx>45</posx>
- <posy>70</posy>
+ <left>45</left>
+ <top>70</top>
<width>710</width>
<height>40</height>
<itemgap>5</itemgap>
</control>
<control type="image">
<description>Has Previous</description>
- <posx>25</posx>
- <posy>80</posy>
+ <left>25</left>
+ <top>80</top>
<width>20</width>
<height>20</height>
<texture>scroll-left-focus.png</texture>
</control>
<control type="image">
<description>Has Next</description>
- <posx>755</posx>
- <posy>80</posy>
+ <left>755</left>
+ <top>80</top>
<width>20</width>
<height>20</height>
<texture>scroll-right-focus.png</texture>
</control>
<control type="grouplist" id="2">
<description>control area</description>
- <posx>40</posx>
- <posy>120</posy>
+ <left>40</left>
+ <top>120</top>
<width>720</width>
<height>380</height>
<itemgap>5</itemgap>
<onright>30</onright>
</control>
<control type="scrollbar" id="30">
- <posx>765</posx>
- <posy>120</posy>
+ <left>765</left>
+ <top>120</top>
<width>25</width>
<height>380</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="group" id="9001">
- <posy>535</posy>
- <posx>90</posx>
+ <top>535</top>
+ <left>90</left>
<control type="button" id="10">
<description>OK Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="11">
<description>Cancel Button</description>
- <posx>210</posx>
- <posy>0</posy>
+ <left>210</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="12">
<description>Defaults Button</description>
- <posx>420</posx>
- <posy>0</posy>
+ <left>420</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
<animation effect="slide" start="1100,0" end="0,0" time="400" tween="quadratic" easing="out">WindowOpen</animation>
<animation effect="slide" start="0,0" end="1100,0" time="400" tween="quadratic" easing="out">WindowClose</animation>
<control type="image">
- <posx>180</posx>
- <posy>0</posy>
+ <left>180</left>
+ <top>0</top>
<width>1100</width>
<height>720</height>
<texture border="15,0,0,0" flipx="true">MediaBladeSub.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>230</posx>
- <posy>0</posy>
+ <left>230</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
<control type="label">
<description>Album header label</description>
- <posx>210</posx>
- <posy>50</posy>
+ <left>210</left>
+ <top>50</top>
<width>1030</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="label">
<description>Artist header label</description>
- <posx>210</posx>
- <posy>50</posy>
+ <left>210</left>
+ <top>50</top>
<width>1030</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="group">
<visible>Control.HasFocus(12)</visible>
- <posy>90</posy>
- <posx>387</posx>
+ <top>90</top>
+ <left>387</left>
<include>VisibleFadeEffect</include>
<control type="image">
<description>Current Fanart image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<texture background="true">$INFO[ListItem.Art(fanart)]</texture>
<visible>IsEmpty(Listitem.Property(Fanart_Image))</visible>
<control type="image">
<description>No Fanart Back</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<texture>Fanart_Fallback_Music_Small.jpg</texture>
<colordiffuse>88FFFFFF</colordiffuse>
</control>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<font>font30_title</font>
</control>
<control type="group">
<visible>container.content(Albums) + !Control.HasFocus(12)</visible>
- <posy>90</posy>
- <posx>210</posx>
+ <top>90</top>
+ <left>210</left>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>380</width>
<height>360</height>
<aspectratio>keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="list" id="49">
- <posx>390</posx>
- <posy>20</posy>
+ <left>390</left>
+ <top>20</top>
<width>640</width>
<height>330</height>
<onleft>49</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30">
<control type="label">
- <posx>140</posx>
- <posy>0</posy>
+ <left>140</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>500</width>
<height>30</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="30">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>30</height>
<visible>Control.HasFocus(49)</visible>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>140</posx>
- <posy>0</posy>
+ <left>140</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>500</width>
<height>30</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>390</posx>
- <posy>370</posy>
+ <left>390</left>
+ <top>370</top>
<width>640</width>
<height>4</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="group">
<visible>container.content(Artists) + !Control.HasFocus(12)</visible>
- <posy>90</posy>
- <posx>210</posx>
+ <top>90</top>
+ <left>210</left>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>380</width>
<height>360</height>
<aspectratio>keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="list" id="49">
- <posx>390</posx>
- <posy>20</posy>
+ <left>390</left>
+ <top>20</top>
<width>640</width>
<height>330</height>
<onleft>49</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30">
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>465</width>
<height>30</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="30">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>30</height>
<visible>Control.HasFocus(49)</visible>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>465</width>
<height>30</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>390</posx>
- <posy>370</posy>
+ <left>390</left>
+ <top>370</top>
<width>640</width>
<height>4</height>
<aspectratio>stretch</aspectratio>
</control>
</control>
<control type="label">
- <posx>130r</posx>
- <posy>480</posy>
+ <right>130r</right>
+ <top>480</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<visible>Control.IsVisible(4)</visible>
</control>
<control type="label">
- <posx>130r</posx>
- <posy>480</posy>
+ <right>130r</right>
+ <top>480</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<visible>Control.IsVisible(50) + Container.Content(Albums)</visible>
</control>
<control type="label">
- <posx>130r</posx>
- <posy>480</posy>
+ <right>130r</right>
+ <top>480</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="spincontrol" id="61">
<description>Next page button</description>
- <posx>120r</posx>
- <posy>485</posy>
+ <left>120r</left>
+ <top>485</top>
<subtype>page</subtype>
<font>-</font>
<onleft>61</onleft>
</control>
<control type="textbox" id="4">
<description>Description</description>
- <posx>210</posx>
- <posy>515</posy>
+ <left>210</left>
+ <top>515</top>
<width>1030</width>
<height>120</height>
<font>font12</font>
</control>
<control type="image">
<description>Actor image</description>
- <posx>210</posx>
- <posy>480</posy>
+ <left>210</left>
+ <top>480</top>
<width>160</width>
<height>160</height>
<texture fallback="DefaultAlbumCover.png">$INFO[Container(50).Listitem.Icon]</texture>
<visible>Control.IsVisible(50)</visible>
</control>
<control type="panel" id="50">
- <posx>380</posx>
- <posy>520</posy>
+ <left>380</left>
+ <top>520</top>
<width>860</width>
<height>120</height>
<onleft>9000</onleft>
<orientation>vertical</orientation>
<itemlayout condition="Container.Content(Albums)" height="40" width="430">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>410</width>
<height>40</height>
<font>font12</font>
<label>([COLOR=selected][B]$INFO[ListItem.TrackNumber][/B][/COLOR]) - $INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>420</posx>
- <posy>0</posy>
+ <left>420</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout condition="Container.Content(Albums)" height="40" width="430">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<visible>!Control.HasFocus(50)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<visible>Control.HasFocus(50)</visible>
<texture border="5">button-focus2.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>410</width>
<height>40</height>
<font>font12</font>
<label>([COLOR=selected][B]$INFO[ListItem.TrackNumber][/B][/COLOR]) - $INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>420</posx>
- <posy>0</posy>
+ <left>420</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
<itemlayout condition="Container.Content(Artists)" height="40" width="430">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>410</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout condition="Container.Content(Artists)" height="40" width="430">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<visible>!Control.HasFocus(50)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<visible>Control.HasFocus(50)</visible>
<texture border="5">button-focus2.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>410</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="grouplist" id="9000">
- <posx>210</posx>
- <posy>660</posy>
+ <left>210</left>
+ <top>660</top>
<width>1030</width>
<height>40</height>
<itemgap>2</itemgap>
<animation effect="fade" time="200">WindowClose</animation>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="group">
- <posx>1070</posx>
- <posy>640</posy>
+ <left>1070</left>
+ <top>640</top>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>70</height>
<texture border="20">OverlayDialogBackground.png</texture>
</control>
<control type="image">
<description>Busy animation</description>
- <posx>20</posx>
- <posy>20</posy>
+ <left>20</left>
+ <top>20</top>
<width>32</width>
<height>32</height>
<texture>busy.png</texture>
</control>
<control type="label">
<description>Busy label</description>
- <posx>60</posx>
- <posy>20</posy>
+ <left>60</left>
+ <top>20</top>
<width>120</width>
<height>32</height>
<align>left</align>
</control>
<control type="progress" id="10">
<description>Progressbar</description>
- <posx>20</posx>
- <posy>53</posy>
+ <left>20</left>
+ <top>53</top>
<width>160</width>
<height>8</height>
</control>
<include>dialogeffect</include>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="button" id="9001">
<description>Make sure we hit the first button in the group list and not the close window button</description>
- <posx>-16</posx>
- <posy>-16</posy>
+ <left>-16</left>
+ <top>-16</top>
<width>4</width>
<height>4</height>
<label>-</label>
<ondown>2</ondown>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture>black-back.png</texture>
</control>
<control type="grouplist" id="9000">
- <posx>470</posx>
- <posy>0</posy>
+ <left>470</left>
+ <top>0</top>
<width>340</width>
<height>720</height>
<onleft>9000</onleft>
<height>30</height>
<control type="image">
<description>background top image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>340</width>
<height>30</height>
<texture border="20,19,20,0">DialogContextTop.png</texture>
</control>
<control type="button" id="20">
<description>Close Window button</description>
- <posx>260</posx>
- <posy>5</posy>
+ <left>260</left>
+ <top>5</top>
<width>64</width>
<height>32</height>
<label>-</label>
<visible>System.HasAlarm(shutdowntimer)</visible>
<control type="image">
<description>background top image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>340</width>
<height>70</height>
<texture border="25,5,25,5">DialogContextMiddle.png</texture>
</control>
<control type="textbox">
- <posx>25</posx>
- <posy>20</posy>
+ <left>25</left>
+ <top>20</top>
<width>290</width>
<height>50</height>
<font>font12</font>
</control>
<control type="image" id="14">
<description>background bottom image</description>
- <posx>0</posx>
+ <left>0</left>
<width>340</width>
<height>25</height>
<texture border="20,0,19,20">DialogContextBottom.png</texture>
<defaultcontrol always="true">3</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>20</posy>
+ <left>240</left>
+ <top>20</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<animation effect="fade" start="100" end="0" time="200" condition="Window.IsActive(AddonSettings)">Conditional</animation>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>680</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>Content Picker Header</description>
- <posx>30</posx>
- <posy>60</posy>
+ <left>30</left>
+ <top>60</top>
<width>320</width>
<height>40</height>
<font>font12</font>
</control>
<control type="spincontrolex" id="3">
<description>Content Picker</description>
- <posx>30</posx>
- <posy>100</posy>
+ <left>30</left>
+ <top>100</top>
<width>320</width>
<height>40</height>
<texturefocus border="5">button-focus.png</texturefocus>
</control>
<control type="label">
<description>Content Picker label</description>
- <posx>35</posx>
- <posy>100</posy>
+ <left>35</left>
+ <top>100</top>
<width>280</width>
<height>40</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Used Scraper Header</description>
- <posx>30</posx>
- <posy>150</posy>
+ <left>30</left>
+ <top>150</top>
<width>320</width>
<height>20</height>
<font>font12</font>
</control>
<control type="image">
<description>Used Scraper Image</description>
- <posx>30</posx>
- <posy>175</posy>
+ <left>30</left>
+ <top>175</top>
<width>320</width>
<height>130</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Used Scaper Label</description>
- <posx>30</posx>
- <posy>315</posy>
+ <left>30</left>
+ <top>315</top>
<width>320</width>
<height>30</height>
<font>font13</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="image">
- <posx>370</posx>
- <posy>60</posy>
+ <left>370</left>
+ <top>60</top>
<width>5</width>
<height>280</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>Scraper List Header</description>
- <posx>400</posx>
- <posy>60</posy>
+ <left>400</left>
+ <top>60</top>
<width>360</width>
<height>40</height>
<font>font12</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="4">
- <posx>400</posx>
- <posy>100</posy>
+ <left>400</left>
+ <top>100</top>
<width>360</width>
<height>241</height>
<onup>4</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>360</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>35</width>
<height>30</height>
<texture>$INFO[Listitem.Icon]</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>290</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>360</width>
<height>40</height>
<visible>!Control.HasFocus(4)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>360</width>
<height>40</height>
<visible>Control.HasFocus(4)</visible>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>35</width>
<height>30</height>
<texture>$INFO[Listitem.Icon]</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>290</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>760</posx>
- <posy>100</posy>
+ <left>760</left>
+ <top>100</top>
<width>25</width>
<height>240</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>Scanning Options Header</description>
- <posx>30</posx>
- <posy>350</posy>
+ <left>30</left>
+ <top>350</top>
<width>740</width>
<height>20</height>
<font>font12</font>
</control>
<control type="grouplist" id="5">
<description>control area</description>
- <posx>30</posx>
- <posy>380</posy>
+ <left>30</left>
+ <top>380</top>
<width>740</width>
<height>220</height>
<itemgap>4</itemgap>
</control>
<control type="button" id="7">
<description>Default Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<texturefocus border="5">button-focus2.png</texturefocus>
</control>
<control type="radiobutton" id="8">
<description>Default RadioButton</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<texturefocus border="5">button-focus2.png</texturefocus>
</control>
<control type="group" id="9001">
- <posy>615</posy>
+ <top>615</top>
<control type="button" id="28">
<description>OK Button</description>
- <posx>300</posx>
- <posy>0</posy>
+ <left>300</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="29">
<description>Cancel Button</description>
- <posx>510</posx>
- <posy>0</posy>
+ <left>510</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="6">
<description>Settings Button</description>
- <posx>90</posx>
- <posy>0</posy>
+ <left>90</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
<include>dialogeffect</include>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="image" id="999">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>340</width>
<height>720</height>
<texture border="20">DialogBack.png</texture>
</control>
<control type="grouplist" id="996">
<description>grouplist for context buttons</description>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<width>300</width>
<height max="670">auto</height>
<itemgap>2</itemgap>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>260</posx>
- <posy>5</posy>
+ <left>260</left>
+ <top>5</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="button" id="1000">
<description>button template</description>
- <posx>-</posx>
- <posy>-</posy>
+ <left>-</left>
+ <top>-</top>
<width>300</width>
<height>38</height>
<font>fontContextMenu</font>
<texturefocus border="5">button-focus.png</texturefocus>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<?xml version="1.0" encoding="UTF-8"?>
<window>
- <defaultcontrol></defaultcontrol>
+ <defaultcontrol/>
<animation effect="slide" start="0,-70" end="0,0" time="100">WindowOpen</animation>
<animation effect="slide" start="0,0" end="0,-70" delay="400" time="100">WindowClose</animation>
<controls>
<control type="group">
- <posx>720</posx>
- <posy>0</posy>
+ <left>720</left>
+ <top>0</top>
<animation effect="slide" end="0,-80" time="200" condition="Window.IsVisible(FullscreenVideo) | Window.IsVisible(Visualisation)">conditional</animation>
<control type="image">
- <posx>0</posx>
- <posy>-10</posy>
+ <left>0</left>
+ <top>-10</top>
<width>400</width>
<height>70</height>
<texture flipy="true" border="20,20,20,2">InfoMessagePanel.png</texture>
</control>
<control type="label" id="30">
<description>Header Label</description>
- <posx>15</posx>
- <posy>4</posy>
+ <left>15</left>
+ <top>4</top>
<width>370</width>
<height>18</height>
<font>font10_title</font>
</control>
<control type="label" id="31">
<description>Title Label</description>
- <posx>15</posx>
- <posy>20</posy>
+ <left>15</left>
+ <top>20</top>
<width>370</width>
<height>20</height>
<font>font10</font>
</control>
<control type="progress" id="32">
<description>progress control</description>
- <posx>15</posx>
- <posy>42</posy>
+ <left>15</left>
+ <top>42</top>
<width>370</width>
<height>8</height>
</control>
<defaultcontrol always="true">450</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="group">
<animation effect="slide" start="400,0" end="0,0" time="400" tween="quadratic" easing="out">WindowOpen</animation>
<animation effect="slide" start="0,0" end="400,0" time="400" tween="quadratic" easing="out">WindowClose</animation>
<control type="image">
- <posx>400r</posx>
- <posy>0</posy>
+ <left>400r</left>
+ <top>0</top>
<width>400</width>
<height>720</height>
<texture border="15,0,0,0" flipx="true">HomeBladeSub.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>380r</posx>
- <posy>0</posy>
+ <left>380r</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
<visible>system.getbool(input.enablemouse)</visible>
</control>
<control type="image">
- <posx>370r</posx>
- <posy>30</posy>
+ <left>370r</left>
+ <top>30</top>
<width>200</width>
<height>200</height>
<aspectratio align="center">keep</aspectratio>
<bordersize>8</bordersize>
</control>
<control type="list" id="450">
- <posx>390r</posx>
- <posy>250</posy>
+ <left>390r</left>
+ <top>250</top>
<width>450</width>
<height>380</height>
<onup>450</onup>
<scrolltime>200</scrolltime>
<itemlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>350</width>
<height>40</height>
<font>font12_title</font>
</itemlayout>
<focusedlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>40</height>
<visible>!Control.HasFocus(450)</visible>
<texture border="3">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>40</height>
<visible>Control.HasFocus(450)</visible>
<texture border="3">button-focus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>350</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="label">
<description>Page label</description>
- <posx>30r</posx>
- <posy>670</posy>
+ <right>30r</right>
+ <top>670</top>
<width>350</width>
<height>30</height>
<align>right</align>
<include>dialogeffect</include>
<coordinates>
<system>1</system>
- <posx>315</posx>
- <posy>260</posy>
+ <left>315</left>
+ <top>260</top>
</coordinates>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>650</width>
<height>200</height>
<texture border="20">OverlayDialogBackground.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>560</posx>
- <posy>5</posy>
+ <left>560</left>
+ <top>5</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>heading label</description>
- <posx>40</posx>
- <posy>18</posy>
+ <left>40</left>
+ <top>18</top>
<width>570</width>
<height>30</height>
<align>center</align>
<textcolor>white</textcolor>
</control>
<control type="label">
- <posx>40</posx>
- <posy>60</posy>
+ <left>40</left>
+ <top>60</top>
<width>570</width>
<height>30</height>
<align>center</align>
<textcolor>grey2</textcolor>
</control>
<control type="image">
- <posx>50</posx>
- <posy>110</posy>
+ <left>50</left>
+ <top>110</top>
<width>20</width>
<height>25</height>
<texture>scroll-left-focus.png</texture>
<visible>Container(450).HasPrevious</visible>
</control>
<control type="image">
- <posx>575</posx>
- <posy>110</posy>
+ <left>575</left>
+ <top>110</top>
<width>20</width>
<height>25</height>
<texture>scroll-right-focus.png</texture>
<visible>Container(450).HasNext</visible>
</control>
<control type="list" id="450">
- <posx>85</posx>
- <posy>105</posy>
+ <left>85</left>
+ <top>105</top>
<width>480</width>
<height>100</height>
<onleft>450</onleft>
<scrolltime>200</scrolltime>
<itemlayout width="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>38</width>
<height>32</height>
<aspectratio>stretch</aspectratio>
</itemlayout>
<focusedlayout width="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>38</width>
<height>32</height>
<aspectratio>stretch</aspectratio>
</focusedlayout>
</control>
<control type="label">
- <posx>40</posx>
- <posy>155</posy>
+ <left>40</left>
+ <top>155</top>
<width>570</width>
<height>22</height>
<font>font13_title</font>
<info>Container(450).ListItem.Label</info>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol always="true">1</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>335</posx>
- <posy>235</posy>
+ <left>335</left>
+ <top>235</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>230</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>530</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>530</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>520</posx>
- <posy>15</posy>
+ <left>520</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="2">
<description>dialog line 1</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="3">
<description>dialog line 2</description>
- <posx>30</posx>
- <posy>95</posy>
+ <left>30</left>
+ <top>95</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="4">
<description>dialog line 3</description>
- <posx>30</posx>
- <posy>130</posy>
+ <left>30</left>
+ <top>130</top>
<width>550</width>
<height>30</height>
<align>left</align>
<animation effect="fade" start="0" end="100" time="200">WindowOpen</animation>
<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
<coordinates>
- <posx>860</posx>
- <posy>640</posy>
+ <left>860</left>
+ <top>640</top>
</coordinates>
<controls>
<control type="group">
<animation effect="slide" start="0,0" end="-190,0" time="200" condition="Window.IsVisible(BusyDialog)">conditional</animation>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>70</height>
<colordiffuse>EEFFFFFF</colordiffuse>
</control>
<control type="image" id="400">
<description>avatar</description>
- <posx>20</posx>
- <posy>10</posy>
+ <left>20</left>
+ <top>10</top>
<width>50</width>
<height>50</height>
<aspectratio>keep</aspectratio>
</control>
<control type="fadelabel" id="401">
<description>Line 1 Label</description>
- <posx>75</posx>
- <posy>15</posy>
+ <left>75</left>
+ <top>15</top>
<width>310</width>
<height>18</height>
<font>font12_title</font>
</control>
<control type="fadelabel" id="402">
<description>Line 2 Label</description>
- <posx>75</posx>
- <posy>35</posy>
+ <left>75</left>
+ <top>35</top>
<width>310</width>
<height>20</height>
<font>font12_title</font>
</control>
<control type="image" id="403">
<description>avatar</description>
- <posx>20</posx>
- <posy>10</posy>
+ <left>20</left>
+ <top>10</top>
<width>50</width>
<height>50</height>
<aspectratio>keep</aspectratio>
</control>
<control type="image" id="404">
<description>avatar</description>
- <posx>20</posx>
- <posy>10</posy>
+ <left>20</left>
+ <top>10</top>
<width>50</width>
<height>50</height>
<aspectratio>keep</aspectratio>
</control>
<control type="image" id="405">
<description>avatar</description>
- <posx>20</posx>
- <posy>10</posy>
+ <left>20</left>
+ <top>10</top>
<width>50</width>
<height>50</height>
<aspectratio>keep</aspectratio>
<animation effect="slide" start="0,0" end="0,-40" delay="400" time="100">WindowClose</animation>
<controls>
<control type="group">
- <posx>100</posx>
- <posy>0</posy>
+ <left>100</left>
+ <top>0</top>
<control type="image">
- <posx>0</posx>
- <posy>-10</posy>
+ <left>0</left>
+ <top>-10</top>
<width>370</width>
<height>70</height>
<texture flipy="true" border="20,20,20,2">InfoMessagePanel.png</texture>
</control>
<control type="label" id="401">
<description>Song Number Label</description>
- <posx>15</posx>
- <posy>2</posy>
+ <left>15</left>
+ <top>2</top>
<width>340</width>
<height>25</height>
<font>font13_title</font>
</control>
<control type="label" id="402">
<description>Song Name Label</description>
- <posx>15</posx>
- <posy>27</posy>
+ <left>15</left>
+ <top>27</top>
<width>340</width>
<height>20</height>
<font>font13</font>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<include>dialogeffect</include>
<coordinates>
<system>1</system>
- <posx>415</posx>
- <posy>275</posy>
+ <left>415</left>
+ <top>275</top>
</coordinates>
<controls>
<control type="group">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>450</width>
<height>170</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>370</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>370</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>360</posx>
- <posy>15</posy>
+ <left>360</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="401">
<description>Song Number Label</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>390</width>
<height>30</height>
<font>font28_title</font>
</control>
<control type="label" id="402">
<description>Song Name Label</description>
- <posx>30</posx>
- <posy>120</posy>
+ <left>30</left>
+ <top>120</top>
<width>390</width>
<height>20</height>
<font>font24</font>
<include>dialogeffect</include>
<coordinates>
<system>2</system>
- <posx>255</posx>
- <posy>145</posy>
+ <left>255</left>
+ <top>145</top>
</coordinates>
<controls>
<control type="group">
<include>VisibleFadeEffect</include>
<visible>!Window.IsVisible(numericinput)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>430</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>680</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="311">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>670</posx>
- <posy>15</posy>
+ <left>670</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
<visible>system.getbool(input.enablemouse)</visible>
</control>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>660</width>
<height>50</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label" id="310">
<description>Edit Text</description>
- <posx>55</posx>
- <posy>60</posy>
+ <left>55</left>
+ <top>60</top>
<width>650</width>
<height>50</height>
<font>font13</font>
<aligny>center</aligny>
</control>
<control type="image">
- <posx>130</posx>
- <posy>110</posy>
+ <left>130</left>
+ <top>110</top>
<width>500</width>
<height>30</height>
<aspectratio>stretch</aspectratio>
<texture>DialogHeader.png</texture>
</control>
<control type="group">
- <posx>30</posx>
- <posy>140</posy>
+ <left>30</left>
+ <top>140</top>
<control type="button" id="300">
<description>DONE button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>50</height>
<label>20177</label>
</control>
<control type="button" id="48">
<description>'0' button</description>
- <posx>200</posx>
- <posy>0</posy>
+ <left>200</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>300</onleft>
</control>
<control type="button" id="49">
<description>'1' button</description>
- <posx>250</posx>
- <posy>0</posy>
+ <left>250</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>48</onleft>
</control>
<control type="button" id="50">
<description>'2' button</description>
- <posx>300</posx>
- <posy>0</posy>
+ <left>300</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>49</onleft>
</control>
<control type="button" id="51">
<description>'3' button</description>
- <posx>350</posx>
- <posy>0</posy>
+ <left>350</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>50</onleft>
</control>
<control type="button" id="52">
<description>'4' button</description>
- <posx>400</posx>
- <posy>0</posy>
+ <left>400</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>51</onleft>
</control>
<control type="button" id="53">
<description>'5' button</description>
- <posx>450</posx>
- <posy>0</posy>
+ <left>450</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>52</onleft>
</control>
<control type="button" id="54">
<description>'6' button</description>
- <posx>500</posx>
- <posy>0</posy>
+ <left>500</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>53</onleft>
</control>
<control type="button" id="55">
<description>'7' button</description>
- <posx>550</posx>
- <posy>0</posy>
+ <left>550</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>54</onleft>
</control>
<control type="button" id="56">
<description>'8' button</description>
- <posx>600</posx>
- <posy>0</posy>
+ <left>600</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>55</onleft>
</control>
<control type="button" id="57">
<description>'9' button</description>
- <posx>650</posx>
- <posy>0</posy>
+ <left>650</left>
+ <top>0</top>
<width>50</width>
<height>50</height>
<onleft>56</onleft>
</control>
<control type="radiobutton" id="302">
<description>SHIFT button</description>
- <posx>0</posx>
- <posy>50</posy>
+ <left>0</left>
+ <top>50</top>
<width>200</width>
<height>50</height>
<label>20178</label>
</control>
<control type="button" id="65">
<description>'A' button</description>
- <posx>200</posx>
- <posy>50</posy>
+ <left>200</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>302</onleft>
</control>
<control type="button" id="66">
<description>'B' button</description>
- <posx>250</posx>
- <posy>50</posy>
+ <left>250</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>65</onleft>
</control>
<control type="button" id="67">
<description>'C' button</description>
- <posx>300</posx>
- <posy>50</posy>
+ <left>300</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>66</onleft>
</control>
<control type="button" id="68">
<description>'D' button</description>
- <posx>350</posx>
- <posy>50</posy>
+ <left>350</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>67</onleft>
</control>
<control type="button" id="69">
<description>'E' button</description>
- <posx>400</posx>
- <posy>50</posy>
+ <left>400</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>68</onleft>
</control>
<control type="button" id="70">
<description>'F' button</description>
- <posx>450</posx>
- <posy>50</posy>
+ <left>450</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>69</onleft>
</control>
<control type="button" id="71">
<description>'G' button</description>
- <posx>500</posx>
- <posy>50</posy>
+ <left>500</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>70</onleft>
</control>
<control type="button" id="72">
<description>'H' button</description>
- <posx>550</posx>
- <posy>50</posy>
+ <left>550</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>71</onleft>
</control>
<control type="button" id="73">
<description>'I' button</description>
- <posx>600</posx>
- <posy>50</posy>
+ <left>600</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>72</onleft>
</control>
<control type="button" id="74">
<description>'J' button</description>
- <posx>650</posx>
- <posy>50</posy>
+ <left>650</left>
+ <top>50</top>
<width>50</width>
<height>50</height>
<onleft>73</onleft>
</control>
<control type="radiobutton" id="303">
<description>CAPS LOCK button</description>
- <posx>0</posx>
- <posy>100</posy>
+ <left>0</left>
+ <top>100</top>
<width>200</width>
<height>50</height>
<label>20179</label>
</control>
<control type="button" id="75">
<description>'K' button</description>
- <posx>200</posx>
- <posy>100</posy>
+ <left>200</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>303</onleft>
</control>
<control type="button" id="76">
<description>'L' button</description>
- <posx>250</posx>
- <posy>100</posy>
+ <left>250</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>75</onleft>
</control>
<control type="button" id="77">
<description>'M' button</description>
- <posx>300</posx>
- <posy>100</posy>
+ <left>300</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>76</onleft>
</control>
<control type="button" id="78">
<description>'N' button</description>
- <posx>350</posx>
- <posy>100</posy>
+ <left>350</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>77</onleft>
</control>
<control type="button" id="79">
<description>'O' button</description>
- <posx>400</posx>
- <posy>100</posy>
+ <left>400</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>78</onleft>
</control>
<control type="button" id="80">
<description>'P' button</description>
- <posx>450</posx>
- <posy>100</posy>
+ <left>450</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>79</onleft>
</control>
<control type="button" id="81">
<description>'Q' button</description>
- <posx>500</posx>
- <posy>100</posy>
+ <left>500</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>80</onleft>
</control>
<control type="button" id="82">
<description>'R' button</description>
- <posx>550</posx>
- <posy>100</posy>
+ <left>550</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>81</onleft>
</control>
<control type="button" id="83">
<description>'S' button</description>
- <posx>600</posx>
- <posy>100</posy>
+ <left>600</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>82</onleft>
</control>
<control type="button" id="84">
<description>'T' button</description>
- <posx>650</posx>
- <posy>100</posy>
+ <left>650</left>
+ <top>100</top>
<width>50</width>
<height>50</height>
<onleft>83</onleft>
</control>
<control type="radiobutton" id="304">
<description>Symbols button</description>
- <posx>0</posx>
- <posy>150</posy>
+ <left>0</left>
+ <top>150</top>
<width>200</width>
<height>50</height>
<label>20180</label>
</control>
<control type="button" id="85">
<description>'U' button</description>
- <posx>200</posx>
- <posy>150</posy>
+ <left>200</left>
+ <top>150</top>
<width>50</width>
<height>50</height>
<onleft>304</onleft>
</control>
<control type="button" id="86">
<description>'V' button</description>
- <posx>250</posx>
- <posy>150</posy>
+ <left>250</left>
+ <top>150</top>
<width>50</width>
<height>50</height>
<onleft>85</onleft>
</control>
<control type="button" id="87">
<description>'W' button</description>
- <posx>300</posx>
- <posy>150</posy>
+ <left>300</left>
+ <top>150</top>
<width>50</width>
<height>50</height>
<onleft>86</onleft>
</control>
<control type="button" id="88">
<description>'X' button</description>
- <posx>350</posx>
- <posy>150</posy>
+ <left>350</left>
+ <top>150</top>
<width>50</width>
<height>50</height>
<onleft>87</onleft>
</control>
<control type="button" id="89">
<description>'Y' button</description>
- <posx>400</posx>
- <posy>150</posy>
+ <left>400</left>
+ <top>150</top>
<width>50</width>
<height>50</height>
<onleft>88</onleft>
</control>
<control type="button" id="90">
<description>'Z' button</description>
- <posx>450</posx>
- <posy>150</posy>
+ <left>450</left>
+ <top>150</top>
<width>50</width>
<height>50</height>
<onleft>89</onleft>
</control>
<control type="button" id="8">
<description>BACKSPACE button</description>
- <posx>500</posx>
- <posy>150</posy>
+ <left>500</left>
+ <top>150</top>
<width>200</width>
<height>50</height>
<label>20181</label>
</control>
<control type="button" id="307">
<description>IP Input button</description>
- <posx>0</posx>
- <posy>200</posy>
+ <left>0</left>
+ <top>200</top>
<width>200</width>
<height>50</height>
<texturenofocus border="25,5,25,5">KeyboardCornerBottomNF.png</texturenofocus>
</control>
<control type="button" id="32">
<description>SPACE button</description>
- <posx>200</posx>
- <posy>200</posy>
+ <left>200</left>
+ <top>200</top>
<width>300</width>
<height>50</height>
<label>20182</label>
</control>
<control type="button" id="305">
<description>previous button</description>
- <posx>500</posx>
- <posy>200</posy>
+ <left>500</left>
+ <top>200</top>
<width>100</width>
<height>50</height>
<label><</label>
</control>
<control type="button" id="306">
<description>next button</description>
- <posx>600</posx>
- <posy>200</posy>
+ <left>600</left>
+ <top>200</top>
<width>100</width>
<height>50</height>
<label>></label>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol always="true">5</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>100</posy>
+ <left>240</left>
+ <top>100</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>500</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="2">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
<control type="grouplist" id="5">
<description>control area</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>720</width>
<height>350</height>
<itemgap>4</itemgap>
<onright>6</onright>
</control>
<control type="scrollbar" id="6">
- <posx>755</posx>
- <posy>70</posy>
+ <left>755</left>
+ <top>70</top>
<width>25</width>
<height>350</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="button" id="7">
<description>Default Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="radiobutton" id="8">
<description>Default RadioButton</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="spincontrolex" id="9">
<description>Default SpinControlex</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="sliderex" id="10">
<description>Default Slider</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="edit" id="12">
<description>Default Edit</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="group" id="9001">
- <posx>190</posx>
- <posy>435</posy>
+ <left>190</left>
+ <top>435</top>
<control type="button" id="28">
<description>Ok Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="27">
<description>Clear Button</description>
- <posx>210</posx>
- <posy>0</posy>
+ <left>210</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
<defaultcontrol>10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>100</posy>
+ <left>240</left>
+ <top>100</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>500</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="2">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>path label</description>
- <posx>20</posx>
- <posy>65</posy>
+ <left>20</left>
+ <top>65</top>
<width>760</width>
<height>30</height>
<align>center</align>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="10">
- <posx>30</posx>
- <posy>105</posy>
+ <left>30</left>
+ <top>105</top>
<width>525</width>
<height>225</height>
<onup>9001</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>525</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>490</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>525</width>
<height>40</height>
<visible>!Control.HasFocus(10)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>525</width>
<height>41</height>
<visible>Control.HasFocus(10)</visible>
<texture border="5">button-focus2.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>490</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>555</posx>
- <posy>105</posy>
+ <left>555</left>
+ <top>105</top>
<width>25</width>
<height>225</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="group" id="9000">
- <posx>580</posx>
- <posy>105</posy>
+ <left>580</left>
+ <top>105</top>
<control type="button" id="11">
<description>Browse Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>190</width>
<height>40</height>
<label>1024</label>
</control>
<control type="button" id="13">
<description>Add Path Button</description>
- <posx>0</posx>
- <posy>45</posy>
+ <left>0</left>
+ <top>45</top>
<width>190</width>
<height>40</height>
<label>15019</label>
</control>
<control type="button" id="14">
<description>Remove Path Button</description>
- <posx>0</posx>
- <posy>90</posy>
+ <left>0</left>
+ <top>90</top>
<width>190</width>
<height>40</height>
<label>1210</label>
</control>
<control type="label">
<description>Name label</description>
- <posx>30</posx>
- <posy>335</posy>
+ <left>30</left>
+ <top>335</top>
<width>740</width>
<height>30</height>
<align>center</align>
</control>
<control type="button" id="12">
<description>Name Button</description>
- <posx>30</posx>
- <posy>370</posy>
+ <left>30</left>
+ <top>370</top>
<width>740</width>
<height>40</height>
<align>center</align>
<ondown>9001</ondown>
</control>
<control type="group" id="9001">
- <posx>190</posx>
- <posy>435</posy>
+ <left>190</left>
+ <top>435</top>
<control type="button" id="18">
<description>Ok Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="19">
<description>Cancel Button</description>
- <posx>210</posx>
- <posy>0</posy>
+ <left>210</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
<include>dialogeffect</include>
<coordinates>
<system>0</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="image">
- <posx>50r</posx>
- <posy>2</posy>
+ <left>50r</left>
+ <top>2</top>
<width>45</width>
<height>45</height>
<aspectratio>keep</aspectratio>
<texture>icon-mute.png</texture>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol>10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>135</posy>
+ <left>240</left>
+ <top>135</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>440</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="2">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="spincontrolex" id="10">
<description>Protocol SpinControl</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<height>40</height>
<width>740</width>
<texturefocus border="5">button-focus2.png</texturefocus>
</control>
<control type="button" id="11">
<description>Server Address Button</description>
- <posx>30</posx>
- <posy>115</posy>
+ <left>30</left>
+ <top>115</top>
<width>565</width>
<height>40</height>
<textoffsetx>12</textoffsetx>
</control>
<control type="button" id="12">
<description>Server Browse Button</description>
- <posx>600</posx>
- <posy>115</posy>
+ <left>600</left>
+ <top>115</top>
<width>170</width>
<height>40</height>
<textoffsetx>12</textoffsetx>
</control>
<control type="button" id="16">
<description>Remote path Button</description>
- <posx>30</posx>
- <posy>160</posy>
+ <left>30</left>
+ <top>160</top>
<width>740</width>
<height>40</height>
<textoffsetx>12</textoffsetx>
</control>
<control type="button" id="13">
<description>Port Button</description>
- <posx>30</posx>
- <posy>205</posy>
+ <left>30</left>
+ <top>205</top>
<width>740</width>
<height>40</height>
<textoffsetx>12</textoffsetx>
</control>
<control type="button" id="14">
<description>Username Button</description>
- <posx>30</posx>
- <posy>250</posy>
+ <left>30</left>
+ <top>250</top>
<width>740</width>
<height>40</height>
<textoffsetx>12</textoffsetx>
</control>
<control type="button" id="15">
<description>Password Button</description>
- <posx>30</posx>
- <posy>295</posy>
+ <left>30</left>
+ <top>295</top>
<width>740</width>
<height>40</height>
<textoffsetx>12</textoffsetx>
</control>
<control type="button" id="18">
<description>Ok Button</description>
- <posx>195</posx>
- <posy>375</posy>
+ <left>195</left>
+ <top>375</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="19">
<description>Cancel Button</description>
- <posx>405</posx>
- <posy>375</posy>
+ <left>405</left>
+ <top>375</top>
<width>200</width>
<height>40</height>
<align>center</align>
<ondown>10</ondown>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<include>dialogeffect</include>
<coordinates>
<system>2</system>
- <posx>480</posx>
- <posy>145</posy>
+ <left>480</left>
+ <top>145</top>
</coordinates>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>320</width>
<height>430</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>240</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="image">
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>260</width>
<height>50</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label" id="4">
<description>Edit Text</description>
- <posx>35</posx>
- <posy>70</posy>
+ <left>35</left>
+ <top>70</top>
<width>250</width>
<height>50</height>
<font>font13</font>
<aligny>center</aligny>
</control>
<control type="image">
- <posx>40</posx>
- <posy>120</posy>
+ <left>40</left>
+ <top>120</top>
<width>240</width>
<height>30</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label" id="1">
<description>dialog Heading</description>
- <posx>20</posx>
- <posy>20</posy>
+ <left>20</left>
+ <top>20</top>
<width>280</width>
<height>35</height>
<font>font12_title</font>
<wrapmultiline>true</wrapmultiline>
</control>
<control type="group">
- <posx>40</posx>
- <posy>155</posy>
+ <left>40</left>
+ <top>155</top>
<control type="button" id="11">
<description>1 button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="12">
<description>2 button</description>
- <posx>60</posx>
- <posy>0</posy>
+ <left>60</left>
+ <top>0</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="13">
<description>3 button</description>
- <posx>120</posx>
- <posy>0</posy>
+ <left>120</left>
+ <top>0</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="23">
<description>Backspace button</description>
- <posx>180</posx>
- <posy>0</posy>
+ <left>180</left>
+ <top>0</top>
<width>60</width>
<height>120</height>
<font>font12</font>
</control>
<control type="button" id="14">
<description>4 button</description>
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="15">
<description>5 button</description>
- <posx>60</posx>
- <posy>60</posy>
+ <left>60</left>
+ <top>60</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="16">
<description>6 button</description>
- <posx>120</posx>
- <posy>60</posy>
+ <left>120</left>
+ <top>60</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="17">
<description>7 button</description>
- <posx>0</posx>
- <posy>120</posy>
+ <left>0</left>
+ <top>120</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="18">
<description>8 button</description>
- <posx>60</posx>
- <posy>120</posy>
+ <left>60</left>
+ <top>120</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="19">
<description>9 button</description>
- <posx>120</posx>
- <posy>120</posy>
+ <left>120</left>
+ <top>120</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="21">
<description>Done button</description>
- <posx>180</posx>
- <posy>120</posy>
+ <left>180</left>
+ <top>120</top>
<width>60</width>
<height>120</height>
<font>font12</font>
</control>
<control type="button" id="20">
<description>prev button</description>
- <posx>0</posx>
- <posy>180</posy>
+ <left>0</left>
+ <top>180</top>
<width>60</width>
<height>60</height>
<font>font30</font>
</control>
<control type="button" id="10">
<description>0 button</description>
- <posx>60</posx>
- <posy>180</posy>
+ <left>60</left>
+ <top>180</top>
<width>60</width>
<height>60</height>
<font>font13</font>
</control>
<control type="button" id="22">
<description>next button</description>
- <posx>120</posx>
- <posy>180</posy>
+ <left>120</left>
+ <top>180</top>
<width>60</width>
<height>60</height>
<font>font30</font>
<defaultcontrol always="true">10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>335</posx>
- <posy>230</posy>
+ <left>335</left>
+ <top>230</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>240</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>530</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>530</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>520</posx>
- <posy>15</posy>
+ <left>520</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="2">
<description>dialog line 1</description>
- <posx>30</posx>
- <posy>60</posy>
+ <left>30</left>
+ <top>60</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="3">
<description>dialog line 2</description>
- <posx>30</posx>
- <posy>85</posy>
+ <left>30</left>
+ <top>85</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="4">
<description>dialog line 3</description>
- <posx>30</posx>
- <posy>110</posy>
+ <left>30</left>
+ <top>110</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="button" id="10">
<description>OK button</description>
- <posx>205</posx>
- <posy>175</posy>
+ <left>205</left>
+ <top>175</top>
<width>200</width>
<height>40</height>
<label>186</label>
<ondown>10</ondown>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<allowoverlay>no</allowoverlay>
<coordinates>
<system>1</system>
- <posx>190</posx>
- <posy>30</posy>
+ <left>190</left>
+ <top>30</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>900</width>
<height>660</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>820</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>820</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>820</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>810</posx>
- <posy>15</posy>
+ <left>810</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
<visible>system.getbool(input.enablemouse)</visible>
</control>
<control type="group">
- <posx>20</posx>
- <posy>70</posy>
+ <left>20</left>
+ <top>70</top>
<control type="scrollbar" id="60">
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>25</width>
<height>470</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="image">
- <posx>25</posx>
- <posy>0</posy>
+ <left>25</left>
+ <top>0</top>
<width>430</width>
<height>475</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="list" id="20">
- <posx>30</posx>
- <posy>5</posy>
+ <left>30</left>
+ <top>5</top>
<width>420</width>
<height>470</height>
<onup>20</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45" width="420">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>420</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<texture>$INFO[ListItem.Property(Icon)]</texture>
<visible>ListItem.Property(ActiveChannel)</visible>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<colordiffuse>77FFFFFF</colordiffuse>
<visible>!ListItem.Property(ActiveChannel)</visible>
</control>
<control type="label">
- <posx>45</posx>
- <posy>0</posy>
+ <left>45</left>
+ <top>0</top>
<width>335</width>
<height>40</height>
<font>font12</font>
<visible>ListItem.Property(ActiveChannel)</visible>
</control>
<control type="label">
- <posx>45</posx>
- <posy>0</posy>
+ <left>45</left>
+ <top>0</top>
<width>335</width>
<height>40</height>
<font>font12</font>
<visible>!ListItem.Property(ActiveChannel)</visible>
</control>
<control type="image">
- <posx>390</posx>
- <posy>10</posy>
+ <left>390</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>OverlayWatched.png</texture>
</itemlayout>
<focusedlayout height="65" width="420">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>420</width>
<height>60</height>
<texture border="5">button-focus2.png</texture>
<animation effect="fade" start="100" end="30" time="0" condition="!Control.HasFocus(20)">conditional</animation>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<texture>$INFO[ListItem.Property(Icon)]</texture>
<visible>ListItem.Property(ActiveChannel)</visible>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<colordiffuse>77FFFFFF</colordiffuse>
<visible>!ListItem.Property(ActiveChannel)</visible>
</control>
<control type="label">
- <posx>45</posx>
- <posy>0</posy>
+ <left>45</left>
+ <top>0</top>
<width>335</width>
<height>40</height>
<font>font12</font>
<visible>ListItem.Property(ActiveChannel)</visible>
</control>
<control type="label">
- <posx>45</posx>
- <posy>0</posy>
+ <left>45</left>
+ <top>0</top>
<width>335</width>
<height>40</height>
<font>font12</font>
<visible>!ListItem.Property(ActiveChannel)</visible>
</control>
<control type="image">
- <posx>390</posx>
- <posy>10</posy>
+ <left>390</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>OverlayWatched.png</texture>
<visible>ListItem.Property(Changed)</visible>
</control>
<control type="label">
- <posx>5</posx>
- <posy>30</posy>
+ <left>5</left>
+ <top>30</top>
<width>410</width>
<height>30</height>
<font>font12</font>
</control>
<control type="label">
<description>Page Count Label</description>
- <posx>30</posx>
- <posy>485</posy>
+ <left>30</left>
+ <top>485</top>
<width>420</width>
<height>20</height>
<font>font12</font>
</control>
<control type="group" id="9002">
<control type="group">
- <posx>490</posx>
- <posy>70</posy>
+ <left>490</left>
+ <top>70</top>
<control type="label">
<description>channel options Header</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>380</width>
<height>20</height>
<font>font12</font>
<textcolor>blue</textcolor>
<shadowcolor>black</shadowcolor>
</control>
- <control type="radiobutton" id ="7">
+ <control type="radiobutton" id="7">
<description>Channel activated</description>
- <posx>0</posx>
- <posy>25</posy>
+ <left>0</left>
+ <top>25</top>
<width>380</width>
<height>35</height>
<font>font12</font>
<onup>9000</onup>
<ondown>8</ondown>
</control>
- <control type="edit" id ="8">
+ <control type="edit" id="8">
<description>Channel name</description>
- <posx>0</posx>
- <posy>65</posy>
+ <left>0</left>
+ <top>65</top>
<width>380</width>
<height>35</height>
<font>font12</font>
<onup>7</onup>
<ondown>9</ondown>
</control>
- <control type="button" id ="9">
+ <control type="button" id="9">
<description>Channel logo Button</description>
- <posx>0</posx>
- <posy>105</posy>
+ <left>0</left>
+ <top>105</top>
<width>380</width>
<height>35</height>
<font>font12</font>
<onup>8</onup>
<ondown>12</ondown>
</control>
- <control type="image" id ="10">
+ <control type="image" id="10">
<description>Current Channel Icon</description>
- <posx>345</posx>
- <posy>107</posy>
+ <left>345</left>
+ <top>107</top>
<width>30</width>
<height>30</height>
<aspectratio>keep</aspectratio>
<info>ListItem.Property(Icon)</info>
</control>
- <control type="radiobutton" id ="12">
+ <control type="radiobutton" id="12">
<description>EPG activated</description>
- <posx>0</posx>
- <posy>145</posy>
+ <left>0</left>
+ <top>145</top>
<width>380</width>
<height>35</height>
<font>font12</font>
<onup>9</onup>
<ondown>13</ondown>
</control>
- <control type="spincontrolex" id ="13">
+ <control type="spincontrolex" id="13">
<description>EPG source</description>
- <posx>0</posx>
- <posy>185</posy>
+ <left>0</left>
+ <top>185</top>
<width>380</width>
<height>35</height>
<font>font12</font>
<onup>12</onup>
<ondown>14</ondown>
</control>
- <control type="radiobutton" id ="14">
+ <control type="radiobutton" id="14">
<description>Parental locked</description>
- <posx>0</posx>
- <posy>225</posy>
+ <left>0</left>
+ <top>225</top>
<width>380</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group">
- <posx>490</posx>
- <posy>360</posy>
+ <left>490</left>
+ <top>360</top>
<control type="label">
<description>channel options Header</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>380</width>
<height>20</height>
<font>font12</font>
<textcolor>blue</textcolor>
<shadowcolor>black</shadowcolor>
</control>
- <control type="button" id ="30">
+ <control type="button" id="30">
<description>Group Manager Button</description>
- <posx>0</posx>
- <posy>25</posy>
+ <left>0</left>
+ <top>25</top>
<width>190</width>
<height>35</height>
<font>font12</font>
<onup>14</onup>
<ondown>31</ondown>
</control>
- <control type="button" id ="34">
+ <control type="button" id="34">
<description>TV/Radio Button</description>
- <posx>195</posx>
- <posy>25</posy>
+ <left>195</left>
+ <top>25</top>
<width>185</width>
<height>35</height>
<font>font12</font>
<onup>14</onup>
<ondown>31</ondown>
</control>
- <control type="button" id ="34">
+ <control type="button" id="34">
<description>TV/Radio Button</description>
- <posx>195</posx>
- <posy>25</posy>
+ <left>195</left>
+ <top>25</top>
<width>185</width>
<height>35</height>
<font>font12</font>
<onup>14</onup>
<ondown>31</ondown>
</control>
- <control type="button" id ="31">
+ <control type="button" id="31">
<description>Edit channel Button</description>
- <posx>0</posx>
- <posy>65</posy>
+ <left>0</left>
+ <top>65</top>
<width>380</width>
<height>35</height>
<font>font12</font>
<onup>30</onup>
<ondown>32</ondown>
</control>
- <control type="button" id ="32">
+ <control type="button" id="32">
<description>Delete channel Button</description>
- <posx>0</posx>
- <posy>105</posy>
+ <left>0</left>
+ <top>105</top>
<width>380</width>
<height>35</height>
<font>font12</font>
<onup>31</onup>
<ondown>33</ondown>
</control>
- <control type="button" id ="33">
+ <control type="button" id="33">
<description>New channel Button</description>
- <posx>0</posx>
- <posy>145</posy>
+ <left>0</left>
+ <top>145</top>
<width>380</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group" id="9000">
- <posx>70</posx>
- <posy>590</posy>
- <control type="button" id ="4">
+ <left>70</left>
+ <top>590</top>
+ <control type="button" id="4">
<description>OK Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<label>186</label>
<onup>33</onup>
<ondown>7</ondown>
</control>
- <control type="button" id ="5">
+ <control type="button" id="5">
<description>Apply changes Button</description>
- <posx>260</posx>
- <posy>0</posy>
+ <left>260</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<label>14070</label>
<onup>33</onup>
<ondown>7</ondown>
</control>
- <control type="button" id ="6">
+ <control type="button" id="6">
<description>Cancel Button</description>
- <posx>520</posx>
- <posy>0</posy>
+ <left>520</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<label>222</label>
<defaultcontrol always="true">11</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>780</posx>
- <posy>30</posy>
+ <left>780</left>
+ <top>30</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="group">
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>480</width>
<height>660</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>390</posx>
- <posy>15</posy>
+ <left>390</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>400</width>
<height>50</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>430</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>430</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>-7</posy>
+ <left>40</left>
+ <top>-7</top>
<width>430</width>
<height>120</height>
<font>font10_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="11">
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>410</width>
<height>520</height>
<onleft>PreviousChannelGroup</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="70" width="410">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>410</width>
<height>65</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>40</width>
<height>30</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="image">
- <posx>5</posx>
- <posy>35</posy>
+ <left>5</left>
+ <top>35</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>350</width>
<height>25</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>350</width>
<height>20</height>
<font>font12</font>
<visible>IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>300</width>
<height>20</height>
<font>font12</font>
<visible>!IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>44</posy>
+ <left>50</left>
+ <top>44</top>
<width>60</width>
<height>20</height>
<font>font10_title</font>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>110</posx>
- <posy>53</posy>
+ <left>110</left>
+ <top>53</top>
<width>230</width>
<height>6</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>ListItem.HasEpg</visible>
</control>
<control type="label">
- <posx>355</posx>
- <posy>44</posy>
+ <left>355</left>
+ <top>44</top>
<width>60</width>
<height>20</height>
<font>font10_title</font>
<visible>ListItem.HasEpg</visible>
</control>
<control type="image">
- <posx>360</posx>
- <posy>4</posy>
+ <left>360</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>$INFO[ListItem.Icon]</texture>
</itemlayout>
<focusedlayout height="70" width="410">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>410</width>
<height>65</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>410</width>
<height>65</height>
<texture border="5">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>40</width>
<height>30</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="image">
- <posx>5</posx>
- <posy>35</posy>
+ <left>5</left>
+ <top>35</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>350</width>
<height>25</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>350</width>
<height>20</height>
<font>font12</font>
<visible>IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>300</width>
<height>20</height>
<font>font12</font>
<visible>!IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>44</posy>
+ <left>50</left>
+ <top>44</top>
<width>60</width>
<height>20</height>
<font>font10_title</font>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>110</posx>
- <posy>53</posy>
+ <left>110</left>
+ <top>53</top>
<width>230</width>
<height>6</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>ListItem.HasEpg</visible>
</control>
<control type="label">
- <posx>355</posx>
- <posy>44</posy>
+ <left>355</left>
+ <top>44</top>
<width>60</width>
<height>20</height>
<font>font10_title</font>
<visible>ListItem.HasEpg</visible>
</control>
<control type="image">
- <posx>360</posx>
- <posy>4</posy>
+ <left>360</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>$INFO[ListItem.Icon]</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>440</posx>
- <posy>70</posy>
+ <left>440</left>
+ <top>70</top>
<width>25</width>
<height>520</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>Page Count Label</description>
- <posx>450</posx>
- <posy>610</posy>
+ <right>450</right>
+ <top>610</top>
<width>400</width>
<height>20</height>
<font>font12</font>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<animation effect="slide" start="1150,0" end="0,0" time="400" tween="quadratic" easing="out">WindowOpen</animation>
<animation effect="slide" start="0,0" end="1150,0" time="400" tween="quadratic" easing="out">WindowClose</animation>
<control type="image">
- <posx>130</posx>
- <posy>0</posy>
+ <left>130</left>
+ <top>0</top>
<width>1150</width>
<height>720</height>
<texture border="15,0,0,0" flipx="true">MediaBladeSub.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>180</posx>
- <posy>0</posy>
+ <left>180</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
<control type="label">
<description>header label</description>
- <posx>160</posx>
- <posy>40</posy>
+ <left>160</left>
+ <top>40</top>
<width>1080</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="group">
<description>Group list</description>
- <posx>160</posx>
- <posy>80</posy>
+ <left>160</left>
+ <top>80</top>
<control type="label">
<description>name label</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>340</width>
<height>70</height>
<font>font13</font>
<textcolor>blue</textcolor>
</control>
<control type="image">
- <posx>0</posx>
- <posy>75</posy>
+ <left>0</left>
+ <top>75</top>
<width>340</width>
<height>460</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="list" id="13">
- <posx>5</posx>
- <posy>80</posy>
+ <left>5</left>
+ <top>80</top>
<width>330</width>
<height>450</height>
<onup>13</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>310</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<visible>!Control.HasFocus(13)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-focus2.png</texture>
<visible>Control.HasFocus(13)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>310</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="73">
- <posx>340</posx>
- <posy>75</posy>
+ <left>340</left>
+ <top>75</top>
<width>25</width>
<height>460</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="group">
<description>Channels list</description>
- <posx>525</posx>
- <posy>80</posy>
+ <left>525</left>
+ <top>80</top>
<control type="label" id="21">
<description>name label</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>340</width>
<height>70</height>
<font>font13</font>
<textcolor>blue</textcolor>
</control>
<control type="image">
- <posx>0</posx>
- <posy>75</posy>
+ <left>0</left>
+ <top>75</top>
<width>340</width>
<height>460</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="list" id="11">
- <posx>5</posx>
- <posy>85</posy>
+ <left>5</left>
+ <top>85</top>
<width>330</width>
<height>450</height>
<onup>11</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<control type="image">
<width>32</width>
<height>32</height>
- <posx>5</posx>
- <posy>4</posy>
+ <left>5</left>
+ <top>4</top>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>0</posy>
+ <left>40</left>
+ <top>0</top>
<width>280</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<visible>!Control.HasFocus(11)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-focus2.png</texture>
<control type="image">
<width>32</width>
<height>32</height>
- <posx>5</posx>
- <posy>4</posy>
+ <left>5</left>
+ <top>4</top>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>0</posy>
+ <left>40</left>
+ <top>0</top>
<width>280</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="71">
- <posx>340</posx>
- <posy>75</posy>
+ <left>340</left>
+ <top>75</top>
<width>25</width>
<height>460</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="group">
<description>Grouped Channels list</description>
- <posx>890</posx>
- <posy>80</posy>
+ <left>890</left>
+ <top>80</top>
<control type="label" id="22">
<description>name label</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>340</width>
<height>70</height>
<font>font13</font>
<textcolor>blue</textcolor>
</control>
<control type="image">
- <posx>0</posx>
- <posy>75</posy>
+ <left>0</left>
+ <top>75</top>
<width>340</width>
<height>460</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="list" id="12">
- <posx>5</posx>
- <posy>85</posy>
+ <left>5</left>
+ <top>85</top>
<width>330</width>
<height>450</height>
<onup>12</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<control type="image">
<width>32</width>
<height>32</height>
- <posx>5</posx>
- <posy>4</posy>
+ <left>5</left>
+ <top>4</top>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>0</posy>
+ <left>40</left>
+ <top>0</top>
<width>280</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<visible>!Control.HasFocus(12)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<height>40</height>
<texture border="5">button-focus2.png</texture>
<control type="image">
<width>32</width>
<height>32</height>
- <posx>5</posx>
- <posy>4</posy>
+ <left>5</left>
+ <top>4</top>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>0</posy>
+ <left>40</left>
+ <top>0</top>
<width>280</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="72">
- <posx>340</posx>
- <posy>75</posy>
+ <left>340</left>
+ <top>75</top>
<width>25</width>
<height>460</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
</control>
<control type="grouplist" id="9000">
- <posx>160</posx>
- <posy>660</posy>
+ <left>160</left>
+ <top>660</top>
<width>1080</width>
<height>40</height>
<itemgap>2</itemgap>
<defaultcontrol always="true">7</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<origin x="275" y="30">![Window.IsVisible(FullscreenVideo) | Window.IsVisible(Visualisation)]</origin>
</coordinates>
<include>dialogeffect</include>
<control type="group">
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>730</width>
<height>660</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>730</width>
<height>660</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>650</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>650</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>640</posx>
- <posy>15</posy>
+ <left>640</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>Title label</description>
- <posx>40</posx>
- <posy>70</posy>
+ <left>40</left>
+ <top>70</top>
<width>650</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="group">
<control type="group">
- <posx>40</posx>
- <posy>120</posy>
+ <left>40</left>
+ <top>120</top>
<control type="label">
<description>Time description</description>
- <posx>170</posx>
- <posy>0</posy>
+ <right>170</right>
+ <top>0</top>
<width>170</width>
<height>25</height>
<align>right</align>
</control>
<control type="label">
<description>Time value</description>
- <posx>180</posx>
- <posy>0</posy>
+ <left>180</left>
+ <top>0</top>
<width>470</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Duration</description>
- <posx>170</posx>
- <posy>35</posy>
+ <right>170</right>
+ <top>35</top>
<width>170</width>
<height>25</height>
<align>right</align>
</control>
<control type="label">
<description>Duration value</description>
- <posx>180</posx>
- <posy>35</posy>
+ <left>180</left>
+ <top>35</top>
<width>470</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Channel Name</description>
- <posx>170</posx>
- <posy>70</posy>
+ <right>170</right>
+ <top>70</top>
<width>170</width>
<height>25</height>
<align>right</align>
</control>
<control type="fadelabel">
<description>Channel Value</description>
- <posx>180</posx>
- <posy>70</posy>
+ <left>180</left>
+ <top>70</top>
<width>470</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Genre</description>
- <posx>170</posx>
- <posy>105</posy>
+ <right>170</right>
+ <top>105</top>
<width>170</width>
<height>25</height>
<align>right</align>
</control>
<control type="label">
<description>Genre value</description>
- <posx>180</posx>
- <posy>105</posy>
+ <left>180</left>
+ <top>105</top>
<width>470</width>
<label fallback="161">$INFO[ListItem.Genre]</label>
<align>left</align>
</control>
<control type="textbox" id="400">
<description>Plot value</description>
- <posx>40</posx>
- <posy>275</posy>
+ <left>40</left>
+ <top>275</top>
<width>650</width>
<height>295</height>
<font>font12</font>
<label fallback="161">$INFO[ListItem.Plot]</label>
</control>
<control type="grouplist" id="9000">
- <posx>40</posx>
- <posy>590</posy>
+ <left>40</left>
+ <top>590</top>
<width>640</width>
<height>40</height>
<itemgap>5</itemgap>
<defaultcontrol always="true">11</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>780</posx>
- <posy>30</posy>
+ <left>780</left>
+ <top>30</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="group">
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>480</width>
<height>660</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>390</posx>
- <posy>15</posy>
+ <left>390</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>400</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>430</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="label">
<description>Selected item's date</description>
- <posx>40</posx>
- <posy>60</posy>
+ <left>40</left>
+ <top>60</top>
<width>430</width>
<height>30</height>
<font>font11</font>
<aligny>center</aligny>
</control>
<control type="list" id="11">
- <posx>30</posx>
- <posy>100</posy>
+ <left>30</left>
+ <top>100</top>
<width>410</width>
<height>490</height>
<onleft>60</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="35" width="410">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>410</width>
<height>30</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>100</width>
<height>30</height>
<font>font13</font>
<label>$INFO[ListItem.StartTime]</label>
</control>
<control type="image">
- <posx>120</posx>
- <posy>5</posy>
+ <left>120</left>
+ <top>5</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>120</posx>
- <posy>5</posy>
+ <left>120</left>
+ <top>5</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>400</posx>
- <posy>0</posy>
+ <left>400</left>
+ <top>0</top>
<width>300</width>
<height>30</height>
<font>font12</font>
<visible>![ListItem.IsRecording | ListItem.HasTimer]</visible>
</control>
<control type="label">
- <posx>400</posx>
- <posy>0</posy>
+ <left>400</left>
+ <top>0</top>
<width>250</width>
<height>30</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="35" width="410">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>410</width>
<height>30</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>410</width>
<height>30</height>
<texture border="5">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>100</width>
<height>30</height>
<font>font13</font>
<label>$INFO[ListItem.StartTime]</label>
</control>
<control type="image">
- <posx>120</posx>
- <posy>5</posy>
+ <left>120</left>
+ <top>5</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>120</posx>
- <posy>5</posy>
+ <left>120</left>
+ <top>5</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>400</posx>
- <posy>0</posy>
+ <left>400</left>
+ <top>0</top>
<width>300</width>
<height>30</height>
<font>font12</font>
<visible>![ListItem.IsRecording | ListItem.HasTimer]</visible>
</control>
<control type="label">
- <posx>400</posx>
- <posy>0</posy>
+ <left>400</left>
+ <top>0</top>
<width>250</width>
<height>30</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>440</posx>
- <posy>100</posy>
+ <left>440</left>
+ <top>100</top>
<width>25</width>
<height>490</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>Page Count Label</description>
- <posx>450</posx>
- <posy>610</posy>
+ <right>450</right>
+ <top>610</top>
<width>400</width>
<height>20</height>
<font>font12</font>
<defaultcontrol always="true">9</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>210</posx>
- <posy>65</posy>
+ <left>210</left>
+ <top>65</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>865</width>
<height>605</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>785</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>785</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>775</posx>
- <posy>15</posy>
+ <left>775</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>Search string</description>
- <posx>30</posx>
- <posy>60</posy>
+ <left>30</left>
+ <top>60</top>
<width>320</width>
<height>40</height>
<font>font12caps</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="image">
- <posx>30</posx>
- <posy>100</posy>
+ <left>30</left>
+ <top>100</top>
<width>800</width>
<height>50</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="edit" id="9">
<description>Search string</description>
- <posx>35</posx>
- <posy>105</posy>
+ <left>35</left>
+ <top>105</top>
<width>790</width>
<height>40</height>
<font>font13</font>
</control>
<control type="textbox">
<description>Search help</description>
- <posx>30</posx>
- <posy>155</posy>
+ <left>30</left>
+ <top>155</top>
<width>800</width>
<height>70</height>
<align>left</align>
<label>$LOCALIZE[19001] $LOCALIZE[19002]</label>
</control>
<control type="group">
- <posx>30</posx>
- <posy>230</posy>
+ <left>30</left>
+ <top>230</top>
<control type="radiobutton" id="10">
<description>Include Description</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>35</height>
<width>400</width>
<font>font12</font>
</control>
<control type="radiobutton" id="11">
<description>Case Sensitive</description>
- <posx>0</posx>
- <posy>35</posy>
+ <left>0</left>
+ <top>35</top>
<height>35</height>
<width>400</width>
<font>font12</font>
</control>
<control type="edit" id="14">
<description>Start Date</description>
- <posx>0</posx>
- <posy>70</posy>
+ <left>0</left>
+ <top>70</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="edit" id="15">
<description>Stop Date</description>
- <posx>0</posx>
- <posy>105</posy>
+ <left>0</left>
+ <top>105</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="spincontrolex" id="18">
<description>Genre</description>
- <posx>0</posx>
- <posy>140</posy>
+ <left>0</left>
+ <top>140</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="radiobutton" id="20">
<description>Include unknown Genres</description>
- <posx>0</posx>
- <posy>175</posy>
+ <left>0</left>
+ <top>175</top>
<height>35</height>
<width>400</width>
<font>font12</font>
</control>
<control type="radiobutton" id="22">
<description>FTA only</description>
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<height>35</height>
<width>400</width>
<font>font12</font>
</control>
<control type="radiobutton" id="24">
<description>Ignore Timers</description>
- <posx>0</posx>
- <posy>245</posy>
+ <left>0</left>
+ <top>245</top>
<height>35</height>
<width>400</width>
<font>font12</font>
</control>
</control>
<control type="group">
- <posx>440</posx>
- <posy>230</posy>
+ <left>440</left>
+ <top>230</top>
<control type="spincontrolex" id="12">
<description>Min Duration</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="spincontrolex" id="13">
<description>Max Duration</description>
- <posx>0</posx>
- <posy>35</posy>
+ <left>0</left>
+ <top>35</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="edit" id="16">
<description>Start time</description>
- <posx>0</posx>
- <posy>70</posy>
+ <left>0</left>
+ <top>70</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="edit" id="17">
<description>Stop time</description>
- <posx>0</posx>
- <posy>105</posy>
+ <left>0</left>
+ <top>105</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="radiobutton" id="19">
<description>avoid repeats</description>
- <posx>0</posx>
- <posy>140</posy>
+ <left>0</left>
+ <top>140</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="spincontrolex" id="21">
<description>Groups</description>
- <posx>0</posx>
- <posy>175</posy>
+ <left>0</left>
+ <top>175</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="spincontrolex" id="23">
<description>Channels</description>
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<width>400</width>
<height>35</height>
<font>font12</font>
</control>
<control type="radiobutton" id="27">
<description>Ignore Recordings</description>
- <posx>0</posx>
- <posy>245</posy>
+ <left>0</left>
+ <top>245</top>
<height>35</height>
<width>400</width>
<font>font12</font>
</control>
</control>
<control type="group" id="9000">
- <posy>540</posy>
- <posx>125</posx>
+ <top>540</top>
+ <left>125</left>
<control type="button" id="28">
<description>Defaults Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="25">
<description>Cancel Button</description>
- <posx>210</posx>
- <posy>0</posy>
+ <left>210</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="26">
<description>Search Button</description>
- <posx>420</posx>
- <posy>0</posy>
+ <left>420</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol always="true">10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>275</posx>
- <posy>30</posy>
+ <left>275</left>
+ <top>30</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>730</width>
<height>660</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>730</width>
<height>660</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>650</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>650</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>640</posx>
- <posy>15</posy>
+ <left>640</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>Title label</description>
- <posx>40</posx>
- <posy>70</posy>
+ <left>40</left>
+ <top>70</top>
<width>650</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="group">
- <posx>40</posx>
- <posy>140</posy>
+ <left>40</left>
+ <top>140</top>
<control type="label">
<description>Start Date</description>
- <posx>170</posx>
- <posy>0</posy>
+ <right>170</right>
+ <top>0</top>
<width>160</width>
<height>25</height>
<align>right</align>
</control>
<control type="label">
<description>Start date value</description>
- <posx>180</posx>
- <posy>0</posy>
+ <left>180</left>
+ <top>0</top>
<width>470</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Start time</description>
- <posx>170</posx>
- <posy>35</posy>
+ <right>170</right>
+ <top>35</top>
<width>160</width>
<height>25</height>
<align>right</align>
</control>
<control type="label">
<description>Start Time value</description>
- <posx>180</posx>
- <posy>35</posy>
+ <left>180</left>
+ <top>35</top>
<width>470</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Channel Name</description>
- <posx>170</posx>
- <posy>70</posy>
+ <right>170</right>
+ <top>70</top>
<width>160</width>
<height>25</height>
<align>right</align>
</control>
<control type="fadelabel">
<description>Channel Value</description>
- <posx>180</posx>
- <posy>70</posy>
+ <left>180</left>
+ <top>70</top>
<width>470</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Duration</description>
- <posx>170</posx>
- <posy>105</posy>
+ <right>170</right>
+ <top>105</top>
<width>160</width>
<height>25</height>
<align>right</align>
</control>
<control type="label">
<description>Duration value</description>
- <posx>180</posx>
- <posy>105</posy>
+ <left>180</left>
+ <top>105</top>
<width>470</width>
<label>$INFO[ListItem.Duration]</label>
<align>left</align>
</control>
<control type="label">
<description>Genre</description>
- <posx>170</posx>
- <posy>140</posy>
+ <right>170</right>
+ <top>140</top>
<width>160</width>
<height>25</height>
<align>right</align>
</control>
<control type="label">
<description>Genre value</description>
- <posx>180</posx>
- <posy>140</posy>
+ <left>180</left>
+ <top>140</top>
<width>470</width>
<label fallback="161">$INFO[ListItem.Genre]</label>
<align>left</align>
</control>
<control type="label">
<description>Subtitle value</description>
- <posx>40</posx>
- <posy>185</posy>
+ <left>40</left>
+ <top>185</top>
<width>650</width>
<label>$INFO[ListItem.PlotOutline]</label>
<align>center</align>
</control>
</control>
<control type="label">
- <posx>610</posx>
- <posy>370</posy>
+ <right>610</right>
+ <top>370</top>
<width>400</width>
<height>30</height>
<font>font12</font>
</control>
<control type="spincontrol" id="60">
<description>Next page button</description>
- <posx>620</posx>
- <posy>375</posy>
+ <left>620</left>
+ <top>375</top>
<subtype>page</subtype>
<font>-</font>
<onleft>60</onleft>
</control>
<control type="textbox" id="400">
<description>PLOT</description>
- <posx>40</posx>
- <posy>400</posy>
+ <left>40</left>
+ <top>400</top>
<width>650</width>
<height>180</height>
<font>font12</font>
<label fallback="161">$INFO[ListItem.Plot]</label>
</control>
<control type="grouplist" id="9000">
- <posx>40</posx>
- <posy>590</posy>
+ <left>40</left>
+ <top>590</top>
<width>640</width>
<height>40</height>
<itemgap>5</itemgap>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol>29</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>275</posx>
- <posy>30</posy>
+ <left>275</left>
+ <top>30</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>730</width>
<height>660</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>650</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="2">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>650</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>640</posx>
- <posy>15</posy>
+ <left>640</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="grouplist" id="5">
<description>control area</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>670</width>
<height>510</height>
<itemgap>5</itemgap>
<onright>9001</onright>
</control>
<control type="group" id="9001">
- <posx>160</posx>
- <posy>590</posy>
+ <left>160</left>
+ <top>590</top>
<control type="button" id="28">
<description>OK Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="29">
<description>Cancel Button</description>
- <posx>210</posx>
- <posy>0</posy>
+ <left>210</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<align>center</align>
<texturenofocus border="5">button-nofocus.png</texturenofocus>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol always="true">20</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>335</posx>
- <posy>30</posy>
+ <left>335</left>
+ <top>30</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<include>VisibleFadeEffect</include>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>650</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>650</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>530</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>530</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>520</posx>
- <posy>15</posy>
+ <left>520</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="list" id="20">
- <posx>20</posx>
- <posy>65</posy>
+ <left>20</left>
+ <top>65</top>
<width>550</width>
<height>510</height>
<onup>20</onup>
<animation effect="slide" start="0,0" end="10,0" time="0" condition="!Control.IsVisible(61)">Conditional</animation>
<itemlayout height="85" width="550">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>80</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
<description>Name</description>
- <posx>10</posx>
- <posy>5</posy>
+ <left>10</left>
+ <top>5</top>
<width>520</width>
<height>20</height>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
<description>Product ID Vendor ID</description>
- <posx>10</posx>
- <posy>30</posy>
+ <left>10</left>
+ <top>30</top>
<width>520</width>
<height>20</height>
<label>$LOCALIZE[35504]: [COLOR=grey2]$INFO[ListItem.Property(Product)][/COLOR] $LOCALIZE[35503]: [COLOR=grey2]$INFO[ListItem.Property(Vendor)][/COLOR]</label>
</control>
<control type="label">
<description>class</description>
- <posx>10</posx>
- <posy>50</posy>
+ <left>10</left>
+ <top>50</top>
<width>520</width>
<height>20</height>
<label>$LOCALIZE[35501]: [COLOR=grey2]$INFO[ListItem.Property(Class)][/COLOR] $LOCALIZE[19114]: [COLOR=grey2]$INFO[ListItem.Property(Version)][/COLOR]</label>
</itemlayout>
<focusedlayout height="85" width="550">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>80</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>80</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="label">
<description>Name</description>
- <posx>10</posx>
- <posy>5</posy>
+ <left>10</left>
+ <top>5</top>
<width>520</width>
<height>20</height>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
<description>Product ID Vendor ID</description>
- <posx>10</posx>
- <posy>30</posy>
+ <left>10</left>
+ <top>30</top>
<width>520</width>
<height>20</height>
<label>$LOCALIZE[35504]: [COLOR=grey2]$INFO[ListItem.Property(Product)][/COLOR] $LOCALIZE[35503]: [COLOR=grey2]$INFO[ListItem.Property(Vendor)][/COLOR]</label>
</control>
<control type="label">
<description>class</description>
- <posx>10</posx>
- <posy>50</posy>
+ <left>10</left>
+ <top>50</top>
<width>520</width>
<height>20</height>
<label>$LOCALIZE[35501]: [COLOR=grey2]$INFO[ListItem.Property(Class)][/COLOR] $LOCALIZE[19114]: [COLOR=grey2]$INFO[ListItem.Property(Version)][/COLOR]</label>
</control>
<control type="scrollbar" id="61">
- <posx>570</posx>
- <posy>65</posy>
+ <left>570</left>
+ <top>65</top>
<width>25</width>
<height>510</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>580</posx>
- <posy>585</posy>
+ <right>580</right>
+ <top>585</top>
<width>300</width>
<height>35</height>
<font>font12</font>
</control>
<control type="button" id="10">
<description>OK button</description>
- <posx>20</posx>
- <posy>585</posy>
+ <left>20</left>
+ <top>585</top>
<width>200</width>
<height>40</height>
<label>186</label>
<defaultcontrol>5</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>290</posx>
- <posy>75</posy>
+ <left>290</left>
+ <top>75</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>700</width>
<height>570</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>620</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>620</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>610</posx>
- <posy>15</posy>
+ <left>610</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="3">
<description>No Settings Label</description>
- <posx>20</posx>
- <posy>180</posy>
+ <left>20</left>
+ <top>180</top>
<width>640</width>
<align>center</align>
<label>35004</label>
<control type="grouplist" id="5">
<animation effect="slide" start="0,0" end="5,0" time="0" condition="!Control.IsVisible(60)">Conditional</animation>
<description>control area</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>630</width>
<height>410</height>
<itemgap>5</itemgap>
<ondown>28</ondown>
</control>
<control type="scrollbar" id="60">
- <posx>658</posx>
- <posy>70</posy>
+ <left>658</left>
+ <top>70</top>
<width>25</width>
<height>410</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="button" id="7">
<description>Default Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="radiobutton" id="8">
<description>Default RadioButton</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="spincontrolex" id="9">
<description>Default SpinControlex</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="group" id="9000">
- <posx>40</posx>
- <posy>505</posy>
+ <left>40</left>
+ <top>505</top>
<control type="button" id="29">
<description>Cancel Button</description>
- <posy>0</posy>
- <posx>0</posx>
+ <top>0</top>
+ <left>0</left>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="28">
<description>OK Button</description>
- <posy>0</posy>
- <posx>210</posx>
+ <top>0</top>
+ <left>210</left>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="50">
<description>Defaults Button</description>
- <posy>0</posy>
- <posx>420</posx>
+ <top>0</top>
+ <left>420</left>
<width>200</width>
<height>40</height>
<align>center</align>
<defaultcontrol always="true">5</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>45</posy>
+ <left>240</left>
+ <top>45</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="group">
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>630</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>630</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
<visible>system.getbool(input.enablemouse)</visible>
</control>
<control type="scrollbar" id="60">
- <posx>755</posx>
- <posy>70</posy>
+ <left>755</left>
+ <top>70</top>
<width>25</width>
<height>495</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="list" id="5">
<animation effect="slide" start="0,0" end="10,0" time="0" condition="!Control.IsVisible(60)">Conditional</animation>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>720</width>
<height>495</height>
<onleft>60</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>710</posx>
- <posy>0</posy>
+ <left>710</left>
+ <top>0</top>
<width>650</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<visible>!Control.HasFocus(5)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<texture border="5">button-focus2.png</texture>
<visible>Control.HasFocus(5)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>710</posx>
- <posy>0</posy>
+ <left>710</left>
+ <top>0</top>
<width>650</width>
<height>40</height>
<font>font13</font>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>760</posx>
- <posy>570</posy>
+ <right>760</right>
+ <top>570</top>
<width>300</width>
<height>35</height>
<font>font12</font>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol always="true">10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>335</posx>
- <posy>230</posy>
+ <left>335</left>
+ <top>230</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>240</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>530</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>fake heading label</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>0</width>
<height>0</height>
<font>-</font>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>530</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>520</posx>
- <posy>15</posy>
+ <left>520</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="2">
<description>dialog line 1</description>
- <posx>30</posx>
- <posy>60</posy>
+ <left>30</left>
+ <top>60</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="3">
<description>dialog line 2</description>
- <posx>30</posx>
- <posy>85</posy>
+ <left>30</left>
+ <top>85</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="4">
<description>dialog line 3</description>
- <posx>30</posx>
- <posy>110</posy>
+ <left>30</left>
+ <top>110</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>30</posx>
- <posy>148</posy>
+ <left>30</left>
+ <top>148</top>
<width>550</width>
<height>16</height>
<info>System.Progressbar</info>
</control>
<control type="button" id="10">
<description>Cancel button</description>
- <posx>205</posx>
- <posy>175</posy>
+ <left>205</left>
+ <top>175</top>
<width>200</width>
<height>40</height>
<label>222</label>
<ondown>10</ondown>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<controls>
<control type="group">
<visible>player.chaptercount + Window.IsVisible(FullScreenVideo)</visible>
- <posx>665r</posx>
- <posy>-6</posy>
+ <left>665r</left>
+ <top>-6</top>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>150</width>
<height>70</height>
<colordiffuse>EEFFFFFF</colordiffuse>
</control>
<control type="label" id="1">
<description>Chapter Pos No</description>
- <posx>20</posx>
- <posy>10</posy>
+ <left>20</left>
+ <top>10</top>
<width>110</width>
<height>20</height>
<align>center</align>
</control>
<control type="label" id="1">
<description>Chapter Pos No</description>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<width>110</width>
<height>20</height>
<align>center</align>
</control>
</control>
<control type="group">
- <posx>520r</posx>
- <posy>-6</posy>
+ <left>520r</left>
+ <top>-6</top>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>70</height>
<colordiffuse>EEFFFFFF</colordiffuse>
<texture border="12">OverlayDialogBackground.png</texture>
</control>
<control type="group">
- <posx>260</posx>
- <posy>10</posy>
+ <left>260</left>
+ <top>10</top>
<control type="image">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>80</width>
<height>50</height>
<texture>OSDSeekFrame.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>3</posy>
+ <left>0</left>
+ <top>3</top>
<width>20</width>
<height>44</height>
<texture>OSDSeekRewind.png</texture>
<visible>Player.Rewinding</visible>
</control>
<control type="image">
- <posx>80</posx>
- <posy>3</posy>
+ <left>80</left>
+ <top>3</top>
<width>20</width>
<height>44</height>
<texture>OSDSeekForward.png</texture>
<visible>Player.Forwarding</visible>
</control>
<control type="image">
- <posx>31</posx>
- <posy>4</posy>
+ <left>31</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSDPause.png</texture>
<visible>Player.Paused</visible>
</control>
<control type="image">
- <posx>31</posx>
- <posy>4</posy>
+ <left>31</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSDPlay.png</texture>
</control>
<control type="image">
- <posx>28</posx>
- <posy>4</posy>
+ <left>28</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD2x.png</texture>
<visible>Player.Rewinding2x</visible>
</control>
<control type="image">
- <posx>25</posx>
- <posy>4</posy>
+ <left>25</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD4x.png</texture>
<visible>Player.Rewinding4x</visible>
</control>
<control type="image">
- <posx>22</posx>
- <posy>4</posy>
+ <left>22</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD8x.png</texture>
<visible>Player.Rewinding8x</visible>
</control>
<control type="image">
- <posx>19</posx>
- <posy>4</posy>
+ <left>19</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD16x.png</texture>
<visible>Player.Rewinding16x</visible>
</control>
<control type="image">
- <posx>17</posx>
- <posy>4</posy>
+ <left>17</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD32x.png</texture>
</control>
<control type="image">
- <posx>34</posx>
- <posy>4</posy>
+ <left>34</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD2x.png</texture>
<visible>Player.Forwarding2x</visible>
</control>
<control type="image">
- <posx>37</posx>
- <posy>4</posy>
+ <left>37</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD4x.png</texture>
<visible>Player.Forwarding4x</visible>
</control>
<control type="image">
- <posx>40</posx>
- <posy>4</posy>
+ <left>40</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD8x.png</texture>
<visible>Player.Forwarding8x</visible>
</control>
<control type="image">
- <posx>43</posx>
- <posy>4</posy>
+ <left>43</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD16x.png</texture>
<visible>Player.Forwarding16x</visible>
</control>
<control type="image">
- <posx>45</posx>
- <posy>4</posy>
+ <left>45</left>
+ <top>4</top>
<width>40</width>
<height>40</height>
<texture>OSD32x.png</texture>
<control type="label">
<description>Playing Label</description>
- <posx>20</posx>
- <posy>7</posy>
+ <left>20</left>
+ <top>7</top>
<width>240</width>
<height>20</height>
<align>left</align>
</control>
<control type="label">
<description>Paused Label</description>
- <posx>20</posx>
- <posy>7</posy>
+ <left>20</left>
+ <top>7</top>
<width>240</width>
<height>20</height>
<align>left</align>
</control>
<control type="label">
<description>Cache Label</description>
- <posx>20</posx>
- <posy>7</posy>
+ <left>20</left>
+ <top>7</top>
<width>240</width>
<height>20</height>
<align>left</align>
</control>
<control type="label">
<description>Seeking Label</description>
- <posx>20</posx>
- <posy>7</posy>
+ <left>20</left>
+ <top>7</top>
<width>240</width>
<height>20</height>
<align>left</align>
</control>
<control type="label">
<description>Final Seek amount Label</description>
- <posx>20</posx>
- <posy>7</posy>
+ <left>20</left>
+ <top>7</top>
<width>240</width>
<height>20</height>
<align>left</align>
</control>
<control type="label">
<description>FF Label</description>
- <posx>20</posx>
- <posy>7</posy>
+ <left>20</left>
+ <top>7</top>
<width>240</width>
<height>20</height>
<align>left</align>
</control>
<control type="label">
<description>RW Label</description>
- <posx>20</posx>
- <posy>7</posy>
+ <left>20</left>
+ <top>7</top>
<width>240</width>
<height>20</height>
<align>left</align>
</control>
<control type="label">
<description>Elapsed Time Label</description>
- <posx>20</posx>
- <posy>23</posy>
+ <left>20</left>
+ <top>23</top>
<width>240</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Seek Time Label</description>
- <posx>20</posx>
- <posy>23</posy>
+ <left>20</left>
+ <top>23</top>
<width>240</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="progress">
<description>ProgressbarCache</description>
- <posx>20</posx>
- <posy>45</posy>
+ <left>20</left>
+ <top>45</top>
<width>240</width>
<height>15</height>
<info>Player.ProgressCache</info>
</control>
<control type="progress" id="23">
<description>Progressbar</description>
- <posx>20</posx>
- <posy>45</posy>
+ <left>20</left>
+ <top>45</top>
<width>240</width>
<height>15</height>
<info>Player.Progress</info>
</control>
<control type="slider" id="401">
<description>Seek Slider</description>
- <posx>20</posx>
- <posy>42</posy>
+ <left>20</left>
+ <top>42</top>
<width>240</width>
<height>12</height>
<texturesliderbar>seekslider.png</texturesliderbar>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol always="true">3</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>335</posx>
- <posy>35</posy>
+ <left>335</left>
+ <top>35</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>650</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>650</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>530</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>530</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>520</posx>
- <posy>15</posy>
+ <left>520</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
<visible>system.getbool(input.enablemouse)</visible>
</control>
<control type="list" id="3">
- <posx>20</posx>
- <posy>67</posy>
+ <left>20</left>
+ <top>67</top>
<width>550</width>
<height>506</height>
<onup>3</onup>
<animation effect="slide" start="0,0" end="10,0" time="0" condition="!Control.IsVisible(61)">Conditional</animation>
<itemlayout height="46" width="550">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>0</posy>
+ <left>20</left>
+ <top>0</top>
<width>510</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="46" width="550">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>40</height>
<texture border="5">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>20</posx>
- <posy>0</posy>
+ <left>20</left>
+ <top>0</top>
<width>510</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="list" id="6">
- <posx>20</posx>
- <posy>65</posy>
+ <left>20</left>
+ <top>65</top>
<width>550</width>
<height>510</height>
<onup>6</onup>
<animation effect="slide" start="0,0" end="10,0" time="0" condition="!Control.IsVisible(61)">Conditional</animation>
<itemlayout height="85" width="550">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>80</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>2</posx>
- <posy>2</posy>
+ <left>2</left>
+ <top>2</top>
<width>80</width>
<height>76</height>
<texture>$INFO[Listitem.Icon]</texture>
<bordersize>2</bordersize>
</control>
<control type="label">
- <posx>90</posx>
- <posy>0</posy>
+ <left>90</left>
+ <top>0</top>
<width>450</width>
<height>30</height>
<font>font13</font>
<label>[B]$INFO[ListItem.Label][/B]</label>
</control>
<control type="textbox">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<width>450</width>
<height>50</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="85" width="550">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>80</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>80</height>
<texture border="5">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>2</posx>
- <posy>2</posy>
+ <left>2</left>
+ <top>2</top>
<width>80</width>
<height>76</height>
<texture>$INFO[Listitem.Icon]</texture>
<bordersize>2</bordersize>
</control>
<control type="label">
- <posx>90</posx>
- <posy>0</posy>
+ <left>90</left>
+ <top>0</top>
<width>450</width>
<height>30</height>
<font>font13</font>
<label>[B]$INFO[ListItem.Label][/B]</label>
</control>
<control type="textbox">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<width>450</width>
<height>50</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="61">
- <posx>570</posx>
- <posy>65</posy>
+ <left>570</left>
+ <top>65</top>
<width>25</width>
<height>510</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>580</posx>
- <posy>585</posy>
+ <right>580</right>
+ <top>585</top>
<width>300</width>
<height>35</height>
<font>font12</font>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>580</posx>
- <posy>587</posy>
+ <right>580</right>
+ <top>587</top>
<width>300</width>
<height>35</height>
<font>font12</font>
</control>
<control type="button" id="5">
<description>Manual button</description>
- <posx>20</posx>
- <posy>585</posy>
+ <left>20</left>
+ <top>585</top>
<width>200</width>
<height>40</height>
<label>186</label>
<animation effect="slide" start="0,0" end="0,-80" time="100">WindowClose</animation>
<coordinates>
<system>1</system>
- <posx>405</posx>
- <posy>0</posy>
+ <left>405</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>-10</posy>
+ <left>0</left>
+ <top>-10</top>
<width>460</width>
<height>80</height>
<texture flipy="true" border="20,2,20,20">InfoMessagePanel.png</texture>
</control>
<control type="label" id="10">
<description>Dialog header</description>
- <posx>20</posx>
- <posy>10</posy>
+ <left>20</left>
+ <top>10</top>
<width>230</width>
<height>20</height>
<align>left</align>
</control>
<control type="label" id="12">
<description>Slider Value</description>
- <posx>440</posx>
- <posy>10</posy>
+ <right>440</right>
+ <top>10</top>
<width>220</width>
<height>20</height>
<align>right</align>
</control>
<control type="slider" id="11">
<description>Slider</description>
- <posx>20</posx>
- <posy>35</posy>
+ <left>20</left>
+ <top>35</top>
<width>420</width>
<height>20</height>
<aligny>center</aligny>
<defaultcontrol always="true">10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>185</posx>
- <posy>105</posy>
+ <left>185</left>
+ <top>105</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<visible>!Window.IsVisible(MusicInformation)</visible>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>910</width>
<height>510</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>830</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>830</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>820</posx>
- <posy>14</posy>
+ <left>820</left>
+ <top>14</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>Song Title value</description>
- <posx>40</posx>
- <posy>60</posy>
+ <left>40</left>
+ <top>60</top>
<width>830</width>
<height>30</height>
<align>center</align>
<scroll>true</scroll>
</control>
<control type="image">
- <posx>40</posx>
- <posy>120</posy>
+ <left>40</left>
+ <top>120</top>
<width>200</width>
<height>200</height>
<aspectratio aligny="bottom">keep</aspectratio>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>40</posx>
- <posy>320</posy>
+ <left>40</left>
+ <top>320</top>
<width>200</width>
<height>200</height>
<aspectratio aligny="top">keep</aspectratio>
<texture flipy="true" diffuse="diffuse_mirror2.png">$INFO[ListItem.Icon]</texture>
</control>
<control type="group">
- <posx>250</posx>
- <posy>120</posy>
+ <left>250</left>
+ <top>120</top>
<control type="label">
<description>Artist Title</description>
- <posx>150</posx>
- <posy>0</posy>
+ <right>150</right>
+ <top>0</top>
<width>150</width>
<height>25</height>
<align>right</align>
</control>
<control type="fadelabel">
<description>Artist Value</description>
- <posx>160</posx>
- <posy>0</posy>
+ <left>160</left>
+ <top>0</top>
<width>460</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Album Title</description>
- <posx>150</posx>
- <posy>30</posy>
+ <right>150</right>
+ <top>30</top>
<width>150</width>
<height>25</height>
<align>right</align>
</control>
<control type="fadelabel">
<description>Album Value</description>
- <posx>160</posx>
- <posy>30</posy>
+ <left>160</left>
+ <top>30</top>
<width>460</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Genre Title</description>
- <posx>150</posx>
- <posy>60</posy>
+ <right>150</right>
+ <top>60</top>
<width>150</width>
<height>25</height>
<align>right</align>
</control>
<control type="fadelabel">
<description>Genre Value</description>
- <posx>160</posx>
- <posy>60</posy>
+ <left>160</left>
+ <top>60</top>
<width>460</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Year Title</description>
- <posx>150</posx>
- <posy>90</posy>
+ <right>150</right>
+ <top>90</top>
<width>150</width>
<height>25</height>
<align>right</align>
</control>
<control type="fadelabel">
<description>Year Value</description>
- <posx>160</posx>
- <posy>90</posy>
+ <left>160</left>
+ <top>90</top>
<width>460</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Track Number Title</description>
- <posx>150</posx>
- <posy>120</posy>
+ <right>150</right>
+ <top>120</top>
<width>150</width>
<height>25</height>
<align>right</align>
</control>
<control type="fadelabel">
<description>Track Number Value</description>
- <posx>160</posx>
- <posy>120</posy>
+ <left>160</left>
+ <top>120</top>
<width>460</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Rating Title</description>
- <posx>150</posx>
- <posy>150</posy>
+ <right>150</right>
+ <top>150</top>
<width>150</width>
<height>25</height>
<align>right</align>
<label>$LOCALIZE[563]:</label>
</control>
<control type="group">
- <posx>160</posx>
- <posy>148</posy>
+ <left>160</left>
+ <top>148</top>
<control type="image">
<description>Rating value</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>150</width>
<height>32</height>
<aspectratio align="left">keep</aspectratio>
</control>
<control type="button" id="14">
<description>Decrease Rating</description>
- <posx>160</posx>
- <posy>5</posy>
+ <left>160</left>
+ <top>5</top>
<width>33</width>
<height>22</height>
<onclick>DecreaseRating</onclick>
</control>
<control type="button" id="15">
<description>Increase Rating</description>
- <posx>193</posx>
- <posy>5</posy>
+ <left>193</left>
+ <top>5</top>
<width>33</width>
<height>22</height>
<onclick>IncreaseRating</onclick>
</control>
<control type="label">
<description>Comment Title</description>
- <posx>150</posx>
- <posy>180</posy>
+ <right>150</right>
+ <top>180</top>
<width>150</width>
<height>25</height>
<align>right</align>
</control>
<control type="textbox">
<description>Comment value</description>
- <posx>160</posx>
- <posy>177</posy>
+ <left>160</left>
+ <top>177</top>
<width>460</width>
<height>140</height>
<font>font13</font>
</control>
</control>
<control type="group" id="9000">
- <posx>40</posx>
- <posy>445</posy>
- <control type="button" id ="10">
+ <left>40</left>
+ <top>445</top>
+ <control type="button" id="10">
<description>Ok button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<label>186</label>
</control>
<control type="button" id="11">
<description>Cancel button</description>
- <posx>210</posx>
- <posy>0</posy>
+ <left>210</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<label>222</label>
</control>
<control type="button" id="12">
<description>Album Info button</description>
- <posx>420</posx>
- <posy>0</posy>
+ <left>420</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<label>10523</label>
<onup>14</onup>
<ondown>14</ondown>
</control>
- <control type="button" id ="13">
+ <control type="button" id="13">
<description>Get Thumb button</description>
- <posx>630</posx>
- <posy>0</posy>
+ <left>630</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<label>13405</label>
<animation effect="slide" start="1100,0" end="0,0" time="400" tween="quadratic" easing="out">WindowOpen</animation>
<animation effect="slide" start="0,0" end="1100,0" time="400" tween="quadratic" easing="out">WindowClose</animation>
<control type="image">
- <posx>180</posx>
- <posy>0</posy>
+ <left>180</left>
+ <top>0</top>
<width>1100</width>
<height>720</height>
<texture border="15,0,0,0" flipx="true">MediaBladeSub.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>200</posx>
- <posy>0</posy>
+ <left>200</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
<control type="label" id="1">
<description>header label</description>
- <posx>210</posx>
- <posy>40</posy>
+ <left>210</left>
+ <top>40</top>
<width>1030</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="textbox" id="5">
<description>textarea</description>
- <posx>210</posx>
- <posy>90</posy>
+ <left>210</left>
+ <top>90</top>
<width>1000</width>
<height>600</height>
<label>-</label>
<pagecontrol>61</pagecontrol>
</control>
<control type="scrollbar" id="61">
- <posx>1220</posx>
- <posy>90</posy>
+ <left>1220</left>
+ <top>90</top>
<width>25</width>
<height>600</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<animation effect="slide" start="1100,0" end="0,0" time="400" tween="quadratic" easing="out">WindowOpen</animation>
<animation effect="slide" start="0,0" end="1100,0" time="400" tween="quadratic" easing="out">WindowClose</animation>
<control type="image">
- <posx>180</posx>
- <posy>0</posy>
+ <left>180</left>
+ <top>0</top>
<width>1100</width>
<height>720</height>
<texture border="15,0,0,0" flipx="true">MediaBladeSub.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>230</posx>
- <posy>0</posy>
+ <left>230</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
<control type="label">
<description>header label</description>
- <posx>210</posx>
- <posy>40</posy>
+ <left>210</left>
+ <top>40</top>
<width>1030</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>200</posx>
- <posy>480</posy>
+ <left>200</left>
+ <top>480</top>
<width>600</width>
<align>left</align>
<itemgap>2</itemgap>
</control>
<control type="group">
<visible>Control.HasFocus(12)</visible>
- <posy>90</posy>
- <posx>387</posx>
+ <top>90</top>
+ <left>387</left>
<include>VisibleFadeEffect</include>
<control type="image">
<description>Current Fanart image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<texture background="true">$INFO[ListItem.Art(fanart)]</texture>
<visible>IsEmpty(Listitem.Art(fanart))</visible>
<control type="image">
<description>No Fanart Back</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<texture>Fanart_Fallback_Small.jpg</texture>
<colordiffuse>99FFFFFF</colordiffuse>
</control>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<font>font30_title</font>
</control>
</control>
<control type="group">
- <posy>90</posy>
- <posx>387</posx>
+ <top>90</top>
+ <left>387</left>
<visible>Control.HasFocus(15)</visible>
<include>VisibleFadeEffect</include>
<control type="image">
<description>Border</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
<description>background</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>665</width>
<height>370</height>
<texture>black-back.png</texture>
</control>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>675</width>
<height>380</height>
<font>font30_title</font>
</control>
<control type="videowindow">
<description>No Fanart Back</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>665</width>
<height>370</height>
<visible>Player.HasVideo</visible>
</control>
<control type="group">
<visible>[!container.content(tvshows) + !container.content(episodes) + !container.content(musicvideos)] + ![Control.HasFocus(12) | Control.HasFocus(15)]</visible>
- <posy>90</posy>
- <posx>210</posx>
+ <top>90</top>
+ <left>210</left>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>270</width>
<height>380</height>
<aspectratio>stretch</aspectratio>
<texture background="true">$VAR[PosterThumb]</texture>
</control>
<control type="image">
- <posx>4</posx>
- <posy>4</posy>
+ <left>4</left>
+ <top>4</top>
<width>200</width>
<height>230</height>
<aspectratio>stretch</aspectratio>
<colordiffuse>AAFFFFFF</colordiffuse>
</control>
<control type="list" id="49">
- <posx>290</posx>
- <posy>20</posy>
+ <left>290</left>
+ <top>20</top>
<width>740</width>
<height>330</height>
<onleft>49</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30">
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>565</width>
<height>30</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="30">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>740</width>
<height>30</height>
<visible>Control.HasFocus(49)</visible>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>565</width>
<height>30</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>290</posx>
- <posy>370</posy>
+ <left>290</left>
+ <top>370</top>
<width>740</width>
<height>4</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="group">
<visible>Container.Content(TVShows) + !Control.HasFocus(12)</visible>
- <posy>90</posy>
- <posx>210</posx>
+ <top>90</top>
+ <left>210</left>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>270</width>
<height>380</height>
<aspectratio>stretch</aspectratio>
<texture background="true">$VAR[PosterThumb]</texture>
</control>
<control type="image">
- <posx>4</posx>
- <posy>4</posy>
+ <left>4</left>
+ <top>4</top>
<width>200</width>
<height>230</height>
<aspectratio>stretch</aspectratio>
<colordiffuse>AAFFFFFF</colordiffuse>
</control>
<control type="list" id="49">
- <posx>290</posx>
- <posy>20</posy>
+ <left>290</left>
+ <top>20</top>
<width>740</width>
<height>330</height>
<onleft>49</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30">
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>565</width>
<height>30</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="30">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>740</width>
<height>30</height>
<visible>Control.HasFocus(49)</visible>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>565</width>
<height>30</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>290</posx>
- <posy>370</posy>
+ <left>290</left>
+ <top>370</top>
<width>740</width>
<height>4</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="group">
<visible>container.content(episodes) + !Control.HasFocus(12)</visible>
- <posy>90</posy>
- <posx>210</posx>
+ <top>90</top>
+ <left>210</left>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>380</width>
<height>250</height>
<aspectratio aligny="bottom">keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>250</posy>
+ <left>0</left>
+ <top>250</top>
<width>380</width>
<height>250</height>
<aspectratio aligny="top">keep</aspectratio>
- <bordertexture border="5" flipy="true" diffuse="diffuse_mirror2.png">button-nofocus.png</bordertexture>
+ <bordertexture border="5" flipy="true" diffuse="diffuse_mirror2.png">button-nofocus.png</bordertexture>
<bordersize>4</bordersize>
<texture background="true" flipy="true" diffuse="diffuse_mirror2.png">$INFO[ListItem.Icon]</texture>
</control>
<control type="list" id="49">
- <posx>390</posx>
- <posy>20</posy>
+ <left>390</left>
+ <top>20</top>
<width>640</width>
<height>330</height>
<onleft>49</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30">
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>465</width>
<height>30</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="30">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>30</height>
<visible>Control.HasFocus(49)</visible>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>465</width>
<height>30</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>290</posx>
- <posy>370</posy>
+ <left>290</left>
+ <top>370</top>
<width>740</width>
<height>4</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="group">
<visible>container.content(musicvideos) + !Control.HasFocus(12)</visible>
- <posy>90</posy>
- <posx>210</posx>
+ <top>90</top>
+ <left>210</left>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>380</width>
<height>360</height>
<aspectratio>keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="list" id="49">
- <posx>390</posx>
- <posy>20</posy>
+ <left>390</left>
+ <top>20</top>
<width>640</width>
<height>330</height>
<onleft>49</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30">
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>465</width>
<height>30</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="30">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>30</height>
<visible>Control.HasFocus(49)</visible>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>160</width>
<height>30</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>175</posx>
- <posy>0</posy>
+ <left>175</left>
+ <top>0</top>
<width>465</width>
<height>30</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>390</posx>
- <posy>370</posy>
+ <left>390</left>
+ <top>370</top>
<width>640</width>
<height>4</height>
<aspectratio>stretch</aspectratio>
</control>
</control>
<control type="label">
- <posx>130r</posx>
- <posy>480</posy>
+ <right>130r</right>
+ <top>480</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<visible>Control.IsVisible(400)</visible>
</control>
<control type="label">
- <posx>130r</posx>
- <posy>480</posy>
+ <right>130r</right>
+ <top>480</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="spincontrol" id="61">
<description>Next page button</description>
- <posx>120r</posx>
- <posy>485</posy>
+ <left>120r</left>
+ <top>485</top>
<subtype>page</subtype>
<font>-</font>
<onleft>61</onleft>
</control>
<control type="textbox" id="400">
<description>Description Value for Movies</description>
- <posx>210</posx>
- <posy>515</posy>
+ <left>210</left>
+ <top>515</top>
<width>1030</width>
<height>120</height>
<font>font12</font>
</control>
<control type="image">
<description>Actor image</description>
- <posx>210</posx>
- <posy>480</posy>
+ <left>210</left>
+ <top>480</top>
<width>160</width>
<height>160</height>
<texture>$INFO[Container(50).Listitem.Icon]</texture>
<visible>Control.IsVisible(50)</visible>
</control>
<control type="panel" id="50">
- <posx>380</posx>
- <posy>520</posy>
+ <left>380</left>
+ <top>520</top>
<width>860</width>
<height>120</height>
<onleft>9000</onleft>
<orientation>vertical</orientation>
<itemlayout height="40" width="430">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>410</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="40" width="430">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<visible>!Control.HasFocus(50)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>430</width>
<height>40</height>
<visible>Control.HasFocus(50)</visible>
<texture border="5">button-focus2.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>410</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="grouplist" id="9000">
- <posx>210</posx>
- <posy>660</posy>
+ <left>210</left>
+ <top>660</top>
<width>1030</width>
<height>40</height>
<itemgap>2</itemgap>
<animation effect="slide" start="0,0" end="0,-40" delay="400" time="100">WindowClose</animation>
<controls>
<control type="group">
- <posx>820</posx>
- <posy>0</posy>
+ <left>820</left>
+ <top>0</top>
<control type="image">
- <posx>0</posx>
- <posy>-10</posy>
+ <left>0</left>
+ <top>-10</top>
<width>300</width>
<height>50</height>
<texture flipy="true" border="20,20,20,2">InfoMessagePanel.png</texture>
<visible>!player.passthrough</visible>
<control type="image">
<description>Lite Volume Logo</description>
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>40</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</control>
<control type="progress" id="1">
<description>progress control</description>
- <posx>50</posx>
- <posy>8</posy>
+ <left>50</left>
+ <top>8</top>
<width>230</width>
<height>18</height>
<info>Player.Volume</info>
<visible>player.passthrough</visible>
<control type="image">
<description>Lite Volume Logo</description>
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>40</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Passthrough Label</description>
- <posx>50</posx>
- <posy>6</posy>
+ <left>50</left>
+ <top>6</top>
<width>230</width>
<height>20</height>
<label>$LOCALIZE[29802]</label>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol always="true">10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>335</posx>
- <posy>230</posy>
+ <left>335</left>
+ <top>230</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>240</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>530</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="1">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>530</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>520</posx>
- <posy>15</posy>
+ <left>520</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="2">
<description>dialog line 1</description>
- <posx>30</posx>
- <posy>60</posy>
+ <left>30</left>
+ <top>60</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="3">
<description>dialog line 2</description>
- <posx>30</posx>
- <posy>85</posy>
+ <left>30</left>
+ <top>85</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="4">
<description>dialog line 3</description>
- <posx>30</posx>
- <posy>110</posy>
+ <left>30</left>
+ <top>110</top>
<width>550</width>
<height>30</height>
<align>left</align>
</control>
<control type="button" id="11">
<description>Yes button</description>
- <posx>95</posx>
- <posy>175</posy>
+ <left>95</left>
+ <top>175</top>
<width>200</width>
<height>40</height>
<label>107</label>
</control>
<control type="button" id="10">
<description>No button</description>
- <posx>305</posx>
- <posy>175</posy>
+ <left>305</left>
+ <top>175</top>
<width>200</width>
<height>40</height>
<label>106</label>
<ondown>10</ondown>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<allowoverlay>no</allowoverlay>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="group">
- <posx>580</posx>
+ <left>580</left>
<animation effect="slide" start="700,0" end="0,0" time="400" tween="quadratic" easing="out" condition="![Window.IsVisible(MovieInformation) | Window.IsVisible(MusicInformation)]">WindowOpen</animation>
<animation effect="slide" start="-400,0" end="0,0" time="400" tween="quadratic" easing="out" condition="[Window.IsVisible(MovieInformation) | Window.IsVisible(MusicInformation)]">WindowOpen</animation>
<animation effect="slide" start="0,0" end="700,0" time="400" tween="quadratic" easing="out" condition="![Window.IsVisible(MovieInformation) | Window.IsVisible(MusicInformation)]">WindowClose</animation>
<animation effect="slide" start="0,0" end="-400,0" time="400" tween="quadratic" easing="out" condition="[Window.IsVisible(MovieInformation) | Window.IsVisible(MusicInformation)]">WindowClose</animation>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>720</height>
<texture border="15,0,0,0" flipx="true">MediaBladeSub.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>20</posx>
- <posy>0</posy>
+ <left>20</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
<control type="label" id="411">
<description>header label</description>
- <posx>660</posx>
- <posy>40</posy>
+ <right>660</right>
+ <top>40</top>
<width>630</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="label" id="412">
<description>Path label</description>
- <posx>660</posx>
- <posy>70</posy>
+ <right>660</right>
+ <top>70</top>
<width>630</width>
<height>30</height>
<font>font13</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="grouplist" id="9000">
- <posx>20</posx>
- <posy>460</posy>
+ <left>20</left>
+ <top>460</top>
<width>221</width>
<height>225</height>
<itemgap>5</itemgap>
</control>
</control>
<control type="image">
- <posx>245</posx>
- <posy>460</posy>
+ <left>245</left>
+ <top>460</top>
<width>420</width>
<height>210</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>250</posx>
- <posy>465</posy>
+ <left>250</left>
+ <top>465</top>
<width>410</width>
<height>200</height>
<aspectratio>keep</aspectratio>
<visible>!SubString(Control.GetLabel(416),*)</visible>
</control>
<control type="image">
- <posx>250</posx>
- <posy>465</posy>
+ <left>250</left>
+ <top>465</top>
<width>410</width>
<height>200</height>
<aspectratio>keep</aspectratio>
<visible>SubString(Control.GetLabel(416),*)</visible>
</control>
<control type="panel" id="450">
- <posx>20</posx>
- <posy>120</posy>
+ <left>20</left>
+ <top>120</top>
<width>640</width>
<height>321</height>
<onleft>9000</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="40" width="640">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>2</posy>
+ <left>10</left>
+ <top>2</top>
<width>38</width>
<height>38</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>580</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="40" width="640">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>41</height>
<visible>!Control.HasFocus(450)</visible>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>41</height>
<visible>Control.HasFocus(450)</visible>
<texture border="5">MenuItemFO.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>2</posy>
+ <left>10</left>
+ <top>2</top>
<width>38</width>
<height>38</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>580</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="panel" id="451">
- <posx>20</posx>
- <posy>120</posy>
+ <left>20</left>
+ <top>120</top>
<width>640</width>
<height>321</height>
<onleft>9000</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="40" width="640">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>2</posy>
+ <left>10</left>
+ <top>2</top>
<width>38</width>
<height>38</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>580</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="40" width="640">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>41</height>
<visible>!Control.HasFocus(451)</visible>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>41</height>
<visible>Control.HasFocus(451)</visible>
<texture border="5">MenuItemFO.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>2</posy>
+ <left>10</left>
+ <top>2</top>
<width>38</width>
<height>38</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>580</width>
<height>40</height>
<font>font13</font>
</control>
<control type="scrollbar" id="60">
- <posx>650</posx>
- <posy>120</posy>
+ <left>650</left>
+ <top>120</top>
<width>25</width>
<height>320</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>Page label</description>
- <posx>660</posx>
- <posy>680</posy>
+ <right>660</right>
+ <top>680</top>
<width>560</width>
<height>30</height>
<align>right</align>
</control>
<control type="label">
<description>Page label</description>
- <posx>660</posx>
- <posy>680</posy>
+ <right>660</right>
+ <top>680</top>
<width>560</width>
<height>30</height>
<align>right</align>
</control>
<include>Clock</include>
</controls>
-</window>
\ No newline at end of file
+</window>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
</control>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_system.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>30</posx>
- <posy>40</posy>
+ <left>30</left>
+ <top>40</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>620</height>
<texture border="20">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>612</posy>
+ <left>0</left>
+ <top>612</top>
<width>610</width>
<height>64</height>
<texture border="10">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>510</posx>
- <posy>20</posy>
+ <left>510</left>
+ <top>20</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>30</posx>
- <posy>30</posy>
+ <left>30</left>
+ <top>30</top>
<width>470</width>
<height>30</height>
<font>font35_title</font>
</control>
<control type="label" id="101">
<description>current directory text label</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>470</width>
<height>30</height>
<font>font12_title</font>
<aligny>center</aligny>
</control>
<control type="scrollbar" id="30">
- <posx>10</posx>
- <posy>110</posy>
+ <left>10</left>
+ <top>110</top>
<width>25</width>
<height>490</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="list" id="20">
- <posx>40</posx>
- <posy>110</posy>
+ <left>40</left>
+ <top>110</top>
<width>540</width>
<height>491</height>
<onleft>30</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="35" width="540">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>540</width>
<height>36</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>36</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>530</posx>
- <posy>5</posy>
+ <left>530</left>
+ <top>5</top>
<width>200</width>
<height>24</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="35" width="540">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>540</width>
<height>36</height>
<visible>!Control.HasFocus(20)</visible>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>540</width>
<height>36</height>
<visible>Control.HasFocus(20)</visible>
<texture border="0,2,0,2">MenuItemFO.png</texture>
</control>
<control type="image">
- <posx>340</posx>
- <posy>2</posy>
+ <left>340</left>
+ <top>2</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(20) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>36</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>530</posx>
- <posy>5</posy>
+ <left>530</left>
+ <top>5</top>
<width>200</width>
<height>24</height>
<font>font12</font>
</control>
</control>
<control type="group">
- <posx>650</posx>
- <posy>40</posy>
+ <left>650</left>
+ <top>40</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>610</width>
<height>620</height>
<texture border="20">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>612</posy>
+ <left>0</left>
+ <top>612</top>
<width>610</width>
<height>64</height>
<texture border="10">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>20</posx>
- <posy>20</posy>
+ <left>20</left>
+ <top>20</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>580</posx>
- <posy>30</posy>
+ <right>580</right>
+ <top>30</top>
<width>470</width>
<height>30</height>
<font>font35_title</font>
</control>
<control type="label" id="102">
<description>current directory text label</description>
- <posx>580</posx>
- <posy>70</posy>
+ <right>580</right>
+ <top>70</top>
<width>470</width>
<height>30</height>
<font>font12_title</font>
<aligny>center</aligny>
</control>
<control type="scrollbar" id="31">
- <posx>575</posx>
- <posy>110</posy>
+ <left>575</left>
+ <top>110</top>
<width>25</width>
<height>490</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="list" id="21">
- <posx>30</posx>
- <posy>110</posy>
+ <left>30</left>
+ <top>110</top>
<width>540</width>
<height>491</height>
<onleft>20</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="35">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>540</width>
<height>36</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>36</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>530</posx>
- <posy>5</posy>
+ <left>530</left>
+ <top>5</top>
<width>200</width>
<height>24</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="35">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>540</width>
<height>36</height>
<visible>!Control.HasFocus(21)</visible>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>540</width>
<height>36</height>
<visible>Control.HasFocus(21)</visible>
<texture border="0,2,0,2">MenuItemFO.png</texture>
</control>
<control type="image">
- <posx>340</posx>
- <posy>2</posy>
+ <left>340</left>
+ <top>2</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(21) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>36</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>530</posx>
- <posy>5</posy>
+ <left>530</left>
+ <top>5</top>
<width>200</width>
<height>24</height>
<font>font12</font>
</control>
<control type="label">
<description>number of files/pages in left list text label</description>
- <posx>40</posx>
- <posy>53r</posy>
+ <left>40</left>
+ <top>53r</top>
<width>570</width>
<font>font12</font>
<align>left</align>
</control>
<control type="label">
<description>number of files/pages in left list text label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>570</width>
<font>font12</font>
<align>right</align>
<label>([COLOR=blue]$INFO[Container(21).NumItems][/COLOR]) $LOCALIZE[31025] - $LOCALIZE[31024] ([COLOR=blue]$INFO[Container(21).CurrentPage]/$INFO[Container(21).NumPages][/COLOR])</label>
</control>
<control type="group" id="10">
- <posx>595</posx>
- <posy>55r</posy>
+ <left>595</left>
+ <top>55r</top>
<include>Window_OpenClose_Animation</include>
<visible>system.getbool(input.enablemouse)</visible>
<include>Window_OpenClose_Animation</include>
<control type="button">
<description>Back push button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>45</width>
<height>45</height>
<label>1036</label>
</control>
<control type="image">
<description>Back Icon</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</control>
<control type="button">
<description>Home push button</description>
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>45</width>
<height>45</height>
<label>31003</label>
</control>
<control type="image">
<description>Home Icon</description>
- <posx>60</posx>
- <posy>5</posy>
+ <left>60</left>
+ <top>5</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>90r</posy>
+ <left>0</left>
+ <top>90r</top>
<width>1280</width>
<height>90</height>
<texture>floor.png</texture>
</control>
<control type="image">
<description>LOGO</description>
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>170</width>
<height>100</height>
<aspectratio aligny="top" align="left">keep</aspectratio>
</control>
<!-- Music Info -->
<control type="group">
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<visible>Player.HasAudio + !Skin.HasSetting(homepageMusicinfo)</visible>
<include>VisibleFadeEffect</include>
<include>Window_OpenClose_Animation</include>
<control type="image">
<description>Cover image</description>
- <posx>20</posx>
- <posy>45</posy>
+ <left>20</left>
+ <top>45</top>
<width>130</width>
<height>295</height>
<aspectratio aligny="bottom">keep</aspectratio>
</control>
<control type="label">
<description>Album Label</description>
- <posx>170</posx>
- <posy>265</posy>
+ <left>170</left>
+ <top>265</top>
<height>25</height>
<width>1000</width>
<label>$INFO[MusicPlayer.Artist,, - ]$INFO[MusicPlayer.Album]$INFO[musicplayer.discnumber, - $LOCALIZE[427]:]</label>
</control>
<control type="label">
<description>Title label</description>
- <posx>170</posx>
- <posy>285</posy>
+ <left>170</left>
+ <top>285</top>
<height>30</height>
<width>1000</width>
<label>$INFO[Player.Title]</label>
</control>
<control type="label">
<description>Time Label</description>
- <posx>170</posx>
- <posy>310</posy>
+ <left>170</left>
+ <top>310</top>
<height>30</height>
<width>300</width>
<label>$INFO[Player.Time]$INFO[Player.Duration,[COLOR=blue] / [/COLOR]]</label>
</control>
<!-- LiveTV Info -->
<control type="group">
- <posx>490r</posx>
- <posy>70</posy>
+ <left>490r</left>
+ <top>70</top>
<visible>Container(9000).HasFocus(12) + [PVR.IsRecording | PVR.HasNonRecordingTimer]</visible>
<include>VisibleFadeEffect</include>
<include>Window_OpenClose_Animation</include>
<animation effect="slide" start="0,0" end="0,100" time="0" condition="PVR.IsRecording">conditional</animation>
<visible>PVR.HasNonRecordingTimer</visible>
<control type="image">
- <posx>0</posx>
- <posy>-5</posy>
+ <left>0</left>
+ <top>-5</top>
<width>490</width>
<height>90</height>
<texture>gradient.png</texture>
</control>
<control type="image">
- <posx>400</posx>
- <posy>0</posy>
+ <left>400</left>
+ <top>0</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<bordersize>4</bordersize>
</control>
<control type="image">
- <posx>365</posx>
- <posy>5</posy>
+ <left>365</left>
+ <top>5</top>
<width>25</width>
<height>25</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Next Timer Header label</description>
- <posx>355</posx>
- <posy>5</posy>
+ <right>355</right>
+ <top>5</top>
<height>25</height>
<width>400</width>
<label>$LOCALIZE[19157]</label>
</control>
<control type="label">
<description>NextRecordingDateTime</description>
- <posx>390</posx>
- <posy>30</posy>
+ <right>390</right>
+ <top>30</top>
<height>25</height>
<width>400</width>
<label>$INFO[PVR.NextRecordingDateTime,$LOCALIZE[19126] - ]</label>
</control>
<control type="label">
<description>NextRecordingTitle Channel</description>
- <posx>390</posx>
- <posy>50</posy>
+ <right>390</right>
+ <top>50</top>
<height>25</height>
<width>800</width>
<label>$INFO[PVR.NextRecordingTitle][COLOR=grey]$INFO[PVR.NextRecordingChannel, - [COLOR=blue]([/COLOR],[COLOR=blue])[/COLOR]][/COLOR]</label>
<control type="group">
<visible>PVR.IsRecording</visible>
<control type="image">
- <posx>0</posx>
- <posy>-5</posy>
+ <left>0</left>
+ <top>-5</top>
<width>490</width>
<height>90</height>
<texture>gradient.png</texture>
</control>
<control type="image">
- <posx>400</posx>
- <posy>0</posy>
+ <left>400</left>
+ <top>0</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<bordersize>4</bordersize>
</control>
<control type="image">
- <posx>360</posx>
- <posy>5</posy>
+ <left>360</left>
+ <top>5</top>
<width>30</width>
<height>25</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Is Recording Header label</description>
- <posx>350</posx>
- <posy>5</posy>
+ <right>350</right>
+ <top>5</top>
<height>25</height>
<width>400</width>
<label>$LOCALIZE[19158]</label>
</control>
<control type="label">
<description>NextRecordingDateTime</description>
- <posx>390</posx>
- <posy>30</posy>
+ <right>390</right>
+ <top>30</top>
<height>25</height>
<width>400</width>
<label>$INFO[PVR.NowRecordingDateTime,$LOCALIZE[19126] - ]</label>
</control>
<control type="label">
<description>NextRecordingTitle Channel</description>
- <posx>390</posx>
- <posy>50</posy>
+ <right>390</right>
+ <top>50</top>
<height>30</height>
<width>800</width>
<label>$INFO[PVR.NowRecordingTitle][COLOR=grey]$INFO[PVR.NowRecordingChannel, - [COLOR=blue]([/COLOR],[COLOR=blue])[/COLOR]][/COLOR]</label>
</control>
<!-- Video Info -->
<control type="group">
- <posx>0</posx>
- <posy>50</posy>
+ <left>0</left>
+ <top>50</top>
<visible>Player.HasVideo + !Skin.HasSetting(homepageVideoinfo)</visible>
<include>VisibleFadeEffect</include>
<include>Window_OpenClose_Animation</include>
<visible>!VideoPlayer.Content(Movies) + !VideoPlayer.Content(Episodes) + !VideoPlayer.Content(LiveTV)</visible>
<control type="image">
<description>Cover image</description>
- <posx>20</posx>
- <posy>45</posy>
+ <left>20</left>
+ <top>45</top>
<width>150</width>
<height>300</height>
<aspectratio aligny="bottom">keep</aspectratio>
</control>
<control type="label">
<description>Title label</description>
- <posx>190</posx>
- <posy>285</posy>
+ <left>190</left>
+ <top>285</top>
<height>30</height>
<width>1000</width>
<label>$INFO[Player.Title]</label>
</control>
<control type="label">
<description>Time Label</description>
- <posx>190</posx>
- <posy>310</posy>
+ <left>190</left>
+ <top>310</top>
<height>30</height>
<width>300</width>
<label>$INFO[Player.Time]$INFO[Player.Duration,[COLOR=blue] / [/COLOR]]</label>
<visible>VideoPlayer.Content(LiveTV)</visible>
<control type="image">
<description>Cover image</description>
- <posx>20</posx>
- <posy>45</posy>
+ <left>20</left>
+ <top>45</top>
<width>120</width>
<height>300</height>
<aspectratio aligny="bottom">keep</aspectratio>
</control>
<control type="label">
<description>Channel label</description>
- <posx>160</posx>
- <posy>265</posy>
+ <left>160</left>
+ <top>265</top>
<height>25</height>
<width>660</width>
<label>$INFO[VideoPlayer.ChannelName]</label>
</control>
<control type="label">
<description>Title label</description>
- <posx>160</posx>
- <posy>285</posy>
+ <left>160</left>
+ <top>285</top>
<height>30</height>
<width>1000</width>
<label>$INFO[Player.Title]</label>
</control>
<control type="label">
<description>Time Label</description>
- <posx>160</posx>
- <posy>310</posy>
+ <left>160</left>
+ <top>310</top>
<height>30</height>
<width>300</width>
<label>$INFO[Player.Time]$INFO[Player.Duration,[COLOR=blue] / [/COLOR]]</label>
<visible>VideoPlayer.Content(Movies)</visible>
<control type="image">
<description>Cover image</description>
- <posx>20</posx>
- <posy>45</posy>
+ <left>20</left>
+ <top>45</top>
<width>120</width>
<height>300</height>
<aspectratio aligny="bottom">keep</aspectratio>
</control>
<control type="label">
<description>Studio label</description>
- <posx>160</posx>
- <posy>265</posy>
+ <left>160</left>
+ <top>265</top>
<height>25</height>
<width>1000</width>
<label>$INFO[VideoPlayer.Studio]</label>
</control>
<control type="label">
<description>Title label</description>
- <posx>160</posx>
- <posy>285</posy>
+ <left>160</left>
+ <top>285</top>
<height>30</height>
<width>1000</width>
<label>$INFO[Player.Title]$INFO[VideoPlayer.Year,[COLOR=grey] (,)[/COLOR]]</label>
</control>
<control type="label">
<description>Time Label</description>
- <posx>160</posx>
- <posy>310</posy>
+ <left>160</left>
+ <top>310</top>
<height>30</height>
<width>300</width>
<label>$INFO[Player.Time]$INFO[Player.Duration,[COLOR=blue] / [/COLOR]]</label>
<visible>VideoPlayer.Content(Episodes)</visible>
<control type="image">
<description>Cover image</description>
- <posx>20</posx>
- <posy>225</posy>
+ <left>20</left>
+ <top>225</top>
<width>180</width>
<height>120</height>
<aspectratio>scale</aspectratio>
</control>
<control type="label">
<description>TV Show Season Ep Label</description>
- <posx>210</posx>
- <posy>265</posy>
+ <left>210</left>
+ <top>265</top>
<height>25</height>
<width>1000</width>
<label>$INFO[VideoPlayer.TVShowTitle] ($INFO[VideoPlayer.Season,$LOCALIZE[20373] , - ]$INFO[VideoPlayer.episode,$LOCALIZE[20359] ,])</label>
</control>
<control type="label">
<description>Title label</description>
- <posx>210</posx>
- <posy>285</posy>
+ <left>210</left>
+ <top>285</top>
<height>30</height>
<width>1000</width>
<label>$INFO[Player.Title]</label>
</control>
<control type="label">
<description>Time Label</description>
- <posx>210</posx>
- <posy>310</posy>
+ <left>210</left>
+ <top>310</top>
<height>30</height>
<width>300</width>
<label>$INFO[Player.Time]$INFO[Player.Duration,[COLOR=blue] / [/COLOR]]</label>
<include condition="!Skin.HasSetting(HomepageHideRecentlyAddedVideo) | !Skin.HasSetting(HomepageHideRecentlyAddedAlbums)">HomeRecentlyAddedInfo</include>
<control type="button" id="9003">
<description>Hidden Button to pass through navigation when recently added is disabled</description>
- <posx>-20</posx>
- <posy>-20</posy>
+ <left>-20</left>
+ <top>-20</top>
<width>1</width>
<height>1</height>
<label>-</label>
</control>
<control type="group">
<description>Controls for currently playing media</description>
- <posx>545r</posx>
- <posy>370</posy>
+ <left>545r</left>
+ <top>370</top>
<animation effect="slide" start="0,0" end="365,0" time="300" condition="!Player.HasMedia">conditional</animation>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
<description>Background End image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>35</width>
<height>35</height>
<colordiffuse>CCFFFFFF</colordiffuse>
<control type="radiobutton" id="608">
<colordiffuse>CCFFFFFF</colordiffuse>
<description>Global Search</description>
- <posx>35</posx>
- <posy>0</posy>
+ <left>35</left>
+ <top>0</top>
<height>35</height>
<width>145</width>
<textwidth>150</textwidth>
<visible>System.HasAddon(script.globalsearch)</visible>
</control>
<control type="group" id="600">
- <posx>180</posx>
+ <left>180</left>
<onup>9003</onup>
<ondown>9000</ondown>
<defaultcontrol>-</defaultcontrol>
<enable>Player.HasMedia</enable>
<control type="image">
<description>Background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>205</width>
<height>35</height>
<texture flipy="true" border="0,5,0,0">HomeSubNF.png</texture>
<control type="group">
<visible>!VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="601">
- <posx>10</posx>
- <posy>2</posy>
+ <left>10</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Previous)</onclick>
</control>
<control type="button" id="602">
- <posx>40</posx>
- <posy>2</posy>
+ <left>40</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Rewind)</onclick>
</control>
<control type="togglebutton" id="603">
- <posx>70</posx>
- <posy>2</posy>
+ <left>70</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Play)</onclick>
</control>
<control type="button" id="604">
- <posx>100</posx>
- <posy>2</posy>
+ <left>100</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Stop)</onclick>
</control>
<control type="button" id="605">
- <posx>130</posx>
- <posy>2</posy>
+ <left>130</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Forward)</onclick>
</control>
<control type="button" id="606">
- <posx>160</posx>
- <posy>2</posy>
+ <left>160</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<control type="group" id="600">
<visible>VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="601">
- <posx>10</posx>
- <posy>2</posy>
+ <left>10</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Previous)</onclick>
</control>
<control type="button" id="602">
- <posx>40</posx>
- <posy>2</posy>
+ <left>40</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Next)</onclick>
</control>
<control type="button" id="603">
- <posx>70</posx>
- <posy>2</posy>
+ <left>70</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Stop)</onclick>
</control>
<control type="togglebutton" id="604">
- <posx>100</posx>
- <posy>2</posy>
+ <left>100</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<animation effect="fade" start="100" end="30" time="100" condition="!Player.PauseEnabled">Conditional</animation>
</control>
<control type="button" id="606">
- <posx>160</posx>
- <posy>2</posy>
+ <left>160</left>
+ <top>2</top>
<width>30</width>
<height>30</height>
<label>-</label>
<control type="radiobutton" id="607">
<colordiffuse>CCFFFFFF</colordiffuse>
<description>Go to fullscreen Playback</description>
- <posx>385</posx>
- <posy>0</posy>
+ <left>385</left>
+ <top>0</top>
<height>35</height>
<width>160</width>
<textwidth>150</textwidth>
</control>
</control>
<control type="group">
- <posy>400</posy>
+ <top>400</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="group" id="9001">
- <posx>0</posx>
- <posy>70</posy>
+ <left>0</left>
+ <top>70</top>
<onup>9000</onup>
<ondown>9002</ondown>
<control type="grouplist" id="9010">
</control>
</control>
<control type="image">
- <posx>-100</posx>
- <posy>0</posy>
+ <left>-100</left>
+ <top>0</top>
<width>1480</width>
<height>75</height>
<texture border="0,6,0,6">HomeBack.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>1280</width>
<height>6</height>
<texture>HomeOverlay1.png</texture>
</control>
<control type="fixedlist" id="9000">
- <posx>-110</posx>
- <posy>5</posy>
+ <left>-110</left>
+ <top>5</top>
<width>1500</width>
<height>60</height>
<onleft>9000</onleft>
<orientation>Horizontal</orientation>
<itemlayout height="60" width="300">
<control type="image">
- <posx>0</posx>
- <posy>4</posy>
+ <left>0</left>
+ <top>4</top>
<width>1</width>
<height>52</height>
<texture>HomeSeperator.png</texture>
</control>
<control type="image">
- <posx>299</posx>
- <posy>4</posy>
+ <left>299</left>
+ <top>4</top>
<width>1</width>
<height>52</height>
<texture>HomeSeperator.png</texture>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>290</width>
<height>60</height>
<font>font_MainMenu</font>
</itemlayout>
<focusedlayout height="60" width="300">
<control type="image">
- <posx>0</posx>
- <posy>4</posy>
+ <left>0</left>
+ <top>4</top>
<width>1</width>
<height>52</height>
<texture>HomeSeperator.png</texture>
</control>
<control type="image">
- <posx>299</posx>
- <posy>4</posy>
+ <left>299</left>
+ <top>4</top>
<width>1</width>
<height>52</height>
<texture>HomeSeperator.png</texture>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>290</width>
<height>60</height>
<font>font_MainMenu</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>290</width>
<height>60</height>
<font>font_MainMenu</font>
</content>
</control>
<control type="image">
- <posx>0</posx>
- <posy>6</posy>
+ <left>0</left>
+ <top>6</top>
<width>128</width>
<height>50</height>
<texture>SideFade.png</texture>
</control>
<control type="image">
- <posx>128r</posx>
- <posy>6</posy>
+ <left>128r</left>
+ <top>6</top>
<width>128</width>
<height>60</height>
<texture flipx="true">SideFade.png</texture>
</control>
</control>
<control type="group">
- <posx>0</posx>
- <posy>33r</posy>
+ <left>0</left>
+ <top>33r</top>
<visible>system.getbool(lookandfeel.enablerssfeeds)</visible>
<include>Window_OpenClose_Animation</include>
<control type="rss">
<description>RSS feed</description>
- <posx>100</posx>
- <posy>0</posy>
+ <left>100</left>
+ <top>0</top>
<height>30</height>
<width>1145</width>
<font>font12</font>
</control>
<control type="image">
<description>RSS background</description>
- <posx>1250</posx>
- <posy>2</posy>
+ <left>1250</left>
+ <top>2</top>
<width>24</width>
<height>24</height>
<texture>icon-rss.png</texture>
</control>
</control>
<control type="group" id="10">
- <posx>20</posx>
- <posy>55r</posy>
+ <left>20</left>
+ <top>55r</top>
<include>Window_OpenClose_Animation</include>
<control type="button" id="20">
<description>Power push button</description>
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>45</width>
<height>45</height>
<label>31003</label>
</control>
<control type="image">
<description>Power Icon</description>
- <posx>60</posx>
- <posy>5</posy>
+ <left>60</left>
+ <top>5</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</control>
<control type="button" id="21">
<description>Favourites push button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>45</width>
<height>45</height>
<label>1036</label>
</control>
<control type="image">
<description>Favourites Icon</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</control>
</control>
<control type="group">
- <posx>20</posx>
- <posy>0</posy>
+ <left>20</left>
+ <top>0</top>
<visible>Skin.HasSetting(homepageWeatherinfo) + !IsEmpty(Weather.Plugin)</visible>
<include>Window_OpenClose_Animation</include>
<control type="image">
<description>Weather image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>60</width>
<height>60</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Location label</description>
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>500</width>
<height>15</height>
<align>left</align>
<label>$INFO[Window(Weather).Property(Location)]</label>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>20</posy>
+ <left>65</left>
+ <top>20</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
<include>Clock</include>
<control type="label">
<description>Date label</description>
- <posx>20r</posx>
- <posy>35</posy>
+ <right>20r</right>
+ <top>35</top>
<width>200</width>
<height>15</height>
<align>right</align>
<include name="CommonBackground">
<control type="image">
<description>Normal Default Background Image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>User Set Background Image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<visible>![Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo)]</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture>special://skin/backgrounds/media-overlay.jpg</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="visualisation">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<visible>Player.HasAudio + !Skin.HasSetting(ShowBackgroundVis) + ![Window.IsVisible(PVR) + [Control.IsVisible(11) | Control.IsVisible(12)]]</visible>
<visible>!SubString(Window(videolibrary).Property(TvTunesIsAlive),True)</visible>
</control>
<control type="videowindow">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<visible>Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo) + ![Window.IsVisible(PVR) + [Control.IsVisible(11) | Control.IsVisible(12)]]</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>-40</posy>
+ <left>0</left>
+ <top>-40</top>
<width>1280</width>
<height>120</height>
<texture flipy="true" border="1">HomeNowPlayingBack.png</texture>
</include>
<include name="ContentPanelBackgrounds">
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(50)</visible>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>750</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>750</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(504) | Control.IsVisible(550) | Control.IsVisible(512)</visible>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>640</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>640</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>700</posx>
- <posy>60</posy>
+ <left>700</left>
+ <top>60</top>
<width>530</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>700</posx>
- <posy>652</posy>
+ <left>700</left>
+ <top>652</top>
<width>530</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(551) | Control.IsVisible(560) | Control.IsVisible(511) | Control.IsVisible(506) | Control.IsVisible(513)</visible>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>840</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>840</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>900</posx>
- <posy>60</posy>
+ <left>900</left>
+ <top>60</top>
<width>330</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>900</posx>
- <posy>652</posy>
+ <left>900</left>
+ <top>652</top>
<width>330</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(501)</visible>
<control type="image">
- <posx>50</posx>
- <posy>50</posy>
+ <left>50</left>
+ <top>50</top>
<width>1180</width>
<height>610</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>1180</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(503)</visible>
<control type="image">
- <posx>50</posx>
- <posy>230</posy>
+ <left>50</left>
+ <top>230</top>
<width>640</width>
<height>430</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>640</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>700</posx>
- <posy>230</posy>
+ <left>700</left>
+ <top>230</top>
<width>550</width>
<height>430</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>700</posx>
- <posy>652</posy>
+ <left>700</left>
+ <top>652</top>
<width>550</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(51) | Control.IsVisible(500) | Control.IsVisible(505)</visible>
<control type="image">
- <posx>75</posx>
- <posy>60</posy>
+ <left>75</left>
+ <top>60</top>
<width>1130</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>75</posx>
- <posy>652</posy>
+ <left>75</left>
+ <top>652</top>
<width>1130</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(514)</visible>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>490</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>490</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>550</posx>
- <posy>60</posy>
+ <left>550</left>
+ <top>60</top>
<width>680</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>550</posx>
- <posy>652</posy>
+ <left>550</left>
+ <top>652</top>
<width>680</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(515)</visible>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>400</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>400</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>460</posx>
- <posy>60</posy>
+ <left>460</left>
+ <top>60</top>
<width>770</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>460</posx>
- <posy>652</posy>
+ <left>460</left>
+ <top>652</top>
<width>770</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</include>
<include name="ContentPanelBackgroundsPVR">
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(10) | Control.IsVisible(14) | Control.IsVisible(15) | Control.IsVisible(16) | Control.IsVisible(17)</visible>
<control type="image">
- <posx>55</posx>
- <posy>60</posy>
+ <left>55</left>
+ <top>60</top>
<width>1170</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>55</posx>
- <posy>652</posy>
+ <left>55</left>
+ <top>652</top>
<width>1170</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(11) | Control.IsVisible(12)</visible>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>450</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>450</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>510</posx>
- <posy>60</posy>
+ <left>510</left>
+ <top>60</top>
<width>730</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>510</posx>
- <posy>652</posy>
+ <left>510</left>
+ <top>652</top>
<width>730</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<include>VisibleFadeEffect</include>
<visible>Control.IsVisible(13)</visible>
<control type="image">
- <posx>50</posx>
- <posy>60</posy>
+ <left>50</left>
+ <top>60</top>
<width>840</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>652</posy>
+ <left>50</left>
+ <top>652</top>
<width>840</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>900</posx>
- <posy>60</posy>
+ <left>900</left>
+ <top>60</top>
<width>330</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>900</posx>
- <posy>652</posy>
+ <left>900</left>
+ <top>652</top>
<width>330</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
<texture>$INFO[ListItem.VideoAspect,flagging/aspectratio/,.png]</texture>
</control>
</include>
-</includes>
\ No newline at end of file
+</includes>
<animation effect="fade" time="300" delay="1000">WindowOpen</animation>
<animation effect="fade" time="200">WindowClose</animation>
<control type="group">
- <posx>190</posx>
- <posy>50</posy>
+ <left>190</left>
+ <top>50</top>
<visible>Library.HasContent(Movies)</visible>
<visible>Container(9000).Hasfocus(10) + !Skin.HasSetting(HomepageHideRecentlyAddedVideo)</visible>
<include>VisibleFadeEffect</include>
<control type="label">
<description>Title label</description>
- <posx>180</posx>
- <posy>220</posy>
+ <left>180</left>
+ <top>220</top>
<height>20</height>
<width>540</width>
<label>20386</label>
<animation effect="slide" start="0,0" end="180,0" time="0" condition="StringCompare(Container(8000).NumItems,3)">conditional</animation>
<animation effect="slide" start="0,0" end="270,0" time="0" condition="StringCompare(Container(8000).NumItems,2)">conditional</animation>
<animation effect="slide" start="0,0" end="360,0" time="0" condition="StringCompare(Container(8000).NumItems,1)">conditional</animation>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>900</width>
<height>220</height>
<onleft>8000</onleft>
<itemlayout height="220" width="180">
<control type="image">
<description>background</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>180</width>
<height>220</height>
<texture border="15">RecentAddedBack.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>160</width>
<height>170</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<bordersize>5</bordersize>
</control>
<control type="label">
- <posx>90</posx>
- <posy>185</posy>
+ <left>90</left>
+ <top>185</top>
<width>150</width>
<height>20</height>
<font>font12</font>
<focusedlayout height="220" width="180">
<control type="image">
<description>background</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>180</width>
<height>220</height>
<texture border="15">RecentAddedBack.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>160</width>
<height>170</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<visible>Control.HasFocus(8000)</visible>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>160</width>
<height>170</height>
<texture>$INFO[ListItem.Icon]</texture>
<visible>!Control.HasFocus(8000)</visible>
</control>
<control type="label">
- <posx>90</posx>
- <posy>185</posy>
+ <left>90</left>
+ <top>185</top>
<width>150</width>
<height>20</height>
<font>font12</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>90</posx>
- <posy>185</posy>
+ <left>90</left>
+ <top>185</top>
<width>150</width>
<height>20</height>
<font>font12</font>
<content>
<item>
<label>$INFO[Window.Property(LatestMovie.1.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.1.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.1.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.2.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.2.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.2.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.3.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.3.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.3.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.4.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.4.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.4.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.5.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.5.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.5.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.6.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.6.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.6.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.7.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.7.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.7.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.8.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.8.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.8.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.9.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.9.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.9.Thumb)]</icon>
<thumb>-</thumb>
</item>
<item>
<label>$INFO[Window.Property(LatestMovie.10.Title)]</label>
- <label2></label2>
+ <label2/>
<onclick>PlayMedia($ESCINFO[Window.Property(LatestMovie.10.Path)])</onclick>
<icon>$INFO[Window.Property(LatestMovie.10.Thumb)]</icon>
<thumb>-</thumb>
</control>
<control type="button">
<description>left Arrow</description>
- <posx>-40</posx>
- <posy>90</posy>
+ <left>-40</left>
+ <top>90</top>
<width>30</width>
<height>40</height>
<texturefocus>arrow-big-left.png</texturefocus>
</control>
<control type="button">
<description>right Arrow</description>
- <posx>910</posx>
- <posy>90</posy>
+ <left>910</left>
+ <top>90</top>
<width>30</width>
<height>40</height>
<texturefocus>arrow-big-right.png</texturefocus>
</control>
</control>
<control type="group">
- <posx>160</posx>
- <posy>50</posy>
+ <left>160</left>
+ <top>50</top>
<visible>Library.HasContent(TVShows)</visible>
<visible>Container(9000).Hasfocus(11) + !Skin.HasSetting(HomepageHideRecentlyAddedVideo)</visible>
<include>VisibleFadeEffect</include>
<control type="label">
<description>Title label</description>
- <posx>240</posx>
- <posy>220</posy>
+ <left>240</left>
+ <top>220</top>
<height>20</height>
<width>480</width>
<label>20387</label>
<animation effect="slide" start="0,0" end="120,0" time="0" condition="StringCompare(Container(8001).NumItems,3)">conditional</animation>
<animation effect="slide" start="0,0" end="240,0" time="0" condition="StringCompare(Container(8001).NumItems,2)">conditional</animation>
<animation effect="slide" start="0,0" end="360,0" time="0" condition="StringCompare(Container(8001).NumItems,1)">conditional</animation>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>960</width>
<height>240</height>
<onleft>8001</onleft>
<itemlayout height="220" width="240">
<control type="image">
<description>background</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>240</width>
<height>220</height>
<texture border="15">RecentAddedBack.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>220</width>
<height>155</height>
<aspectratio>scale</aspectratio>
<bordersize>5</bordersize>
</control>
<control type="label">
- <posx>120</posx>
- <posy>168</posy>
+ <left>120</left>
+ <top>168</top>
<width>200</width>
<height>20</height>
<font>font10</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="label">
- <posx>120</posx>
- <posy>185</posy>
+ <left>120</left>
+ <top>185</top>
<width>200</width>
<height>20</height>
<font>font12</font>
<focusedlayout height="220" width="240">
<control type="image">
<description>background</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>240</width>
<height>220</height>
<texture border="15">RecentAddedBack.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>220</width>
<height>155</height>
<aspectratio>scale</aspectratio>
<visible>Control.HasFocus(8001)</visible>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>220</width>
<height>155</height>
<aspectratio>scale</aspectratio>
<visible>!Control.HasFocus(8001)</visible>
</control>
<control type="label">
- <posx>120</posx>
- <posy>168</posy>
+ <left>120</left>
+ <top>168</top>
<width>200</width>
<height>20</height>
<font>font10</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="label">
- <posx>120</posx>
- <posy>185</posy>
+ <left>120</left>
+ <top>185</top>
<width>200</width>
<height>20</height>
<font>font12</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>120</posx>
- <posy>185</posy>
+ <left>120</left>
+ <top>185</top>
<width>200</width>
<height>20</height>
<font>font12</font>
</control>
<control type="button">
<description>left Arrow</description>
- <posx>-40</posx>
- <posy>90</posy>
+ <left>-40</left>
+ <top>90</top>
<width>30</width>
<height>40</height>
<texturefocus>arrow-big-left.png</texturefocus>
</control>
<control type="button">
<description>right Arrow</description>
- <posx>970</posx>
- <posy>90</posy>
+ <left>970</left>
+ <top>90</top>
<width>30</width>
<height>40</height>
<texturefocus>arrow-big-right.png</texturefocus>
</control>
</control>
<control type="group">
- <posx>240</posx>
- <posy>50</posy>
+ <left>240</left>
+ <top>50</top>
<visible>Library.HasContent(Music)</visible>
<visible>Container(9000).Hasfocus(3) + !Skin.HasSetting(HomepageHideRecentlyAddedAlbums)</visible>
<include>VisibleFadeEffect</include>
<control type="label">
<description>Title label</description>
- <posx>160</posx>
- <posy>220</posy>
+ <left>160</left>
+ <top>220</top>
<height>20</height>
<width>480</width>
<label>359</label>
<animation effect="slide" start="0,0" end="100,0" time="0" condition="StringCompare(Container(8002).NumItems,3)">conditional</animation>
<animation effect="slide" start="0,0" end="200,0" time="0" condition="StringCompare(Container(8002).NumItems,2)">conditional</animation>
<animation effect="slide" start="0,0" end="300,0" time="0" condition="StringCompare(Container(8002).NumItems,1)">conditional</animation>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>240</height>
<onleft>8002</onleft>
<itemlayout height="220" width="200">
<control type="image">
<description>background</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>220</height>
<texture border="15">RecentAddedBack.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>180</width>
<height>155</height>
<aspectratio>keep</aspectratio>
<bordersize>5</bordersize>
</control>
<control type="label">
- <posx>100</posx>
- <posy>170</posy>
+ <left>100</left>
+ <top>170</top>
<width>180</width>
<height>20</height>
<font>font10</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="label">
- <posx>100</posx>
- <posy>190</posy>
+ <left>100</left>
+ <top>190</top>
<width>180</width>
<height>20</height>
<font>font12</font>
<focusedlayout height="220" width="200">
<control type="image">
<description>background</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>220</height>
<texture border="15">RecentAddedBack.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>180</width>
<height>155</height>
<aspectratio>keep</aspectratio>
<visible>Control.HasFocus(8002)</visible>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>180</width>
<height>155</height>
<aspectratio>keep</aspectratio>
<visible>!Control.HasFocus(8002)</visible>
</control>
<control type="label">
- <posx>100</posx>
- <posy>170</posy>
+ <left>100</left>
+ <top>170</top>
<width>180</width>
<height>20</height>
<font>font10</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="label">
- <posx>100</posx>
- <posy>190</posy>
+ <left>100</left>
+ <top>190</top>
<width>180</width>
<height>20</height>
<font>font12</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>100</posx>
- <posy>190</posy>
+ <left>100</left>
+ <top>190</top>
<width>180</width>
<height>20</height>
<font>font12</font>
<label>$INFO[Window.Property(LatestAlbum.1.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.1.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.1.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.1.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.1.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.1.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.2.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.2.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.2.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.2.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.2.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.2.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.3.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.3.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.3.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.3.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.3.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.3.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.4.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.4.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.4.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.4.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.4.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.4.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.5.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.5.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.5.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.5.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.5.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.5.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.6.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.6.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.6.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.6.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.6.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.6.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.7.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.7.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.7.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.7.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.7.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.7.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.8.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.8.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.8.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.8.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.8.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.8.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.9.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.9.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.9.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.9.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.9.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.9.Title))</visible>
<label>$INFO[Window.Property(LatestAlbum.10.Title)]</label>
<label2>$INFO[Window.Property(LatestAlbum.10.Artist)]</label2>
<onclick>PlayList.Clear</onclick>
- <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.10.Path)]")</onclick>
+ <onclick>PlayMedia("$INFO[Window.Property(LatestAlbum.10.Path)]")</onclick>
<icon>-</icon>
<thumb>$INFO[Window.Property(LatestAlbum.10.Thumb)]</thumb>
<visible>!IsEmpty(Window.Property(LatestAlbum.10.Title))</visible>
</control>
<control type="button">
<description>left Arrow</description>
- <posx>-40</posx>
- <posy>90</posy>
+ <left>-40</left>
+ <top>90</top>
<width>30</width>
<height>40</height>
<texturefocus>arrow-big-left.png</texturefocus>
</control>
<control type="button">
<description>right Arrow</description>
- <posx>810</posx>
- <posy>90</posy>
+ <left>810</left>
+ <top>90</top>
<width>30</width>
<height>40</height>
<texturefocus>arrow-big-right.png</texturefocus>
</control>
</control>
</include>
-</includes>
\ No newline at end of file
+</includes>
<defaultcontrol>5</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>290</posx>
- <posy>75</posy>
+ <left>290</left>
+ <top>75</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>700</width>
<height>570</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>620</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>620</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>610</posx>
- <posy>15</posy>
+ <left>610</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="grouplist" id="5">
<description>control area</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>640</width>
<height>410</height>
<itemgap>5</itemgap>
</control>
<control type="button" id="7">
<description>Default Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="radiobutton" id="8">
<description>Default RadioButton</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="spincontrolex" id="9">
<description>Default SpinControlex</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="button" id="28">
<description>Ok Button</description>
- <posx>145</posx>
- <posy>505</posy>
+ <left>145</left>
+ <top>505</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="29">
<description>Cancel Button</description>
- <posx>355</posx>
- <posy>505</posy>
+ <left>355</left>
+ <top>505</top>
<width>200</width>
<height>40</height>
<align>center</align>
<ondown>5</ondown>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<allowoverlay>no</allowoverlay>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<include>CommonBackground</include>
<control type="group">
<include>Window_OpenClose_Animation</include>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
</control>
<control type="image">
<description>LOGO</description>
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>170</width>
<height>100</height>
<aspectratio aligny="top" align="left">keep</aspectratio>
<include>Window_OpenClose_Animation</include>
</control>
<control type="image">
- <posx>265</posx>
- <posy>60</posy>
+ <left>265</left>
+ <top>60</top>
<width>750</width>
<height>600</height>
<texture border="10">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>265</posx>
- <posy>652</posy>
+ <left>265</left>
+ <top>652</top>
<width>750</width>
<height>64</height>
<texture border="10">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>295</posx>
- <posy>100</posy>
+ <left>295</left>
+ <top>100</top>
<width>690</width>
<height>40</height>
<font>font13</font>
<label>$LOCALIZE[31421]</label>
</control>
<control type="list" id="52">
- <posx>295</posx>
- <posy>170</posy>
+ <left>295</left>
+ <top>170</top>
<width>690</width>
<height>401</height>
<onleft>20</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="100" width="690">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>95</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>80</width>
<height>75</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>110</posx>
- <posy>10</posy>
+ <left>110</left>
+ <top>10</top>
<width>580</width>
<height>40</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>110</posx>
- <posy>50</posy>
+ <left>110</left>
+ <top>50</top>
<width>580</width>
<height>25</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="100" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>95</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>95</height>
<texture border="5">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>80</width>
<height>75</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>110</posx>
- <posy>10</posy>
+ <left>110</left>
+ <top>10</top>
<width>580</width>
<height>40</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>110</posx>
- <posy>50</posy>
+ <left>110</left>
+ <top>50</top>
<width>580</width>
<height>25</height>
<font>font13</font>
</control>
<control type="image">
<description>LOGO</description>
- <posx>265</posx>
- <posy>580</posy>
+ <left>265</left>
+ <top>580</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>Confluence_Logo.png</texture>
</control>
<control type="group">
- <posx>940</posx>
- <posy>600</posy>
+ <left>940</left>
+ <top>600</top>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <right>0</right>
+ <top>0</top>
<width>580</width>
<height>45</height>
<font>font12</font>
</control>
<control type="button" id="20">
<description>Power push button</description>
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>45</width>
<height>45</height>
<label>-</label>
</control>
<control type="image">
<description>Power Icon</description>
- <posx>15</posx>
- <posy>5</posy>
+ <left>15</left>
+ <top>5</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_power.png</texture>
</control>
<control type="image">
- <posx>13</posx>
- <posy>3</posy>
+ <left>13</left>
+ <top>3</top>
<width>30</width>
<height>29</height>
<texture>home-power-focus.gif</texture>
<include>Clock</include>
<control type="label">
<description>Date label</description>
- <posx>20r</posx>
- <posy>35</posy>
+ <right>20r</right>
+ <top>35</top>
<width>200</width>
<height>15</height>
<align>right</align>
<controls>
<control type="karvisualisation" id="1">
<description>visualisation</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<visible>false</visible>
</control>
<control type="image" id="2">
<description>fullscreen image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<visible>false</visible>
<control type="group">
<visible>MusicPlayer.Offset(number).Exists + !IntegerGreaterThan(Player.TimeRemaining,20)</visible>
<animation effect="slide" start="0,-40" end="0,0" time="100">Visible</animation>
- <posx>420</posx>
- <posy>0</posy>
+ <left>420</left>
+ <top>0</top>
<control type="image">
- <posx>0</posx>
- <posy>-10</posy>
+ <left>0</left>
+ <top>-10</top>
<width>470</width>
<height>55</height>
<texture flipy="true" border="20,20,20,2">InfoMessagePanel.png</texture>
</control>
<control type="label" id="402">
<description>Next Song Name</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>470</width>
<height>25</height>
<font>font13_title</font>
<include>dialogeffect</include>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="button" id="1000">
<description>Close Window button</description>
- <posx>84r</posx>
- <posy>0</posy>
+ <left>84r</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="slider" id="87">
<description>Seek Slider</description>
- <posx>430</posx>
- <posy>82r</posy>
+ <left>430</left>
+ <top>82r</top>
<width>720</width>
<height>16</height>
<onup>702</onup>
<visible>![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList)]</visible>
</control>
<control type="group" id="100">
- <posx>325</posx>
- <posy>60r</posy>
+ <left>325</left>
+ <top>60r</top>
<animation effect="fade" time="200">VisibleChange</animation>
<visible>![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList)]</visible>
<control type="button" id="600">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>210</label>
<onclick>PlayerControl(Previous)</onclick>
</control>
<control type="button" id="601">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31354</label>
<onclick>PlayerControl(Rewind)</onclick>
</control>
<control type="togglebutton" id="602">
- <posx>110</posx>
- <posy>0</posy>
+ <left>110</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31351</label>
<onclick>PlayerControl(Play)</onclick>
</control>
<control type="button" id="603">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31352</label>
<onclick>PlayerControl(Stop)</onclick>
</control>
<control type="button" id="604">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31353</label>
<onclick>PlayerControl(Forward)</onclick>
</control>
<control type="button" id="605">
- <posx>275</posx>
- <posy>0</posy>
+ <left>275</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>209</label>
<onclick>PlayerControl(Next)</onclick>
</control>
<control type="button" id="606">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>$LOCALIZE[486]$INFO[Playlist.Repeat, : ]</label>
<ondown>1000</ondown>
</control>
<control type="image">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<texture>OSDRepeatNF.png</texture>
<visible>!Control.HasFocus(606)</visible>
</control>
<control type="image">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<texture>OSDRepeatFO.png</texture>
<visible>Control.HasFocus(606)</visible>
</control>
<control type="image">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<texture>OSDRepeatOneNF.png</texture>
<visible>!Control.HasFocus(606)</visible>
</control>
<control type="image">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<texture>OSDRepeatOneFO.png</texture>
<visible>Control.HasFocus(606)</visible>
</control>
<control type="image">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<texture>OSDRepeatAllNF.png</texture>
<visible>!Control.HasFocus(606)</visible>
</control>
<control type="image">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<texture>OSDRepeatAllFO.png</texture>
<visible>Control.HasFocus(606)</visible>
</control>
<control type="togglebutton" id="607">
- <posx>385</posx>
- <posy>0</posy>
+ <left>385</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>$LOCALIZE[590]$INFO[Playlist.Random, : ]</label>
</control>
</control>
<control type="group">
- <posx>300r</posx>
- <posy>60r</posy>
+ <left>300r</left>
+ <top>60r</top>
<animation effect="fade" time="200">VisibleChange</animation>
<visible>![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList)]</visible>
<control type="togglebutton" id="701">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31128</label>
<usealttexture>IsEmpty(Skin.String(LyricScript_Path))</usealttexture>
</control>
<control type="button" id="500">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>12006</label>
<ondown>1000</ondown>
</control>
<control type="button" id="702">
- <posx>110</posx>
- <posy>0</posy>
+ <left>110</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>$LOCALIZE[250] $LOCALIZE[21417]</label>
<onclick>Addon.Default.OpenSettings(xbmc.player.musicviz)</onclick>
</control>
<control type="button" id="703">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31048</label>
<onclick>ActivateWindow(122)</onclick>
</control>
<control type="button" id="704">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>264</label>
<defaultcontrol>-</defaultcontrol>
<controls>
</controls>
-</window>
\ No newline at end of file
+</window>
<control type="visualisation" id="2">
<!-- FIX ME Music Visualization needs to have an id of 2 in this window to be able to lock or change preset -->
<description>visualisation</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
</control>
<control type="image">
<description>Fanart Image for Artist</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Player.Art(fanart)]</texture>
<animation effect="fade" time="200">VisibleChange</animation>
<visible>[Player.ShowInfo | Window.IsActive(MusicOSD)] + ![Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList)]</visible>
<control type="image">
- <posx>0</posx>
- <posy>-150</posy>
+ <left>0</left>
+ <top>-150</top>
<width>1280</width>
<height>256</height>
<texture flipy="true" border="1">HomeNowPlayingBack.png</texture>
</control>
<control type="label">
<description>Partymode Header label</description>
- <posx>30</posx>
- <posy>5</posy>
+ <left>30</left>
+ <top>5</top>
<width>800</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Normal Header label</description>
- <posx>30</posx>
- <posy>5</posy>
+ <left>30</left>
+ <top>5</top>
<width>800</width>
<height>25</height>
<align>left</align>
</control>
<control type="label">
<description>Clock label</description>
- <posx>1250</posx>
- <posy>5</posy>
+ <right>1250</right>
+ <top>5</top>
<width>800</width>
<height>25</height>
<align>right</align>
<animation effect="slide" start="0,0" end="-70,0" time="0" condition="Window.IsVisible(MusicOSD)">conditional</animation>
</control>
<control type="image">
- <posx>0</posx>
- <posy>230r</posy>
+ <left>0</left>
+ <top>230r</top>
<width>1280</width>
<height>230</height>
<texture border="1">HomeNowPlayingBack.png</texture>
</control>
<control type="image">
<description>cover image</description>
- <posx>20</posx>
- <posy>250r</posy>
+ <left>20</left>
+ <top>250r</top>
<width>300</width>
<height>230</height>
<texture fallback="DefaultAlbumCover.png">$INFO[Player.Art(thumb)]</texture>
<bordersize>8</bordersize>
</control>
<control type="group">
- <posx>330</posx>
- <posy>185r</posy>
+ <left>330</left>
+ <top>185r</top>
<control type="label" id="1">
<description>Heading label</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>910</width>
<height>25</height>
<align>left</align>
</control>
<control type="label" id="1">
<description>Artist label</description>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<width>910</width>
<height>25</height>
<align>left</align>
<shadowcolor>black</shadowcolor>
</control>
<control type="grouplist">
- <posx>20</posx>
- <posy>60</posy>
+ <left>20</left>
+ <top>60</top>
<width>910</width>
<height>35</height>
<itemgap>5</itemgap>
<height>35</height>
<control type="image">
<description>rating back</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>110</width>
<height>35</height>
<aspectratio align="left">stretch</aspectratio>
</control>
<control type="image">
<description>Rating</description>
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>100</width>
<height>35</height>
<aspectratio align="center">keep</aspectratio>
</control>
</control>
<control type="label">
- <posx>0</posx>
- <posy>120</posy>
+ <left>0</left>
+ <top>120</top>
<width>910</width>
<height>25</height>
<label>$LOCALIZE[209]: $INFO[MusicPlayer.offset(1).Artist,, - ]$INFO[MusicPlayer.offset(1).Title]</label>
</control>
</control>
<control type="group">
- <posx>330</posx>
- <posy>95r</posy>
+ <left>330</left>
+ <top>95r</top>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font13</font>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>100</posx>
- <posy>15</posy>
+ <left>100</left>
+ <top>15</top>
<width>720</width>
<height>16</height>
<info>Player.Progress</info>
</control>
<control type="label">
- <posx>920</posx>
- <posy>0</posy>
+ <right>920</right>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font13</font>
</control>
<!-- codec & viz infos -->
<control type="group" id="0">
- <posx>0</posx>
- <posy>50</posy>
+ <left>0</left>
+ <top>50</top>
<visible>Player.ShowCodec + ![Window.IsVisible(script-XBMC_Lyrics-main.xml) | Window.IsVisible(VisualisationSettings) | Window.IsVisible(VisualisationPresetList)]</visible>
<animation effect="fade" time="200">VisibleChange</animation>
<control type="image">
<description>media info background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>105</height>
<colordiffuse>AAFFFFFF</colordiffuse>
</control>
<control type="label">
<description>row 1 label</description>
- <posx>50</posx>
- <posy>10</posy>
+ <left>50</left>
+ <top>10</top>
<label>-</label>
<align>left</align>
<label>$INFO[musicplayer.Codec,$LOCALIZE[21446]: ,]$INFO[musicplayer.Bitrate, · $LOCALIZE[623]: ,kbps]$INFO[musicplayer.bitspersample, · $LOCALIZE[612]: ,]$INFO[musicplayer.Samplerate, · $LOCALIZE[613]: ,kHz]$INFO[musicplayer.Channels, · $LOCALIZE[21444]: ]</label>
</control>
<control type="label">
<description>row 2 label</description>
- <posx>50</posx>
- <posy>40</posy>
+ <left>50</left>
+ <top>40</top>
<label>-</label>
<align>left</align>
<label>$INFO[Visualisation.Name,, [I][COLOR=orange]($LOCALIZE[20166])[/COLOR][/I] · ]fps: $INFO[System.FPS]</label>
</control>
<control type="label">
<description>Unlocked row 2 label</description>
- <posx>50</posx>
- <posy>40</posy>
+ <left>50</left>
+ <top>40</top>
<label>-</label>
<align>left</align>
<label>$INFO[Visualisation.Name,, · ]fps: $INFO[System.FPS]</label>
</control>
<control type="label">
<description>row 3 label</description>
- <posx>50</posx>
- <posy>70</posy>
+ <left>50</left>
+ <top>70</top>
<label>-</label>
<align>left</align>
<label>$INFO[Visualisation.Preset,$LOCALIZE[13388]: ]</label>
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_music.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<width>250</width>
<height>650</height>
<onleft>9000</onleft>
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_music.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
<controls>
<include>CommonBackground</include>
<control type="group">
- <posy>10</posy>
+ <top>10</top>
<include>Window_OpenClose_Animation</include>
<control type="image">
- <posx>445</posx>
- <posy>40</posy>
+ <left>445</left>
+ <top>40</top>
<width>390</width>
<height>640</height>
<texture>black-back.png</texture>
</control>
<control type="label">
- <posx>475</posx>
- <posy>45</posy>
+ <left>475</left>
+ <top>45</top>
<width>330</width>
<height>30</height>
<font>font13_title</font>
<label>$LOCALIZE[31061]</label>
</control>
<control type="group" id="9000">
- <posx>475</posx>
- <posy>550</posy>
+ <left>475</left>
+ <top>550</top>
<control type="button" id="6">
<description>Open Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>330</width>
<label>31055</label>
<align>center</align>
</control>
<control type="button" id="7">
<description>Save Button</description>
- <posx>0</posx>
- <posy>40</posy>
+ <left>0</left>
+ <top>40</top>
<width>330</width>
<label>31056</label>
<align>center</align>
</control>
<control type="button" id="8">
<description>Clear button</description>
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>330</width>
<label>31057</label>
<align>center</align>
<visible>Control.HasFocus(50)</visible>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>480</posx>
- <posy>90</posy>
+ <left>480</left>
+ <top>90</top>
<width>320</width>
<height>200</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Container(50).ListItem.Icon]</texture>
</control>
<control type="textbox">
- <posx>480</posx>
- <posy>300</posy>
+ <left>480</left>
+ <top>300</top>
<width>320</width>
<height>220</height>
<font>font11</font>
<visible>Control.HasFocus(100)</visible>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>465</posx>
- <posy>90</posy>
+ <left>465</left>
+ <top>90</top>
<width>350</width>
<height>200</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Container(100).ListItem.Icon]</texture>
</control>
<control type="textbox">
- <posx>465</posx>
- <posy>300</posy>
+ <left>465</left>
+ <top>300</top>
<width>350</width>
<height>220</height>
<font>font11</font>
<animation effect="slide" start="-480,0" end="0,0" time="500" tween="quadratic" easing="out">WindowOpen</animation>
<animation effect="slide" end="-480,0" start="0,0" time="500" tween="quadratic" easing="out">WindowClose</animation>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>480</width>
<height>720</height>
<texture border="0,0,15,0">MediaBladeSub.png</texture>
</control>
<control type="label">
- <posx>30</posx>
- <posy>40</posy>
+ <left>30</left>
+ <top>40</top>
<width>410</width>
<height>30</height>
<font>font24_title</font>
<label>31058</label>
</control>
<control type="image">
- <posx>10</posx>
- <posy>80</posy>
+ <left>10</left>
+ <top>80</top>
<width>460</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>50r</posy>
+ <left>10</left>
+ <top>50r</top>
<width>460</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
<description>number of files/pages in left list text label</description>
- <posx>30</posx>
- <posy>38r</posy>
+ <left>30</left>
+ <top>38r</top>
<width>410</width>
<font>font12</font>
<align>left</align>
<label>($INFO[Container(50).NumItems]) $LOCALIZE[31025] - $LOCALIZE[31024] ($INFO[Container(50).CurrentPage]/$INFO[Container(50).NumPages])</label>
</control>
<control type="scrollbar" id="30">
- <posx>20</posx>
- <posy>100</posy>
+ <left>20</left>
+ <top>100</top>
<width>25</width>
<height>540</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="list" id="50">
- <posx>50</posx>
- <posy>100</posy>
+ <left>50</left>
+ <top>100</top>
<width>400</width>
<height>540</height>
<onleft>30</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30" width="400">
<control type="label">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>380</width>
<height>30</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>395</posx>
- <posy>0</posy>
+ <left>395</left>
+ <top>0</top>
<width>360</width>
<height>30</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="30" width="400">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<texture border="7">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>380</width>
<height>30</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>395</posx>
- <posy>0</posy>
+ <left>395</left>
+ <top>0</top>
<width>360</width>
<height>30</height>
<font>font12</font>
<control type="group">
<animation effect="slide" start="480,0" end="0,0" time="500" tween="quadratic" easing="out">WindowOpen</animation>
<animation effect="slide" end="480,0" start="0,0" time="500" tween="quadratic" easing="out">WindowClose</animation>
- <posx>800</posx>
+ <left>800</left>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>480</width>
<height>720</height>
<texture border="15,0,0,0" flipx="true">MediaBladeSub.png</texture>
</control>
<control type="label">
- <posx>440</posx>
- <posy>40</posy>
+ <right>440</right>
+ <top>40</top>
<width>410</width>
<height>30</height>
<font>font24_title</font>
<label>31059</label>
</control>
<control type="image">
- <posx>10</posx>
- <posy>80</posy>
+ <left>10</left>
+ <top>80</top>
<width>460</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>50r</posy>
+ <left>10</left>
+ <top>50r</top>
<width>460</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
<description>Page Count Label</description>
- <posx>440</posx>
- <posy>38r</posy>
+ <right>440</right>
+ <top>38r</top>
<width>300</width>
<height>20</height>
<font>font12</font>
<label>($INFO[Container(100).NumItems]) $LOCALIZE[31025] - $LOCALIZE[31024] ($INFO[Container(100).CurrentPage]/$INFO[Container(100).NumPages])</label>
</control>
<control type="scrollbar" id="31">
- <posx>430</posx>
- <posy>100</posy>
+ <left>430</left>
+ <top>100</top>
<width>25</width>
<height>550</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="list" id="100">
- <posx>20</posx>
- <posy>100</posy>
+ <left>20</left>
+ <top>100</top>
<width>400</width>
<height>550</height>
<onleft>9000</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="30" width="400">
<control type="label">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>380</width>
<height>30</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>395</posx>
- <posy>0</posy>
+ <left>395</left>
+ <top>0</top>
<width>360</width>
<height>30</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="30" width="400">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<texture border="7">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>380</width>
<height>30</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>395</posx>
- <posy>0</posy>
+ <left>395</left>
+ <top>0</top>
<width>360</width>
<height>30</height>
<font>font12</font>
</control>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_music.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_music.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
<include>MainWindowMouseButtons</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_video.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
<control type="group">
<description>Small Media Window</description>
- <posx>530</posx>
- <posy>80</posy>
+ <left>530</left>
+ <top>80</top>
<visible>Control.IsVisible(11) | Control.IsVisible(12)</visible>
<include>VisibleFadeEffect</include>
<include>Window_OpenClose_Animation</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>400</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>680</width>
<height>390</height>
<texture fallback="special://skin/backgrounds/tv.jpg">$INFO[Skin.String(Home_Custom_Back_TV_Folder)]</texture>
<visible>!Player.HasVideo</visible>
</control>
<control type="videowindow">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>680</width>
<height>390</height>
<visible>Player.HasVideo</visible>
<animation effect="slide" start="0,0" end="-2000,0" time="0">WindowClose</animation>
</control>
<control type="image">
- <posx>1</posx>
- <posy>1</posy>
+ <left>1</left>
+ <top>1</top>
<width>688</width>
<height>35</height>
<texture>black-back.png</texture>
</control>
<control type="label">
<description>Current Video label</description>
- <posx>30</posx>
- <posy>1</posy>
+ <left>30</left>
+ <top>1</top>
<width>650</width>
<height>35</height>
<font>font12</font>
<visible>Player.HasVideo</visible>
</control>
<!-- control type="visualisation">
- <posx>85</posx>
- <posy>85</posy>
+ <left>85</left>
+ <top>85</top>
<width>700</width>
<height>390</height>
<visible>Player.HasAudio</visible>
<include>ScrollOffsetLabel</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture>black-back.png</texture>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
</control>
<control type="button" id="32">
<description>TV Channels</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<textwidth>235</textwidth>
<include>ButtonCommonValues</include>
<label>19023</label>
</control>
<control type="button" id="33">
<description>Radio Channels</description>
- <posx>0</posx>
- <posy>40</posy>
+ <left>0</left>
+ <top>40</top>
<textwidth>235</textwidth>
<include>ButtonCommonValues</include>
<label>19024</label>
</control>
<control type="button" id="31">
<description>TV Guide</description>
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<textwidth>235</textwidth>
<include>ButtonCommonValues</include>
<label>$LOCALIZE[19222]: $LOCALIZE[19030]</label>
</control>
<control type="button" id="34">
<description>Recordings</description>
- <posx>0</posx>
- <posy>120</posy>
+ <left>0</left>
+ <top>120</top>
<textwidth>235</textwidth>
<include>ButtonCommonValues</include>
<label>19163</label>
</control>
<control type="button" id="35">
<description>Timers</description>
- <posx>0</posx>
- <posy>160</posy>
+ <left>0</left>
+ <top>160</top>
<textwidth>235</textwidth>
<include>ButtonCommonValues</include>
<label>19040</label>
</control>
<control type="button" id="36">
<description>Search</description>
- <posx>0</posx>
- <posy>200</posy>
+ <left>0</left>
+ <top>200</top>
<textwidth>235</textwidth>
<include>ButtonCommonValues</include>
<label>137</label>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>625</height>
<texture background="true">$INFO[ListItem.FilenameAndPath]</texture>
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_pictures.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_addons.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_video.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<width>250</width>
<height>650</height>
<onleft>9000</onleft>
<include>ScrollOffsetLabel</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_video.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
<controls>
<include>CommonBackground</include>
<control type="multiimage">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<imagepath background="true">$INFO[Skin.String(WeatherFanartDir)]$INFO[Window(Weather).Property(Current.FanartCode)]</imagepath>
</control>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_weather.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
</control>
<control type="group">
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>60</posx>
- <posy>40</posy>
+ <left>60</left>
+ <top>40</top>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>620</height>
<texture border="20">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>612</posy>
+ <left>0</left>
+ <top>612</top>
<width>500</width>
<height>64</height>
<texture border="10">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>20</posx>
- <posy>5</posy>
+ <left>20</left>
+ <top>5</top>
<width>460</width>
<height>90</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>460</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="image">
- <posx>70</posx>
- <posy>40</posy>
+ <left>70</left>
+ <top>40</top>
<width>360</width>
<height>90</height>
<aspectratio align="center" aligny="center">keep</aspectratio>
</control>
<control type="label">
<description>Provider Text</description>
- <posx>20</posx>
- <posy>50</posy>
+ <left>20</left>
+ <top>50</top>
<width>460</width>
<height>35</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="0,30" condition="!IsEmpty(Window.Property(WeatherProviderLogo))">Conditional</animation>
<control type="label">
<description>weather location label</description>
- <posx>20</posx>
- <posy>100</posy>
+ <left>20</left>
+ <top>100</top>
<width>460</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="label">
<description>update label</description>
- <posx>20</posx>
- <posy>120</posy>
+ <left>20</left>
+ <top>120</top>
<width>460</width>
<height>35</height>
<font>font12</font>
</control>
<control type="label">
<description>current temp Value</description>
- <posx>195</posx>
- <posy>175</posy>
+ <right>195</right>
+ <top>175</top>
<width>180</width>
<height>40</height>
<font>WeatherTemp</font>
</control>
<control type="label">
<description>current temp Value Units</description>
- <posx>190</posx>
- <posy>185</posy>
+ <left>190</left>
+ <top>185</top>
<width>100</width>
<height>40</height>
<font>font16</font>
</control>
<control type="image">
<description>current weather icon</description>
- <posx>230</posx>
- <posy>120</posy>
+ <left>230</left>
+ <top>120</top>
<width>230</width>
<height>230</height>
<info>Window.Property(Current.ConditionIcon)</info>
</control>
<control type="label">
<description>current condition label</description>
- <posx>20</posx>
- <posy>320</posy>
+ <left>20</left>
+ <top>320</top>
<width>460</width>
<height>30</height>
<info>Window.Property(Current.Condition)</info>
</control>
</control>
<control type="image">
- <posx>20</posx>
- <posy>390</posy>
+ <left>20</left>
+ <top>390</top>
<width>460</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
<description>current feels like label</description>
- <posx>170</posx>
- <posy>400</posy>
+ <right>170</right>
+ <top>400</top>
<width>170</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current dew label</description>
- <posx>170</posx>
- <posy>430</posy>
+ <right>170</right>
+ <top>430</top>
<width>170</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current humidity label</description>
- <posx>170</posx>
- <posy>460</posy>
+ <right>170</right>
+ <top>460</top>
<width>170</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current UV Index label</description>
- <posx>170</posx>
- <posy>490</posy>
+ <right>170</right>
+ <top>490</top>
<width>170</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current Wind label</description>
- <posx>170</posx>
- <posy>520</posy>
+ <right>170</right>
+ <top>520</top>
<width>170</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current feels like Value</description>
- <posx>185</posx>
- <posy>400</posy>
+ <left>185</left>
+ <top>400</top>
<width>300</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current dew Value</description>
- <posx>185</posx>
- <posy>430</posy>
+ <left>185</left>
+ <top>430</top>
<width>300</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current humidity Value</description>
- <posx>185</posx>
- <posy>460</posy>
+ <left>185</left>
+ <top>460</top>
<width>300</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current UV Index Value</description>
- <posx>185</posx>
- <posy>490</posy>
+ <left>185</left>
+ <top>490</top>
<width>300</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>current Wind Value</description>
- <posx>185</posx>
- <posy>520</posy>
+ <left>185</left>
+ <top>520</top>
<width>300</width>
<height>35</height>
<font>font13</font>
<visible>StringCompare(Weather.Plugin,weather.wunderground) + !IsEmpty(Window.Property(36Hour.IsFetched))</visible>
<control type="label">
<description>Sunrise Label</description>
- <posx>30</posx>
- <posy>570</posy>
+ <left>30</left>
+ <top>570</top>
<width>300</width>
<height>35</height>
<font>font13</font>
</control>
<control type="label">
<description>Sunset label</description>
- <posx>470</posx>
- <posy>570</posy>
+ <right>470</right>
+ <top>570</top>
<width>300</width>
<height>35</height>
<font>font13</font>
</control>
<control type="group">
<visible>!StringCompare(Weather.Plugin,weather.wunderground)</visible>
- <posx>580</posx>
- <posy>40</posy>
+ <left>580</left>
+ <top>40</top>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>650</width>
<height>620</height>
<texture border="20">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>612</posy>
+ <left>0</left>
+ <top>612</top>
<width>650</width>
<height>64</height>
<texture border="10">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>20</posx>
- <posy>5</posy>
+ <left>20</left>
+ <top>5</top>
<width>610</width>
<height>90</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>610</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="50">
- <posx>15</posx>
- <posy>60</posy>
+ <left>15</left>
+ <top>60</top>
<width>600</width>
<height>541</height>
<onleft>9000</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="135" width="600">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,5,0,5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,5,0,5">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>300</posx>
- <posy>5</posy>
+ <left>300</left>
+ <top>5</top>
<width>300</width>
<height>25</height>
<font>font13_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>460</posx>
- <posy>0</posy>
+ <left>460</left>
+ <top>0</top>
<width>135</width>
<height>135</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.ActualIcon]</texture>
</control>
<control type="label">
- <posx>30</posx>
- <posy>35</posy>
+ <left>30</left>
+ <top>35</top>
<width>390</width>
<height>30</height>
<font>font13</font>
<visible>!IsEmpty(ListItem.Property(HighTemp))</visible>
</control>
<control type="textbox">
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>400</width>
<height>50</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="135" width="600">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="10">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>300</posx>
- <posy>5</posy>
+ <left>300</left>
+ <top>5</top>
<width>300</width>
<height>25</height>
<font>font13_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>460</posx>
- <posy>0</posy>
+ <left>460</left>
+ <top>0</top>
<width>135</width>
<height>135</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.ActualIcon]</texture>
</control>
<control type="label">
- <posx>30</posx>
- <posy>35</posy>
+ <left>30</left>
+ <top>35</top>
<width>390</width>
<height>30</height>
<font>font13</font>
<visible>!IsEmpty(ListItem.Property(HighTemp))</visible>
</control>
<control type="textbox">
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>400</width>
<height>50</height>
<font>font13</font>
</content>
</control>
<control type="scrollbar" id="61">
- <posx>615</posx>
- <posy>60</posy>
+ <left>615</left>
+ <top>60</top>
<width>25</width>
<height>540</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>number of files/pages</description>
- <posx>660</posx>
- <posy>627</posy>
+ <right>660</right>
+ <top>627</top>
<width>570</width>
<font>font12</font>
<align>right</align>
</control>
<control type="group">
<visible>StringCompare(Weather.Plugin,weather.wunderground)</visible>
- <posx>580</posx>
- <posy>40</posy>
+ <left>580</left>
+ <top>40</top>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>650</width>
<height>620</height>
<texture border="20">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>612</posy>
+ <left>0</left>
+ <top>612</top>
<width>650</width>
<height>64</height>
<texture border="10">ContentPanelMirror.png</texture>
</control>
<control type="image">
- <posx>20</posx>
- <posy>5</posy>
+ <left>20</left>
+ <top>5</top>
<width>610</width>
<height>90</height>
<aspectratio>stretch</aspectratio>
<include>CommonNowPlaying</include>
<include>MainWindowMouseButtons</include>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<width>250</width>
<height>650</height>
<onleft>9000</onleft>
<height>40</height>
<control type="spincontrolex" id="3">
<description>change location button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<font>-</font>
<include>ButtonCommonValues</include>
<onleft>50</onleft>
<onback>50</onback>
</control>
<control type="label" id="301">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<font>font13</font>
<visible>Player.HasMedia + Window.IsActive(PlayerControls) + !Window.IsActive(FullscreenVideo) + !Window.IsActive(Visualisation)</visible>
<coordinates>
<system>1</system>
- <posx>390</posx>
- <posy>250</posy>
+ <left>390</left>
+ <top>250</top>
</coordinates>
<controls>
<control type="image">
- <posx>5</posx>
- <posy>156</posy>
+ <left>5</left>
+ <top>156</top>
<width>483</width>
<height>53</height>
<texture flipy="true" border="20,20,20,2">InfoMessagePanel.png</texture>
</control>
<control type="group" id="100">
- <posx>25</posx>
- <posy>162</posy>
+ <left>25</left>
+ <top>162</top>
<defaultcontrol always="true">603</defaultcontrol>
<visible>!VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="600">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="button" id="601">
- <posx>40</posx>
- <posy>0</posy>
+ <left>40</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="togglebutton" id="603">
- <posx>80</posx>
- <posy>0</posy>
+ <left>80</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="button" id="602">
- <posx>120</posx>
- <posy>0</posy>
+ <left>120</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="button" id="604">
- <posx>160</posx>
- <posy>0</posy>
+ <left>160</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="button" id="605">
- <posx>200</posx>
- <posy>0</posy>
+ <left>200</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="button" id="606">
- <posx>240</posx>
- <posy>0</posy>
+ <left>240</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<control type="group">
<animation effect="slide" start="0,0" end="40,0" time="0" condition="!Player.HasAudio">Conditional</animation>
<control type="button" id="607">
- <posx>325</posx>
- <posy>0</posy>
+ <left>325</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="image">
- <posx>325</posx>
- <posy>0</posy>
+ <left>325</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<texture>OSDRepeatNF.png</texture>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="image">
- <posx>325</posx>
- <posy>0</posy>
+ <left>325</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<texture>OSDRepeatFO.png</texture>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="image">
- <posx>325</posx>
- <posy>0</posy>
+ <left>325</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<texture>OSDRepeatOneNF.png</texture>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="image">
- <posx>325</posx>
- <posy>0</posy>
+ <left>325</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<texture>OSDRepeatOneFO.png</texture>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="image">
- <posx>325</posx>
- <posy>0</posy>
+ <left>325</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<texture>OSDRepeatAllNF.png</texture>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="image">
- <posx>325</posx>
- <posy>0</posy>
+ <left>325</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<texture>OSDRepeatAllFO.png</texture>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="togglebutton" id="608">
- <posx>365</posx>
- <posy>0</posy>
+ <left>365</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>!VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="togglebutton" id="609">
- <posx>405</posx>
- <posy>0</posy>
+ <left>405</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>31128</label>
</control>
</control>
<control type="group" id="100">
- <posx>25</posx>
- <posy>162</posy>
+ <left>25</left>
+ <top>162</top>
<defaultcontrol always="true">700</defaultcontrol>
<visible>VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="701">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<animation effect="fade" start="100" end="50" time="100" condition="true">Conditional</animation>
</control>
<control type="button" id="702">
- <posx>40</posx>
- <posy>0</posy>
+ <left>40</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="togglebutton" id="703">
- <posx>80</posx>
- <posy>0</posy>
+ <left>80</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<animation effect="fade" start="100" end="50" time="100" condition="true">Conditional</animation>
</control>
<control type="button" id="704">
- <posx>120</posx>
- <posy>0</posy>
+ <left>120</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<animation effect="fade" start="100" end="50" time="100" condition="true">Conditional</animation>
</control>
<control type="button" id="700">
- <posx>200</posx>
- <posy>0</posy>
+ <left>200</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="button" id="705">
- <posx>240</posx>
- <posy>0</posy>
+ <left>240</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<visible>VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="button" id="706">
- <posx>280</posx>
- <posy>0</posy>
+ <left>280</left>
+ <top>0</top>
<width>40</width>
<height>40</height>
<label>-</label>
<!-- Music Info -->
<control type="image">
<description>gradient</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>165</height>
<colordiffuse>CCFFFFFF</colordiffuse>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>420</posx>
- <posy>5</posy>
+ <left>420</left>
+ <top>5</top>
<width>64</width>
<height>32</height>
<label>-</label>
<defaultcontrol>-</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="image" id="1">
<description>Pointer Image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>32</width>
<height>32</height>
<texture>pointer-nofocus.png</texture>
</control>
<control type="image" id="2">
<description>Pointer Focus Image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>32</width>
<height>32</height>
<texture>pointer-focus.png</texture>
</control>
<control type="image" id="3">
<description>Pointer Drag Image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>32</width>
<height>32</height>
<texture>pointer-focus-drag.png</texture>
</control>
<control type="image" id="4">
<description>Pointer Click Image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>32</width>
<height>32</height>
<texture>pointer-focus-click.png</texture>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol>1</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>290</posx>
- <posy>75</posy>
+ <left>290</left>
+ <top>75</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>700</width>
<height>570</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>620</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>620</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>610</posx>
- <posy>15</posy>
+ <left>610</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image" id="2">
<description>profile image</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>150</width>
<height>150</height>
<align>left</align>
</control>
<control type="label">
<description>profile name label</description>
- <posx>200</posx>
- <posy>70</posy>
+ <left>200</left>
+ <top>70</top>
<width>460</width>
<align>left</align>
<font>font13_title</font>
</control>
<control type="label" id="1000">
<description>profile name Value</description>
- <posx>200</posx>
- <posy>95</posy>
+ <left>200</left>
+ <top>95</top>
<width>460</width>
<align>left</align>
<font>font16</font>
</control>
<control type="label">
<description>profile directory label</description>
- <posx>200</posx>
- <posy>155</posy>
+ <left>200</left>
+ <top>155</top>
<width>460</width>
<align>left</align>
<font>font13_title</font>
</control>
<control type="label" id="1001">
<description>profile directory Value</description>
- <posx>200</posx>
- <posy>180</posy>
+ <left>200</left>
+ <top>180</top>
<width>460</width>
<align>left</align>
<font>font13</font>
</control>
<control type="grouplist" id="5">
<description>control area</description>
- <posx>30</posx>
- <posy>230</posy>
+ <left>30</left>
+ <top>230</top>
<width>640</width>
<height>265</height>
<itemgap>5</itemgap>
</control>
<control type="button" id="7">
<description>Default Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="radiobutton" id="8">
<description>Default RadioButton</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="spincontrolex" id="9">
<description>Default SpinControlex</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="button" id="28">
<description>Ok Button</description>
- <posx>145</posx>
- <posy>505</posy>
+ <left>145</left>
+ <top>505</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="29">
<description>Cancel Button</description>
- <posx>355</posx>
- <posy>505</posy>
+ <left>355</left>
+ <top>505</top>
<width>200</width>
<height>40</height>
<align>center</align>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
<animation effect="slide" start="0,0" end="0,10" time="200" condition="Window.Next(Home)">WindowClose</animation>
</control>
<control type="group">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>1090</width>
<height>630</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>625</posy>
+ <left>5</left>
+ <top>625</top>
<width>1090</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>980</posx>
- <posy>11</posy>
+ <left>980</left>
+ <top>11</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>LOGO</description>
- <posx>30</posx>
- <posy>15</posy>
+ <left>30</left>
+ <top>15</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>Confluence_Logo.png</texture>
</control>
<control type="list" id="9000">
- <posx>10</posx>
- <posy>82</posy>
+ <left>10</left>
+ <top>82</top>
<width>260</width>
<height>541</height>
<onleft>9000</onleft>
<scrolltime>300</scrolltime>
<itemlayout height="54" width="260">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>55</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>250</posx>
- <posy>0</posy>
+ <left>250</left>
+ <top>0</top>
<width>380</width>
<height>55</height>
<font>font24_title</font>
</itemlayout>
<focusedlayout height="54" width="260">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>55</height>
<texture border="5">MenuItemFO.png</texture>
</control>
<control type="label">
- <posx>250</posx>
- <posy>0</posy>
+ <left>250</left>
+ <top>0</top>
<width>380</width>
<height>55</height>
<font>font24_title</font>
</content>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>804</width>
<height>50</height>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>804</width>
<height>70</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>740</width>
<height>30</height>
<font>font16</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="image">
- <posx>270</posx>
- <posy>60</posy>
+ <left>270</left>
+ <top>60</top>
<width>800</width>
<height>450</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>272</posx>
- <posy>62</posy>
+ <left>272</left>
+ <top>62</top>
<width>796</width>
<height>446</height>
<aspectratio>stretch</aspectratio>
<texture background="true">special://skin/backgrounds/settings.jpg</texture>
</control>
<control type="image">
- <posx>272</posx>
- <posy>62</posy>
+ <left>272</left>
+ <top>62</top>
<width>600</width>
<height>340</height>
<aspectratio>stretch</aspectratio>
<colordiffuse>AAFFFFFF</colordiffuse>
</control>
<control type="image">
- <posx>268</posx>
- <posy>510</posy>
+ <left>268</left>
+ <top>510</top>
<width>804</width>
<height>118</height>
<texture border="5">black-back2.png</texture>
</control>
<control type="textbox">
<description>Appearance Description</description>
- <posx>300</posx>
- <posy>520</posy>
+ <left>300</left>
+ <top>520</top>
<width>740</width>
<height>100</height>
<font>font12</font>
<include>BehindDialogFadeOut</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_system.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="group">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>1090</width>
<height>630</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>625</posy>
+ <left>5</left>
+ <top>625</top>
<width>1090</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>980</posx>
- <posy>11</posy>
+ <left>980</left>
+ <top>11</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>LOGO</description>
- <posx>30</posx>
- <posy>15</posy>
+ <left>30</left>
+ <top>15</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
</control>
<control type="grouplist" id="3">
<description>button area</description>
- <posx>10</posx>
- <posy>90</posy>
+ <left>10</left>
+ <top>90</top>
<width>260</width>
<height>481</height>
<itemgap>-1</itemgap>
</control>
<control type="button" id="20">
<description>Setting level button</description>
- <posx>10</posx>
- <posy>562</posy>
+ <left>10</left>
+ <top>562</top>
<height>60</height>
<width>260</width>
<label>10037</label>>
<onclick>SettingsLevelChange</onclick>
</control>
<control type="label">
- <posx>250</posx>
- <posy>566</posy>
+ <right>250</right>
+ <top>566</top>
<height>25</height>
<width>230</width>
<label>31142</label>
<aligny>center</aligny>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>790</width>
<height>618</height>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>804</width>
<height>70</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>740</width>
<height>30</height>
<font>font16</font>
</control>
<control type="grouplist" id="5">
<description>control area</description>
- <posx>290</posx>
- <posy>70</posy>
+ <left>290</left>
+ <top>70</top>
<width>750</width>
<height>435</height>
<itemgap>-1</itemgap>
<ondown>5</ondown>
</control>
<control type="scrollbar" id="60">
- <posx>1060</posx>
- <posy>60</posy>
+ <left>1060</left>
+ <top>60</top>
<width>25</width>
<height>435</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="image">
<description>separator image</description>
- <posx>290</posx>
- <posy>525</posy>
+ <left>290</left>
+ <top>525</top>
<width>750</width>
<height>2</height>
<texture>separator2.png</texture>
</control>
<control type="textbox" id="6">
<description>description area</description>
- <posx>297</posx>
- <posy>530</posy>
+ <left>297</left>
+ <top>530</top>
<width>736</width>
<height>85</height>
<font>font12</font>
</control>
<control type="button" id="7">
<description>Default Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="radiobutton" id="8">
<description>Default RadioButton</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="spincontrolex" id="9">
<description>Default SpinControlex</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="label" id="2">
<description>Fake Label so we can pass it value down to the one below</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>0</width>
<height>0</height>
<font>-</font>
<include>MainWindowMouseButtons</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_system.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
<animation effect="slide" start="0,0" end="0,10" time="200" condition="Window.Next(Home)">WindowClose</animation>
</control>
<control type="group">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>1090</width>
<height>630</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>625</posy>
+ <left>5</left>
+ <top>625</top>
<width>1090</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>980</posx>
- <posy>11</posy>
+ <left>980</left>
+ <top>11</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>LOGO</description>
- <posx>30</posx>
- <posy>15</posy>
+ <left>30</left>
+ <top>15</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>Confluence_Logo.png</texture>
</control>
- <control type="button" id ="4">
+ <control type="button" id="4">
<description>Enable Login screen</description>
- <posx>10</posx>
- <posy>90</posy>
+ <left>10</left>
+ <top>90</top>
<width>250</width>
<height>72</height>
<textoffsety>8</textoffsety>
<enable>!Window.IsVisible(ProfileSettings)</enable>
</control>
<control type="label">
- <posx>250</posx>
- <posy>130</posy>
+ <right>250</right>
+ <top>130</top>
<width>240</width>
<height>25</height>
<font>font13</font>
<visible>System.HasLoginScreen</visible>
</control>
<control type="label">
- <posx>250</posx>
- <posy>130</posy>
+ <right>250</right>
+ <top>130</top>
<width>240</width>
<height>25</height>
<font>font13</font>
</control>
<control type="button" id="5">
<description>Choose auto login user</description>
- <posx>10</posx>
- <posy>161</posy>
+ <left>10</left>
+ <top>161</top>
<width>250</width>
<height>72</height>
<textoffsety>8</textoffsety>
</control>
<control type="button">
<description>Choose auto login user (grayed out)</description>
- <posx>10</posx>
- <posy>161</posy>
+ <left>10</left>
+ <top>161</top>
<width>250</width>
<height>72</height>
<textoffsety>8</textoffsety>
<enable>false</enable>
</control>
<control type="label">
- <posx>247</posx>
- <posy>201</posy>
+ <right>247</right>
+ <top>201</top>
<width>200</width>
<height>25</height>
<font>font13caps</font>
<visible>!Control.HasFocus(5) + !System.HasLoginScreen</visible>
</control>
<control type="label">
- <posx>247</posx>
- <posy>201</posy>
+ <left>247</left>
+ <top>201</top>
<width>200</width>
<height>25</height>
<font>font13caps</font>
<visible>Control.HasFocus(5) + !System.HasLoginScreen</visible>
</control>
<control type="group">
- <posx>20</posx>
- <posy>260</posy>
+ <left>20</left>
+ <top>260</top>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>240</width>
<height>200</height>
<aspectratio>keep</aspectratio>
<texture fallback="unknown-user.png">$INFO[Container(2).Listitem.Icon]</texture>
</control>
<control type="label">
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<width>240</width>
<height>20</height>
<font>font12_title</font>
<label>$LOCALIZE[31319]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>235</posy>
+ <left>0</left>
+ <top>235</top>
<width>240</width>
<height>20</height>
<font>font13</font>
<label>$INFO[Container(2).ListItem.Label]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>265</posy>
+ <left>0</left>
+ <top>265</top>
<width>240</width>
<height>30</height>
<font>font12_title</font>
<label>$LOCALIZE[31320]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>290</posy>
+ <left>0</left>
+ <top>290</top>
<width>240</width>
<height>30</height>
<font>font13</font>
</control>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>790</width>
<height>618</height>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>804</width>
<height>70</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>740</width>
<height>30</height>
<font>font30_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="panel" id="2">
- <posx>283</posx>
- <posy>70</posy>
+ <left>283</left>
+ <top>70</top>
<width>760</width>
<height>540</height>
<onleft>4</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="180" width="190">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>188</width>
<height>145</height>
<bordertexture border="5">button-nofocus.png</bordertexture>
<texture fallback="unknown-user.png">$INFO[Listitem.Icon]</texture>
</control>
<control type="label">
- <posx>94</posx>
- <posy>145</posy>
+ <left>94</left>
+ <top>145</top>
<width>178</width>
<height>25</height>
<font>font11</font>
</itemlayout>
<focusedlayout height="180" width="190">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>188</width>
<height>145</height>
<bordertexture border="5">folder-focus.png</bordertexture>
<texture fallback="unknown-user.png">$INFO[Listitem.Icon]</texture>
</control>
<control type="label">
- <posx>94</posx>
- <posy>145</posy>
+ <left>94</left>
+ <top>145</top>
<width>178</width>
<height>25</height>
<font>font11</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>1060</posx>
- <posy>60</posy>
+ <left>1060</left>
+ <top>60</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<include>BehindDialogFadeOut</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_system.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
<controls>
<control type="videowindow" id="20">
<description>videowindow</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<visible>Player.HasVideo</visible>
</control>
<control type="image">
<description>Overlay</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture>black-back.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>100r</posx>
- <posy>0</posy>
+ <left>100r</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="mover" id="8">
<description>top left mover</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>128</width>
<height>128</height>
<texturefocus>CalibrateTopLeft.png</texturefocus>
</control>
<control type="mover" id="9">
<description>right bottom mover</description>
- <posx>700</posx>
- <posy>500</posy>
+ <left>700</left>
+ <top>500</top>
<width>128</width>
<height>128</height>
<texturefocus>CalibrateBottomRight.png</texturefocus>
</control>
<control type="mover" id="10">
<description>subtitle position mover</description>
- <posx>200</posx>
- <posy>500</posy>
+ <left>200</left>
+ <top>500</top>
<width>512</width>
<height>128</height>
<texturefocus>CalibrateSubtitles.png</texturefocus>
</control>
<control type="resize" id="11">
<description>pixel aspect ratio box</description>
- <posx>0</posx>
- <posy>232</posy>
+ <left>0</left>
+ <top>232</top>
<width>256</width>
<height>256</height>
<texturefocus>CalibratePixelRatio.png</texturefocus>
<texturenofocus>-</texturenofocus>
</control>
<control type="group">
- <posx>20</posx>
- <posy>80</posy>
+ <left>20</left>
+ <top>80</top>
<control type="label" id="2">
<description>coordinates label</description>
- <posx>0</posx>
- <posy>10</posy>
+ <left>0</left>
+ <top>10</top>
<width>1240</width>
<label>-</label>
<align>center</align>
</control>
<control type="label" id="3">
<description>help information</description>
- <posx>0</posx>
- <posy>40</posy>
+ <left>0</left>
+ <top>40</top>
<width>1240</width>
<label>-</label>
<align>center</align>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
<animation effect="slide" start="0,0" end="0,10" time="200" condition="Window.Next(Home)">WindowClose</animation>
</control>
<control type="group">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>1090</width>
<height>630</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>625</posy>
+ <left>5</left>
+ <top>625</top>
<width>1090</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>980</posx>
- <posy>11</posy>
+ <left>980</left>
+ <top>11</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>LOGO</description>
- <posx>30</posx>
- <posy>15</posy>
+ <left>30</left>
+ <top>15</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>Confluence_Logo.png</texture>
</control>
<control type="grouplist" id="9000">
- <posx>10</posx>
- <posy>90</posy>
+ <left>10</left>
+ <top>90</top>
<width>260</width>
<height>481</height>
<itemgap>-1</itemgap>
</control>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>790</width>
<height>618</height>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>804</width>
<height>100</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label" id="40">
<description>header label</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>740</width>
<height>30</height>
<font>font16</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="group">
- <posx>290</posx>
- <posy>100</posy>
+ <left>290</left>
+ <top>100</top>
<control type="label" id="2">
<description>Label 2</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="3">
<description>Label 3</description>
- <posx>0</posx>
- <posy>35</posy>
+ <left>0</left>
+ <top>35</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="4">
<description>Label 4</description>
- <posx>0</posx>
- <posy>70</posy>
+ <left>0</left>
+ <top>70</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="5">
<description>Label 5</description>
- <posx>0</posx>
- <posy>105</posy>
+ <left>0</left>
+ <top>105</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="6">
<description>Label 6</description>
- <posx>0</posx>
- <posy>140</posy>
+ <left>0</left>
+ <top>140</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="7">
<description>Label 7</description>
- <posx>0</posx>
- <posy>175</posy>
+ <left>0</left>
+ <top>175</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="8">
<description>Label 8</description>
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="9">
<description>Label 9</description>
- <posx>0</posx>
- <posy>245</posy>
+ <left>0</left>
+ <top>245</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="10">
<description>Label 10</description>
- <posx>0</posx>
- <posy>280</posy>
+ <left>0</left>
+ <top>280</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="11">
<description>Label 11</description>
- <posx>0</posx>
- <posy>315</posy>
+ <left>0</left>
+ <top>315</top>
<width>750</width>
<label>-</label>
<font>font13</font>
</control>
<control type="label" id="52">
<description>XBMC BUILD Version</description>
- <posx>750</posx>
- <posy>400</posy>
+ <right>750</right>
+ <top>400</top>
<width>730</width>
<label>144</label>
<align>right</align>
</control>
<control type="label">
<description>CPU Text</description>
- <posx>420</posx>
- <posy>450</posy>
+ <right>420</right>
+ <top>450</top>
<width>350</width>
<height>25</height>
<label>$LOCALIZE[13271] $INFO[System.CPUUsage]</label>
</control>
<control type="progress">
<description>CPU BAR</description>
- <posx>430</posx>
- <posy>455</posy>
+ <left>430</left>
+ <top>455</top>
<width>320</width>
<height>16</height>
<info>System.CPUUsage</info>
</control>
<control type="label">
<description>Memory Text</description>
- <posx>420</posx>
- <posy>480</posy>
+ <right>420</right>
+ <top>480</top>
<width>350</width>
<height>25</height>
<label>$LOCALIZE[31309] $INFO[system.memory(used.percent)]</label>
</control>
<control type="progress">
<description>Memory BAR</description>
- <posx>430</posx>
- <posy>485</posy>
+ <left>430</left>
+ <top>485</top>
<width>320</width>
<height>16</height>
<info>system.memory(used)</info>
<include>MainWindowMouseButtons</include>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_system.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
<controls>
<include>CommonBackground</include>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
</control>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_system.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
</control>
<control type="group">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>1090</width>
<height>630</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>625</posy>
+ <left>5</left>
+ <top>625</top>
<width>1090</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>980</posx>
- <posy>11</posy>
+ <left>980</left>
+ <top>11</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>LOGO</description>
- <posx>30</posx>
- <posy>15</posy>
+ <left>30</left>
+ <top>15</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>Confluence_Logo.png</texture>
</control>
<control type="list" id="9000">
- <posx>10</posx>
- <posy>90</posy>
+ <left>10</left>
+ <top>90</top>
<width>260</width>
<height>481</height>
<onleft>9010</onleft>
<scrolltime>300</scrolltime>
<itemlayout height="80" width="260">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>81</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>250</posx>
- <posy>15</posy>
+ <left>250</left>
+ <top>15</top>
<width>380</width>
<height>25</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>250</posx>
- <posy>42</posy>
+ <left>250</left>
+ <top>42</top>
<width>870</width>
<height>25</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="80" width="260">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>81</height>
<texture border="5">MenuItemFO.png</texture>
<animation effect="fade" start="100" end="30" time="100" condition="!Control.HasFocus(9000)">Conditional</animation>
</control>
<control type="label">
- <posx>250</posx>
- <posy>15</posy>
+ <left>250</left>
+ <top>15</top>
<width>380</width>
<height>25</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>250</posx>
- <posy>42</posy>
+ <left>250</left>
+ <top>42</top>
<width>870</width>
<height>25</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>790</width>
<height>618</height>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>804</width>
<height>100</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>header label</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>740</width>
<height>30</height>
<font>font16</font>
<control type="group" id="9010">
<control type="grouplist" id="9001">
<visible>Container(9000).Hasfocus(1)</visible>
- <posx>290</posx>
- <posy>60</posy>
+ <left>290</left>
+ <top>60</top>
<width>750</width>
<height>530</height>
<itemgap>-1</itemgap>
</control>
</control>
<control type="scrollbar" id="60">
- <posx>1060</posx>
- <posy>60</posy>
+ <left>1060</left>
+ <top>60</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="grouplist" id="9002">
<visible>Container(9000).Hasfocus(2)</visible>
- <posx>290</posx>
- <posy>60</posy>
+ <left>290</left>
+ <top>60</top>
<width>750</width>
<height>530</height>
<itemgap>-1</itemgap>
</control>
</control>
<control type="scrollbar" id="60">
- <posx>1060</posx>
- <posy>60</posy>
+ <left>1060</left>
+ <top>60</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="grouplist" id="9003">
<visible>Container(9000).Hasfocus(3)</visible>
- <posx>290</posx>
- <posy>60</posy>
+ <left>290</left>
+ <top>60</top>
<width>750</width>
<height>530</height>
<itemgap>-1</itemgap>
<control type="group">
<control type="grouplist" id="9004">
<visible>Container(9000).Hasfocus(4)</visible>
- <posx>290</posx>
- <posy>60</posy>
+ <left>290</left>
+ <top>60</top>
<width>750</width>
<height>530</height>
<itemgap>-1</itemgap>
</control>
</control>
<control type="scrollbar" id="61">
- <posx>1060</posx>
- <posy>60</posy>
+ <left>1060</left>
+ <top>60</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<defaultcontrol>2</defaultcontrol>
<controls>
<control type="group" id="13">
- <posx>130r</posx>
- <posy>10</posy>
+ <left>130r</left>
+ <top>10</top>
<visible>!Skin.HasSetting(Show_SlideShow_Paused)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>120</width>
<height>35</height>
<texture>black-back.png</texture>
</control>
<control type="label">
<description>paused label</description>
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>100</width>
<height>35</height>
<align>center</align>
</control>
<!-- media infos -->
<control type="group">
- <posx>20</posx>
- <posy>180r</posy>
+ <left>20</left>
+ <top>180r</top>
<visible>Player.ShowInfo + Player.HasMedia</visible>
<include>VisibleFadeEffect</include>
<include>SmallMusicInfo</include>
<control type="button">
<visible>SlideShow.IsVideo + [!SlideShow.IsActive | SlideShow.IsPaused]</visible>
<description>Video Play Button</description>
- <posx>540</posx>
- <posy>260</posy>
+ <left>540</left>
+ <top>260</top>
<width>200</width>
<height>200</height>
<font>-</font>
<texturenofocus>arrow-big-right.png</texturenofocus>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<allowoverlay>no</allowoverlay>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>22</posy>
+ <left>240</left>
+ <top>22</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<include>VisibleFadeEffect</include>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>675</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="2">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>9</posy>
+ <left>710</left>
+ <top>9</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="spincontrolex" id="22">
<description>Set Playlist type</description>
- <posx>30</posx>
- <posy>70</posy>
+ <left>30</left>
+ <top>70</top>
<width>740</width>
<height>40</height>
<label>467</label>
</control>
<control type="label">
<description>Name Label</description>
- <posx>30</posx>
- <posy>120</posy>
+ <left>30</left>
+ <top>120</top>
<width>740</width>
<label>21433</label>
<font>font12</font>
</control>
<control type="edit" id="12">
<description>Name Button</description>
- <posx>30</posx>
- <posy>145</posy>
+ <left>30</left>
+ <top>145</top>
<width>740</width>
<height>40</height>
<textoffsetx>10</textoffsetx>
</control>
<control type="label">
<description>rules label</description>
- <posx>30</posx>
- <posy>200</posy>
+ <left>30</left>
+ <top>200</top>
<width>740</width>
<align>left</align>
<label>21434</label>
</control>
<control type="list" id="10">
<description>Rules List Control</description>
- <posx>30</posx>
- <posy>225</posy>
+ <left>30</left>
+ <top>225</top>
<width>550</width>
<height>135</height>
<onup>12</onup>
<ondown>16</ondown>
<itemlayout width="560" height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>530</width>
<height>40</height>
<aligny>center</aligny>
</itemlayout>
<focusedlayout width="560" height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>40</height>
<texture border="5">button-focus2.png</texture>
<visible>Control.HasFocus(10)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<visible>!Control.HasFocus(10)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>530</width>
<height>40</height>
<aligny>center</aligny>
</focusedlayout>
</control>
<control type="group" id="9000">
- <posx>590</posx>
- <posy>225</posy>
+ <left>590</left>
+ <top>225</top>
<control type="button" id="13">
<description>Add Rule Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>180</width>
<height>40</height>
<label>15019</label>
</control>
<control type="button" id="14">
<description>Remove Rule Button</description>
- <posx>0</posx>
- <posy>45</posy>
+ <left>0</left>
+ <top>45</top>
<height>40</height>
<width>180</width>
<label>1210</label>
</control>
<control type="button" id="15">
<description>Edit Rule Button</description>
- <posx>0</posx>
- <posy>90</posy>
+ <left>0</left>
+ <top>90</top>
<height>40</height>
<width>180</width>
<label>21435</label>
<control type="label">
<description>Name Label</description>
- <posx>30</posx>
- <posy>370</posy>
+ <left>30</left>
+ <top>370</top>
<width>740</width>
<label>31325</label>
<font>font12</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="spincontrolex" id="16">
- <posx>30</posx>
- <posy>395</posy>
+ <left>30</left>
+ <top>395</top>
<width>740</width>
<height>40</height>
<label>21424</label>
</control>
<control type="spincontrolex" id="17">
- <posx>30</posx>
- <posy>440</posy>
+ <left>30</left>
+ <top>440</top>
<width>740</width>
<height>40</height>
<label>21427</label>
</control>
<control type="spincontrolex" id="18">
- <posx>30</posx>
- <posy>485</posy>
+ <left>30</left>
+ <top>485</top>
<width>550</width>
<height>40</height>
<label>21429</label>
</control>
<control type="togglebutton" id="19">
- <posx>590</posx>
- <posy>485</posy>
+ <left>590</left>
+ <top>485</top>
<width>180</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="spincontrolex" id="23">
- <posx>30</posx>
- <posy>530</posy>
+ <left>30</left>
+ <top>530</top>
<width>550</width>
<height>40</height>
<label>21458</label>
</control>
<control type="radiobutton" id="24">
- <posx>590</posx>
- <posy>530</posy>
+ <left>590</left>
+ <top>530</top>
<width>180</width>
<height>40</height>
<font>font12_title</font>
<control type="group" id="9001">
<control type="button" id="20">
<description>Ok Button</description>
- <posx>195</posx>
- <posy>605</posy>
+ <left>195</left>
+ <top>605</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="21">
<description>Cancel Button</description>
- <posx>405</posx>
- <posy>605</posy>
+ <left>405</left>
+ <top>605</top>
<width>200</width>
<height>40</height>
<align>center</align>
<allowoverlay>no</allowoverlay>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>220</posy>
+ <left>240</left>
+ <top>220</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>280</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>Rule match label</description>
- <posx>40</posx>
- <posy>60</posy>
+ <left>40</left>
+ <top>60</top>
<width>720</width>
<height>35</height>
<align>center</align>
<control type="group" id="9001">
<control type="spincontrolex" id="15">
<description>Rule Field</description>
- <posx>30</posx>
- <posy>100</posy>
+ <left>30</left>
+ <top>100</top>
<width>365</width>
<height>40</height>
<font>-</font>
</control>
<control type="label">
<description>Rule Field label</description>
- <posx>35</posx>
- <posy>100</posy>
+ <left>35</left>
+ <top>100</top>
<width>300</width>
<height>40</height>
<font>font13</font>
</control>
<control type="spincontrolex" id="16">
<description>Rule operator</description>
- <posx>405</posx>
- <posy>100</posy>
+ <left>405</left>
+ <top>100</top>
<width>365</width>
<height>40</height>
<font>-</font>
</control>
<control type="label">
<description>Rule Field label</description>
- <posx>410</posx>
- <posy>100</posy>
+ <left>410</left>
+ <top>100</top>
<width>300</width>
<height>40</height>
<font>font13</font>
</control>
<control type="button" id="17">
<description>Value Button</description>
- <posx>30</posx>
- <posy>145</posy>
+ <left>30</left>
+ <top>145</top>
<width>565</width>
<height>40</height>
<font>font13</font>
</control>
<control type="button" id="20">
<description>Browse Button</description>
- <posx>600</posx>
- <posy>145</posy>
+ <left>600</left>
+ <top>145</top>
<width>170</width>
<height>40</height>
<align>center</align>
<control type="group" id="9000">
<control type="button" id="18">
<description>Ok Button</description>
- <posx>195</posx>
- <posy>210</posy>
+ <left>195</left>
+ <top>210</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="19">
<description>Cancel Button</description>
- <posx>405</posx>
- <posy>210</posy>
+ <left>405</left>
+ <top>210</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<visible>[Player.ShowInfo | Window.IsActive(VideoOSD)] + ![Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(SliderDialog)]</visible>
<animation effect="fade" time="200">VisibleChange</animation>
<control type="image" id="1">
- <posx>0</posx>
- <posy>-150</posy>
+ <left>0</left>
+ <top>-150</top>
<width>1280</width>
<height>256</height>
<texture flipy="true" border="1">HomeNowPlayingBack.png</texture>
</control>
<control type="label" id="1">
<description>Chapter Count Header label</description>
- <posx>30</posx>
- <posy>5</posy>
+ <left>30</left>
+ <top>5</top>
<width>1000</width>
<height>25</height>
<align>left</align>
</control>
<control type="label" id="1">
<description>Channel Group label</description>
- <posx>30</posx>
- <posy>5</posy>
+ <left>30</left>
+ <top>5</top>
<width>1000</width>
<height>25</height>
<align>left</align>
</control>
<control type="label" id="1">
<description>Clock label</description>
- <posx>1250</posx>
- <posy>5</posy>
+ <right>1250</right>
+ <top>5</top>
<width>800</width>
<height>25</height>
<align>right</align>
<animation effect="slide" start="0,0" end="-70,0" time="0" condition="Window.IsVisible(VideoOSD)">conditional</animation>
</control>
<control type="image" id="1">
- <posx>0</posx>
- <posy>230r</posy>
+ <left>0</left>
+ <top>230r</top>
<width>1280</width>
<height>230</height>
<texture border="1">HomeNowPlayingBack.png</texture>
</control>
<control type="image" id="1">
<description>cover image</description>
- <posx>20</posx>
- <posy>260r</posy>
+ <left>20</left>
+ <top>260r</top>
<width>300</width>
<height>230</height>
<texture fallback="DefaultVideoCover.png">$INFO[Player.Art(thumb)]</texture>
</control>
<control type="image" id="1">
<description>Movie cover image</description>
- <posx>20</posx>
- <posy>350r</posy>
+ <left>20</left>
+ <top>350r</top>
<width>300</width>
<height>330</height>
<texture fallback="DefaultVideoCover.png">$INFO[Player.Art(thumb)]</texture>
<visible>VideoPlayer.Content(Movies)</visible>
</control>
<control type="group" id="1">
- <posx>330</posx>
- <posy>185r</posy>
+ <left>330</left>
+ <top>185r</top>
<control type="label" id="1">
<description>Heading label</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>910</width>
<height>25</height>
<align>left</align>
<animation effect="slide" start="0,0" end="0,25" time="0" condition="!VideoPlayer.Content(Movies) + !VideoPlayer.Content(Episodes) + !VideoPlayer.Content(MusicVideos) + !VideoPlayer.Content(LiveTV)">conditional</animation>
</control>
<control type="image" id="1">
- <posy>0</posy>
+ <top>0</top>
<width>50</width>
<height>25</height>
<aspectratio align="center" aligny="center">keep</aspectratio>
</control>
<control type="label" id="1">
<description>Heading label</description>
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>860</width>
<height>25</height>
<align>left</align>
</control>
<control type="label" id="1">
<description>Studio label</description>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<width>910</width>
<height>25</height>
<align>left</align>
</control>
<control type="label" id="1">
<description>TV Show label</description>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<width>910</width>
<height>25</height>
<align>left</align>
</control>
<control type="label" id="1">
<description>Music Info label</description>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<width>910</width>
<height>25</height>
<align>left</align>
</control>
<control type="label" id="1">
<description>LiveTV Info label</description>
- <posx>20</posx>
- <posy>30</posy>
+ <left>20</left>
+ <top>30</top>
<width>910</width>
<height>25</height>
<align>left</align>
<visible>VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="grouplist" id="1">
- <posx>20</posx>
- <posy>60</posy>
+ <left>20</left>
+ <top>60</top>
<width>910</width>
<height>35</height>
<itemgap>5</itemgap>
<height>35</height>
<visible>!IsEmpty(VideoPlayer.AudioLanguage)</visible>
<control type="image" id="1">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<description>Audio Language Image</description>
<width>80</width>
<height>35</height>
<texture>flagging/AudioLang.png</texture>
</control>
<control type="label" id="1">
- <posx>38</posx>
- <posy>2</posy>
+ <left>38</left>
+ <top>2</top>
<width>47</width>
<height>35</height>
<font>font13</font>
<height>35</height>
<visible>!IsEmpty(VideoPlayer.SubtitlesLanguage)</visible>
<control type="image" id="1">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>80</width>
<height>35</height>
<texture>flagging/SubLang.png</texture>
</control>
<control type="label" id="1">
- <posx>38</posx>
- <posy>2</posy>
+ <left>38</left>
+ <top>2</top>
<width>47</width>
<height>35</height>
<font>font13</font>
</control>
</control>
<control type="label" id="1">
- <posx>0</posx>
- <posy>120</posy>
+ <left>0</left>
+ <top>120</top>
<width>910</width>
<height>25</height>
<label>$LOCALIZE[31049] $INFO[Player.FinishTime]</label>
<animation effect="fade" time="200">VisibleChange</animation>
</control>
<control type="label" id="1">
- <posx>0</posx>
- <posy>120</posy>
+ <left>0</left>
+ <top>120</top>
<width>910</width>
<height>25</height>
<label>$INFO[VideoPlayer.NextTitle,$LOCALIZE[209]: ]</label>
</control>
</control>
<control type="group" id="1">
- <posx>330</posx>
- <posy>95r</posy>
+ <left>330</left>
+ <top>95r</top>
<visible>!VideoPlayer.Content(LiveTV) | [VideoPlayer.Content(LiveTV) + VideoPlayer.HasEpg]</visible>
<control type="label" id="1">
<visible>!VideoPlayer.Content(LiveTV)</visible>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font13</font>
</control>
<control type="label" id="1">
<visible>VideoPlayer.Content(LiveTV)</visible>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font13</font>
</control>
<control type="progress" id="1">
<description>ProgressbarCache</description>
- <posx>100</posx>
- <posy>15</posy>
+ <left>100</left>
+ <top>15</top>
<width>720</width>
<height>16</height>
<info>Player.ProgressCache</info>
</control>
<control type="progress" id="1">
<description>Progressbar</description>
- <posx>100</posx>
- <posy>15</posy>
+ <left>100</left>
+ <top>15</top>
<width>720</width>
<height>16</height>
<info>Player.Progress</info>
</control>
<control type="label" id="1">
<visible>!VideoPlayer.Content(LiveTV)</visible>
- <posx>920</posx>
- <posy>0</posy>
+ <right>920</right>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font13</font>
</control>
<control type="label" id="1">
<visible>VideoPlayer.Content(LiveTV)</visible>
- <posx>920</posx>
- <posy>0</posy>
+ <right>920</right>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font13</font>
</control>
<!-- codec info -->
<control type="group" id="0">
- <posx>0</posx>
- <posy>20</posy>
+ <left>0</left>
+ <top>20</top>
<animation effect="fade" time="200">VisibleChange</animation>
<control type="image">
<description>media info background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>140</height>
<texture>black-back.png</texture>
</control>
<control type="label" id="10">
<description>row 1 label</description>
- <posx>50</posx>
- <posy>10</posy>
+ <left>50</left>
+ <top>10</top>
<width>1180</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="11">
<description>row 2 label</description>
- <posx>50</posx>
- <posy>55</posy>
+ <left>50</left>
+ <top>55</top>
<width>1180</width>
<height>30</height>
<align>left</align>
</control>
<control type="label" id="12">
<description>row 3 label</description>
- <posx>50</posx>
- <posy>100</posy>
+ <left>50</left>
+ <top>100</top>
<width>1180</width>
<height>30</height>
<align>left</align>
</control>
</control>
<control type="selectbutton" id="503">
- <posx>440</posx>
- <posy>100</posy>
+ <left>440</left>
+ <top>100</top>
<width>400</width>
<height>100</height>
<font>font13caps</font>
</control>
<control type="group">
<visible>Player.ShowCodec + VideoPlayer.Content(LiveTV) + system.getbool(pvrplayback.signalquality)</visible>
- <posy>165</posy>
+ <top>165</top>
<control type="image">
<description>media info background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>220</height>
<texture>black-back.png</texture>
</control>
<control type="label">
<description>Header</description>
- <posx>50</posx>
- <posy>5</posy>
+ <left>50</left>
+ <top>5</top>
<width>1200</width>
<height>25</height>
<label>$LOCALIZE[19005]</label>
</control>
<control type="label">
<description>Backend</description>
- <posx>50</posx>
- <posy>40</posy>
+ <left>50</left>
+ <top>40</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19012]:</label>
</control>
<control type="label">
<description>Backend value</description>
- <posx>220</posx>
- <posy>40</posy>
+ <left>220</left>
+ <top>40</top>
<width>1000</width>
<height>25</height>
<label>$INFO[PVR.ActStreamClient]</label>
</control>
<control type="label">
<description>Device</description>
- <posx>50</posx>
- <posy>65</posy>
+ <left>50</left>
+ <top>65</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19006]:</label>
</control>
<control type="label">
<description>Device value</description>
- <posx>220</posx>
- <posy>65</posy>
+ <left>220</left>
+ <top>65</top>
<width>1000</width>
<height>25</height>
<label>$INFO[PVR.ActStreamDevice]</label>
</control>
<control type="label">
<description>Status</description>
- <posx>50</posx>
- <posy>90</posy>
+ <left>50</left>
+ <top>90</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19007]:</label>
</control>
<control type="label">
<description>Status value</description>
- <posx>220</posx>
- <posy>90</posy>
+ <left>220</left>
+ <top>90</top>
<width>1000</width>
<height>25</height>
<label>$INFO[PVR.ActStreamStatus]</label>
</control>
<control type="label">
<description>Signal</description>
- <posx>50</posx>
- <posy>115</posy>
+ <left>50</left>
+ <top>115</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19008]:</label>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>220</posx>
- <posy>122</posy>
+ <left>220</left>
+ <top>122</top>
<width>910</width>
<height>14</height>
<info>PVR.ActStreamProgrSignal</info>
</control>
<control type="label">
<description>Signal value</description>
- <posx>1200</posx>
- <posy>115</posy>
+ <left>1200</left>
+ <top>115</top>
<width>180</width>
<height>25</height>
<label>$INFO[PVR.ActStreamSignal]</label>
</control>
<control type="label">
<description>SNR</description>
- <posx>50</posx>
- <posy>140</posy>
+ <left>50</left>
+ <top>140</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19009]:</label>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>220</posx>
- <posy>147</posy>
+ <left>220</left>
+ <top>147</top>
<width>910</width>
<height>14</height>
<overlaytexture>-</overlaytexture>
</control>
<control type="label">
<description>SNR value</description>
- <posx>1200</posx>
- <posy>140</posy>
+ <left>1200</left>
+ <top>140</top>
<width>180</width>
<height>25</height>
<label>$INFO[PVR.ActStreamSNR]</label>
</control>
<control type="label">
<description>BER</description>
- <posx>50</posx>
- <posy>165</posy>
+ <left>50</left>
+ <top>165</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19010]:</label>
</control>
<control type="label">
<description>BER value</description>
- <posx>220</posx>
- <posy>165</posy>
+ <left>220</left>
+ <top>165</top>
<width>1000</width>
<height>25</height>
<label>$INFO[PVR.ActStreamBER]</label>
</control>
<control type="label">
<description>UNC</description>
- <posx>430</posx>
- <posy>165</posy>
+ <left>430</left>
+ <top>165</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19011]:</label>
</control>
<control type="label">
<description>UNC value</description>
- <posx>600</posx>
- <posy>165</posy>
+ <left>600</left>
+ <top>165</top>
<width>1000</width>
<height>25</height>
<label>$INFO[PVR.ActStreamUNC]</label>
</control>
<control type="label">
<description>Encryption</description>
- <posx>50</posx>
- <posy>190</posy>
+ <left>50</left>
+ <top>190</top>
<width>165</width>
<height>25</height>
<label>$LOCALIZE[19015]:</label>
</control>
<control type="label">
<description>Encryption value</description>
- <posx>220</posx>
- <posy>190</posy>
+ <left>220</left>
+ <top>190</top>
<width>1000</width>
<height>25</height>
<label>$INFO[PVR.ActStreamEncryptionName]</label>
<include>dialogeffect</include>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="button" id="1000">
<description>Close Window button</description>
- <posx>84r</posx>
- <posy>0</posy>
+ <left>84r</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="slider" id="87">
<description>Seek Slider</description>
- <posx>430</posx>
- <posy>82r</posy>
+ <left>430</left>
+ <top>82r</top>
<width>720</width>
<height>16</height>
<onup>702</onup>
</control>
<!-- !LiveTV -->
<control type="group" id="100">
- <posx>325</posx>
- <posy>60r</posy>
+ <left>325</left>
+ <top>60r</top>
<defaultcontrol always="true">202</defaultcontrol>
<animation effect="fade" time="200">VisibleChange</animation>
<visible>![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks)]</visible>
<visible>!VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="200">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>210</label>
<onclick>PlayerControl(Previous)</onclick>
</control>
<control type="button" id="201">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31354</label>
<onclick>PlayerControl(Rewind)</onclick>
</control>
<control type="togglebutton" id="202">
- <posx>110</posx>
- <posy>0</posy>
+ <left>110</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31351</label>
<onclick>PlayerControl(Play)</onclick>
</control>
<control type="button" id="203">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31352</label>
<onclick>PlayerControl(Stop)</onclick>
</control>
<control type="button" id="204">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31353</label>
<onclick>PlayerControl(Forward)</onclick>
</control>
<control type="button" id="205">
- <posx>275</posx>
- <posy>0</posy>
+ <left>275</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>209</label>
<!-- LiveTV -->
<control type="group" id="100">
- <posx>325</posx>
- <posy>60r</posy>
+ <left>325</left>
+ <top>60r</top>
<defaultcontrol always="true">301</defaultcontrol>
<animation effect="fade" time="200">VisibleChange</animation>
<visible>![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)]</visible>
<visible>VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="300">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>210</label>
<onclick>PlayerControl(Previous)</onclick>
</control>
<control type="button" id="301">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31354</label>
<onclick>PlayerControl(Next)</onclick>
</control>
<control type="button" id="302">
- <posx>110</posx>
- <posy>0</posy>
+ <left>110</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31354</label>
<animation effect="fade" start="100" end="50" time="100" condition="!Player.SeekEnabled">Conditional</animation>
</control>
<control type="togglebutton" id="303">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31351</label>
<animation effect="fade" start="100" end="50" time="100" condition="!Player.PauseEnabled">Conditional</animation>
</control>
<control type="button" id="304">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31351</label>
<onclick>PlayerControl(Stop)</onclick>
</control>
<control type="button" id="305">
- <posx>275</posx>
- <posy>0</posy>
+ <left>275</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31353</label>
<animation effect="fade" start="100" end="50" time="100" condition="!Player.SeekEnabled">Conditional</animation>
</control>
<control type="button" id="306">
- <posx>330</posx>
- <posy>0</posy>
+ <left>330</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>19019</label>
<onclick>Dialog.Close(VideoOSD)</onclick>
</control>
<control type="button" id="307">
- <posx>385</posx>
- <posy>0</posy>
+ <left>385</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>$LOCALIZE[19029]$INFO[VideoPlayer.ChannelName, - ]</label>
<!-- !LiveTV -->
<control type="group">
- <posx>355r</posx>
- <posy>60r</posy>
+ <left>355r</left>
+ <top>60r</top>
<animation effect="fade" time="200">VisibleChange</animation>
<visible>![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks)]</visible>
<visible>!VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="255">
<visible>VideoPlayer.IsStereoscopic</visible>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>36501</label>
<ondown>1000</ondown>
</control>
<control type="button" id="250">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31356</label>
<ondown>1000</ondown>
</control>
<control type="button" id="251">
- <posx>110</posx>
- <posy>0</posy>
+ <left>110</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>13395</label>
<onclick>ActivateWindow(OSDVideoSettings)</onclick>
</control>
<control type="button" id="252">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>13396</label>
<onclick>ActivateWindow(OSDAudioSettings)</onclick>
</control>
<control type="button" id="253">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31355</label>
<onclick>ActivateWindow(VideoBookmarks)</onclick>
</control>
<control type="button" id="254">
- <posx>275</posx>
- <posy>0</posy>
+ <left>275</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31355</label>
<!-- LiveTV -->
<control type="group">
- <posx>300r</posx>
- <posy>60r</posy>
+ <left>300r</left>
+ <top>60r</top>
<animation effect="fade" time="200">VisibleChange</animation>
<visible>![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)]</visible>
<visible>VideoPlayer.Content(LiveTV)</visible>
<control type="button" id="354">
<visible>VideoPlayer.IsStereoscopic</visible>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>36501</label>
<ondown>1000</ondown>
</control>
<control type="button" id="350">
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31356</label>
<onclick>ActivateWindow(Teletext)</onclick>
</control>
<control type="button" id="351">
- <posx>110</posx>
- <posy>0</posy>
+ <left>110</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>13395</label>
<onclick>ActivateWindow(OSDVideoSettings)</onclick>
</control>
<control type="button" id="352">
- <posx>165</posx>
- <posy>0</posy>
+ <left>165</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>13396</label>
<onclick>ActivateWindow(OSDAudioSettings)</onclick>
</control>
<control type="togglebutton" id="353">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>55</width>
<height>55</height>
<label>31351</label>
</control>
<control type="button" id="410">
<description>Fake button for mouse control</description>
- <posx>400r</posx>
- <posy>350r</posy>
+ <left>400r</left>
+ <top>350r</top>
<width>256</width>
<height>300</height>
<label>-</label>
<control type="grouplist" id="400">
<visible>![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks)]</visible>
<animation effect="fade" time="200">VisibleChange</animation>
- <posx>400r</posx>
- <posy>350r</posy>
+ <left>400r</left>
+ <top>350r</top>
<width>256</width>
<height>300</height>
<itemgap>0</itemgap>
<height>40</height>
<control type="image">
<description>Header</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>256</width>
<height>40</height>
<texture border="20,18,20,0">SubMenuBack-Header.png</texture>
</control>
<control type="label" id="">
- <posx>30</posx>
- <posy>20</posy>
+ <left>30</left>
+ <top>20</top>
<width>196</width>
<height>15</height>
<font>font12</font>
<!-- STEREOSCOPIC 3D !LiveTV -->
<control type="button" id="520">
<description>Fake button for mouse control</description>
- <posx>455r</posx>
- <posy>350r</posy>
+ <left>455r</left>
+ <top>350r</top>
<width>256</width>
<height>300</height>
<label>-</label>
<control type="grouplist" id="500">
<visible>VideoPlayer.IsStereoscopic + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks)]</visible>
<animation effect="fade" time="200">VisibleChange</animation>
- <posx>455r</posx>
- <posy>350r</posy>
+ <left>455r</left>
+ <top>350r</top>
<width>256</width>
<height>300</height>
<itemgap>0</itemgap>
<height>40</height>
<control type="image">
<description>Header</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>256</width>
<height>40</height>
<texture border="20,18,20,0">SubMenuBack-Header.png</texture>
</control>
<control type="label" id="">
- <posx>30</posx>
- <posy>20</posy>
+ <left>30</left>
+ <top>20</top>
<width>196</width>
<height>15</height>
<font>font12</font>
<!-- STEREOSCOPIC 3D LiveTV -->
<control type="button" id="570">
<description>Fake button for mouse control</description>
- <posx>340r</posx>
- <posy>350r</posy>
+ <left>340r</left>
+ <top>350r</top>
<width>256</width>
<height>300</height>
<label>-</label>
<control type="grouplist" id="550">
<visible>videoplayer.isstereoscopic + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)]</visible>
<animation effect="fade" time="200">VisibleChange</animation>
- <posx>340r</posx>
- <posy>350r</posy>
+ <left>340r</left>
+ <top>350r</top>
<width>256</width>
<height>300</height>
<itemgap>0</itemgap>
<height>40</height>
<control type="image">
<description>Header</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>256</width>
<height>40</height>
<texture border="20,18,20,0">SubMenuBack-Header.png</texture>
</control>
<control type="label" id="">
- <posx>30</posx>
- <posy>20</posy>
+ <left>30</left>
+ <top>20</top>
<width>196</width>
<height>15</height>
<font>font12</font>
<defaultcontrol always="true">2</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>60</posy>
+ <left>240</left>
+ <top>60</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>600</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>760</posx>
- <posy>495</posy>
+ <right>760</right>
+ <top>495</top>
<width>300</width>
<height>35</height>
<font>font12</font>
<label>([COLOR=blue]$INFO[Container(11).NumItems][/COLOR]) $LOCALIZE[31025] - $LOCALIZE[31024] ([COLOR=blue]$INFO[Container(11).CurrentPage]/$INFO[Container(11).NumPages][/COLOR])</label>
</control>
<control type="panel" id="11">
- <posx>40</posx>
- <posy>65</posy>
+ <left>40</left>
+ <top>65</top>
<width>720</width>
<height>430</height>
<onleft>2</onleft>
<orientation>vertical</orientation>
<itemlayout height="215" width="240">
<control type="image">
- <posx>2</posx>
- <posy>2</posy>
+ <left>2</left>
+ <top>2</top>
<width>235</width>
<height>211</height>
<texture border="3">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>7</posx>
- <posy>20</posy>
+ <left>7</left>
+ <top>20</top>
<width>220</width>
<height>150</height>
<aspectratio>scale</aspectratio>
<info>ListItem.Icon</info>
</control>
<control type="label">
- <posx>112</posx>
- <posy>185</posy>
+ <left>112</left>
+ <top>185</top>
<width>225</width>
<height>15</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="215" width="240">
<control type="image">
- <posx>2</posx>
- <posy>2</posy>
+ <left>2</left>
+ <top>2</top>
<width>235</width>
<height>211</height>
<texture border="3">folder-focus.png</texture>
</control>
<control type="image">
- <posx>7</posx>
- <posy>20</posy>
+ <left>7</left>
+ <top>20</top>
<width>220</width>
<height>150</height>
<aspectratio>scale</aspectratio>
<info>ListItem.Icon</info>
</control>
<control type="label">
- <posx>112</posx>
- <posy>185</posy>
+ <left>112</left>
+ <top>185</top>
<width>225</width>
<height>15</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="grouplist" id="9000">
- <posx>20</posx>
- <posy>535</posy>
+ <left>20</left>
+ <top>535</top>
<width>760</width>
<height>40</height>
<itemgap>5</itemgap>
<defaultcontrol>5</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>60</posy>
+ <left>240</left>
+ <top>60</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<animation effect="fade" start="100" end="0" time="400" condition="Window.IsVisible(SliderDialog) | Window.IsVisible(FileBrowser)">Conditional</animation>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>600</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="3">
<description>No Settings Label</description>
- <posx>20</posx>
- <posy>180</posy>
+ <left>20</left>
+ <top>180</top>
<width>760</width>
<align>center</align>
<label>13390</label>
</control>
<control type="grouplist" id="5">
<description>control area</description>
- <posx>40</posx>
- <posy>65</posy>
+ <left>40</left>
+ <top>65</top>
<width>720</width>
<height>490</height>
<itemgap>5</itemgap>
<ondown>5</ondown>
</control>
<control type="scrollbar" id="60">
- <posx>760</posx>
- <posy>65</posy>
+ <left>760</left>
+ <top>65</top>
<width>25</width>
<height>490</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="button" id="7">
<description>Default Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="radiobutton" id="8">
<description>Default RadioButton</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
</control>
<control type="spincontrolex" id="9">
<description>Default SpinControlex</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<height>40</height>
<font>font13</font>
<textcolor>grey2</textcolor>
<defaultcontrol>-</defaultcontrol>
<controls>
</controls>
-</window>
\ No newline at end of file
+</window>
<visible>Control.IsVisible(550)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="550">
- <posx>70</posx>
- <posy>78</posy>
+ <left>70</left>
+ <top>78</top>
<width>580</width>
<height>561</height>
<onleft>2</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>555</posx>
- <posy>0</posy>
+ <left>555</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>370</posx>
- <posy>5</posy>
+ <left>370</left>
+ <top>5</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(550) + !IsEmpty(ListItem.Property(Addon.Status))</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>555</posx>
- <posy>0</posy>
+ <left>555</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>650</posx>
- <posy>78</posy>
+ <left>650</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="10,14,10,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(550)</visible>
</control>
<control type="group">
- <posx>710</posx>
- <posy>80</posy>
+ <left>710</left>
+ <top>80</top>
<visible>Control.IsVisible(550)</visible>
<control type="label">
<description>Show Title txt</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>510</width>
<height>15</height>
<label>$INFO[ListItem.Property(Addon.Name)]</label>
<wrapmultiline>true</wrapmultiline>
</control>
<control type="image">
- <posx>10</posx>
- <posy>30</posy>
+ <left>10</left>
+ <top>30</top>
<width>490</width>
<height>240</height>
<aspectratio>keep</aspectratio>
<bordersize>8</bordersize>
</control>
<control type="group">
- <posy>280</posy>
+ <top>280</top>
<control type="label">
<description>Author txt</description>
- <posx>150</posx>
- <posy>0</posy>
+ <right>150</right>
+ <top>0</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[21863]:</label>
</control>
<control type="fadelabel">
<description>Author Value</description>
- <posx>160</posx>
- <posy>0</posy>
+ <left>160</left>
+ <top>0</top>
<width>350</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Creator)]</label>
</control>
<control type="label">
<description>Version txt</description>
- <posx>150</posx>
- <posy>30</posy>
+ <right>150</right>
+ <top>30</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[24051]</label>
</control>
<control type="label">
<description>Version Value</description>
- <posx>160</posx>
- <posy>30</posy>
+ <left>160</left>
+ <top>30</top>
<width>350</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Version)]</label>
</control>
<control type="label">
<description>Rating txt</description>
- <posx>150</posx>
- <posy>60</posy>
+ <right>150</right>
+ <top>60</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[563]:</label>
</control>
<control type="image">
<description>Rating value</description>
- <posx>155</posx>
- <posy>60</posy>
+ <left>155</left>
+ <top>60</top>
<width>160</width>
<height>32</height>
<aspectratio align="left">keep</aspectratio>
<texture fallback="LeftRating/rating0.png">$INFO[ListItem.Property(Addon.StarRating),LeftRating/]</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>90</posy>
+ <left>0</left>
+ <top>90</top>
<width>490</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="textbox">
<description>Description</description>
- <posx>10</posx>
- <posy>100</posy>
+ <left>10</left>
+ <top>100</top>
<width>490</width>
<height>180</height>
<font>font12</font>
<visible>Control.IsVisible(551)</visible>
<include>VisibleFadeEffect</include>
<control type="panel" id="551">
- <posx>70</posx>
- <posy>78</posy>
+ <left>70</left>
+ <top>78</top>
<width>772</width>
<height>558</height>
<onleft>2</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="186" width="193">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>191</width>
<height>160</height>
<bordertexture border="5">button-nofocus.png</bordertexture>
<texture background="true">$INFO[Listitem.Icon]</texture>
</control>
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>191</width>
<height>160</height>
<bordertexture border="5">button-nofocus.png</bordertexture>
<visible>!IsEmpty(ListItem.Property(Addon.broken))</visible>
</control>
<control type="label">
- <posx>96</posx>
- <posy>70</posy>
+ <left>96</left>
+ <top>70</top>
<width>190</width>
<height>25</height>
<font>font13_title</font>
<visible>!IsEmpty(ListItem.Property(Addon.broken))</visible>
</control>
<control type="label">
- <posx>96</posx>
- <posy>160</posy>
+ <left>96</left>
+ <top>160</top>
<width>190</width>
<height>25</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="186" width="193">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>191</width>
<height>160</height>
<bordertexture border="5">folder-focus.png</bordertexture>
<texture background="true">$INFO[Listitem.Icon]</texture>
</control>
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>191</width>
<height>160</height>
<bordertexture border="5">button-nofocus.png</bordertexture>
<visible>!IsEmpty(ListItem.Property(Addon.broken))</visible>
</control>
<control type="label">
- <posx>96</posx>
- <posy>70</posy>
+ <left>96</left>
+ <top>70</top>
<width>190</width>
<height>25</height>
<font>font13_title</font>
<visible>!IsEmpty(ListItem.Property(Addon.broken))</visible>
</control>
<control type="label">
- <posx>96</posx>
- <posy>160</posy>
+ <left>96</left>
+ <top>160</top>
<width>190</width>
<height>25</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>850</posx>
- <posy>78</posy>
+ <left>850</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="10,14,10,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(551)</visible>
</control>
<control type="group">
- <posx>910</posx>
- <posy>90</posy>
+ <left>910</left>
+ <top>90</top>
<visible>Control.IsVisible(551)</visible>
<control type="label">
<description>Show Title txt</description>
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>290</width>
<height>15</height>
<label>$INFO[ListItem.Property(Addon.Name)]</label>
<wrapmultiline>true</wrapmultiline>
</control>
<control type="group">
- <posy>40</posy>
+ <top>40</top>
<control type="label">
<description>Author txt</description>
- <posx>130</posx>
- <posy>0</posy>
+ <right>130</right>
+ <top>0</top>
<width>120</width>
<height>25</height>
<label>$LOCALIZE[21863]:</label>
</control>
<control type="fadelabel">
<description>Author Value</description>
- <posx>140</posx>
- <posy>0</posy>
+ <left>140</left>
+ <top>0</top>
<width>155</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Creator)]</label>
</control>
<control type="label">
<description>Version txt</description>
- <posx>130</posx>
- <posy>30</posy>
+ <right>130</right>
+ <top>30</top>
<width>120</width>
<height>25</height>
<label>$LOCALIZE[24051]</label>
</control>
<control type="label">
<description>Version Value</description>
- <posx>140</posx>
- <posy>30</posy>
+ <left>140</left>
+ <top>30</top>
<width>155</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Addon.Version)]</label>
</control>
<control type="label">
<description>Rating txt</description>
- <posx>130</posx>
- <posy>60</posy>
+ <right>130</right>
+ <top>60</top>
<width>120</width>
<height>25</height>
<label>$LOCALIZE[563]:</label>
</control>
<control type="image">
<description>Rating value</description>
- <posx>135</posx>
- <posy>60</posy>
+ <left>135</left>
+ <top>60</top>
<width>150</width>
<height>30</height>
<aspectratio align="left">keep</aspectratio>
<texture fallback="LeftRating/rating0.png">$INFO[ListItem.Property(Addon.StarRating),LeftRating/]</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>100</posy>
+ <left>0</left>
+ <top>100</top>
<width>290</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="textbox">
<description>Description</description>
- <posx>10</posx>
- <posy>110</posy>
+ <left>10</left>
+ <top>110</top>
<width>290</width>
<height>400</height>
<font>font12</font>
<visible>Control.IsVisible(50)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="50">
- <posx>70</posx>
- <posy>78</posy>
+ <left>70</left>
+ <top>78</top>
<width>690</width>
<height>561</height>
<onleft>2</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>660</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>680</posx>
- <posy>0</posy>
+ <left>680</left>
+ <top>0</top>
<width>400</width>
<height>40</height>
<font>font12</font>
<visible>!Window.IsVisible(Videos)</visible>
</control>
<control type="label">
- <posx>620</posx>
- <posy>0</posy>
+ <left>620</left>
+ <top>0</top>
<width>400</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>625</posx>
- <posy>8</posy>
+ <left>625</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>665</posx>
- <posy>14</posy>
+ <left>665</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>Window.IsVisible(Videos) + !ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>665</posx>
- <posy>14</posy>
+ <left>665</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</itemlayout>
<focusedlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>490</posx>
- <posy>4</posy>
+ <left>490</left>
+ <top>4</top>
<width>200</width>
<height>33</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(50) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>660</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>680</posx>
- <posy>0</posy>
+ <left>680</left>
+ <top>0</top>
<width>400</width>
<height>40</height>
<font>font12</font>
<visible>!Window.IsVisible(Videos)</visible>
</control>
<control type="label">
- <posx>620</posx>
- <posy>0</posy>
+ <left>620</left>
+ <top>0</top>
<width>400</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>625</posx>
- <posy>8</posy>
+ <left>625</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>665</posx>
- <posy>14</posy>
+ <left>665</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>Window.IsVisible(Videos) + !ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>665</posx>
- <posy>14</posy>
+ <left>665</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>760</posx>
- <posy>85</posy>
+ <left>760</left>
+ <top>85</top>
<width>25</width>
<height>550</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(50)</visible>
</control>
<control type="group">
- <posx>850</posx>
- <posy>100</posy>
+ <left>850</left>
+ <top>100</top>
<visible>Control.IsVisible(50)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>360</width>
<height>540</height>
<aspectratio aligny="bottom">keep</aspectratio>
<bordersize>8</bordersize>
</control>
<control type="image">
- <posx>8</posx>
- <posy>532</posy>
+ <left>8</left>
+ <top>532</top>
<width>344</width>
<height>524</height>
<aspectratio aligny="top">keep</aspectratio>
<visible>Control.IsVisible(500)</visible>
<include>VisibleFadeEffect</include>
<control type="panel" id="500">
- <posx>90</posx>
- <posy>80</posy>
+ <left>90</left>
+ <top>80</top>
<width>1080</width>
<height>558</height>
<onleft>2</onleft>
<preloaditems>2</preloaditems>
<itemlayout condition="!Container.Content(Movies) + !Container.Content(Seasons) + !Container.Content(TVShows) + !Container.Content(Sets)" height="186" width="216">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>214</width>
<height>160</height>
<bordertexture border="5">button-nofocus.png</bordertexture>
<visible>!Container.Content(Episodes)</visible>
</control>
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>214</width>
<height>160</height>
<aspectratio>scale</aspectratio>
<visible>Container.Content(Episodes)</visible>
</control>
<control type="label">
- <posx>108</posx>
- <posy>160</posy>
+ <left>108</left>
+ <top>160</top>
<width>200</width>
<height>25</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>170</posx>
- <posy>130</posy>
+ <left>170</left>
+ <top>130</top>
<width>30</width>
<height>30</height>
<aspectratio>keep</aspectratio>
</itemlayout>
<focusedlayout condition="!Container.Content(Movies) + !Container.Content(Seasons) + !Container.Content(TVShows) + !Container.Content(Sets)" height="186" width="216">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>214</width>
<height>160</height>
<bordertexture border="5">folder-focus.png</bordertexture>
<visible>!Container.Content(Episodes)</visible>
</control>
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>214</width>
<height>160</height>
<aspectratio>scale</aspectratio>
<visible>Container.Content(Episodes)</visible>
</control>
<control type="label">
- <posx>108</posx>
- <posy>160</posy>
+ <left>108</left>
+ <top>160</top>
<width>200</width>
<height>25</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>180</posx>
- <posy>130</posy>
+ <left>180</left>
+ <top>130</top>
<width>30</width>
<height>30</height>
<aspectratio>keep</aspectratio>
</focusedlayout>
<itemlayout condition="Container.Content(Movies) | Container.Content(Seasons) | Container.Content(TVShows) | Container.Content(Sets)" height="279" width="216">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>214</width>
<height>240</height>
<bordertexture border="5">button-nofocus.png</bordertexture>
<texture background="true">$VAR[PosterThumb]</texture>
</control>
<control type="label">
- <posx>108</posx>
- <posy>240</posy>
+ <left>108</left>
+ <top>240</top>
<width>200</width>
<height>25</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>170</posx>
- <posy>210</posy>
+ <left>170</left>
+ <top>210</top>
<width>30</width>
<height>30</height>
<aspectratio>keep</aspectratio>
</itemlayout>
<focusedlayout condition="Container.Content(Movies) | Container.Content(Seasons) | Container.Content(TVShows) | Container.Content(Sets)" height="276" width="216">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>214</width>
<height>240</height>
<bordertexture border="5">folder-focus.png</bordertexture>
<texture background="true">$VAR[PosterThumb]</texture>
</control>
<control type="label">
- <posx>108</posx>
- <posy>240</posy>
+ <left>108</left>
+ <top>240</top>
<width>200</width>
<height>25</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>170</posx>
- <posy>210</posy>
+ <left>170</left>
+ <top>210</top>
<width>30</width>
<height>30</height>
<aspectratio>keep</aspectratio>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>1170</posx>
- <posy>80</posy>
+ <left>1170</left>
+ <top>80</top>
<width>25</width>
<height>550</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<include>VisibleFadeEffect</include>
<control type="panel" id="505">
<visible>Container.Content(TVShows) | Container.Content(Files)</visible>
- <posx>95</posx>
- <posy>80</posy>
+ <left>95</left>
+ <top>80</top>
<width>1080</width>
<height>550</height>
<onleft>2</onleft>
<preloaditems>2</preloaditems>
<itemlayout height="110" width="540">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>538</width>
<height>105</height>
<bordertexture border="5">button-nofocus.png</bordertexture>
<texture background="true">$VAR[BannerThumb]</texture>
</control>
<control type="image">
- <posx>500</posx>
- <posy>70</posy>
+ <left>500</left>
+ <top>70</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</itemlayout>
<focusedlayout height="110" width="540">
<control type="image">
- <posx>1</posx>
- <posy>0</posy>
+ <left>1</left>
+ <top>0</top>
<width>538</width>
<height>105</height>
<bordertexture border="5">folder-focus.png</bordertexture>
<texture background="true">$VAR[BannerThumb]</texture>
</control>
<control type="image">
- <posx>500</posx>
- <posy>70</posy>
+ <left>500</left>
+ <top>70</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>1170</posx>
- <posy>80</posy>
+ <left>1170</left>
+ <top>80</top>
<width>25</width>
<height>550</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(51)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="51">
- <posx>95</posx>
- <posy>78</posy>
+ <left>95</left>
+ <top>78</top>
<width>1080</width>
<height>561</height>
<onleft>2</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="40" width="1080">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1080</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>4</posy>
+ <left>10</left>
+ <top>4</top>
<width>40</width>
<height>32</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>60</posx>
- <posy>0</posy>
+ <left>60</left>
+ <top>0</top>
<width>950</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>1060</posx>
- <posy>0</posy>
+ <left>1060</left>
+ <top>0</top>
<width>1000</width>
<height>40</height>
<font>font12</font>
<visible>!Window.IsVisible(Videos)</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>940</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>1010</posx>
- <posy>8</posy>
+ <left>1010</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>1050</posx>
- <posy>14</posy>
+ <left>1050</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>Window.IsVisible(Videos) + !ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>1050</posx>
- <posy>14</posy>
+ <left>1050</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</itemlayout>
<focusedlayout height="40" width="1080">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1080</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1080</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>875</posx>
- <posy>4</posy>
+ <left>875</left>
+ <top>4</top>
<width>200</width>
<height>33</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(51) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="image">
- <posx>10</posx>
- <posy>4</posy>
+ <left>10</left>
+ <top>4</top>
<width>40</width>
<height>32</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>60</posx>
- <posy>0</posy>
+ <left>60</left>
+ <top>0</top>
<width>950</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>1060</posx>
- <posy>0</posy>
+ <left>1060</left>
+ <top>0</top>
<width>1000</width>
<height>40</height>
<font>font12</font>
<visible>!Window.IsVisible(Videos)</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>940</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>1010</posx>
- <posy>8</posy>
+ <left>1010</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>1050</posx>
- <posy>14</posy>
+ <left>1050</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>Window.IsVisible(Videos) + !ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>1050</posx>
- <posy>14</posy>
+ <left>1050</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>1170</posx>
- <posy>80</posy>
+ <left>1170</left>
+ <top>80</top>
<width>25</width>
<height>550</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(560)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="560">
- <posx>70</posx>
- <posy>75</posy>
+ <left>70</left>
+ <top>75</top>
<width>760</width>
<height>561</height>
<onleft>2</onleft>
<visible>Container.Content(LiveTV)</visible>
<itemlayout height="40" width="760">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>730</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>750</posx>
- <posy>0</posy>
+ <left>750</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="40" width="760">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>560</posx>
- <posy>5</posy>
+ <left>560</left>
+ <top>5</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(560) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>730</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>750</posx>
- <posy>0</posy>
+ <left>750</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>850</posx>
- <posy>78</posy>
+ <left>850</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="group">
<visible>Control.IsVisible(560)</visible>
- <posx>910</posx>
- <posy>80</posy>
+ <left>910</left>
+ <top>80</top>
<control type="image">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>290</width>
<height>290</height>
<aspectratio aligny="bottom">keep</aspectratio>
<bordersize>8</bordersize>
</control>
<control type="fadelabel">
- <posx>10</posx>
- <posy>300</posy>
+ <left>10</left>
+ <top>300</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="textbox">
<description>Description Value for TV Show</description>
- <posx>10</posx>
- <posy>330</posy>
+ <left>10</left>
+ <top>330</top>
<width>290</width>
<height>220</height>
<font>font12</font>
<visible>Control.IsVisible(506)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="506">
- <posx>70</posx>
- <posy>75</posy>
+ <left>70</left>
+ <top>75</top>
<width>780</width>
<height>561</height>
<onleft>2</onleft>
<visible>Window.IsVisible(MusicFiles) | Window.IsVisible(MusicPlaylist) | Container.Content(Songs) | Container.Content(Albums)</visible>
<itemlayout height="40" width="780">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>780</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>730</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>760</posx>
- <posy>0</posy>
+ <left>760</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="40" width="760">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>780</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>580</posx>
- <posy>5</posy>
+ <left>580</left>
+ <top>5</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(506) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>730</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>760</posx>
- <posy>0</posy>
+ <left>760</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>850</posx>
- <posy>78</posy>
+ <left>850</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="group">
<visible>Control.IsVisible(506)</visible>
- <posx>910</posx>
- <posy>80</posy>
+ <left>910</left>
+ <top>80</top>
<control type="image">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>290</width>
<height>290</height>
<aspectratio aligny="bottom">keep</aspectratio>
<bordersize>8</bordersize>
</control>
<control type="label">
- <posx>10</posx>
- <posy>300</posy>
+ <left>10</left>
+ <top>300</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Artist]</label>
<shadowcolor>black</shadowcolor>
</control>
<control type="label">
- <posx>10</posx>
- <posy>360</posy>
+ <left>10</left>
+ <top>360</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Album]</label>
<shadowcolor>black</shadowcolor>
</control>
<control type="label">
- <posx>10</posx>
- <posy>420</posy>
+ <left>10</left>
+ <top>420</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Title]</label>
<visible>!Container.Content(Albums)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>420</posy>
+ <left>10</left>
+ <top>420</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Genre]</label>
</control>
<control type="label">
<description>Trackno txt</description>
- <posx>10</posx>
- <posy>480</posy>
+ <left>10</left>
+ <top>480</top>
<width>290</width>
<height>25</height>
<label>$INFO[listitem.TrackNumber,[COLOR=blue]$LOCALIZE[31310]: [/COLOR]]</label>
</control>
<control type="label">
<description>Year txt</description>
- <posx>10</posx>
- <posy>505</posy>
+ <left>10</left>
+ <top>505</top>
<width>290</width>
<height>25</height>
<label>$INFO[listitem.Year,[COLOR=blue]$LOCALIZE[345]: [/COLOR]]</label>
</control>
<control type="image">
<description>Rating value</description>
- <posx>80</posx>
- <posy>535</posy>
+ <left>80</left>
+ <top>535</top>
<width>150</width>
<height>30</height>
<aspectratio>keep</aspectratio>
</include>
<include name="AlbumWrapView2_Fanart">
<control type="group">
- <posx>0</posx>
- <posy>350</posy>
+ <left>0</left>
+ <top>350</top>
<visible>Control.IsVisible(509) + Skin.HasSetting(View509HideInfo)</visible>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>270</height>
<texture border="1">HomeNowPlayingBack.png</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>70</posy>
+ <left>40</left>
+ <top>70</top>
<width>1200</width>
<height>20</height>
<font>font24_title</font>
<control type="group">
<visible>Control.IsVisible(509)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>450</posy>
+ <left>0</left>
+ <top>450</top>
<control type="fixedlist" id="509">
<visible>Container.Content(Albums)</visible>
- <hitrect x="0" y="-10" w="1280" h="190" />
- <posx>-80</posx>
- <posy>0</posy>
+ <hitrect x="0" y="-10" w="1280" h="190"/>
+ <left>-80</left>
+ <top>0</top>
<width>1360</width>
<height>250</height>
<onleft>509</onleft>
<preloaditems>4</preloaditems>
<itemlayout height="200" width="160">
<control type="image">
- <posx>2</posx>
- <posy>20</posy>
+ <left>2</left>
+ <top>20</top>
<width>160</width>
<height>160</height>
<aspectratio>stretch</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>6</posx>
- <posy>24</posy>
+ <left>6</left>
+ <top>24</top>
<width>152</width>
<height>152</height>
<aspectratio>stretch</aspectratio>
<colordiffuse>AAFFFFFF</colordiffuse>
</control>
<control type="image">
- <posx>2</posx>
- <posy>180</posy>
+ <left>2</left>
+ <top>180</top>
<width>160</width>
<height>160</height>
<aspectratio>stretch</aspectratio>
</itemlayout>
<focusedlayout height="200" width="160">
<control type="image">
- <posx>-2</posx>
- <posy>16</posy>
+ <left>-2</left>
+ <top>16</top>
<width>168</width>
<height>168</height>
<aspectratio>stretch</aspectratio>
<animation reversible="false" effect="zoom" end="-2,16,168,168" start="-12,-4,198,198" time="200">unfocus</animation>
</control>
<control type="image">
- <posx>180</posx>
- <posy>325</posy>
+ <left>180</left>
+ <top>325</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.Overlay]</texture>
<animation type="focus">
- <effect type="fade" start="0" end="100" time="200" />
- <effect type="slide" start="0,0" end="40,40" time="200" />
+ <effect type="fade" start="0" end="100" time="200"/>
+ <effect type="slide" start="0,0" end="40,40" time="200"/>
</animation>
<animation type="unfocus">
- <effect type="fade" start="100" end="0" time="200" />
- <effect type="slide" end="0,0" start="40,40" time="200" />
+ <effect type="fade" start="100" end="0" time="200"/>
+ <effect type="slide" end="0,0" start="40,40" time="200"/>
</animation>
</control>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>310</posx>
- <posy>195</posy>
+ <left>310</left>
+ <top>195</top>
<width>660</width>
<height>25</height>
<texturesliderbackground border="14,0,14,0">ScrollBarH.png</texturesliderbackground>
</control>
</control>
<control type="group">
- <posx>180</posx>
- <posy>40</posy>
+ <left>180</left>
+ <top>40</top>
<visible>Control.IsVisible(509) + !Skin.HasSetting(View509HideInfo)</visible>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>920</width>
<height>410</height>
<texture border="20">ContentPanel.png</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>840</width>
<height>20</height>
<font>font13</font>
<label>$INFO[ListItem.Property(Album_Artist)]</label>
</control>
<control type="label">
- <posx>40</posx>
- <posy>50</posy>
+ <left>40</left>
+ <top>50</top>
<width>840</width>
<height>20</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="group">
- <posx>40</posx>
- <posy>80</posy>
+ <left>40</left>
+ <top>80</top>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<label>31331</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>35</posy>
+ <left>0</left>
+ <top>35</top>
<width>850</width>
<height>30</height>
<font>font13</font>
<label>$LOCALIZE[515]: $INFO[ListItem.Genre]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>65</posy>
+ <left>0</left>
+ <top>65</top>
<width>850</width>
<height>30</height>
<font>font13</font>
<label>$LOCALIZE[562]: $INFO[ListItem.Year]</label>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>95</posy>
+ <left>0</left>
+ <top>95</top>
<width>400</width>
<height>30</height>
<font>font13</font>
</control>
<control type="image">
<description>Rating value</description>
- <posx>100</posx>
- <posy>95</posy>
+ <left>100</left>
+ <top>95</top>
<width>160</width>
<height>32</height>
<aspectratio>keep</aspectratio>
</control>
<control type="textbox">
<description>Description Value for Album</description>
- <posx>0</posx>
- <posy>150</posy>
+ <left>0</left>
+ <top>150</top>
<width>850</width>
<height>140</height>
<font>font12</font>
<visible>Control.IsVisible(511)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="511">
- <posx>70</posx>
- <posy>75</posy>
+ <left>70</left>
+ <top>75</top>
<width>760</width>
<height>561</height>
<onleft>2</onleft>
<visible>Container.Content(MusicVideos)</visible>
<itemlayout height="40" width="760">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>730</posx>
- <posy>0</posy>
+ <left>730</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="image">
- <posx>735</posx>
- <posy>14</posy>
+ <left>735</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
</itemlayout>
<focusedlayout height="40" width="760">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>560</posx>
- <posy>5</posy>
+ <left>560</left>
+ <top>5</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(511) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>730</posx>
- <posy>0</posy>
+ <left>730</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="image">
- <posx>735</posx>
- <posy>14</posy>
+ <left>735</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>850</posx>
- <posy>78</posy>
+ <left>850</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(511)</visible>
</control>
<control type="group">
- <posx>910</posx>
- <posy>80</posy>
+ <left>910</left>
+ <top>80</top>
<control type="image">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>290</width>
<height>230</height>
<aspectratio>keep</aspectratio>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>10</posx>
- <posy>230</posy>
+ <left>10</left>
+ <top>230</top>
<width>290</width>
<align>center</align>
<itemgap>0</itemgap>
<include>AudioCodecFlaggingConditions</include>
</control>
<control type="label">
- <posx>10</posx>
- <posy>290</posy>
+ <left>10</left>
+ <top>290</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Artist]</label>
<shadowcolor>black</shadowcolor>
</control>
<control type="label">
- <posx>10</posx>
- <posy>350</posy>
+ <left>10</left>
+ <top>350</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Album]</label>
<shadowcolor>black</shadowcolor>
</control>
<control type="label">
- <posx>10</posx>
- <posy>410</posy>
+ <left>10</left>
+ <top>410</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Title]</label>
<visible>!Container.Content(Albums)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>470</posy>
+ <left>10</left>
+ <top>470</top>
<width>290</width>
<height>25</height>
<label>$INFO[ListItem.Studio]</label>
</control>
<control type="label">
<description>Year txt</description>
- <posx>10</posx>
- <posy>530</posy>
+ <left>10</left>
+ <top>530</top>
<width>290</width>
<height>25</height>
<label>$INFO[listitem.Year,[COLOR=blue]$LOCALIZE[345]: [/COLOR]]</label>
<visible>Control.IsVisible(512)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="512">
- <posx>70</posx>
- <posy>78</posy>
+ <left>70</left>
+ <top>78</top>
<width>580</width>
<height>561</height>
<onleft>2</onleft>
<visible>Container.Content(Artists)</visible>
<itemlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>560</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>560</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>650</posx>
- <posy>78</posy>
+ <left>650</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(512)</visible>
</control>
<control type="group">
- <posx>710</posx>
- <posy>70</posy>
+ <left>710</left>
+ <top>70</top>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>510</width>
<height>300</height>
<aspectratio>keep</aspectratio>
<bordersize>8</bordersize>
</control>
<control type="group">
- <posy>310</posy>
+ <top>310</top>
<control type="label">
<description>Born txt</description>
- <posx>140</posx>
- <posy>0</posy>
+ <right>140</right>
+ <top>0</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[21893]:</label>
</control>
<control type="label">
<description>Born Value</description>
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>350</width>
<height>25</height>
<label>$INFO[ListItem.Property(Artist_Born)]</label>
</control>
<control type="label">
<description>Formed txt</description>
- <posx>140</posx>
- <posy>0</posy>
+ <right>140</right>
+ <top>0</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[21894]:</label>
</control>
<control type="label">
<description>Formed Value</description>
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>350</width>
<height>25</height>
<label>$INFO[ListItem.Property(Artist_Formed)]</label>
</control>
<control type="label">
<description>Genre txt</description>
- <posx>140</posx>
- <posy>30</posy>
+ <right>140</right>
+ <top>30</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[515]:</label>
</control>
<control type="label">
<description>Genre Value</description>
- <posx>150</posx>
- <posy>30</posy>
+ <left>150</left>
+ <top>30</top>
<width>350</width>
<height>25</height>
<label fallback="416">$INFO[ListItem.Property(Artist_Genre)]</label>
<scroll>true</scroll>
</control>
<control type="image">
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<width>510</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="textbox">
<description>Description Value for Artist</description>
- <posx>10</posx>
- <posy>65</posy>
+ <left>10</left>
+ <top>65</top>
<width>490</width>
<height>190</height>
<font>font12</font>
<visible>Control.IsVisible(513)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="513">
- <posx>70</posx>
- <posy>75</posy>
+ <left>70</left>
+ <top>75</top>
<width>780</width>
<height>561</height>
<onleft>2</onleft>
<visible>Container.Content(Albums)</visible>
<itemlayout height="40" width="780">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>780</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>730</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>760</posx>
- <posy>0</posy>
+ <left>760</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="40" width="780">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>780</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>780</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>580</posx>
- <posy>5</posy>
+ <left>580</left>
+ <top>5</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(513) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>730</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>760</posx>
- <posy>0</posy>
+ <left>760</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="51360">
- <posx>850</posx>
- <posy>78</posy>
+ <left>850</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(513)</visible>
</control>
<control type="group">
- <posx>910</posx>
- <posy>70</posy>
+ <left>910</left>
+ <top>70</top>
<control type="image">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>290</width>
<height>240</height>
<aspectratio aligny="bottom">keep</aspectratio>
</control>
<control type="label">
<description>Description Header txt</description>
- <posx>10</posx>
- <posy>240</posy>
+ <left>10</left>
+ <top>240</top>
<width>290</width>
<height>25</height>
<label>21821</label>
</control>
<control type="textbox">
<description>Description Value for Album</description>
- <posx>10</posx>
- <posy>270</posy>
+ <left>10</left>
+ <top>270</top>
<width>290</width>
<height>300</height>
<font>font12</font>
<visible>Control.IsVisible(11)</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>530</posx>
- <posy>490</posy>
+ <left>530</left>
+ <top>490</top>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>20</height>
<font>font13</font>
<label>[B]$INFO[Container(11).ListItem.Title][/B]</label>
</control>
<control type="label">
- <posx>80</posx>
- <posy>22</posy>
+ <right>80</right>
+ <top>22</top>
<width>80</width>
<height>20</height>
<align>right</align>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>85</posx>
- <posy>30</posy>
+ <left>85</left>
+ <top>30</top>
<width>510</width>
<height>8</height>
<visible>Container(11).ListItem.HasEpg</visible>
<info>Container(11).ListItem.Progress</info>
</control>
<control type="label">
- <posx>600</posx>
- <posy>22</posy>
+ <left>600</left>
+ <top>22</top>
<width>80</width>
<height>20</height>
<align>left</align>
</control>
<control type="textbox">
<description>Plot Value for TVShow</description>
- <posx>0</posx>
- <posy>43</posy>
+ <left>0</left>
+ <top>43</top>
<width>690</width>
<height>80</height>
<font>font12</font>
<autoscroll time="2000" delay="3000" repeat="5000">true</autoscroll>
</control>
<control type="label">
- <posx>690</posx>
- <posy>140</posy>
+ <right>690</right>
+ <top>140</top>
<width>690</width>
<height>20</height>
<font>font12</font>
</control>
</control>
<control type="list" id="11">
- <posx>70</posx>
- <posy>85</posy>
+ <left>70</left>
+ <top>85</top>
<width>390</width>
<height>541</height>
<onleft>32</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="60" width="390">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>390</width>
<height>61</height>
<texture border="2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>-4</posy>
+ <left>5</left>
+ <top>-4</top>
<width>40</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>270</width>
<height>25</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>330</width>
<height>20</height>
<font>font12</font>
<visible>IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>280</width>
<height>20</height>
<font>font12</font>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>50</posx>
- <posy>48</posy>
+ <left>50</left>
+ <top>48</top>
<width>280</width>
<height>6</height>
<colordiffuse>88FFFFFF</colordiffuse>
<info>ListItem.Progress</info>
</control>
<control type="image">
- <posx>340</posx>
- <posy>4</posy>
+ <left>340</left>
+ <top>4</top>
<width>50</width>
<height>50</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>37</posy>
+ <left>5</left>
+ <top>37</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
</itemlayout>
<focusedlayout height="60" width="390">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>390</width>
<height>61</height>
<texture border="2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>390</width>
<height>61</height>
<texture border="2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>-4</posy>
+ <left>5</left>
+ <top>-4</top>
<width>40</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>270</width>
<height>25</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>330</width>
<height>20</height>
<font>font12</font>
<visible>IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>280</width>
<height>20</height>
<font>font12</font>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>50</posx>
- <posy>48</posy>
+ <left>50</left>
+ <top>48</top>
<width>280</width>
<height>6</height>
<colordiffuse>88FFFFFF</colordiffuse>
<info>ListItem.Progress</info>
</control>
<control type="image">
- <posx>340</posx>
- <posy>4</posy>
+ <left>340</left>
+ <top>4</top>
<width>50</width>
<height>50</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>37</posy>
+ <left>5</left>
+ <top>37</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="70">
- <posx>465</posx>
- <posy>85</posy>
+ <left>465</left>
+ <top>85</top>
<width>25</width>
<height>540</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
<visible>Control.IsVisible(12)</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>530</posx>
- <posy>490</posy>
+ <left>530</left>
+ <top>490</top>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>690</width>
<height>20</height>
<font>font13</font>
<label>[B]$INFO[Container(12).ListItem.Title][/B]</label>
</control>
<control type="label">
- <posx>80</posx>
- <posy>22</posy>
+ <right>80</right>
+ <top>22</top>
<width>80</width>
<height>20</height>
<align>right</align>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>85</posx>
- <posy>30</posy>
+ <left>85</left>
+ <top>30</top>
<width>510</width>
<height>8</height>
<visible>Container(12).ListItem.HasEpg</visible>
<info>Container(12).ListItem.Progress</info>
</control>
<control type="label">
- <posx>600</posx>
- <posy>22</posy>
+ <left>600</left>
+ <top>22</top>
<width>80</width>
<height>20</height>
<align>left</align>
</control>
<control type="textbox">
<description>Plot Value for TVShow</description>
- <posx>0</posx>
- <posy>43</posy>
+ <left>0</left>
+ <top>43</top>
<width>690</width>
<height>80</height>
<font>font12</font>
<autoscroll time="2000" delay="3000" repeat="5000">true</autoscroll>
</control>
<control type="label">
- <posx>690</posx>
- <posy>140</posy>
+ <right>690</right>
+ <top>140</top>
<width>690</width>
<height>20</height>
<font>font12</font>
</control>
</control>
<control type="list" id="12">
- <posx>70</posx>
- <posy>85</posy>
+ <left>70</left>
+ <top>85</top>
<width>390</width>
<height>541</height>
<onleft>33</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="60" width="390">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>390</width>
<height>61</height>
<texture border="2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>-4</posy>
+ <left>5</left>
+ <top>-4</top>
<width>40</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>270</width>
<height>25</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>330</width>
<height>20</height>
<font>font12</font>
<visible>IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>280</width>
<height>20</height>
<font>font12</font>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>50</posx>
- <posy>48</posy>
+ <left>50</left>
+ <top>48</top>
<width>280</width>
<height>6</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>ListItem.HasEpg</visible>
</control>
<control type="image">
- <posx>340</posx>
- <posy>4</posy>
+ <left>340</left>
+ <top>4</top>
<width>50</width>
<height>50</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>37</posy>
+ <left>5</left>
+ <top>37</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
</itemlayout>
<focusedlayout height="60" width="390">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>390</width>
<height>61</height>
<texture border="2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>390</width>
<height>61</height>
<texture border="2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>5</posx>
- <posy>-4</posy>
+ <left>5</left>
+ <top>-4</top>
<width>40</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>270</width>
<height>25</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>330</width>
<height>20</height>
<font>font12</font>
<visible>IsEmpty(Listitem.Icon)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>25</posy>
+ <left>50</left>
+ <top>25</top>
<width>280</width>
<height>20</height>
<font>font12</font>
</control>
<control type="progress">
<description>Progressbar</description>
- <posx>50</posx>
- <posy>48</posy>
+ <left>50</left>
+ <top>48</top>
<width>280</width>
<height>6</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>ListItem.HasEpg</visible>
</control>
<control type="image">
- <posx>340</posx>
- <posy>4</posy>
+ <left>340</left>
+ <top>4</top>
<width>50</width>
<height>50</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>37</posy>
+ <left>5</left>
+ <top>37</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="71">
- <posx>465</posx>
- <posy>85</posy>
+ <left>465</left>
+ <top>85</top>
<width>25</width>
<height>540</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
<visible>Control.IsVisible(13)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="13">
- <posx>70</posx>
- <posy>75</posy>
+ <left>70</left>
+ <top>75</top>
<width>760</width>
<height>561</height>
<onleft>34</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="40" width="760">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>10</posx>
- <posy>5</posy>
+ <left>10</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<texture background="true" fallback="DefaultVideoCover.png">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>605</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>725</posx>
- <posy>0</posy>
+ <left>725</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<label>$INFO[ListItem.Date]</label>
</control>
<control type="image">
- <posx>730</posx>
- <posy>14</posy>
+ <left>730</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>730</posx>
- <posy>14</posy>
+ <left>730</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</itemlayout>
<focusedlayout height="40" width="760">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>760</width>
<height>41</height>
<texture border="2">MenuItemNF.png</texture>
<visible>!Control.HasFocus(13)</visible>
</control>
<control type="image">
- <posx>560</posx>
- <posy>5</posy>
+ <left>560</left>
+ <top>5</top>
<width>200</width>
<height>31</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(13) + !IsEmpty(ListItem.Date)</visible>
</control>
<control type="image">
- <posx>10</posx>
- <posy>5</posy>
+ <left>10</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<texture background="true" fallback="DefaultVideoCover.png">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>630</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>725</posx>
- <posy>0</posy>
+ <left>725</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<label>$INFO[ListItem.Date]</label>
</control>
<control type="image">
- <posx>730</posx>
- <posy>14</posy>
+ <left>730</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>730</posx>
- <posy>14</posy>
+ <left>730</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="72">
- <posx>850</posx>
- <posy>78</posy>
+ <left>850</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
<include>Window_OpenClose_Animation</include>
</control>
<control type="group">
- <posx>910</posx>
- <posy>80</posy>
+ <left>910</left>
+ <top>80</top>
<control type="image">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>290</width>
<height>230</height>
<aspectratio aligny="bottom">keep</aspectratio>
<bordersize>8</bordersize>
</control>
<control type="fadelabel">
- <posx>10</posx>
- <posy>230</posy>
+ <left>10</left>
+ <top>230</top>
<width>290</width>
<height>25</height>
<label>$INFO[Container(13).ListItem.Title]</label>
</control>
<control type="textbox">
<description>Description Value for TV Show</description>
- <posx>10</posx>
- <posy>270</posy>
+ <left>10</left>
+ <top>270</top>
<width>290</width>
<height>280</height>
<font>font12</font>
<include>VisibleFadeEffect</include>
<control type="epggrid" id="10">
<description>EPG Grid</description>
- <posx>80</posx>
- <posy>81</posy>
+ <left>80</left>
+ <top>81</top>
<width>1120</width>
<height>555</height>
<pagecontrol>10</pagecontrol>
<control type="image" id="1">
<width>40</width>
<height>29</height>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label" id="2">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>34</width>
<height>29</height>
<font>font12</font>
<channellayout height="52" width="280">
<animation effect="fade" start="110" time="200">UnFocus</animation>
<control type="image" id="1">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>270</width>
<height>52</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>40</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="image">
- <posx>45</posx>
- <posy>4</posy>
+ <left>45</left>
+ <top>4</top>
<width>45</width>
<height>44</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label" id="1">
- <posx>94</posx>
- <posy>0</posy>
+ <left>94</left>
+ <top>0</top>
<width>160</width>
<height>52</height>
<font>special12</font>
<focusedchannellayout height="52" width="280">
<animation effect="fade" start="110" time="200">OnFocus</animation>
<control type="image" id="1">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>270</width>
<height>52</height>
<texture border="5">button-focus.png</texture>
</control>
<control type="label">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>40</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelNumber</info>
</control>
<control type="image">
- <posx>45</posx>
- <posy>4</posy>
+ <left>45</left>
+ <top>4</top>
<width>45</width>
<height>44</height>
<texture>$INFO[ListItem.Icon]</texture>
</control>
<control type="label" id="1">
- <posx>94</posx>
- <posy>0</posy>
+ <left>94</left>
+ <top>0</top>
<width>160</width>
<height>52</height>
<font>special12</font>
<control type="image" id="2">
<width>40</width>
<height>52</height>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<aspectratio>stretch</aspectratio>
<texture border="3">epg-genres/$INFO[ListItem.Property(GenreType)].png</texture>
</control>
<control type="label" id="1">
- <posx>6</posx>
- <posy>3</posy>
+ <left>6</left>
+ <top>3</top>
<width>30</width>
<height>25</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>5</posx>
- <posy>28</posy>
+ <left>5</left>
+ <top>28</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>5</posx>
- <posy>28</posy>
+ <left>5</left>
+ <top>28</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<control type="image" id="14">
<width>40</width>
<height>52</height>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<texture border="5">folder-focus.png</texture>
</control>
<control type="image" id="2">
<width>40</width>
<height>52</height>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<aspectratio>stretch</aspectratio>
<texture border="3">epg-genres/$INFO[ListItem.Property(GenreType)].png</texture>
</control>
<control type="label" id="1">
- <posx>6</posx>
- <posy>3</posy>
+ <left>6</left>
+ <top>3</top>
<width>30</width>
<height>25</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>5</posx>
- <posy>28</posy>
+ <left>5</left>
+ <top>28</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>5</posx>
- <posy>28</posy>
+ <left>5</left>
+ <top>28</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>Control.IsVisible(14)</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>80</posx>
- <posy>60</posy>
+ <left>80</left>
+ <top>60</top>
<control type="label">
<description>Channel header label</description>
- <posx>0</posx>
- <posy>20</posy>
+ <left>0</left>
+ <top>20</top>
<width>220</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Title header label</description>
- <posx>220</posx>
- <posy>20</posy>
+ <left>220</left>
+ <top>20</top>
<width>300</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Schedule Time header label</description>
- <posx>580</posx>
- <posy>20</posy>
+ <left>580</left>
+ <top>20</top>
<width>300</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Status header label</description>
- <posx>940</posx>
- <posy>20</posy>
+ <left>940</left>
+ <top>20</top>
<width>150</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="image">
<description>separator image</description>
- <posx>0</posx>
- <posy>50</posy>
+ <left>0</left>
+ <top>50</top>
<width>1100</width>
<height>1</height>
<colordiffuse>88FFFFFF</colordiffuse>
<texture>separator2.png</texture>
</control>
<control type="list" id="14">
- <posx>0</posx>
- <posy>55</posy>
+ <left>0</left>
+ <top>55</top>
<width>1100</width>
<height>480</height>
<onup>14</onup>
<scrolltime>200</scrolltime>
<itemlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>300</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="image">
- <posx>940</posx>
- <posy>0</posy>
+ <left>940</left>
+ <top>0</top>
<width>155</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>8</posy>
+ <left>0</left>
+ <top>8</top>
<width>50</width>
<height>26</height>
<visible>!IsEmpty(ListItem.Date)</visible>
<texture border="1">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>150</width>
<height>40</height>
<font>font12</font>
<info>ListItem.ChannelName</info>
</control>
<control type="label">
- <posx>370</posx>
- <posy>0</posy>
+ <left>370</left>
+ <top>0</top>
<width>290</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>730</posx>
- <posy>0</posy>
+ <left>730</left>
+ <top>0</top>
<width>400</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Date</info>
</control>
<control type="label">
- <posx>1018</posx>
- <posy>0</posy>
+ <left>1018</left>
+ <top>0</top>
<width>170</width>
<height>40</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>300</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<visible>!Control.HasFocus(14)</visible>
</control>
<control type="image">
- <posx>940</posx>
- <posy>0</posy>
+ <left>940</left>
+ <top>0</top>
<width>155</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<visible>!Control.HasFocus(14)</visible>
</control>
<control type="image">
- <posx>220</posx>
- <posy>0</posy>
+ <left>220</left>
+ <top>0</top>
<width>300</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(14)</visible>
</control>
<control type="image">
- <posx>940</posx>
- <posy>0</posy>
+ <left>940</left>
+ <top>0</top>
<width>155</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(14)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>8</posy>
+ <left>0</left>
+ <top>8</top>
<width>50</width>
<height>26</height>
<visible>!IsEmpty(ListItem.Date)</visible>
<texture border="1">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>150</width>
<height>40</height>
<font>font12</font>
<info>ListItem.ChannelName</info>
</control>
<control type="label">
- <posx>370</posx>
- <posy>0</posy>
+ <left>370</left>
+ <top>0</top>
<width>290</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>730</posx>
- <posy>0</posy>
+ <left>730</left>
+ <top>0</top>
<width>400</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Date</info>
</control>
<control type="label">
- <posx>1018</posx>
- <posy>0</posy>
+ <left>1018</left>
+ <top>0</top>
<width>150</width>
<height>40</height>
<font>font12</font>
</focusedlayout>
</control>
<control type="scrollbar" id="73">
- <posx>1105</posx>
- <posy>50</posy>
+ <left>1105</left>
+ <top>50</top>
<width>25</width>
<height>480</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="image">
<description>separator image</description>
- <posx>55</posx>
- <posy>540</posy>
+ <left>55</left>
+ <top>540</top>
<width>1010</width>
<height>1</height>
<colordiffuse>88FFFFFF</colordiffuse>
</control>
<control type="label">
<description>Next timer date</description>
- <posx>55</posx>
- <posy>545</posy>
+ <left>55</left>
+ <top>545</top>
<width>1010</width>
<height>30</height>
<font>font13</font>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
<visible>Control.IsVisible(17)</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>80</posx>
- <posy>60</posy>
+ <left>80</left>
+ <top>60</top>
<control type="label">
<description>Channel label</description>
- <posx>0</posx>
- <posy>20</posy>
+ <left>0</left>
+ <top>20</top>
<width>250</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Title</description>
- <posx>290</posx>
- <posy>20</posy>
+ <left>290</left>
+ <top>20</top>
<width>350</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Time label</description>
- <posx>920</posx>
- <posy>20</posy>
+ <right>920</right>
+ <top>20</top>
<width>300</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Status header label</description>
- <posx>960</posx>
- <posy>20</posy>
+ <left>960</left>
+ <top>20</top>
<width>140</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="image">
<description>separator image</description>
- <posx>0</posx>
- <posy>50</posy>
+ <left>0</left>
+ <top>50</top>
<width>1100</width>
<height>1</height>
<colordiffuse>88FFFFFF</colordiffuse>
<texture>separator2.png</texture>
</control>
<control type="list" id="17">
- <posx>0</posx>
- <posy>55</posy>
+ <left>0</left>
+ <top>55</top>
<width>1100</width>
<height>520</height>
<onup>17</onup>
<scrolltime>200</scrolltime>
<itemlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>5</posy>
+ <left>10</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<info>ListItem.Icon</info>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>190</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelName</info>
</control>
<control type="label">
- <posx>260</posx>
- <posy>0</posy>
+ <left>260</left>
+ <top>0</top>
<width>650</width>
<height>35</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>950</posx>
- <posy>0</posy>
+ <left>950</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Date</info>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1000</posx>
- <posy>0</posy>
+ <left>1000</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
</itemlayout>
<focusedlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<visible>!Control.HasFocus(17)</visible>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<visible>!Control.HasFocus(17)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(17)</visible>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(17)</visible>
</control>
<control type="image">
- <posx>10</posx>
- <posy>5</posy>
+ <left>10</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<info>ListItem.Icon</info>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>190</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelName</info>
</control>
<control type="label">
- <posx>260</posx>
- <posy>0</posy>
+ <left>260</left>
+ <top>0</top>
<width>650</width>
<height>35</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="label">
- <posx>950</posx>
- <posy>0</posy>
+ <left>950</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Date</info>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1000</posx>
- <posy>0</posy>
+ <left>1000</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
</focusedlayout>
</control>
<control type="scrollbar" id="77">
- <posx>1105</posx>
- <posy>50</posy>
+ <left>1105</left>
+ <top>50</top>
<width>25</width>
<height>520</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
<visible>Control.IsVisible(15)</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>80</posx>
- <posy>60</posy>
+ <left>80</left>
+ <top>60</top>
<control type="label">
<description>Date Time label</description>
- <posx>0</posx>
- <posy>20</posy>
+ <left>0</left>
+ <top>20</top>
<width>300</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Title</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>600</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Status header label</description>
- <posx>960</posx>
- <posy>20</posy>
+ <left>960</left>
+ <top>20</top>
<width>140</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="image">
<description>separator image</description>
- <posx>0</posx>
- <posy>50</posy>
+ <left>0</left>
+ <top>50</top>
<width>1100</width>
<height>1</height>
<colordiffuse>88FFFFFF</colordiffuse>
<texture>separator2.png</texture>
</control>
<control type="list" id="15">
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<width>1100</width>
<height>500</height>
<onup>15</onup>
<scrolltime>200</scrolltime>
<itemlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>280</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Date</info>
</control>
<control type="label">
- <posx>310</posx>
- <posy>0</posy>
+ <left>310</left>
+ <top>0</top>
<width>640</width>
<height>40</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1000</posx>
- <posy>0</posy>
+ <left>1000</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
</itemlayout>
<focusedlayout height="100">
<control type="image">
- <posx>0</posx>
- <posy>1</posy>
+ <left>0</left>
+ <top>1</top>
<width>1100</width>
<height>98</height>
<colordiffuse>AAFFFFFF</colordiffuse>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>101</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>40</height>
<colordiffuse>AAFFFFFF</colordiffuse>
<visible>!Control.HasFocus(15)</visible>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>AAFFFFFF</colordiffuse>
<visible>!Control.HasFocus(15)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(15)</visible>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(15)</visible>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>280</width>
<height>40</height>
<font>font12</font>
<info>ListItem.Date</info>
</control>
<control type="label">
- <posx>310</posx>
- <posy>0</posy>
+ <left>310</left>
+ <top>0</top>
<width>640</width>
<height>40</height>
<font>font13</font>
</control>
<control type="textbox">
<description>Plot Value for TVShow</description>
- <posx>50</posx>
- <posy>40</posy>
+ <left>50</left>
+ <top>40</top>
<width>1000</width>
<height>60</height>
<font>font12</font>
<label>$INFO[ListItem.Plot]</label>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1000</posx>
- <posy>0</posy>
+ <left>1000</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
</focusedlayout>
</control>
<control type="scrollbar" id="75">
- <posx>1105</posx>
- <posy>60</posy>
+ <left>1105</left>
+ <top>60</top>
<width>25</width>
<height>500</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
<visible>Control.IsVisible(16)</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>80</posx>
- <posy>60</posy>
+ <left>80</left>
+ <top>60</top>
<control type="label">
<description>Time label</description>
- <posx>0</posx>
- <posy>20</posy>
+ <left>0</left>
+ <top>20</top>
<width>100</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Channel label</description>
- <posx>100</posx>
- <posy>20</posy>
+ <left>100</left>
+ <top>20</top>
<width>250</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Title</description>
- <posx>350</posx>
- <posy>20</posy>
+ <left>350</left>
+ <top>20</top>
<width>550</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Status header label</description>
- <posx>960</posx>
- <posy>20</posy>
+ <left>960</left>
+ <top>20</top>
<width>140</width>
<height>20</height>
<font>font13_title</font>
</control>
<control type="image">
<description>separator image</description>
- <posx>0</posx>
- <posy>50</posy>
+ <left>0</left>
+ <top>50</top>
<width>1100</width>
<height>1</height>
<colordiffuse>88FFFFFF</colordiffuse>
<texture>separator2.png</texture>
</control>
<control type="list" id="16">
- <posx>0</posx>
- <posy>60</posy>
+ <left>0</left>
+ <top>60</top>
<width>1100</width>
<height>500</height>
<onup>16</onup>
<scrolltime>200</scrolltime>
<itemlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>100</posx>
- <posy>0</posy>
+ <left>100</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>33FFFFFF</colordiffuse>
<texture border="5">StackFO.png</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font12</font>
<info>ListItem.StartTime</info>
</control>
<control type="image">
- <posx>110</posx>
- <posy>5</posy>
+ <left>110</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<info>ListItem.Icon</info>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>190</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelName</info>
</control>
<control type="label">
- <posx>360</posx>
- <posy>0</posy>
+ <left>360</left>
+ <top>0</top>
<width>590</width>
<height>35</height>
<font>font13</font>
<info>ListItem.Label</info>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1000</posx>
- <posy>0</posy>
+ <left>1000</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
</itemlayout>
<focusedlayout height="100">
<control type="image">
- <posx>0</posx>
- <posy>1</posy>
+ <left>0</left>
+ <top>1</top>
<width>1100</width>
<height>98</height>
<colordiffuse>AAFFFFFF</colordiffuse>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1100</width>
<height>100</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>100</posx>
- <posy>0</posy>
+ <left>100</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<colordiffuse>AAFFFFFF</colordiffuse>
<visible>!Control.HasFocus(16)</visible>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>AAFFFFFF</colordiffuse>
<visible>!Control.HasFocus(16)</visible>
</control>
<control type="image">
- <posx>100</posx>
- <posy>0</posy>
+ <left>100</left>
+ <top>0</top>
<width>250</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(16)</visible>
</control>
<control type="image">
- <posx>960</posx>
- <posy>0</posy>
+ <left>960</left>
+ <top>0</top>
<width>140</width>
<height>40</height>
<colordiffuse>88FFFFFF</colordiffuse>
<visible>Control.HasFocus(16)</visible>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>100</width>
<height>40</height>
<font>font12</font>
<info>ListItem.StartTime</info>
</control>
<control type="image">
- <posx>110</posx>
- <posy>5</posy>
+ <left>110</left>
+ <top>5</top>
<width>30</width>
<height>30</height>
<info>ListItem.Icon</info>
</control>
<control type="label">
- <posx>150</posx>
- <posy>0</posy>
+ <left>150</left>
+ <top>0</top>
<width>190</width>
<height>35</height>
<font>font12</font>
<info>ListItem.ChannelName</info>
</control>
<control type="label">
- <posx>360</posx>
- <posy>0</posy>
+ <left>360</left>
+ <top>0</top>
<width>590</width>
<height>35</height>
<font>font13</font>
</control>
<control type="textbox">
<description>Plot Value for TVShow</description>
- <posx>50</posx>
- <posy>35</posy>
+ <left>50</left>
+ <top>35</top>
<width>1000</width>
<height>60</height>
<font>font12</font>
<label>$INFO[ListItem.Plot]</label>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>30</width>
<height>20</height>
<texture>PVR-IsRecording.png</texture>
<visible>ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1005</posx>
- <posy>0</posy>
+ <left>1005</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
<visible>ListItem.IsRecording</visible>
</control>
<control type="image">
- <posx>970</posx>
- <posy>10</posy>
+ <left>970</left>
+ <top>10</top>
<width>20</width>
<height>20</height>
<texture>PVR-HasTimer.png</texture>
<visible>ListItem.HasTimer + !ListItem.IsRecording</visible>
</control>
<control type="label">
- <posx>1000</posx>
- <posy>0</posy>
+ <left>1000</left>
+ <top>0</top>
<width>80</width>
<height>40</height>
<font>font10</font>
</focusedlayout>
</control>
<control type="scrollbar" id="76">
- <posx>1105</posx>
- <posy>60</posy>
+ <left>1105</left>
+ <top>60</top>
<width>25</width>
<height>500</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
</control>
</control>
</include>
-</includes>
\ No newline at end of file
+</includes>
<control type="group">
<visible>Control.IsVisible(510)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>440</posy>
+ <left>0</left>
+ <top>440</top>
<control type="wraplist" id="510">
- <posx>-25</posx>
- <posy>5</posy>
+ <left>-25</left>
+ <top>5</top>
<width>1330</width>
<height>250</height>
<onleft>510</onleft>
<preloaditems>4</preloaditems>
<itemlayout height="200" width="190">
<control type="image">
- <posx>15</posx>
- <posy>40</posy>
+ <left>15</left>
+ <top>40</top>
<width>160</width>
<height>160</height>
<aspectratio>stretch</aspectratio>
<texture border="2">ThumbBG.png</texture>
</control>
<control type="image">
- <posx>25</posx>
- <posy>50</posy>
+ <left>25</left>
+ <top>50</top>
<width>140</width>
<height>140</height>
<aspectratio>keep</aspectratio>
</itemlayout>
<focusedlayout height="200" width="190">
<control type="image">
- <posx>15</posx>
- <posy>40</posy>
+ <left>15</left>
+ <top>40</top>
<width>160</width>
<height>160</height>
<aspectratio>stretch</aspectratio>
<animation reversible="false" effect="zoom" end="15,40,160,160" start="-10,-5,210,210" time="200">unfocus</animation>
</control>
<control type="image">
- <posx>25</posx>
- <posy>50</posy>
+ <left>25</left>
+ <top>50</top>
<width>140</width>
<height>140</height>
<aspectratio>keep</aspectratio>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>310</posx>
- <posy>200</posy>
+ <left>310</left>
+ <top>200</top>
<width>660</width>
<height>25</height>
<texturesliderbackground border="14,0,14,0">ScrollBarH.png</texturesliderbackground>
<control type="group">
<visible>Control.IsVisible(514)</visible>
<control type="panel" id="514">
- <posx>60</posx>
- <posy>75</posy>
+ <left>60</left>
+ <top>75</top>
<width>432</width>
<height>576</height>
<onleft>2</onleft>
<preloaditems>2</preloaditems>
<itemlayout height="144" width="144">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>144</width>
<height>144</height>
<aspectratio>stretch</aspectratio>
<texture border="2">ThumbBG.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>124</width>
<height>124</height>
<aspectratio>keep</aspectratio>
</itemlayout>
<focusedlayout height="144" width="144">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>144</width>
<height>144</height>
<aspectratio>stretch</aspectratio>
<texture border="2">ThumbBG.png</texture>
</control>
<control type="image">
- <posx>10</posx>
- <posy>10</posy>
+ <left>10</left>
+ <top>10</top>
<width>124</width>
<height>124</height>
<aspectratio>keep</aspectratio>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>500</posx>
- <posy>70</posy>
+ <left>500</left>
+ <top>70</top>
<width>25</width>
<height>576</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(514)</visible>
</control>
<control type="group">
- <posx>570</posx>
- <posy>80</posy>
+ <left>570</left>
+ <top>80</top>
<control type="label">
<description>Title txt</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>640</width>
<height>15</height>
<label>$INFO[ListItem.Label]</label>
<shadowcolor>black</shadowcolor>
</control>
<control type="image">
- <posx>0</posx>
- <posy>30</posy>
+ <left>0</left>
+ <top>30</top>
<width>640</width>
<height>470</height>
<texture background="true">$INFO[ListItem.FilenameAndPath]</texture>
</control>
<control type="label">
<description>Date time txt</description>
- <posx>0</posx>
- <posy>510</posy>
+ <left>0</left>
+ <top>510</top>
<width>640</width>
<height>15</height>
<label>$INFO[ListItem.PictureDateTime,[COLOR=blue]$LOCALIZE[31326][/COLOR] - ]</label>
</control>
<control type="label">
<description>Resolution txt</description>
- <posx>0</posx>
- <posy>535</posy>
+ <left>0</left>
+ <top>535</top>
<width>640</width>
<height>15</height>
<label>$INFO[ListItem.PictureResolution,[COLOR=blue]$LOCALIZE[31327][/COLOR] - ]</label>
<include name="PosterWrapView">
<control type="grouplist">
<visible>Control.IsVisible(501)</visible>
- <posx>60</posx>
- <posy>80</posy>
+ <left>60</left>
+ <top>80</top>
<width>1160</width>
<height>460</height>
<onup>9000</onup>
<control type="fixedlist" id="501">
<visible>Container.Content(Movies) | Container.Content(Seasons) | Container.Content(TVShows) | Container.Content(Sets)</visible>
<visible>!Container.Content(LiveTV)</visible>
- <posx>-183</posx>
- <posy>0</posy>
+ <left>-183</left>
+ <top>0</top>
<width>1526</width>
<height>390</height>
<onleft>501</onleft>
<preloaditems>4</preloaditems>
<itemlayout height="310" width="218">
<control type="image">
- <posx>2</posx>
- <posy>40</posy>
+ <left>2</left>
+ <top>40</top>
<width>214</width>
<height>310</height>
<aspectratio>stretch</aspectratio>
</itemlayout>
<focusedlayout height="310" width="218">
<control type="image">
- <posx>-2</posx>
- <posy>36</posy>
+ <left>-2</left>
+ <top>36</top>
<width>222</width>
<height>318</height>
<aspectratio>stretch</aspectratio>
<animation reversible="false" effect="zoom" end="-2,36,222,318" start="-28,0,284,390" time="200">unfocus</animation>
</control>
<control type="image">
- <posx>6</posx>
- <posy>44</posy>
+ <left>6</left>
+ <top>44</top>
<width>170</width>
<height>180</height>
<aspectratio>stretch</aspectratio>
<animation reversible="false" effect="zoom" end="6,44,170,180" start="-24,4,240,250" time="200">unfocus</animation>
</control>
<control type="image">
- <posx>185</posx>
- <posy>310</posy>
+ <left>185</left>
+ <top>310</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.Overlay]</texture>
<animation type="focus">
- <effect type="fade" start="0" end="100" time="200" />
- <effect type="slide" start="0,0" end="40,40" time="200" />
+ <effect type="fade" start="0" end="100" time="200"/>
+ <effect type="slide" start="0,0" end="40,40" time="200"/>
</animation>
<animation type="unfocus">
- <effect type="fade" start="100" end="0" time="200" />
- <effect type="slide" end="0,0" start="40,40" time="200" />
+ <effect type="fade" start="100" end="0" time="200"/>
+ <effect type="slide" end="0,0" start="40,40" time="200"/>
</animation>
</control>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>140</posx>
- <posy>0</posy>
+ <left>140</left>
+ <top>0</top>
<width>880</width>
<height>25</height>
<texturesliderbackground border="14,0,14,0">ScrollBarH.png</texturesliderbackground>
<control type="group">
<visible>Control.IsVisible(501)</visible>
<control type="image">
- <posx>56</posx>
- <posy>120</posy>
+ <left>56</left>
+ <top>120</top>
<width>128</width>
<height>310</height>
<texture>SideFade.png</texture>
</control>
<control type="image">
- <posx>1094</posx>
- <posy>120</posy>
+ <left>1094</left>
+ <top>120</top>
<width>128</width>
<height>310</height>
<texture flipx="true">SideFade.png</texture>
<control type="group">
<visible>Control.IsVisible(501) + [Container.Content(Movies) | Container.Content(Sets)]</visible>
<control type="label">
- <posx>30</posx>
- <posy>500</posy>
+ <left>30</left>
+ <top>500</top>
<width>1220</width>
<height>35</height>
<font>font28_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>540</posy>
+ <left>0</left>
+ <top>540</top>
<width>1280</width>
<height>35</height>
<font>font30</font>
<label>$INFO[ListItem.Year]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>580</posy>
+ <left>0</left>
+ <top>580</top>
<width>1280</width>
<height>20</height>
<font>font13</font>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>0</posx>
- <posy>610</posy>
+ <left>0</left>
+ <top>610</top>
<width>1280</width>
<align>center</align>
<itemgap>2</itemgap>
<control type="group">
<visible>Control.IsVisible(501) + Container.Content(Seasons)</visible>
<control type="label">
- <posx>30</posx>
- <posy>500</posy>
+ <left>30</left>
+ <top>500</top>
<width>1220</width>
<height>35</height>
<font>font28_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>540</posy>
+ <left>0</left>
+ <top>540</top>
<width>1280</width>
<height>35</height>
<font>font30</font>
<label>$INFO[ListItem.TVShowTitle]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>575</posy>
+ <left>0</left>
+ <top>575</top>
<width>1280</width>
<height>35</height>
<font>font13</font>
<label>$INFO[ListItem.Episode,, $LOCALIZE[20453]]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>605</posy>
+ <left>0</left>
+ <top>605</top>
<width>1280</width>
<height>35</height>
<font>font12</font>
<control type="group">
<visible>Control.IsVisible(501) + Container.Content(TVShows)</visible>
<control type="label">
- <posx>30</posx>
- <posy>500</posy>
+ <left>30</left>
+ <top>500</top>
<width>1220</width>
<height>35</height>
<font>font28_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>540</posy>
+ <left>0</left>
+ <top>540</top>
<width>1280</width>
<height>35</height>
<font>font30</font>
<label>$INFO[ListItem.Genre]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>575</posy>
+ <left>0</left>
+ <top>575</top>
<width>1280</width>
<height>35</height>
<font>font13</font>
<label>$INFO[ListItem.Episode,, $LOCALIZE[20453]]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>605</posy>
+ <left>0</left>
+ <top>605</top>
<width>1280</width>
<height>35</height>
<font>font12</font>
</include>
<include name="PosterWrapView2_Fanart">
<control type="group">
- <posx>0</posx>
- <posy>350</posy>
+ <left>0</left>
+ <top>350</top>
<visible>Control.IsVisible(508) + [[ListItem.IsFolder + Container.Content(Movies)] | Skin.HasSetting(View508HideInfo) | Container.Content(Sets)]</visible>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>270</height>
<texture border="1">HomeNowPlayingBack.png</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>70</posy>
+ <left>40</left>
+ <top>70</top>
<width>1200</width>
<height>20</height>
<font>font24_title</font>
<control type="group">
<visible>Control.IsVisible(508)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>460</posy>
+ <left>0</left>
+ <top>460</top>
<control type="fixedlist" id="508">
<visible>Container.Content(Movies) | Container.Content(TVShows) | Container.Content(Sets)</visible>
- <hitrect x="0" y="-10" w="1280" h="190" />
- <posx>-20</posx>
- <posy>0</posy>
+ <hitrect x="0" y="-10" w="1280" h="190"/>
+ <left>-20</left>
+ <top>0</top>
<width>1320</width>
<height>250</height>
<onleft>508</onleft>
<preloaditems>4</preloaditems>
<itemlayout height="200" width="120">
<control type="image">
- <posx>2</posx>
- <posy>20</posy>
+ <left>2</left>
+ <top>20</top>
<width>120</width>
<height>160</height>
<aspectratio>stretch</aspectratio>
<texture background="true">$VAR[PosterThumb]</texture>
</control>
<control type="image">
- <posx>6</posx>
- <posy>24</posy>
+ <left>6</left>
+ <top>24</top>
<width>112</width>
<height>152</height>
<aspectratio>stretch</aspectratio>
<colordiffuse>AAFFFFFF</colordiffuse>
</control>
<control type="image">
- <posx>2</posx>
- <posy>180</posy>
+ <left>2</left>
+ <top>180</top>
<width>120</width>
<height>160</height>
<aspectratio>stretch</aspectratio>
</itemlayout>
<focusedlayout height="310" width="120">
<control type="image">
- <posx>-2</posx>
- <posy>16</posy>
+ <left>-2</left>
+ <top>16</top>
<width>128</width>
<height>168</height>
<aspectratio>stretch</aspectratio>
<animation reversible="false" effect="zoom" end="-2,16,128,168" start="-12,-10,148,198" time="200">unfocus</animation>
</control>
<control type="image">
- <posx>2</posx>
- <posy>180</posy>
+ <left>2</left>
+ <top>180</top>
<width>120</width>
<height>160</height>
<aspectratio>stretch</aspectratio>
<texture background="true" flipy="true" diffuse="diffuse_mirror2.png">$VAR[PosterThumb]</texture>
</control>
<control type="image">
- <posx>90</posx>
- <posy>150</posy>
+ <left>90</left>
+ <top>150</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.Overlay]</texture>
<animation type="focus">
- <effect type="fade" start="0" end="100" time="200" />
- <effect type="slide" start="0,0" end="10,5" time="200" />
+ <effect type="fade" start="0" end="100" time="200"/>
+ <effect type="slide" start="0,0" end="10,5" time="200"/>
</animation>
<animation type="unfocus">
- <effect type="fade" start="100" end="0" time="200" />
- <effect type="slide" end="0,0" start="10,5" time="200" />
+ <effect type="fade" start="100" end="0" time="200"/>
+ <effect type="slide" end="0,0" start="10,5" time="200"/>
</animation>
</control>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>310</posx>
- <posy>185</posy>
+ <left>310</left>
+ <top>185</top>
<width>660</width>
<height>25</height>
<texturesliderbackground border="14,0,14,0">ScrollBarH.png</texturesliderbackground>
</control>
</control>
<control type="group">
- <posx>180</posx>
- <posy>40</posy>
+ <left>180</left>
+ <top>40</top>
<visible>Control.IsVisible(508) + ![ListItem.IsFolder + Container.Content(Movies)] + !Skin.HasSetting(View508HideInfo) + !Container.Content(Sets)</visible>
<include>VisibleFadeEffect</include>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>920</width>
<height>410</height>
<texture border="20">ContentPanel.png</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>840</width>
<height>20</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="group">
- <posx>40</posx>
- <posy>50</posy>
+ <left>40</left>
+ <top>50</top>
<visible>Container.Content(Movies)</visible>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<label>31308</label>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>30</posy>
+ <left>0</left>
+ <top>30</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<pauseatend>2000</pauseatend>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>55</posy>
+ <left>0</left>
+ <top>55</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<pauseatend>2000</pauseatend>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<pauseatend>2000</pauseatend>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>105</posy>
+ <left>0</left>
+ <top>105</top>
<width>400</width>
<height>30</height>
<font>font13</font>
</control>
</control>
<control type="group">
- <posx>480</posx>
- <posy>50</posy>
+ <left>480</left>
+ <top>50</top>
<visible>Container.Content(Movies)</visible>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<label>20339</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>30</posy>
+ <left>0</left>
+ <top>30</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<label>$INFO[ListItem.Director]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>75</posy>
+ <left>0</left>
+ <top>75</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<label>20417</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>105</posy>
+ <left>0</left>
+ <top>105</top>
<width>400</width>
<height>30</height>
<font>font13</font>
</control>
</control>
<control type="group">
- <posx>40</posx>
- <posy>50</posy>
+ <left>40</left>
+ <top>50</top>
<visible>Container.Content(TVShows)</visible>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<label>20351</label>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>30</posy>
+ <left>0</left>
+ <top>30</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<pauseatend>2000</pauseatend>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>55</posy>
+ <left>0</left>
+ <top>55</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<pauseatend>2000</pauseatend>
</control>
<control type="fadelabel">
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>400</width>
<height>30</height>
<font>font13</font>
</control>
</control>
<control type="group">
- <posx>480</posx>
- <posy>50</posy>
+ <left>480</left>
+ <top>50</top>
<visible>Container.Content(TVShows)</visible>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
<label>20360</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>30</posy>
+ <left>0</left>
+ <top>30</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<label>$LOCALIZE[20161] : $INFO[ListItem.Episode]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>55</posy>
+ <left>0</left>
+ <top>55</top>
<width>400</width>
<height>30</height>
<font>font13</font>
<label>$LOCALIZE[16102] : $INFO[ListItem.Property(WatchedEpisodes)]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>400</width>
<height>30</height>
<font>font13</font>
</control>
</control>
<control type="group">
- <posx>40</posx>
- <posy>200</posy>
+ <left>40</left>
+ <top>200</top>
<control type="label">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>400</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="textbox">
<description>Description Value The Movie</description>
- <posx>0</posx>
- <posy>30</posy>
+ <left>0</left>
+ <top>30</top>
<width>850</width>
<height>120</height>
<font>font12</font>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>30</posx>
- <posy>360</posy>
+ <left>30</left>
+ <top>360</top>
<width>800</width>
<align>left</align>
<itemgap>2</itemgap>
</control>
<control type="grouplist">
<description>MPAA Rating Flagging Images</description>
- <posx>95</posx>
- <posy>360</posy>
+ <left>95</left>
+ <top>360</top>
<width>800</width>
<align>right</align>
<itemgap>0</itemgap>
<visible>Control.IsVisible(503)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="503">
- <posx>70</posx>
- <posy>245</posy>
+ <left>70</left>
+ <top>245</top>
<width>580</width>
<height>401</height>
<onleft>2</onleft>
<visible>Container.Content(TVShows) | Container.Content(Seasons) | Container.Content(Episodes) | Container.Content(Movies)</visible>
<itemlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>510</posx>
- <posy>0</posy>
+ <left>510</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>515</posx>
- <posy>8</posy>
+ <left>515</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</itemlayout>
<focusedlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>380</posx>
- <posy>4</posy>
+ <left>380</left>
+ <top>4</top>
<width>200</width>
<height>33</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(503) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>510</posx>
- <posy>0</posy>
+ <left>510</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>515</posx>
- <posy>8</posy>
+ <left>515</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>650</posx>
- <posy>245</posy>
+ <left>650</left>
+ <top>245</top>
<width>25</width>
<height>400</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(503)</visible>
</control>
<control type="group">
- <posx>710</posx>
- <posy>245</posy>
+ <left>710</left>
+ <top>245</top>
<visible>Container.Content(TVShows)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>530</width>
<height>110</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Episodes txt</description>
- <posx>150</posx>
- <posy>120</posy>
+ <right>150</right>
+ <top>120</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[20360]:</label>
</control>
<control type="label">
<description>Episodes Value</description>
- <posx>160</posx>
- <posy>120</posy>
+ <left>160</left>
+ <top>120</top>
<width>360</width>
<height>25</height>
<label fallback="416">$INFO[listitem.episode] [COLOR=grey] ($INFO[ListItem.Property(WatchedEpisodes),, $LOCALIZE[16102]] - $INFO[ListItem.Property(UnWatchedEpisodes), , $LOCALIZE[16101]])[/COLOR]</label>
</control>
<control type="label">
<description>Aired txt</description>
- <posx>150</posx>
- <posy>145</posy>
+ <right>150</right>
+ <top>145</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[31322]:</label>
</control>
<control type="label">
<description>Aired Value</description>
- <posx>160</posx>
- <posy>145</posy>
+ <left>160</left>
+ <top>145</top>
<width>360</width>
<height>25</height>
<label fallback="416">$INFO[listitem.premiered]</label>
</control>
<control type="label">
<description>Genre txt</description>
- <posx>150</posx>
- <posy>170</posy>
+ <right>150</right>
+ <top>170</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[515]:</label>
</control>
<control type="fadelabel">
<description>Genre Value</description>
- <posx>160</posx>
- <posy>170</posy>
+ <left>160</left>
+ <top>170</top>
<width>360</width>
<height>25</height>
<label fallback="416">$INFO[listitem.Genre]</label>
<pauseatend>1000</pauseatend>
</control>
<control type="image">
- <posx>0</posx>
- <posy>200</posy>
+ <left>0</left>
+ <top>200</top>
<width>530</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="textbox">
<description>Description Value for TVShows</description>
- <posx>10</posx>
- <posy>210</posy>
+ <left>10</left>
+ <top>210</top>
<width>510</width>
<height>180</height>
<font>font12</font>
</control>
</control>
<control type="group">
- <posx>710</posx>
- <posy>245</posy>
+ <left>710</left>
+ <top>245</top>
<visible>Container.Content(Episodes)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>530</width>
<height>210</height>
<aspectratio>keep</aspectratio>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<width>530</width>
<align>center</align>
<itemgap>2</itemgap>
</control>
<control type="label">
<description>INFO txt</description>
- <posx>10</posx>
- <posy>245</posy>
+ <left>10</left>
+ <top>245</top>
<width>510</width>
<height>25</height>
<label>$INFO[ListItem.Season,[COLOR=blue] $LOCALIZE[20373] :[/COLOR] ] $INFO[ListItem.episode,[COLOR=blue] $LOCALIZE[20359] :[/COLOR] ] $INFO[ListItem.premiered,[COLOR=blue] $LOCALIZE[31322] :[/COLOR] ]</label>
<wrapmultiline>true</wrapmultiline>
</control>
<control type="image">
- <posx>0</posx>
- <posy>275</posy>
+ <left>0</left>
+ <top>275</top>
<width>530</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="textbox">
<description>Description Value for TVShows</description>
- <posx>10</posx>
- <posy>280</posy>
+ <left>10</left>
+ <top>280</top>
<width>510</width>
<height>120</height>
<font>font12</font>
</control>
</control>
<control type="group">
- <posx>710</posx>
- <posy>245</posy>
+ <left>710</left>
+ <top>245</top>
<visible>Container.Content(Seasons)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>355</height>
<aspectratio>keep</aspectratio>
</control>
<control type="textbox">
<description>Description Value for Seasons</description>
- <posx>270</posx>
- <posy>0</posy>
+ <left>270</left>
+ <top>0</top>
<width>250</width>
<height>355</height>
<font>font12</font>
</control>
<control type="label">
<description>Watched Count</description>
- <posx>10</posx>
- <posy>370</posy>
+ <left>10</left>
+ <top>370</top>
<width>510</width>
<height>25</height>
<label>[COLOR=white]$LOCALIZE[20360]:[/COLOR] $INFO[ListItem.Property(WatchedEpisodes),([COLOR=blue],[/COLOR]) $LOCALIZE[16102]] $INFO[ListItem.Property(UnWatchedEpisodes),([COLOR=blue],[/COLOR]) $LOCALIZE[16101]]</label>
</control>
</control>
<control type="group">
- <posx>710</posx>
- <posy>245</posy>
+ <left>710</left>
+ <top>245</top>
<visible>Container.Content(Movies)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>355</height>
<aspectratio>keep</aspectratio>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>0</posx>
- <posy>365</posy>
+ <left>0</left>
+ <top>365</top>
<width>530</width>
<align>center</align>
<itemgap>2</itemgap>
</control>
<control type="textbox">
<description>Description Value for Movie</description>
- <posx>270</posx>
- <posy>0</posy>
+ <left>270</left>
+ <top>0</top>
<width>250</width>
<height>355</height>
<font>font12</font>
<visible>Control.IsVisible(504)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="504">
- <posx>70</posx>
- <posy>78</posy>
+ <left>70</left>
+ <top>78</top>
<width>580</width>
<height>561</height>
<onleft>2</onleft>
<visible>Container.Content(TVShows) | Container.Content(Movies) | Container.Content(Episodes)</visible>
<itemlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>510</posx>
- <posy>0</posy>
+ <left>510</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>515</posx>
- <posy>8</posy>
+ <left>515</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</itemlayout>
<focusedlayout height="40" width="580">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>580</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>380</posx>
- <posy>4</posy>
+ <left>380</left>
+ <top>4</top>
<width>200</width>
<height>33</height>
<texture border="0,0,14,0">MediaItemDetailBG.png</texture>
<visible>Control.HasFocus(504) + !IsEmpty(ListItem.Label2)</visible>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>510</posx>
- <posy>0</posy>
+ <left>510</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font12</font>
<animation effect="slide" start="0,0" end="40,0" delay="0" time="0" condition="![Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]">conditional</animation>
</control>
<control type="image">
- <posx>515</posx>
- <posy>8</posy>
+ <left>515</left>
+ <top>8</top>
<width>40</width>
<height>26</height>
<texture>$INFO[ListItem.VideoResolution,flagging/lists/,.png]</texture>
<visible>Window.IsVisible(Videos) + [Container.Content(Movies) | Container.Content(Episodes) | Container.Content(MusicVideos)]</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>555</posx>
- <posy>14</posy>
+ <left>555</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>650</posx>
- <posy>78</posy>
+ <left>650</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="10,14,10,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(504)</visible>
</control>
<control type="group">
- <posx>710</posx>
- <posy>70</posy>
+ <left>710</left>
+ <top>70</top>
<visible>Control.IsVisible(504) + [Container.Content(Movies) | Container.Content(TVShows)]</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>510</width>
<height>286</height>
<aspectratio>scale</aspectratio>
<fadetime>IconCrossfadeTime</fadetime>
- <texture background="true" fallback="Fanart_Fallback_Small.jpg" >$INFO[ListItem.Art(fanart)]</texture>
+ <texture background="true" fallback="Fanart_Fallback_Small.jpg">$INFO[ListItem.Art(fanart)]</texture>
<visible>Container.Content(Movies)</visible>
<bordertexture background="true" border="8">ThumbShadow.png</bordertexture>
<bordersize>8</bordersize>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>510</width>
<height>325</height>
<aspectratio>scale</aspectratio>
<fadetime>IconCrossfadeTime</fadetime>
- <texture background="true" fallback="Fanart_Fallback_Small.jpg" >$INFO[ListItem.Art(fanart)]</texture>
+ <texture background="true" fallback="Fanart_Fallback_Small.jpg">$INFO[ListItem.Art(fanart)]</texture>
<visible>Container.Content(TVShows)</visible>
<bordertexture background="true" border="8">ThumbShadow.png</bordertexture>
<bordersize>8</bordersize>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>0</posx>
- <posy>290</posy>
+ <left>0</left>
+ <top>290</top>
<width>510</width>
<align>center</align>
<itemgap>2</itemgap>
<include>VideoTypeHackFlaggingConditions</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>330</posy>
+ <left>0</left>
+ <top>330</top>
<width>510</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
<description>Year txt</description>
- <posx>150</posx>
- <posy>335</posy>
+ <right>150</right>
+ <top>335</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[345]:</label>
</control>
<control type="label">
<description>Year Value</description>
- <posx>160</posx>
- <posy>335</posy>
+ <left>160</left>
+ <top>335</top>
<width>340</width>
<height>25</height>
<label fallback="416">$INFO[listitem.Year]</label>
</control>
<control type="label">
<description>Genre txt</description>
- <posx>150</posx>
- <posy>360</posy>
+ <right>150</right>
+ <top>360</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[515]:</label>
</control>
<control type="fadelabel">
<description>Genre Value</description>
- <posx>160</posx>
- <posy>360</posy>
+ <left>160</left>
+ <top>360</top>
<width>340</width>
<height>25</height>
<label fallback="416">$INFO[listitem.Genre]</label>
<pauseatend>1000</pauseatend>
</control>
<control type="image">
- <posx>0</posx>
- <posy>390</posy>
+ <left>0</left>
+ <top>390</top>
<width>510</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="textbox">
<description>Description Value for Video</description>
- <posx>10</posx>
- <posy>395</posy>
+ <left>10</left>
+ <top>395</top>
<width>490</width>
<height>170</height>
<font>font12</font>
</control>
</control>
<control type="group">
- <posx>710</posx>
- <posy>70</posy>
+ <left>710</left>
+ <top>70</top>
<visible>Control.IsVisible(504) + Container.Content(Episodes)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>510</width>
<height>286</height>
<aspectratio>scale</aspectratio>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>0</posx>
- <posy>290</posy>
+ <left>0</left>
+ <top>290</top>
<width>510</width>
<align>center</align>
<itemgap>2</itemgap>
<include>VideoTypeHackFlaggingConditions</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>330</posy>
+ <left>0</left>
+ <top>330</top>
<width>510</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
<description>Aired txt</description>
- <posx>150</posx>
- <posy>335</posy>
+ <right>150</right>
+ <top>335</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[31322]:</label>
</control>
<control type="label">
<description>Aired Value</description>
- <posx>160</posx>
- <posy>335</posy>
+ <left>160</left>
+ <top>335</top>
<width>340</width>
<height>25</height>
<label fallback="416">$INFO[listitem.Premiered]</label>
</control>
<control type="label">
<description>Episode txt</description>
- <posx>150</posx>
- <posy>360</posy>
+ <right>150</right>
+ <top>360</top>
<width>140</width>
<height>25</height>
<label>$LOCALIZE[20359]:</label>
</control>
<control type="fadelabel">
<description>Episode Value</description>
- <posx>160</posx>
- <posy>360</posy>
+ <left>160</left>
+ <top>360</top>
<width>340</width>
<height>25</height>
<label fallback="416">$INFO[listitem.Season,,x]$INFO[listitem.Episode]</label>
<pauseatend>1000</pauseatend>
</control>
<control type="image">
- <posx>0</posx>
- <posy>390</posy>
+ <left>0</left>
+ <top>390</top>
<width>510</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="textbox">
<description>Description Value for Video</description>
- <posx>10</posx>
- <posy>395</posy>
+ <left>10</left>
+ <top>395</top>
<width>490</width>
<height>170</height>
<font>font12</font>
<visible>Control.IsVisible(515)</visible>
<include>VisibleFadeEffect</include>
<control type="list" id="515">
- <posx>70</posx>
- <posy>78</posy>
+ <left>70</left>
+ <top>78</top>
<width>340</width>
<height>561</height>
<onleft>2</onleft>
<visible>Container.Content(TVShows) | Container.Content(Movies) | Container.Content(Episodes) | Container.Content(Seasons)</visible>
<itemlayout height="40" width="345">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>345</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>310</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>320</posx>
- <posy>14</posy>
+ <left>320</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>320</posx>
- <posy>14</posy>
+ <left>320</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</itemlayout>
<focusedlayout height="40" width="345">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>345</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>345</width>
<height>41</height>
<texture border="0,2,0,2">MenuItemFO.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>310</width>
<height>40</height>
<font>font13</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>320</posx>
- <posy>14</posy>
+ <left>320</left>
+ <top>14</top>
<width>20</width>
<height>16</height>
<texture>$INFO[ListItem.Overlay]</texture>
<visible>!ListItem.IsResumable</visible>
</control>
<control type="image">
- <posx>320</posx>
- <posy>14</posy>
+ <left>320</left>
+ <top>14</top>
<width>16</width>
<height>16</height>
<texture>OverlayWatching.png</texture>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>415</posx>
- <posy>78</posy>
+ <left>415</left>
+ <top>78</top>
<width>25</width>
<height>560</height>
<texturesliderbackground border="10,14,10,14">ScrollBarV.png</texturesliderbackground>
<visible>Control.IsVisible(515)</visible>
</control>
<control type="group">
- <posx>470</posx>
- <posy>70</posy>
+ <left>470</left>
+ <top>70</top>
<visible>Control.IsVisible(515) + Container.Content(Movies)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>420</height>
<aspectratio scalediffuse="false">scale</aspectratio>
<fadetime>IconCrossfadeTime</fadetime>
- <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg" >$INFO[ListItem.Art(fanart)]</texture>
+ <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg">$INFO[ListItem.Art(fanart)]</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>395</posy>
+ <left>10</left>
+ <top>395</top>
<width>540</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="textbox">
<description>Description Value for Video</description>
- <posx>10</posx>
- <posy>425</posy>
+ <left>10</left>
+ <top>425</top>
<width>540</width>
<height>105</height>
<font>font12</font>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>0</posx>
- <posy>540</posy>
+ <left>0</left>
+ <top>540</top>
<width>540</width>
<align>left</align>
<itemgap>2</itemgap>
<include>VideoTypeHackFlaggingConditions</include>
</control>
<control type="image">
- <posx>560</posx>
- <posy>140</posy>
+ <left>560</left>
+ <top>140</top>
<width>180</width>
<height>440</height>
<aspectratio align="left" aligny="bottom">keep</aspectratio>
</control>
</control>
<control type="group">
- <posx>470</posx>
- <posy>70</posy>
+ <left>470</left>
+ <top>70</top>
<visible>Control.IsVisible(515) + Container.Content(TVShows)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>420</height>
<aspectratio scalediffuse="false">scale</aspectratio>
<fadetime>IconCrossfadeTime</fadetime>
- <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg" >$INFO[ListItem.Art(fanart)]</texture>
+ <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg">$INFO[ListItem.Art(fanart)]</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>395</posy>
+ <left>10</left>
+ <top>395</top>
<width>540</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="textbox">
<description>Description Value for Video</description>
- <posx>10</posx>
- <posy>425</posy>
+ <left>10</left>
+ <top>425</top>
<width>540</width>
<height>145</height>
<font>font12</font>
<autoscroll time="2000" delay="3000" repeat="5000">Skin.HasSetting(AutoScroll)</autoscroll>
</control>
<control type="image">
- <posx>560</posx>
- <posy>140</posy>
+ <left>560</left>
+ <top>140</top>
<width>180</width>
<height>440</height>
<aspectratio align="left" aligny="bottom">keep</aspectratio>
</control>
</control>
<control type="group">
- <posx>470</posx>
- <posy>70</posy>
+ <left>470</left>
+ <top>70</top>
<visible>Control.IsVisible(515) + Container.Content(Seasons)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>420</height>
<aspectratio scalediffuse="false">scale</aspectratio>
<fadetime>IconCrossfadeTime</fadetime>
- <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg" >$INFO[ListItem.Art(fanart)]</texture>
+ <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg">$INFO[ListItem.Art(fanart)]</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>395</posy>
+ <left>10</left>
+ <top>395</top>
<width>730</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="textbox">
<description>Description Value for Video</description>
- <posx>10</posx>
- <posy>425</posy>
+ <left>10</left>
+ <top>425</top>
<width>540</width>
<height>145</height>
<font>font12</font>
<autoscroll time="2000" delay="3000" repeat="5000">Skin.HasSetting(AutoScroll)</autoscroll>
</control>
<control type="image">
- <posx>560</posx>
- <posy>140</posy>
+ <left>560</left>
+ <top>140</top>
<width>180</width>
<height>440</height>
<aspectratio align="left" aligny="bottom">keep</aspectratio>
</control>
</control>
<control type="group">
- <posx>470</posx>
- <posy>70</posy>
+ <left>470</left>
+ <top>70</top>
<visible>Control.IsVisible(515) + Container.Content(Episodes)</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>420</height>
<aspectratio scalediffuse="false">scale</aspectratio>
<fadetime>IconCrossfadeTime</fadetime>
- <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg" >$INFO[ListItem.Art(fanart)]</texture>
+ <texture diffuse="Fanart_Diffuse.png" background="true" fallback="Fanart_Fallback_Small.jpg">$INFO[ListItem.Art(fanart)]</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>395</posy>
+ <left>10</left>
+ <top>395</top>
<width>400</width>
<height>30</height>
<font>font24_title</font>
</control>
<control type="textbox">
<description>Description Value for Video</description>
- <posx>10</posx>
- <posy>425</posy>
+ <left>10</left>
+ <top>425</top>
<width>400</width>
<height>105</height>
<font>font12</font>
</control>
<control type="grouplist">
<description>Media Codec Flagging Images</description>
- <posx>0</posx>
- <posy>540</posy>
+ <left>0</left>
+ <top>540</top>
<width>410</width>
<align>left</align>
<itemgap>2</itemgap>
<include>VideoTypeHackFlaggingConditions</include>
</control>
<control type="image">
- <posx>420</posx>
- <posy>140</posy>
+ <left>420</left>
+ <top>140</top>
<width>330</width>
<height>440</height>
<aspectratio align="left" aligny="bottom">keep</aspectratio>
<defaultcontrol>2</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>60</posy>
+ <left>240</left>
+ <top>60</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="group">
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>600</height>
<texture border="40">DialogBack2.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="4">
<description>No Settings Label</description>
- <posx>20</posx>
- <posy>180</posy>
+ <left>20</left>
+ <top>180</top>
<width>760</width>
<align>center</align>
<label>13389</label>
<font>font13</font>
</control>
<control type="list" id="2">
- <posx>40</posx>
- <posy>60</posy>
+ <left>40</left>
+ <top>60</top>
<width>720</width>
<height>495</height>
<onleft>60</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="45" width="720">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="45" width="720">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>720</width>
<height>40</height>
<texture border="5">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>700</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>760</posx>
- <posy>60</posy>
+ <left>760</left>
+ <top>60</top>
<width>25</width>
<height>495</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>760</posx>
- <posy>548</posy>
+ <right>760</right>
+ <top>548</top>
<width>300</width>
<height>35</height>
<font>font12</font>
<include>dialogeffect</include>
<controls>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture border="120,0,0,0">hint-overlay.png</texture>
</control>
<control type="image">
- <posx>120</posx>
- <posy>300</posy>
+ <left>120</left>
+ <top>300</top>
<width>64</width>
<height>64</height>
<texture>arrow-big-left.png</texture>
</control>
<control type="image">
- <posx>190</posx>
- <posy>100</posy>
+ <left>190</left>
+ <top>100</top>
<width>2</width>
<height>512</height>
<texture>separator_vertical.png</texture>
</control>
<control type="label">
- <posx>240</posx>
- <posy>150</posy>
+ <left>240</left>
+ <top>150</top>
<width>680</width>
<height>60</height>
<font>font35_title</font>
<label>31411</label>
</control>
<control type="textbox">
- <posx>240</posx>
- <posy>240</posy>
+ <left>240</left>
+ <top>240</top>
<width>680</width>
<height>250</height>
<font>font14</font>
</control>
<control type="button" id="100">
<description>OK button</description>
- <posx>720</posx>
- <posy>500</posy>
+ <left>720</left>
+ <top>500</top>
<width>200</width>
<height>40</height>
<label>12321</label>
<?xml version="1.0" encoding="UTF-8"?>
<includes>
<default type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<texture>-</texture>
<colorkey>0</colorkey>
</default>
<default type="label">
- <posx>80</posx>
- <posy>60</posy>
<label>-</label>
<font>font13</font>
<textcolor>white</textcolor>
<disabledcolor>grey3</disabledcolor>
</default>
<default type="fadelabel">
- <posx>80</posx>
- <posy>60</posy>
+ <left>80</left>
+ <top>60</top>
<font>font13</font>
<textcolor>white</textcolor>
<disabledcolor>grey3</disabledcolor>
</default>
<default type="button">
- <posx>300</posx>
- <posy>200</posy>
+ <left>300</left>
+ <top>200</top>
<width>300</width>
<height>42</height>
<texturefocus border="5">button-focus.png</texturefocus>
<pulseonselect>no</pulseonselect>
</default>
<default type="togglebutton">
- <posx>140</posx>
- <posy>167</posy>
+ <left>140</left>
+ <top>167</top>
<width>20</width>
<height>20</height>
<texturefocus>scroll-up-focus.png</texturefocus>
<pulseonselect>no</pulseonselect>
</default>
<default type="textbox">
- <posx>220</posx>
- <posy>220</posy>
+ <left>220</left>
+ <top>220</top>
<width>410</width>
<height>215</height>
<align>left</align>
<font>font13</font>
</default>
<default type="progress">
- <posx>100</posx>
- <posy>325</posy>
+ <left>100</left>
+ <top>325</top>
<texturebg border="6,0,6,0">OSDProgressBack.png</texturebg>
<lefttexture>-</lefttexture>
<midtexture border="6,0,6,0">OSDProgressMid.png</midtexture>
<overlaytexture>-</overlaytexture>
</default>
<default type="spincontrol">
- <posx>330</posx>
- <posy>126</posy>
+ <left>330</left>
+ <top>126</top>
<textureup>scroll-up-2.png</textureup>
<texturedown>scroll-down-2.png</texturedown>
<textureupfocus>scroll-up-focus-2.png</textureupfocus>
<pulseonselect>no</pulseonselect>
</default>
<default type="spincontrolex">
- <posx>530</posx>
- <posy>160</posy>
+ <left>530</left>
+ <top>160</top>
<width>300</width>
<height>42</height>
<spinwidth>33</spinwidth>
<pulseonselect>no</pulseonselect>
</default>
<default type="radiobutton">
- <posx>300</posx>
- <posy>200</posy>
+ <left>300</left>
+ <top>200</top>
<width>300</width>
<height>42</height>
<radiowidth>24</radiowidth>
<pulseonselect>no</pulseonselect>
</default>
<default type="selectbutton">
- <posx>490</posx>
- <posy>335</posy>
+ <left>490</left>
+ <top>335</top>
<width>300</width>
<height>50</height>
<label>-</label>
<disabledcolor>grey3</disabledcolor>
</default>
<default type="mover">
- <posx>60</posx>
- <posy>192</posy>
+ <left>60</left>
+ <top>192</top>
<texturefocus border="5">button-focus.png</texturefocus>
<texturenofocus border="5">button-nofocus.png</texturenofocus>
</default>
<default type="resize">
- <posx>60</posx>
- <posy>192</posy>
+ <left>60</left>
+ <top>192</top>
<texturefocus border="5">button-focus.png</texturefocus>
<texturenofocus border="5">button-nofocus.png</texturenofocus>
</default>
<default type="edit">
- <posx>300</posx>
- <posy>200</posy>
+ <left>300</left>
+ <top>200</top>
<width>300</width>
<height>42</height>
<texturefocus border="5">button-focus.png</texturefocus>
<?xml version="1.0" encoding="UTF-8"?>
<includes>
- <include file="defaults.xml" />
- <include file="ViewsVideoLibrary.xml" />
- <include file="ViewsMusicLibrary.xml" />
- <include file="ViewsFileMode.xml" />
- <include file="ViewsPictures.xml" />
- <include file="ViewsAddonBrowser.xml" />
- <include file="ViewsLiveTV.xml" />
- <include file="ViewsPVR.xml" />
- <include file="IncludesCodecFlagging.xml" />
- <include file="IncludesHomeRecentlyAdded.xml" />
- <include file="IncludesHomeMenuItems.xml" />
- <include file="IncludesBackgroundBuilding.xml" />
- <include file="weather\10DayForecast.xml" />
- <include file="weather\36HourForecast.xml" />
- <include file="weather\WeekendForecast.xml" />
- <include file="weather\HourlyForecast.xml" />
- <include file="weather\MapAlerts.xml" />
+ <include file="defaults.xml"/>
+ <include file="ViewsVideoLibrary.xml"/>
+ <include file="ViewsMusicLibrary.xml"/>
+ <include file="ViewsFileMode.xml"/>
+ <include file="ViewsPictures.xml"/>
+ <include file="ViewsAddonBrowser.xml"/>
+ <include file="ViewsLiveTV.xml"/>
+ <include file="ViewsPVR.xml"/>
+ <include file="IncludesCodecFlagging.xml"/>
+ <include file="IncludesHomeRecentlyAdded.xml"/>
+ <include file="IncludesHomeMenuItems.xml"/>
+ <include file="IncludesBackgroundBuilding.xml"/>
+ <include file="weather\10DayForecast.xml"/>
+ <include file="weather\36HourForecast.xml"/>
+ <include file="weather\WeekendForecast.xml"/>
+ <include file="weather\HourlyForecast.xml"/>
+ <include file="weather\MapAlerts.xml"/>
<constant name="FanartCrossfadeTime">500</constant>
<constant name="IconCrossfadeTime">400</constant>
<include name="BehindDialogFadeOut">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture>black-back.png</texture>
</control>
</include>
<include name="WindowTitleCommons">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width min="0" max="800">auto</width>
<height>30</height>
<font>font14</font>
<pulseonselect>false</pulseonselect>
</include>
<include name="HomeSubMenuCommonValues">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>35</height>
<align>center</align>
<animation effect="slide" start="-50,0" end="0,0" time="300" tween="quadratic" easing="out">WindowOpen</animation>
<control type="button" id="8999">
<description>Fake button for mouse control</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>250</width>
<height>720</height>
<label>-</label>
<visible>true</visible>
</control>
<control type="button" id="9001">
- <posx>250</posx>
- <posy>260</posy>
+ <left>250</left>
+ <top>260</top>
<width>42</width>
<height>128</height>
<font>-</font>
<texturenofocus>HasSub.png</texturenofocus>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>720</height>
<texture border="0,0,10,0">MediaBladeSub.png</texture>
</control>
<control type="image">
<description>LOGO</description>
- <posx>15</posx>
- <posy>0</posy>
+ <left>15</left>
+ <top>0</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
</include>
<include name="MainWindowMouseButtons">
<control type="group">
- <posx>120r</posx>
- <posy>55r</posy>
+ <left>120r</left>
+ <top>55r</top>
<animation effect="fade" time="250" condition="Window.Previous(Home)">WindowOpen</animation>
<animation effect="fade" time="250" condition="Window.Next(Home)">WindowClose</animation>
<visible>system.getbool(input.enablemouse)</visible>
<control type="button">
<description>Back push button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>45</width>
<height>45</height>
<label>1036</label>
</control>
<control type="image">
<description>Back Icon</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
</control>
<control type="button">
<description>Home push button</description>
- <posx>55</posx>
- <posy>0</posy>
+ <left>55</left>
+ <top>0</top>
<width>45</width>
<height>45</height>
<label>31003</label>
</control>
<control type="image">
<description>Home Icon</description>
- <posx>60</posx>
- <posy>5</posy>
+ <left>60</left>
+ <top>5</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<animation effect="fade" time="250" condition="Window.Next(Home)">WindowClose</animation>
<control type="button">
<description>push button</description>
- <posx>30</posx>
- <posy>55r</posy>
+ <left>30</left>
+ <top>55r</top>
<width>45</width>
<height>45</height>
<label>31003</label>
</control>
<control type="image">
<description>Player Icon</description>
- <posx>35</posx>
- <posy>50r</posy>
+ <left>35</left>
+ <top>50r</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_player.png</texture>
</control>
<control type="label">
- <posx>85</posx>
- <posy>53r</posy>
+ <left>85</left>
+ <top>53r</top>
<width>700</width>
<height>20</height>
<label>$INFO[Player.Title] - ([COLOR=blue]$INFO[Player.Time] / $INFO[Player.Duration,][/COLOR])</label>
<shadowcolor>black</shadowcolor>
</control>
<control type="label">
- <posx>85</posx>
- <posy>32r</posy>
+ <left>85</left>
+ <top>32r</top>
<width>700</width>
<height>20</height>
<label>$INFO[MusicPlayer.Artist]$INFO[MusicPlayer.Album, - ]</label>
<visible>Player.HasAudio</visible>
</control>
<control type="label">
- <posx>85</posx>
- <posy>30r</posy>
+ <left>85</left>
+ <top>30r</top>
<width>700</width>
<height>20</height>
<label>$INFO[VideoPlayer.Studio]</label>
<visible>Player.HasVideo + VideoPlayer.Content(Movies)</visible>
</control>
<control type="label">
- <posx>85</posx>
- <posy>30r</posy>
+ <left>85</left>
+ <top>30r</top>
<width>700</width>
<height>20</height>
<label>$INFO[VideoPlayer.TVShowTitle]</label>
<visible>Player.HasVideo + VideoPlayer.Content(Episodes)</visible>
</control>
<control type="label">
- <posx>85</posx>
- <posy>30r</posy>
+ <left>85</left>
+ <top>30r</top>
<width>700</width>
<height>20</height>
<label>$INFO[VideoPlayer.Artist]</label>
<visible>Player.HasVideo + VideoPlayer.Content(MusicVideos)</visible>
</control>
<control type="label">
- <posx>85</posx>
- <posy>30r</posy>
+ <left>85</left>
+ <top>30r</top>
<width>700</width>
<height>20</height>
<label>$INFO[VideoPlayer.ChannelName]$INFO[VideoPlayer.ChannelNumber, - ([COLOR=blue],[/COLOR])]</label>
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<control type="label">
<description>Page Count Label</description>
- <posx>40r</posx>
- <posy>53r</posy>
+ <right>40r</right>
+ <top>53r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
</control>
<control type="label">
<description>Container Duration Label</description>
- <posx>40r</posx>
- <posy>32r</posy>
+ <right>40r</right>
+ <top>32r</top>
<width>500</width>
<height>20</height>
<font>font12</font>
<include name="SmallMusicInfo">
<control type="image">
<description>gradient</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>165</height>
<colordiffuse>DDFFFFFF</colordiffuse>
</control>
<control type="image">
<description>Cover image</description>
- <posx>20</posx>
- <posy>17</posy>
+ <left>20</left>
+ <top>17</top>
<width>130</width>
<height>130</height>
<texture>$INFO[MusicPlayer.Cover]</texture>
</control>
<control type="label">
<description>Artist label</description>
- <posx>160</posx>
- <posy>20</posy>
+ <left>160</left>
+ <top>20</top>
<height>30</height>
<width>325</width>
<label>$INFO[MusicPlayer.Artist]</label>
</control>
<control type="fadelabel">
<description>Title label</description>
- <posx>160</posx>
- <posy>43</posy>
+ <left>160</left>
+ <top>43</top>
<height>30</height>
<width>325</width>
<label>$INFO[Player.Title]</label>
</control>
<control type="label">
<description>Album Label</description>
- <posx>160</posx>
- <posy>70</posy>
+ <left>160</left>
+ <top>70</top>
<height>30</height>
<width>325</width>
<label>$INFO[MusicPlayer.Album]$INFO[musicplayer.discnumber, - $LOCALIZE[427]:]</label>
</control>
<control type="label">
<description>Time Label</description>
- <posx>160</posx>
- <posy>95</posy>
+ <left>160</left>
+ <top>95</top>
<height>30</height>
<width>325</width>
<label>$INFO[MusicPlayer.Time]$INFO[MusicPlayer.Duration, / ]</label>
</control>
<control type="label">
<description>Next Label</description>
- <posx>485</posx>
- <posy>120</posy>
+ <right>485</right>
+ <top>120</top>
<height>30</height>
<width>325</width>
<label>[COLOR=blue]$LOCALIZE[209] :[/COLOR] $INFO[MusicPlayer.offset(1).Title]</label>
<include name="SmallVideoInfo">
<control type="image">
<description>gradient</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>500</width>
<height>165</height>
<colordiffuse>DDFFFFFF</colordiffuse>
</control>
<control type="image">
<description>Cover image</description>
- <posx>20</posx>
- <posy>17</posy>
+ <left>20</left>
+ <top>17</top>
<width>130</width>
<height>130</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Studio label</description>
- <posx>160</posx>
- <posy>20</posy>
+ <left>160</left>
+ <top>20</top>
<height>30</height>
<width>325</width>
<label>$INFO[VideoPlayer.Studio]</label>
</control>
<control type="label">
<description>TV Show Title label</description>
- <posx>160</posx>
- <posy>20</posy>
+ <left>160</left>
+ <top>20</top>
<height>30</height>
<width>325</width>
<label>$INFO[VideoPlayer.tvshowtitle]</label>
</control>
<control type="fadelabel">
<description>Music Video Artist label</description>
- <posx>160</posx>
- <posy>20</posy>
+ <left>160</left>
+ <top>20</top>
<height>30</height>
<width>325</width>
<label>$INFO[VideoPlayer.Artist]</label>
</control>
<control type="fadelabel">
<description>Title label</description>
- <posx>160</posx>
- <posy>43</posy>
+ <left>160</left>
+ <top>43</top>
<height>30</height>
<width>325</width>
<label>$INFO[Player.Title]</label>
</control>
<control type="label">
<description>Genre label</description>
- <posx>160</posx>
- <posy>70</posy>
+ <left>160</left>
+ <top>70</top>
<height>30</height>
<width>325</width>
<label>$INFO[VideoPlayer.Genre]</label>
<visible>!videoplayer.content(episodes) + !videoplayer.content(musicvideos)</visible>
</control>
<control type="label">
- <posx>160</posx>
- <posy>70</posy>
+ <left>160</left>
+ <top>70</top>
<height>30</height>
<width>325</width>
<label>$INFO[VideoPlayer.Album]</label>
</control>
<control type="label">
<description>Season and Episode label</description>
- <posx>160</posx>
- <posy>70</posy>
+ <left>160</left>
+ <top>70</top>
<height>30</height>
<width>325</width>
<label>$LOCALIZE[20373] $INFO[VideoPlayer.Season] - $LOCALIZE[20359] $INFO[VideoPlayer.episode]</label>
</control>
<control type="label">
<description>Time Label</description>
- <posx>160</posx>
- <posy>95</posy>
+ <left>160</left>
+ <top>95</top>
<height>30</height>
<width>325</width>
<label>$INFO[VideoPlayer.Time]$INFO[VideoPlayer.Duration, / ]</label>
<visible>VideoPlayer.Content(LiveTV)</visible>
<include>VisibleFadeEffect</include>
<control type="button" id="600">
- <posx>20</posx>
- <posy>2</posy>
+ <left>20</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Previous)</onclick>
</control>
<control type="button" id="601">
- <posx>60</posx>
- <posy>2</posy>
+ <left>60</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Next)</onclick>
</control>
<control type="button" id="603">
- <posx>100</posx>
- <posy>2</posy>
+ <left>100</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Stop)</onclick>
</control>
<control type="togglebutton" id="604">
- <posx>140</posx>
- <posy>2</posy>
+ <left>140</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<animation effect="fade" start="100" end="30" time="100" condition="!Player.PauseEnabled">Conditional</animation>
</control>
<control type="button" id="605">
- <posx>180</posx>
- <posy>2</posy>
+ <left>180</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<height>45</height>
<defaultcontrol always="true">603</defaultcontrol>
<control type="button" id="600">
- <posx>5</posx>
- <posy>2</posy>
+ <left>5</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Previous)</onclick>
</control>
<control type="button" id="606">
- <posx>45</posx>
- <posy>2</posy>
+ <left>45</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<control type="group">
<animation effect="slide" start="0,0" end="40,0" time="0" condition="Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo">Conditional</animation>
<control type="togglebutton" id="603">
- <posx>45</posx>
- <posy>2</posy>
+ <left>45</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Play)</onclick>
</control>
<control type="button" id="601">
- <posx>85</posx>
- <posy>2</posy>
+ <left>85</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<onclick>XBMC.PlayerControl(Stop)</onclick>
</control>
<control type="button" id="607">
- <posx>125</posx>
- <posy>2</posy>
+ <left>125</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<visible>Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo</visible>
</control>
<control type="button" id="602">
- <posx>125</posx>
- <posy>2</posy>
+ <left>125</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<control type="group">
<visible>!Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo</visible>
<control type="button" id="604">
- <posx>165</posx>
- <posy>2</posy>
+ <left>165</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<onback>50</onback>
</control>
<control type="image">
- <posx>165</posx>
- <posy>2</posy>
+ <left>165</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<texture>OSDRepeatNF.png</texture>
<visible>!Control.HasFocus(604)</visible>
</control>
<control type="image">
- <posx>165</posx>
- <posy>2</posy>
+ <left>165</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<texture>OSDRepeatFO.png</texture>
<visible>Control.HasFocus(604)</visible>
</control>
<control type="image">
- <posx>165</posx>
- <posy>2</posy>
+ <left>165</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<texture>OSDRepeatOneNF.png</texture>
<visible>!Control.HasFocus(604)</visible>
</control>
<control type="image">
- <posx>165</posx>
- <posy>2</posy>
+ <left>165</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<texture>OSDRepeatOneFO.png</texture>
<visible>Control.HasFocus(604)</visible>
</control>
<control type="image">
- <posx>165</posx>
- <posy>2</posy>
+ <left>165</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<texture>OSDRepeatAllNF.png</texture>
<visible>!Control.HasFocus(604)</visible>
</control>
<control type="image">
- <posx>165</posx>
- <posy>2</posy>
+ <left>165</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<texture>OSDRepeatAllFO.png</texture>
<visible>Control.HasFocus(604)</visible>
</control>
<control type="togglebutton" id="605">
- <posx>205</posx>
- <posy>2</posy>
+ <left>205</left>
+ <top>2</top>
<width>39</width>
<height>39</height>
<label>-</label>
<visible>Container.Scrolling + [StringCompare(Container.SortMethod,$LOCALIZE[551]) | StringCompare(Container.SortMethod,$LOCALIZE[561]) | StringCompare(Container.SortMethod,$LOCALIZE[558]) | StringCompare(Container.SortMethod,$LOCALIZE[557]) | StringCompare(Container.SortMethod,$LOCALIZE[556])]</visible>
<animation effect="slide" start="0,0" end="0,-60" time="100">Visible</animation>
<animation effect="slide" start="0,-60" end="0,0" delay="400" time="100">Hidden</animation>
- <posx>300r</posx>
- <posy>720</posy>
+ <left>300r</left>
+ <top>720</top>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>70</width>
<height>65</height>
<texture border="20,20,20,2">InfoMessagePanel.png</texture>
</control>
<control type="label">
- <posx>5</posx>
- <posy>0</posy>
+ <left>5</left>
+ <top>0</top>
<width>65</width>
<height>60</height>
<align>center</align>
<include name="Clock">
<control type="label">
<description>time label</description>
- <posx>20r</posx>
- <posy>5</posy>
+ <right>20r</right>
+ <top>5</top>
<width>200</width>
<height>30</height>
<align>right</align>
<include name="HomeAddonsCommonLayout">
<include>Window_OpenClose_Animation</include>
<animation type="Visible">
- <effect type="slide" start="0,30" end="0,0" delay="200" easing="out" tween="quadratic" time="200" />
- <effect type="fade" start="0" end="100" delay="200" time="200" />
+ <effect type="slide" start="0,30" end="0,0" delay="200" easing="out" tween="quadratic" time="200"/>
+ <effect type="fade" start="0" end="100" delay="200" time="200"/>
</animation>
<animation type="Hidden">
- <effect type="zoom" start="100" end="70" center="auto" easing="in" tween="quadratic" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="70" center="auto" easing="in" tween="quadratic" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
- <hitrect x="0" y="530" w="1280" h="120" />
- <posx>0</posx>
- <posy>190r</posy>
+ <hitrect x="0" y="530" w="1280" h="120"/>
+ <left>0</left>
+ <top>190r</top>
<width>1280</width>
<height>200</height>
<pagecontrol>-</pagecontrol>
<orientation>Horizontal</orientation>
<itemlayout height="200" width="182">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>180</width>
<height>120</height>
<aspectratio aligny="bottom">keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>120</posy>
+ <left>5</left>
+ <top>120</top>
<width>170</width>
<height>110</height>
<aspectratio aligny="top">keep</aspectratio>
<texture diffuse="diffuse_mirror2.png" flipy="true" background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>91</posx>
- <posy>125</posy>
+ <left>91</left>
+ <top>125</top>
<width>180</width>
<height>20</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="200" width="182">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>180</width>
<height>120</height>
<aspectratio aligny="bottom">keep</aspectratio>
<visible>!ControlGroup(9002).HasFocus</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>180</width>
<height>120</height>
<aspectratio aligny="bottom">keep</aspectratio>
<visible>ControlGroup(9002).HasFocus</visible>
</control>
<control type="image">
- <posx>5</posx>
- <posy>120</posy>
+ <left>5</left>
+ <top>120</top>
<width>170</width>
<height>110</height>
<aspectratio aligny="top">keep</aspectratio>
<texture diffuse="diffuse_mirror2.png" flipy="true" background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>91</posx>
- <posy>125</posy>
+ <left>91</left>
+ <top>125</top>
<width>180</width>
<height>20</height>
<font>font12</font>
<visible>Control.HasFocus(9002)</visible>
</control>
<control type="label">
- <posx>91</posx>
- <posy>125</posy>
+ <left>91</left>
+ <top>125</top>
<width>180</width>
<height>20</height>
<font>font12</font>
<include name="TVNextAiredListCommonLayout">
<itemlayout height="150" width="280">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>280</width>
<height>145</height>
<texture border="10">button-nofocus.png</texture>
</control>
<control type="image">
<description>Thumb</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>270</width>
<height>55</height>
<aspectratio>keep</aspectratio>
</control>
<control type="image">
<description>Banner</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>270</width>
<height>55</height>
<aspectratio>keep</aspectratio>
</control>
<control type="image">
<description>Logo</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>270</width>
<height>55</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Episode Number</description>
- <posx>140</posx>
- <posy>60</posy>
+ <left>140</left>
+ <top>60</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(NextNumber),$LOCALIZE[20359] [COLOR=blue]-[/COLOR] ]</label>
</control>
<control type="label">
<description>Episode Name</description>
- <posx>140</posx>
- <posy>80</posy>
+ <left>140</left>
+ <top>80</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(NextTitle)]</label>
</control>
<control type="label">
<description>Next air date/time</description>
- <posx>140</posx>
- <posy>100</posy>
+ <left>140</left>
+ <top>100</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(ShortTime)]$INFO[ListItem.Property(NextDate), [COLOR=blue]-[/COLOR] ]</label>
</control>
<control type="label">
<description>Duration</description>
- <posx>140</posx>
- <posy>120</posy>
+ <left>140</left>
+ <top>120</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(Runtime),, $LOCALIZE[12391]]$INFO[ListItem.Property(Network), [COLOR=blue]-[/COLOR] (,)]</label>
</itemlayout>
<focusedlayout height="150" width="280">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>280</width>
<height>145</height>
<texture border="10">button-focus2.png</texture>
</control>
<control type="image">
<description>Thumb</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>270</width>
<height>55</height>
<aspectratio>keep</aspectratio>
</control>
<control type="image">
<description>Banner</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>270</width>
<height>55</height>
<aspectratio>keep</aspectratio>
</control>
<control type="image">
<description>Logo</description>
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>270</width>
<height>55</height>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<description>Episode Number</description>
- <posx>140</posx>
- <posy>60</posy>
+ <left>140</left>
+ <top>60</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(NextNumber),$LOCALIZE[20359] [COLOR=blue]-[/COLOR] ]</label>
</control>
<control type="label">
<description>Episode Name</description>
- <posx>140</posx>
- <posy>80</posy>
+ <left>140</left>
+ <top>80</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(NextTitle)]</label>
</control>
<control type="label">
<description>Next air date/time</description>
- <posx>140</posx>
- <posy>100</posy>
+ <left>140</left>
+ <top>100</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(ShortTime)]$INFO[ListItem.Property(NextDate), [COLOR=blue]-[/COLOR] ]</label>
</control>
<control type="label">
<description>Duration</description>
- <posx>140</posx>
- <posy>120</posy>
+ <left>140</left>
+ <top>120</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Property(Runtime),, $LOCALIZE[12391]]$INFO[ListItem.Property(Network), [COLOR=blue]-[/COLOR] (,)]</label>
<control type="group">
<visible>!IsEmpty(Window(home).Property(TVGuide.BackgroundFanart))</visible>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<animation effect="fade" time="600">Hidden</animation>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<animation effect="fade" time="600">Hidden</animation>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<animation effect="fade" time="600">Hidden</animation>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<animation effect="fade" time="600">Hidden</animation>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<animation effect="fade" time="600">Hidden</animation>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
<animation effect="fade" time="600">Hidden</animation>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<aspectratio>scale</aspectratio>
</control>
</control>
<control type="image">
- <posx>0</posx>
- <posy>100r</posy>
+ <left>0</left>
+ <top>100r</top>
<width>1280</width>
<height>100</height>
<texture>floor.png</texture>
</control>
<control type="image">
<description>Section header image</description>
- <posx>20</posx>
- <posy>3</posy>
+ <left>20</left>
+ <top>3</top>
<width>35</width>
<height>35</height>
<aspectratio>keep</aspectratio>
<texture>icon_video.png</texture>
</control>
<control type="grouplist">
- <posx>65</posx>
- <posy>5</posy>
+ <left>65</left>
+ <top>5</top>
<width>1000</width>
<height>30</height>
<orientation>horizontal</orientation>
</control>
<control type="grouplist" id="2000">
<include>Window_OpenClose_Animation</include>
- <posx>40</posx>
- <posy>60</posy>
+ <left>40</left>
+ <top>60</top>
<width>1200</width>
<height>660</height>
<orientation>horizontal</orientation>
<width>300</width>
<height>660</height>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>592</posy>
+ <left>0</left>
+ <top>592</top>
<width>300</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>260</width>
<height>20</height>
<label>$LOCALIZE[11]</label>
<textcolor>white</textcolor>
</control>
<control type="panel" id="200">
- <posx>10</posx>
- <posy>40</posy>
+ <left>10</left>
+ <top>40</top>
<width>280</width>
<height>530</height>
<scrolltime>200</scrolltime>
<width>300</width>
<height>660</height>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>592</posy>
+ <left>0</left>
+ <top>592</top>
<width>300</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>260</width>
<height>20</height>
<label>$LOCALIZE[12]</label>
<textcolor>white</textcolor>
</control>
<control type="panel" id="201">
- <posx>10</posx>
- <posy>40</posy>
+ <left>10</left>
+ <top>40</top>
<width>280</width>
<height>530</height>
<scrolltime>200</scrolltime>
<width>300</width>
<height>660</height>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>592</posy>
+ <left>0</left>
+ <top>592</top>
<width>300</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>260</width>
<height>20</height>
<label>$LOCALIZE[13]</label>
<textcolor>white</textcolor>
</control>
<control type="panel" id="202">
- <posx>10</posx>
- <posy>40</posy>
+ <left>10</left>
+ <top>40</top>
<width>280</width>
<height>530</height>
<scrolltime>200</scrolltime>
<width>300</width>
<height>660</height>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>592</posy>
+ <left>0</left>
+ <top>592</top>
<width>300</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>260</width>
<height>20</height>
<label>$LOCALIZE[14]</label>
<textcolor>white</textcolor>
</control>
<control type="panel" id="203">
- <posx>10</posx>
- <posy>40</posy>
+ <left>10</left>
+ <top>40</top>
<width>280</width>
<height>530</height>
<scrolltime>200</scrolltime>
<width>300</width>
<height>660</height>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>592</posy>
+ <left>0</left>
+ <top>592</top>
<width>300</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>260</width>
<height>20</height>
<label>$LOCALIZE[15]</label>
<textcolor>white</textcolor>
</control>
<control type="panel" id="204">
- <posx>10</posx>
- <posy>40</posy>
+ <left>10</left>
+ <top>40</top>
<width>280</width>
<height>530</height>
<scrolltime>200</scrolltime>
<width>300</width>
<height>660</height>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>592</posy>
+ <left>0</left>
+ <top>592</top>
<width>300</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>260</width>
<height>20</height>
<label>$LOCALIZE[16]</label>
<textcolor>white</textcolor>
</control>
<control type="panel" id="205">
- <posx>10</posx>
- <posy>40</posy>
+ <left>10</left>
+ <top>40</top>
<width>280</width>
<height>530</height>
<scrolltime>200</scrolltime>
<width>300</width>
<height>660</height>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>300</width>
<height>600</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>592</posy>
+ <left>0</left>
+ <top>592</top>
<width>300</width>
<height>64</height>
<texture border="15">ContentPanelMirror.png</texture>
</control>
<control type="label">
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>260</width>
<height>20</height>
<label>$LOCALIZE[17]</label>
<textcolor>white</textcolor>
</control>
<control type="panel" id="206">
- <posx>10</posx>
- <posy>40</posy>
+ <left>10</left>
+ <top>40</top>
<width>280</width>
<height>530</height>
<scrolltime>200</scrolltime>
<include>Window_OpenClose_Animation</include>
<control type="image">
<description>left Arrow</description>
- <posx>10</posx>
- <posy>120</posy>
+ <left>10</left>
+ <top>120</top>
<width>30</width>
<height>40</height>
<texture>arrow-big-left.png</texture>
</control>
<control type="image">
<description>left Arrow</description>
- <posx>10</posx>
- <posy>170r</posy>
+ <left>10</left>
+ <top>170r</top>
<width>30</width>
<height>40</height>
<texture>arrow-big-left.png</texture>
</control>
<control type="image">
<description>right Arrow</description>
- <posx>1240</posx>
- <posy>120</posy>
+ <left>1240</left>
+ <top>120</top>
<width>30</width>
<height>40</height>
<texture>arrow-big-right.png</texture>
</control>
<control type="image">
<description>right Arrow</description>
- <posx>1240</posx>
- <posy>170r</posy>
+ <left>1240</left>
+ <top>170r</top>
<width>30</width>
<height>40</height>
<texture>arrow-big-right.png</texture>
<include>MainWindowMouseButtons</include>
<include>BehindDialogFadeOut</include>
<control type="group">
- <posx>-250</posx>
+ <left>-250</left>
<include>SideBladeLeft</include>
<control type="grouplist" id="9000">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>250</width>
<height>600</height>
<onleft>9000</onleft>
<defaultcontrol>10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>140</posy>
+ <left>240</left>
+ <top>140</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>420</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="2">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="3">
<description>List label</description>
- <posx>20</posx>
- <posy>65</posy>
+ <left>20</left>
+ <top>65</top>
<width>760</width>
<height>30</height>
<align>center</align>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="10">
- <posx>30</posx>
- <posy>105</posy>
+ <left>30</left>
+ <top>105</top>
<width>520</width>
<height>225</height>
<onup>9001</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<visible>!Control.HasFocus(10)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<visible>Control.hasfocus(14) | Control.HasFocus(10)</visible>
<texture border="5">button-focus2.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>552</posx>
- <posy>105</posy>
+ <left>552</left>
+ <top>105</top>
<width>25</width>
<height>225</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="group" id="9000">
- <posx>580</posx>
- <posy>105</posy>
+ <left>580</left>
+ <top>105</top>
<control type="button" id="11">
<description>Change Set Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="button" id="13">
<description>Add Button</description>
- <posx>0</posx>
- <posy>45</posy>
+ <left>0</left>
+ <top>45</top>
<width>200</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="button" id="14">
<description>Remove Button</description>
- <posx>0</posx>
- <posy>90</posy>
+ <left>0</left>
+ <top>90</top>
<width>200</width>
<height>40</height>
<font>font12_title</font>
<control type="group" id="9001">
<control type="button" id="18">
<description>Ok Button</description>
- <posx>200</posx>
- <posy>355</posy>
+ <left>200</left>
+ <top>355</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="19">
<description>Cancel Button</description>
- <posx>410</posx>
- <posy>355</posy>
+ <left>410</left>
+ <top>355</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<defaultcontrol>10</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>240</posx>
- <posy>140</posy>
+ <left>240</left>
+ <top>140</top>
</coordinates>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>800</width>
<height>420</height>
<texture border="40">DialogBack.png</texture>
</control>
<control type="image">
<description>Dialog Header image</description>
- <posx>40</posx>
- <posy>16</posy>
+ <left>40</left>
+ <top>16</top>
<width>720</width>
<height>40</height>
<texture>dialogheader.png</texture>
</control>
<control type="label" id="2">
<description>header label</description>
- <posx>40</posx>
- <posy>20</posy>
+ <left>40</left>
+ <top>20</top>
<width>720</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>710</posx>
- <posy>15</posy>
+ <left>710</left>
+ <top>15</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="label" id="3">
<description>List label</description>
- <posx>20</posx>
- <posy>65</posy>
+ <left>20</left>
+ <top>65</top>
<width>760</width>
<height>30</height>
<align>center</align>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="10">
- <posx>30</posx>
- <posy>105</posy>
+ <left>30</left>
+ <top>105</top>
<width>520</width>
<height>225</height>
<onup>9001</onup>
<scrolltime>200</scrolltime>
<itemlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="45">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<visible>!Control.HasFocus(10)</visible>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>520</width>
<height>40</height>
<visible>Control.hasfocus(14) | Control.HasFocus(10)</visible>
<texture border="5">button-focus2.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>500</width>
<height>40</height>
<font>font13</font>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
- <posx>552</posx>
- <posy>105</posy>
+ <left>552</left>
+ <top>105</top>
<width>25</width>
<height>225</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<orientation>vertical</orientation>
</control>
<control type="group" id="9000">
- <posx>580</posx>
- <posy>105</posy>
+ <left>580</left>
+ <top>105</top>
<control type="button" id="11">
<description>Change Set Button</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>200</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="button" id="13">
<description>Add Button</description>
- <posx>0</posx>
- <posy>45</posy>
+ <left>0</left>
+ <top>45</top>
<width>200</width>
<height>40</height>
<font>font12_title</font>
</control>
<control type="button" id="14">
<description>Remove Button</description>
- <posx>0</posx>
- <posy>90</posy>
+ <left>0</left>
+ <top>90</top>
<width>200</width>
<height>40</height>
<font>font12_title</font>
<control type="group" id="9001">
<control type="button" id="18">
<description>Ok Button</description>
- <posx>200</posx>
- <posy>355</posy>
+ <left>200</left>
+ <top>355</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
<control type="button" id="19">
<description>Cancel Button</description>
- <posx>410</posx>
- <posy>355</posy>
+ <left>410</left>
+ <top>355</top>
<width>200</width>
<height>40</height>
<align>center</align>
</control>
</control>
</controls>
-</window>
\ No newline at end of file
+</window>
<?xml version="1.0" encoding="UTF-8"?>
<window>
<allowoverlay>no</allowoverlay>
- <defaultcontrol always="false">101</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>680</posx>
- <posy>0</posy>
+ <left>680</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="group">
<animation effect="slide" start="0,0" end="600,0" time="200" tween="quadratic" easing="out">WindowClose</animation>
<control type="image">
<description>media info background image</description>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>720</height>
<colordiffuse>BBFFFFFF</colordiffuse>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>20</posx>
- <posy>0</posy>
+ <left>20</left>
+ <top>0</top>
<width>64</width>
<height>32</height>
<label>-</label>
<onclick>PreviousMenu</onclick>
<texturefocus>DialogCloseButton-focus.png</texturefocus>
<texturenofocus>DialogCloseButton.png</texturenofocus>
- <onleft>101</onleft>
- <onright>101</onright>
- <onup>101</onup>
- <ondown>101</ondown>
<visible>system.getbool(input.enablemouse)</visible>
</control>
<control type="label">
<description>header label</description>
- <posx>580</posx>
- <posy>30</posy>
+ <right>580</right>
+ <top>30</top>
<width>550</width>
<height>30</height>
<font>font30_title</font>
</control>
<control type="label">
<description>Artist label</description>
- <posx>580</posx>
- <posy>60</posy>
+ <right>580</right>
+ <top>60</top>
<width>550</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="label">
<description>Song label</description>
- <posx>580</posx>
- <posy>85</posy>
+ <right>580</right>
+ <top>85</top>
<width>550</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="image">
- <posx>30</posx>
- <posy>120</posy>
+ <left>30</left>
+ <top>120</top>
<width>550</width>
<height>4</height>
<texture>separator.png</texture>
</control>
- <!-- ** Required ** Do not change <id> or <type> (Text box for lyrics) -->
- <control type="textbox" id="100">
- <description>textarea</description>
- <posx>30</posx>
- <posy>130</posy>
- <width>550</width>
- <height>500</height>
- <align>center</align>
- <font>font13</font>
- <textcolor>white</textcolor>
- <shadowcolor>black</shadowcolor>
- <pagecontrol>101</pagecontrol>
- </control>
- <control type="spincontrol" id="101">
- <description>Next page button</description>
- <posx>520</posx>
- <posy>650</posy>
- <subtype>page</subtype>
- <font>font12</font>
- <onleft>101</onleft>
- <onright>101</onright>
- <ondown>101</ondown>
- <onup>101</onup>
- <textcolor>blue</textcolor>
- <showonepage>true</showonepage>
- <visible>Control.IsVisible(100)</visible>
- </control>
<!-- ** Required ** Do not change <id> or <type> (Smooth scrolling list for lyrics) -->
<control type="list" id="110">
- <posx>30</posx>
- <posy>130</posy>
+ <left>30</left>
+ <top>130</top>
<width>550</width>
<height>500</height>
<onleft>111</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="25">
<control type="label">
- <posx>275</posx>
- <posy>0</posy>
+ <left>275</left>
+ <top>0</top>
<width>550</width>
<height>25</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="25">
<control type="label">
- <posx>275</posx>
- <posy>0</posy>
+ <left>275</left>
+ <top>0</top>
<width>550</width>
<height>25</height>
<font>font13</font>
<visible>!Control.HasFocus(110)</visible>
</control>
<control type="label">
- <posx>275</posx>
- <posy>0</posy>
+ <left>275</left>
+ <top>0</top>
<width>550</width>
<height>25</height>
<font>font13</font>
</control>
<control type="spincontrol" id="111">
<description>Next page button</description>
- <posx>520</posx>
- <posy>650</posy>
+ <left>520</left>
+ <top>650</top>
<subtype>page</subtype>
<font>font12</font>
<onleft>110</onleft>
</control>
<control type="label" id="2">
<description>Pick label</description>
- <posx>30</posx>
- <posy>130</posy>
+ <left>30</left>
+ <top>130</top>
<width>550</width>
<height>30</height>
<align>center</align>
<font>font13_title</font>
<label>31203</label>
<textcolor>white</textcolor>
- <visible>Control.IsVisible(120) + ![Control.IsVisible(100) | Control.IsVisible(110)]</visible>
+ <visible>Control.IsVisible(120) + !Control.IsVisible(110)</visible>
</control>
<!-- ** Required ** Do not change <id> or <type> (Song Chooser if it gets it wrong) -->
<control type="list" id="120">
- <posx>30</posx>
- <posy>170</posy>
+ <left>30</left>
+ <top>170</top>
<width>550</width>
<height>440</height>
<onleft>121</onleft>
<animation effect="slide" start="0,0" end="20,0" time="0" condition="!Control.IsVisible(121)">Conditional</animation>
<itemlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>41</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>530</width>
<height>40</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="40">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>41</height>
<visible>!Control.HasFocus(120)</visible>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>550</width>
<height>41</height>
<visible>Control.HasFocus(120)</visible>
<texture border="5">MenuItemFO.png</texture>
</control>
<control type="label">
- <posx>10</posx>
- <posy>0</posy>
+ <left>10</left>
+ <top>0</top>
<width>530</width>
<height>40</height>
<font>font13</font>
</control>
<control type="spincontrol" id="121">
<description>Next page button</description>
- <posx>520</posx>
- <posy>650</posy>
+ <left>520</left>
+ <top>650</top>
<subtype>page</subtype>
<font>font12</font>
<onleft>120</onleft>
<visible>Control.IsVisible(120)</visible>
</control>
<control type="image">
- <posx>30</posx>
- <posy>640</posy>
+ <left>30</left>
+ <top>640</top>
<width>550</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
<description>Scraper label</description>
- <posx>580</posx>
- <posy>680</posy>
+ <right>580</right>
+ <top>680</top>
<width>550</width>
<height>30</height>
<label>$LOCALIZE[31205] - $INFO[Control.GetLabel(200)]</label>
<defaultcontrol>9000</defaultcontrol>
<coordinates>
<system>1</system>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
</coordinates>
<controls>
<control type="group" id="100">
<include>VisibleFadeEffect</include>
<!-- control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(111).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(111)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(121).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(121)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(131).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(131)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(141).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(141)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(151).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(151)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(161).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(161)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(171).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(171)</visible>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture background="true">$INFO[Container(181).ListItem.Property(Fanart_Image)]</texture>
<visible>Control.HasFocus(181)</visible>
</control -->
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>1280</width>
<height>720</height>
<texture>black-back.png</texture>
<animation effect="fade" time="200">WindowClose</animation>
</control>
<control type="group">
- <posx>90</posx>
- <posy>30</posy>
+ <left>90</left>
+ <top>30</top>
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>1090</width>
<height>630</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>1090</width>
<height>630</height>
<texture border="15">ContentPanel.png</texture>
</control>
<control type="button">
<description>Close Window button</description>
- <posx>980</posx>
- <posy>11</posy>
+ <left>980</left>
+ <top>11</top>
<width>64</width>
<height>32</height>
<label>-</label>
</control>
<control type="image">
<description>LOGO</description>
- <posx>30</posx>
- <posy>10</posy>
+ <left>30</left>
+ <top>10</top>
<width>220</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>Confluence_Logo.png</texture>
</control>
<control type="list" id="9000">
- <posx>10</posx>
- <posy>80</posy>
+ <left>10</left>
+ <top>80</top>
<width>260</width>
<height>540</height>
<onleft>9010</onleft>
<scrolltime>300</scrolltime>
<itemlayout height="60" width="260">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>61</height>
<texture border="5">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>250</posx>
- <posy>4</posy>
+ <left>250</left>
+ <top>4</top>
<width>380</width>
<height>25</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>250</posx>
- <posy>32</posy>
+ <left>250</left>
+ <top>32</top>
<width>870</width>
<height>20</height>
<font>font13</font>
</itemlayout>
<focusedlayout height="60" width="260">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>260</width>
<height>61</height>
<texture border="5">MenuItemFO.png</texture>
<animation effect="fade" start="100" end="50" time="100" condition="!Control.HasFocus(9000)">Conditional</animation>
</control>
<control type="label">
- <posx>250</posx>
- <posy>4</posy>
+ <left>250</left>
+ <top>4</top>
<width>380</width>
<height>25</height>
<font>font24_title</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="label">
- <posx>250</posx>
- <posy>32</posy>
+ <left>250</left>
+ <top>32</top>
<width>870</width>
<height>20</height>
<font>font13</font>
</content>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>790</width>
<height>618</height>
<texture border="5">black-back2.png</texture>
</control>
<control type="image">
- <posx>268</posx>
- <posy>10</posy>
+ <left>268</left>
+ <top>10</top>
<width>804</width>
<height>100</height>
<aspectratio>stretch</aspectratio>
</control>
<control type="label">
<description>header label Finished Searching</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>740</width>
<height>30</height>
<font>font16</font>
</control>
<control type="label">
<description>header Label Still Searching</description>
- <posx>300</posx>
- <posy>20</posy>
+ <left>300</left>
+ <top>20</top>
<width>740</width>
<height>30</height>
<font>font16</font>
</control>
<control type="label" id="190">
<!-- Hide this Control off the screen because we use the label above instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
</control>
<control type="label" id="191">
<!-- Hide this Control off the screen because we use the label above instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<font>-</font>
</control>
<control type="label" id="199">
- <posx>40</posx>
- <posy>358</posy>
+ <left>40</left>
+ <top>358</top>
<width>1200</width>
<height>20</height>
<label>[B]$LOCALIZE[284][/B]</label>
</control>
<control type="group">
<animation type="WindowOpen" reversible="false">
- <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300" />
- <effect type="fade" start="0" end="100" time="300" />
+ <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/>
+ <effect type="fade" start="0" end="100" time="300"/>
</animation>
<animation type="WindowClose" reversible="false">
- <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300" />
- <effect type="fade" start="100" end="0" time="300" />
+ <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/>
+ <effect type="fade" start="100" end="0" time="300"/>
</animation>
- <posx>380</posx>
- <posy>90</posy>
+ <left>380</left>
+ <top>90</top>
<control type="button" id="198">
<!-- Hide this button off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>10</width>
<height>10</height>
<label>-</label>
</control>
<control type="group" id="101">
<control type="group" id="119">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="110">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<control type="panel" id="111">
<visible>Container(9000).HasFocus(1)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>118</pagecontrol>
<itemlayout width="375" height="130">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>125</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>80</width>
<height>115</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>70</posy>
+ <left>50</left>
+ <top>70</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>100</posx>
- <posy>10</posy>
+ <left>100</left>
+ <top>10</top>
<width>265</width>
<height>12</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>100</posx>
- <posy>30</posy>
+ <left>100</left>
+ <top>30</top>
<width>265</width>
<height>15</height>
<label>$INFO[ListItem.Property(Year),, - ]$INFO[ListItem.Property(Duration),, $LOCALIZE[12391]]</label>
<visible>!SubString(ListItem.Property(Duration),min)</visible>
</control>
<control type="label">
- <posx>100</posx>
- <posy>30</posy>
+ <left>100</left>
+ <top>30</top>
<width>265</width>
<height>15</height>
<label>$INFO[ListItem.Property(Year),, - ]$INFO[ListItem.Property(Duration)]</label>
<visible>SubString(ListItem.Property(Duration),min)</visible>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>45</posy>
+ <left>100</left>
+ <top>45</top>
<width>265</width>
<height>75</height>
<label>$INFO[ListItem.Property(Tagline)]</label>
<textcolor>white</textcolor>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>45</posy>
+ <left>100</left>
+ <top>45</top>
<width>265</width>
<height>75</height>
<label>$INFO[ListItem.Property(PlotOutline)]</label>
<visible>IsEmpty(ListItem.Property(TagLine))</visible>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>45</posy>
+ <left>100</left>
+ <top>45</top>
<width>265</width>
<height>75</height>
<label>$INFO[ListItem.Property(Plot)]</label>
</itemlayout>
<focusedlayout width="375" height="130">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>125</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>80</width>
<height>115</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>50</posx>
- <posy>70</posy>
+ <left>50</left>
+ <top>70</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>100</posx>
- <posy>10</posy>
+ <left>100</left>
+ <top>10</top>
<width>265</width>
<height>12</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>100</posx>
- <posy>30</posy>
+ <left>100</left>
+ <top>30</top>
<width>265</width>
<height>15</height>
<label>$INFO[ListItem.Property(Year),, - ]$INFO[ListItem.Property(Duration),, $LOCALIZE[12391]]</label>
<visible>!SubString(ListItem.Property(Duration),min)</visible>
</control>
<control type="label">
- <posx>100</posx>
- <posy>30</posy>
+ <left>100</left>
+ <top>30</top>
<width>265</width>
<height>15</height>
<label>$INFO[ListItem.Property(Year),, - ]$INFO[ListItem.Property(Duration)]</label>
<visible>SubString(ListItem.Property(Duration),min)</visible>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>45</posy>
+ <left>100</left>
+ <top>45</top>
<width>265</width>
<height>75</height>
<label>$INFO[ListItem.Property(Tagline)]</label>
<textcolor>white</textcolor>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>45</posy>
+ <left>100</left>
+ <top>45</top>
<width>265</width>
<height>75</height>
<label>$INFO[ListItem.Property(PlotOutline)]</label>
<visible>IsEmpty(ListItem.Property(TagLine))</visible>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>45</posy>
+ <left>100</left>
+ <top>45</top>
<width>265</width>
<height>75</height>
<label>$INFO[ListItem.Property(Plot)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="118">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
</control>
<control type="group" id="129">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="120">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<control type="panel" id="121">
<visible>Container(9000).HasFocus(2)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>128</pagecontrol>
<itemlayout width="375" height="175">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>170</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>360</width>
<height>65</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>330</posx>
- <posy>70</posy>
+ <left>330</left>
+ <top>70</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>187</posx>
- <posy>75</posy>
+ <left>187</left>
+ <top>75</top>
<width>360</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>187</posx>
- <posy>95</posy>
+ <left>187</left>
+ <top>95</top>
<width>360</width>
<height>15</height>
<label>$INFO[ListItem.Property(Premiered)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>5</posx>
- <posy>110</posy>
+ <left>5</left>
+ <top>110</top>
<width>360</width>
<height>55</height>
<label>$INFO[ListItem.Property(Plot)]</label>
</itemlayout>
<focusedlayout width="375" height="175">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>170</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>360</width>
<height>65</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>330</posx>
- <posy>70</posy>
+ <left>330</left>
+ <top>70</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>187</posx>
- <posy>75</posy>
+ <left>187</left>
+ <top>75</top>
<width>360</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>187</posx>
- <posy>95</posy>
+ <left>187</left>
+ <top>95</top>
<width>360</width>
<height>15</height>
<label>$INFO[ListItem.Property(Premiered)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>5</posx>
- <posy>110</posy>
+ <left>5</left>
+ <top>110</top>
<width>360</width>
<height>55</height>
<label>$INFO[ListItem.Property(Plot)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="128">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group" id="139">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="130">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<control type="panel" id="131">
<visible>Container(9000).HasFocus(3)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>138</pagecontrol>
<itemlayout width="375" height="130">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>125</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>80</width>
<height>115</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>100</posx>
- <posy>10</posy>
+ <left>100</left>
+ <top>10</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Label]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>30</posy>
+ <left>100</left>
+ <top>30</top>
<width>260</width>
<height>120</height>
<label>$INFO[ListItem.Property(TvShowTitle)]</label>
</itemlayout>
<focusedlayout width="375" height="130">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>125</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>80</width>
<height>115</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>100</posx>
- <posy>10</posy>
+ <left>100</left>
+ <top>10</top>
<width>260</width>
<height>15</height>
<label>$INFO[ListItem.Label]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>100</posx>
- <posy>30</posy>
+ <left>100</left>
+ <top>30</top>
<width>260</width>
<height>120</height>
<label>$INFO[ListItem.Property(TvShowTitle)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="138">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group" id="149">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="140">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
</control>
<control type="panel" id="141">
<visible>Container(9000).HasFocus(4)</visible>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>148</pagecontrol>
<itemlayout width="750" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>101</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>150</width>
<height>90</height>
<aspectratio>scale</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>120</posx>
- <posy>70</posy>
+ <left>120</left>
+ <top>70</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>160</posx>
- <posy>10</posy>
+ <left>160</left>
+ <top>10</top>
<width>585</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>160</posx>
- <posy>30</posy>
+ <left>160</left>
+ <top>30</top>
<width>585</width>
<height>15</height>
<label>$INFO[ListItem.Property(TvShowTitle)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>160</posx>
- <posy>50</posy>
+ <left>160</left>
+ <top>50</top>
<width>585</width>
<height>45</height>
<label>$INFO[ListItem.Property(Plot)]</label>
</itemlayout>
<focusedlayout width="750" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>101</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>150</width>
<height>90</height>
<aspectratio>scale</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>120</posx>
- <posy>70</posy>
+ <left>120</left>
+ <top>70</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>160</posx>
- <posy>10</posy>
+ <left>160</left>
+ <top>10</top>
<width>585</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>160</posx>
- <posy>30</posy>
+ <left>160</left>
+ <top>30</top>
<width>585</width>
<height>15</height>
<label>$INFO[ListItem.Property(TvShowTitle)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>160</posx>
- <posy>50</posy>
+ <left>160</left>
+ <top>50</top>
<width>585</width>
<height>45</height>
<label>$INFO[ListItem.Property(Plot)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="148">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group" id="159">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="150">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<control type="panel" id="151">
<visible>Container(9000).HasFocus(5)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>158</pagecontrol>
<itemlayout width="375" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>101</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>120</width>
<height>90</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>100</posx>
- <posy>65</posy>
+ <left>100</left>
+ <top>65</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>135</posx>
- <posy>10</posy>
+ <left>135</left>
+ <top>10</top>
<width>230</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>135</posx>
- <posy>30</posy>
+ <left>135</left>
+ <top>30</top>
<width>230</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>135</posx>
- <posy>55</posy>
+ <left>135</left>
+ <top>55</top>
<width>230</width>
<height>15</height>
<label>$INFO[ListItem.Property(Year)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>135</posx>
- <posy>75</posy>
+ <left>135</left>
+ <top>75</top>
<width>230</width>
<height>15</height>
<label>$INFO[ListItem.Property(Duration)]</label>
</itemlayout>
<focusedlayout width="375" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>101</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>120</width>
<height>90</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="image">
- <posx>100</posx>
- <posy>65</posy>
+ <left>100</left>
+ <top>65</top>
<width>30</width>
<height>30</height>
<texture>OverlayWatched.png</texture>
<visible>IntegerGreaterThan(ListItem.Property(PlayCount),0)</visible>
</control>
<control type="label">
- <posx>135</posx>
- <posy>10</posy>
+ <left>135</left>
+ <top>10</top>
<width>230</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>135</posx>
- <posy>30</posy>
+ <left>135</left>
+ <top>30</top>
<width>230</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>135</posx>
- <posy>55</posy>
+ <left>135</left>
+ <top>55</top>
<width>230</width>
<height>15</height>
<label>$INFO[ListItem.Property(Year)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>135</posx>
- <posy>75</posy>
+ <left>135</left>
+ <top>75</top>
<width>230</width>
<height>15</height>
<label>$INFO[ListItem.Property(Duration)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="158">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group" id="169">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="160">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<control type="panel" id="161">
<visible>Container(9000).HasFocus(6)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>168</pagecontrol>
<itemlayout width="750" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>101</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>150</width>
<height>90</height>
<aspectratio>keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>160</posx>
- <posy>10</posy>
+ <left>160</left>
+ <top>10</top>
<width>580</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>160</posx>
- <posy>30</posy>
+ <left>160</left>
+ <top>30</top>
<width>585</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist_Genre)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>160</posx>
- <posy>50</posy>
+ <left>160</left>
+ <top>50</top>
<width>585</width>
<height>45</height>
<label>$INFO[ListItem.Property(Artist_Description)]</label>
</itemlayout>
<focusedlayout width="400" height="110">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>101</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>150</width>
<height>90</height>
<aspectratio>keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>160</posx>
- <posy>10</posy>
+ <left>160</left>
+ <top>10</top>
<width>580</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>160</posx>
- <posy>30</posy>
+ <left>160</left>
+ <top>30</top>
<width>585</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist_Genre)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>160</posx>
- <posy>50</posy>
+ <left>160</left>
+ <top>50</top>
<width>585</width>
<height>45</height>
<label>$INFO[ListItem.Property(Artist_Description)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="168">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group" id="179">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="170">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<control type="panel" id="171">
<visible>Container(9000).HasFocus(7)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>178</pagecontrol>
<itemlayout width="750" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>101</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>100</width>
<height>90</height>
<aspectratio>keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>110</posx>
- <posy>10</posy>
+ <left>110</left>
+ <top>10</top>
<width>630</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>30</posy>
+ <left>110</left>
+ <top>30</top>
<width>630</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>110</posx>
- <posy>50</posy>
+ <left>110</left>
+ <top>50</top>
<width>630</width>
<height>45</height>
<label>$INFO[ListItem.Property(Album_Description)]</label>
</itemlayout>
<focusedlayout width="400" height="110">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>101</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>100</width>
<height>90</height>
<aspectratio>keep</aspectratio>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>110</posx>
- <posy>10</posy>
+ <left>110</left>
+ <top>10</top>
<width>630</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>30</posy>
+ <left>110</left>
+ <top>30</top>
<width>630</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist)]</label>
<aligny>center</aligny>
</control>
<control type="textbox">
- <posx>110</posx>
- <posy>50</posy>
+ <left>110</left>
+ <top>50</top>
<width>630</width>
<height>45</height>
<label>$INFO[ListItem.Property(Album_Description)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="178">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
</control>
</control>
<control type="group" id="189">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<control type="label" id="180">
<!-- Hide this Control off the screen because we use the list above to pass to it instead -->
- <posx>2000</posx>
- <posy>2000</posy>
+ <left>2000</left>
+ <top>2000</top>
<width>100</width>
<height>0</height>
<label>-</label>
<control type="panel" id="181">
<visible>Container(9000).HasFocus(8)</visible>
<include>VisibleFadeEffect</include>
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>750</width>
<height>530</height>
<onleft>9000</onleft>
<pagecontrol>188</pagecontrol>
<itemlayout width="375" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>101</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>90</width>
<height>90</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>110</posx>
- <posy>10</posy>
+ <left>110</left>
+ <top>10</top>
<width>255</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>30</posy>
+ <left>110</left>
+ <top>30</top>
<width>255</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>50</posy>
+ <left>110</left>
+ <top>50</top>
<width>255</width>
<height>15</height>
<label>$INFO[ListItem.Property(Genre)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>75</posy>
+ <left>110</left>
+ <top>75</top>
<width>255</width>
<height>15</height>
<label>$INFO[ListItem.Property(Duration)]</label>
</itemlayout>
<focusedlayout width="375" height="106">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>370</width>
<height>101</height>
<texture border="5">button-focus2.png</texture>
</control>
<control type="image">
- <posx>5</posx>
- <posy>5</posy>
+ <left>5</left>
+ <top>5</top>
<width>90</width>
<height>90</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
</control>
<control type="label">
- <posx>110</posx>
- <posy>10</posy>
+ <left>110</left>
+ <top>10</top>
<width>255</width>
<height>15</height>
<label>[B]$INFO[ListItem.Label][/B]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>30</posy>
+ <left>110</left>
+ <top>30</top>
<width>255</width>
<height>15</height>
<label>$INFO[ListItem.Property(Artist)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>50</posy>
+ <left>110</left>
+ <top>50</top>
<width>255</width>
<height>15</height>
<label>$INFO[ListItem.Property(Genre)]</label>
<aligny>center</aligny>
</control>
<control type="label">
- <posx>110</posx>
- <posy>75</posy>
+ <left>110</left>
+ <top>75</top>
<width>255</width>
<height>15</height>
<label>$INFO[ListItem.Property(Duration)]</label>
</focusedlayout>
</control>
<control type="scrollbar" id="188">
- <posx>770</posx>
- <posy>0</posy>
+ <left>770</left>
+ <top>0</top>
<width>25</width>
<height>530</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
</control>
<control type="label">
<description>number of files/pages in list text label</description>
- <posx>750</posx>
- <posy>530</posy>
+ <right>750</right>
+ <top>530</top>
<width>500</width>
<height>35</height>
<font>font12</font>
<include>VisibleFadeEffect</include>
<control type="label">
<description>header label</description>
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>610</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="51">
- <posx>15</posx>
- <posy>60</posy>
+ <left>15</left>
+ <top>60</top>
<width>600</width>
<height>541</height>
<onleft>9000</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="135" width="600">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,5,0,5">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>100</width>
<height>120</height>
<font>font12</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>110</posx>
- <posy>5</posy>
+ <left>110</left>
+ <top>5</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.Thumb]</texture>
</control>
<control type="label">
- <posx>590</posx>
- <posy>0</posy>
+ <left>590</left>
+ <top>0</top>
<width>390</width>
<height>70</height>
<font>font12</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>590</width>
<height>50</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="135" width="600">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="10">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>100</width>
<height>120</height>
<font>font12</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>110</posx>
- <posy>5</posy>
+ <left>110</left>
+ <top>5</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.Thumb]</texture>
</control>
<control type="label">
- <posx>590</posx>
- <posy>0</posy>
+ <left>590</left>
+ <top>0</top>
<width>390</width>
<height>70</height>
<font>font12</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>590</width>
<height>50</height>
<font>font12</font>
</content>
</control>
<control type="scrollbar" id="61">
- <posx>615</posx>
- <posy>60</posy>
+ <left>615</left>
+ <top>60</top>
<width>25</width>
<height>540</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>number of files/pages</description>
- <posx>660</posx>
- <posy>627</posy>
+ <right>660</right>
+ <top>627</top>
<width>570</width>
<font>font12</font>
<align>right</align>
<include>VisibleFadeEffect</include>
<control type="button" id="997">
<description>Hidden Button for focus</description>
- <posx>-600</posx>
- <posy>-20</posy>
+ <left>-600</left>
+ <top>-20</top>
<width>1</width>
<height>1</height>
<texturenofocus>-</texturenofocus>
</control>
<control type="label">
<description>header label</description>
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>610</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="label">
- <posx>0</posx>
- <posy>200</posy>
+ <left>0</left>
+ <top>200</top>
<width>600</width>
<height>30</height>
<font>font13</font>
<visible>IsEmpty(Window.Property(36Hour.IsFetched))</visible>
</control>
<control type="group">
- <posx>20</posx>
- <posy>50</posy>
+ <left>20</left>
+ <top>50</top>
<visible>!IsEmpty(Window.Property(36Hour.IsFetched))</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<control type="label">
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>600</width>
<height>30</height>
<font>font13_title</font>
<label>$INFO[Window.Property(36Hour.1.Heading)]</label>
</control>
<control type="image">
- <posx>0</posx>
- <posy>10</posy>
+ <left>0</left>
+ <top>10</top>
<width>120</width>
<height>110</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Window.Property(36Hour.1.OutlookIcon)]</texture>
</control>
<control type="label">
- <posx>120</posx>
- <posy>40</posy>
+ <left>120</left>
+ <top>40</top>
<width>100</width>
<height>40</height>
<font>font13_title</font>
<label>[COLOR=grey2]$INFO[Window.Property(36Hour.1.TemperatureHeading)][CR][/COLOR]$INFO[Window.Property(36Hour.1.Temperature),[B] ,[/B]]</label>
</control>
<control type="label">
- <posx>590</posx>
- <posy>60</posy>
+ <right>590</right>
+ <top>60</top>
<width>390</width>
<height>20</height>
<font>font12</font>
<label>$INFO[Window.Property(36Hour.1.ChancePrecipitation),[COLOR=grey2]$LOCALIZE[31908] :[/COLOR][B] ,[/B]]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>590</width>
<height>70</height>
<font>font12</font>
<label>$INFO[Window.Property(36hour.1.Forecast),[COLOR=grey2]$LOCALIZE[31905]: [/COLOR]]</label>
</control>
<control type="image">
- <posx>0</posx>
- <posy>180</posy>
+ <left>0</left>
+ <top>180</top>
<width>650</width>
<height>4</height>
<texture>separator.png</texture>
</control>
</control>
<control type="group">
- <posx>0</posx>
- <posy>185</posy>
+ <left>0</left>
+ <top>185</top>
<control type="label">
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>600</width>
<height>30</height>
<font>font13_title</font>
<label>$INFO[Window.Property(36Hour.2.Heading)]</label>
</control>
<control type="image">
- <posx>0</posx>
- <posy>10</posy>
+ <left>0</left>
+ <top>10</top>
<width>120</width>
<height>110</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Window.Property(36Hour.2.OutlookIcon)]</texture>
</control>
<control type="label">
- <posx>120</posx>
- <posy>40</posy>
+ <left>120</left>
+ <top>40</top>
<width>100</width>
<height>40</height>
<font>font13_title</font>
<label>[COLOR=grey2]$INFO[Window.Property(36Hour.2.TemperatureHeading)][CR][/COLOR]$INFO[Window.Property(36Hour.2.Temperature),[B] ,[/B]]</label>
</control>
<control type="label">
- <posx>590</posx>
- <posy>60</posy>
+ <right>590</right>
+ <top>60</top>
<width>390</width>
<height>20</height>
<font>font12</font>
<label>$INFO[Window.Property(36Hour.2.ChancePrecipitation),[COLOR=grey2]$LOCALIZE[31908] :[/COLOR][B] ,[/B]]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>590</width>
<height>70</height>
<font>font12</font>
<label>$INFO[Window.Property(36hour.2.Forecast),[COLOR=grey2]$LOCALIZE[31905]: [/COLOR]]</label>
</control>
<control type="image">
- <posx>0</posx>
- <posy>180</posy>
+ <left>0</left>
+ <top>180</top>
<width>650</width>
<height>4</height>
<texture>separator.png</texture>
</control>
</control>
<control type="group">
- <posx>0</posx>
- <posy>370</posy>
+ <left>0</left>
+ <top>370</top>
<control type="label">
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>600</width>
<height>30</height>
<font>font13_title</font>
<label>$INFO[Window.Property(36Hour.3.Heading)]</label>
</control>
<control type="image">
- <posx>0</posx>
- <posy>10</posy>
+ <left>0</left>
+ <top>10</top>
<width>120</width>
<height>110</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Window.Property(36Hour.3.OutlookIcon)]</texture>
</control>
<control type="label">
- <posx>120</posx>
- <posy>40</posy>
+ <left>120</left>
+ <top>40</top>
<width>100</width>
<height>40</height>
<font>font13_title</font>
<label>[COLOR=grey2]$INFO[Window.Property(36Hour.3.TemperatureHeading)][CR][/COLOR]$INFO[Window.Property(36Hour.3.Temperature),[B] ,[/B]]</label>
</control>
<control type="label">
- <posx>590</posx>
- <posy>60</posy>
+ <right>590</right>
+ <top>60</top>
<width>390</width>
<height>20</height>
<font>font12</font>
<label>$INFO[Window.Property(36Hour.3.ChancePrecipitation),[COLOR=grey2]$LOCALIZE[31908] :[/COLOR][B] ,[/B]]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>110</posy>
+ <left>0</left>
+ <top>110</top>
<width>590</width>
<height>70</height>
<font>font12</font>
<include>VisibleFadeEffect</include>
<control type="label">
<description>header label</description>
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>610</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="list" id="52">
- <posx>15</posx>
- <posy>60</posy>
+ <left>15</left>
+ <top>60</top>
<width>600</width>
<height>541</height>
<onleft>9000</onleft>
<scrolltime>200</scrolltime>
<itemlayout height="135" width="600">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,5,0,5">MenuItemNF.png</texture>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>100</width>
<height>120</height>
<font>font12</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>110</posx>
- <posy>5</posy>
+ <left>110</left>
+ <top>5</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.Thumb]</texture>
</control>
<control type="label">
- <posx>590</posx>
- <posy>5</posy>
+ <left>590</left>
+ <top>5</top>
<width>390</width>
<height>70</height>
<font>font12</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>590</width>
<height>50</height>
<font>font12</font>
</itemlayout>
<focusedlayout height="135" width="600">
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="0,2,0,2">MenuItemNF.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="image">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<width>600</width>
<height>136</height>
<texture border="10">button-focus2.png</texture>
<include>VisibleFadeEffect</include>
</control>
<control type="label">
- <posx>50</posx>
- <posy>0</posy>
+ <left>50</left>
+ <top>0</top>
<width>100</width>
<height>120</height>
<font>font12</font>
<label>$INFO[ListItem.Label]</label>
</control>
<control type="image">
- <posx>110</posx>
- <posy>5</posy>
+ <left>110</left>
+ <top>5</top>
<width>80</width>
<height>80</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[ListItem.Thumb]</texture>
</control>
<control type="label">
- <posx>590</posx>
- <posy>5</posy>
+ <left>590</left>
+ <top>5</top>
<width>390</width>
<height>70</height>
<font>font12</font>
<label>$INFO[ListItem.Label2]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>80</posy>
+ <left>0</left>
+ <top>80</top>
<width>590</width>
<height>50</height>
<font>font12</font>
</content>
</control>
<control type="scrollbar" id="62">
- <posx>615</posx>
- <posy>60</posy>
+ <left>615</left>
+ <top>60</top>
<width>25</width>
<height>540</height>
<texturesliderbackground border="0,14,0,14">ScrollBarV.png</texturesliderbackground>
<control type="label">
<animation effect="slide" start="0,0" end="-90,0" time="0" condition="system.getbool(input.enablemouse)">Conditional</animation>
<description>number of files/pages</description>
- <posx>660</posx>
- <posy>627</posy>
+ <right>660</right>
+ <top>627</top>
<width>570</width>
<font>font12</font>
<align>right</align>
<include>VisibleFadeEffect</include>
<control type="button" id="999">
<description>Hidden Button for focus</description>
- <posx>-600</posx>
- <posy>-20</posy>
+ <left>-600</left>
+ <top>-20</top>
<width>1</width>
<height>1</height>
<texturenofocus>-</texturenofocus>
</control>
<control type="label">
<description>header label</description>
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>610</width>
<height>30</height>
<font>font13_title</font>
</control>
<control type="image">
<description>Background image</description>
- <posx>40</posx>
- <posy>75</posy>
+ <left>40</left>
+ <top>75</top>
<width>570</width>
<height>325</height>
<texture border="5">button-nofocus.png</texture>
</control>
<control type="multiimage">
<description>map multiimage</description>
- <posx>45</posx>
- <posy>80</posy>
+ <left>45</left>
+ <top>80</top>
<width>560</width>
<height>315</height>
<imagepath>$INFO[Window.Property(MapPath)]</imagepath>
<aligny>center</aligny>
</control>
<control type="image">
- <posx>0</posx>
- <posy>410</posy>
+ <left>0</left>
+ <top>410</top>
<width>650</width>
<height>4</height>
<texture>separator.png</texture>
</control>
<control type="label">
- <posx>40</posx>
- <posy>430</posy>
+ <left>40</left>
+ <top>430</top>
<width>570</width>
<height>30</height>
<font>font13_title</font>
<control type="group">
<visible>!StringCompare(Window.Property(Alerts.Count),0)</visible>
<control type="textbox">
- <posx>40</posx>
- <posy>470</posy>
+ <left>40</left>
+ <top>470</top>
<width>570</width>
<height>100</height>
<font>font12</font>
</control>
</control>
<control type="label">
- <posx>40</posx>
- <posy>500</posy>
+ <left>40</left>
+ <top>500</top>
<width>570</width>
<height>30</height>
<font>font13_title</font>
<include>VisibleFadeEffect</include>
<control type="button" id="998">
<description>Hidden Button for focus</description>
- <posx>-600</posx>
- <posy>-20</posy>
+ <left>-600</left>
+ <top>-20</top>
<width>1</width>
<height>1</height>
<texturenofocus>-</texturenofocus>
</control>
<control type="label">
<description>header label</description>
- <posx>20</posx>
- <posy>13</posy>
+ <left>20</left>
+ <top>13</top>
<width>610</width>
<height>30</height>
<font>font13_title</font>
<shadowcolor>black</shadowcolor>
</control>
<control type="label">
- <posx>0</posx>
- <posy>200</posy>
+ <left>0</left>
+ <top>200</top>
<width>600</width>
<height>30</height>
<font>font13</font>
<visible>IsEmpty(Window.Property(Weekend.IsFetched))</visible>
</control>
<control type="group">
- <posx>20</posx>
- <posy>50</posy>
+ <left>20</left>
+ <top>50</top>
<visible>!IsEmpty(Window.Property(Weekend.IsFetched))</visible>
<include>VisibleFadeEffect</include>
<control type="group">
- <posx>0</posx>
- <posy>0</posy>
+ <left>0</left>
+ <top>0</top>
<control type="label">
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>600</width>
<height>30</height>
<font>font13_title</font>
<label>$INFO[Window.Property(Weekend.1.LongDay)] - $INFO[Window.Property(Weekend.1.ShortDate)]</label>
</control>
<control type="image">
- <posx>10</posx>
- <posy>20</posy>
+ <left>10</left>
+ <top>20</top>
<width>130</width>
<height>160</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Window.Property(Weekend.1.OutlookIcon)]</texture>
</control>
<control type="label">
- <posx>140</posx>
- <posy>40</posy>
+ <left>140</left>
+ <top>40</top>
<width>100</width>
<height>50</height>
<font>font13_title</font>
<label>[COLOR=grey2]$LOCALIZE[393][CR][/COLOR]$INFO[Window.Property(Weekend.1.HighTemperature),[B] ,[/B]]</label>
</control>
<control type="label">
- <posx>140</posx>
- <posy>100</posy>
+ <left>140</left>
+ <top>100</top>
<width>100</width>
<height>50</height>
<font>font13_title</font>
<label>[COLOR=grey2]$LOCALIZE[391][CR][/COLOR]$INFO[Window.Property(Weekend.1.LowTemperature),[B] ,[/B]]</label>
</control>
<control type="textbox">
- <posx>240</posx>
- <posy>40</posy>
+ <left>240</left>
+ <top>40</top>
<width>350</width>
<height>130</height>
<font>font12</font>
<label>$INFO[Window.Property(Weekend.1.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR][CR]$INFO[Window.Property(Weekend.1.ShortWindDirection),[COLOR=grey2]$LOCALIZE[404] :[/COLOR][B] ,[/B]][CR][CR]$INFO[Window.Property(Weekend.1.Precipitation),[COLOR=grey2]$LOCALIZE[33021] :[/COLOR][B] ,[/B]]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>170</posy>
+ <left>0</left>
+ <top>170</top>
<width>590</width>
<height>20</height>
<font>font12</font>
<label>$INFO[Window.Property(Weekend.1.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<width>590</width>
<height>70</height>
<font>font12</font>
<label>$INFO[Window.Property(Weekend.1.LongOutlookDay),[COLOR=grey2]$LOCALIZE[31905]: [/COLOR]][CR]</label>
</control>
<control type="image">
- <posx>0</posx>
- <posy>270</posy>
+ <left>0</left>
+ <top>270</top>
<width>650</width>
<height>4</height>
<texture>separator.png</texture>
</control>
</control>
<control type="group">
- <posx>0</posx>
- <posy>280</posy>
+ <left>0</left>
+ <top>280</top>
<control type="label">
- <posx>0</posx>
- <posy>5</posy>
+ <left>0</left>
+ <top>5</top>
<width>600</width>
<height>30</height>
<font>font13_title</font>
<label>$INFO[Window.Property(Weekend.2.LongDay)] - $INFO[Window.Property(Weekend.2.ShortDate)]</label>
</control>
<control type="image">
- <posx>10</posx>
- <posy>20</posy>
+ <left>10</left>
+ <top>20</top>
<width>130</width>
<height>160</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Window.Property(Weekend.2.OutlookIcon)]</texture>
</control>
<control type="label">
- <posx>140</posx>
- <posy>40</posy>
+ <left>140</left>
+ <top>40</top>
<width>100</width>
<height>50</height>
<font>font13_title</font>
<label>[COLOR=grey2]$LOCALIZE[393][CR][/COLOR]$INFO[Window.Property(Weekend.2.HighTemperature),[B] ,[/B]]</label>
</control>
<control type="label">
- <posx>140</posx>
- <posy>100</posy>
+ <left>140</left>
+ <top>100</top>
<width>100</width>
<height>50</height>
<font>font13_title</font>
<label>[COLOR=grey2]$LOCALIZE[391][CR][/COLOR]$INFO[Window.Property(Weekend.2.LowTemperature),[B] ,[/B]]</label>
</control>
<control type="textbox">
- <posx>240</posx>
- <posy>40</posy>
+ <left>240</left>
+ <top>40</top>
<width>350</width>
<height>130</height>
<font>font12</font>
<label>$INFO[Window.Property(Weekend.2.Humidity),[COLOR=grey2]$LOCALIZE[406] :[/COLOR][B] ,[/B]][CR][CR]$INFO[Window.Property(Weekend.2.ShortWindDirection),[COLOR=grey2]$LOCALIZE[404] :[/COLOR][B] ,[/B]][CR][CR]$INFO[Window.Property(Weekend.2.Precipitation),[COLOR=grey2]$LOCALIZE[33021] :[/COLOR][B] ,[/B]]</label>
</control>
<control type="label">
- <posx>0</posx>
- <posy>170</posy>
+ <left>0</left>
+ <top>170</top>
<width>590</width>
<height>20</height>
<font>font12</font>
<label>$INFO[Window.Property(Weekend.2.Outlook),[COLOR=grey2]$LOCALIZE[33030]: [/COLOR]]</label>
</control>
<control type="textbox">
- <posx>0</posx>
- <posy>210</posy>
+ <left>0</left>
+ <top>210</top>
<width>590</width>
<height>70</height>
<font>font12</font>
<?xml version="1.0" encoding="UTF-8"?>
-<addon id="xbmc.json" version="6.8.0" provider-name="Team XBMC">
+<addon id="xbmc.json" version="6.11.0" provider-name="Team XBMC">
<backwards-compatibility abi="6.0.0"/>
<requires>
<import addon="xbmc.core" version="0.1.0"/>
xbmc/android/jni/Makefile \
xbmc/utils/Makefile \
xbmc/main/Makefile \
- xbmc/windowing/tests/wayland/Makefile \
project/cmake/xbmc-config.cmake"
+if $use_wayland = "yes"; then
+OUTPUT_FILES="$OUTPUT_FILES xbmc/windowing/tests/wayland/Makefile"
+fi
+
if test "$use_skin_touched" = "yes"; then
OUTPUT_FILES="$OUTPUT_FILES addons/skin.touched/media/Makefile"
fi
], [$DISABLE_GOOM])
XB_CONFIG_MODULE([xbmc/screensavers/rsxs-0.9/], [
+ if test "$host_vendor" = "apple"; then
+ # clang treats inlines different
+ case $CC in
+ *clang*)
+ TEMPCFLAGS="$CFLAGS";;
+ *)
+ TEMPCFLAGS="${CFLAGS} -fgnu89-inline";;
+ esac
+ else
+ TEMPCFLAGS="$CFLAGS";
+ fi
./configure \
CC="$CC" \
CXX="$CXX" \
#: system/settings/settings.xml
msgctxt "#346"
-msgid "Boost volume level on downmix"
+msgid "Normalize levels on downmix"
msgstr ""
#: system/settings/settings.xml
msgid "Same as movie"
msgstr ""
-#empty strings from id 36533 to 36534
+#: settings/DisplaySettings.cpp
+msgctxt "#36533"
+msgid "Select how audio is downmixed, for example from 5.1 to 2.0: [Enabled] maintains the dynamic range of the original audio source when downmixed however volume will be lower [Disabled] maintains volume level of the original audio source however the dynamic range is compressed. Note - Dynamic range is the difference between the quietest and loudest sounds in a audio source."
+msgstr ""
+
+#empty strings from id 36534 to 36534
#: guilib/StereoscopicsManager.cpp
#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
<ClCompile Include="..\..\xbmc\CueDocument.cpp" />
<ClCompile Include="..\..\xbmc\DbUrl.cpp" />
<ClCompile Include="..\..\xbmc\dbwrappers\Database.cpp" />
+ <ClCompile Include="..\..\xbmc\dbwrappers\DatabaseQuery.cpp" />
<ClCompile Include="..\..\xbmc\dbwrappers\dataset.cpp" />
<ClCompile Include="..\..\xbmc\dbwrappers\mysqldataset.cpp" />
<ClCompile Include="..\..\xbmc\dbwrappers\qry_dat.cpp" />
<ClCompile Include="..\..\xbmc\epg\EpgSearchFilter.cpp" />
<ClCompile Include="..\..\xbmc\epg\GUIEPGGridContainer.cpp" />
<ClCompile Include="..\..\xbmc\FileItem.cpp" />
+ <ClCompile Include="..\..\xbmc\FileItemListModification.cpp" />
<ClCompile Include="..\..\xbmc\filesystem\AddonsDirectory.cpp" />
<ClCompile Include="..\..\xbmc\filesystem\AFPDirectory.cpp" />
<ClCompile Include="..\..\xbmc\filesystem\AFPFile.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\json-rpc\SystemOperations.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\json-rpc\VideoLibrary.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\json-rpc\XBMCOperations.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\json-rpc\TextureOperations.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\legacy\Addon.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\legacy\AddonCallback.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\legacy\AddonClass.cpp" />
<ClCompile Include="..\..\xbmc\playlists\PlayListWPL.cpp" />
<ClCompile Include="..\..\xbmc\playlists\PlayListXML.cpp" />
<ClCompile Include="..\..\xbmc\playlists\SmartPlayList.cpp" />
+ <ClCompile Include="..\..\xbmc\playlists\SmartPlaylistFileItemListModifier.cpp" />
<ClCompile Include="..\..\xbmc\powermanagement\DPMSSupport.cpp" />
<ClCompile Include="..\..\xbmc\powermanagement\PowerManager.cpp" />
<ClCompile Include="..\..\xbmc\powermanagement\windows\Win32PowerSyscall.cpp" />
<ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettings.cpp" />
<ClCompile Include="..\..\xbmc\settings\DisplaySettings.cpp" />
<ClCompile Include="..\..\xbmc\settings\ISetting.cpp" />
+ <ClCompile Include="..\..\xbmc\settings\ISettingControl.cpp" />
<ClCompile Include="..\..\xbmc\settings\MediaSettings.cpp" />
<ClCompile Include="..\..\xbmc\settings\MediaSourceSettings.cpp" />
<ClCompile Include="..\..\xbmc\settings\Setting.cpp" />
<ClInclude Include="..\..\xbmc\dialogs\GUIDialogKeyboardGeneric.h" />
<ClInclude Include="..\..\xbmc\DbUrl.h" />
<ClInclude Include="..\..\xbmc\dialogs\GUIDialogMediaFilter.h" />
+ <ClInclude Include="..\..\xbmc\FileItemListModification.h" />
<ClInclude Include="..\..\xbmc\filesystem\HTTPFile.h" />
<ClInclude Include="..\..\xbmc\filesystem\DAVCommon.h" />
<ClInclude Include="..\..\xbmc\filesystem\DAVFile.h" />
<ClInclude Include="..\..\xbmc\guilib\GUIKeyboardFactory.h" />
<ClInclude Include="..\..\xbmc\guilib\iimage.h" />
<ClInclude Include="..\..\xbmc\guilib\imagefactory.h" />
+ <ClInclude Include="..\..\xbmc\IFileItemListModifier.h" />
<ClInclude Include="..\..\xbmc\input\touch\generic\GenericTouchActionHandler.h" />
<ClInclude Include="..\..\xbmc\input\touch\generic\GenericTouchSwipeDetector.h" />
<ClInclude Include="..\..\xbmc\input\touch\generic\IGenericTouchGestureDetector.h" />
<ClInclude Include="..\..\xbmc\network\NetworkServices.h" />
<ClInclude Include="..\..\xbmc\peripherals\bus\virtual\PeripheralBusCEC.h" />
<ClInclude Include="..\..\xbmc\network\upnp\UPnPSettings.h" />
+ <ClInclude Include="..\..\xbmc\playlists\SmartPlaylistFileItemListModifier.h" />
<ClInclude Include="..\..\xbmc\profiles\dialogs\GUIDialogLockSettings.h" />
<ClInclude Include="..\..\xbmc\profiles\dialogs\GUIDialogProfileSettings.h" />
<ClInclude Include="..\..\xbmc\profiles\Profile.h" />
<ClInclude Include="..\..\xbmc\settings\DisplaySettings.h" />
<ClInclude Include="..\..\xbmc\settings\ISetting.h" />
<ClInclude Include="..\..\xbmc\settings\ISettingCallback.h" />
+ <ClInclude Include="..\..\xbmc\settings\ISettingControl.h" />
+ <ClInclude Include="..\..\xbmc\settings\ISettingControlCreator.h" />
<ClInclude Include="..\..\xbmc\settings\ISettingCreator.h" />
<ClInclude Include="..\..\xbmc\settings\ISettingsHandler.h" />
<ClInclude Include="..\..\xbmc\settings\ISubSettings.h" />
<ClInclude Include="..\..\xbmc\settings\SettingCategoryAccess.h" />
<ClInclude Include="..\..\xbmc\settings\SettingConditions.h" />
<ClInclude Include="..\..\xbmc\settings\SettingControl.h" />
+ <ClInclude Include="..\..\xbmc\settings\SettingDefinitions.h" />
<ClInclude Include="..\..\xbmc\settings\SettingDependency.h" />
<ClInclude Include="..\..\xbmc\settings\SettingPath.h" />
<ClInclude Include="..\..\xbmc\settings\SettingSection.h" />
<ClInclude Include="..\..\xbmc\cores\VideoRenderers\VideoShaders\WinVideoFilter.h" />
<ClInclude Include="..\..\xbmc\CueDocument.h" />
<ClInclude Include="..\..\xbmc\dbwrappers\Database.h" />
+ <ClInclude Include="..\..\xbmc\dbwrappers\DatabaseQuery.h" />
<ClInclude Include="..\..\xbmc\dbwrappers\dataset.h" />
<ClInclude Include="..\..\xbmc\dbwrappers\mysqldataset.h" />
<ClInclude Include="..\..\xbmc\dbwrappers\qry_dat.h" />
<ClInclude Include="..\..\xbmc\interfaces\json-rpc\SystemOperations.h" />
<ClInclude Include="..\..\xbmc\interfaces\json-rpc\VideoLibrary.h" />
<ClInclude Include="..\..\xbmc\interfaces\json-rpc\XBMCOperations.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\json-rpc\TextureOperations.h" />
<ClInclude Include="..\..\xbmc\IProgressCallback.h" />
<ClInclude Include="..\..\xbmc\LangInfo.h" />
<ClInclude Include="..\..\xbmc\MediaSource.h" />
<ClCompile Include="..\..\xbmc\interfaces\json-rpc\XBMCOperations.cpp">
<Filter>interfaces\json-rpc</Filter>
</ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\json-rpc\TextureOperations.cpp">
+ <Filter>interfaces\json-rpc</Filter>
+ </ClCompile>
<ClCompile Include="..\..\xbmc\music\dialogs\GUIDialogMusicInfo.cpp">
<Filter>music\dialogs</Filter>
</ClCompile>
<ClCompile Include="..\..\xbmc\dbwrappers\Database.cpp">
<Filter>dbwrappers</Filter>
</ClCompile>
+ <ClCompile Include="..\..\xbmc\dbwrappers\DatabaseQuery.cpp">
+ <Filter>dbwrappers</Filter>
+ </ClCompile>
<ClCompile Include="..\..\xbmc\dbwrappers\dataset.cpp">
<Filter>dbwrappers</Filter>
</ClCompile>
<ClCompile Include="..\..\xbmc\windowing\WinEvents.cpp">
<Filter>windowing</Filter>
</ClCompile>
+ <ClCompile Include="..\..\xbmc\playlists\SmartPlaylistFileItemListModifier.cpp">
+ <Filter>playlists</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\FileItemListModification.cpp" />
+ <ClCompile Include="..\..\xbmc\settings\ISettingControl.cpp">
+ <Filter>settings</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\xbmc\win32\pch.h">
<ClInclude Include="..\..\xbmc\interfaces\json-rpc\XBMCOperations.h">
<Filter>interfaces\json-rpc</Filter>
</ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\json-rpc\TextureOperations.h">
+ <Filter>interfaces\json-rpc</Filter>
+ </ClInclude>
<ClInclude Include="..\..\xbmc\music\dialogs\GUIDialogMusicInfo.h">
<Filter>music\dialogs</Filter>
</ClInclude>
<ClInclude Include="..\..\xbmc\dbwrappers\Database.h">
<Filter>dbwrappers</Filter>
</ClInclude>
+ <ClInclude Include="..\..\xbmc\dbwrappers\DatabaseQuery.h">
+ <Filter>dbwrappers</Filter>
+ </ClInclude>
<ClInclude Include="..\..\xbmc\dbwrappers\dataset.h">
<Filter>dbwrappers</Filter>
</ClInclude>
<ClInclude Include="..\..\xbmc\utils\uXstrings.h">
<Filter>utils</Filter>
</ClInclude>
+ <ClInclude Include="..\..\xbmc\IFileItemListModifier.h" />
+ <ClInclude Include="..\..\xbmc\playlists\SmartPlaylistFileItemListModifier.h">
+ <Filter>playlists</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\FileItemListModification.h" />
+ <ClInclude Include="..\..\xbmc\settings\ISettingControl.h">
+ <Filter>settings</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\settings\ISettingControlCreator.h">
+ <Filter>settings</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\settings\SettingDefinitions.h">
+ <Filter>settings</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\xbmc\win32\XBMC_PC.rc">
<Filter>interfaces\swig</Filter>
</None>
</ItemGroup>
-</Project>
\ No newline at end of file
+</Project>
<constraints>
<addontype>xbmc.gui.skin</addontype>
</constraints>
+ <control type="button" format="addon" />
</setting>
<setting id="lookandfeel.skinsettings" type="action" parent="lookandfeel.skin" label="21417" help="36104">
<level>0</level>
<dependencies>
<dependency type="enable" on="property" name="AddonHasSettings" setting="lookandfeel.skin" />
</dependencies>
+ <control type="button" format="action" />
</setting>
<setting id="lookandfeel.skintheme" type="string" parent="lookandfeel.skin" label="15111" help="36105">
<level>1</level>
<setting id="lookandfeel.enablerssfeeds" type="boolean" label="13305" help="36111">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="lookandfeel.rssedit" type="string" parent="lookandfeel.enablerssfeeds" label="21450" help="36112">
<level>1</level>
<dependencies>
<dependency type="enable" setting="lookandfeel.enablerssfeeds">true</dependency>
</dependencies>
- <control type="button" format="action" attributes="hide_value" />
+ <control type="button" format="action">
+ <hidevalue>true</hidevalue>
+ </control>
</setting>
</group>
</category>
<setting id="filelists.showparentdiritems" type="boolean" label="13306" help="36122">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="filelists.showextensions" type="boolean" label="497" help="36123">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="filelists.ignorethewhensorting" type="boolean" label="13399" help="36124">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="filelists.allowfiledeletion" type="boolean" label="14071" help="36125">
<level>1</level>
</or>
</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="filelists.showaddsourcebuttons" type="boolean" label="21382" help="36126">
<level>1</level>
</or>
</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="filelists.showhidden" type="boolean" label="21330" help="36127">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<updates>
<update type="change" />
</updates>
+ <control type="button" format="addon" />
</setting>
<setting id="screensaver.settings" parent="screensaver.mode" type="action" label="21417" help="36130">
<level>0</level>
</and>
</dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
<setting id="screensaver.preview" type="action" parent="screensaver.mode" label="1000" help="36131">
<level>0</level>
<dependencies>
<dependency type="enable" setting="screensaver.mode" operator="!is"></dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
<setting id="screensaver.time" type="integer" label="355" help="36132">
<level>0</level>
<dependencies>
<dependency type="enable" setting="screensaver.mode" operator="!is"></dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="screensaver.usedimonpause" type="boolean" label="22014" help="36134">
<level>1</level>
</and>
</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="videolibrary.enabled" type="boolean" label="24022" help="36140">
<level>4</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videolibrary.showunwatchedplots" type="boolean" label="20369" help="36141">
<level>0</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videolibrary.seasonthumbs" type="boolean" label="20382" help="36142">
<level>4</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videolibrary.actorthumbs" type="boolean" label="20402" help="36143">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videolibrary.flattentvshows" type="integer" label="20412" help="36144">
<level>1</level>
<setting id="videolibrary.groupmoviesets" type="boolean" label="20458" help="36145">
<level>0</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="videolibrary.updateonstartup" type="boolean" label="22000" help="36146">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="videolibrary.backgroundupdate" type="boolean" label="22001" help="36147">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="videolibrary.cleanup" type="action" label="334" help="36148">
<level>2</level>
+ <control type="button" format="action" />
</setting>
<setting id="videolibrary.export" type="action" label="647" help="36149">
<level>2</level>
+ <control type="button" format="action" />
</setting>
<setting id="videolibrary.import" type="action" label="648" help="36150">
<level>2</level>
+ <control type="button" format="action" />
</setting>
</group>
</category>
<setting id="videoplayer.autoplaynextitem" type="boolean" label="13433" help="36152">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<requirement>HAVE_LIBVDPAU</requirement>
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.usevdpaumixer" type="boolean" label="13437" help="36421">
<requirement>HAVE_LIBVDPAU</requirement>
<dependencies>
<dependency type="enable" setting="videoplayer.usevdpau" operator="is">true</dependency> <!-- USE VDPAU -->
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.usevaapi" type="boolean" label="13426" help="36156">
<requirement>HAVE_LIBVA</requirement>
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.usedxva2" type="boolean" label="13427" help="36158">
<requirement>HasDXVA2</requirement>
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.usechd" type="boolean" label="13428" help="36159">
<requirement>HasCrystalHDDevice</requirement>
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.useomx" type="boolean" label="13430" help="36161">
<requirement>HAVE_LIBOPENMAX</requirement>
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.usevideotoolbox" type="boolean" label="13432" help="36162">
<requirement>HasVideoToolBoxDecoder</requirement>
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.usepbo" type="boolean" label="13424" help="36163">
<requirement>HAS_GL</requirement>
<level>4</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.adjustrefreshrate" type="integer" label="170" help="36164">
<level>2</level>
<setting id="videoplayer.usedisplayasclock" type="boolean" label="13510" help="36166">
<level>2</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.synctype" type="integer" label="13500" help="36167">
<level>2</level>
<requirement>HAVE_LIBVDPAU</requirement>
<level>4</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="3">
<setting id="videoplayer.vdpauUpscalingLevel" type="boolean" label="13121" help="36173">
<level>4</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="4">
<setting id="videoplayer.teletextenabled" type="boolean" label="23050" help="36174">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="videoplayer.teletextscale" type="boolean" label="23055" help="36175">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
<group id="5">
<setting id="videoplayer.quitstereomodeonstop" type="boolean" label="36526" help="36538">
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="myvideos.extractflags" type="boolean" label="20433" help="36178">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="myvideos.replacelabels" type="boolean" label="20419" help="36179">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="myvideos.extractthumb" type="boolean" label="20433" help="36180">
<level>4</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="myvideos.stackvideos" type="boolean" label="20435" help="36182">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="myvideos.flatten" type="boolean" label="20456" help="36183">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="subtitles.overrideassfonts" type="boolean" label="21368" help="36190">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="dvds.autorun" type="boolean" label="14088" help="36194">
<level>0</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="dvds.playerregion" type="integer" label="21372" help="36195">
<level>2</level>
<setting id="dvds.automenu" type="boolean" label="21882" help="36196">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="pvrmanager.enabled" type="boolean" label="449" help="36203">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="pvrmanager.syncchannelgroups" type="boolean" label="19221" help="36204">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pvrmanager.backendchannelorder" type="boolean" label="19231" help="36205">
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pvrmanager.usebackendchannelnumbers" type="boolean" label="19234" help="36206">
<level>2</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="3">
<dependencies>
<dependency type="enable" setting="pvrmanager.enabled">true</dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
<setting id="pvrmanager.channelscan" type="action" label="19117" help="36208">
<level>1</level>
<dependencies>
<dependency type="enable" setting="pvrmanager.enabled">true</dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
<setting id="pvrmanager.resetdb" type="action" label="19185" help="36209">
<level>2</level>
+ <control type="button" format="action" />
</setting>
</group>
<group id="4">
<setting id="pvrmanager.hideconnectionlostwarning" type="boolean" label="19269" help="36210">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="pvrmenu.infoswitch" type="boolean" label="19178" help="36212">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pvrmenu.infotimeout" type="boolean" label="19179" help="36213">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pvrmenu.closechannelosdonswitch" type="boolean" label="19229" help="36214">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="pvrmenu.infotime" type="integer" label="19184" help="36215">
<level>1</level>
</and>
</dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
</group>
</category>
<setting id="epg.preventupdateswhileplayingtv" type="boolean" label="19230" help="36222">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="epg.ignoredbforclient" type="boolean" label="19072" help="36223">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="epg.hidenoinfoavailable" type="boolean" label="19268" help="36224">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="epg.resetepg" type="action" label="19187" help="36225">
<level>1</level>
+ <control type="button" format="action" />
</setting>
</group>
</category>
<setting id="pvrplayback.playminimized" type="boolean" label="19171" help="36227">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pvrplayback.startlast" type="integer" label="19189" help="36228">
<level>1</level>
<setting id="pvrplayback.signalquality" type="boolean" label="19037" help="36229">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="pvrplayback.confirmchannelswitch" type="boolean" label="19281" help="36231">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="pvrplayback.channelentrytimeout" type="integer" label="19073" help="36232">
<level>1</level>
<setting id="pvrrecord.timernotifications" type="boolean" label="19233" help="36239">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="pvrpowermanagement.enabled" type="boolean" label="305" help="36241">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="pvrpowermanagement.dailywakeup" type="boolean" label="19247" help="36245">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="pvrpowermanagement.dailywakeuptime" type="string" label="19248" help="36246">
<level>1</level>
<setting id="pvrparental.enabled" type="boolean" label="449" help="36248">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<dependencies>
<dependency type="enable" setting="pvrparental.enabled">true</dependency>
</dependencies>
- <control type="edit" format="integer" attributes="hidden,new" delayed="false" />
+ <control type="edit" format="integer" delayed="false">
+ <hidden>true</hidden>
+ <verifynew>true</verifynew>
+ </control>
</setting>
<setting id="pvrparental.duration" type="integer" label="19260" help="36250">
<level>1</level>
<group id="1">
<setting id="pvrclient.menuhook" type="action" label="19280" help="36252">
<level>1</level>
+ <control type="button" format="action" />
</setting>
</group>
</category>
<setting id="musiclibrary.enabled" type="boolean" label="24022" help="36254">
<level>4</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="musiclibrary.showcompilationartists" type="boolean" label="13414" help="36255">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="musiclibrary.downloadinfo" type="boolean" label="20192" help="36256">
<level>0</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="musiclibrary.albumsscraper" type="addon" label="20193" help="36257">
<level>1</level>
<constraints>
<addontype>xbmc.metadata.scraper.albums</addontype>
</constraints>
+ <control type="button" format="addon" />
</setting>
<setting id="musiclibrary.artistsscraper" type="addon" label="20194" help="36258">
<level>1</level>
<constraints>
<addontype>xbmc.metadata.scraper.artists</addontype>
</constraints>
+ <control type="button" format="addon" />
</setting>
<setting id="musiclibrary.updateonstartup" type="boolean" label="22000" help="36259">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="musiclibrary.backgroundupdate" type="boolean" label="22001" help="36147">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="3">
<setting id="musiclibrary.cleanup" type="action" label="334" help="36148">
<level>2</level>
+ <control type="button" format="action" />
</setting>
<setting id="musiclibrary.export" type="action" label="20196" help="36262">
<level>2</level>
+ <control type="button" format="action" />
</setting>
<setting id="musiclibrary.import" type="action" label="20197" help="36263">
<level>2</level>
+ <control type="button" format="action" />
</setting>
</group>
</category>
<setting id="musicplayer.autoplaynextitem" type="boolean" label="489" help="36265">
<level>0</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="musicplayer.queuebydefault" type="boolean" label="14084" help="36266">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="musicplayer.replaygainavoidclipping" type="boolean" label="643" help="36270">
<level>2</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
<group id="3">
</and>
</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
</group>
<group id="4">
<addontype>xbmc.player.musicviz</addontype>
<allowempty>true</allowempty>
</constraints>
+ <control type="button" format="addon" />
</setting>
</group>
</category>
<setting id="musicfiles.usetags" type="boolean" label="258" help="36274">
<level>0</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="musicfiles.trackformat" type="string" label="13307" help="36275">
<level>2</level>
<setting id="musicfiles.findremotethumbs" type="boolean" label="14059" help="36281">
<level>0</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="audiocds.usecddb" type="boolean" label="227" help="36284">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<setting id="audiocds.ejectonrip" type="boolean" label="14099" help="36291">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="karaoke.enabled" type="boolean" label="13323" help="36293">
<level>2</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="karaoke.autopopupselector" type="boolean" label="22037" help="36294">
<level>2</level>
<dependencies>
<dependency type="enable" setting="karaoke.enabled">true</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
<dependencies>
<dependency type="enable" setting="karaoke.enabled">true</dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
<setting id="karaoke.importcsv" type="action" label="22036" help="36300">
<level>2</level>
<dependencies>
<dependency type="enable" setting="karaoke.enabled">true</dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
</group>
</category>
<setting id="pictures.usetags" type="boolean" label="14082" help="36306">
<level>0</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pictures.generatethumbs" type="boolean" label="13360" help="36307">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pictures.useexifrotation" type="boolean" label="20184" help="36308">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pictures.showvideos" type="boolean" label="22022" help="36309">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="pictures.displayresolution" type="integer" label="169" help="36310">
<visible>false</visible> <!-- not properly respected -->
<setting id="slideshow.displayeffects" type="boolean" label="12379" help="36313">
<level>0</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="slideshow.shuffle" type="boolean" label="13319" help="36314">
<level>2</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<addontype>xbmc.python.weather</addontype>
<allowempty>true</allowempty>
</constraints>
+ <control type="button" format="addon" />
</setting>
<setting id="weather.addonsettings" type="action" parent="weather.addon" label="21417" help="36419">
<level>0</level>
<dependencies>
<dependency type="enable" on="property" name="AddonHasSettings" setting="weather.addon" />
</dependencies>
+ <control type="button" format="action" />
</setting>
</group>
</category>
<setting id="services.upnpserver" type="boolean" label="21360" help="36323">
<level>0</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="services.upnpannounce" type="boolean" label="20188" help="36324">
<level>2</level>
<dependencies>
<dependency type="enable" setting="services.upnpserver">true</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="services.upnprenderer" type="boolean" label="21881" help="36325">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="services.upnpcontroller" type="boolean" label="21361" help="36326">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="services.webserver" type="boolean" label="263" help="36328">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="services.webserverport" type="integer" parent="services.webserver" label="730" help="36329">
<level>2</level>
<dependencies>
<dependency type="enable" setting="services.webserver">true</dependency>
</dependencies>
- <control type="edit" format="string" attributes="hidden" />
+ <control type="edit" format="string">
+ <hidden>true</hidden>
+ </control>
</setting>
<setting id="services.webskin" type="addon" label="199" help="36332">
<level>1</level>
<constraints>
<addontype>xbmc.gui.webinterface</addontype>
</constraints>
+ <control type="button" format="addon" />
</setting>
</group>
</category>
<setting id="services.esenabled" type="boolean" label="791" help="36334">
<level>1</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="services.esport" type="integer" label="792" help="36335">
<requirement>HAS_EVENT_SERVER</requirement>
<dependencies>
<dependency type="enable" setting="services.esenabled">true</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="services.esinitialdelay" type="integer" label="795" help="36339">
<requirement>HAS_EVENT_SERVER</requirement>
<setting id="services.zeroconf" type="boolean" label="1260" help="36342">
<level>2</level>
<default>true</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="services.airplay" type="boolean" label="1270" help="36343">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="services.airplayvolumecontrol" type="boolean" parent="services.airplay" label="1269" help="36541">
<level>2</level>
<dependencies>
<dependency type="enable" setting="services.airplay">true</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="services.useairplaypassword" type="boolean" parent="services.airplay" label="1272" help="36344">
<level>1</level>
<dependencies>
<dependency type="enable" setting="services.airplay">true</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="services.airplaypassword" type="string" parent="services.useairplaypassword" label="733" help="36345">
<level>1</level>
<dependencies>
<dependency type="enable" setting="services.useairplaypassword">true</dependency>
</dependencies>
- <control type="edit" format="string" attributes="hidden" />
+ <control type="edit" format="string">
+ <hidden>true</hidden>
+ </control>
</setting>
</group>
</category>
<dependencies>
<dependency type="enable" setting="videoscreen.screen" operator="!is">-1</dependency> <!-- DM_WINDOWED -->
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="videoscreen.blankdisplays" type="boolean" label="13130" help="36355">
<level>1</level>
<dependencies>
<dependency type="enable" on="property" name="IsFullscreen" />
</dependencies>
+ <control type="toggle" />
</setting>
</group>
<group id="2">
</setting>
<setting id="videoscreen.guicalibration" type="action" label="214" help="36357">
<level>1</level>
+ <control type="button" format="action" />
</setting>
<setting id="videoscreen.testpattern" type="action" label="226" help="36358">
<requirement>HAS_GL</requirement>
<level>1</level>
+ <control type="button" format="action" />
</setting>
<setting id="videoscreen.limitedrange" type="boolean" label="36042" help="36359">
<requirement>
<updates>
<update type="rename">videoplayer.vdpaustudiolevel</update>
</updates>
+ <control type="toggle" />
</setting>
</group>
</category>
<condition on="property" name="aesettingvisible" setting="audiooutput.audiodevice">audiooutput.samplerate</condition>
<condition on="property" name="aesettingvisible" setting="audiooutput.config">audiooutput.samplerate</condition>
</and>
- </dependency>
+ </dependency>
</dependencies>
<constraints>
<options>
<dependencies>
<dependency type="visible" setting="audiooutput.channels" operator="!is">1</dependency>
</dependencies>
+ <control type="toggle" />
+ </setting>
+ <setting id="audiooutput.normalizelevels" type="boolean" label="346" help="36533">
+ <level>2</level>
+ <default>true</default>
</setting>
<setting id="audiooutput.processquality" type="integer" label="13505" help="36169">
<requirement>HAS_AE_QUALITY_LEVELS</requirement>
</and>
</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="audiooutput.passthroughdevice" type="string" label="546" help="36372">
<level>2</level>
<options>audiodevicespassthrough</options>
</constraints>
<control type="list" format="string" />
- </setting>
+ </setting>
<setting id="audiooutput.ac3passthrough" type="boolean" label="364" help="36365">
<level>2</level>
<default>true</default>
</and>
</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="audiooutput.eac3passthrough" type="boolean" label="448" help="37016">
<level>2</level>
<condition on="property" name="aesettingvisible" setting="audiooutput.config">audiooutput.passthrough</condition>
</and>
</dependency>
- </dependencies>
+ </dependencies>
+ <control type="toggle" />
</setting>
<setting id="audiooutput.dtspassthrough" type="boolean" label="254" help="36366">
<level>2</level>
<condition on="property" name="aesettingvisible" setting="audiooutput.config">audiooutput.passthrough</condition>
</and>
</dependency>
- </dependencies>
+ </dependencies>
+ <control type="toggle" />
</setting>
<setting id="audiooutput.truehdpassthrough" type="boolean" label="349" help="36369">
<level>2</level>
<condition on="property" name="aesettingvisible" setting="audiooutput.passthroughdevice">audiooutput.truehdpassthrough</condition>
</and>
</dependency>
- </dependencies>
+ </dependencies>
+ <control type="toggle" />
</setting>
<setting id="audiooutput.dtshdpassthrough" type="boolean" label="347" help="36370">
<level>2</level>
<condition on="property" name="aesettingvisible" setting="audiooutput.passthroughdevice">audiooutput.dtshdpassthrough</condition>
</and>
</dependency>
- </dependencies>
+ </dependencies>
+ <control type="toggle" />
</setting>
</group>
</category>
<dependencies>
<dependency type="enable" on="property" name="HasPeripherals" />
</dependencies>
+ <control type="button" format="action" />
</setting>
</group>
<group id="2">
<setting id="input.remoteaskeyboard" type="boolean" label="21449" help="36376">
<level>2</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="input.enablemouse" type="boolean" label="21369" help="36377">
<level>0</level>
+ <control type="toggle" />
<default>true</default>
</setting>
<setting id="input.enablejoystick" type="boolean" label="35100" help="36378">
<requirement>HAS_SDL_JOYSTICK</requirement>
<level>0</level>
<default>true</default>
+ <control type="toggle" />
</setting>
<setting id="input.enablesystemkeys" type="boolean" label="35103" help="37019">
<and>
</and>
<level>2</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="network.usehttpproxy" type="boolean" label="708" help="36380">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="network.httpproxytype" type="integer" parent="network.usehttpproxy" label="1180" help="36381">
<level>1</level>
<dependencies>
<dependency type="enable" setting="network.usehttpproxy">true</dependency>
</dependencies>
- <control type="edit" format="string" attributes="hidden" />
+ <control type="edit" format="string">
+ <hidden>true</hidden>
+ </control>
</setting>
</group>
<group id="2">
<setting id="powermanagement.wakeonaccess" type="boolean" label="13026" help="36350">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
</group>
</category>
<setting id="debug.showloginfo" type="boolean" label="20191" help="36392">
<level>1</level>
<default>false</default>
+ <control type="toggle" />
</setting>
<setting id="debug.setextraloglevel" type="action" parent="debug.showloginfo" label="666" help="36394">
<level>1</level>
<dependencies>
<dependency type="enable" setting="debug.showloginfo">true</dependency>
</dependencies>
+ <control type="button" format="action" />
</setting>
<setting id="debug.screenshotpath" type="path" label="20004" help="36261">
<level>1</level>
<setting id="masterlock.lockcode" type="string" label="20100" help="36396">
<level>2</level>
<default>-</default>
- <control type="button" format="action" attributes="hide_value"/>
+ <control type="button" format="action">
+ <hidevalue>true</hidevalue>
+ </control>
</setting>
<setting id="masterlock.startuplock" type="boolean" label="20076" help="36397">
<level>2</level>
<dependencies>
<dependency type="enable" on="property" name="ProfileLockMode" operator="!is">0</dependency>
</dependencies>
+ <control type="toggle" />
</setting>
<setting id="masterlock.maxretries" type="integer" label="12364" help="36398">
<level>4</level>
@echo "$(XBMCROOT)/xbmcapp-$(CPU)-debug.apk created"
extras: libs
- rm -rf xbmc/assets/python2.6/lib/
+ rm -rf xbmc/assets
mkdir -p xbmc/assets xbmc/res xbmc/res/raw xbmc/assets/python2.6/lib/
cp -rfp $(PREFIX)/share/xbmc/* ./xbmc/assets
find `pwd`/xbmc/assets/ -depth -name ".git" -exec rm -rf {} \;
this.mSplash = splash;
}
+ void DeleteRecursive(File fileOrDirectory) {
+ if (fileOrDirectory.isDirectory())
+ for (File child : fileOrDirectory.listFiles())
+ DeleteRecursive(child);
+
+ fileOrDirectory.delete();
+ }
+
@Override
protected Integer doInBackground(Void... param) {
+ if (fApkDir.exists()) {
+ // Remove existing files
+ Log.d(TAG, "Removing existing " + fApkDir.toString());
+ DeleteRecursive(fApkDir);
+ }
fApkDir.mkdirs();
// Log.d(TAG, "apk: " + sPackagePath);
continue;
}
- // Log.d(TAG,
- // "time: " + e.getTime() + ";"
- // + fFullPath.lastModified());
-
- // If file exists and has same time, skip
- if (e.getTime() == fFullPath.lastModified())
- continue;
-
- // Log.d(TAG, "writing: " + sFullPath);
fFullPath.getParentFile().mkdirs();
try {
in.close();
out.close();
-
- // save the zip time. this way we know for certain
- // if we
- // need to refresh.
- fFullPath.setLastModified(e.getTime());
} catch (IOException e1) {
e1.printStackTrace();
}
m_lastAxisMap[joystickName].erase(wKeyID);
}
- return ProcessJoystickEvent(joystickName, wKeyID, isAxis, fAmount);
+ return ProcessJoystickEvent(joystickName, wKeyID, isAxis ? JACTIVE_AXIS : JACTIVE_BUTTON, fAmount);
}
else
{
for (map<std::string, map<int, float> >::iterator iter = m_lastAxisMap.begin(); iter != m_lastAxisMap.end(); ++iter)
{
for (map<int, float>::iterator iterAxis = (*iter).second.begin(); iterAxis != (*iter).second.end(); ++iterAxis)
- ProcessJoystickEvent((*iter).first, (*iterAxis).first, true, (*iterAxis).second);
+ ProcessJoystickEvent((*iter).first, (*iterAxis).first, JACTIVE_AXIS, (*iterAxis).second);
}
}
return false;
}
-bool CApplication::ProcessJoystickEvent(const std::string& joystickName, int wKeyID, bool isAxis, float fAmount, unsigned int holdTime /*=0*/)
+bool CApplication::ProcessJoystickEvent(const std::string& joystickName, int wKeyID, short inputType, float fAmount, unsigned int holdTime /*=0*/)
{
#if defined(HAS_EVENT_SERVER)
m_idleTimer.StartZero();
bool fullRange = false;
// Translate using regular joystick translator.
- if (CButtonTranslator::GetInstance().TranslateJoystickString(iWin, joystickName.c_str(), wKeyID, isAxis ? JACTIVE_AXIS : JACTIVE_BUTTON, actionID, actionName, fullRange))
+ if (CButtonTranslator::GetInstance().TranslateJoystickString(iWin, joystickName.c_str(), wKeyID, inputType, actionID, actionName, fullRange))
return ExecuteInputAction( CAction(actionID, fAmount, 0.0f, actionName, holdTime) );
else
CLog::Log(LOGDEBUG, "ERROR mapping joystick action. Joystick: %s %i",joystickName.c_str(), wKeyID);
bool CApplication::ExecuteXBMCAction(std::string actionStr)
{
// see if it is a user set string
- CLog::Log(LOGDEBUG,"%s : Translating %s", __FUNCTION__, actionStr.c_str());
+
+ //We don't know if there is unsecure information in this yet, so we
+ //postpone any logging
+ const std::string in_actionStr(actionStr);
+ CLog::Log(LOGDEBUG,"%s : Translating action string", __FUNCTION__);
CGUIInfoLabel info(actionStr, "");
actionStr = info.GetLabel(0);
- CLog::Log(LOGDEBUG,"%s : To %s", __FUNCTION__, actionStr.c_str());
// user has asked for something to be executed
if (CBuiltins::HasCommand(actionStr))
PlayFile(item);
}
else
+ {
+ //At this point we have given up to translate, so even though
+ //there may be insecure information, we log it.
+ CLog::Log(LOGDEBUG,"%s : Tried translating, but failed to understand %s", __FUNCTION__, in_actionStr.c_str());
return false;
+ }
}
return true;
}
#if defined(TARGET_DARWIN_IOS)
friend class CWinEventsIOS;
#endif
+#if defined(TARGET_ANDROID)
+ friend class CWinEventsAndroid;
+#endif
// screensaver
bool m_bScreenSave;
ADDON::AddonPtr m_screenSaver;
bool ProcessGamepad(float frameTime);
bool ProcessEventServer(float frameTime);
bool ProcessPeripherals(float frameTime);
- bool ProcessJoystickEvent(const std::string& joystickName, int button, bool isAxis, float fAmount, unsigned int holdTime = 0);
+ bool ProcessJoystickEvent(const std::string& joystickName, int button, short inputType, float fAmount, unsigned int holdTime = 0);
bool ExecuteInputAction(const CAction &action);
int GetActiveWindowID(void);
#include "ApplicationPlayer.h"
#include "cores/IPlayer.h"
+#include "Application.h"
#define VOLUME_MINIMUM 0.0f // -60dB
#define VOLUME_MAXIMUM 1.0f // 0dB
{
if (m_iPlaySpeed == 1)
{ // restore volume
- player->SetVolume(VOLUME_MAXIMUM);
+ player->SetVolume(g_application.GetVolume(false));
}
else
{ // mute volume
CFile file;
if (file.Open(GetDiscFileCache(windowID)))
{
- CLog::Log(LOGDEBUG,"Loading fileitems [%s]",GetPath().c_str());
CArchive ar(&file, CArchive::load);
ar >> *this;
- CLog::Log(LOGDEBUG," -- items: %i, directory: %s sort method: %i, ascending: %s", Size(), GetPath().c_str(), m_sortDescription.sortBy,
+ CLog::Log(LOGDEBUG,"Loading items: %i, directory: %s sort method: %i, ascending: %s", Size(), CURL::GetRedacted(GetPath()).c_str(), m_sortDescription.sortBy,
m_sortDescription.sortOrder == SortOrderAscending ? "true" : "false");
ar.Close();
file.Close();
if (iSize <= 0)
return false;
- CLog::Log(LOGDEBUG,"Saving fileitems [%s]",GetPath().c_str());
+ CLog::Log(LOGDEBUG,"Saving fileitems [%s]", CURL::GetRedacted(GetPath()).c_str());
CFile file;
if (file.OpenForWrite(GetDiscFileCache(windowID), true)) // overwrite always
--- /dev/null
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "FileItemListModification.h"
+
+#include "playlists/SmartPlaylistFileItemListModifier.h"
+
+using namespace std;
+
+CFileItemListModification::CFileItemListModification()
+{
+ m_modifiers.insert(new CSmartPlaylistFileItemListModifier());
+}
+
+CFileItemListModification::~CFileItemListModification()
+{
+ for (set<IFileItemListModifier*>::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier)
+ delete *modifier;
+
+ m_modifiers.clear();
+}
+
+CFileItemListModification& CFileItemListModification::Get()
+{
+ static CFileItemListModification instance;
+ return instance;
+}
+
+bool CFileItemListModification::CanModify(const CFileItemList &items) const
+{
+ for (set<IFileItemListModifier*>::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier)
+ {
+ if ((*modifier)->CanModify(items))
+ return true;
+ }
+
+ return false;
+}
+
+bool CFileItemListModification::Modify(CFileItemList &items) const
+{
+ bool result = false;
+ for (set<IFileItemListModifier*>::const_iterator modifier = m_modifiers.begin(); modifier != m_modifiers.end(); ++modifier)
+ result |= (*modifier)->Modify(items);
+
+ return result;
+}
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <set>
+
+#include "IFileItemListModifier.h"
+
+class CFileItemListModification : public IFileItemListModifier
+{
+public:
+ ~CFileItemListModification();
+
+ static CFileItemListModification& Get();
+
+ virtual bool CanModify(const CFileItemList &items) const;
+ virtual bool Modify(CFileItemList &items) const;
+
+private:
+ CFileItemListModification();
+ CFileItemListModification(const CFileItemListModification&);
+ CFileItemListModification const& operator=(CFileItemListModification const&);
+
+ std::set<IFileItemListModifier*> m_modifiers;
+};
void CGUIInfoManager::SetCurrentMovie(CFileItem &item)
{
- CLog::Log(LOGDEBUG,"CGUIInfoManager::SetCurrentMovie(%s)",item.GetPath().c_str());
+ CLog::Log(LOGDEBUG,"CGUIInfoManager::SetCurrentMovie(%s)", CURL::GetRedacted(item.GetPath()).c_str());
*m_currentFile = item;
/* also call GetMovieInfo() when a VideoInfoTag is already present or additional info won't be present in the tag */
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+class CFileItemList;
+
+class IFileItemListModifier
+{
+public:
+ IFileItemListModifier() { }
+ virtual ~IFileItemListModifier() { }
+
+ virtual bool CanModify(const CFileItemList &items) const = 0;
+ virtual bool Modify(CFileItemList &items) const = 0;
+};
DbUrl.cpp \
DynamicDll.cpp \
FileItem.cpp \
+ FileItemListModification.cpp \
GitRevision.cpp \
GUIInfoManager.cpp \
GUILargeTextureManager.cpp \
CStdString CTextureCache::GetCachedImage(const CStdString &image, CTextureDetails &details, bool trackUsage)
{
- CStdString url = UnwrapImageURL(image);
+ CStdString url = CTextureUtils::UnwrapImageURL(image);
if (IsCachedImage(url))
return url;
return "";
}
-CStdString CTextureCache::GetWrappedImageURL(const CStdString &image, const CStdString &type, const CStdString &options)
-{
- if (StringUtils::StartsWith(image, "image://"))
- return image; // already wrapped
-
- CURL url;
- url.SetProtocol("image");
- url.SetUserName(type);
- url.SetHostName(image);
- if (!options.IsEmpty())
- {
- url.SetFileName("transform");
- url.SetOptions("?" + options);
- }
- return url.Get();
-}
-
-CStdString CTextureCache::GetWrappedThumbURL(const CStdString &image)
-{
- return GetWrappedImageURL(image, "", "size=thumb");
-}
-
-CStdString CTextureCache::UnwrapImageURL(const CStdString &image)
-{
- if (StringUtils::StartsWith(image, "image://"))
- {
- CURL url(image);
- if (url.GetUserName().IsEmpty() && url.GetOptions().IsEmpty())
- return url.GetHostName();
- }
- return image;
-}
-
bool CTextureCache::CanCacheImageURL(const CURL &url)
{
return (url.GetUserName().empty() || url.GetUserName() == "music");
return; // image is already cached and doesn't need to be checked further
// needs (re)caching
- AddJob(new CTextureCacheJob(UnwrapImageURL(url), details.hash));
+ AddJob(new CTextureCacheJob(CTextureUtils::UnwrapImageURL(url), details.hash));
}
bool CTextureCache::CacheImage(const CStdString &image, CTextureDetails &details)
CStdString CTextureCache::CacheImage(const CStdString &image, CBaseTexture **texture, CTextureDetails *details)
{
- CStdString url = UnwrapImageURL(image);
+ CStdString url = CTextureUtils::UnwrapImageURL(image);
CSingleLock lock(m_processingSection);
if (m_processing.find(url) == m_processing.end())
{
CFile::Delete(path);
}
+bool CTextureCache::ClearCachedImage(int id)
+{
+ CStdString cachedFile;
+ if (ClearCachedTexture(id, cachedFile))
+ {
+ cachedFile = GetCachedPath(cachedFile);
+ if (CFile::Exists(cachedFile))
+ CFile::Delete(cachedFile);
+ cachedFile = URIUtils::ReplaceExtension(cachedFile, ".dds");
+ if (CFile::Exists(cachedFile))
+ CFile::Delete(cachedFile);
+ return true;
+ }
+ return false;
+}
+
bool CTextureCache::GetCachedTexture(const CStdString &url, CTextureDetails &details)
{
CSingleLock lock(m_databaseSection);
return m_database.ClearCachedTexture(url, cachedURL);
}
+bool CTextureCache::ClearCachedTexture(int id, CStdString &cachedURL)
+{
+ CSingleLock lock(m_databaseSection);
+ return m_database.ClearCachedTexture(id, cachedURL);
+}
+
CStdString CTextureCache::GetCacheFile(const CStdString &url)
{
Crc32 crc;
*/
void ClearCachedImage(const CStdString &image, bool deleteSource = false);
+ /*! \brief clear the cached version of the image with given id
+ \param database id of the image
+ \sa GetCachedImage
+ */
+ bool ClearCachedImage(int textureID);
+
/*! \brief retrieve a cache file (relative to the cache path) to associate with the given image, excluding extension
Use GetCachedPath(GetCacheFile(url)+extension) for the full path to the file.
\param url location of the image
*/
static CStdString GetCachedPath(const CStdString &file);
- /*! \brief retrieve a wrapped URL for a image file
- \param image name of the file
- \param type signifies a special type of image (eg embedded video thumb, picture folder thumb)
- \param options which options we need (eg size=thumb)
- \return full wrapped URL of the image file
- */
- static CStdString GetWrappedImageURL(const CStdString &image, const CStdString &type = "", const CStdString &options = "");
- static CStdString GetWrappedThumbURL(const CStdString &image);
-
- /*! \brief Unwrap an image://<url_encoded_path> style URL
- Such urls are used for art over the webserver or other users of the VFS
- \param image url of the image
- \return the unwrapped URL, or the original URL if unwrapping is inappropriate.
- */
- static CStdString UnwrapImageURL(const CStdString &image);
-
/*! \brief check whether an image:// URL may be cached
\param url the URL to the image
\return true if the given URL may be cached, false otherwise
\return true if we had a cached version of this image, false otherwise.
*/
bool ClearCachedTexture(const CStdString &url, CStdString &cacheFile);
+ bool ClearCachedTexture(int textureID, CStdString &cacheFile);
/*! \brief Increment the use count of a texture
Stores locally before calling CTextureDatabase::IncrementUseCount via a CUseCountJob
#include "XBDateTime.h"
#include "dbwrappers/dataset.h"
#include "URL.h"
+#include "utils/StringUtils.h"
+#include "utils/Variant.h"
+
+enum TextureField
+{
+ TF_None = 0,
+ TF_Id,
+ TF_Url,
+ TF_CachedUrl,
+ TF_LastHashCheck,
+ TF_ImageHash,
+ TF_Width,
+ TF_Height,
+ TF_UseCount,
+ TF_LastUsed,
+ TF_Max
+};
+
+typedef struct
+{
+ char string[14];
+ TextureField field;
+ CDatabaseQueryRule::FIELD_TYPE type;
+ bool browseable;
+ int localizedString;
+} translateField;
+
+static const translateField fields[] = {
+ { "none", TF_None, CDatabaseQueryRule::TEXT_FIELD },
+ { "textureid", TF_Id, CDatabaseQueryRule::NUMERIC_FIELD },
+ { "url", TF_Url, CDatabaseQueryRule::TEXT_FIELD },
+ { "cachedurl", TF_CachedUrl, CDatabaseQueryRule::TEXT_FIELD },
+ { "lasthashcheck", TF_LastHashCheck, CDatabaseQueryRule::TEXT_FIELD },
+ { "imagehash", TF_ImageHash, CDatabaseQueryRule::TEXT_FIELD },
+ { "width", TF_Width, CDatabaseQueryRule::NUMERIC_FIELD },
+ { "height", TF_Height, CDatabaseQueryRule::NUMERIC_FIELD },
+ { "usecount", TF_UseCount, CDatabaseQueryRule::NUMERIC_FIELD },
+ { "lastused", TF_LastUsed, CDatabaseQueryRule::TEXT_FIELD }
+};
+
+static const size_t NUM_FIELDS = sizeof(fields) / sizeof(translateField);
+
+int CTextureRule::TranslateField(const char *field) const
+{
+ for (unsigned int i = 0; i < NUM_FIELDS; i++)
+ if (StringUtils::EqualsNoCase(field, fields[i].string)) return fields[i].field;
+ return FieldNone;
+}
+
+CStdString CTextureRule::TranslateField(int field) const
+{
+ for (unsigned int i = 0; i < NUM_FIELDS; i++)
+ if (field == fields[i].field) return fields[i].string;
+ return "none";
+}
+
+CStdString CTextureRule::GetField(int field, const CStdString &type) const
+{
+ if (field == TF_Id) return "texture.id";
+ else if (field == TF_Url) return "texture.url";
+ else if (field == TF_CachedUrl) return "texture.cachedurl";
+ else if (field == TF_LastHashCheck) return "texture.lasthashcheck";
+ else if (field == TF_ImageHash) return "texture.imagehash";
+ else if (field == TF_Width) return "sizes.width";
+ else if (field == TF_Height) return "sizes.height";
+ else if (field == TF_UseCount) return "sizes.usecount";
+ else if (field == TF_LastUsed) return "sizes.lastusetime";
+ return "";
+}
+
+CDatabaseQueryRule::FIELD_TYPE CTextureRule::GetFieldType(int field) const
+{
+ for (unsigned int i = 0; i < NUM_FIELDS; i++)
+ if (field == fields[i].field) return fields[i].type;
+ return TEXT_FIELD;
+}
+
+CStdString CTextureRule::FormatParameter(const CStdString &operatorString, const CStdString ¶m, const CDatabase &db, const CStdString &strType) const
+{
+ CStdString parameter(param);
+ if (m_field == TF_Url)
+ parameter = CTextureUtils::UnwrapImageURL(param);
+ return CDatabaseQueryRule::FormatParameter(operatorString, parameter, db, strType);
+}
+
+void CTextureRule::GetAvailableFields(std::vector<std::string> &fieldList)
+{
+ // start at 1 to skip TF_None
+ for (unsigned int i = 1; i < NUM_FIELDS; i++)
+ fieldList.push_back(fields[i].string);
+}
+
+CStdString CTextureUtils::GetWrappedImageURL(const CStdString &image, const CStdString &type, const CStdString &options)
+{
+ if (StringUtils::StartsWith(image, "image://"))
+ return image; // already wrapped
+
+ CURL url;
+ url.SetProtocol("image");
+ url.SetUserName(type);
+ url.SetHostName(image);
+ if (!options.IsEmpty())
+ {
+ url.SetFileName("transform");
+ url.SetOptions("?" + options);
+ }
+ return url.Get();
+}
+
+CStdString CTextureUtils::GetWrappedThumbURL(const CStdString &image)
+{
+ return GetWrappedImageURL(image, "", "size=thumb");
+}
+
+CStdString CTextureUtils::UnwrapImageURL(const CStdString &image)
+{
+ if (StringUtils::StartsWith(image, "image://"))
+ {
+ CURL url(image);
+ if (url.GetUserName().IsEmpty() && url.GetOptions().IsEmpty())
+ return url.GetHostName();
+ }
+ return image;
+}
CTextureDatabase::CTextureDatabase()
{
return false;
}
+bool CTextureDatabase::GetTextures(CVariant &items, const Filter &filter)
+{
+ try
+ {
+ if (NULL == m_pDB.get()) return false;
+ if (NULL == m_pDS.get()) return false;
+
+ CStdString sql = "SELECT %s FROM texture JOIN sizes ON (texture.id=sizes.idtexture AND sizes.size=1)";
+ CStdString sqlFilter;
+ if (!CDatabase::BuildSQL("", filter, sqlFilter))
+ return false;
+
+ sql = PrepareSQL(sql, !filter.fields.empty() ? filter.fields.c_str() : "*") + sqlFilter;
+ if (!m_pDS->query(sql.c_str()))
+ return false;
+
+ while (!m_pDS->eof())
+ {
+ CVariant texture;
+ texture["textureid"] = m_pDS->fv(0).get_asInt();
+ texture["url"] = m_pDS->fv(1).get_asString();
+ texture["cachedurl"] = m_pDS->fv(2).get_asString();
+ texture["imagehash"] = m_pDS->fv(3).get_asString();
+ texture["lasthashcheck"] = m_pDS->fv(4).get_asString();
+ CVariant size(CVariant::VariantTypeObject);
+ // 5 is sizes.idtexture
+ size["size"] = m_pDS->fv(6).get_asInt();
+ size["width"] = m_pDS->fv(7).get_asInt();
+ size["height"] = m_pDS->fv(8).get_asInt();
+ size["usecount"] = m_pDS->fv(9).get_asInt();
+ size["lastused"] = m_pDS->fv(10).get_asString();
+ texture["sizes"] = CVariant(CVariant::VariantTypeArray);
+ texture["sizes"].push_back(size);
+ items.push_back(texture);
+ m_pDS->next();
+ }
+ m_pDS->close();
+ return true;
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "%s, failed", __FUNCTION__);
+ }
+ return false;
+}
+
bool CTextureDatabase::SetCachedTextureValid(const CStdString &url, bool updateable)
{
CStdString date = updateable ? CDateTime::GetCurrentDateTime().GetAsDBDateTime() : "";
bool CTextureDatabase::ClearCachedTexture(const CStdString &url, CStdString &cacheFile)
{
+ std::string id = GetSingleValue(PrepareSQL("select id from texture where url='%s'", url.c_str()));
+ return !id.empty() ? ClearCachedTexture(strtol(id.c_str(), NULL, 10), cacheFile) : false;
+}
+
+bool CTextureDatabase::ClearCachedTexture(int id, CStdString &cacheFile)
+{
try
{
if (NULL == m_pDB.get()) return false;
if (NULL == m_pDS.get()) return false;
- CStdString sql = PrepareSQL("select id, cachedurl from texture where url='%s'", url.c_str());
+ CStdString sql = PrepareSQL("select cachedurl from texture where id=%u", id);
m_pDS->query(sql.c_str());
if (!m_pDS->eof())
{ // have some information
- int textureID = m_pDS->fv(0).get_asInt();
- cacheFile = m_pDS->fv(1).get_asString();
+ cacheFile = m_pDS->fv(0).get_asString();
m_pDS->close();
// remove it
- sql = PrepareSQL("delete from texture where id=%u", textureID);
+ sql = PrepareSQL("delete from texture where id=%u", id);
m_pDS->exec(sql.c_str());
return true;
}
}
catch (...)
{
- CLog::Log(LOGERROR, "%s, failed on url '%s'", __FUNCTION__, url.c_str());
+ CLog::Log(LOGERROR, "%s, failed on texture id %u", __FUNCTION__, id);
}
return false;
}
}
return;
}
+
+CDatabaseQueryRule *CTextureDatabase::CreateRule() const
+{
+ return new CTextureRule();
+}
+
+CDatabaseQueryRuleCombination *CTextureDatabase::CreateCombination() const
+{
+ return new CDatabaseQueryRuleCombination();
+}
#include "dbwrappers/Database.h"
#include "TextureCacheJob.h"
+#include "playlists/SmartPlayList.h"
-class CTextureDatabase : public CDatabase
+class CVariant;
+
+class CTextureRule : public CDatabaseQueryRule
+{
+public:
+ CTextureRule() {};
+ virtual ~CTextureRule() {};
+
+ static void GetAvailableFields(std::vector<std::string> &fieldList);
+protected:
+ virtual int TranslateField(const char *field) const;
+ virtual CStdString TranslateField(int field) const;
+ virtual CStdString GetField(int field, const CStdString& type) const;
+ virtual FIELD_TYPE GetFieldType(int field) const;
+ virtual CStdString FormatParameter(const CStdString &negate, const CStdString &oper, const CDatabase &db, const CStdString &type) const;
+};
+
+class CTextureUtils
+{
+public:
+ /*! \brief retrieve a wrapped URL for a image file
+ \param image name of the file
+ \param type signifies a special type of image (eg embedded video thumb, picture folder thumb)
+ \param options which options we need (eg size=thumb)
+ \return full wrapped URL of the image file
+ */
+ static CStdString GetWrappedImageURL(const CStdString &image, const CStdString &type = "", const CStdString &options = "");
+ static CStdString GetWrappedThumbURL(const CStdString &image);
+
+ /*! \brief Unwrap an image://<url_encoded_path> style URL
+ Such urls are used for art over the webserver or other users of the VFS
+ \param image url of the image
+ \return the unwrapped URL, or the original URL if unwrapping is inappropriate.
+ */
+ static CStdString UnwrapImageURL(const CStdString &image);
+};
+
+class CTextureDatabase : public CDatabase, public IDatabaseQueryRuleFactory
{
public:
CTextureDatabase();
bool AddCachedTexture(const CStdString &originalURL, const CTextureDetails &details);
bool SetCachedTextureValid(const CStdString &originalURL, bool updateable);
bool ClearCachedTexture(const CStdString &originalURL, CStdString &cacheFile);
+ bool ClearCachedTexture(int textureID, CStdString &cacheFile);
bool IncrementUseCount(const CTextureDetails &details);
/*! \brief Invalidate a previously cached texture
*/
void ClearTextureForPath(const CStdString &url, const CStdString &type);
+ bool GetTextures(CVariant &items, const Filter &filter);
+
+ // rule creation
+ virtual CDatabaseQueryRule *CreateRule() const;
+ virtual CDatabaseQueryRuleCombination *CreateCombination() const;
protected:
/*! \brief retrieve a hash for the given url
Computes a hash of the current url to use for lookups in the database
strURL = GetWithoutFilename();
strURL += m_strFileName;
- if( m_strOptions.length() > 0 )
+ if( !m_strOptions.empty() )
strURL += m_strOptions;
- if (m_strProtocolOptions.length() > 0)
+ if (!m_strProtocolOptions.empty())
strURL += "|"+m_strProtocolOptions;
return strURL;
}
-CStdString CURL::GetWithoutUserDetails() const
+std::string CURL::GetWithoutUserDetails(bool redact) const
{
- CStdString strURL;
+ std::string strURL;
if (m_strProtocol.Equals("stack"))
{
CFileItemList items;
- CStdString strURL2;
+ std::string strURL2;
strURL2 = Get();
XFILE::CStackDirectory dir;
dir.GetDirectory(strURL2,items);
- vector<CStdString> newItems;
+ vector<std::string> newItems;
for (int i=0;i<items.Size();++i)
{
CURL url(items[i]->GetPath());
- items[i]->SetPath(url.GetWithoutUserDetails());
+ items[i]->SetPath(url.GetWithoutUserDetails(redact));
newItems.push_back(items[i]->GetPath());
}
- dir.ConstructStackPath(newItems,strURL);
+ dir.ConstructStackPath(newItems, strURL);
return strURL;
}
+ m_strProtocolOptions.length()
+ 10;
+ if (redact)
+ sizeneed += sizeof("USERNAME:PASSWORD@");
+
strURL.reserve(sizeneed);
if (m_strProtocol == "")
strURL = m_strProtocol;
strURL += "://";
- if (m_strHostName != "")
+ if (redact && !m_strUserName.empty())
+ {
+ strURL += "USERNAME";
+ if (!m_strPassword.empty())
+ {
+ strURL += ":PASSWORD";
+ }
+ strURL += "@";
+ }
+
+ if (!m_strHostName.empty())
{
- CStdString strHostName;
+ std::string strHostName;
if (URIUtils::ProtocolHasParentInHostname(m_strProtocol))
strHostName = CURL(m_strHostName).GetWithoutUserDetails();
if ( HasPort() )
{
- CStdString strPort;
- strPort.Format("%i", m_iPort);
- strURL += ":";
- strURL += strPort;
+ strURL += StringUtils::Format(":%i", m_iPort);
}
strURL += "/";
}
return strURL;
}
+std::string CURL::GetRedacted() const
+{
+ return GetWithoutUserDetails(true);
+}
+
+std::string CURL::GetRedacted(const std::string& path)
+{
+ return CURL(path).GetRedacted();
+}
+
bool CURL::IsLocal() const
{
return (IsLocalHost() || m_strProtocol.IsEmpty());
char GetDirectorySeparator() const;
CStdString Get() const;
- CStdString GetWithoutUserDetails() const;
+ std::string GetWithoutUserDetails(bool redact = false) const;
CStdString GetWithoutFilename() const;
+ std::string GetRedacted() const;
+ static std::string GetRedacted(const std::string& path);
bool IsLocal() const;
bool IsLocalHost() const;
static bool IsFileOnly(const CStdString &url); ///< return true if there are no directories in the url.
#define AKEYCODE_FORWARD 125
#define AKEYCODE_MEDIA_PLAY 126
#define AKEYCODE_MEDIA_EJECT 129
+
+#define AINPUT_SOURCE_CLASS_JOYSTICK 0x00000010
+
+#define AINPUT_SOURCE_GAMEPAD (0x00000400 | AINPUT_SOURCE_CLASS_BUTTON)
+#define AINPUT_SOURCE_JOYSTICK (0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK)
+
+// 1st stick X, Y
+#define AMOTION_EVENT_AXIS_X 0
+#define AMOTION_EVENT_AXIS_Y 1
+// 2nd stick X, Y
+#define AMOTION_EVENT_AXIS_Z 11
+#define AMOTION_EVENT_AXIS_RZ 14
+// d-pad X, Y
+#define AMOTION_EVENT_AXIS_HAT_X 15
+#define AMOTION_EVENT_AXIS_HAT_Y 16
+// trigger left, right
+#define AMOTION_EVENT_AXIS_LTRIGGER 17
+#define AMOTION_EVENT_AXIS_RTRIGGER 18
--- /dev/null
+/*
+ * Copyright (C) 2012-2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "AndroidJoyStick.h"
+#include "AndroidExtra.h"
+#include "XBMCApp.h"
+#include "android/jni/View.h"
+#include "android/activity/AndroidFeatures.h"
+#include "utils/log.h"
+#include "windowing/WinEvents.h"
+#include "windowing/XBMC_events.h"
+#include "utils/TimeUtils.h"
+
+#include <android/input.h>
+
+
+#include <math.h>
+#include <dlfcn.h>
+
+//#define DEBUG_VERBOSE
+
+// mapping to axis IDs codes in keymaps.xmls
+enum {
+ AXIS_LEFT_STICK_L_R = 1,
+ AXIS_LEFT_STICK_U_D = 2,
+ AXIS_TRIGGER = 3,
+ AXIS_RIGHT_STICK_L_R = 4,
+ AXIS_RIGHT_STICK_U_D = 5,
+};
+
+typedef struct {
+ int32_t nativeKey;
+ int16_t xbmcID;
+} KeyMap;
+
+// mapping to button codes in keymaps.xmls
+static const KeyMap ButtonMap[] = {
+ { AKEYCODE_BUTTON_A , 1 },
+ { AKEYCODE_BUTTON_B , 2 },
+ { AKEYCODE_BUTTON_X , 3 },
+ { AKEYCODE_BUTTON_Y , 4 },
+ { AKEYCODE_BUTTON_L1 , 5 },
+ { AKEYCODE_BUTTON_R1 , 6 },
+ { AKEYCODE_BUTTON_SELECT , 7 },
+ { AKEYCODE_BUTTON_START , 8 },
+ { AKEYCODE_BUTTON_THUMBL , 9 },
+ { AKEYCODE_BUTTON_THUMBR , 10 },
+ { AKEYCODE_DPAD_UP , 11 },
+ { AKEYCODE_DPAD_DOWN , 12 },
+ { AKEYCODE_DPAD_LEFT , 13 },
+ { AKEYCODE_DPAD_RIGHT , 14 },
+ { AKEYCODE_BUTTON_L2 , 16 },
+ { AKEYCODE_BUTTON_R2 , 17 },
+ { AKEYCODE_BUTTON_C , 51 },
+ { AKEYCODE_BUTTON_Z , 52 },
+};
+
+// missing in early NDKs, is present in r9b+
+extern float AMotionEvent_getAxisValue(const AInputEvent* motion_event, int32_t axis, size_t pointer_index);
+static typeof(AMotionEvent_getAxisValue) *p_AMotionEvent_getAxisValue;
+#define AMotionEvent_getAxisValue (*p_AMotionEvent_getAxisValue)
+
+/************************************************************************/
+/************************************************************************/
+static float AxisClampAsButton(const APP_InputDeviceAxis &axis, float value)
+{
+ // Clamp Axis so it acts like a D-Pad, return -1, 0 or +1
+ if (fabs(value) < axis.buttonclamp)
+ return 0.0;
+ else
+ return value < 0.0 ? -1.0:1.0;
+}
+
+static void LogAxisValues(int axis_id, const APP_InputDeviceAxis &axis)
+{
+ CLog::Log(LOGDEBUG, "LogAxisValues: "
+ "axis(%d) Enabled(%d) Max(%f) Min(%f) Range(%f) Flat(%f) Fuzz(%f)",
+ axis_id, axis.enabled, axis.max, axis.min, axis.range, axis.flat, axis.fuzz);
+}
+
+static void SetAxisFromValues(const float min, const float max,
+ const float flat, const float fuzz, const float range, APP_InputDeviceAxis &axis)
+{
+ axis.min = min;
+ axis.max = max;
+ axis.flat = flat;
+ axis.fuzz = fuzz;
+ axis.range= range;
+ // precalc some internals
+ axis.deadzone= axis.flat + axis.fuzz;
+ if (axis.deadzone < 0.1f)
+ axis.deadzone = 0.1f;
+ axis.buttonclamp = axis.range / 4.0f;
+}
+
+static void SetupAxis(const CJNIViewInputDevice &input_device, APP_InputDeviceAxis &axis, int axis_id, int source)
+{
+ CJNIViewInputDeviceMotionRange range = input_device.getMotionRange(axis_id, source);
+
+ SetAxisFromValues(range.getMin(), range.getMax(), range.getFlat(), range.getFuzz(), range.getRange(), axis);
+ axis.enabled = true;
+}
+
+static void SetupJoySticks(APP_InputDeviceAxes *axes, int device)
+{
+ axes->id = device;
+ memset(&axes->x_hat, 0x00, sizeof(APP_InputDeviceAxis));
+ memset(&axes->y_hat, 0x00, sizeof(APP_InputDeviceAxis));
+ memset(&axes->x_axis, 0x00, sizeof(APP_InputDeviceAxis));
+ memset(&axes->y_axis, 0x00, sizeof(APP_InputDeviceAxis));
+ memset(&axes->z_axis, 0x00, sizeof(APP_InputDeviceAxis));
+ memset(&axes->rz_axis,0x00, sizeof(APP_InputDeviceAxis));
+
+ CJNIViewInputDevice input_device = CJNIViewInputDevice::getDevice(axes->id);
+ int device_sources = input_device.getSources();
+ std::string device_name = input_device.getName();
+
+ CLog::Log(LOGDEBUG, "SetupJoySticks:caching id(%d), sources(%d), device(%s)",
+ axes->id, device_sources, device_name.c_str());
+
+ CJNIList<CJNIViewInputDeviceMotionRange> device_ranges = input_device.getMotionRanges();
+ for (int i = 0; i < device_ranges.size(); i++)
+ {
+ int axis = device_ranges.get(i).getAxis();
+ int source = device_ranges.get(i).getSource();
+#ifdef DEBUG_VERBOSE
+ CLog::Log(LOGDEBUG, "SetupJoySticks:range(%d), axis(%d), source(%d)", i, axis, source);
+#endif
+
+ // ignore anything we do not understand
+ if (source != AINPUT_SOURCE_JOYSTICK)
+ continue;
+
+ // match axis/source to our handlers
+ // anything that is not present, will be disabled
+ switch(axis)
+ {
+ // Left joystick
+ case AMOTION_EVENT_AXIS_X:
+ SetupAxis(input_device, axes->x_axis, axis, source);
+ break;
+ break;
+ case AMOTION_EVENT_AXIS_Y:
+ SetupAxis(input_device, axes->y_axis, axis, source);
+ break;
+
+ // Right joystick
+ case AMOTION_EVENT_AXIS_Z:
+ SetupAxis(input_device, axes->z_axis, axis, source);
+ break;
+ case AMOTION_EVENT_AXIS_RZ:
+ SetupAxis(input_device, axes->rz_axis, axis, source);
+ break;
+
+ // D-Pad
+ case AMOTION_EVENT_AXIS_HAT_X:
+ SetupAxis(input_device, axes->x_hat, axis, source);
+ break;
+ case AMOTION_EVENT_AXIS_HAT_Y:
+ SetupAxis(input_device, axes->y_hat, axis, source);
+ break;
+ }
+ }
+
+ if (device_name.find("GameStick Controller") != std::string::npos)
+ {
+ // Right joystick seems to have a range of -0.5 to 0.5, fix the range
+ // Production GameStick Controllers should not have this problem
+ // and this quirk can vanish once verified.
+ SetAxisFromValues(-0.5f, 0.5f, 0.1f, 0.0f, 1.0f, axes->z_axis);
+ SetAxisFromValues(-0.5f, 0.5f, 0.1f, 0.0f, 1.0f, axes->rz_axis);
+ }
+
+#ifdef DEBUG_VERBOSE
+ LogAxisValues(AMOTION_EVENT_AXIS_X, axes->x_axis);
+ LogAxisValues(AMOTION_EVENT_AXIS_Y, axes->y_axis);
+ LogAxisValues(AMOTION_EVENT_AXIS_Z, axes->z_axis);
+ LogAxisValues(AMOTION_EVENT_AXIS_RZ, axes->rz_axis);
+ LogAxisValues(AMOTION_EVENT_AXIS_HAT_X, axes->x_hat);
+ LogAxisValues(AMOTION_EVENT_AXIS_HAT_Y, axes->y_hat);
+#endif
+}
+
+/************************************************************************/
+/************************************************************************/
+CAndroidJoyStick::CAndroidJoyStick()
+ : m_prev_device(0)
+ , m_prev_button(0)
+ , m_prev_holdtime(0)
+{
+ p_AMotionEvent_getAxisValue = (typeof(AMotionEvent_getAxisValue)*) dlsym(RTLD_DEFAULT, "AMotionEvent_getAxisValue");
+ CXBMCApp::android_printf("CAndroidJoystick: AMotionEvent_getAxisValue: %p", p_AMotionEvent_getAxisValue);
+}
+
+CAndroidJoyStick::~CAndroidJoyStick()
+{
+ while (!m_input_devices.empty())
+ {
+ APP_InputDeviceAxes *device_axes = m_input_devices.back();
+ delete device_axes;
+ m_input_devices.pop_back();
+ }
+}
+
+bool CAndroidJoyStick::onJoyStickKeyEvent(AInputEvent *event)
+{
+ if (event == NULL)
+ return false;
+
+ int32_t keycode = AKeyEvent_getKeyCode(event);
+ // watch this check, others might be different.
+ // AML IR Controller is AINPUT_SOURCE_GAMEPAD | AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_DPAD
+ // Gamestick Controller == AINPUT_SOURCE_GAMEPAD | AINPUT_SOURCE_KEYBOARD
+ // NVidiaShield Controller == AINPUT_SOURCE_GAMEPAD | AINPUT_SOURCE_KEYBOARD
+ // we want to reject AML IR Controller.
+ if (AInputEvent_getSource(event) == (AINPUT_SOURCE_GAMEPAD | AINPUT_SOURCE_KEYBOARD))
+ {
+ // GamePad events are AINPUT_EVENT_TYPE_KEY events,
+ // trap them here and revector valid ones as JoyButtons
+ // so we get keymap handling.
+ for (size_t i = 0; i < sizeof(ButtonMap) / sizeof(KeyMap); i++)
+ {
+ if (keycode == ButtonMap[i].nativeKey)
+ {
+ uint32_t holdtime = 0;
+ uint8_t button = ButtonMap[i].xbmcID;
+ int32_t action = AKeyEvent_getAction(event);
+ int32_t device = AInputEvent_getDeviceId(event);
+
+ if ((action == AKEY_EVENT_ACTION_UP))
+ {
+ // ProcessJoystickEvent does not understand up, ignore it.
+ m_prev_holdtime = m_prev_device = m_prev_button = 0;
+ return false;
+ }
+ else
+ {
+ if (m_prev_holdtime && device == m_prev_device && button == m_prev_button)
+ {
+ holdtime = CTimeUtils::GetFrameTime() - m_prev_holdtime;
+ }
+ else
+ {
+ m_prev_holdtime = CTimeUtils::GetFrameTime();
+ m_prev_device = device;
+ m_prev_button = button;
+ }
+ }
+
+ XBMC_JoyButton(device, button, holdtime, action == AKEY_EVENT_ACTION_UP);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool CAndroidJoyStick::onJoyStickMotionEvent(AInputEvent *event)
+{
+ if (event == NULL)
+ return false;
+
+ // match this device to a created device struct,
+ // create it if we do not find it.
+ APP_InputDeviceAxes *device_axes = NULL;
+ int32_t device = AInputEvent_getDeviceId(event);
+ // look for device name in our inputdevice cache.
+ for (size_t i = 0; i < m_input_devices.size(); i++)
+ {
+ if (m_input_devices[i]->id == device)
+ device_axes = m_input_devices[i];
+ }
+ if (!device_axes)
+ {
+ // as we see each axis, create a device axes and cache it.
+ device_axes = new APP_InputDeviceAxes;
+ SetupJoySticks(device_axes, device);
+ m_input_devices.push_back(device_axes);
+ }
+
+ // handle queued motion events, we
+ // ingnore history as it only relates to touch.
+ for (size_t p = 0; p < AMotionEvent_getPointerCount(event); p++)
+ ProcessMotionEvents(event, p, device, device_axes);
+
+ return true;
+}
+
+void CAndroidJoyStick::ProcessMotionEvents(AInputEvent *event,
+ size_t pointer_index, int32_t device, APP_InputDeviceAxes *axes)
+{
+ // Left joystick
+ if (axes->y_axis.enabled)
+ ProcessAxis(event, pointer_index, axes->y_axis, device, AXIS_LEFT_STICK_L_R, AMOTION_EVENT_AXIS_Y);
+ if (axes->x_axis.enabled)
+ ProcessAxis(event, pointer_index, axes->x_axis, device, AXIS_LEFT_STICK_U_D, AMOTION_EVENT_AXIS_X);
+
+ // Right joystick
+ if (axes->z_axis.enabled)
+ ProcessAxis(event, pointer_index, axes->z_axis, device, AXIS_RIGHT_STICK_L_R, AMOTION_EVENT_AXIS_Z);
+ if (axes->rz_axis.enabled)
+ ProcessAxis(event, pointer_index, axes->rz_axis,device, AXIS_RIGHT_STICK_U_D, AMOTION_EVENT_AXIS_RZ);
+
+ // Dpad
+ if (axes->y_hat.enabled)
+ ProcessHat(event, pointer_index, axes->y_hat, device, AMOTION_EVENT_AXIS_HAT_Y);
+ if (axes->x_hat.enabled)
+ ProcessHat(event, pointer_index, axes->x_hat, device, AMOTION_EVENT_AXIS_HAT_X);
+
+#ifdef DEBUG_VERBOSE
+ CLog::Log(LOGDEBUG, "joystick event. x(%f), y(%f)", axes->x_axis.value, axes->y_axis.value);
+ CLog::Log(LOGDEBUG, "joystick event. z(%f), rz(%f)", axes->z_axis.value, axes->rz_axis.value);
+ CLog::Log(LOGDEBUG, "joystick event. xhat(%f), yhat(%f)", axes->x_hat.value, axes->y_hat.value);
+#endif
+}
+
+bool CAndroidJoyStick::ProcessHat(AInputEvent *event, size_t pointer_index,
+ APP_InputDeviceAxis &hat, int device, int android_axis)
+{
+ bool rtn = false;
+ // Dpad (quantized to -1.0, 0.0 and 1.0)
+ float value = AMotionEvent_getAxisValue(event, android_axis, pointer_index);
+ if (value != hat.value)
+ {
+ u_int8_t hatvalue = XBMC_HAT_CENTERED;
+ if (value != 0)
+ switch (android_axis)
+ {
+ case AMOTION_EVENT_AXIS_HAT_X:
+ if (value < 0)
+ hatvalue |= XBMC_HAT_LEFT;
+ else
+ hatvalue |= XBMC_HAT_RIGHT;
+ break;
+
+ case AMOTION_EVENT_AXIS_HAT_Y:
+ if (value < 0)
+ hatvalue |= XBMC_HAT_UP;
+ else
+ hatvalue |= XBMC_HAT_DOWN;
+ break;
+ }
+
+ XBMC_JoyHat(device, hatvalue);
+ rtn = true;
+ }
+ hat.value = value;
+
+ return rtn;
+}
+
+bool CAndroidJoyStick::ProcessAxis(AInputEvent *event, size_t pointer_index,
+ APP_InputDeviceAxis &axis, int device, int keymap_axis, int android_axis)
+{
+ bool rtn = false;
+
+ float value = AMotionEvent_getAxisValue(event, android_axis, pointer_index);
+ //CLog::Log(LOGDEBUG, "ProcessAxis: keymap_axis(%d), value(%f)", keymap_axis, value);
+
+ value = AxisClampAsButton(axis, value);
+ if (value != axis.value)
+ {
+ XBMC_JoyAxis(device, keymap_axis, value);
+ rtn = true;
+ }
+ axis.value = value;
+
+ return rtn;
+}
+
+void CAndroidJoyStick::XBMC_JoyAxis(uint8_t device, uint8_t axis, float value)
+{
+ XBMC_Event newEvent = {};
+
+ newEvent.type = XBMC_JOYAXISMOTION;
+ newEvent.jaxis.type = XBMC_JOYAXISMOTION;
+ newEvent.jaxis.which = device;
+ newEvent.jaxis.axis = axis;
+ newEvent.jaxis.fvalue = value;
+
+#ifdef DEBUG_VERBOSE
+ CLog::Log(LOGDEBUG, "XBMC_Axis(%u, %u, %u, %f)", newEvent.type, device, axis, value);
+#endif
+ CWinEvents::MessagePush(&newEvent);
+}
+
+void CAndroidJoyStick::XBMC_JoyHat(uint8_t device, uint8_t value)
+{
+ XBMC_Event newEvent = {};
+
+ newEvent.type = XBMC_JOYHATMOTION;
+ newEvent.jhat.type = XBMC_JOYHATMOTION;
+ newEvent.jhat.which = device;
+ newEvent.jhat.hat = 1;
+ newEvent.jhat.value = value;
+
+#ifdef DEBUG_VERBOSE
+ CLog::Log(LOGDEBUG, "XBMC_Hat(%u, %u, %u)", newEvent.type, device, value);
+#endif
+ CWinEvents::MessagePush(&newEvent);
+}
+
+void CAndroidJoyStick::XBMC_JoyButton(uint8_t device, uint8_t button, uint32_t holdtime, bool up)
+{
+ XBMC_Event newEvent = {};
+
+ unsigned char type = up ? XBMC_JOYBUTTONUP : XBMC_JOYBUTTONDOWN;
+ newEvent.type = type;
+ newEvent.jbutton.type = type;
+ newEvent.jbutton.which = device;
+ newEvent.jbutton.button = button;
+ newEvent.jbutton.holdTime = holdtime;
+
+#ifdef DEBUG_VERBOSE
+ CXBMCApp::android_printf("CAndroidJoyStick::XBMC_JoyButton(%u, %u, %u, %d)",
+ newEvent.jbutton.type, newEvent.jbutton.which, newEvent.jbutton.button, newEvent.jbutton.holdTime);
+#endif
+
+ CWinEvents::MessagePush(&newEvent);
+}
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2012-2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <string>
+#include <vector>
+
+struct AInputEvent;
+
+typedef struct {
+ float flat;
+ float fuzz;
+ float min;
+ float max;
+ float range;
+ float value;
+ // internal helper values
+ bool enabled;
+ float deadzone;
+ float buttonclamp;
+} APP_InputDeviceAxis;
+
+typedef struct {
+ int32_t id;
+ APP_InputDeviceAxis x_hat;
+ APP_InputDeviceAxis y_hat;
+ APP_InputDeviceAxis x_axis;
+ APP_InputDeviceAxis y_axis;
+ APP_InputDeviceAxis z_axis;
+ APP_InputDeviceAxis rz_axis;
+} APP_InputDeviceAxes;
+
+class CAndroidJoyStick
+{
+public:
+ CAndroidJoyStick();
+ ~CAndroidJoyStick();
+
+ bool onJoyStickKeyEvent(AInputEvent* event);
+ bool onJoyStickMotionEvent(AInputEvent* event);
+
+private:
+ void ProcessMotionEvents(AInputEvent *event, size_t pointer_index,
+ int32_t device, APP_InputDeviceAxes *axes);
+ bool ProcessHat( AInputEvent *event, size_t pointer_index,
+ APP_InputDeviceAxis &hat, int device, int android_axis);
+ bool ProcessAxis(AInputEvent *event, size_t pointer_index,
+ APP_InputDeviceAxis &axis, int device, int keymap_axis, int android_axis);
+
+ void XBMC_JoyAxis(uint8_t device, uint8_t axis, float value);
+ void XBMC_JoyHat(uint8_t device, uint8_t value);
+ void XBMC_JoyButton(uint8_t device, uint8_t button, uint32_t holdtime, bool up);
+
+ uint8_t m_prev_device;
+ uint8_t m_prev_button;
+ uint32_t m_prev_holdtime;
+ std::vector<APP_InputDeviceAxes*> m_input_devices;
+};
*/
#include "AndroidKey.h"
+#include "AndroidExtra.h"
#include "XBMCApp.h"
#include "guilib/Key.h"
#include "windowing/WinEvents.h"
-#include "AndroidExtra.h"
+
+typedef struct {
+ int32_t nativeKey;
+ int16_t xbmcKey;
+} KeyMap;
static KeyMap keyMap[] = {
{ AKEYCODE_UNKNOWN , XBMCK_LAST },
{ AKEYCODE_MEDIA_EJECT , XBMCK_EJECT },
};
-bool CAndroidKey::onKeyboardEvent(AInputEvent* event)
+bool CAndroidKey::onKeyboardEvent(AInputEvent *event)
{
- CXBMCApp::android_printf("%s", __PRETTY_FUNCTION__);
if (event == NULL)
return false;
+ int32_t flags = AKeyEvent_getFlags(event);
+ int32_t state = AKeyEvent_getMetaState(event);
+ int32_t action = AKeyEvent_getAction(event);
+ int32_t repeat = AKeyEvent_getRepeatCount(event);
int32_t keycode = AKeyEvent_getKeyCode(event);
- int32_t flags = AKeyEvent_getFlags(event);
- int32_t state = AKeyEvent_getMetaState(event);
- int32_t repeatCount = AKeyEvent_getRepeatCount(event);
// Check if we got some special key
uint16_t sym = XBMCK_UNKNOWN;
break;
}
}
-
+
// check if this is a key we don't want to handle
if (sym == XBMCK_LAST || sym == XBMCK_UNKNOWN)
return false;
if (state & AMETA_SYM_ON)
modifiers |= 0x000?;*/
- switch (AKeyEvent_getAction(event))
+ switch (action)
{
case AKEY_EVENT_ACTION_DOWN:
- CXBMCApp::android_printf("CXBMCApp: key down (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
- keycode, repeatCount, flags,
- (state & AMETA_ALT_ON) ? "yes" : "no",
- (state & AMETA_SHIFT_ON) ? "yes" : "no",
- (state & AMETA_SYM_ON) ? "yes" : "no");
+#if 1
+ CXBMCApp::android_printf("CAndroidKey: key down (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
+ keycode, repeat, flags,
+ (state & AMETA_ALT_ON) ? "yes" : "no",
+ (state & AMETA_SHIFT_ON) ? "yes" : "no",
+ (state & AMETA_SYM_ON) ? "yes" : "no");
+#endif
XBMC_Key((uint8_t)keycode, sym, modifiers, false);
return true;
case AKEY_EVENT_ACTION_UP:
- CXBMCApp::android_printf("CXBMCApp: key up (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
- keycode, repeatCount, flags,
- (state & AMETA_ALT_ON) ? "yes" : "no",
- (state & AMETA_SHIFT_ON) ? "yes" : "no",
- (state & AMETA_SYM_ON) ? "yes" : "no");
+#if 1
+ CXBMCApp::android_printf("CAndroidKey: key up (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
+ keycode, repeat, flags,
+ (state & AMETA_ALT_ON) ? "yes" : "no",
+ (state & AMETA_SHIFT_ON) ? "yes" : "no",
+ (state & AMETA_SYM_ON) ? "yes" : "no");
+#endif
XBMC_Key((uint8_t)keycode, sym, modifiers, true);
return true;
case AKEY_EVENT_ACTION_MULTIPLE:
- CXBMCApp::android_printf("CXBMCApp: key multiple (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
- keycode, repeatCount, flags,
- (state & AMETA_ALT_ON) ? "yes" : "no",
- (state & AMETA_SHIFT_ON) ? "yes" : "no",
- (state & AMETA_SYM_ON) ? "yes" : "no");
+#if 1
+ CXBMCApp::android_printf("CAndroidKey: key multiple (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
+ keycode, repeat, flags,
+ (state & AMETA_ALT_ON) ? "yes" : "no",
+ (state & AMETA_SHIFT_ON) ? "yes" : "no",
+ (state & AMETA_SYM_ON) ? "yes" : "no");
+#endif
break;
default:
- CXBMCApp::android_printf("CXBMCApp: unknown key (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
- keycode, repeatCount, flags,
- (state & AMETA_ALT_ON) ? "yes" : "no",
- (state & AMETA_SHIFT_ON) ? "yes" : "no",
- (state & AMETA_SYM_ON) ? "yes" : "no");
+#if 1
+ CXBMCApp::android_printf("CAndroidKey: unknown key (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)",
+ keycode, repeat, flags,
+ (state & AMETA_ALT_ON) ? "yes" : "no",
+ (state & AMETA_SHIFT_ON) ? "yes" : "no",
+ (state & AMETA_SYM_ON) ? "yes" : "no");
+#endif
break;
}
newEvent.key.keysym.unicode = key;
newEvent.key.keysym.mod = (XBMCMod)modifiers;
- CXBMCApp::android_printf("XBMC_Key(%u, %u, 0x%04X, %d)", code, key, modifiers, up);
+ //CXBMCApp::android_printf("XBMC_Key(%u, %u, 0x%04X, %d)", code, key, modifiers, up);
CWinEvents::MessagePush(&newEvent);
}
*
*/
-#include <stdint.h>
#include <android/input.h>
-typedef struct {
- int32_t nativeKey;
- int16_t xbmcKey;
-} KeyMap;
+#include <stdint.h>
+#include <string>
+#include <vector>
class CAndroidKey
{
public:
- CAndroidKey(){};
- ~CAndroidKey(){};
+ CAndroidKey() {};
+ ~CAndroidKey() {};
+
+ bool onKeyboardEvent(AInputEvent *event);
void XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, bool up);
- bool onKeyboardEvent(AInputEvent* event);
-};
\ No newline at end of file
+ void XBMC_JoyButton(uint8_t id, uint8_t button, bool up);
+};
* <http://www.gnu.org/licenses/>.
*
*/
+
#include <android/input.h>
class CAndroidMouse
* <http://www.gnu.org/licenses/>.
*
*/
+
#include <android/input.h>
#include <math.h>
#include "EventLoop.h"
#include "XBMCApp.h"
+#include "AndroidExtra.h"
CEventLoop::CEventLoop(android_app* application)
: m_enabled(false),
int32_t CEventLoop::processInput(AInputEvent* event)
{
- int32_t type = AInputEvent_getType(event);
- switch (type)
+ int32_t rtn = 0;
+ int32_t type = AInputEvent_getType(event);
+ int32_t source = AInputEvent_getSource(event);
+
+ switch(type)
{
+ case AINPUT_EVENT_TYPE_KEY:
+ if (source & AINPUT_SOURCE_GAMEPAD || source & AINPUT_SOURCE_JOYSTICK)
+ {
+ if (m_inputHandler->onJoyStickKeyEvent(event))
+ return true;
+ }
+ if (source & AINPUT_SOURCE_CLASS_BUTTON)
+ rtn = m_inputHandler->onKeyboardEvent(event);
+ break;
case AINPUT_EVENT_TYPE_MOTION:
- switch (AInputEvent_getSource(event))
+ switch(source)
{
case AINPUT_SOURCE_TOUCHSCREEN:
- return m_inputHandler->onTouchEvent(event);
+ rtn = m_inputHandler->onTouchEvent(event);
+ break;
case AINPUT_SOURCE_MOUSE:
- return m_inputHandler->onMouseEvent(event);
+ rtn = m_inputHandler->onMouseEvent(event);
+ break;
+ case AINPUT_SOURCE_GAMEPAD:
+ case AINPUT_SOURCE_JOYSTICK:
+ rtn = m_inputHandler->onJoyStickMotionEvent(event);
+ break;
}
break;
-
- case AINPUT_EVENT_TYPE_KEY:
- return m_inputHandler->onKeyboardEvent(event);
}
- return 0;
+ return rtn;
}
void CEventLoop::activityCallback(android_app* application, int32_t command)
int32_t CEventLoop::inputCallback(android_app* application, AInputEvent* event)
{
- if (application == NULL || application->userData == NULL ||
- event == NULL)
+ if (application == NULL || application->userData == NULL || event == NULL)
return 0;
CEventLoop& eventLoop = *((CEventLoop*)application->userData);
+
return eventLoop.processInput(event);
}
#include "AndroidTouch.h"
#include "AndroidKey.h"
#include "AndroidMouse.h"
+#include "AndroidJoyStick.h"
-class IInputHandler : public CAndroidTouch, public CAndroidKey, public CAndroidMouse
+class IInputHandler
+: public CAndroidKey
+, public CAndroidMouse
+, public CAndroidTouch
+, public CAndroidJoyStick
{
public:
- IInputHandler() : CAndroidTouch(), CAndroidKey(), CAndroidMouse() {}
+ IInputHandler()
+ : CAndroidKey()
+ , CAndroidMouse()
+ , CAndroidTouch()
+ , CAndroidJoyStick()
+ {}
virtual void setDPI(uint32_t dpi) { CAndroidTouch::setDPI(dpi); }
};
SRCS += AndroidKey.cpp
SRCS += AndroidTouch.cpp
SRCS += AndroidMouse.cpp
+SRCS += AndroidJoyStick.cpp
SRCS += GraphicBuffer.cpp
SRCS += EventLoop.cpp
SRCS += XBMCApp.cpp
*/
#include "List.h"
-#include "jutils/jutils-details.hpp"
+#include "View.h"
#include "ScanResult.h"
#include "WifiConfiguration.h"
#include "ApplicationInfo.h"
+#include "jutils/jutils-details.hpp"
+
using namespace jni;
template <typename T>
template class CJNIList<CJNIScanResult>;
template class CJNIList<CJNIWifiConfiguration>;
template class CJNIList<CJNIApplicationInfo>;
+template class CJNIList<CJNIViewInputDeviceMotionRange>;
"getName", "()Ljava/lang/String;"));
}
+int CJNIViewInputDevice::getSources() const
+{
+ return call_method<int>(m_object,
+ "getSources", "()I");
+}
+
+const CJNIList<CJNIViewInputDeviceMotionRange> CJNIViewInputDevice::getMotionRanges() const
+{
+ return call_method<jhobject>(m_object,
+ "getMotionRanges", "()Ljava/util/List;");
+}
+
const CJNIViewInputDeviceMotionRange CJNIViewInputDevice::getMotionRange(int axis) const
{
return call_method<jhobject>(m_object,
axis);
}
+const CJNIViewInputDeviceMotionRange CJNIViewInputDevice::getMotionRange(int axis, int source) const
+{
+ return call_method<jhobject>(m_object,
+ "getMotionRange", "(II)Landroid/view/InputDevice$MotionRange;",
+ axis, source);
+}
+
/************************************************************************/
/************************************************************************/
int CJNIView::SYSTEM_UI_FLAG_FULLSCREEN(0);
*/
#include "JNIBase.h"
+#include "List.h"
class CJNIViewInputDeviceMotionRange : public CJNIBase
{
static const CJNIViewInputDevice getDevice(int id);
std::string getName() const;
+ int getSources() const;
+ const CJNIList<CJNIViewInputDeviceMotionRange> getMotionRanges() const;
const CJNIViewInputDeviceMotionRange getMotionRange(int axis) const;
+ const CJNIViewInputDeviceMotionRange getMotionRange(int axis, int source) const;
private:
CJNIViewInputDevice();
m_silenceBuffers = NULL;
m_encoderBuffers = NULL;
m_vizBuffers = NULL;
+ m_vizBuffersInput = NULL;
m_volume = 1.0;
m_aeVolume = 1.0;
m_muted = false;
m_discardBufferPools.push_back(m_vizBuffers);
m_vizBuffers = NULL;
}
+ if (m_vizBuffersInput)
+ {
+ m_discardBufferPools.push_back(m_vizBuffersInput);
+ m_vizBuffersInput = NULL;
+ }
}
// resample buffers for streams
else
{
(*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat, m_settings.resampleQuality);
(*it)->m_resampleBuffers->m_changeResampler = (*it)->m_forceResampler;
- (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false, m_settings.stereoupmix);
+ (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false, m_settings.stereoupmix, m_settings.normalizelevels);
}
if (m_mode == MODE_TRANSCODE || m_streams.size() > 1)
(*it)->m_resampleBuffers->m_fillPackets = true;
{
m_discardBufferPools.push_back(m_vizBuffers);
m_vizBuffers = NULL;
+ m_discardBufferPools.push_back(m_vizBuffersInput);
+ m_vizBuffersInput = NULL;
}
if (!m_vizBuffers)
{
AEAudioFormat vizFormat = m_internalFormat;
vizFormat.m_channelLayout = AE_CH_LAYOUT_2_0;
vizFormat.m_dataFormat = AE_FMT_FLOAT;
+
+ // input buffers
+ m_vizBuffersInput = new CActiveAEBufferPool(m_internalFormat);
+ m_vizBuffersInput->Create(2000);
+
+ // resample buffers
m_vizBuffers = new CActiveAEBufferPoolResample(m_internalFormat, vizFormat, m_settings.resampleQuality);
// TODO use cache of sync + water level
m_vizBuffers->Create(2000, false, false);
std::list<CActiveAEStream*>::iterator it;
for(it=m_streams.begin(); it!=m_streams.end(); ++it)
{
+ bool normalize = true;
+ if (((*it)->m_resampleBuffers->m_format.m_channelLayout.Count() <
+ (*it)->m_resampleBuffers->m_inputFormat.m_channelLayout.Count()) &&
+ !m_settings.normalizelevels)
+ normalize = false;
+
if ((*it)->m_resampleBuffers && (*it)->m_resampleBuffers->m_resampler &&
(((*it)->m_resampleBuffers->m_resampleQuality != m_settings.resampleQuality) ||
- ((*it)->m_resampleBuffers->m_stereoUpmix != m_settings.stereoupmix)))
+ (((*it)->m_resampleBuffers->m_stereoUpmix != m_settings.stereoupmix)) ||
+ ((*it)->m_resampleBuffers->m_normalize != normalize)))
{
(*it)->m_resampleBuffers->m_changeResampler = true;
}
(*it)->m_resampleBuffers->m_resampleQuality = m_settings.resampleQuality;
(*it)->m_resampleBuffers->m_stereoUpmix = m_settings.stereoupmix;
+ (*it)->m_resampleBuffers->m_normalize = normalize;
}
}
fadingStep = delta / samples;
}
- // for stream amplification we need to run on a per sample basis
- if ((*it)->m_amplify != 1.0)
+ // for streams amplification of turned off downmix normalization
+ // we need to run on a per sample basis
+ if ((*it)->m_amplify != 1.0 || !(*it)->m_resampleBuffers->m_normalize)
{
nb_floats = out->pkt->config.channels / out->pkt->planes;
nb_loops = out->pkt->nb_samples;
for(int j=0; j<out->pkt->planes; j++)
{
#ifdef __SSE__
- CAEUtil::SSEMulArray((float*)out->pkt->data[j]+i*nb_floats, m_muted ? 0.0 : volume, nb_floats);
+ CAEUtil::SSEMulArray((float*)out->pkt->data[j]+i*nb_floats, volume, nb_floats);
#else
float* fbuffer = (float*) out->pkt->data[j]+i*nb_floats;
for (int k = 0; k < nb_floats; ++k)
{
- fbuffer[k] *= m_muted ? 0.0 : volume;
+ fbuffer[k] *= volume;
}
#endif
}
fadingStep = delta / samples;
}
- // for stream amplification we need to run on a per sample basis
- if ((*it)->m_amplify != 1.0)
+ // for streams amplification of turned off downmix normalization
+ // we need to run on a per sample basis
+ if ((*it)->m_amplify != 1.0 || !(*it)->m_resampleBuffers->m_normalize)
{
nb_floats = out->pkt->config.channels / out->pkt->planes;
nb_loops = out->pkt->nb_samples;
float *dst = (float*)out->pkt->data[j]+i*nb_floats;
float *src = (float*)mix->pkt->data[j]+i*nb_floats;
#ifdef __SSE__
- CAEUtil::SSEMulAddArray(dst, src, m_muted ? 0.0 : volume, nb_floats);
+ CAEUtil::SSEMulAddArray(dst, src, volume, nb_floats);
for (int k = 0; k < nb_floats; ++k)
{
if (fabs(dst[k]) > 1.0f)
#else
for (int k = 0; k < nb_floats; ++k)
{
- dst[k] += src[k] * (m_muted ? 0.0 : volume);
+ dst[k] += src[k] * volume;
if (fabs(dst[k]) > 1.0f)
needClamp = true;
}
}
// process output buffer, gui sounds, encode, viz
- CSampleBuffer *viz = NULL;
if (out)
{
+ // viz
+ {
+ CSingleLock lock(m_vizLock);
+ if (m_audioCallback && m_vizBuffers && !m_streams.empty())
+ {
+ if (!m_vizInitialized)
+ {
+ m_audioCallback->OnInitialize(2, m_vizBuffers->m_format.m_sampleRate, 32);
+ m_vizInitialized = true;
+ }
+
+ if (!m_vizBuffersInput->m_freeSamples.empty())
+ {
+ // copy the samples into the viz input buffer
+ CSampleBuffer *viz = m_vizBuffersInput->GetFreeBuffer();
+ int samples = std::min(512, out->pkt->nb_samples);
+ int bytes = samples * out->pkt->config.channels / out->pkt->planes * out->pkt->bytes_per_sample;
+ for(int i= 0; i < out->pkt->planes; i++)
+ {
+ memcpy(viz->pkt->data[i], out->pkt->data[i], bytes);
+ }
+ viz->pkt->nb_samples = samples;
+ m_vizBuffers->m_inputSamples.push_back(viz);
+ }
+ else
+ CLog::Log(LOGWARNING,"ActiveAE::%s - viz ran out of free buffers", __FUNCTION__);
+ unsigned int now = XbmcThreads::SystemClockMillis();
+ unsigned int timestamp = now + m_stats.GetDelay() * 1000;
+ busy |= m_vizBuffers->ResampleBuffers(timestamp);
+ while(!m_vizBuffers->m_outputSamples.empty())
+ {
+ CSampleBuffer *buf = m_vizBuffers->m_outputSamples.front();
+ if ((now - buf->timestamp) & 0x80000000)
+ break;
+ else
+ {
+ int samples;
+ samples = std::min(512, buf->pkt->nb_samples);
+ m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]), samples);
+ buf->Return();
+ m_vizBuffers->m_outputSamples.pop_front();
+ }
+ }
+ }
+ else if (m_vizBuffers)
+ m_vizBuffers->Flush();
+ }
+
// mix gui sounds
MixSounds(*(out->pkt));
- if (!m_sinkHasVolume)
+ if (!m_sinkHasVolume || m_muted)
Deamplify(*(out->pkt));
- // encode and backup out buffer for viz
- viz = out;
if (m_mode == MODE_TRANSCODE && m_encoder)
{
CSampleBuffer *buf = m_encoderBuffers->GetFreeBuffer();
m_encoder->Encode(out->pkt->data[0], out->pkt->planes*out->pkt->linesize,
buf->pkt->data[0], buf->pkt->planes*buf->pkt->linesize);
buf->pkt->nb_samples = buf->pkt->max_nb_samples;
+ out->Return();
out = buf;
}
-
busy = true;
}
- // viz
- {
- CSingleLock lock(m_vizLock);
- if (m_audioCallback && m_vizBuffers && !m_streams.empty())
- {
- if (!m_vizInitialized)
- {
- m_audioCallback->OnInitialize(2, m_vizBuffers->m_format.m_sampleRate, 32);
- m_vizInitialized = true;
- }
-
- // if viz has no free buffer, it won't return current buffer "viz"
- if (!m_vizBuffers->m_freeSamples.empty())
- {
- if (viz)
- {
- viz->Acquire();
- m_vizBuffers->m_inputSamples.push_back(viz);
- }
- }
- else
- CLog::Log(LOGWARNING,"ActiveAE::%s - viz ran out of free buffers", __FUNCTION__);
- unsigned int now = XbmcThreads::SystemClockMillis();
- unsigned int timestamp = now + m_stats.GetDelay() * 1000;
- busy |= m_vizBuffers->ResampleBuffers(timestamp);
- while(!m_vizBuffers->m_outputSamples.empty())
- {
- CSampleBuffer *buf = m_vizBuffers->m_outputSamples.front();
- if ((now - buf->timestamp) & 0x80000000)
- break;
- else
- {
- int samples;
- samples = std::min(512, buf->pkt->nb_samples);
- m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]), samples);
- buf->Return();
- m_vizBuffers->m_outputSamples.pop_front();
- }
- }
- }
- else if (m_vizBuffers)
- m_vizBuffers->Flush();
- }
// update stats
if(out)
{
m_stats.AddSamples(out->pkt->nb_samples, m_streams);
m_sinkBuffers->m_inputSamples.push_back(out);
- if(viz && (viz != out))
- viz->Return();
}
}
// pass through
void CActiveAE::Deamplify(CSoundPacket &dstSample)
{
- if (m_volume < 1.0)
+ if (m_volume < 1.0 || m_muted)
{
float *buffer;
int nb_floats = dstSample.nb_samples * dstSample.config.channels / dstSample.planes;
m_settings.samplerate = CSettings::Get().GetInt("audiooutput.samplerate");
m_settings.stereoupmix = CSettings::Get().GetBool("audiooutput.stereoupmix");
+ m_settings.normalizelevels = CSettings::Get().GetBool("audiooutput.normalizelevels");
m_settings.passthrough = m_settings.config == AE_CONFIG_FIXED ? false : CSettings::Get().GetBool("audiooutput.passthrough");
m_settings.ac3passthrough = CSettings::Get().GetBool("audiooutput.ac3passthrough");
setting == "audiooutput.streamsilence" ||
setting == "audiooutput.processquality" ||
setting == "audiooutput.passthrough" ||
- setting == "audiooutput.samplerate")
+ setting == "audiooutput.samplerate" ||
+ setting == "audiooutput.normalizelevels")
{
m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE);
}
orig_config.fmt,
orig_config.bits_per_sample,
false,
+ true,
NULL,
AE_QUALITY_MID);
bool truehdpassthrough;
bool dtshdpassthrough;
bool stereoupmix;
+ bool normalizelevels;
bool passthrough;
int config;
unsigned int samplerate;
// buffers
CActiveAEBufferPoolResample *m_sinkBuffers;
CActiveAEBufferPoolResample *m_vizBuffers;
+ CActiveAEBufferPool *m_vizBuffersInput;
CActiveAEBufferPool *m_silenceBuffers; // needed to drive gui sounds if we have no streams
CActiveAEBufferPool *m_encoderBuffers;
m_resampleQuality = quality;
m_changeResampler = false;
m_stereoUpmix = false;
+ m_normalize = true;
}
CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample()
delete m_resampler;
}
-bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap, bool upmix)
+bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap, bool upmix, bool normalize)
{
CActiveAEBufferPool::Create(totaltime);
+ m_stereoUpmix = upmix;
+ m_normalize = true;
+ if ((m_format.m_channelLayout.Count() < m_inputFormat.m_channelLayout.Count() && !normalize))
+ m_normalize = false;
+
if (m_inputFormat.m_channelLayout != m_format.m_channelLayout ||
m_inputFormat.m_sampleRate != m_format.m_sampleRate ||
m_inputFormat.m_dataFormat != m_format.m_dataFormat ||
CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat),
CAEUtil::DataFormatToUsedBits(m_inputFormat.m_dataFormat),
upmix,
+ m_normalize,
remap ? &m_format.m_channelLayout : NULL,
m_resampleQuality);
}
- m_stereoUpmix = upmix;
m_changeResampler = false;
return true;
CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat),
CAEUtil::DataFormatToUsedBits(m_inputFormat.m_dataFormat),
m_stereoUpmix,
+ m_normalize,
NULL,
m_resampleQuality);
public:
CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat, AEQuality quality);
virtual ~CActiveAEBufferPoolResample();
- virtual bool Create(unsigned int totaltime, bool remap, bool upmix);
+ virtual bool Create(unsigned int totaltime, bool remap, bool upmix, bool normalize = true);
void ChangeResampler();
bool ResampleBuffers(unsigned int timestamp = 0);
float GetDelay();
double m_resampleRatio;
AEQuality m_resampleQuality;
bool m_stereoUpmix;
+ bool m_normalize;
};
}
m_dllSwResample.Unload();
}
-bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, CAEChannelInfo *remapLayout, AEQuality quality)
+bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, bool normalize, CAEChannelInfo *remapLayout, AEQuality quality)
{
if (!m_dllAvUtil.Load() || !m_dllSwResample.Load())
return false;
// not required for sink stage (remapLayout == true)
if ((m_dst_fmt == AV_SAMPLE_FMT_FLT || m_dst_fmt == AV_SAMPLE_FMT_FLTP) &&
(m_src_fmt == AV_SAMPLE_FMT_FLT || m_src_fmt == AV_SAMPLE_FMT_FLTP) &&
- !remapLayout)
+ !remapLayout && normalize)
{
m_dllAvUtil.av_opt_set_double(m_pContext, "rematrix_maxval", 1.0, 0);
}
public:
CActiveAEResample();
virtual ~CActiveAEResample();
- bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, CAEChannelInfo *remapLayout, AEQuality quality);
+ bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, bool normalize, CAEChannelInfo *remapLayout, AEQuality quality);
int Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples, double ratio);
int64_t GetDelay(int64_t base);
int GetBufferedSamples();
normalize = true;
else
{
- //FIXME: guisetting is reversed, change the setting name after frodo
- normalize = !CSettings::Get().GetBool("audiooutput.normalizelevels");
+ normalize = CSettings::Get().GetBool("audiooutput.normalizelevels");
CLog::Log(LOGDEBUG, "AERemap: Downmix normalization is %s", (normalize ? "enabled" : "disabled"));
}
+++ /dev/null
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "stdafx.h"
-#include "ComboRenderer.h"
-#include "Application.h"
-#include "settings/Settings.h"
-#include "settings/DisplaySettings.h"
-
-CComboRenderer::CComboRenderer(LPDIRECT3DDEVICE8 pDevice)
- : CXBoxRenderer(pDevice)
-{
- m_bHasDimView = false;
- m_RGBSurface[0] = NULL;
- m_RGBSurface[1] = NULL;
- m_YUY2Texture[0] = NULL;
- m_YUY2Texture[1] = NULL;
- m_hPixelShader = 0;
- m_iYUY2RenderBuffer = 0;
- m_iYUY2Buffers = 2;
- m_iScreenWidth = 0;
- m_iScreenHeight = 0;
-}
-
-void CComboRenderer::DeleteYUY2Texture(int index)
-{
- CSingleLock lock(g_graphicsContext);
- if (m_RGBSurface[index])
- SAFE_RELEASE(m_RGBSurface[index]);
-
- if (m_YUY2Texture[index])
- {
- SAFE_RELEASE(m_YUY2Texture[index]);
- CLog::Log(LOGDEBUG, "Deleted yuy2 textures (%d)", index);
- }
-}
-
-void CComboRenderer::ClearYUY2Texture(int index)
-{
- D3DLOCKED_RECT lr;
- // Clear our RGB/YUY2 texture
- m_RGBSurface[index]->LockRect(&lr, NULL, 0);
- memset(lr.pBits, 0x00800080, lr.Pitch*m_iSourceHeight);
- m_RGBSurface[index]->UnlockRect();
-}
-
-bool CComboRenderer::CreateYUY2Texture(int index)
-{
- CSingleLock lock(g_graphicsContext);
- DeleteYUY2Texture(index);
- // Create our textures...
-
- if (D3D_OK != m_pD3DDevice->CreateTexture(m_iSourceWidth, m_iSourceHeight, 1, 0, D3DFMT_YUY2, 0, &m_YUY2Texture[index]))
- return false;
-
- m_YUY2Texture[index]->GetSurfaceLevel(0, &m_RGBSurface[index]);
- m_RGBSurface[index]->Format &= ~D3DFORMAT_FORMAT_MASK;
- m_RGBSurface[index]->Format |= D3DFMT_LIN_A8R8G8B8 << D3DFORMAT_FORMAT_SHIFT;
-
- m_RGBSurface[index]->Size &= ~D3DSIZE_WIDTH_MASK;
- m_RGBSurface[index]->Size |= ((m_iSourceWidth>>1) - 1) & D3DSIZE_WIDTH_MASK;
-
- ClearYUY2Texture(index);
- CLog::Log(LOGDEBUG, "Created yuy2 textures (%d)", index);
- return true;
-}
-
-void CComboRenderer::ManageTextures()
-{
- //use 1 buffer in fullscreen mode and 0 buffers in windowed mode
- if (g_graphicsContext.IsFullScreenVideo())
- {
- m_iYUY2Buffers = 2;
-
- if (!m_RGBSurface[0] && m_iYUY2Buffers > 0)
- CreateYUY2Texture(0);
- if (!m_RGBSurface[1] && m_iYUY2Buffers > 1)
- CreateYUY2Texture(1);
-
- if(m_iYV12RenderBuffer >= m_iYUY2Buffers)
- m_iYV12RenderBuffer = 0;
- }
- else
- {
- m_iYUY2Buffers = 0;
-
- if (m_RGBSurface[0])
- DeleteYUY2Texture(0);
-
- if (m_RGBSurface[1])
- DeleteYUY2Texture(1);
- }
-
- CXBoxRenderer::ManageTextures();
-}
-
-void CComboRenderer::ManageDisplay()
-{
- const RECT& rv = g_graphicsContext.GetViewWindow();
- float fScreenWidth = (float)rv.right - rv.left;
- float fScreenHeight = (float)rv.bottom - rv.top;
- float fOffsetX1 = (float)rv.left;
- float fOffsetY1 = (float)rv.top;
- float fPixelRatio = CDisplaySettings::Get().GetPixelRatio();
- float fMaxScreenWidth = (float)CDisplaySettings::Get().GetResolutionInfo(g_graphicsContext.GetVideoResolution()).iWidth;
- float fMaxScreenHeight = (float)CDisplaySettings::Get().GetResolutionInfo(g_graphicsContext.GetVideoResolution()).iHeight;
- if (fOffsetX1 < 0) fOffsetX1 = 0;
- if (fOffsetY1 < 0) fOffsetY1 = 0;
- if (fScreenWidth + fOffsetX1 > fMaxScreenWidth) fScreenWidth = fMaxScreenWidth - fOffsetX1;
- if (fScreenHeight + fOffsetY1 > fMaxScreenHeight) fScreenHeight = fMaxScreenHeight - fOffsetY1;
-
- // Correct for HDTV_1080i -> 540p
- if (GetResolution() == HDTV_1080i)
- {
- fOffsetY1 /= 2;
- fScreenHeight /= 2;
- fPixelRatio *= 2;
- }
-
- // source rect
- rs.left = CMediaSettings::Get().GetCurrentVideoSettings().m_CropLeft;
- rs.top = CMediaSettings::Get().GetCurrentVideoSettings().m_CropTop;
- rs.right = m_iSourceWidth - CMediaSettings::Get().GetCurrentVideoSettings().m_CropRight;
- rs.bottom = m_iSourceHeight - CMediaSettings::Get().GetCurrentVideoSettings().m_CropBottom;
-
- CalcNormalDisplayRect(fOffsetX1, fOffsetY1, fScreenWidth, fScreenHeight, GetAspectRatio() * fPixelRatio, CDisplaySettings::Get().GetZoomAmount());
-
- // check whether we need to alter our source rect
- if (rd.left < fOffsetX1 || rd.right > fOffsetX1 + fScreenWidth)
- {
- // wants to be wider than we allow, so fix
- float fRequiredWidth = (float)rd.right - rd.left;
- if (rs.right <= rs.left) rs.right = rs.left+1;
- float fHorizScale = fRequiredWidth / (float)(rs.right - rs.left);
- float fNewWidth = fScreenWidth / fHorizScale;
- rs.left = (rs.right - rs.left - (int)fNewWidth) / 2;
- rs.right = rs.left + (int)fNewWidth;
- rd.left = (int)fOffsetX1;
- rd.right = (int)(fOffsetX1 + fScreenWidth);
- }
- if (rd.top < fOffsetY1 || rd.bottom > fOffsetY1 + fScreenHeight)
- {
- // wants to be wider than we allow, so fix
- float fRequiredHeight = (float)rd.bottom - rd.top;
- if (rs.bottom <= rs.top) rs.bottom = rs.top+1;
- float fVertScale = fRequiredHeight / (float)(rs.bottom - rs.top);
- float fNewHeight = fScreenHeight / fVertScale;
- rs.top = (rs.bottom - rs.top - (int)fNewHeight) / 2;
- rs.bottom = rs.top + (int)fNewHeight;
- rd.top = (int)fOffsetY1;
- rd.bottom = (int)(fOffsetY1 + fScreenHeight);
- }
-}
-
-bool CComboRenderer::Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags)
-{
- if(!CXBoxRenderer::Configure(width, height, d_width, d_height, fps, flags))
- return false;
-
- m_bConfigured = true;
- return true;
-}
-
-void CComboRenderer::Update(bool bPauseDrawing)
-{
- if(!m_bConfigured) return;
- CSingleLock lock(g_graphicsContext);
-
- if(g_graphicsContext.IsFullScreenVideo() || g_graphicsContext.IsCalibrating())
- m_pD3DDevice->EnableOverlay(!bPauseDrawing);
- else
- m_pD3DDevice->EnableOverlay(FALSE);
-
- CXBoxRenderer::Update(bPauseDrawing);
-}
-
-void CComboRenderer::FlipPage(int source)
-{
- if(m_iYUY2Buffers)
- m_iYUY2RenderBuffer = ++m_iYUY2RenderBuffer % m_iYUY2Buffers;
-
- CXBoxRenderer::FlipPage(source);
-}
-
-void CComboRenderer::YV12toYUY2()
-{
- int index = m_iYV12RenderBuffer;
- if (!m_RGBSurface[m_iYUY2RenderBuffer]) return;
-
- /* if we have dimmed our texture, don't overwrite it */
- if( g_application.IsInScreenSaver() && m_bHasDimView ) return;
-
- if( WaitForSingleObject(m_eventTexturesDone[index], 500) == WAIT_TIMEOUT )
- CLog::Log(LOGWARNING, __FUNCTION__" - Timeout waiting for texture %d", index);
-
- // Do the YV12 -> YUY2 conversion.
- // ALWAYS use buffer 0 in this case (saves 12 bits/pixel)
- m_pD3DDevice->SetTexture( 0, m_YUVTexture[index][FIELD_FULL][PLANE_Y] );
- m_pD3DDevice->SetTexture( 1, m_YUVTexture[index][FIELD_FULL][PLANE_U] );
- m_pD3DDevice->SetTexture( 2, m_YUVTexture[index][FIELD_FULL][PLANE_Y] );
- m_pD3DDevice->SetTexture( 3, m_YUVTexture[index][FIELD_FULL][PLANE_V] );
-
- for (int i = 0; i < 4; ++i)
- {
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_MAGFILTER, D3DTEXF_POINT );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_MINFILTER, D3DTEXF_POINT );
- }
- // U and V need to use linear filtering, as they're being doubled vertically
- m_pD3DDevice->SetTextureStageState( 1, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 3, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
-
- m_pD3DDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
- m_pD3DDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
- m_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
- m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
- m_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
- m_pD3DDevice->SetRenderState( D3DRS_YUVENABLE, FALSE );
- m_pD3DDevice->SetVertexShader( FVF_YUYVVERTEX );
- m_pD3DDevice->SetPixelShader( m_hPixelShader );
- // Render the image
- LPDIRECT3DSURFACE8 pOldRT;
- m_pD3DDevice->GetRenderTarget(&pOldRT);
- m_pD3DDevice->SetRenderTarget(m_RGBSurface[m_iYUY2RenderBuffer], NULL);
-
- m_pD3DDevice->Begin(D3DPT_QUADLIST);
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)1.5f, (float)0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)0.5f, (float)0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)0.5f, (float)0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)0.5f, (float)0.5f);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)0.0f, (float)0.0f, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)m_iSourceWidth + 1.5f, (float)0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)m_iSourceWidth / 2.0f + 0.5f, (float)0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)m_iSourceWidth + 0.5f, (float)0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)m_iSourceWidth / 2.0f + 0.5f, (float)0.5f );
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)m_iSourceWidth / 2.0f, (float)0.0f, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)m_iSourceWidth + 1.5f, (float)m_iSourceHeight + 0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)m_iSourceWidth / 2.0f + 0.5f, (float)m_iSourceHeight / 2.0f + 0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)m_iSourceWidth + 0.5f, (float)m_iSourceHeight + 0.5f);
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)m_iSourceWidth / 2.0f + 0.5f, (float)m_iSourceHeight / 2.0f + 0.5f );
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)m_iSourceWidth / 2.0f, (float)m_iSourceHeight, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)1.5f, (float)m_iSourceHeight + 0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)0.5f, (float)m_iSourceHeight / 2.0f + 0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)0.5f, (float)m_iSourceHeight + 0.5f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)0.5f, (float)m_iSourceHeight / 2.0f + 0.5f );
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)0.0f, (float)m_iSourceHeight, 0, 1.0f );
- m_pD3DDevice->End();
-
- m_pD3DDevice->SetTexture(0, NULL);
- m_pD3DDevice->SetTexture(1, NULL);
- m_pD3DDevice->SetTexture(2, NULL);
- m_pD3DDevice->SetTexture(3, NULL);
-
- m_pD3DDevice->SetRenderState( D3DRS_YUVENABLE, FALSE );
- m_pD3DDevice->SetPixelShader( NULL );
- m_pD3DDevice->SetRenderTarget(pOldRT, NULL);
-
- m_pD3DDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 2, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
-
- pOldRT->Release();
-
- //Okey, when the gpu is done with the textures here, they are free to be modified again
- m_pD3DDevice->InsertCallback(D3DCALLBACK_WRITE,&TextureCallback, (DWORD)m_eventTexturesDone[index]);
-
- m_pD3DDevice->KickPushBuffer();
-
- m_bHasDimView = false;
-}
-
-void CComboRenderer::Render(DWORD flags)
-{
- if ( m_RGBSurface[m_iYUY2RenderBuffer] == NULL )
- {
- RenderLowMem(flags);
- }
- else
- {
- YV12toYUY2();
- CheckScreenSaver();
-
- /* clear target area, otherwise we won't get any picture */
- D3DRECT target;
- target.x1 = rd.left;
- target.x2 = rd.right;
- target.y1 = rd.top;
- target.y2 = rd.bottom;
- m_pD3DDevice->Clear( 1L, &target, D3DCLEAR_TARGET, m_clearColour, 1.0f, 0L );
-
- // Don't render if we are waiting an overlay event
- while (!m_pD3DDevice->GetOverlayUpdateStatus()) Sleep(1);
-
- LPDIRECT3DSURFACE8 pSurface;
- m_YUY2Texture[m_iYUY2RenderBuffer]->GetSurfaceLevel(0, &pSurface);
- m_pD3DDevice->UpdateOverlay( pSurface, &rs, &rd, TRUE, m_clearColour );
- pSurface->Release();
- }
-
- CXBoxRenderer::Render(flags | RENDER_FLAG_NOOSDALPHA);
-}
-
-unsigned int CComboRenderer::PreInit()
-{
- CXBoxRenderer::PreInit();
- // May have to set clearColour non-zero in future for HW overlays method?
-// if (!m_clearColour)
-// m_clearColour = 0x010001;
-
- m_bHasDimView = false;
- // Create the pixel shader
- if (!m_hPixelShader)
- {
- // shader to interleave separate Y U and V planes into a single YUY2 output
- const char* shader =
- "xps.1.1\n"
- "def c0,1,0,0,0\n"
- "def c1,0,1,0,0\n"
- "def c2,0,0,1,0\n"
- "def c3,0,0,0,1\n"
- "tex t0\n" // Y1 plane (Y plane)
- "tex t1\n" // U plane
- "tex t2\n" // Y2 plane (Y plane shifted 1 pixel to the left)
- "tex t3\n" // V plane
- "xmma discard,discard,r0, t0, c0, t1, c1\n"
- "xmma discard,discard,r1, t2, c2, t3.b, c3\n"
- "add r0, r0, r1\n";
- XGBuffer* pShader;
- XGAssembleShader("XBMCShader", shader, strlen(shader), 0, NULL, &pShader, NULL, NULL, NULL, NULL, NULL);
- m_pD3DDevice->CreatePixelShader((D3DPIXELSHADERDEF*)pShader->GetBufferPointer(), &m_hPixelShader);
- pShader->Release();
- }
-
- m_pD3DDevice->EnableOverlay(TRUE);
- return 0;
-}
-
-void CComboRenderer::UnInit()
-{
- CSingleLock lock(g_graphicsContext);
-
- m_pD3DDevice->EnableOverlay(FALSE);
- DeleteYUY2Texture(0);
- DeleteYUY2Texture(1);
-
- if (m_hPixelShader)
- {
- m_pD3DDevice->DeletePixelShader(m_hPixelShader);
- m_hPixelShader = 0;
- }
-
- CXBoxRenderer::UnInit();
-}
-
-void CComboRenderer::CheckScreenSaver()
-{
- if (g_application.IsInScreenSaver() && !m_bHasDimView)
- {
- D3DLOCKED_RECT lr;
- float fAmount = (float)CSettings::Get().GetInt("screensaver.dimlevel") / 100.0f;
- if ( D3D_OK == m_YUY2Texture[m_iYUY2RenderBuffer]->LockRect(0, &lr, NULL, 0 ))
- {
- // Drop brightness of current surface to 20%
- DWORD strideScreen = lr.Pitch;
- for (DWORD y = 0; y < UINT (rs.top + rs.bottom); y++)
- {
- BYTE *pDest = (BYTE*)lr.pBits + strideScreen * y;
- for (DWORD x = 0; x < UINT ((rs.left + rs.right) >> 1); x++)
- {
- pDest[0] = BYTE (pDest[0] * fAmount); // Y1
- pDest[1] = BYTE ((pDest[1] - 128) * fAmount + 128); // U (with 128 shift!)
- pDest[2] = BYTE (pDest[2] * fAmount); // Y2
- pDest[3] = BYTE ((pDest[3] - 128) * fAmount + 128); // V (with 128 shift!)
- pDest += 4;
- }
- }
- m_YUY2Texture[m_iYUY2RenderBuffer]->UnlockRect(0);
-
- }
- m_bHasDimView = true;
- }
-}
-
-void CComboRenderer::SetupScreenshot()
-{
- if (!g_graphicsContext.IsFullScreenVideo())
- return;
- CSingleLock lock(g_graphicsContext);
- // first, grab the current overlay texture and convert it to RGB
- LPDIRECT3DTEXTURE8 pRGB = NULL;
- if (D3D_OK != m_pD3DDevice->CreateTexture(m_iSourceWidth, m_iSourceHeight, 1, 0, D3DFMT_LIN_A8R8G8B8, 0, &pRGB))
- {
- return ;
- }
- D3DLOCKED_RECT lr, lr2;
- m_YUY2Texture[m_iYUY2RenderBuffer]->LockRect(0, &lr, NULL, 0);
- pRGB->LockRect(0, &lr2, NULL, 0);
- // convert to RGB via software converter
- BYTE *s = (BYTE *)lr.pBits;
- LONG *d = (LONG *)lr2.pBits;
- LONG dpitch = lr2.Pitch / 4;
- for (unsigned int y = 0; y < m_iSourceHeight; y++)
- {
- for (unsigned int x = 0; x < m_iSourceWidth; x += 2)
- {
- d[x] = YUV2RGB(s[2 * x], s[2 * x + 1], s[2 * x + 3]);
- d[x + 1] = YUV2RGB(s[2 * x + 2], s[2 * x + 1], s[2 * x + 3]);
- }
- s += lr.Pitch;
- d += dpitch;
- }
- m_YUY2Texture[m_iYUY2RenderBuffer]->UnlockRect(0);
- pRGB->UnlockRect(0);
- // ok - now lets dump the RGB texture to a file to test
- // ok, now this needs to be rendered to the screen
- m_pD3DDevice->SetTexture( 0, pRGB);
-
- m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
-
- // set scissors if we are not in fullscreen video
- if ( !(g_graphicsContext.IsFullScreenVideo() || g_graphicsContext.IsCalibrating() ))
- {
- g_graphicsContext.ClipToViewWindow();
- }
-
- m_pD3DDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_FOGTABLEMODE, D3DFOG_NONE );
- m_pD3DDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
- m_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
- m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
- m_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
- m_pD3DDevice->SetRenderState( D3DRS_YUVENABLE, FALSE /*TRUE*/ );
- m_pD3DDevice->SetVertexShader( FVF_RGBVERTEX );
- // Render the image
- m_pD3DDevice->SetScreenSpaceOffset( -0.5f, -0.5f); // fix texel align
- m_pD3DDevice->Begin(D3DPT_QUADLIST);
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)rs.left, (float)rs.top );
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)rd.left, (float)rd.top, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)rs.right, (float)rs.top );
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)rd.right, (float)rd.top, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)rs.right, (float)rs.bottom );
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)rd.right, (float)rd.bottom, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)rs.left, (float)rs.bottom );
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)rd.left, (float)rd.bottom, 0, 1.0f );
- m_pD3DDevice->End();
- m_pD3DDevice->SetScreenSpaceOffset(0, 0);
-
- m_pD3DDevice->SetTexture(0, NULL);
- m_pD3DDevice->SetScissors(0, FALSE, NULL );
-
- RenderOSD();
-
- if (g_application.NeedRenderFullScreen())
- { // render our subtitles and osd
- g_application.RenderFullScreen();
- }
-
- m_pD3DDevice->Present( NULL, NULL, NULL, NULL );
-
- while (pRGB->IsBusy()) Sleep(1);
- pRGB->Release();
-
- return ;
-}
-
-LONG CComboRenderer::YUV2RGB(BYTE y, BYTE u, BYTE v)
-{
- YUVCOEF &coef = yuv_coef_bt601;
- YUVRANGE &range = yuv_range_lim;
-
- // normalize
- float Yp = (y - range.y_min) * 255.0f / (range.y_max - range.y_min);
- float Up = (u - range.u_min) * 255.0f / (range.u_max - range.u_min) - 127.5f;
- float Vp = (v - range.v_min) * 255.0f / (range.v_max - range.v_min) - 127.5f;
-
- // recalculate
- float R = Yp + coef.r_up * Up + coef.r_vp * Vp;
- float G = Yp + coef.g_up * Up + coef.g_vp * Vp;
- float B = Yp + coef.b_up * Up + coef.b_vp * Vp;
-
- // clamp
- R = CLAMP(R, 0.0f, 255.0f);
- G = CLAMP(G, 0.0f, 255.0f);
- B = CLAMP(B, 0.0f, 255.0f);
-
- return ((int)R << 16) + ((int)G << 8) + (int)B;
-}
+++ /dev/null
-#ifndef COMBO_RENDERER
-#define COMBO_RENDERER
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "XBoxRenderer.h"
-
-//const DWORD FVF_YV12VERTEX = D3DFVF_XYZRHW|D3DFVF_TEX3;
-
-class CComboRenderer : public CXBoxRenderer
-{
-public:
- CComboRenderer(LPDIRECT3DDEVICE8 pDevice);
- //~CComboRenderer();
-
- virtual void Update(bool bPauseDrawing);
- virtual void SetupScreenshot();
- virtual void FlipPage(int source);
-
- // Functions called from mplayer
- virtual bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags);
- virtual unsigned int PreInit();
- virtual void UnInit();
-
-protected:
- virtual void Render(DWORD flags);
- virtual void ManageDisplay();
- virtual void ManageTextures();
- bool CreateYUY2Texture(int index);
- void DeleteYUY2Texture(int index);
- void ClearYUY2Texture(int index);
- void YV12toYUY2();
- void CheckScreenSaver();
-
- LONG YUV2RGB(BYTE y, BYTE u, BYTE v);
-
- DWORD m_hPixelShader;
-
- // RGB/YUY2 texture target(s)
- LPDIRECT3DSURFACE8 m_RGBSurface[2];
- LPDIRECT3DTEXTURE8 m_YUY2Texture[2];
-
- static const DWORD FVF_YUYVVERTEX = D3DFVF_XYZRHW | D3DFVF_TEX4;
- static const DWORD FVF_RGBVERTEX = D3DFVF_XYZRHW | D3DFVF_TEX1;
-
- int m_iYUY2RenderBuffer;
- int m_iYUY2Buffers;
- int m_iScreenWidth;
- int m_iScreenHeight;
- // screensaver stuff
- bool m_bHasDimView;
-};
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "stdafx.h"
-#include "RGBRendererV2.h"
-
-#define SURFTOTEX(a) ((a)->Parent ? (a)->Parent : (D3DBaseTexture*)(a))
-
-//#define DBGBOB
-
-CRGBRendererV2::CRGBRendererV2(LPDIRECT3DDEVICE8 pDevice)
- : CXBoxRenderer(pDevice)
-{
- m_444PTextureFull = NULL;
- m_444PTextureField = NULL;
-
- m_hInterleavingShader = 0;
- m_hInterleavingShaderAlpha = 0;
- m_hYUVtoRGBLookup = 0;
- m_UVLookup = NULL;
- m_UVErrorLookup = NULL;
- m_motionpass = 5;
- m_444GeneratedFull = false;
- m_444RenderBuffer = 0;
- memset(&m_yuvcoef_last, 0, sizeof(YUVCOEF));
- memset(&m_yuvrange_last, 0, sizeof(YUVRANGE));
-}
-
-void CRGBRendererV2::FlipPage(int source)
-{
- m_444GeneratedFull = false;
-
- CXBoxRenderer::FlipPage(source);
-}
-
-void CRGBRendererV2::Delete444PTexture()
-{
- CSingleLock lock(g_graphicsContext);
- SAFE_RELEASE(m_444PTextureFull);
- SAFE_RELEASE(m_444PTextureField);
- CLog::Log(LOGDEBUG, "Deleted 444P video textures");
-}
-
-void CRGBRendererV2::Clear444PTexture(bool full, bool field)
-{
- CSingleLock lock(g_graphicsContext);
- if(m_444PTextureFull && full)
- {
- D3DLOCKED_RECT lr;
- m_444PTextureFull->LockRect(0, &lr, NULL, 0);
- memset(lr.pBits, 0x00, lr.Pitch*m_iSourceHeight);
- m_444PTextureFull->UnlockRect(0);
- }
-
- if(m_444PTextureField && field)
- {
- D3DLOCKED_RECT lr;
- m_444PTextureField->LockRect(0, &lr, NULL, 0);
-#ifdef DBGBOB
- memset(lr.pBits, 0xFF, lr.Pitch*m_iSourceHeight>>1);
-#else
- memset(lr.pBits, 0x00, lr.Pitch*m_iSourceHeight>>1);
-#endif
- m_444PTextureField->UnlockRect(0);
- }
- m_444GeneratedFull = false;
-}
-
-bool CRGBRendererV2::Create444PTexture(bool full, bool field)
-{
- CSingleLock lock(g_graphicsContext);
- if (!m_444PTextureFull && full)
- {
- if(D3D_OK != m_pD3DDevice->CreateTexture(m_iSourceWidth, m_iSourceHeight, 1, 0, D3DFMT_LIN_A8R8G8B8, 0, &m_444PTextureFull))
- return false;
-
- CLog::Log(LOGINFO, "Created 444P full texture");
- }
-
- if (!m_444PTextureField && field)
- {
- if(D3D_OK != m_pD3DDevice->CreateTexture(m_iSourceWidth, m_iSourceHeight>>1, 1, 0, D3DFMT_LIN_A8R8G8B8, 0, &m_444PTextureField))
- return false;
- CLog::Log(LOGINFO, "Created 444P field texture");
- }
- return true;
-}
-
-void CRGBRendererV2::ManageTextures()
-{
- //use 1 buffer in fullscreen mode and 0 buffers in windowed mode
- if (!g_graphicsContext.IsFullScreenVideo())
- {
- if (m_444PTextureFull || m_444PTextureField)
- Delete444PTexture();
- }
-
- CXBoxRenderer::ManageTextures();
-
- if (g_graphicsContext.IsFullScreenVideo())
- {
- if (!m_444PTextureFull)
- {
- Create444PTexture(true, false);
- Clear444PTexture(true, false);
- }
- }
-}
-
-bool CRGBRendererV2::Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags)
-{
- if(!CXBoxRenderer::Configure(width, height, d_width, d_height, fps, flags))
- return false;
-
- // create our lookup textures for yv12->rgb translation,
- if(!CreateLookupTextures(m_yuvcoef, m_yuvrange) )
- return false;
-
- m_bConfigured = true;
- return true;
-}
-
-void CRGBRendererV2::Render(DWORD flags)
-{
- CSingleLock lock(g_graphicsContext);
- if ( !g_graphicsContext.IsFullScreenVideo() )
- {
- RenderLowMem(flags);
- }
- else
- {
- int index = m_iYV12RenderBuffer;
-
- if( !(flags & RENDER_FLAG_NOLOCK) )
- if( WaitForSingleObject(m_eventTexturesDone[index], 500) == WAIT_TIMEOUT )
- CLog::Log(LOGWARNING, __FUNCTION__" - Timeout waiting for texture %d", index);
-
- D3DSurface* p444PSourceFull = NULL;
- D3DSurface* p444PSourceField = NULL;
-
- if( flags & (RENDER_FLAG_TOP|RENDER_FLAG_BOT) )
- {
- if(!m_444PTextureField)
- {
- Create444PTexture(false, true);
- Clear444PTexture(false, true);
- }
- if(!m_444PTextureField)
- {
- CLog::Log(LOGERROR, __FUNCTION__" - Couldn't create field texture");
- return;
- }
-
- m_444PTextureField->GetSurfaceLevel(0, &p444PSourceField);
- }
-
- if(!m_444PTextureFull)
- {
- CLog::Log(LOGERROR, __FUNCTION__" - Couldn't create full texture");
- return;
- }
-
- m_444PTextureFull->GetSurfaceLevel(0, &p444PSourceFull);
-
- //UV in interlaced video is seen as being closer to first line in first field and closer to second line in second field
- //we shift it with an offset of 1/4th pixel (1/8 in UV planes)
- //This need only be done when field scaling
- #define CHROMAOFFSET_VERT 0.125f
-
- //Each chroma sample is not said to be between the first and second sample as in the vertical case
- //first Y(1) <=> UV(1), Y(2) <=> ( UV(1)+UV(2) ) / 2, Y(3) <=> UV(2)
- //we wish to offset this by 1/2 pxiel to le left, which in the half rez of UV planes means 1/4th
- #define CHROMAOFFSET_HORIZ 0.25f
-
-
- //Example of how YUV has it's Luma and Chroma data stored
- //for progressive video
- //L L L L L L L L L L
- //C C C C C
- //L L L L L L L L L L
-
- //Example of how YUV has Chroma subsampled in interlaced displays
- //FIELD 1 FIELD 2
- //L L L L L L L L L L
- //C C C C C
- // L L L L L L L L L L
- //
- //L L L L L L L L L L
- // C C C C C
- // L L L L L L L L L L
- //
- //L L L L L L L L L L
- //C C C C C
- // L L L L L L L L L L
- //
- //.........................................
- //.........................................
-
- m_pD3DDevice->SetRenderState( D3DRS_SWATHWIDTH, 15 );
- m_pD3DDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
- m_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
- m_pD3DDevice->SetRenderState( D3DRS_YUVENABLE, FALSE );
-
- DWORD alphaenabled;
- m_pD3DDevice->GetRenderState( D3DRS_ALPHABLENDENABLE, &alphaenabled );
- m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
- m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
-
- RECT rsf = { rs.left, rs.top>>1, rs.right, rs.bottom>>1 };
-
- if( !m_444GeneratedFull )
- {
- m_444GeneratedFull = true;
- InterleaveYUVto444P(
- m_YUVTexture[index][FIELD_FULL],
- NULL, // use motion from last frame as motion value
- p444PSourceFull,
- rs, rs, rs,
- 1, 1,
- 0.0f, 0.0f,
- CHROMAOFFSET_HORIZ, 0.0f);
- }
-#ifdef DBGBOB
- m_pD3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA);
-#endif
-
- if( flags & RENDER_FLAG_TOP )
- {
- InterleaveYUVto444P(
- m_YUVTexture[index][FIELD_TOP],
- m_444PTextureFull, // use a downscaled motion value from the full frame,
- p444PSourceField,
- rsf, rs, rsf,
- 1, 1,
- 0.0f, 0.0f,
- CHROMAOFFSET_HORIZ, +CHROMAOFFSET_VERT);
- }
- else if( flags & RENDER_FLAG_BOT )
- {
- InterleaveYUVto444P(
- m_YUVTexture[index][FIELD_BOT],
- m_444PTextureFull, // use a downscaled motion value from the full frame,
- p444PSourceField,
- rsf, rs, rsf,
- 1, 1,
- 0.0f, 0.0f,
- CHROMAOFFSET_HORIZ, -CHROMAOFFSET_VERT);
- }
-
-#ifdef DBGBOB
- m_pD3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALL);
-#endif
-
- //Okey, when the gpu is done with the textures here, they are free to be modified again
- if( !(flags & RENDER_FLAG_NOUNLOCK) )
- m_pD3DDevice->InsertCallback(D3DCALLBACK_WRITE,&TextureCallback, (DWORD)m_eventTexturesDone[index]);
-
- // Now perform the YUV->RGB conversion in a single pass, and render directly to the screen
- m_pD3DDevice->SetScreenSpaceOffset( -0.5f, -0.5f );
-
- if(true)
- {
- // NOTICE, field motion can have been replaced by downscaled frame motion
- // this method uses the difference between fields to estimate motion
- // it work sorta, but it can't for example handle horizontal
- // hairlines wich only exist in one field, they will flicker
- // as they get considered motion
-
-
- // render the full frame
- m_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- RenderYUVtoRGB(m_444PTextureFull, rs, rd, 0.0f, 0.0f);
-
- // render the field texture ontop
- if(m_444PTextureField && p444PSourceField)
- {
- m_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
- m_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
- m_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, m_motionpass);
-
- if(flags & RENDER_FLAG_TOP)
- RenderYUVtoRGB(m_444PTextureField, rsf, rd, 0.0f, 0.25);
- else
- RenderYUVtoRGB(m_444PTextureField, rsf, rd, 0.0f, -0.25);
- }
- }
- else
- {
- // this method will use the difference between this and previous
- // frame as an estimate for motion. this will currently fail
- // on the first field that has motion. as then only that line
- // has motion. if the alpha channel where first downscaled
- // to the field texture lineary we should get away from that
-
- // render the field texture first
- if(m_444PTextureField && p444PSourceField)
- {
- m_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- if(flags & RENDER_FLAG_TOP)
- RenderYUVtoRGB(m_444PTextureField, rsf, rd, 0.0f, 0.25);
- else
- RenderYUVtoRGB(m_444PTextureField, rsf, rd, 0.0f, -0.25);
- }
-
- // fill in any place we have no motion with full texture
- m_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
- m_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_LESS);
- m_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, m_motionpass);
- RenderYUVtoRGB(m_444PTextureFull, rs, rd, 0.0f, 0.0f);
- }
-
- m_pD3DDevice->SetScreenSpaceOffset(0.0f, 0.0f);
- m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, alphaenabled );
- m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
-
- m_pD3DDevice->SetTexture(0, NULL);
- m_pD3DDevice->SetTexture(1, NULL);
- m_pD3DDevice->SetTexture(2, NULL);
- m_pD3DDevice->SetTexture(3, NULL);
-
- m_pD3DDevice->SetPixelShader( NULL );
-
- SAFE_RELEASE(p444PSourceFull);
- SAFE_RELEASE(p444PSourceField);
- }
-
- CXBoxRenderer::Render(flags);
-}
-
-unsigned int CRGBRendererV2::PreInit()
-{
- CXBoxRenderer::PreInit();
- // Create the pixel shader
- if (!m_hInterleavingShader)
- {
- CSingleLock lock(g_graphicsContext);
- // shader to interleave separate Y U and V planes into a single YUV output
- const char* interleave =
- "xps.1.1\n"
- "def c0,1,0,0,0\n"
- "def c1,0,1,0,0\n"
- "def c2,0,0,1,0\n"
- "tex t0\n"
- "tex t1\n"
- "tex t2\n"
- "tex t3\n"
-
- // interleave our data
- "xmma discard,discard,r0, t0,c0, t1,c1\n"
- "mad r0, t2,c2,r0\n"
-
- "sub_x4 r1, r0,t3\n" // calculate the differens in this pixel values
- "dp3 r1.rgba, r1,r1\n" // take the absolute of the "yuv" difference vector
-// "add_d2 r1.a, r1, t3\n" // average with previouse value to avoid minor changes
- "mov r0.a, r1";
-
- const char* interleavealpha =
- "xps.1.1\n"
- "def c0,1,0,0,0\n"
- "def c1,0,1,0,0\n"
- "def c2,0,0,1,0\n"
- "tex t0\n"
- "tex t1\n"
- "tex t2\n"
- "tex t3\n"
-
- // interleave our data
- "xmma discard,discard,r0, t0,c0, t1,c1\n"
- "mad r0, t2,c2,r0\n"
-
- // use alpha from t3
- "mov r0.a, t3";
-
- // shader for 14bit accurate YUV to RGB (single pass :)
- const char* yuv2rgb =
- "xps.1.1\n"
- "def c0,0.0117647,0.0117647,0.0117647,0\n"
- "tex t0\n"
- "texreg2ar t1, t0\n"
- "texreg2gb t2, t0\n"
- "texreg2gb t3, t0\n"
- "add r0, t1, t2_bx2\n"
- "add r1, t1.a, t3\n"
- "mad r0, r1, c0, r0\n"
- "mov r0.a, t0";
-
- XGBuffer* pShader;
- XGAssembleShader("InterleaveShader", interleave, strlen(interleave), 0, NULL, &pShader, NULL, NULL, NULL, NULL, NULL);
- m_pD3DDevice->CreatePixelShader((D3DPIXELSHADERDEF*)pShader->GetBufferPointer(), &m_hInterleavingShader);
- pShader->Release();
-
- XGAssembleShader("InterleaveShaderAlpha", interleavealpha, strlen(interleavealpha), 0, NULL, &pShader, NULL, NULL, NULL, NULL, NULL);
- m_pD3DDevice->CreatePixelShader((D3DPIXELSHADERDEF*)pShader->GetBufferPointer(), &m_hInterleavingShaderAlpha);
- pShader->Release();
-
- XGAssembleShader("YUV2RGBShader", yuv2rgb, strlen(yuv2rgb), 0, NULL, &pShader, NULL, NULL, NULL, NULL, NULL);
- m_pD3DDevice->CreatePixelShader((D3DPIXELSHADERDEF*)pShader->GetBufferPointer(), &m_hYUVtoRGBLookup);
- pShader->Release();
-
- }
-
- return 0;
-}
-
-void CRGBRendererV2::UnInit()
-{
- CSingleLock lock(g_graphicsContext);
-
- Delete444PTexture();
- DeleteLookupTextures();
-
- if (m_hInterleavingShader)
- {
- m_pD3DDevice->DeletePixelShader(m_hInterleavingShader);
- m_hInterleavingShader = 0;
- }
-
- if (m_hInterleavingShaderAlpha)
- {
- m_pD3DDevice->DeletePixelShader(m_hInterleavingShaderAlpha);
- m_hInterleavingShaderAlpha = 0;
- }
-
- if (m_hYUVtoRGBLookup)
- {
- m_pD3DDevice->DeletePixelShader(m_hYUVtoRGBLookup);
- m_hYUVtoRGBLookup = 0;
- }
- CXBoxRenderer::UnInit();
-}
-
-void CRGBRendererV2::DeleteLookupTextures()
-{
- if (m_UVLookup)
- {
- m_UVLookup->Release();
- m_UVLookup = NULL;
- }
- if (m_UVErrorLookup)
- {
- m_UVErrorLookup->Release();
- m_UVErrorLookup = NULL;
- }
-}
-
-bool CRGBRendererV2::CreateLookupTextures(const YUVCOEF &coef, const YUVRANGE &range)
-{
- if(memcmp(&m_yuvcoef_last, &coef, sizeof(YUVCOEF)) == 0
- && memcmp(&m_yuvrange_last, &range, sizeof(YUVRANGE)) == 0)
- return true;
-
- DeleteLookupTextures();
- if (
- D3D_OK != m_pD3DDevice->CreateTexture(1 , 256, 1, 0, D3DFMT_A8L8 , 0, &m_YLookup) ||
- D3D_OK != m_pD3DDevice->CreateTexture(256, 256, 1, 0, D3DFMT_A8R8G8B8, 0, &m_UVLookup) ||
- D3D_OK != m_pD3DDevice->CreateTexture(256, 256, 1, 0, D3DFMT_A8R8G8B8, 0, &m_UVErrorLookup)
- )
- {
- DeleteLookupTextures();
- CLog::Log(LOGERROR, "Could not create RGB lookup textures");
- return false;
- }
-
- // fill in the lookup texture
- // create a temporary buffer as we need to swizzle the result
- D3DLOCKED_RECT lr;
- BYTE *pBuffY = new BYTE[1 * 256 * 2];
- BYTE *pBuff = new BYTE[256 * 256 * 4];
- BYTE *pErrorBuff = new BYTE[256 * 256 * 4];
-
- if(pBuffY)
- {
- // first column is our luminance data
- for (int y = 0; y < 256; y++)
- {
- float fY = (y - range.y_min) * 255.0f / (range.y_max - range.y_min);
-
- fY = CLAMP(fY, 0.0f, 255.0f);
-
- float fWhole = floor(fY);
- float fFrac = floor((fY - fWhole) * 85.0f + 0.5f); // 0 .. 1.0
-
- pBuffY[2*y] = (BYTE)fWhole;
- pBuffY[2*y+1] = (BYTE)fFrac;
- }
- }
-
- if (pBuff && pErrorBuff)
- {
- for (int u = 1; u < 256; u++)
- {
- for (int v = 0; v < 256; v++)
- {
- // convert to -0.5 .. 0.5 ( -127.5 .. 127.5 )
- float fV = (v - range.v_min) * 255.f / (range.v_max - range.v_min) - 127.5f;
- float fU = (u - range.u_min) * 255.f / (range.u_max - range.u_min) - 127.5f;
-
- fU = CLAMP(fU, -127.5f, 127.5f);
- fV = CLAMP(fV, -127.5f, 127.5f);
-
- // have U and V, calculate R, G and B contributions (lie between 0 and 255)
- // -1 is mapped to 0, 1 is mapped to 255
- float r = coef.r_up * fU + coef.r_vp * fV;
- float g = coef.g_up * fU + coef.g_vp * fV;
- float b = coef.b_up * fU + coef.b_vp * fV;
-
- float r_rnd = floor(r * 0.5f - 0.5f) * 2 + 1;
- float g_rnd = floor(g * 0.5f - 0.5f) * 2 + 1;
- float b_rnd = floor(b * 0.5f - 0.5f) * 2 + 1;
-
- float ps_r = (r_rnd - 1) * 0.5f + 128.0f;
- float ps_g = (g_rnd - 1) * 0.5f + 128.0f;
- float ps_b = (b_rnd - 1) * 0.5f + 128.0f;
-
- ps_r = CLAMP(ps_r, 0.0f, 255.0f);
- ps_g = CLAMP(ps_g, 0.0f, 255.0f);
- ps_b = CLAMP(ps_b, 0.0f, 255.0f);
-
- float r_frac = floor((r - r_rnd) * 85.0f + 0.5f);
- float b_frac = floor((b - b_rnd) * 85.0f + 0.5f);
- float g_frac = floor((g - g_rnd) * 85.0f + 0.5f);
-
- pBuff[4*u + 1024*v + 0] = (BYTE)ps_b;
- pBuff[4*u + 1024*v + 1] = (BYTE)ps_g;
- pBuff[4*u + 1024*v + 2] = (BYTE)ps_r;
- pBuff[4*u + 1024*v + 3] = 0;
- pErrorBuff[4*u + 1024*v + 0] = (BYTE)b_frac;
- pErrorBuff[4*u + 1024*v + 1] = (BYTE)g_frac;
- pErrorBuff[4*u + 1024*v + 2] = (BYTE)r_frac;
- pErrorBuff[4*u + 1024*v + 3] = 0;
- }
- }
- m_YLookup->LockRect(0, &lr, NULL, 0);
- XGSwizzleRect(pBuffY, 0, NULL, lr.pBits, 1, 256, NULL, 2);
- m_YLookup->UnlockRect(0);
- m_UVLookup->LockRect(0, &lr, NULL, 0);
- XGSwizzleRect(pBuff, 0, NULL, lr.pBits, 256, 256, NULL, 4);
- m_UVLookup->UnlockRect(0);
- m_UVErrorLookup->LockRect(0, &lr, NULL, 0);
- XGSwizzleRect(pErrorBuff, 0, NULL, lr.pBits, 256, 256, NULL, 4);
- m_UVErrorLookup->UnlockRect(0);
-
- m_yuvcoef_last = coef;
- m_yuvrange_last = range;
- }
- delete[] pBuff;
- delete[] pErrorBuff;
- delete[] pBuffY;
-
- return true;
-}
-void CRGBRendererV2::InterleaveYUVto444P(
- YUVPLANES pSources,
- LPDIRECT3DTEXTURE8 pAlpha,
- LPDIRECT3DSURFACE8 pTarget,
- RECT &source, RECT &sourcealpha, RECT &target,
- unsigned cshift_x, unsigned cshift_y,
- float offset_x, float offset_y,
- float coffset_x, float coffset_y)
-{
- coffset_x += offset_x / (1<<cshift_x);
- coffset_y += offset_y / (1<<cshift_y);
-
- for (int i = 0; i < 3; ++i)
- {
- m_pD3DDevice->SetTexture( i, pSources[i]);
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
- }
-
- m_pD3DDevice->SetVertexShader( FVF_YV12VERTEX );
-
- if(pAlpha)
- {
- m_pD3DDevice->SetTexture(3, pAlpha);
- m_pD3DDevice->SetPixelShader( m_hInterleavingShaderAlpha );
- }
- else
- {
- m_pD3DDevice->SetTexture(3, SURFTOTEX(pTarget));
- m_pD3DDevice->SetPixelShader( m_hInterleavingShader );
- }
-
- m_pD3DDevice->SetTextureStageState( 3, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( 3, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( 3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( 3, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
-
-
- LPDIRECT3DSURFACE8 pOldRT = NULL;
- if( pTarget )
- {
- m_pD3DDevice->GetRenderTarget(&pOldRT);
- m_pD3DDevice->SetRenderTarget(pTarget, NULL);
- }
-
- m_pD3DDevice->SetScreenSpaceOffset(-0.5f, -0.5f);
- m_pD3DDevice->Begin(D3DPT_QUADLIST);
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.left + offset_x, (float)source.top + offset_y);
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)(source.left>>cshift_x) + coffset_x, (float)(source.top>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)(source.left>>cshift_x) + coffset_x, (float)(source.top>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)sourcealpha.left, (float)sourcealpha.top);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.left, (float)target.top, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.right + offset_x, (float)source.top + offset_y);
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)(source.right>>cshift_x) + coffset_x, (float)(source.top>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)(source.right>>cshift_x) + coffset_x, (float)(source.top>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)sourcealpha.right, (float)sourcealpha.top);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.right, (float)target.top, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.right + offset_x, (float)source.bottom + offset_y);
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)(source.right>>cshift_x) + coffset_x, (float)(source.bottom>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)(source.right>>cshift_x) + coffset_x, (float)(source.bottom>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)sourcealpha.right, (float)sourcealpha.bottom);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.right, (float)target.bottom, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.left + offset_x, (float)source.bottom + offset_y);
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, (float)(source.left>>cshift_x) + coffset_x, (float)(source.bottom>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, (float)(source.left>>cshift_x) + coffset_x, (float)(source.bottom>>cshift_y) + coffset_y );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, (float)sourcealpha.left, (float)sourcealpha.bottom);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.left, (float)target.bottom, 0, 1.0f );
-
- m_pD3DDevice->End();
-
- m_pD3DDevice->SetScreenSpaceOffset(0.0f, 0.0f);
-
- m_pD3DDevice->SetTexture(0, NULL);
- m_pD3DDevice->SetTexture(1, NULL);
- m_pD3DDevice->SetTexture(2, NULL);
- m_pD3DDevice->SetTexture(3, NULL);
-
- if( pOldRT )
- {
- m_pD3DDevice->SetRenderTarget( pOldRT, NULL);
- pOldRT->Release();
- }
-}
-
-void CRGBRendererV2::RenderYUVtoRGB(
- D3DBaseTexture* pSource,
- RECT &source, RECT &target,
- float offset_x, float offset_y)
-{
- m_pD3DDevice->SetTexture( 0, pSource);
- m_pD3DDevice->SetTexture( 1, m_YLookup);
- m_pD3DDevice->SetTexture( 2, m_UVLookup);
- m_pD3DDevice->SetTexture( 3, m_UVErrorLookup);
-
- for (int i = 0; i < 4; ++i)
- {
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
- m_pD3DDevice->SetTextureStageState( i, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
- }
-
- m_pD3DDevice->SetVertexShader( FVF_YUVRGBVERTEX );
- m_pD3DDevice->SetPixelShader( m_hYUVtoRGBLookup );
-
- // render the full frame
- m_pD3DDevice->Begin(D3DPT_QUADLIST);
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, 0.0f, 0.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, 0.0f, 0.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, 0.0f, 0.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, 1.0f, 0.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, 1.0f, 0.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, 1.0f, 0.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, 1.0f, 1.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, 1.0f, 1.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, 1.0f, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD1, 0.0f, 1.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD2, 0.0f, 1.0f );
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD3, 0.0f, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.left + offset_x, (float)source.top + offset_y);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.left, (float)target.top, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.right + offset_x, (float)source.top + offset_y);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.right, (float)target.top, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.right + offset_x, (float)source.bottom + offset_y);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.right, (float)target.bottom, 0, 1.0f );
-
- m_pD3DDevice->SetVertexData2f( D3DVSDE_TEXCOORD0, (float)source.left + offset_x, (float)source.bottom + offset_y);
- m_pD3DDevice->SetVertexData4f( D3DVSDE_VERTEX, (float)target.left, (float)target.bottom, 0, 1.0f );
-
- m_pD3DDevice->End();
-
-}
+++ /dev/null
-#ifndef RGBV2_RENDERER
-#define RGBV2_RENDERER
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "XBoxRenderer.h"
-
-class CRGBRendererV2 : public CXBoxRenderer
-{
-public:
- CRGBRendererV2(LPDIRECT3DDEVICE8 pDevice);
- //~CRGBRendererV2();
-
- // Functions called from mplayer
- // virtual void WaitForFlip();
- virtual bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags);
- virtual unsigned int PreInit();
- virtual void UnInit();
- virtual void FlipPage(int source);
-
-protected:
- virtual void Render(DWORD flags);
- virtual void ManageTextures();
-
- bool Create444PTexture(bool full, bool field);
- void Delete444PTexture();
- void Clear444PTexture(bool full, bool field);
-
- bool CreateLookupTextures(const YUVCOEF &coef, const YUVRANGE &range);
- void DeleteLookupTextures();
-
- void InterleaveYUVto444P(
- YUVPLANES pSources,
- LPDIRECT3DTEXTURE8 pAlpha,
- LPDIRECT3DSURFACE8 pTarget,
- RECT &source, RECT &sourcealpha, RECT &target,
- unsigned cshift_x, unsigned cshift_y,
- float offset_x, float offset_y,
- float coffset_x, float coffset_y);
-
- void RenderYUVtoRGB(
- D3DBaseTexture* pSource,
- RECT &source, RECT &target,
- float offset_x, float offset_y);
-
- // YUV interleaved texture
- LPDIRECT3DTEXTURE8 m_444PTextureFull;
- LPDIRECT3DTEXTURE8 m_444PTextureField;
-
- bool m_444GeneratedFull;
- int m_444RenderBuffer;
-
-
- // textures for YUV->RGB lookup
- LPDIRECT3DTEXTURE8 m_UVLookup;
- LPDIRECT3DTEXTURE8 m_YLookup;
- LPDIRECT3DTEXTURE8 m_UVErrorLookup;
- YUVRANGE m_yuvrange_last;
- YUVCOEF m_yuvcoef_last;
-
-
- // Pixel shaders
- DWORD m_hInterleavingShader;
- DWORD m_hInterleavingShaderAlpha;
- DWORD m_hYUVtoRGBLookup;
-
- BYTE m_motionpass;
-
- // Vertex types
- static const DWORD FVF_YUVRGBVERTEX = D3DFVF_XYZRHW | D3DFVF_TEX4;
- static const DWORD FVF_RGBVERTEX = D3DFVF_XYZRHW | D3DFVF_TEX1;
-};
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 2010-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-texture g_YTexture;
-texture g_UTexture;
-texture g_VTexture;
-texture g_KernelTexture;
-
-float2 g_YStep;
-float2 g_UVStep;
-
-float4x4 g_ColorMatrix;
-
-sampler YSampler =
- sampler_state {
- Texture = <g_YTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler USampler =
- sampler_state {
- Texture = <g_UTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler VSampler =
- sampler_state
- {
- Texture = <g_VTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler KernelSampler =
- sampler_state
- {
- Texture = <g_KernelTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = LINEAR;
- MagFilter = LINEAR;
- };
-
-struct VS_OUTPUT
-{
- float4 Position : POSITION;
- float2 TextureY : TEXCOORD0;
- float2 TextureU : TEXCOORD1;
- float2 TextureV : TEXCOORD2;
-};
-
-struct PS_OUTPUT
-{
- float4 RGBColor : COLOR0;
-};
-
-float4 weight(float pos)
-{
- return tex1D(KernelSampler, pos);
-}
-
-float pixel(sampler tex, float xpos, float ypos)
-{
- return tex2D(tex, float2(xpos, ypos)).r;
-}
-
-float getLine(sampler tex, float ypos, float4 xpos, float4 linetaps)
-{
- float pixels;
-
- pixels = pixel(tex, xpos.r, ypos) * linetaps.r;
- pixels += pixel(tex, xpos.g, ypos) * linetaps.g;
- pixels += pixel(tex, xpos.b, ypos) * linetaps.b;
- pixels += pixel(tex, xpos.a, ypos) * linetaps.a;
-
- return pixels;
-}
-
-float getPixel(sampler tex, float2 texCoord, float2 step)
-{
- float xf = frac(texCoord.x / step.x);
- float yf = frac(texCoord.y / step.y);
-
- float4 linetaps = weight(1.0 - xf);
- float4 columntaps = weight(1.0 - yf);
-
- float4 xpos = float4(
- (-0.5 - xf) * step.x + texCoord.x,
- ( 0.5 - xf) * step.x + texCoord.x,
- ( 1.5 - xf) * step.x + texCoord.x,
- ( 2.5 - xf) * step.x + texCoord.x);
-
- float fragColor;
- fragColor = getLine(tex, (-0.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.r;
- fragColor += getLine(tex, ( 0.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.g;
- fragColor += getLine(tex, ( 1.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.b;
- fragColor += getLine(tex, ( 2.5 - yf) * step.y + texCoord.y, xpos, linetaps) * columntaps.a;
-
- return fragColor;
-}
-
-PS_OUTPUT YUV2RGB(VS_OUTPUT In)
-{
- PS_OUTPUT OUT;
- float4 YUV = float4(getPixel (YSampler, In.TextureY, g_YStep)
- , getPixel (USampler, In.TextureU, g_UVStep)
- , getPixel (VSampler, In.TextureV, g_UVStep)
- , 1.0);
- OUT.RGBColor = mul(YUV, g_ColorMatrix);
- OUT.RGBColor.a = 1.0;
- return OUT;
-}
-
-technique YUV2RGB_T
-{
- pass P0
- {
- PixelShader = compile ps_3_0 YUV2RGB();
- ZEnable = False;
- FillMode = Solid;
- FogEnable = False;
- }
-};
+++ /dev/null
-/*
- * Copyright (C) 2010-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-texture g_YTexture;
-texture g_UTexture;
-texture g_VTexture;
-texture g_KernelTexture;
-
-float2 g_YStep;
-float2 g_UVStep;
-
-float4x4 g_ColorMatrix;
-
-sampler YSampler =
- sampler_state {
- Texture = <g_YTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler USampler =
- sampler_state {
- Texture = <g_UTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler VSampler =
- sampler_state
- {
- Texture = <g_VTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = POINT;
- MagFilter = POINT;
- };
-
-sampler KernelSampler =
- sampler_state
- {
- Texture = <g_KernelTexture>;
- AddressU = CLAMP;
- AddressV = CLAMP;
- MipFilter = LINEAR;
- MinFilter = LINEAR;
- MagFilter = LINEAR;
- };
-
-struct VS_OUTPUT
-{
- float4 Position : POSITION;
- float2 TextureY : TEXCOORD0;
- float2 TextureU : TEXCOORD1;
- float2 TextureV : TEXCOORD2;
-};
-
-struct PS_OUTPUT
-{
- float4 RGBColor : COLOR0;
-};
-
-float3 weight(float pos)
-{
- return tex1D(KernelSampler, pos).rgb;
-}
-
-float pixel(sampler tex, float xpos, float ypos)
-{
- return tex2D(tex, float2(xpos, ypos)).r;
-}
-
-float getLine(sampler tex, float ypos, float3 xpos1, float3 xpos2, float3 linetaps1, float3 linetaps2)
-{
- float pixels;
-
- pixels = pixel(tex, xpos1.r, ypos) * linetaps1.r;
- pixels += pixel(tex, xpos1.g, ypos) * linetaps2.r;
- pixels += pixel(tex, xpos1.b, ypos) * linetaps1.g;
- pixels += pixel(tex, xpos2.r, ypos) * linetaps2.g;
- pixels += pixel(tex, xpos2.g, ypos) * linetaps1.b;
- pixels += pixel(tex, xpos2.b, ypos) * linetaps2.b;
-
- return pixels;
-}
-
-float getPixel(sampler tex, float2 texCoord, float2 step)
-{
- float xf = frac(texCoord.x / step.x);
- float yf = frac(texCoord.y / step.y);
-
- float3 linetaps1 = weight((1.0 - xf) / 2.0);
- float3 linetaps2 = weight((1.0 - xf) / 2.0 + 0.5);
- float3 columntaps1 = weight((1.0 - yf) / 2.0);
- float3 columntaps2 = weight((1.0 - yf) / 2.0 + 0.5);
-
- float3 xpos1 = float3(
- (-1.5 - xf) * step.x + texCoord.x,
- (-0.5 - xf) * step.x + texCoord.x,
- ( 0.5 - xf) * step.x + texCoord.x);
- float3 xpos2 = float3(
- ( 1.5 - xf) * step.x + texCoord.x,
- ( 2.5 - xf) * step.x + texCoord.x,
- ( 3.5 - xf) * step.x + texCoord.x);
-
- float fragColor;
- fragColor = getLine(tex, (-1.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.r;
- fragColor += getLine(tex, (-0.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.r;
- fragColor += getLine(tex, ( 0.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.g;
- fragColor += getLine(tex, ( 1.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.g;
- fragColor += getLine(tex, ( 2.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps1.b;
- fragColor += getLine(tex, ( 3.5 - yf) * step.y + texCoord.y, xpos1, xpos2, linetaps1, linetaps2) * columntaps2.b;
-
- return fragColor;
-}
-
-PS_OUTPUT YUV2RGB(VS_OUTPUT In)
-{
- PS_OUTPUT OUT;
- float4 YUV = float4(getPixel (YSampler, In.TextureY, g_YStep)
- , getPixel (USampler, In.TextureU, g_UVStep)
- , getPixel (VSampler, In.TextureV, g_UVStep)
- , 1.0);
- OUT.RGBColor = mul(YUV, g_ColorMatrix);
- OUT.RGBColor.a = 1.0;
- return OUT;
-}
-
-technique YUV2RGB_T
-{
- pass P0
- {
- PixelShader = compile ps_3_0 YUV2RGB();
- ZEnable = False;
- FillMode = Solid;
- FogEnable = False;
- }
-};
};
for (const char **ptr = cansurfacerender_decoders; *ptr; ptr++)
{
- if (!strcmp(*ptr, name.c_str()))
+ if (!strncmp(*ptr, name.c_str(), strlen(*ptr)))
return true;
}
return false;
}
// whitelist of devices that can surface render.
- m_render_sw = CanSurfaceRenderWhiteList(m_codecname);
+ m_render_sw = !CanSurfaceRenderWhiteList(m_codecname);
ConfigureMediaCodec();
#include "settings/AdvancedSettings.h"
#include "settings/Settings.h"
#include "filesystem/File.h"
+#include "filesystem/CurlFile.h"
#include "filesystem/Directory.h"
#include "utils/log.h"
#include "threads/Thread.h"
}
if (result < 0 && m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, &options) < 0 )
{
- CLog::Log(LOGDEBUG, "Error, could not open file %s", strFile.c_str());
+ CLog::Log(LOGDEBUG, "Error, could not open file %s", CURL::GetRedacted(strFile).c_str());
Dispose();
m_dllAvUtil.av_dict_free(&options);
return false;
pd.buf_size = m_dllAvFormat.avio_read(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size);
if (pd.buf_size <= 0)
{
- CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, strFile.c_str());
+ CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, CURL::GetRedacted(strFile).c_str());
return false;
}
memset(pd.buf+pd.buf_size, 0, AVPROBE_PADDING_SIZE);
if (!iformat)
{
- CLog::Log(LOGERROR, "%s - error probing input format, %s", __FUNCTION__, strFile.c_str());
+ CLog::Log(LOGERROR, "%s - error probing input format, %s", __FUNCTION__, CURL::GetRedacted(strFile).c_str());
return false;
}
else
if (m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0)
{
- CLog::Log(LOGERROR, "%s - Error, could not open file %s", __FUNCTION__, strFile.c_str());
+ CLog::Log(LOGERROR, "%s - Error, could not open file %s", __FUNCTION__, CURL::GetRedacted(strFile).c_str());
Dispose();
return false;
}
int iErr = m_dllAvFormat.avformat_find_stream_info(m_pFormatContext, NULL);
if (iErr < 0)
{
- CLog::Log(LOGWARNING,"could not find codec parameters for %s", strFile.c_str());
+ CLog::Log(LOGWARNING,"could not find codec parameters for %s", CURL::GetRedacted(strFile).c_str());
if (m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD)
|| m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY)
|| (m_pFormatContext->nb_streams == 1 && m_pFormatContext->streams[0]->codec->codec_id == AV_CODEC_ID_AC3))
if (!headers.empty())
m_dllAvUtil.av_dict_set(&options, "headers", headers.c_str(), 0);
+
+ std::string cookies;
+ if (XFILE::CCurlFile::GetCookies(url, cookies))
+ m_dllAvUtil.av_dict_set(&options, "cookies", cookies.c_str(), 0);
+
}
return options;
}
bool CDVDFileInfo::ExtractThumb(const CStdString &strPath, CTextureDetails &details, CStreamDetails *pStreamDetails)
{
+ std::string redactPath = CURL::GetRedacted(strPath);
unsigned int nTime = XbmcThreads::SystemClockMillis();
CDVDInputStream *pInputStream = CDVDFactoryInputStream::CreateInputStream(NULL, strPath, "");
if (!pInputStream)
{
- CLog::Log(LOGERROR, "InputStream: Error creating stream for %s", strPath.c_str());
+ CLog::Log(LOGERROR, "InputStream: Error creating stream for %s", redactPath.c_str());
return false;
}
if (pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD))
{
- CLog::Log(LOGERROR, "InputStream: dvd streams not supported for thumb extraction, file: %s", strPath.c_str());
+ CLog::Log(LOGERROR, "InputStream: dvd streams not supported for thumb extraction, file: %s", redactPath.c_str());
delete pInputStream;
return false;
}
if (!pInputStream->Open(strPath.c_str(), ""))
{
- CLog::Log(LOGERROR, "InputStream: Error opening, %s", strPath.c_str());
+ CLog::Log(LOGERROR, "InputStream: Error opening, %s", redactPath.c_str());
if (pInputStream)
delete pInputStream;
return false;
int nTotalLen = pDemuxer->GetStreamLength();
int nSeekTo = nTotalLen / 3;
- CLog::Log(LOGDEBUG,"%s - seeking to pos %dms (total: %dms) in %s", __FUNCTION__, nSeekTo, nTotalLen, strPath.c_str());
+ CLog::Log(LOGDEBUG,"%s - seeking to pos %dms (total: %dms) in %s", __FUNCTION__, nSeekTo, nTotalLen, redactPath.c_str());
if (pDemuxer->SeekTime(nSeekTo, true))
{
int iDecoderState = VC_ERROR;
}
else
{
- CLog::Log(LOGDEBUG,"%s - decode failed in %s after %d packets.", __FUNCTION__, strPath.c_str(), packetsTried);
+ CLog::Log(LOGDEBUG,"%s - decode failed in %s after %d packets.", __FUNCTION__, redactPath.c_str(), packetsTried);
}
}
delete pVideoCodec;
}
unsigned int nTotalTime = XbmcThreads::SystemClockMillis() - nTime;
- CLog::Log(LOGDEBUG,"%s - measured %u ms to extract thumb from file <%s> in %d packets. ", __FUNCTION__, nTotalTime, strPath.c_str(), packetsTried);
+ CLog::Log(LOGDEBUG,"%s - measured %u ms to extract thumb from file <%s> in %d packets. ", __FUNCTION__, nTotalTime, redactPath.c_str(), packetsTried);
return bOk;
}
{
try
{
- CLog::Log(LOGNOTICE, "DVDPlayer: Opening: %s", file.GetPath().c_str());
+ CLog::Log(LOGNOTICE, "DVDPlayer: Opening: %s", CURL::GetRedacted(file.GetPath()).c_str());
// if playing a file close it first
// this has to be changed so we won't have to close it.
#endif
Create();
- if(!m_ready.WaitMSec(100))
+ if(!m_ready.WaitMSec(g_advancedSettings.m_videoBusyDialogDelay_ms))
{
CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY);
if(dialog)
void COMXAudio::UpdateAttenuation()
{
+ // always called with m_critSection lock held
+ if (!m_Initialized || m_Passthrough)
+ return;
+
if (m_amplification == 1.0)
{
ApplyVolume();
#include "settings/Settings.h"
#include "linux/RBP.h"
#include "utils/URIUtils.h"
+#include "windowing/WindowingFactory.h"
+#include "Application.h"
+
+#ifdef _DEBUG
+#define CheckError() m_result = eglGetError(); if (m_result != EGL_SUCCESS) CLog::Log(LOGERROR, "EGL error in %s: %x",__FUNCTION__, m_result);
+#else
+#define CheckError()
+#endif
#define EXIF_TAG_ORIENTATION 0x0112
#endif
#define CLASSNAME "COMXImage"
+COMXImage::COMXImage()
+: CThread("CRBPWorker")
+{
+}
+
+COMXImage::~COMXImage()
+{
+ Deinitialize();
+}
+
+void COMXImage::Initialize()
+{
+ Create();
+}
+
+void COMXImage::Deinitialize()
+{
+ // wake up thread so it can quit
+ {
+ CSingleLock lock(m_texqueue_lock);
+ m_bStop = true;
+ m_texqueue_cond.notifyAll();
+ }
+ if (IsRunning())
+ StopThread();
+}
+
bool COMXImage::CreateThumbnailFromSurface(unsigned char* buffer, unsigned int width, unsigned int height,
unsigned int format, unsigned int pitch, const CStdString& destFile)
{
return okay;
}
+void COMXImage::AllocTextureInternal(struct textureinfo *tex)
+{
+ glGenTextures(1, (GLuint*) &tex->texture);
+ glBindTexture(GL_TEXTURE_2D, tex->texture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex->width, tex->height, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0);
+ tex->egl_image = eglCreateImageKHR(m_egl_display, m_egl_context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)tex->texture, NULL);
+ tex->sync.Set();
+ GLint m_result;
+ CheckError();
+}
+
+void COMXImage::GetTexture(void *userdata, GLuint *texture)
+{
+ struct textureinfo *tex = static_cast<struct textureinfo *>(userdata);
+ *texture = tex->texture;
+}
+
+void COMXImage::DestroyTextureInternal(struct textureinfo *tex)
+{
+ bool s = true;
+ if (!tex->egl_image || !tex->texture)
+ {
+ CLog::Log(LOGNOTICE, "%s: Invalid image/texture %p:%d", __func__, tex->egl_image, tex->texture);
+ return;
+ }
+ s = eglDestroyImageKHR(m_egl_display, tex->egl_image);
+ if (!s)
+ CLog::Log(LOGNOTICE, "%s: failed to destroy texture", __func__);
+ glDeleteTextures(1, (GLuint*) &tex->texture);
+ tex->sync.Set();
+}
+
+void COMXImage::DestroyTexture(void *userdata)
+{
+ struct textureinfo *tex = static_cast<struct textureinfo *>(userdata);
+ // we can only call gl functions from the application thread
+
+ tex->action = TEXTURE_DELETE;
+ tex->sync.Reset();
+ if ( g_application.IsCurrentThread() )
+ {
+ DestroyTextureInternal(tex);
+ }
+ else
+ {
+ CSingleLock lock(m_texqueue_lock);
+ m_texqueue.push(tex);
+ m_texqueue_cond.notifyAll();
+ }
+ // wait for function to have finished (in texture thread)
+ tex->sync.Wait();
+ delete tex;
+}
+
+bool COMXImage::DecodeJpegToTexture(COMXImageFile *file, unsigned int width, unsigned int height, void **userdata)
+{
+ bool ret = false;
+ COMXTexture omx_image;
+
+ struct textureinfo *tex = new struct textureinfo;
+ if (!tex)
+ return NULL;
+
+ tex->parent = (void *)this;
+ tex->width = width;
+ tex->height = height;
+ tex->texture = 0;
+ tex->egl_image = NULL;
+ tex->filename = file->GetFilename();
+ tex->action = TEXTURE_ALLOC;
+ tex->sync.Reset();
+
+ {
+ CSingleLock lock(m_texqueue_lock);
+ m_texqueue.push(tex);
+ m_texqueue_cond.notifyAll();
+ }
+
+ // wait for function to have finished (in texture thread)
+ tex->sync.Wait();
+
+ if (tex->egl_image && tex->texture && omx_image.Decode(file->GetImageBuffer(), file->GetImageSize(), width, height, tex->egl_image, m_egl_display))
+ {
+ ret = true;
+ *userdata = tex;
+ }
+ else
+ {
+ CLog::Log(LOGNOTICE, "%s: unable to decode to texture %s %dx%d", __func__, file->GetFilename(), width, height);
+ DestroyTexture(tex);
+ }
+ return ret;
+}
+
+static bool ChooseConfig(EGLDisplay display, const EGLint *configAttrs, EGLConfig *config)
+{
+ EGLBoolean eglStatus = true;
+ EGLint configCount = 0;
+ EGLConfig* configList = NULL;
+ GLint m_result;
+ // Find out how many configurations suit our needs
+ eglStatus = eglChooseConfig(display, configAttrs, NULL, 0, &configCount);
+ CheckError();
+
+ if (!eglStatus || !configCount)
+ {
+ CLog::Log(LOGERROR, "EGL failed to return any matching configurations: %i", configCount);
+ return false;
+ }
+
+ // Allocate room for the list of matching configurations
+ configList = (EGLConfig*)malloc(configCount * sizeof(EGLConfig));
+ if (!configList)
+ {
+ CLog::Log(LOGERROR, "EGL failure obtaining configuration list");
+ return false;
+ }
+
+ // Obtain the configuration list from EGL
+ eglStatus = eglChooseConfig(display, configAttrs, configList, configCount, &configCount);
+ CheckError();
+ if (!eglStatus || !configCount)
+ {
+ CLog::Log(LOGERROR, "EGL failed to populate configuration list: %d", eglStatus);
+ return false;
+ }
+
+ // Select an EGL configuration that matches the native window
+ *config = configList[0];
+
+ free(configList);
+ return true;
+}
+
+void COMXImage::CreateContext()
+{
+ EGLConfig egl_config;
+ GLint m_result;
+
+ m_egl_display = g_Windowing.GetEGLDisplay();
+ eglInitialize(m_egl_display, NULL, NULL);
+ CheckError();
+ eglBindAPI(EGL_OPENGL_ES_API);
+ CheckError();
+ static const EGLint contextAttrs [] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
+ static const EGLint configAttrs [] = {
+ EGL_RED_SIZE, 8,
+ EGL_GREEN_SIZE, 8,
+ EGL_BLUE_SIZE, 8,
+ EGL_ALPHA_SIZE, 8,
+ EGL_DEPTH_SIZE, 16,
+ EGL_STENCIL_SIZE, 0,
+ EGL_SAMPLE_BUFFERS, 0,
+ EGL_SAMPLES, 0,
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+ EGL_NONE
+ };
+ bool s = ChooseConfig(m_egl_display, configAttrs, &egl_config);
+ CheckError();
+ if (!s)
+ {
+ CLog::Log(LOGERROR, "%s: Could not find a compatible configuration",__FUNCTION__);
+ return;
+ }
+ m_egl_context = eglCreateContext(m_egl_display, egl_config, g_Windowing.GetEGLContext(), contextAttrs);
+ CheckError();
+ if (m_egl_context == EGL_NO_CONTEXT)
+ {
+ CLog::Log(LOGERROR, "%s: Could not create a context",__FUNCTION__);
+ return;
+ }
+ EGLSurface egl_surface = eglCreatePbufferSurface(m_egl_display, egl_config, NULL);
+ CheckError();
+ if (egl_surface == EGL_NO_SURFACE)
+ {
+ CLog::Log(LOGERROR, "%s: Could not create a surface",__FUNCTION__);
+ return;
+ }
+ s = eglMakeCurrent(m_egl_display, egl_surface, egl_surface, m_egl_context);
+ CheckError();
+ if (!s)
+ {
+ CLog::Log(LOGERROR, "%s: Could not make current",__FUNCTION__);
+ return;
+ }
+}
+
+void COMXImage::Process()
+{
+ bool firsttime = true;
+
+ while(!m_bStop)
+ {
+ struct textureinfo *tex = NULL;
+ while (!m_bStop)
+ {
+ CSingleLock lock(m_texqueue_lock);
+ if (!m_texqueue.empty())
+ {
+ tex = m_texqueue.front();
+ m_texqueue.pop();
+ break;
+ }
+ m_texqueue_cond.wait(lock);
+ }
+
+ if (m_bStop)
+ return;
+
+ if (firsttime)
+ CreateContext();
+ firsttime = false;
+
+ if (tex && tex->action == TEXTURE_ALLOC)
+ AllocTextureInternal(tex);
+ else if (tex && tex->action == TEXTURE_DELETE)
+ DestroyTextureInternal(tex);
+ else
+ CLog::Log(LOGERROR, "%s: Unexpected texture job: %p:%d", __func__, tex, tex ? tex->action : 0);
+ }
+}
+
+void COMXImage::OnStartup()
+{
+}
+
+void COMXImage::OnExit()
+{
+}
+
#ifdef CLASSNAME
#undef CLASSNAME
#endif
return true;
}
+
+
+#ifdef CLASSNAME
+#undef CLASSNAME
+#endif
+#define CLASSNAME "COMXTexture"
+
+COMXTexture::COMXTexture()
+{
+}
+
+COMXTexture::~COMXTexture()
+{
+ Close();
+}
+
+void COMXTexture::Close()
+{
+ CSingleLock lock(m_OMXSection);
+
+ if (m_omx_tunnel_decode.IsInitialized())
+ m_omx_tunnel_decode.Deestablish();
+ if (m_omx_tunnel_egl.IsInitialized())
+ m_omx_tunnel_egl.Deestablish();
+ // delete components
+ if (m_omx_decoder.IsInitialized())
+ m_omx_decoder.Deinitialize(true);
+ if (m_omx_resize.IsInitialized())
+ m_omx_resize.Deinitialize(true);
+ if (m_omx_egl_render.IsInitialized())
+ m_omx_egl_render.Deinitialize(true);
+}
+
+bool COMXTexture::HandlePortSettingChange(unsigned int resize_width, unsigned int resize_height, void *egl_image, void *egl_display, bool port_settings_changed)
+{
+ OMX_ERRORTYPE omx_err;
+
+ if (port_settings_changed)
+ CLog::Log(LOGERROR, "%s::%s Unexpected second port_settings_changed call\n", CLASSNAME, __func__);
+
+ OMX_PARAM_PORTDEFINITIONTYPE port_def;
+ OMX_INIT_STRUCTURE(port_def);
+
+ port_def.nPortIndex = m_omx_decoder.GetOutputPort();
+ omx_err = m_omx_decoder.GetParameter(OMX_IndexParamPortDefinition, &port_def);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_decoder.GetParameter result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ // TODO: jpeg decoder can decimate by factors of 2
+ port_def.format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
+ port_def.format.image.nSliceHeight = 16;
+ port_def.format.image.nStride = 0;
+
+ omx_err = m_omx_decoder.SetParameter(OMX_IndexParamPortDefinition, &port_def);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_decoder.SetParameter result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ if (!m_omx_resize.Initialize("OMX.broadcom.resize", OMX_IndexParamImageInit))
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_resize.Initialize", CLASSNAME, __func__);
+ return false;
+ }
+
+ port_def.nPortIndex = m_omx_resize.GetInputPort();
+
+ omx_err = m_omx_resize.SetParameter(OMX_IndexParamPortDefinition, &port_def);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_resize.SetParameter result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ port_def.nPortIndex = m_omx_resize.GetOutputPort();
+ omx_err = m_omx_resize.GetParameter(OMX_IndexParamPortDefinition, &port_def);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_resize.GetParameter result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ port_def.format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
+ port_def.format.image.nFrameWidth = resize_width;
+ port_def.format.image.nFrameHeight = resize_height;
+ port_def.format.image.nSliceHeight = 16;
+ port_def.format.image.nStride = 0;
+ omx_err = m_omx_resize.SetParameter(OMX_IndexParamPortDefinition, &port_def);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_resize.SetParameter result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ if (!m_omx_egl_render.Initialize("OMX.broadcom.egl_render", OMX_IndexParamVideoInit))
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_egl_render.Initialize", CLASSNAME, __func__);
+ return false;
+ }
+
+ port_def.nPortIndex = m_omx_egl_render.GetOutputPort();
+ omx_err = m_omx_egl_render.GetParameter(OMX_IndexParamPortDefinition, &port_def);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_egl_render.SetParameter result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+ port_def.nBufferCountActual = 1;
+ port_def.format.video.pNativeWindow = egl_display;
+
+ omx_err = m_omx_egl_render.SetParameter(OMX_IndexParamPortDefinition, &port_def);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_egl_render.SetParameter result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ omx_err = m_omx_egl_render.UseEGLImage(&m_egl_buffer, m_omx_egl_render.GetOutputPort(), NULL, egl_image);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_egl_render.UseEGLImage (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ m_omx_tunnel_decode.Initialize(&m_omx_decoder, m_omx_decoder.GetOutputPort(), &m_omx_resize, m_omx_resize.GetInputPort());
+
+ omx_err = m_omx_tunnel_decode.Establish(false);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_tunnel_decode.Establish (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ m_omx_tunnel_egl.Initialize(&m_omx_resize, m_omx_resize.GetOutputPort(), &m_omx_egl_render, m_omx_egl_render.GetInputPort());
+
+ omx_err = m_omx_tunnel_egl.Establish(false);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_tunnel_egl.Establish (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ omx_err = m_omx_resize.SetStateForComponent(OMX_StateExecuting);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_egl_render.GetParameter (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ omx_err = m_omx_egl_render.SetStateForComponent(OMX_StateExecuting);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_egl_render.SetStateForComponent (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ return true;
+}
+
+bool COMXTexture::Decode(const uint8_t *demuxer_content, unsigned demuxer_bytes, unsigned int width, unsigned int height, void *egl_image, void *egl_display)
+{
+ CSingleLock lock(m_OMXSection);
+ OMX_ERRORTYPE omx_err = OMX_ErrorNone;
+
+ if (!demuxer_content || !demuxer_bytes)
+ {
+ CLog::Log(LOGERROR, "%s::%s no input buffer\n", CLASSNAME, __func__);
+ return false;
+ }
+
+ if (!m_omx_decoder.Initialize("OMX.broadcom.image_decode", OMX_IndexParamImageInit))
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_decoder.Initialize", CLASSNAME, __func__);
+ return false;
+ }
+
+ // set input format
+ OMX_PARAM_PORTDEFINITIONTYPE portParam;
+ OMX_INIT_STRUCTURE(portParam);
+ portParam.nPortIndex = m_omx_decoder.GetInputPort();
+
+ omx_err = m_omx_decoder.GetParameter(OMX_IndexParamPortDefinition, &portParam);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s error GetParameter:OMX_IndexParamPortDefinition omx_err(0x%08x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ portParam.nBufferCountActual = portParam.nBufferCountMin;
+ portParam.nBufferSize = std::max(portParam.nBufferSize, ALIGN_UP(demuxer_bytes, portParam.nBufferAlignment));
+ portParam.format.image.eCompressionFormat = OMX_IMAGE_CodingJPEG;
+
+ omx_err = m_omx_decoder.SetParameter(OMX_IndexParamPortDefinition, &portParam);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s error SetParameter:OMX_IndexParamPortDefinition omx_err(0x%08x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ omx_err = m_omx_decoder.AllocInputBuffers();
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - Error alloc buffers (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ omx_err = m_omx_decoder.SetStateForComponent(OMX_StateExecuting);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_sched.SetStateForComponent (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ bool port_settings_changed = false;
+ bool eos = false;
+ while(demuxer_bytes > 0 || !port_settings_changed || !eos)
+ {
+ long timeout = 0;
+ if (demuxer_bytes)
+ {
+ OMX_BUFFERHEADERTYPE *omx_buffer = m_omx_decoder.GetInputBuffer(1000);
+ if (omx_buffer)
+ {
+ omx_buffer->nOffset = omx_buffer->nFlags = 0;
+
+ omx_buffer->nFilledLen = (demuxer_bytes > omx_buffer->nAllocLen) ? omx_buffer->nAllocLen : demuxer_bytes;
+ memcpy(omx_buffer->pBuffer, demuxer_content, omx_buffer->nFilledLen);
+
+ demuxer_content += omx_buffer->nFilledLen;
+ demuxer_bytes -= omx_buffer->nFilledLen;
+
+ if (demuxer_bytes == 0)
+ omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS;
+
+ omx_err = m_omx_decoder.EmptyThisBuffer(omx_buffer);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - m_omx_decoder.OMX_EmptyThisBuffer (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+ }
+ }
+ if (!demuxer_bytes)
+ {
+ // we've submitted all buffers so can wait now
+ timeout = 1000;
+ }
+
+ omx_err = m_omx_decoder.WaitForEvent(OMX_EventPortSettingsChanged, timeout);
+ if (omx_err == OMX_ErrorNone)
+ {
+ if (!HandlePortSettingChange(width, height, egl_image, egl_display, port_settings_changed))
+ {
+ CLog::Log(LOGERROR, "%s::%s - HandlePortSettingChange failed (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+ port_settings_changed = true;
+ }
+ else if (omx_err == OMX_ErrorStreamCorrupt)
+ {
+ CLog::Log(LOGERROR, "%s::%s - image not supported", CLASSNAME, __func__);
+ return false;
+ }
+ else if (timeout || omx_err != OMX_ErrorTimeout)
+ {
+ CLog::Log(LOGERROR, "%s::%s WaitForEvent:OMX_EventPortSettingsChanged failed (%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ if (port_settings_changed && m_egl_buffer && demuxer_bytes == 0 && !eos)
+ {
+ OMX_BUFFERHEADERTYPE *omx_buffer = m_omx_egl_render.GetOutputBuffer();
+ if (!omx_buffer)
+ {
+ CLog::Log(LOGERROR, "%s::%s GetOutputBuffer failed\n", CLASSNAME, __func__);
+ return false;
+ }
+ if (omx_buffer != m_egl_buffer)
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_egl_render.GetOutputBuffer (%p,%p)", CLASSNAME, __func__, omx_buffer, m_egl_buffer);
+ return false;
+ }
+
+ omx_err = m_omx_egl_render.FillThisBuffer(m_egl_buffer);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s error m_omx_egl_render.FillThisBuffer (%x)", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+
+ omx_err = m_omx_egl_render.WaitForOutputDone(1000);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s m_omx_egl_render.WaitForOutputDone result(0x%x)\n", CLASSNAME, __func__, omx_err);
+ return false;
+ }
+ eos = true;
+ }
+ }
+ Close();
+ return true;
+}
+
+COMXImage g_OMXImage;
#include "guilib/XBTF.h"
#endif
+#include "system_gl.h"
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include "threads/Thread.h"
+
using namespace XFILE;
using namespace std;
class COMXImageFile;
-class COMXImage
+class COMXImage : public CThread
{
+enum TextureAction {TEXTURE_ALLOC, TEXTURE_DELETE };
+
+struct textureinfo {
+ TextureAction action;
+ int width, height;
+ GLuint texture;
+ EGLImageKHR egl_image;
+ void *parent;
+ const char *filename;
+ CEvent sync;
+};
+
+protected:
+ virtual void OnStartup();
+ virtual void OnExit();
+ virtual void Process();
public:
+ COMXImage();
+ virtual ~COMXImage();
+ void Initialize();
+ void Deinitialize();
static COMXImageFile *LoadJpeg(const CStdString& texturePath);
static void CloseJpeg(COMXImageFile *file);
unsigned int format, unsigned int pitch, const CStdString& destFile);
static bool ClampLimits(unsigned int &width, unsigned int &height, unsigned int m_width, unsigned int m_height, bool transposed = false);
static bool CreateThumb(const CStdString& srcFile, unsigned int width, unsigned int height, std::string &additional_info, const CStdString& destFile);
+ bool DecodeJpegToTexture(COMXImageFile *file, unsigned int width, unsigned int height, void **userdata);
+ void DestroyTexture(void *userdata);
+ void GetTexture(void *userdata, GLuint *texture);
+private:
+ EGLDisplay m_egl_display;
+ EGLContext m_egl_context;
+
+ void CreateContext();
+ CCriticalSection m_texqueue_lock;
+ XbmcThreads::ConditionVariable m_texqueue_cond;
+ std::queue <struct textureinfo *> m_texqueue;
+ void AllocTextureInternal(struct textureinfo *tex);
+ void DestroyTextureInternal(struct textureinfo *tex);
};
class COMXImageFile
unsigned int m_nDestAllocSize;
};
+class COMXTexture
+{
+public:
+ COMXTexture();
+ virtual ~COMXTexture();
+
+ // Required overrides
+ void Close(void);
+ bool Decode(const uint8_t *data, unsigned size, unsigned int width, unsigned int height, void *egl_image, void *egl_display);
+protected:
+ bool HandlePortSettingChange(unsigned int resize_width, unsigned int resize_height, void *egl_image, void *egl_display, bool port_settings_changed);
+
+ // Components
+ COMXCoreComponent m_omx_decoder;
+ COMXCoreComponent m_omx_resize;
+ COMXCoreComponent m_omx_egl_render;
+
+ COMXCoreTunel m_omx_tunnel_decode;
+ COMXCoreTunel m_omx_tunnel_egl;
+
+ OMX_BUFFERHEADERTYPE *m_egl_buffer;
+ CCriticalSection m_OMXSection;
+};
+
+extern COMXImage g_OMXImage;
#endif
#endif
Create();
- if(!m_ready.WaitMSec(100))
+ if(!m_ready.WaitMSec(g_advancedSettings.m_videoBusyDialogDelay_ms))
{
CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY);
if(dialog)
{
CLog::Log(LOGDEBUG, "COMXPlayer::CloseFile");
- // unpause the player
- SetPlaySpeed(DVD_PLAYSPEED_NORMAL);
-
// set the abort request so that other threads can finish up
m_bAbortRequest = true;
{
// check if we should read from subtitle demuxer
- if(m_dvdPlayerSubtitle.AcceptsData() && m_pSubtitleDemuxer)
+ if( m_pSubtitleDemuxer && m_dvdPlayerSubtitle.AcceptsData() )
{
- if(m_pSubtitleDemuxer)
- packet = m_pSubtitleDemuxer->Read();
+ packet = m_pSubtitleDemuxer->Read();
if(packet)
{
void COMXPlayer::SetSubtitle(int iStream)
{
+ CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream = iStream;
m_messenger.Put(new CDVDMsgPlayerSetSubtitleStream(iStream));
}
void COMXPlayer::SetAudioStream(int iStream)
{
+ CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream = iStream;
m_messenger.Put(new CDVDMsgPlayerSetAudioStream(iStream));
SynchronizeDemuxer(100);
}
/* software decoding normaly consumes full cpu time so prio it */
m_omxPlayerAudio.SetPriority(GetPriority()+1);
-
+ CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream = m_SelectionStreams.IndexOf(STREAM_AUDIO, source, iStream);
return true;
}
m_CurrentSubtitle.stream = (void*)pStream;
m_CurrentSubtitle.started = false;
+ CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream = m_SelectionStreams.IndexOf(STREAM_SUBTITLE, source, iStream);
return true;
}
m_dvd.iDVDStillStartTime = XbmcThreads::SystemClockMillis();
/* adjust for the output delay in the video queue */
- DWORD time = 0;
+ unsigned int time = 0;
if( m_CurrentVideo.stream && m_dvd.iDVDStillTime > 0 )
{
- time = (DWORD)(m_omxPlayerVideo.GetOutputDelay() / ( DVD_TIME_BASE / 1000 ));
+ time = (unsigned int)(m_omxPlayerVideo.GetOutputDelay() / ( DVD_TIME_BASE / 1000 ));
if( time < 10000 && time > 0 )
m_dvd.iDVDStillTime += time;
}
break;
case DVDNAV_SPU_CLUT_CHANGE:
{
- m_dvdPlayerSubtitle.SendMessage(new CDVDMsgSubtitleClutChange((BYTE*)pData));
+ m_dvdPlayerSubtitle.SendMessage(new CDVDMsgSubtitleClutChange((uint8_t*)pData));
}
break;
case DVDNAV_SPU_STREAM_CHANGE:
THREAD_ACTION(action);
CLog::Log(LOGDEBUG, " - go to menu");
pMenus->OnMenu();
+ if (m_playSpeed == DVD_PLAYSPEED_PAUSE)
+ {
+ SetPlaySpeed(DVD_PLAYSPEED_NORMAL);
+ m_callback.OnPlayBackResumed();
+ }
// send a message to everyone that we've gone to the menu
CGUIMessage msg(GUI_MSG_VIDEO_MENU_STARTED, 0, 0);
g_windowManager.SendThreadMessage(msg);
bool COMXPlayer::GetCurrentSubtitle(CStdString& strSubtitle)
{
- double pts = m_clock.GetClock();
+ double pts = m_clock.GetClock() + m_State.time_offset;
- if (m_pInputStream && m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD))
+ if (m_pInputStream && m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD) && m_CurrentSubtitle.source != STREAM_SOURCE_TEXT && m_CurrentSubtitle.source != STREAM_SOURCE_DEMUX_SUB)
return false;
m_dvdPlayerSubtitle.GetCurrentSubtitle(strSubtitle, pts - m_omxPlayerVideo.GetSubtitleDelay());
double COMXPlayer::GetQueueTime()
{
- int a = m_omxPlayerVideo.GetLevel();
- int v = m_omxPlayerAudio.GetLevel();
+ int a = m_omxPlayerAudio.GetLevel();
+ int v = m_omxPlayerVideo.GetLevel();
return max(a, v) * 8000.0 / 100;
}
info.videoCodecName = retVal;
info.videoAspectRatio = g_renderManager.GetAspectRatio();
g_renderManager.GetVideoRect(info.SrcRect, info.DestRect);
- if (m_CurrentVideo.hint.stereo_mode == "mono")
+ info.stereoMode = m_omxPlayerVideo.GetStereoMode();
+ if (info.stereoMode == "mono")
info.stereoMode = "";
- else
- info.stereoMode = m_CurrentVideo.hint.stereo_mode;
}
int COMXPlayer::GetSourceBitrate()
int index = m_SelectionStreams.IndexOf(STREAM_SUBTITLE, m_SelectionStreams.Source(STREAM_SOURCE_DEMUX_SUB, filename), 0);
m_SelectionStreams.Get(STREAM_SUBTITLE, index).flags = flags;
m_SelectionStreams.Get(STREAM_SUBTITLE, index).filename2 = vobsubfile;
+ ExternalStreamInfo info;
+ CUtil::GetExternalStreamDetailsFromFilename(m_filename, vobsubfile, info);
+ m_SelectionStreams.Get(STREAM_SUBTITLE, index).name = info.name;
+ if (m_SelectionStreams.Get(STREAM_SUBTITLE, index).language.empty())
+ m_SelectionStreams.Get(STREAM_SUBTITLE, index).language = info.language;
+
+ if (static_cast<CDemuxStream::EFlags>(info.flag) == CDemuxStream::FLAG_NONE)
+ m_SelectionStreams.Get(STREAM_SUBTITLE, index).flags = flags;
+ else
+ m_SelectionStreams.Get(STREAM_SUBTITLE, index).flags = static_cast<CDemuxStream::EFlags>(info.flag);
+
return index;
}
if(ext == ".sub")
s.type = STREAM_SUBTITLE;
s.id = 0;
s.filename = filename;
- s.name = URIUtils::GetFileName(filename);
- s.flags = flags;
+ ExternalStreamInfo info;
+ CUtil::GetExternalStreamDetailsFromFilename(m_filename, filename, info);
+ s.name = info.name;
+ s.language = info.language;
+ if (static_cast<CDemuxStream::EFlags>(info.flag) == CDemuxStream::FLAG_NONE)
+ s .flags = flags;
+ else
+ s.flags = static_cast<CDemuxStream::EFlags>(info.flag);
+
m_SelectionStreams.Update(s);
return m_SelectionStreams.IndexOf(STREAM_SUBTITLE, s.source, s.id);
}
{
if (m_pDemuxer)
{
- bool result = CDVDFileInfo::DemuxerToStreamDetails(m_pInputStream, m_pDemuxer, details);
+ std::vector<OMXSelectionStream> subs = m_SelectionStreams.Get(STREAM_SUBTITLE);
+ std::vector<CStreamDetailSubtitle> extSubDetails;
+ for (unsigned int i = 0; i < subs.size(); i++)
+ {
+ if (subs[i].filename == m_filename)
+ continue;
+
+ CStreamDetailSubtitle p;
+ p.m_strLanguage = subs[i].language;
+ extSubDetails.push_back(p);
+ }
+
+ bool result = CDVDFileInfo::DemuxerToStreamDetails(m_pInputStream, m_pDemuxer, extSubDetails, details);
if (result && details.GetStreamCount(CStreamDetail::VIDEO) > 0) // this is more correct (dvds in particular)
{
/*
}
}
+std::string OMXPlayerVideo::GetStereoMode()
+{
+ std::string stereo_mode;
+
+ switch(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoMode)
+ {
+ case RENDER_STEREO_MODE_SPLIT_VERTICAL: stereo_mode = "left_right"; break;
+ case RENDER_STEREO_MODE_SPLIT_HORIZONTAL: stereo_mode = "top_bottom"; break;
+ default: stereo_mode = m_hints.stereo_mode; break;
+ }
+
+ if(CMediaSettings::Get().GetCurrentVideoSettings().m_StereoInvert)
+ stereo_mode = GetStereoModeInvert(stereo_mode);
+ return stereo_mode;
+}
+
void OMXPlayerVideo::Output(double pts, bool bDropPacket)
{
if (!g_renderManager.IsStarted()) {
void SetSpeed(int iSpeed);
std::string GetPlayerInfo();
int GetVideoBitrate();
+ std::string GetStereoMode();
double GetOutputDelay();
double GetSubtitleDelay() { return m_iSubtitleDelay; }
void SetSubtitleDelay(double delay) { m_iSubtitleDelay = delay; }
m_outStride = m_inSampleSize * m_outChannels;
/* see if we need to normalize the levels */
- bool dontnormalize = CSettings::Get().GetBool("audiooutput.normalizelevels");
+ bool dontnormalize = !CSettings::Get().GetBool("audiooutput.normalizelevels");
CLog::Log(LOGDEBUG, "CPCMRemap: Downmix normalization is %s", (dontnormalize ? "disabled" : "enabled"));
ResolveChannels();
{
CURL url(item.GetPath());
- CLog::Log(LOGDEBUG, "CPlayerCoreFactory::GetPlayers(%s)", item.GetPath().c_str());
+ CLog::Log(LOGDEBUG, "CPlayerCoreFactory::GetPlayers(%s)", CURL::GetRedacted(item.GetPath()).c_str());
// Process rules
for(unsigned int i = 0; i < m_vecCoreSelectionRules.size(); i++)
--- /dev/null
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "DatabaseQuery.h"
+#include "Database.h"
+#include "XBDateTime.h"
+#include "guilib/LocalizeStrings.h"
+#include "utils/CharsetConverter.h"
+#include "utils/StringUtils.h"
+#include "utils/Variant.h"
+#include "utils/XBMCTinyXML.h"
+
+using namespace std;
+
+typedef struct
+{
+ char string[15];
+ CDatabaseQueryRule::SEARCH_OPERATOR op;
+ int localizedString;
+} operatorField;
+
+static const operatorField operators[] = {
+ { "contains", CDatabaseQueryRule::OPERATOR_CONTAINS, 21400 },
+ { "doesnotcontain", CDatabaseQueryRule::OPERATOR_DOES_NOT_CONTAIN, 21401 },
+ { "is", CDatabaseQueryRule::OPERATOR_EQUALS, 21402 },
+ { "isnot", CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL, 21403 },
+ { "startswith", CDatabaseQueryRule::OPERATOR_STARTS_WITH, 21404 },
+ { "endswith", CDatabaseQueryRule::OPERATOR_ENDS_WITH, 21405 },
+ { "greaterthan", CDatabaseQueryRule::OPERATOR_GREATER_THAN, 21406 },
+ { "lessthan", CDatabaseQueryRule::OPERATOR_LESS_THAN, 21407 },
+ { "after", CDatabaseQueryRule::OPERATOR_AFTER, 21408 },
+ { "before", CDatabaseQueryRule::OPERATOR_BEFORE, 21409 },
+ { "inthelast", CDatabaseQueryRule::OPERATOR_IN_THE_LAST, 21410 },
+ { "notinthelast", CDatabaseQueryRule::OPERATOR_NOT_IN_THE_LAST, 21411 },
+ { "true", CDatabaseQueryRule::OPERATOR_TRUE, 20122 },
+ { "false", CDatabaseQueryRule::OPERATOR_FALSE, 20424 },
+ { "between", CDatabaseQueryRule::OPERATOR_BETWEEN, 21456 }
+};
+
+static const size_t NUM_OPERATORS = sizeof(operators) / sizeof(operatorField);
+
+#define RULE_VALUE_SEPARATOR " / "
+
+CDatabaseQueryRule::CDatabaseQueryRule()
+{
+ m_field = 0;
+ m_operator = OPERATOR_CONTAINS;
+}
+
+bool CDatabaseQueryRule::Load(const TiXmlNode *node, const std::string &encoding /* = "UTF-8" */)
+{
+ if (node == NULL)
+ return false;
+
+ const TiXmlElement *element = node->ToElement();
+ if (element == NULL)
+ return false;
+
+ // format is:
+ // <rule field="Genre" operator="contains">parameter</rule>
+ // where parameter can either be a string or a list of
+ // <value> tags containing a string
+ const char *field = element->Attribute("field");
+ const char *oper = element->Attribute("operator");
+ if (field == NULL || oper == NULL)
+ return false;
+
+ m_field = TranslateField(field);
+ m_operator = TranslateOperator(oper);
+
+ if (m_operator == OPERATOR_TRUE || m_operator == OPERATOR_FALSE)
+ return true;
+
+ const TiXmlNode *parameter = element->FirstChild();
+ if (parameter == NULL)
+ return false;
+
+ if (parameter->Type() == TiXmlNode::TINYXML_TEXT)
+ {
+ CStdString utf8Parameter;
+ if (encoding.empty()) // utf8
+ utf8Parameter = parameter->ValueStr();
+ else
+ g_charsetConverter.ToUtf8(encoding, parameter->ValueStr(), utf8Parameter);
+
+ if (!utf8Parameter.empty())
+ m_parameter.push_back(utf8Parameter);
+ }
+ else if (parameter->Type() == TiXmlNode::TINYXML_ELEMENT)
+ {
+ const TiXmlNode *valueNode = element->FirstChild("value");
+ while (valueNode != NULL)
+ {
+ const TiXmlNode *value = valueNode->FirstChild();
+ if (value != NULL && value->Type() == TiXmlNode::TINYXML_TEXT)
+ {
+ CStdString utf8Parameter;
+ if (encoding.empty()) // utf8
+ utf8Parameter = value->ValueStr();
+ else
+ g_charsetConverter.ToUtf8(encoding, value->ValueStr(), utf8Parameter);
+
+ if (!utf8Parameter.empty())
+ m_parameter.push_back(utf8Parameter);
+ }
+
+ valueNode = valueNode->NextSibling("value");
+ }
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool CDatabaseQueryRule::Load(const CVariant &obj)
+{
+ if (!obj.isObject() ||
+ !obj.isMember("field") || !obj["field"].isString() ||
+ !obj.isMember("operator") || !obj["operator"].isString())
+ return false;
+
+ m_field = TranslateField(obj["field"].asString().c_str());
+ m_operator = TranslateOperator(obj["operator"].asString().c_str());
+
+ if (m_operator == OPERATOR_TRUE || m_operator == OPERATOR_FALSE)
+ return true;
+
+ if (!obj.isMember("value") || (!obj["value"].isString() && !obj["value"].isArray()))
+ return false;
+
+ const CVariant &value = obj["value"];
+ if (value.isString() && !value.asString().empty())
+ m_parameter.push_back(value.asString());
+ else if (value.isArray())
+ {
+ for (CVariant::const_iterator_array val = value.begin_array(); val != value.end_array(); val++)
+ {
+ if (val->isString() && !val->asString().empty())
+ m_parameter.push_back(val->asString());
+ }
+ }
+ else
+ return false;
+
+ return true;
+}
+
+bool CDatabaseQueryRule::Save(TiXmlNode *parent) const
+{
+ if (parent == NULL || (m_parameter.empty() && m_operator != OPERATOR_TRUE && m_operator != OPERATOR_FALSE))
+ return false;
+
+ TiXmlElement rule("rule");
+ rule.SetAttribute("field", TranslateField(m_field).c_str());
+ rule.SetAttribute("operator", TranslateOperator(m_operator).c_str());
+
+ for (vector<CStdString>::const_iterator it = m_parameter.begin(); it != m_parameter.end(); it++)
+ {
+ TiXmlElement value("value");
+ TiXmlText text(it->c_str());
+ value.InsertEndChild(text);
+ rule.InsertEndChild(value);
+ }
+
+ parent->InsertEndChild(rule);
+
+ return true;
+}
+
+bool CDatabaseQueryRule::Save(CVariant &obj) const
+{
+ if (obj.isNull() || (m_parameter.empty() && m_operator != OPERATOR_TRUE && m_operator != OPERATOR_FALSE))
+ return false;
+
+ obj["field"] = TranslateField(m_field);
+ obj["operator"] = TranslateOperator(m_operator);
+
+ obj["value"] = CVariant(CVariant::VariantTypeArray);
+ for (vector<CStdString>::const_iterator it = m_parameter.begin(); it != m_parameter.end(); it++)
+ obj["value"].push_back(*it);
+
+ return true;
+}
+
+CDatabaseQueryRule::SEARCH_OPERATOR CDatabaseQueryRule::TranslateOperator(const char *oper)
+{
+ for (unsigned int i = 0; i < NUM_OPERATORS; i++)
+ if (StringUtils::EqualsNoCase(oper, operators[i].string)) return operators[i].op;
+ return OPERATOR_CONTAINS;
+}
+
+CStdString CDatabaseQueryRule::TranslateOperator(SEARCH_OPERATOR oper)
+{
+ for (unsigned int i = 0; i < NUM_OPERATORS; i++)
+ if (oper == operators[i].op) return operators[i].string;
+ return "contains";
+}
+
+CStdString CDatabaseQueryRule::GetLocalizedOperator(SEARCH_OPERATOR oper)
+{
+ for (unsigned int i = 0; i < NUM_OPERATORS; i++)
+ if (oper == operators[i].op) return g_localizeStrings.Get(operators[i].localizedString);
+ return g_localizeStrings.Get(16018);
+}
+
+void CDatabaseQueryRule::GetAvailableOperators(std::vector<std::string> &operatorList)
+{
+ for (unsigned int index = 0; index < NUM_OPERATORS; index++)
+ operatorList.push_back(operators[index].string);
+}
+
+CStdString CDatabaseQueryRule::GetParameter() const
+{
+ return StringUtils::JoinString(m_parameter, RULE_VALUE_SEPARATOR);
+}
+
+void CDatabaseQueryRule::SetParameter(const CStdString &value)
+{
+ m_parameter.clear();
+ StringUtils::SplitString(value, RULE_VALUE_SEPARATOR, m_parameter);
+}
+
+void CDatabaseQueryRule::SetParameter(const std::vector<CStdString> &values)
+{
+ m_parameter.assign(values.begin(), values.end());
+}
+
+CStdString CDatabaseQueryRule::FormatParameter(const CStdString &operatorString, const CStdString ¶m, const CDatabase &db, const CStdString &strType) const
+{
+ CStdString parameter;
+ if (GetFieldType(m_field) == TEXTIN_FIELD)
+ {
+ CStdStringArray split;
+ StringUtils::SplitString(param, ",", split);
+ for (CStdStringArray::iterator itIn = split.begin(); itIn != split.end(); ++itIn)
+ {
+ if (!parameter.IsEmpty())
+ parameter += ",";
+ parameter += db.PrepareSQL("'%s'", (*itIn).Trim().c_str());
+ }
+ parameter = " IN (" + parameter + ")";
+ }
+ else
+ parameter = db.PrepareSQL(operatorString.c_str(), param.c_str());
+
+ if (GetFieldType(m_field) == DATE_FIELD)
+ {
+ if (m_operator == OPERATOR_IN_THE_LAST || m_operator == OPERATOR_NOT_IN_THE_LAST)
+ { // translate time period
+ CDateTime date=CDateTime::GetCurrentDateTime();
+ CDateTimeSpan span;
+ span.SetFromPeriod(param);
+ date-=span;
+ parameter = db.PrepareSQL(operatorString.c_str(), date.GetAsDBDate().c_str());
+ }
+ }
+ return parameter;
+}
+
+CStdString CDatabaseQueryRule::GetOperatorString(SEARCH_OPERATOR op) const
+{
+ CStdString operatorString;
+ if (GetFieldType(m_field) != TEXTIN_FIELD)
+ {
+ // the comparison piece
+ switch (op)
+ {
+ case OPERATOR_CONTAINS:
+ operatorString = " LIKE '%%%s%%'"; break;
+ case OPERATOR_DOES_NOT_CONTAIN:
+ operatorString = " LIKE '%%%s%%'"; break;
+ case OPERATOR_EQUALS:
+ if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
+ operatorString = " = %s";
+ else
+ operatorString = " LIKE '%s'";
+ break;
+ case OPERATOR_DOES_NOT_EQUAL:
+ if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
+ operatorString = " != %s";
+ else
+ operatorString = " LIKE '%s'";
+ break;
+ case OPERATOR_STARTS_WITH:
+ operatorString = " LIKE '%s%%'"; break;
+ case OPERATOR_ENDS_WITH:
+ operatorString = " LIKE '%%%s'"; break;
+ case OPERATOR_AFTER:
+ case OPERATOR_GREATER_THAN:
+ case OPERATOR_IN_THE_LAST:
+ operatorString = " > ";
+ if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
+ operatorString += "%s";
+ else
+ operatorString += "'%s'";
+ break;
+ case OPERATOR_BEFORE:
+ case OPERATOR_LESS_THAN:
+ case OPERATOR_NOT_IN_THE_LAST:
+ operatorString = " < ";
+ if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
+ operatorString += "%s";
+ else
+ operatorString += "'%s'";
+ break;
+ case OPERATOR_TRUE:
+ operatorString = " = 1"; break;
+ case OPERATOR_FALSE:
+ operatorString = " = 0"; break;
+ default:
+ break;
+ }
+ }
+ return operatorString;
+}
+
+CStdString CDatabaseQueryRule::GetWhereClause(const CDatabase &db, const CStdString& strType) const
+{
+ SEARCH_OPERATOR op = GetOperator(strType);
+
+ CStdString operatorString = GetOperatorString(op);
+ CStdString negate;
+ if (op == OPERATOR_DOES_NOT_CONTAIN || op == OPERATOR_FALSE ||
+ (op == OPERATOR_DOES_NOT_EQUAL && GetFieldType(m_field) != NUMERIC_FIELD && GetFieldType(m_field) != SECONDS_FIELD))
+ negate = " NOT";
+
+ // boolean operators don't have any values in m_parameter, they work on the operator
+ if (m_operator == OPERATOR_FALSE || m_operator == OPERATOR_TRUE)
+ return GetBooleanQuery(negate, strType);
+
+ // The BETWEEN operator is handled special
+ if (op == OPERATOR_BETWEEN)
+ {
+ if (m_parameter.size() != 2)
+ return "";
+
+ FIELD_TYPE fieldType = GetFieldType(m_field);
+ if (fieldType == NUMERIC_FIELD)
+ return db.PrepareSQL("CAST(%s as DECIMAL(5,1)) BETWEEN %s AND %s", GetField(m_field, strType).c_str(), m_parameter[0].c_str(), m_parameter[1].c_str());
+ else if (fieldType == SECONDS_FIELD)
+ return db.PrepareSQL("CAST(%s as INTEGER) BETWEEN %s AND %s", GetField(m_field, strType).c_str(), m_parameter[0].c_str(), m_parameter[1].c_str());
+ else
+ return db.PrepareSQL("%s BETWEEN '%s' AND '%s'", GetField(m_field, strType).c_str(), m_parameter[0].c_str(), m_parameter[1].c_str());
+ }
+
+ // now the query parameter
+ CStdString wholeQuery;
+ for (vector<CStdString>::const_iterator it = m_parameter.begin(); it != m_parameter.end(); ++it)
+ {
+ CStdString query = "(" + FormatWhereClause(negate, operatorString, *it, db, strType) + ")";
+
+ if (it+1 != m_parameter.end())
+ query += " OR ";
+
+ wholeQuery += query;
+ }
+
+ return wholeQuery;
+}
+
+CStdString CDatabaseQueryRule::FormatWhereClause(const CStdString &negate, const CStdString &oper, const CStdString ¶m,
+ const CDatabase &db, const CStdString &strType) const
+{
+ CStdString parameter = FormatParameter(oper, param, db, strType);
+
+ CStdString query;
+ if (m_field != 0)
+ {
+ string fmt = "%s";
+ if (GetFieldType(m_field) == NUMERIC_FIELD)
+ fmt = "CAST(%s as DECIMAL(5,1))";
+ else if (GetFieldType(m_field) == SECONDS_FIELD)
+ fmt = "CAST(%s as INTEGER)";
+
+ query.Format(fmt.c_str(), GetField(m_field,strType).c_str());
+ query += negate + parameter;
+ }
+
+ if (query.Equals(negate + parameter))
+ query = "1";
+ return query;
+}
+
+CDatabaseQueryRuleCombination::CDatabaseQueryRuleCombination()
+ : m_type(CombinationAnd)
+{ }
+
+void CDatabaseQueryRuleCombination::clear()
+{
+ m_combinations.clear();
+ m_rules.clear();
+ m_type = CombinationAnd;
+}
+
+CStdString CDatabaseQueryRuleCombination::GetWhereClause(const CDatabase &db, const CStdString& strType) const
+{
+ CStdString rule, currentRule;
+
+ // translate the combinations into SQL
+ for (CDatabaseQueryRuleCombinations::const_iterator it = m_combinations.begin(); it != m_combinations.end(); ++it)
+ {
+ if (it != m_combinations.begin())
+ rule += m_type == CombinationAnd ? " AND " : " OR ";
+ rule += "(" + (*it)->GetWhereClause(db, strType) + ")";
+ }
+
+ // translate the rules into SQL
+ for (CDatabaseQueryRules::const_iterator it = m_rules.begin(); it != m_rules.end(); ++it)
+ {
+ if (!rule.empty())
+ rule += m_type == CombinationAnd ? " AND " : " OR ";
+ rule += "(";
+ CStdString currentRule = (*it)->GetWhereClause(db, strType);
+ // if we don't get a rule, we add '1' or '0' so the query is still valid and doesn't fail
+ if (currentRule.IsEmpty())
+ currentRule = m_type == CombinationAnd ? "'1'" : "'0'";
+ rule += currentRule;
+ rule += ")";
+ }
+
+ return rule;
+}
+
+bool CDatabaseQueryRuleCombination::Load(const CVariant &obj, const IDatabaseQueryRuleFactory *factory)
+{
+ if (!obj.isObject() && !obj.isArray())
+ return false;
+
+ CVariant child;
+ if (obj.isObject())
+ {
+ if (obj.isMember("and") && obj["and"].isArray())
+ {
+ m_type = CombinationAnd;
+ child = obj["and"];
+ }
+ else if (obj.isMember("or") && obj["or"].isArray())
+ {
+ m_type = CombinationOr;
+ child = obj["or"];
+ }
+ else
+ return false;
+ }
+ else
+ child = obj;
+
+ for (CVariant::const_iterator_array it = child.begin_array(); it != child.end_array(); it++)
+ {
+ if (!it->isObject())
+ continue;
+
+ if (it->isMember("and") || it->isMember("or"))
+ {
+ boost::shared_ptr<CDatabaseQueryRuleCombination> combo(factory->CreateCombination());
+ if (combo && combo->Load(*it, factory))
+ m_combinations.push_back(combo);
+ }
+ else
+ {
+ boost::shared_ptr<CDatabaseQueryRule> rule(factory->CreateRule());
+ if (rule && rule->Load(*it))
+ m_rules.push_back(rule);
+ }
+ }
+
+ return true;
+}
+
+bool CDatabaseQueryRuleCombination::Save(TiXmlNode *parent) const
+{
+ for (CDatabaseQueryRules::const_iterator it = m_rules.begin(); it != m_rules.end(); ++it)
+ (*it)->Save(parent);
+ return true;
+}
+
+bool CDatabaseQueryRuleCombination::Save(CVariant &obj) const
+{
+ if (!obj.isObject() || (m_combinations.empty() && m_rules.empty()))
+ return false;
+
+ CVariant comboArray(CVariant::VariantTypeArray);
+ if (!m_combinations.empty())
+ {
+ for (CDatabaseQueryRuleCombinations::const_iterator combo = m_combinations.begin(); combo != m_combinations.end(); combo++)
+ {
+ CVariant comboObj(CVariant::VariantTypeObject);
+ if ((*combo)->Save(comboObj))
+ comboArray.push_back(comboObj);
+ }
+
+ }
+ if (!m_rules.empty())
+ {
+ for (CDatabaseQueryRules::const_iterator rule = m_rules.begin(); rule != m_rules.end(); rule++)
+ {
+ CVariant ruleObj(CVariant::VariantTypeObject);
+ if ((*rule)->Save(ruleObj))
+ comboArray.push_back(ruleObj);
+ }
+ }
+
+ obj[TranslateCombinationType()] = comboArray;
+
+ return true;
+}
+
+std::string CDatabaseQueryRuleCombination::TranslateCombinationType() const
+{
+ return m_type == CombinationAnd ? "and" : "or";
+}
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <set>
+#include <vector>
+#include <boost/shared_ptr.hpp>
+
+#include "utils/StdString.h"
+
+class CDatabase;
+class CVariant;
+class TiXmlNode;
+
+class CDatabaseQueryRule
+{
+public:
+ CDatabaseQueryRule();
+ virtual ~CDatabaseQueryRule() { };
+
+ enum SEARCH_OPERATOR { OPERATOR_START = 0,
+ OPERATOR_CONTAINS,
+ OPERATOR_DOES_NOT_CONTAIN,
+ OPERATOR_EQUALS,
+ OPERATOR_DOES_NOT_EQUAL,
+ OPERATOR_STARTS_WITH,
+ OPERATOR_ENDS_WITH,
+ OPERATOR_GREATER_THAN,
+ OPERATOR_LESS_THAN,
+ OPERATOR_AFTER,
+ OPERATOR_BEFORE,
+ OPERATOR_IN_THE_LAST,
+ OPERATOR_NOT_IN_THE_LAST,
+ OPERATOR_TRUE,
+ OPERATOR_FALSE,
+ OPERATOR_BETWEEN,
+ OPERATOR_END
+ };
+
+ enum FIELD_TYPE { TEXT_FIELD = 0,
+ NUMERIC_FIELD,
+ DATE_FIELD,
+ PLAYLIST_FIELD,
+ SECONDS_FIELD,
+ BOOLEAN_FIELD,
+ TEXTIN_FIELD
+ };
+
+ virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8");
+ virtual bool Load(const CVariant &obj);
+ virtual bool Save(TiXmlNode *parent) const;
+ virtual bool Save(CVariant &obj) const;
+
+ static CStdString GetLocalizedOperator(SEARCH_OPERATOR oper);
+ static void GetAvailableOperators(std::vector<std::string> &operatorList);
+
+ CStdString GetParameter() const;
+ void SetParameter(const CStdString &value);
+ void SetParameter(const std::vector<CStdString> &values);
+
+ virtual CStdString GetWhereClause(const CDatabase &db, const CStdString& strType) const;
+
+ int m_field;
+ SEARCH_OPERATOR m_operator;
+ std::vector<CStdString> m_parameter;
+
+protected:
+ virtual CStdString GetField(int field, const CStdString& type) const=0;
+ virtual FIELD_TYPE GetFieldType(int field) const=0;
+ virtual int TranslateField(const char *field) const=0;
+ virtual CStdString TranslateField(int field) const=0;
+ virtual CStdString FormatParameter(const CStdString &negate, const CStdString &oper, const CDatabase &db, const CStdString &type) const;
+ virtual CStdString FormatWhereClause(const CStdString &negate, const CStdString &oper, const CStdString ¶m,
+ const CDatabase &db, const CStdString &type) const;
+ virtual SEARCH_OPERATOR GetOperator(const CStdString &type) const { return m_operator; };
+ virtual CStdString GetOperatorString(SEARCH_OPERATOR op) const;
+ virtual CStdString GetBooleanQuery(const CStdString &negate, const CStdString &strType) const { return ""; }
+
+ static SEARCH_OPERATOR TranslateOperator(const char *oper);
+ static CStdString TranslateOperator(SEARCH_OPERATOR oper);
+};
+
+class CDatabaseQueryRuleCombination;
+
+typedef std::vector< boost::shared_ptr<CDatabaseQueryRule> > CDatabaseQueryRules;
+typedef std::vector< boost::shared_ptr<CDatabaseQueryRuleCombination> > CDatabaseQueryRuleCombinations;
+
+class IDatabaseQueryRuleFactory
+{
+public:
+ virtual CDatabaseQueryRule *CreateRule() const=0;
+ virtual CDatabaseQueryRuleCombination *CreateCombination() const=0;
+};
+
+class CDatabaseQueryRuleCombination
+{
+public:
+ CDatabaseQueryRuleCombination();
+ virtual ~CDatabaseQueryRuleCombination() { };
+
+ typedef enum {
+ CombinationOr = 0,
+ CombinationAnd
+ } Combination;
+
+ void clear();
+ virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") { return false; }
+ virtual bool Load(const CVariant &obj, const IDatabaseQueryRuleFactory *factory);
+ virtual bool Save(TiXmlNode *parent) const;
+ virtual bool Save(CVariant &obj) const;
+
+ CStdString GetWhereClause(const CDatabase &db, const CStdString& strType) const;
+ std::string TranslateCombinationType() const;
+
+ Combination GetType() const { return m_type; }
+ void SetType(Combination combination) { m_type = combination; }
+
+ bool empty() const { return m_combinations.empty() && m_rules.empty(); }
+
+protected:
+ friend class CGUIDialogSmartPlaylistEditor;
+ friend class CGUIDialogMediaFilter;
+
+ Combination m_type;
+ CDatabaseQueryRuleCombinations m_combinations;
+ CDatabaseQueryRules m_rules;
+};
SRCS=Database.cpp \
+ DatabaseQuery.cpp \
dataset.cpp \
mysqldataset.cpp \
qry_dat.cpp \
if (!m_rootDir.GetDirectory(strDirectory, items,m_useFileDirectories))
{
- CLog::Log(LOGERROR,"CGUIDialogFileBrowser::GetDirectory(%s) failed", strDirectory.c_str());
+ CLog::Log(LOGERROR,"CGUIDialogFileBrowser::GetDirectory(%s) failed", CURL::GetRedacted(strDirectory).c_str());
// We assume, we can get the parent
// directory again
using namespace std;
static const CGUIDialogMediaFilter::Filter filterList[] = {
- { "movies", FieldTitle, 556, SettingInfo::EDIT, CSmartPlaylistRule::OPERATOR_CONTAINS },
- { "movies", FieldRating, 563, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- //{ "movies", FieldTime, 180, SettingInfo::TODO, CSmartPlaylistRule::TODO },
- { "movies", FieldInProgress, 575, SettingInfo::CHECK, CSmartPlaylistRule::OPERATOR_FALSE },
- { "movies", FieldYear, 562, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "movies", FieldTag, 20459, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "movies", FieldGenre, 515, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "movies", FieldActor, 20337, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "movies", FieldDirector, 20339, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "movies", FieldStudio, 572, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- //{ "movies", FieldLastPlayed, 568, SettingInfo::TODO, CSmartPlaylistRule::TODO },
- //{ "movies", FieldDateAdded, 570, SettingInfo::TODO, CSmartPlaylistRule::TODO },
-
- { "tvshows", FieldTitle, 556, SettingInfo::EDIT, CSmartPlaylistRule::OPERATOR_CONTAINS },
- //{ "tvshows", FieldTvShowStatus, 126, SettingInfo::TODO, CSmartPlaylistRule::TODO },
- { "tvshows", FieldRating, 563, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "tvshows", FieldInProgress, 575, SettingInfo::CHECK, CSmartPlaylistRule::OPERATOR_FALSE },
- { "tvshows", FieldYear, 562, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "tvshows", FieldTag, 20459, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "tvshows", FieldGenre, 515, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "tvshows", FieldActor, 20337, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "tvshows", FieldDirector, 20339, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "tvshows", FieldStudio, 572, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- //{ "tvshows", FieldDateAdded, 570, SettingInfo::TODO, CSmartPlaylistRule::TODO },
-
- { "episodes", FieldTitle, 556, SettingInfo::EDIT, CSmartPlaylistRule::OPERATOR_CONTAINS },
- { "episodes", FieldRating, 563, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "episodes", FieldAirDate, 20416, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "episodes", FieldInProgress, 575, SettingInfo::CHECK, CSmartPlaylistRule::OPERATOR_FALSE },
- { "episodes", FieldActor, 20337, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "episodes", FieldDirector, 20339, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- //{ "episodes", FieldLastPlayed, 568, SettingInfo::TODO, CSmartPlaylistRule::TODO },
- //{ "episodes", FieldDateAdded, 570, SettingInfo::TODO, CSmartPlaylistRule::TODO },
-
- { "musicvideos", FieldTitle, 556, SettingInfo::EDIT, CSmartPlaylistRule::OPERATOR_CONTAINS },
- { "musicvideos", FieldArtist, 557, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "musicvideos", FieldAlbum, 558, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- //{ "musicvideos", FieldTime, 180, SettingInfo::TODO, CSmartPlaylistRule::TODO },
- { "musicvideos", FieldYear, 562, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "musicvideos", FieldTag, 20459, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "musicvideos", FieldGenre, 515, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "musicvideos", FieldDirector, 20339, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "musicvideos", FieldStudio, 572, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- //{ "musicvideos", FieldLastPlayed, 568, SettingInfo::TODO, CSmartPlaylistRule::TODO },
- //{ "musicvideos", FieldDateAdded, 570, SettingInfo::TODO, CSmartPlaylistRule::TODO },
-
- { "artists", FieldArtist, 557, SettingInfo::EDIT, CSmartPlaylistRule::OPERATOR_CONTAINS },
- { "artists", FieldGenre, 515, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
-
- { "albums", FieldAlbum, 556, SettingInfo::EDIT, CSmartPlaylistRule::OPERATOR_CONTAINS },
- { "albums", FieldArtist, 557, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "albums", FieldRating, 563, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "albums", FieldAlbumType, 564, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "albums", FieldYear, 562, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "albums", FieldGenre, 515, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "albums", FieldMusicLabel, 21899, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
-
- { "songs", FieldTitle, 556, SettingInfo::EDIT, CSmartPlaylistRule::OPERATOR_CONTAINS },
- { "songs", FieldAlbum, 558, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "songs", FieldArtist, 557, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "songs", FieldTime, 180, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "songs", FieldRating, 563, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "songs", FieldYear, 562, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- { "songs", FieldGenre, 515, SettingInfo::BUTTON, CSmartPlaylistRule::OPERATOR_EQUALS },
- { "songs", FieldPlaycount, 567, SettingInfo::RANGE, CSmartPlaylistRule::OPERATOR_BETWEEN },
- //{ "songs", FieldLastPlayed, 568, SettingInfo::TODO, CSmartPlaylistRule::TODO },
- //{ "songs", FieldDateAdded, 570, SettingInfo::TODO, CSmartPlaylistRule::TODO },
+ { "movies", FieldTitle, 556, SettingInfo::EDIT, CDatabaseQueryRule::OPERATOR_CONTAINS },
+ { "movies", FieldRating, 563, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ //{ "movies", FieldTime, 180, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+ { "movies", FieldInProgress, 575, SettingInfo::CHECK, CDatabaseQueryRule::OPERATOR_FALSE },
+ { "movies", FieldYear, 562, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "movies", FieldTag, 20459, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "movies", FieldGenre, 515, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "movies", FieldActor, 20337, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "movies", FieldDirector, 20339, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "movies", FieldStudio, 572, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ //{ "movies", FieldLastPlayed, 568, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+ //{ "movies", FieldDateAdded, 570, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+
+ { "tvshows", FieldTitle, 556, SettingInfo::EDIT, CDatabaseQueryRule::OPERATOR_CONTAINS },
+ //{ "tvshows", FieldTvShowStatus, 126, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+ { "tvshows", FieldRating, 563, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "tvshows", FieldInProgress, 575, SettingInfo::CHECK, CDatabaseQueryRule::OPERATOR_FALSE },
+ { "tvshows", FieldYear, 562, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "tvshows", FieldTag, 20459, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "tvshows", FieldGenre, 515, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "tvshows", FieldActor, 20337, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "tvshows", FieldDirector, 20339, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "tvshows", FieldStudio, 572, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ //{ "tvshows", FieldDateAdded, 570, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+
+ { "episodes", FieldTitle, 556, SettingInfo::EDIT, CDatabaseQueryRule::OPERATOR_CONTAINS },
+ { "episodes", FieldRating, 563, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "episodes", FieldAirDate, 20416, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "episodes", FieldInProgress, 575, SettingInfo::CHECK, CDatabaseQueryRule::OPERATOR_FALSE },
+ { "episodes", FieldActor, 20337, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "episodes", FieldDirector, 20339, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ //{ "episodes", FieldLastPlayed, 568, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+ //{ "episodes", FieldDateAdded, 570, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+
+ { "musicvideos", FieldTitle, 556, SettingInfo::EDIT, CDatabaseQueryRule::OPERATOR_CONTAINS },
+ { "musicvideos", FieldArtist, 557, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "musicvideos", FieldAlbum, 558, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ //{ "musicvideos", FieldTime, 180, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+ { "musicvideos", FieldYear, 562, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "musicvideos", FieldTag, 20459, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "musicvideos", FieldGenre, 515, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "musicvideos", FieldDirector, 20339, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "musicvideos", FieldStudio, 572, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ //{ "musicvideos", FieldLastPlayed, 568, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+ //{ "musicvideos", FieldDateAdded, 570, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+
+ { "artists", FieldArtist, 557, SettingInfo::EDIT, CDatabaseQueryRule::OPERATOR_CONTAINS },
+ { "artists", FieldGenre, 515, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+
+ { "albums", FieldAlbum, 556, SettingInfo::EDIT, CDatabaseQueryRule::OPERATOR_CONTAINS },
+ { "albums", FieldArtist, 557, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "albums", FieldRating, 563, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "albums", FieldAlbumType, 564, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "albums", FieldYear, 562, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "albums", FieldGenre, 515, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "albums", FieldMusicLabel, 21899, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+
+ { "songs", FieldTitle, 556, SettingInfo::EDIT, CDatabaseQueryRule::OPERATOR_CONTAINS },
+ { "songs", FieldAlbum, 558, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "songs", FieldArtist, 557, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "songs", FieldTime, 180, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "songs", FieldRating, 563, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "songs", FieldYear, 562, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ { "songs", FieldGenre, 515, SettingInfo::BUTTON, CDatabaseQueryRule::OPERATOR_EQUALS },
+ { "songs", FieldPlaycount, 567, SettingInfo::RANGE, CDatabaseQueryRule::OPERATOR_BETWEEN },
+ //{ "songs", FieldLastPlayed, 568, SettingInfo::TODO, CDatabaseQueryRule::TODO },
+ //{ "songs", FieldDateAdded, 570, SettingInfo::TODO, CDatabaseQueryRule::TODO },
};
#define NUM_FILTERS sizeof(filterList) / sizeof(CGUIDialogMediaFilter::Filter)
filter.controlIndex = CONTROL_START + m_settings.size();
// check the smartplaylist if it contains a matching rule
- for (vector<CSmartPlaylistRule>::iterator rule = m_filter->m_ruleCombination.m_rules.begin(); rule != m_filter->m_ruleCombination.m_rules.end(); rule++)
+ for (CDatabaseQueryRules::iterator rule = m_filter->m_ruleCombination.m_rules.begin(); rule != m_filter->m_ruleCombination.m_rules.end(); rule++)
{
- if (rule->m_field == filter.field)
+ if ((*rule)->m_field == filter.field)
{
- filter.rule = &(*rule);
+ filter.rule = (CSmartPlaylistRule *)rule->get();
handledRules++;
break;
}
if (filter.rule == NULL)
filter.data = new int(CHECK_ALL);
else
- filter.data = new int(filter.rule->m_operator == CSmartPlaylistRule::OPERATOR_TRUE ? CHECK_YES : CHECK_NO);
+ filter.data = new int(filter.rule->m_operator == CDatabaseQueryRule::OPERATOR_TRUE ? CHECK_YES : CHECK_NO);
vector<pair<int, int> > entries;
entries.push_back(pair<int, int>(CHECK_ALL, CHECK_LABEL_ALL));
int choice = *(int *)setting.data;
if (choice > CHECK_ALL)
{
- CSmartPlaylistRule::SEARCH_OPERATOR ruleOperator = choice == CHECK_YES ? CSmartPlaylistRule::OPERATOR_TRUE : CSmartPlaylistRule::OPERATOR_FALSE;
+ CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator = choice == CHECK_YES ? CDatabaseQueryRule::OPERATOR_TRUE : CDatabaseQueryRule::OPERATOR_FALSE;
if (filter.rule == NULL)
filter.rule = AddRule(filter.field, ruleOperator);
else
return;
CSmartPlaylist tmpFilter = *m_filter;
- for (vector<CSmartPlaylistRule>::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++)
+ for (CDatabaseQueryRules::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++)
{
- if (rule->m_field == filter.field)
+ if ((*rule)->m_field == filter.field)
{
tmpFilter.m_ruleCombination.m_rules.erase(rule);
break;
return;
CSmartPlaylist tmpFilter = *m_filter;
- for (vector<CSmartPlaylistRule>::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++)
+ for (CDatabaseQueryRules::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++)
{
- if (rule->m_field == filter.field)
+ if ((*rule)->m_field == filter.field)
{
tmpFilter.m_ruleCombination.m_rules.erase(rule);
break;
pDialog->Reset();
}
-CSmartPlaylistRule* CGUIDialogMediaFilter::AddRule(Field field, CSmartPlaylistRule::SEARCH_OPERATOR ruleOperator /* = CSmartPlaylistRule::OPERATOR_CONTAINS */)
+CSmartPlaylistRule* CGUIDialogMediaFilter::AddRule(Field field, CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator /* = CDatabaseQueryRule::OPERATOR_CONTAINS */)
{
CSmartPlaylistRule rule;
rule.m_field = field;
rule.m_operator = ruleOperator;
- m_filter->m_ruleCombination.m_rules.push_back(rule);
- return &m_filter->m_ruleCombination.m_rules.at(m_filter->m_ruleCombination.m_rules.size() - 1);
+ m_filter->m_ruleCombination.AddRule(rule);
+ return (CSmartPlaylistRule *)m_filter->m_ruleCombination.m_rules.back().get();
}
void CGUIDialogMediaFilter::DeleteRule(Field field)
{
- for (vector<CSmartPlaylistRule>::iterator rule = m_filter->m_ruleCombination.m_rules.begin(); rule != m_filter->m_ruleCombination.m_rules.end(); rule++)
+ for (CDatabaseQueryRules::iterator rule = m_filter->m_ruleCombination.m_rules.begin(); rule != m_filter->m_ruleCombination.m_rules.end(); rule++)
{
- if (rule->m_field == field)
+ if ((*rule)->m_field == field)
{
m_filter->m_ruleCombination.m_rules.erase(rule);
break;
Field field;
uint32_t label;
SettingInfo::SETTING_TYPE type;
- CSmartPlaylistRule::SEARCH_OPERATOR ruleOperator;
+ CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator;
void *data;
CSmartPlaylistRule *rule;
int controlIndex;
void TriggerFilter() const;
void OnBrowse(const Filter &filter, CFileItemList &items, bool countOnly = false);
- CSmartPlaylistRule* AddRule(Field field, CSmartPlaylistRule::SEARCH_OPERATOR ruleOperator = CSmartPlaylistRule::OPERATOR_CONTAINS);
+ CSmartPlaylistRule* AddRule(Field field, CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator = CDatabaseQueryRule::OPERATOR_CONTAINS);
void DeleteRule(Field field);
void GetRange(const Filter &filter, float &min, float &interval, float &max, RANGEFORMATFUNCTION &formatFunction);
bool GetMinMax(const CStdString &table, const CStdString &field, float &min, float &max, const CDatabase::Filter &filter = CDatabase::Filter());
{
if (item < 0 || item >= (int)m_playlist.m_ruleCombination.m_rules.size()) return;
- CSmartPlaylistRule rule = m_playlist.m_ruleCombination.m_rules[item];
+ CSmartPlaylistRule rule = *boost::static_pointer_cast<CSmartPlaylistRule>(m_playlist.m_ruleCombination.m_rules[item]);
if (CGUIDialogSmartPlaylistRule::EditRule(rule,m_playlist.GetType()))
- m_playlist.m_ruleCombination.m_rules[item] = rule;
+ *m_playlist.m_ruleCombination.m_rules[item] = rule;
UpdateButtons();
}
// if there's no rule available, add a dummy one the user can edit
if (m_playlist.m_ruleCombination.m_rules.size() <= 0)
- m_playlist.m_ruleCombination.m_rules.push_back(CSmartPlaylistRule());
+ m_playlist.m_ruleCombination.AddRule(CSmartPlaylistRule());
// name
if (m_mode == "partyvideo" || m_mode == "partymusic")
for (unsigned int i = 0; i < m_playlist.m_ruleCombination.m_rules.size(); i++)
{
CFileItemPtr item(new CFileItem("", false));
- if (m_playlist.m_ruleCombination.m_rules[i].m_field == FieldNone)
+ if (m_playlist.m_ruleCombination.m_rules[i]->m_field == FieldNone)
item->SetLabel(g_localizeStrings.Get(21423));
else
- item->SetLabel(m_playlist.m_ruleCombination.m_rules[i].GetLocalizedRule());
+ item->SetLabel(boost::static_pointer_cast<CSmartPlaylistRule>(m_playlist.m_ruleCombination.m_rules[i])->GetLocalizedRule());
m_ruleLabels->Add(item);
}
CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), CONTROL_RULE_LIST, 0, 0, m_ruleLabels);
CONTROL_ENABLE_ON_CONDITION(CONTROL_RULE_REMOVE,
iSize > 0 && // there is at least one item
iItem >= 0 && iItem < iSize && // and a valid item is selected
- m_playlist.m_ruleCombination.m_rules[iItem].m_field != FieldNone); // and it is not be empty
+ m_playlist.m_ruleCombination.m_rules[iItem]->m_field != FieldNone); // and it is not be empty
}
void CGUIDialogSmartPlaylistEditor::OnWindowLoaded()
CSmartPlaylistRule rule;
if (CGUIDialogSmartPlaylistRule::EditRule(rule,m_playlist.GetType()))
{
- if (m_playlist.m_ruleCombination.m_rules.size() == 1 && m_playlist.m_ruleCombination.m_rules[0].m_field == FieldNone)
- m_playlist.m_ruleCombination.m_rules[0] = rule;
+ if (m_playlist.m_ruleCombination.m_rules.size() == 1 && m_playlist.m_ruleCombination.m_rules[0]->m_field == FieldNone)
+ *m_playlist.m_ruleCombination.m_rules[0] = rule;
else
- m_playlist.m_ruleCombination.m_rules.push_back(rule);
+ m_playlist.m_ruleCombination.AddRule(rule);
}
UpdateButtons();
}
{
CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_OPERATOR);
OnMessage(msg);
- m_rule.m_operator = (CSmartPlaylistRule::SEARCH_OPERATOR)msg.GetParam1();
+ m_rule.m_operator = (CDatabaseQueryRule::SEARCH_OPERATOR)msg.GetParam1();
UpdateButtons();
}
else
CONTROL_DISABLE(CONTROL_BROWSE);
- switch (CSmartPlaylistRule::GetFieldType(m_rule.m_field))
+ switch (m_rule.GetFieldType(m_rule.m_field))
{
- case CSmartPlaylistRule::TEXT_FIELD:
+ case CDatabaseQueryRule::TEXT_FIELD:
// text fields - add the usual comparisons
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_EQUALS);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_CONTAINS);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_DOES_NOT_CONTAIN);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_STARTS_WITH);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_ENDS_WITH);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_CONTAINS);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_CONTAIN);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_STARTS_WITH);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_ENDS_WITH);
break;
- case CSmartPlaylistRule::NUMERIC_FIELD:
- case CSmartPlaylistRule::SECONDS_FIELD:
+ case CDatabaseQueryRule::NUMERIC_FIELD:
+ case CDatabaseQueryRule::SECONDS_FIELD:
// numerical fields - less than greater than
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_EQUALS);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_GREATER_THAN);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_LESS_THAN);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_GREATER_THAN);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_LESS_THAN);
break;
- case CSmartPlaylistRule::DATE_FIELD:
+ case CDatabaseQueryRule::DATE_FIELD:
// date field
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_AFTER);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_BEFORE);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_IN_THE_LAST);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_NOT_IN_THE_LAST);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_AFTER);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_BEFORE);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_IN_THE_LAST);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_NOT_IN_THE_LAST);
break;
- case CSmartPlaylistRule::PLAYLIST_FIELD:
+ case CDatabaseQueryRule::PLAYLIST_FIELD:
CONTROL_ENABLE(CONTROL_BROWSE);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_EQUALS);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL);
break;
- case CSmartPlaylistRule::BOOLEAN_FIELD:
+ case CDatabaseQueryRule::BOOLEAN_FIELD:
CONTROL_DISABLE(CONTROL_VALUE);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_TRUE);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_FALSE);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_TRUE);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_FALSE);
break;
- case CSmartPlaylistRule::TEXTIN_FIELD:
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_EQUALS);
- AddOperatorLabel(CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL);
+ case CDatabaseQueryRule::TEXTIN_FIELD:
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS);
+ AddOperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL);
break;
}
SendMessage(GUI_MSG_ITEM_SELECT, CONTROL_OPERATOR, m_rule.m_operator);
CGUIMessage selected(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_OPERATOR);
OnMessage(selected);
- m_rule.m_operator = (CSmartPlaylistRule::SEARCH_OPERATOR)selected.GetParam1();
+ m_rule.m_operator = (CDatabaseQueryRule::SEARCH_OPERATOR)selected.GetParam1();
// update the parameter edit control appropriately
SET_CONTROL_LABEL2(CONTROL_VALUE, m_rule.GetParameter());
CGUIEditControl::INPUT_TYPE type = CGUIEditControl::INPUT_TYPE_TEXT;
- CSmartPlaylistRule::FIELD_TYPE fieldType = CSmartPlaylistRule::GetFieldType(m_rule.m_field);
+ CDatabaseQueryRule::FIELD_TYPE fieldType = m_rule.GetFieldType(m_rule.m_field);
switch (fieldType)
{
- case CSmartPlaylistRule::TEXT_FIELD:
- case CSmartPlaylistRule::PLAYLIST_FIELD:
- case CSmartPlaylistRule::TEXTIN_FIELD:
- case CSmartPlaylistRule::NUMERIC_FIELD:
+ case CDatabaseQueryRule::TEXT_FIELD:
+ case CDatabaseQueryRule::PLAYLIST_FIELD:
+ case CDatabaseQueryRule::TEXTIN_FIELD:
+ case CDatabaseQueryRule::NUMERIC_FIELD:
type = CGUIEditControl::INPUT_TYPE_TEXT;
break;
- case CSmartPlaylistRule::DATE_FIELD:
- if (m_rule.m_operator == CSmartPlaylistRule::OPERATOR_IN_THE_LAST ||
- m_rule.m_operator == CSmartPlaylistRule::OPERATOR_NOT_IN_THE_LAST)
+ case CDatabaseQueryRule::DATE_FIELD:
+ if (m_rule.m_operator == CDatabaseQueryRule::OPERATOR_IN_THE_LAST ||
+ m_rule.m_operator == CDatabaseQueryRule::OPERATOR_NOT_IN_THE_LAST)
type = CGUIEditControl::INPUT_TYPE_TEXT;
else
type = CGUIEditControl::INPUT_TYPE_DATE;
break;
- case CSmartPlaylistRule::SECONDS_FIELD:
+ case CDatabaseQueryRule::SECONDS_FIELD:
type = CGUIEditControl::INPUT_TYPE_SECONDS;
break;
- case CSmartPlaylistRule::BOOLEAN_FIELD:
+ case CDatabaseQueryRule::BOOLEAN_FIELD:
type = CGUIEditControl::INPUT_TYPE_NUMBER;
break;
}
SendMessage(GUI_MSG_SET_TYPE, CONTROL_VALUE, type, 21420);
}
-void CGUIDialogSmartPlaylistRule::AddOperatorLabel(CSmartPlaylistRule::SEARCH_OPERATOR op)
+void CGUIDialogSmartPlaylistRule::AddOperatorLabel(CDatabaseQueryRule::SEARCH_OPERATOR op)
{
CGUIMessage select(GUI_MSG_LABEL_ADD, GetID(), CONTROL_OPERATOR, op);
select.SetLabel(CSmartPlaylistRule::GetLocalizedOperator(op));
void OnOK();
void OnCancel();
void UpdateButtons();
- void AddOperatorLabel(CSmartPlaylistRule::SEARCH_OPERATOR op);
+ void AddOperatorLabel(CDatabaseQueryRule::SEARCH_OPERATOR op);
void OnBrowse();
CSmartPlaylistRule m_rule;
// we was using url optons for urls, keep the old code work and warning
if (!url2.GetOptions().IsEmpty())
{
- CLog::Log(LOGWARNING, "%s: ftp url option is deprecated, please switch to use protocol option (change '?' to '|'), url: [%s]", __FUNCTION__, url2.Get().c_str());
+ CLog::Log(LOGWARNING, "%s: ftp url option is deprecated, please switch to use protocol option (change '?' to '|'), url: [%s]", __FUNCTION__, url2.GetRedacted().c_str());
url2.SetProtocolOptions(url2.GetOptions().Mid(1));
/* ftp has no options */
url2.SetOptions("");
CURL url2(url);
ParseAndCorrectUrl(url2);
- CLog::Log(LOGDEBUG, "CurlFile::Open(%p) %s", (void*)this, m_url.c_str());
+ std::string redactPath = CURL::GetRedacted(m_url);
+ CLog::Log(LOGDEBUG, "CurlFile::Open(%p) %s", (void*)this, redactPath.c_str());
ASSERT(!(!m_state->m_easyHandle ^ !m_state->m_multiHandle));
if( m_state->m_easyHandle == NULL )
|| !m_state->m_httpheader.GetValue("icy-name").empty()
|| !m_state->m_httpheader.GetValue("icy-br").empty()) && !m_skipshout)
{
- CLog::Log(LOGDEBUG,"CCurlFile::Open - File <%s> is a shoutcast stream. Re-opening", m_url.c_str());
+ CLog::Log(LOGDEBUG,"CCurlFile::Open - File <%s> is a shoutcast stream. Re-opening", redactPath.c_str());
throw new CRedirectException(new CShoutcastFile);
}
CURL url2(url);
ParseAndCorrectUrl(url2);
- CLog::Log(LOGDEBUG, "CCurlFile::OpenForWrite(%p) %s", (void*)this, m_url.c_str());
+ CLog::Log(LOGDEBUG, "CCurlFile::OpenForWrite(%p) %s", (void*)this, CURL::GetRedacted(m_url).c_str());
ASSERT(m_state->m_easyHandle == NULL);
g_curlInterface.easy_aquire(url2.GetProtocol(), url2.GetHostName(), &m_state->m_easyHandle, &m_state->m_multiHandle);
{
long code;
if(g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_RESPONSE_CODE, &code) == CURLE_OK )
- CLog::Log(LOGERROR, "%s - Unable to write curl resource (%s) - %ld", __FUNCTION__, m_url.c_str(), code);
+ CLog::Log(LOGERROR, "%s - Unable to write curl resource (%s) - %ld", __FUNCTION__, CURL::GetRedacted(m_url).c_str(), code);
m_inError = true;
return -1;
}
// if file is already running, get info from it
if( m_opened )
{
- CLog::Log(LOGWARNING, "CCurlFile::Exists - Exist called on open file %s", url.Get().c_str());
+ CLog::Log(LOGWARNING, "CCurlFile::Exists - Exist called on open file %s", url.GetRedacted().c_str());
return true;
}
{
long code;
if(g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_RESPONSE_CODE, &code) == CURLE_OK && code != 404 )
- CLog::Log(LOGERROR, "CCurlFile::Exists - Failed: HTTP returned error %ld for %s", code, url.Get().c_str());
+ CLog::Log(LOGERROR, "CCurlFile::Exists - Failed: HTTP returned error %ld for %s", code, url.GetRedacted().c_str());
}
else if (result != CURLE_REMOTE_FILE_NOT_FOUND && result != CURLE_FTP_COULDNT_RETR_FILE)
{
- CLog::Log(LOGERROR, "CCurlFile::Exists - Failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.Get().c_str());
+ CLog::Log(LOGERROR, "CCurlFile::Exists - Failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.GetRedacted().c_str());
}
errno = ENOENT;
// if file is already running, get info from it
if( m_opened )
{
- CLog::Log(LOGWARNING, "CCurlFile::Stat - Stat called on open file %s", url.Get().c_str());
+ CLog::Log(LOGWARNING, "CCurlFile::Stat - Stat called on open file %s", url.GetRedacted().c_str());
if (buffer)
{
memset(buffer, 0, sizeof(struct __stat64));
{
g_curlInterface.easy_release(&m_state->m_easyHandle, NULL);
errno = ENOENT;
- CLog::Log(LOGERROR, "CCurlFile::Stat - Failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.Get().c_str());
+ CLog::Log(LOGERROR, "CCurlFile::Stat - Failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.GetRedacted().c_str());
return -1;
}
if (url.GetProtocol() == "ftp")
{
g_curlInterface.easy_release(&m_state->m_easyHandle, NULL);
- CLog::Log(LOGNOTICE, "CCurlFile::Stat - Content length failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.Get().c_str());
+ CLog::Log(LOGNOTICE, "CCurlFile::Stat - Content length failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.GetRedacted().c_str());
errno = ENOENT;
return -1;
}
result = g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_CONTENT_TYPE, &content);
if (result != CURLE_OK)
{
- CLog::Log(LOGNOTICE, "CCurlFile::Stat - Content type failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.Get().c_str());
+ CLog::Log(LOGNOTICE, "CCurlFile::Stat - Content type failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.GetRedacted().c_str());
g_curlInterface.easy_release(&m_state->m_easyHandle, NULL);
errno = ENOENT;
return -1;
result = g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_FILETIME, &filetime);
if (result != CURLE_OK)
{
- CLog::Log(LOGNOTICE, "CCurlFile::Stat - Filetime failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.Get().c_str());
+ CLog::Log(LOGNOTICE, "CCurlFile::Stat - Filetime failed: %s(%d) for %s", g_curlInterface.easy_strerror(result), result, url.GetRedacted().c_str());
}
else
{
}
catch(...)
{
- CLog::Log(LOGERROR, "%s - Exception thrown while trying to retrieve header url: %s", __FUNCTION__, url.Get().c_str());
+ CLog::Log(LOGERROR, "%s - Exception thrown while trying to retrieve header url: %s", __FUNCTION__, url.GetRedacted().c_str());
return false;
}
}
file.SetUserAgent(useragent);
struct __stat64 buffer;
+ std::string redactUrl = url.GetRedacted();
if( file.Stat(url, &buffer) == 0 )
{
if (buffer.st_mode == _S_IFDIR)
content = "x-directory/normal";
else
content = file.GetMimeType();
- CLog::Log(LOGDEBUG, "CCurlFile::GetMimeType - %s -> %s", url.Get().c_str(), content.c_str());
+ CLog::Log(LOGDEBUG, "CCurlFile::GetMimeType - %s -> %s", redactUrl.c_str(), content.c_str());
return true;
}
- CLog::Log(LOGDEBUG, "CCurlFile::GetMimeType - %s -> failed", url.Get().c_str());
+ CLog::Log(LOGDEBUG, "CCurlFile::GetMimeType - %s -> failed", redactUrl.c_str());
content = "";
return false;
}
+bool CCurlFile::GetCookies(const CURL &url, std::string &cookies)
+{
+ std::string cookiesStr;
+ struct curl_slist* curlCookies;
+ XCURL::CURL_HANDLE* easyHandle;
+ XCURL::CURLM* multiHandle;
+
+ // get the cookies list
+ g_curlInterface.easy_aquire(url.GetProtocol(), url.GetHostName(), &easyHandle, &multiHandle);
+ if (CURLE_OK == g_curlInterface.easy_getinfo(easyHandle, CURLINFO_COOKIELIST, &curlCookies))
+ {
+ // iterate over each cookie and format it into an RFC 2109 formatted Set-Cookie string
+ struct curl_slist* curlCookieIter = curlCookies;
+ while(curlCookieIter)
+ {
+ // tokenize the CURL cookie string
+ std::vector<std::string> valuesVec;
+ StringUtils::Tokenize(curlCookieIter->data, valuesVec, "\t");
+
+ // ensure the length is valid
+ if (valuesVec.size() < 7)
+ {
+ CLog::Log(LOGERROR, "CCurlFile::GetCookies - invalid cookie: '%s'", curlCookieIter->data);
+ continue;
+ }
+
+ // create a http-header formatted cookie string
+ std::string cookieStr = valuesVec[5] + "=" + valuesVec[6] +
+ "; path=" + valuesVec[2] +
+ "; domain=" + valuesVec[0];
+
+ // append this cookie to the string containing all cookies
+ if (!cookiesStr.empty())
+ cookiesStr += "\n";
+ cookiesStr += cookieStr;
+
+ // move on to the next cookie
+ curlCookieIter = curlCookieIter->next;
+ }
+
+ // free the curl cookies
+ g_curlInterface.slist_free_all(curlCookies);
+
+ // release our handles
+ g_curlInterface.easy_release(&easyHandle, &multiHandle);
+
+ // if we have a non-empty cookie string, return it
+ if (!cookiesStr.empty())
+ {
+ cookies = cookiesStr;
+ return true;
+ }
+ }
+
+ // no cookies to return
+ return false;
+}
+
int CCurlFile::IoControl(EIoControl request, void* param)
{
if(request == IOCTRL_SEEK_POSSIBLE)
virtual CStdString GetMimeType() { return m_state->m_httpheader.GetMimeType(); }
virtual CStdString GetContent() { return GetMimeType(); }
virtual int IoControl(EIoControl request, void* param);
+ virtual std::string GetContentCharset(void) { return GetServerReportedCharset(); }
bool Post(const CStdString& strURL, const CStdString& strPostData, CStdString& strHTML);
bool Get(const CStdString& strURL, CStdString& strHTML);
static bool GetHttpHeader(const CURL &url, CHttpHeader &headers);
static bool GetMimeType(const CURL &url, CStdString &content, CStdString useragent="");
+ /* static function that will get cookies stored by CURL in RFC 2109 format */
+ static bool GetCookies(const CURL &url, std::string &cookies);
+
class CReadState
{
public:
if (!dav.Open(url))
{
- CLog::Log(LOGERROR, "%s - Unable to get dav directory (%s)", __FUNCTION__, strPath.c_str());
+ CLog::Log(LOGERROR, "%s - Unable to get dav directory (%s)", __FUNCTION__, CURL::GetRedacted(strPath).c_str());
return false;
}
if (!davResponse.Parse(strResponse))
{
- CLog::Log(LOGERROR, "%s - Unable to process dav directory (%s)", __FUNCTION__, strPath.c_str());
+ CLog::Log(LOGERROR, "%s - Unable to process dav directory (%s)", __FUNCTION__, CURL::GetRedacted(strPath).c_str());
dav.Close();
return false;
}
if (!dav.Execute(url))
{
- CLog::Log(LOGERROR, "%s - Unable to create dav directory (%s) - %d", __FUNCTION__, url.Get().c_str(), dav.GetLastResponseCode());
+ CLog::Log(LOGERROR, "%s - Unable to create dav directory (%s) - %d", __FUNCTION__, url.GetRedacted().c_str(), dav.GetLastResponseCode());
return false;
}
if (!dav.Execute(url))
{
- CLog::Log(LOGERROR, "%s - Unable to delete dav directory (%s) - %d", __FUNCTION__, url.Get().c_str(), dav.GetLastResponseCode());
+ CLog::Log(LOGERROR, "%s - Unable to delete dav directory (%s) - %d", __FUNCTION__, url.GetRedacted().c_str(), dav.GetLastResponseCode());
return false;
}
#include "dialogs/GUIDialogBusy.h"
#include "threads/SingleLock.h"
#include "utils/URIUtils.h"
+#include "URL.h"
using namespace std;
using namespace XFILE;
{
if (!cancel && g_application.IsCurrentThread() && pDirectory->ProcessRequirements())
continue;
- CLog::Log(LOGERROR, "%s - Error getting %s", __FUNCTION__, strPath.c_str());
+ CLog::Log(LOGERROR, "%s - Error getting %s", __FUNCTION__, CURL::GetRedacted(strPath).c_str());
return false;
}
}
{
CLog::Log(LOGERROR, "%s - Unhandled exception", __FUNCTION__);
}
- CLog::Log(LOGERROR, "%s - Error getting %s", __FUNCTION__, strPath.c_str());
+ CLog::Log(LOGERROR, "%s - Error getting %s", __FUNCTION__, CURL::GetRedacted(strPath).c_str());
return false;
}
{
CLog::Log(LOGERROR, "%s - Unhandled exception", __FUNCTION__);
}
- CLog::Log(LOGERROR, "%s - Error creating %s", __FUNCTION__, strPath.c_str());
+ CLog::Log(LOGERROR, "%s - Error creating %s", __FUNCTION__, CURL::GetRedacted(strPath).c_str());
return false;
}
{
CLog::Log(LOGERROR, "%s - Unhandled exception", __FUNCTION__);
}
- CLog::Log(LOGERROR, "%s - Error checking for %s", __FUNCTION__, strPath.c_str());
+ CLog::Log(LOGERROR, "%s - Error checking for %s", __FUNCTION__, CURL::GetRedacted(strPath).c_str());
return false;
}
{
CLog::Log(LOGERROR, "%s - Unhandled exception", __FUNCTION__);
}
- CLog::Log(LOGERROR, "%s - Error removing %s", __FUNCTION__, strPath.c_str());
+ CLog::Log(LOGERROR, "%s - Error removing %s", __FUNCTION__, CURL::GetRedacted(strPath).c_str());
return false;
}
return m_pFile->GetChunkSize();
return 0;
}
+
+std::string CFile::GetContentMimeType(void)
+{
+ if (!m_pFile)
+ return "";
+ return m_pFile->GetContent();
+}
+
+std::string CFile::GetContentCharset(void)
+{
+ if (!m_pFile)
+ return "";
+ return m_pFile->GetContentCharset();
+}
+
//*********************************************************************************************
//*************** Stream IO for CFile objects *************************************************
//*********************************************************************************************
int64_t GetLength();
void Close();
int GetChunkSize();
+ std::string GetContentMimeType(void);
+ std::string GetContentCharset(void);
// will return a size, that is aligned to chunk size
// but always greater or equal to the file's chunk size
// opening the source file.
if (!m_source.Open(m_sourcePath, READ_NO_CACHE | READ_TRUNCATED | READ_CHUNKED))
{
- CLog::Log(LOGERROR,"%s - failed to open source <%s>", __FUNCTION__, m_sourcePath.c_str());
+ CLog::Log(LOGERROR,"%s - failed to open source <%s>", __FUNCTION__, url.GetRedacted().c_str());
Close();
return false;
}
return m_source.GetImplemenation()->GetContent();
}
+std::string CFileCache::GetContentCharset(void)
+{
+ IFile* impl = m_source.GetImplemenation();
+ if (!impl)
+ return IFile::GetContentCharset();
+
+ return impl->GetContentCharset();
+}
+
int CFileCache::IoControl(EIoControl request, void* param)
{
if (request == IOCTRL_CACHE_STATUS)
IFile *GetFileImp();
virtual CStdString GetContent();
+ virtual std::string GetContentCharset(void);
private:
CCacheStrategy *m_pCache;
virtual int IoControl(EIoControl request, void* param) { return -1; }
virtual CStdString GetContent() { return "application/octet-stream"; }
+ virtual std::string GetContentCharset(void) { return ""; }
};
class CRedirectException
CStdString path;
XMLUtils::GetPath(node, "path", path);
if (!path.IsEmpty())
+ {
+ URIUtils::AddSlashAtEnd(path);
return CDirectory::GetDirectory(path, items, m_strFileMask, m_flags);
+ }
}
}
return false;
-
/*
* Copyright (C) 2005-2013 Team XBMC
* http://xbmc.org
if ((m_flags & DIR_FLAG_NO_FILE_INFO)==0 && g_advancedSettings.m_sambastatfiles)
{
// make sure we use the authenticated path wich contains any default username
- CStdString strFullName = strAuth + smb.URLEncode(strFile);
+ const CStdString strFullName = strAuth + smb.URLEncode(strFile);
lock.Enter();
hidden = true;
}
else
- CLog::Log(LOGERROR, "Getting extended attributes for the share: '%s'\nunix_err:'%x' error: '%s'", strFullName.c_str(), errno, strerror(errno));
+ CLog::Log(LOGERROR, "Getting extended attributes for the share: '%s'\nunix_err:'%x' error: '%s'", CURL::GetRedacted(strFullName).c_str(), errno, strerror(errno));
#endif
bIsDir = (info.st_mode & S_IFDIR) ? true : false;
iSize = info.st_size;
}
else
- CLog::Log(LOGERROR, "%s - Failed to stat file %s", __FUNCTION__, strFullName.c_str());
+ CLog::Log(LOGERROR, "%s - Failed to stat file %s", __FUNCTION__, CURL::GetRedacted(strFullName).c_str());
lock.Leave();
}
// remove the / or \ at the end. the samba library does not strip them off
// don't do this for smb:// !!
- CStdString s = strAuth;
+ std::string s = strAuth;
int len = s.length();
if (len > 1 && s.at(len - 2) != '/' &&
(s.at(len - 1) == '/' || s.at(len - 1) == '\\'))
s.erase(len - 1, 1);
}
- CLog::Log(LOGDEBUG, "%s - Using authentication url %s", __FUNCTION__, s.c_str());
+ CLog::Log(LOGDEBUG, "%s - Using authentication url %s", __FUNCTION__, CURL::GetRedacted(s).c_str());
{ CSingleLock lock(smb);
fd = smbc_opendir(s.c_str());
}
{
// write error to logfile
#ifdef TARGET_WINDOWS
- CLog::Log(LOGERROR, "SMBDirectory->GetDirectory: Unable to open directory : '%s'\nunix_err:'%x' nt_err : '%x' error : '%s'", strAuth.c_str(), errno, nt_error, get_friendly_nt_error_msg(nt_error));
+ CLog::Log(LOGERROR, "SMBDirectory->GetDirectory: Unable to open directory : '%s'\nunix_err:'%x' nt_err : '%x' error : '%s'", CURL::GetRedacted(strAuth).c_str(), errno, nt_error, get_friendly_nt_error_msg(nt_error));
#else
- CLog::Log(LOGERROR, "SMBDirectory->GetDirectory: Unable to open directory : '%s'\nunix_err:'%x' error : '%s'", strAuth.c_str(), errno, strerror(errno));
+ CLog::Log(LOGERROR, "SMBDirectory->GetDirectory: Unable to open directory : '%s'\nunix_err:'%x' error : '%s'", CURL::GetRedacted(strAuth).c_str(), errno, strerror(errno));
#endif
}
// write error to logfile
#ifdef TARGET_WINDOWS
int nt_error = smb.ConvertUnixToNT(errno);
- CLog::Log(LOGINFO, "FileSmb->Open: Unable to open file : '%s'\nunix_err:'%x' nt_err : '%x' error : '%s'", strFileName.c_str(), errno, nt_error, get_friendly_nt_error_msg(nt_error));
+ CLog::Log(LOGINFO, "FileSmb->Open: Unable to open file : '%s'\nunix_err:'%x' nt_err : '%x' error : '%s'", CURL::GetRedacted(strFileName).c_str(), errno, nt_error, get_friendly_nt_error_msg(nt_error));
#else
- CLog::Log(LOGINFO, "FileSmb->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", strFileName.c_str(), errno, strerror(errno));
+ CLog::Log(LOGINFO, "FileSmb->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", CURL::GetRedacted(strFileName).c_str(), errno, strerror(errno));
#endif
return false;
}
bool CStackDirectory::ConstructStackPath(const vector<CStdString> &paths, CStdString& stackedPath)
{
+ vector<string> pathsT;
+ pathsT.reserve(paths.size());
+ for (vector<CStdString>::const_iterator path = paths.begin();
+ path != paths.end(); ++path)
+ {
+ pathsT.push_back(*path);
+ }
+ std::string stackedPathT = stackedPath;
+ bool retVal = ConstructStackPath(pathsT, stackedPathT);
+ stackedPath = stackedPathT;
+ return retVal;
+ }
+
+ bool CStackDirectory::ConstructStackPath(const vector<std::string> &paths, std::string& stackedPath)
+ {
if (paths.size() < 2)
return false;
stackedPath = "stack://";
- CStdString folder, file;
+ std::string folder, file;
URIUtils::Split(paths[0], folder, file);
stackedPath += folder;
// double escape any occurence of commas
- file.Replace(",", ",,");
+ StringUtils::Replace(file, ",", ",,");
stackedPath += file;
for (unsigned int i = 1; i < paths.size(); ++i)
{
file = paths[i];
// double escape any occurence of commas
- file.Replace(",", ",,");
+ StringUtils::Replace(file, ",", ",,");
stackedPath += file;
}
return true;
static bool GetPaths(const CStdString& strPath, std::vector<CStdString>& vecPaths);
static CStdString ConstructStackPath(const CFileItemList& items, const std::vector<int> &stack);
static bool ConstructStackPath(const std::vector<CStdString> &paths, CStdString &stackedPath);
+ static bool ConstructStackPath(const std::vector<std::string> &paths, std::string &stackedPath);
};
}
m_constantNodes.insert("posx");
m_constantNodes.insert("posy");
+ m_constantNodes.insert("left");
+ m_constantNodes.insert("right");
+ m_constantNodes.insert("centerx");
+ m_constantNodes.insert("top");
+ m_constantNodes.insert("bottom");
+ m_constantNodes.insert("centery");
m_constantNodes.insert("width");
m_constantNodes.insert("height");
m_constantNodes.insert("offsetx");
{
XMLUtils::GetFloat(pChild, "posx", m_posX);
XMLUtils::GetFloat(pChild, "posy", m_posY);
+ XMLUtils::GetFloat(pChild, "left", m_posX);
+ XMLUtils::GetFloat(pChild, "top", m_posY);
TiXmlElement *originElement = pChild->FirstChildElement("origin");
while (originElement)
ifeq (@USE_OPENGLES@,1)
SRCS += TextureGL.cpp
+SRCS += TexturePi.cpp
SRCS += GUIFontTTFGL.cpp
SRCS += GUITextureGLES.cpp
SRCS += MatrixGLES.cpp
#include "rendering/RenderSystem.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
+#include "URL.h"
#include "windowing/WindowingFactory.h"
if (stereoMode.empty())
stereoMode = "mono";
- CLog::Log(LOGDEBUG, "StereoscopicsManager: Detected stereo mode in string '%s' is '%s'", needle.c_str(), stereoMode.c_str());
+ CLog::Log(LOGDEBUG, "StereoscopicsManager: Detected stereo mode in string '%s' is '%s'", CURL::GetRedacted(needle).c_str(), stereoMode.c_str());
return stereoMode;
}
#include "filesystem/AndroidAppFile.h"
#endif
-#if defined(HAS_OMXPLAYER)
-#include "xbmc/cores/omxplayer/OMXImage.h"
-#endif
-
/************************************************************************/
/* */
/************************************************************************/
CLAMP(m_textureHeight, g_Windowing.GetMaxTextureSize());
CLAMP(m_imageWidth, m_textureWidth);
CLAMP(m_imageHeight, m_textureHeight);
+
delete[] m_pixels;
- m_pixels = new unsigned char[GetPitch() * GetRows()];
+ m_pixels = NULL;
+ if (GetPitch() * GetRows() > 0)
+ {
+ m_pixels = new unsigned char[GetPitch() * GetRows()];
+ }
}
void CBaseTexture::Update(unsigned int width, unsigned int height, unsigned int pitch, unsigned int format, const unsigned char *pixels, bool loadToGPU)
bool CBaseTexture::LoadFromFileInternal(const CStdString& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool autoRotate)
{
-#if defined(HAS_OMXPLAYER)
- if (URIUtils::HasExtension(texturePath, ".jpg|.tbn")
- /*|| URIUtils::HasExtension(texturePath, ".png")*/)
- {
- COMXImageFile *file = COMXImage::LoadJpeg(texturePath);
- if (file)
- {
- bool okay = false;
- int orientation = file->GetOrientation();
- // limit the sizes of jpegs (even if we fail to decode)
- COMXImage::ClampLimits(maxWidth, maxHeight, file->GetWidth(), file->GetHeight(), orientation & 4);
- Allocate(maxWidth, maxHeight, XB_FMT_A8R8G8B8);
- if (m_pixels && COMXImage::DecodeJpeg(file, maxWidth, GetRows(), GetPitch(), (void *)m_pixels))
- {
- m_hasAlpha = false;
- if (autoRotate && orientation)
- m_orientation = orientation - 1;
- okay = true;
- }
- COMXImage::CloseJpeg(file);
- if (okay)
- return true;
- }
- }
-#endif
if (URIUtils::HasExtension(texturePath, ".dds"))
{ // special case for DDS images
CDDSImage image;
class CTexture;
class CGLTexture;
+class CPiTexture;
class CDXTexture;
/*!
bool m_hasAlpha;
};
-#if defined(HAS_GL) || defined(HAS_GLES)
+#if defined(HAS_OMXPLAYER)
+#include "TexturePi.h"
+#define CTexture CPiTexture
+#elif defined(HAS_GL) || defined(HAS_GLES)
#include "TextureGL.h"
#define CTexture CGLTexture
#elif defined(HAS_DX)
*/
#include "system.h"
-#include "TextureGL.h"
+#include "Texture.h"
#include "windowing/WindowingFactory.h"
#include "utils/log.h"
#include "utils/GLUtils.h"
void LoadToGPU();
void BindToUnit(unsigned int unit);
-private:
+protected:
GLuint m_texture;
};
--- /dev/null
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "system.h"
+#include "Texture.h"
+#include "windowing/WindowingFactory.h"
+#include "utils/log.h"
+#include "utils/GLUtils.h"
+#include "guilib/TextureManager.h"
+#include "utils/URIUtils.h"
+
+#if defined(HAS_OMXPLAYER)
+#include "cores/omxplayer/OMXImage.h"
+
+using namespace std;
+
+/************************************************************************/
+/* CPiTexture */
+/************************************************************************/
+
+CPiTexture::CPiTexture(unsigned int width, unsigned int height, unsigned int format)
+: CGLTexture(width, height, format)
+{
+ m_egl_image = NULL;
+}
+
+CPiTexture::~CPiTexture()
+{
+ if (m_egl_image)
+ {
+ g_OMXImage.DestroyTexture(m_egl_image);
+ m_egl_image = NULL;
+ }
+}
+
+void CPiTexture::Allocate(unsigned int width, unsigned int height, unsigned int format)
+{
+ if (m_egl_image)
+ {
+ m_imageWidth = m_originalWidth = width;
+ m_imageHeight = m_originalHeight = height;
+ m_format = format;
+ m_orientation = 0;
+
+ m_textureWidth = m_imageWidth;
+ m_textureHeight = m_imageHeight;
+ return;
+ }
+ return CGLTexture::Allocate(width, height, format);
+}
+
+void CPiTexture::CreateTextureObject()
+{
+ if (m_egl_image && !m_texture)
+ {
+ g_OMXImage.GetTexture(m_egl_image, &m_texture);
+ return;
+ }
+ CGLTexture::CreateTextureObject();
+}
+
+void CPiTexture::LoadToGPU()
+{
+ if (m_egl_image)
+ {
+ if (m_loadedToGPU)
+ {
+ // nothing to load - probably same image (no change)
+ return;
+ }
+ if (m_texture == 0)
+ {
+ // Have OpenGL generate a texture object handle for us
+ // this happens only one time - the first time the texture is loaded
+ CreateTextureObject();
+ }
+
+ // Bind the texture object
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+
+ m_loadedToGPU = true;
+ return;
+ }
+ CGLTexture::LoadToGPU();
+}
+
+void CPiTexture::Update(unsigned int width, unsigned int height, unsigned int pitch, unsigned int format, const unsigned char *pixels, bool loadToGPU)
+{
+ if (m_egl_image)
+ {
+ if (loadToGPU)
+ LoadToGPU();
+ return;
+ }
+ CGLTexture::Update(width, height, pitch, format, pixels, loadToGPU);
+}
+
+bool CPiTexture::LoadFromFileInternal(const CStdString& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool autoRotate)
+{
+ if (URIUtils::HasExtension(texturePath, ".jpg|.tbn"))
+ {
+ COMXImageFile *file = g_OMXImage.LoadJpeg(texturePath);
+ if (file)
+ {
+ bool okay = false;
+ int orientation = file->GetOrientation();
+ // limit the sizes of jpegs (even if we fail to decode)
+ g_OMXImage.ClampLimits(maxWidth, maxHeight, file->GetWidth(), file->GetHeight(), orientation & 4);
+ if (g_OMXImage.DecodeJpegToTexture(file, maxWidth, maxHeight, &m_egl_image) && m_egl_image)
+ {
+ m_hasAlpha = false;
+ if (autoRotate && orientation)
+ m_orientation = orientation - 1;
+ Allocate(maxWidth, maxHeight, XB_FMT_A8R8G8B8);
+ okay = true;
+ }
+ g_OMXImage.CloseJpeg(file);
+ if (okay)
+ return true;
+ }
+ }
+ return CGLTexture::LoadFromFileInternal(texturePath, maxWidth, maxHeight, autoRotate);
+}
+
+#endif
--- /dev/null
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include "TextureGL.h"
+
+#if defined(HAS_OMXPLAYER)
+
+#include "system_gl.h"
+
+/************************************************************************/
+/* CGLTexture */
+/************************************************************************/
+class CPiTexture : public CGLTexture
+{
+public:
+ CPiTexture(unsigned int width = 0, unsigned int height = 0, unsigned int format = XB_FMT_A8R8G8B8);
+ virtual ~CPiTexture();
+ void CreateTextureObject();
+ void LoadToGPU();
+ void Update(unsigned int width, unsigned int height, unsigned int pitch, unsigned int format, const unsigned char *pixels, bool loadToGPU);
+ void Allocate(unsigned int width, unsigned int height, unsigned int format);
+ bool LoadFromFileInternal(const CStdString& texturePath, unsigned int maxWidth, unsigned int maxHeight, bool autoRotate);
+
+protected:
+
+private:
+ void *m_egl_image;
+};
+
+#endif
bool needsRecaching;
CStdString image = CTextureCache::Get().CheckCachedImage(url, false, needsRecaching);
if (!image.empty() || CFile::Exists(url))
- object[field] = CTextureCache::Get().GetWrappedImageURL(url);
+ object[field] = CTextureUtils::GetWrappedImageURL(url);
else
object[field] = "";
}
#include "video/VideoDatabase.h"
#include "filesystem/Directory.h"
#include "filesystem/File.h"
-#include "TextureCache.h"
+#include "TextureDatabase.h"
#include "video/VideoThumbLoader.h"
#include "music/MusicThumbLoader.h"
#include "Util.h"
for (CGUIListItem::ArtMap::const_iterator artIt = artMap.begin(); artIt != artMap.end(); ++artIt)
{
if (!artIt->second.empty())
- artObj[artIt->first] = CTextureCache::GetWrappedImageURL(artIt->second);
+ artObj[artIt->first] = CTextureUtils::GetWrappedImageURL(artIt->second);
}
result["art"] = artObj;
fetchedArt = true;
}
else if (item->HasPictureInfoTag() && !item->HasArt("thumb"))
- item->SetArt("thumb", CTextureCache::GetWrappedThumbURL(item->GetPath()));
+ item->SetArt("thumb", CTextureUtils::GetWrappedThumbURL(item->GetPath()));
if (item->HasArt("thumb"))
- result["thumbnail"] = CTextureCache::GetWrappedImageURL(item->GetArt("thumb"));
+ result["thumbnail"] = CTextureUtils::GetWrappedImageURL(item->GetArt("thumb"));
else
result["thumbnail"] = "";
}
if (item->HasArt("fanart"))
- result["fanart"] = CTextureCache::GetWrappedImageURL(item->GetArt("fanart"));
+ result["fanart"] = CTextureUtils::GetWrappedImageURL(item->GetArt("fanart"));
else
result["fanart"] = "";
#include "JSONRPC.h"
#include "ServiceDescription.h"
+#include "dbwrappers/DatabaseQuery.h"
#include "input/ButtonTranslator.h"
#include "interfaces/AnnouncementManager.h"
#include "playlists/SmartPlayList.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "utils/Variant.h"
+#include "TextureDatabase.h"
using namespace ANNOUNCEMENT;
using namespace JSONRPC;
// filter-related enums
vector<string> smartplaylistList;
- CSmartPlaylist::GetAvailableOperators(smartplaylistList);
+ CDatabaseQueryRule::GetAvailableOperators(smartplaylistList);
CJSONServiceDescription::AddEnum("List.Filter.Operators", smartplaylistList);
smartplaylistList.clear();
CSmartPlaylist::GetAvailableFields("songs", smartplaylistList);
CJSONServiceDescription::AddEnum("List.Filter.Fields.Songs", smartplaylistList);
+ smartplaylistList.clear();
+ CTextureRule::GetAvailableFields(smartplaylistList);
+ CJSONServiceDescription::AddEnum("List.Filter.Fields.Textures", smartplaylistList);
+
unsigned int size = sizeof(JSONRPC_SERVICE_TYPES) / sizeof(char*);
for (unsigned int index = 0; index < size; index++)
#include "PVROperations.h"
#include "ProfilesOperations.h"
#include "FavouritesOperations.h"
+#include "TextureOperations.h"
using namespace std;
using namespace JSONRPC;
{ "VideoLibrary.GetTVShows", CVideoLibrary::GetTVShows },
{ "VideoLibrary.GetTVShowDetails", CVideoLibrary::GetTVShowDetails },
{ "VideoLibrary.GetSeasons", CVideoLibrary::GetSeasons },
+ { "VideoLibrary.GetSeasonDetails", CVideoLibrary::GetSeasonDetails },
{ "VideoLibrary.GetEpisodes", CVideoLibrary::GetEpisodes },
{ "VideoLibrary.GetEpisodeDetails", CVideoLibrary::GetEpisodeDetails },
{ "VideoLibrary.GetMusicVideos", CVideoLibrary::GetMusicVideos },
{ "VideoLibrary.GetRecentlyAddedMusicVideos", CVideoLibrary::GetRecentlyAddedMusicVideos },
{ "VideoLibrary.SetMovieDetails", CVideoLibrary::SetMovieDetails },
{ "VideoLibrary.SetTVShowDetails", CVideoLibrary::SetTVShowDetails },
+ { "VideoLibrary.SetSeasonDetails", CVideoLibrary::SetSeasonDetails },
{ "VideoLibrary.SetEpisodeDetails", CVideoLibrary::SetEpisodeDetails },
{ "VideoLibrary.SetMusicVideoDetails", CVideoLibrary::SetMusicVideoDetails },
{ "VideoLibrary.RemoveMovie", CVideoLibrary::RemoveMovie },
{ "Favourites.GetFavourites", CFavouritesOperations::GetFavourites },
{ "Favourites.AddFavourite", CFavouritesOperations::AddFavourite },
+// Textures operations
+ { "Textures.GetTextures", CTextureOperations::GetTextures },
+ { "Textures.RemoveTexture", CTextureOperations::RemoveTexture },
+
// XBMC operations
{ "XBMC.GetInfoLabels", CXBMCOperations::GetInfoLabels },
{ "XBMC.GetInfoBooleans", CXBMCOperations::GetInfoBooleans }
ProfilesOperations.cpp \
PVROperations.cpp \
SystemOperations.cpp \
+ TextureOperations.cpp \
VideoLibrary.cpp \
XBMCOperations.cpp \
return OK;
}
-bool CPlaylistOperations::CheckMediaParameter(int playlist, const CVariant ¶meterObject)
+bool CPlaylistOperations::CheckMediaParameter(int playlist, const CVariant &itemObject)
{
- if (parameterObject["item"].isMember("media") && parameterObject["item"]["media"].asString().compare("files") != 0)
+ if (itemObject.isMember("media") && itemObject["media"].asString().compare("files") != 0)
{
- if (playlist == PLAYLIST_VIDEO && parameterObject["item"]["media"].asString().compare("video") != 0)
+ if (playlist == PLAYLIST_VIDEO && itemObject["media"].asString().compare("video") != 0)
return false;
- if (playlist == PLAYLIST_MUSIC && parameterObject["item"]["media"].asString().compare("music") != 0)
+ if (playlist == PLAYLIST_MUSIC && itemObject["media"].asString().compare("music") != 0)
return false;
- if (playlist == PLAYLIST_PICTURE && parameterObject["item"]["media"].asString().compare("video") != 0 && parameterObject["item"]["media"].asString().compare("pictures") != 0)
+ if (playlist == PLAYLIST_PICTURE && itemObject["media"].asString().compare("video") != 0 && itemObject["media"].asString().compare("pictures") != 0)
return false;
}
return true;
JSONRPC_STATUS CPlaylistOperations::Add(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
{
int playlist = GetPlaylist(parameterObject["playlistid"]);
- CFileItemList list;
- CVariant params = parameterObject;
- if (!CheckMediaParameter(playlist, parameterObject))
+ CGUIWindowSlideShow *slideshow = NULL;
+ if (playlist == PLAYLIST_PICTURE)
+ {
+ slideshow = (CGUIWindowSlideShow*)g_windowManager.GetWindow(WINDOW_SLIDESHOW);
+ if (slideshow == NULL)
+ return FailedToExecute;
+ }
+
+ CFileItemList list;
+ if (!HandleItemsParameter(playlist, parameterObject["item"], list))
return InvalidParams;
- CGUIWindowSlideShow *slideshow = NULL;
switch (playlist)
{
case PLAYLIST_VIDEO:
case PLAYLIST_MUSIC:
- if (playlist == PLAYLIST_VIDEO)
- params["item"]["media"] = "video";
- else if (playlist == PLAYLIST_MUSIC)
- params["item"]["media"] = "music";
-
- if (!FillFileItemList(params["item"], list))
- return InvalidParams;
-
CApplicationMessenger::Get().PlayListPlayerAdd(playlist, list);
-
break;
case PLAYLIST_PICTURE:
- slideshow = (CGUIWindowSlideShow*)g_windowManager.GetWindow(WINDOW_SLIDESHOW);
- if (!slideshow)
- return FailedToExecute;
- if (!parameterObject["item"].isMember("media"))
- params["item"]["media"] = "pictures";
- if (!FillFileItemList(params["item"], list))
- return InvalidParams;
-
for (int index = 0; index < list.Size(); index++)
{
CPictureInfoTag picture = CPictureInfoTag();
slideshow->Add(list[index].get());
}
break;
+
+ default:
+ return InvalidParams;
}
NotifyAll();
if (playlist == PLAYLIST_PICTURE)
return FailedToExecute;
- if (!CheckMediaParameter(playlist, parameterObject))
- return InvalidParams;
-
CFileItemList list;
- CVariant params = parameterObject;
- if (playlist == PLAYLIST_VIDEO)
- params["item"]["media"] = "video";
- else if (playlist == PLAYLIST_MUSIC)
- params["item"]["media"] = "music";
- else
- return FailedToExecute;
-
- if (!FillFileItemList(params["item"], list))
+ if (!HandleItemsParameter(playlist, parameterObject["item"], list))
return InvalidParams;
CApplicationMessenger::Get().PlayListPlayerInsert(GetPlaylist(parameterObject["playlistid"]), list, (int)parameterObject["position"].asInteger());
return OK;
}
+
+bool CPlaylistOperations::HandleItemsParameter(int playlistid, const CVariant &itemParam, CFileItemList &items)
+{
+ vector<CVariant> vecItems;
+ if (itemParam.isArray())
+ vecItems.assign(itemParam.begin_array(), itemParam.end_array());
+ else
+ vecItems.push_back(itemParam);
+
+ bool success = false;
+ for (vector<CVariant>::iterator itemIt = vecItems.begin(); itemIt != vecItems.end(); ++itemIt)
+ {
+ if (!CheckMediaParameter(playlistid, *itemIt))
+ continue;
+
+ switch (playlistid)
+ {
+ case PLAYLIST_VIDEO:
+ (*itemIt)["media"] = "video";
+ break;
+ case PLAYLIST_MUSIC:
+ (*itemIt)["media"] = "music";
+ break;
+ case PLAYLIST_PICTURE:
+ (*itemIt)["media"] = "pictures";
+ break;
+ }
+
+ success |= FillFileItemList(*itemIt, items);
+ }
+
+ return success;
+}
#include "utils/StdString.h"
#include "JSONRPC.h"
#include "FileItemHandler.h"
+#include "FileItem.h"
namespace JSONRPC
{
static int GetPlaylist(const CVariant &playlist);
static inline void NotifyAll();
static JSONRPC_STATUS GetPropertyValue(int playlist, const CStdString &property, CVariant &result);
- static bool CheckMediaParameter(int playlist, const CVariant ¶meterObject);
+ static bool CheckMediaParameter(int playlist, const CVariant &itemObject);
+ static bool HandleItemsParameter(int playlistid, const CVariant &itemParam, CFileItemList &items);
};
}
namespace JSONRPC
{
const char* const JSONRPC_SERVICE_ID = "http://xbmc.org/jsonrpc/ServiceDescription.json";
- const char* const JSONRPC_SERVICE_VERSION = "6.8.0";
+ const char* const JSONRPC_SERVICE_VERSION = "6.11.0";
const char* const JSONRPC_SERVICE_DESCRIPTION = "JSON-RPC API of XBMC";
const char* const JSONRPC_SERVICE_TYPES[] = {
"},"
"\"additionalProperties\": { \"$ref\": \"Global.String.NotEmpty\" }"
"}",
+ "\"Media.Artwork.Set\": {"
+ "\"type\": \"object\","
+ "\"properties\": {"
+ "\"thumb\": { \"type\": [ \"null\", { \"$ref\": \"Global.String.NotEmpty\", \"required\": true } ], \"default\": \"\" },"
+ "\"poster\": { \"type\": [ \"null\", { \"$ref\": \"Global.String.NotEmpty\", \"required\": true } ], \"default\": \"\" },"
+ "\"banner\": { \"type\": [ \"null\", { \"$ref\": \"Global.String.NotEmpty\", \"required\": true } ], \"default\": \"\" },"
+ "\"fanart\": { \"type\": [ \"null\", { \"$ref\": \"Global.String.NotEmpty\", \"required\": true } ], \"default\": \"\" }"
+ "},"
+ "\"additionalProperties\": { \"type\": [ \"null\", { \"$ref\": \"Global.String.NotEmpty\", \"required\": true } ] }"
+ "}",
"\"Library.Fields.Genre\": {"
"\"extends\": \"Item.Fields.Base\","
"\"items\": { \"type\": \"string\", \"enum\": [ \"title\", \"thumbnail\" ] }"
"\"Video.Details.Season\": {"
"\"extends\": \"Video.Details.Base\","
"\"properties\": {"
+ "\"seasonid\": { \"$ref\": \"Library.Id\", \"required\": true },"
"\"season\": { \"type\": \"integer\", \"required\": true },"
"\"showtitle\": { \"type\": \"string\" },"
"\"episode\": { \"type\": \"integer\" },"
"\"broadcastid\": { \"$ref\": \"Library.Id\", \"required\": true },"
"\"title\": { \"type\": \"string\" },"
"\"plot\": { \"type\": \"string\" },"
- "\"plotoutline\": { \"type\": \"string\" },"
- "\"start\": { \"type\": \"string\" },"
- "\"end\": { \"type\": \"string\" },"
- "\"duration\": { \"type\": \"integer\" },"
- "\"progress\": { \"type\": \"integer\" },"
- "\"progresspercentage\": { \"type\": \"number\" },"
- "\"path\": { \"type\": \"string\" },"
- "\"genre\": { \"type\": \"string\" },"
- "\"episodename\": { \"type\": \"string\" },"
- "\"episodenum\": { \"type\": \"integer\" },"
- "\"episodepart\": { \"type\": \"integer\" },"
- "\"firstaired\": { \"type\": \"string\" },"
- "\"hastimer\": { \"type\": \"boolean\" },"
- "\"isactive\": { \"type\": \"boolean\" },"
- "\"parentalrating\": { \"type\": \"integer\" },"
- "\"wasactive\": { \"type\": \"boolean\" },"
+ "\"plotoutline\": { \"type\": \"string\" },"
+ "\"starttime\": { \"type\": \"string\" },"
+ "\"endtime\": { \"type\": \"string\" },"
+ "\"runtime\": { \"type\": \"integer\" },"
+ "\"progress\": { \"type\": \"integer\" },"
+ "\"progresspercentage\": { \"type\": \"number\" },"
+ "\"genre\": { \"type\": \"string\" },"
+ "\"episodename\": { \"type\": \"string\" },"
+ "\"episodenum\": { \"type\": \"integer\" },"
+ "\"episodepart\": { \"type\": \"integer\" },"
+ "\"firstaired\": { \"type\": \"string\" },"
+ "\"hastimer\": { \"type\": \"boolean\" },"
+ "\"isactive\": { \"type\": \"boolean\" },"
+ "\"rating\": { \"type\": \"integer\" },"
+ "\"wasactive\": { \"type\": \"boolean\" },"
"\"thumbnail\": { \"type\": \"string\" }"
"}"
"}",
+ "\"Textures.Details.Size\": {"
+ "\"type\": \"object\","
+ "\"properties\": {"
+ "\"size\": { \"type\": \"integer\", \"description\": \"Size of the texture (1 == largest)\" },"
+ "\"width\": { \"type\": \"integer\", \"description\": \"Width of texture\" },"
+ "\"height\": { \"type\": \"integer\", \"description\": \"Height of texture\" },"
+ "\"usecount\": { \"type\": \"integer\", \"description\": \"Number of uses\" },"
+ "\"lastused\": { \"type\": \"string\", \"description\": \"Date of last use\" }"
+ "}"
+ "}",
+ "\"Textures.Fields.Texture\": {"
+ "\"extends\": \"Item.Fields.Base\","
+ "\"items\": { \"type\": \"string\","
+ "\"enum\": [ \"url\", \"cachedurl\", \"lasthashcheck\", \"imagehash\", \"sizes\" ]"
+ "}"
+ "}",
+ "\"Textures.Details.Texture\": {"
+ "\"type\": \"object\","
+ "\"properties\": {"
+ "\"textureid\": { \"$ref\": \"Library.Id\", \"required\": \"true\" },"
+ "\"url\": { \"type\": \"string\", \"description\": \"Original source URL\" },"
+ "\"cachedurl\": { \"type\": \"string\", \"description\": \"Cached URL on disk\" },"
+ "\"lasthashcheck\": { \"type\": \"string\", \"description\": \"Last time source was checked for changes\" },"
+ "\"imagehash\": { \"type\": \"string\", \"description\": \"Hash of image\" },"
+ "\"sizes\": { \"type\": \"array\", \"items\": { \"$ref\": \"Textures.Details.Size\" } }"
+ "}"
+ "}",
"\"Profiles.Password\": {"
"\"type\": \"object\","
"\"properties\": {"
"\"field\": { \"$ref\": \"List.Filter.Fields.Songs\", \"required\": true }"
"}"
"}",
+ "\"List.Filter.Rule.Textures\": {"
+ "\"extends\": \"List.Filter.Rule\","
+ "\"properties\": {"
+ "\"field\": { \"$ref\": \"List.Filter.Fields.Textures\", \"required\": true }"
+ "}"
+ "}",
"\"List.Filter.Movies\": {"
"\"type\": ["
"{ \"type\": \"object\","
"{ \"$ref\": \"List.Filter.Rule.Songs\" }"
"]"
"}",
+ "\"List.Filter.Textures\": {"
+ "\"type\": ["
+ "{ \"type\": \"object\","
+ "\"properties\": {"
+ "\"and\": { \"type\": \"array\","
+ "\"items\": { \"$ref\": \"List.Filter.Textures\" },"
+ "\"minItems\": 1, \"required\": true"
+ "}"
+ "}"
+ "},"
+ "{ \"type\": \"object\","
+ "\"properties\": {"
+ "\"or\": { \"type\": \"array\","
+ "\"items\": { \"$ref\": \"List.Filter.Textures\" },"
+ "\"minItems\": 1, \"required\": true"
+ "}"
+ "}"
+ "},"
+ "{ \"$ref\": \"List.Filter.Rule.Textures\" }"
+ "]"
+ "}",
"\"List.Item.Base\": {"
"\"extends\": [ \"Video.Details.File\", \"Audio.Details.Media\" ],"
"\"properties\": {"
"}",
"\"Favourite.Details.Favourite\": {"
"\"type\": \"object\","
- "\"properties\": {"
- "\"title\": { \"type\": \"string\", \"required\": true },"
- "\"type\": { \"$ref\": \"Favourite.Type\", \"required\": true },"
- "\"path\": { \"type\": \"string\" },"
- "\"window\": { \"type\": \"string\" },"
- "\"windowparameter\": { \"type\": \"string\" },"
- "\"thumbnail\": { \"type\": \"string\" }"
- "},"
- "\"additionalProperties\": false"
- "}"
+ "\"properties\": {"
+ "\"title\": { \"type\": \"string\", \"required\": true },"
+ "\"type\": { \"$ref\": \"Favourite.Type\", \"required\": true },"
+ "\"path\": { \"type\": \"string\" },"
+ "\"window\": { \"type\": \"string\" },"
+ "\"windowparameter\": { \"type\": \"string\" },"
+ "\"thumbnail\": { \"type\": \"string\" }"
+ "},"
+ "\"additionalProperties\": false"
+ "}"
};
const char* const JSONRPC_SERVICE_METHODS[] = {
"\"permission\": \"ControlPlayback\","
"\"params\": ["
"{ \"name\": \"playlistid\", \"$ref\": \"Playlist.Id\", \"required\": true },"
- "{ \"name\": \"item\", \"$ref\": \"Playlist.Item\", \"required\": true }"
+ "{ \"name\": \"item\","
+ "\"type\": ["
+ "{ \"$ref\": \"Playlist.Item\", \"required\": true },"
+ "{ \"type\": \"array\", \"items\": { \"$ref\": \"Playlist.Item\" }, \"required\": true }"
+ "],"
+ "\"required\": true }"
"],"
"\"returns\": \"string\""
"}",
"\"params\": ["
"{ \"name\": \"playlistid\", \"$ref\": \"Playlist.Id\", \"required\": true },"
"{ \"name\": \"position\", \"$ref\": \"Playlist.Position\", \"required\": true },"
- "{ \"name\": \"item\", \"$ref\": \"Playlist.Item\", \"required\": true }"
+ "{ \"name\": \"item\","
+ "\"type\": ["
+ "{ \"$ref\": \"Playlist.Item\", \"required\": true },"
+ "{ \"type\": \"array\", \"items\": { \"$ref\": \"Playlist.Item\" }, \"required\": true }"
+ "],"
+ "\"required\": true }"
"],"
"\"returns\": \"string\""
"}",
"}"
"}"
"}",
+ "\"VideoLibrary.GetSeasonDetails\": {"
+ "\"type\": \"method\","
+ "\"description\": \"Retrieve details about a specific tv show season\","
+ "\"transport\": \"Response\","
+ "\"permission\": \"ReadData\","
+ "\"params\": ["
+ "{ \"name\": \"seasonid\", \"$ref\": \"Library.Id\", \"required\": true },"
+ "{ \"name\": \"properties\", \"$ref\": \"Video.Fields.Season\" }"
+ "],"
+ "\"returns\": { \"type\": \"object\","
+ "\"properties\": {"
+ "\"seasondetails\": { \"$ref\": \"Video.Details.Season\" }"
+ "}"
+ "}"
+ "}",
"\"VideoLibrary.GetEpisodes\": {"
"\"type\": \"method\","
"\"description\": \"Retrieve all tv show episodes\","
"{ \"name\": \"thumbnail\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"fanart\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"tag\", \"type\": [ \"null\", { \"$ref\": \"Array.String\", \"required\": true } ], \"default\": null },"
- "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork\", \"required\": true } ], \"default\": null },"
+ "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork.Set\", \"required\": true } ], \"default\": null },"
"{ \"name\": \"resume\", \"type\": [ \"null\", { \"$ref\": \"Video.Resume\", \"required\": true } ], \"default\": null }"
"],"
"\"returns\": \"string\""
"{ \"name\": \"thumbnail\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"fanart\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"tag\", \"type\": [ \"null\", { \"$ref\": \"Array.String\", \"required\": true } ], \"default\": null },"
- "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork\", \"required\": true } ], \"default\": null }"
+ "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork.Set\", \"required\": true } ], \"default\": null }"
+ "],"
+ "\"returns\": \"string\""
+ "}",
+ "\"VideoLibrary.SetSeasonDetails\": {"
+ "\"type\": \"method\","
+ "\"description\": \"Update the given season with the given details\","
+ "\"transport\": \"Response\","
+ "\"permission\": \"UpdateData\","
+ "\"params\": ["
+ "{ \"name\": \"seasonid\", \"$ref\": \"Library.Id\", \"required\": true },"
+ "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork.Set\", \"required\": true } ], \"default\": null }"
"],"
"\"returns\": \"string\""
"}",
"{ \"name\": \"originaltitle\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"thumbnail\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"fanart\", \"$ref\": \"Optional.String\" },"
- "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork\", \"required\": true } ], \"default\": null },"
+ "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork.Set\", \"required\": true } ], \"default\": null },"
"{ \"name\": \"resume\", \"type\": [ \"null\", { \"$ref\": \"Video.Resume\", \"required\": true } ], \"default\": null }"
"],"
"\"returns\": \"string\""
"{ \"name\": \"thumbnail\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"fanart\", \"$ref\": \"Optional.String\" },"
"{ \"name\": \"tag\", \"type\": [ \"null\", { \"$ref\": \"Array.String\", \"required\": true } ], \"default\": null },"
- "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork\", \"required\": true } ], \"default\": null },"
+ "{ \"name\": \"art\", \"type\": [ \"null\", { \"$ref\": \"Media.Artwork.Set\", \"required\": true } ], \"default\": null },"
"{ \"name\": \"resume\", \"type\": [ \"null\", { \"$ref\": \"Video.Resume\", \"required\": true } ], \"default\": null }"
"],"
"\"returns\": \"string\""
"\"permission\": \"ReadData\","
"\"params\": ["
"{ \"name\": \"channelid\", \"$ref\": \"Library.Id\", \"required\": true },"
- "{ \"name\": \"properties\", \"$ref\": \"PVR.Fields.Broadcast\" },"
- "{ \"name\": \"limits\", \"$ref\": \"List.Limits\" }"
- "],"
+ "{ \"name\": \"properties\", \"$ref\": \"PVR.Fields.Broadcast\" },"
+ "{ \"name\": \"limits\", \"$ref\": \"List.Limits\" }"
+ "],"
"\"returns\": { \"type\": \"object\","
"\"properties\": {"
"\"limits\": { \"$ref\": \"List.LimitsReturned\", \"required\": true },"
"\"params\": [ ],"
"\"returns\": \"string\""
"}",
+ "\"Textures.GetTextures\": {"
+ "\"type\": \"method\","
+ "\"description\": \"Retrieve all textures\","
+ "\"transport\": \"Response\","
+ "\"permission\": \"ReadData\","
+ "\"params\": ["
+ "{ \"name\": \"properties\", \"$ref\": \"Textures.Fields.Texture\" },"
+ "{ \"name\": \"filter\", \"$ref\": \"List.Filter.Textures\" }"
+ "],"
+ "\"returns\": {"
+ "\"type\": \"object\","
+ "\"properties\": {"
+ "\"textures\": { \"type\": \"array\", \"required\": true,"
+ "\"items\": { \"$ref\": \"Textures.Details.Texture\" }"
+ "}"
+ "}"
+ "}"
+ "}",
+ "\"Textures.RemoveTexture\": {"
+ "\"type\": \"method\","
+ "\"description\": \"Remove the specified texture\","
+ "\"transport\": \"Response\","
+ "\"permission\": \"RemoveData\","
+ "\"params\": ["
+ "{ \"name\": \"textureid\", \"$ref\": \"Library.Id\", \"required\": true, \"description\": \"Texture database identifier\" }"
+ "],"
+ "\"returns\": \"string\""
+ "}",
"\"Profiles.GetProfiles\": {"
"\"type\": \"method\","
"\"description\": \"Retrieve all profiles\","
--- /dev/null
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "TextureOperations.h"
+#include "TextureDatabase.h"
+#include "TextureCache.h"
+
+using namespace JSONRPC;
+
+JSONRPC_STATUS CTextureOperations::GetTextures(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
+{
+ CFileItemList listItems;
+
+ CTextureDatabase db;
+ if (!db.Open())
+ return InternalError;
+
+ CDatabase::Filter dbFilter;
+ const CVariant &filter = parameterObject["filter"];
+ if (filter.isObject())
+ {
+ CVariant xspObj(CVariant::VariantTypeObject);
+
+ if (filter.isMember("field"))
+ {
+ xspObj["and"] = CVariant(CVariant::VariantTypeArray);
+ xspObj["and"].push_back(filter);
+ }
+ else
+ xspObj = filter;
+
+ // decipher the rules
+ CDatabaseQueryRuleCombination rule;
+ if (!rule.Load(xspObj, &db))
+ return InvalidParams;
+
+ dbFilter.AppendWhere(rule.GetWhereClause(db, ""));
+ }
+
+ // fetch textures from the database
+ CVariant items = CVariant(CVariant::VariantTypeArray);
+ if (!db.GetTextures(items, dbFilter))
+ return InternalError;
+
+ // return only what was asked for, plus textureid
+ CVariant prop = parameterObject["properties"];
+ prop.push_back("textureid");
+ if (!items.empty() && prop.isArray())
+ {
+ std::set<std::string> fields;
+ CVariant &item = items[0];
+ for (CVariant::const_iterator_map field = item.begin_map(); field != item.end_map(); ++field)
+ {
+ if (std::find(prop.begin_array(), prop.end_array(), field->first) == prop.end_array())
+ fields.insert(field->first);
+ }
+ // erase these fields
+ for (CVariant::iterator_array item = items.begin_array(); item != items.end_array(); ++item)
+ {
+ for (std::set<std::string>::const_iterator i = fields.begin(); i != fields.end(); ++i)
+ item->erase(*i);
+ }
+ if (fields.find("url") == fields.end())
+ {
+ // wrap cached url to something retrieval from Files.GetFiles()
+ for (CVariant::iterator_array item = items.begin_array(); item != items.end_array(); ++item)
+ {
+ CVariant &cachedUrl = (*item)["url"];
+ cachedUrl = CTextureUtils::GetWrappedImageURL(cachedUrl.asString());
+ }
+ }
+ }
+
+ result["textures"] = items;
+ return OK;
+}
+
+JSONRPC_STATUS CTextureOperations::RemoveTexture(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
+{
+ int id = (int)parameterObject["textureid"].asInteger();
+
+ if (!CTextureCache::Get().ClearCachedImage(id))
+ return InvalidParams;
+
+ return ACK;
+}
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "utils/StdString.h"
+#include "JSONRPC.h"
+
+namespace JSONRPC
+{
+ class CTextureOperations
+ {
+ public:
+ static JSONRPC_STATUS GetTextures(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
+ static JSONRPC_STATUS RemoveTexture(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
+ };
+}
#include "VideoLibrary.h"
#include "ApplicationMessenger.h"
-#include "TextureCache.h"
+#include "TextureDatabase.h"
#include "Util.h"
#include "utils/StringUtils.h"
#include "utils/URIUtils.h"
if (!videodatabase.GetSeasonsNav(strPath, items, -1, -1, -1, -1, tvshowID, false))
return InternalError;
- HandleFileItemList(NULL, false, "seasons", items, parameterObject, result);
+ HandleFileItemList("seasonid", false, "seasons", items, parameterObject, result);
+ return OK;
+}
+
+JSONRPC_STATUS CVideoLibrary::GetSeasonDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
+{
+ CVideoDatabase videodatabase;
+ if (!videodatabase.Open())
+ return InternalError;
+
+ int id = (int)parameterObject["seasonid"].asInteger();
+
+ CVideoInfoTag infos;
+ if (!videodatabase.GetSeasonInfo(id, infos) ||
+ infos.m_iDbId <= 0 || infos.m_iIdShow <= 0)
+ return InvalidParams;
+
+ CFileItemPtr pItem = CFileItemPtr(new CFileItem(infos));
+ HandleFileItem("seasonid", false, "seasondetails", pItem, parameterObject, parameterObject["properties"], result, false);
return OK;
}
int playcount = infos.m_playCount;
CDateTime lastPlayed = infos.m_lastPlayed;
- UpdateVideoTag(parameterObject, infos, artwork);
+ std::set<std::string> removedArtwork;
+ UpdateVideoTag(parameterObject, infos, artwork, removedArtwork);
// we need to manually remove tags/taglinks for now because they aren't replaced
// due to scrapers not supporting them
if (videodatabase.SetDetailsForMovie(infos.m_strFileNameAndPath, infos, artwork, id) <= 0)
return InternalError;
+ if (!videodatabase.RemoveArtForItem(infos.m_iDbId, "movie", removedArtwork))
+ return InternalError;
+
if (playcount != infos.m_playCount || lastPlayed != infos.m_lastPlayed)
{
// restore original playcount or the new one won't be announced
int playcount = infos.m_playCount;
CDateTime lastPlayed = infos.m_lastPlayed;
- UpdateVideoTag(parameterObject, infos, artwork);
+ std::set<std::string> removedArtwork;
+ UpdateVideoTag(parameterObject, infos, artwork, removedArtwork);
// we need to manually remove tags/taglinks for now because they aren't replaced
// due to scrapers not supporting them
if (videodatabase.SetDetailsForTvShow(infos.m_strFileNameAndPath, infos, artwork, seasonArt, id) <= 0)
return InternalError;
+ if (!videodatabase.RemoveArtForItem(infos.m_iDbId, "tvshow", removedArtwork))
+ return InternalError;
+
if (playcount != infos.m_playCount || lastPlayed != infos.m_lastPlayed)
{
// restore original playcount or the new one won't be announced
return ACK;
}
+JSONRPC_STATUS CVideoLibrary::SetSeasonDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
+{
+ int id = (int)parameterObject["seasonid"].asInteger();
+
+ CVideoDatabase videodatabase;
+ if (!videodatabase.Open())
+ return InternalError;
+
+ CVideoInfoTag infos;
+ videodatabase.GetSeasonInfo(id, infos);
+ if (infos.m_iDbId <= 0 || infos.m_iIdShow <= 0)
+ {
+ videodatabase.Close();
+ return InvalidParams;
+ }
+
+ // get artwork
+ std::map<std::string, std::string> artwork;
+ videodatabase.GetArtForItem(infos.m_iDbId, infos.m_type, artwork);
+
+ std::set<std::string> removedArtwork;
+ UpdateVideoTag(parameterObject, infos, artwork, removedArtwork);
+
+ if (videodatabase.SetDetailsForSeason(infos, artwork, infos.m_iIdShow, id) <= 0)
+ return InternalError;
+
+ if (!videodatabase.RemoveArtForItem(infos.m_iDbId, "season", removedArtwork))
+ return InternalError;
+
+ CJSONRPCUtils::NotifyItemUpdated();
+ return ACK;
+}
+
JSONRPC_STATUS CVideoLibrary::SetEpisodeDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
{
int id = (int)parameterObject["episodeid"].asInteger();
int playcount = infos.m_playCount;
CDateTime lastPlayed = infos.m_lastPlayed;
- UpdateVideoTag(parameterObject, infos, artwork);
+ std::set<std::string> removedArtwork;
+ UpdateVideoTag(parameterObject, infos, artwork, removedArtwork);
if (videodatabase.SetDetailsForEpisode(infos.m_strFileNameAndPath, infos, artwork, tvshowid, id) <= 0)
return InternalError;
+ if (!videodatabase.RemoveArtForItem(infos.m_iDbId, "episode", removedArtwork))
+ return InternalError;
+
if (playcount != infos.m_playCount || lastPlayed != infos.m_lastPlayed)
{
// restore original playcount or the new one won't be announced
int playcount = infos.m_playCount;
CDateTime lastPlayed = infos.m_lastPlayed;
- UpdateVideoTag(parameterObject, infos, artwork);
+ std::set<std::string> removedArtwork;
+ UpdateVideoTag(parameterObject, infos, artwork, removedArtwork);
// we need to manually remove tags/taglinks for now because they aren't replaced
// due to scrapers not supporting them
if (videodatabase.SetDetailsForMusicVideo(infos.m_strFileNameAndPath, infos, artwork, id) <= 0)
return InternalError;
+ if (!videodatabase.RemoveArtForItem(infos.m_iDbId, "musicvideo", removedArtwork))
+ return InternalError;
+
if (playcount != infos.m_playCount || lastPlayed != infos.m_lastPlayed)
{
// restore original playcount or the new one won't be announced
}
}
-void CVideoLibrary::UpdateVideoTag(const CVariant ¶meterObject, CVideoInfoTag& details, std::map<std::string, std::string> &artwork)
+void CVideoLibrary::UpdateVideoTag(const CVariant ¶meterObject, CVideoInfoTag& details, std::map<std::string, std::string> &artwork, std::set<std::string> &removedArtwork)
{
if (ParameterNotNull(parameterObject, "title"))
details.m_strTitle = parameterObject["title"].asString();
CVariant art = parameterObject["art"];
for (CVariant::const_iterator_map artIt = art.begin_map(); artIt != art.end_map(); artIt++)
{
- if (!artIt->second.asString().empty())
- artwork[artIt->first] = CTextureCache::UnwrapImageURL(artIt->second.asString());
+ if (artIt->second.isString() && !artIt->second.asString().empty())
+ artwork[artIt->first] = CTextureUtils::UnwrapImageURL(artIt->second.asString());
+ else if (artIt->second.isNull())
+ {
+ artwork.erase(artIt->first);
+ removedArtwork.insert(artIt->first);
+ }
}
}
}
static JSONRPC_STATUS GetTVShows(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS GetTVShowDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS GetSeasons(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
+ static JSONRPC_STATUS GetSeasonDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS GetEpisodes(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS GetEpisodeDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS SetMovieDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS SetTVShowDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
+ static JSONRPC_STATUS SetSeasonDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS SetEpisodeDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS SetMusicVideoDetails(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result);
static JSONRPC_STATUS GetAdditionalEpisodeDetails(const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase, bool limit = true);
static JSONRPC_STATUS GetAdditionalMusicVideoDetails(const CVariant ¶meterObject, CFileItemList &items, CVariant &result, CVideoDatabase &videodatabase, bool limit = true);
static JSONRPC_STATUS RemoveVideo(const CVariant ¶meterObject);
- static void UpdateVideoTag(const CVariant ¶meterObject, CVideoInfoTag &details, std::map<std::string, std::string> &artwork);
+ static void UpdateVideoTag(const CVariant ¶meterObject, CVideoInfoTag &details, std::map<std::string, std::string> &artwork, std::set<std::string> &removedArtwork);
static void UpdateResumePoint(const CVariant ¶meterObject, CVideoInfoTag &details, CVideoDatabase &videodatabase);
};
}
"permission": "ControlPlayback",
"params": [
{ "name": "playlistid", "$ref": "Playlist.Id", "required": true },
- { "name": "item", "$ref": "Playlist.Item", "required": true }
+ { "name": "item",
+ "type": [
+ { "$ref": "Playlist.Item", "required": true },
+ { "type": "array", "items": { "$ref": "Playlist.Item" }, "required": true }
+ ],
+ "required": true }
],
"returns": "string"
},
"params": [
{ "name": "playlistid", "$ref": "Playlist.Id", "required": true },
{ "name": "position", "$ref": "Playlist.Position", "required": true },
- { "name": "item", "$ref": "Playlist.Item", "required": true }
+ { "name": "item",
+ "type": [
+ { "$ref": "Playlist.Item", "required": true },
+ { "type": "array", "items": { "$ref": "Playlist.Item" }, "required": true }
+ ],
+ "required": true }
],
"returns": "string"
},
}
}
},
+ "VideoLibrary.GetSeasonDetails": {
+ "type": "method",
+ "description": "Retrieve details about a specific tv show season",
+ "transport": "Response",
+ "permission": "ReadData",
+ "params": [
+ { "name": "seasonid", "$ref": "Library.Id", "required": true },
+ { "name": "properties", "$ref": "Video.Fields.Season" }
+ ],
+ "returns": { "type": "object",
+ "properties": {
+ "seasondetails": { "$ref": "Video.Details.Season" }
+ }
+ }
+ },
"VideoLibrary.GetEpisodes": {
"type": "method",
"description": "Retrieve all tv show episodes",
{ "name": "thumbnail", "$ref": "Optional.String" },
{ "name": "fanart", "$ref": "Optional.String" },
{ "name": "tag", "type": [ "null", { "$ref": "Array.String", "required": true } ], "default": null },
- { "name": "art", "type": [ "null", { "$ref": "Media.Artwork", "required": true } ], "default": null },
+ { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null },
{ "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null }
],
"returns": "string"
{ "name": "thumbnail", "$ref": "Optional.String" },
{ "name": "fanart", "$ref": "Optional.String" },
{ "name": "tag", "type": [ "null", { "$ref": "Array.String", "required": true } ], "default": null },
- { "name": "art", "type": [ "null", { "$ref": "Media.Artwork", "required": true } ], "default": null }
+ { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null }
+ ],
+ "returns": "string"
+ },
+ "VideoLibrary.SetSeasonDetails": {
+ "type": "method",
+ "description": "Update the given season with the given details",
+ "transport": "Response",
+ "permission": "UpdateData",
+ "params": [
+ { "name": "seasonid", "$ref": "Library.Id", "required": true },
+ { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null }
],
"returns": "string"
},
{ "name": "originaltitle", "$ref": "Optional.String" },
{ "name": "thumbnail", "$ref": "Optional.String" },
{ "name": "fanart", "$ref": "Optional.String" },
- { "name": "art", "type": [ "null", { "$ref": "Media.Artwork", "required": true } ], "default": null },
+ { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null },
{ "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null }
],
"returns": "string"
{ "name": "thumbnail", "$ref": "Optional.String" },
{ "name": "fanart", "$ref": "Optional.String" },
{ "name": "tag", "type": [ "null", { "$ref": "Array.String", "required": true } ], "default": null },
- { "name": "art", "type": [ "null", { "$ref": "Media.Artwork", "required": true } ], "default": null },
+ { "name": "art", "type": [ "null", { "$ref": "Media.Artwork.Set", "required": true } ], "default": null },
{ "name": "resume", "type": [ "null", { "$ref": "Video.Resume", "required": true } ], "default": null }
],
"returns": "string"
"broadcastdetails": { "$ref": "PVR.Details.Broadcast" }
}
}
- },
+ },
"PVR.Record": {
"type": "method",
"description": "Toggle recording of a channel",
"params": [ ],
"returns": "string"
},
+ "Textures.GetTextures": {
+ "type": "method",
+ "description": "Retrieve all textures",
+ "transport": "Response",
+ "permission": "ReadData",
+ "params": [
+ { "name": "properties", "$ref": "Textures.Fields.Texture" },
+ { "name": "filter", "$ref": "List.Filter.Textures" }
+ ],
+ "returns": {
+ "type": "object",
+ "properties": {
+ "textures": { "type": "array", "required": true,
+ "items": { "$ref": "Textures.Details.Texture" }
+ }
+ }
+ }
+ },
+ "Textures.RemoveTexture": {
+ "type": "method",
+ "description": "Remove the specified texture",
+ "transport": "Response",
+ "permission": "RemoveData",
+ "params": [
+ { "name": "textureid", "$ref": "Library.Id", "required": true, "description": "Texture database identifier" }
+ ],
+ "returns": "string"
+ },
"Profiles.GetProfiles": {
"type": "method",
"description": "Retrieve all profiles",
},
"additionalProperties": { "$ref": "Global.String.NotEmpty" }
},
+ "Media.Artwork.Set": {
+ "type": "object",
+ "properties": {
+ "thumb": { "type": [ "null", { "$ref": "Global.String.NotEmpty", "required": true } ], "default": "" },
+ "poster": { "type": [ "null", { "$ref": "Global.String.NotEmpty", "required": true } ], "default": "" },
+ "banner": { "type": [ "null", { "$ref": "Global.String.NotEmpty", "required": true } ], "default": "" },
+ "fanart": { "type": [ "null", { "$ref": "Global.String.NotEmpty", "required": true } ], "default": "" }
+ },
+ "additionalProperties": { "type": [ "null", { "$ref": "Global.String.NotEmpty", "required": true } ] }
+ },
"Library.Fields.Genre": {
"extends": "Item.Fields.Base",
"items": { "type": "string", "enum": [ "title", "thumbnail" ] }
"Video.Details.Season": {
"extends": "Video.Details.Base",
"properties": {
+ "seasonid": { "$ref": "Library.Id", "required": true },
"season": { "type": "integer", "required": true },
"showtitle": { "type": "string" },
"episode": { "type": "integer" },
"wasactive", "thumbnail" ]
}
},
- "PVR.Details.Broadcast": {"
+ "PVR.Details.Broadcast": {
"extends": "Item.Details.Base",
- "properties": {"
+ "properties": {
"broadcastid": { "$ref": "Library.Id", "required": true },
"title": { "type": "string" },
"plot": { "type": "string" },
"thumbnail": { "type": "string" }
}
},
+ "Textures.Details.Size": {
+ "type": "object",
+ "properties": {
+ "size": { "type": "integer", "description": "Size of the texture (1 == largest)" },
+ "width": { "type": "integer", "description": "Width of texture" },
+ "height": { "type": "integer", "description": "Height of texture" },
+ "usecount": { "type": "integer", "description": "Number of uses" },
+ "lastused": { "type": "string", "description": "Date of last use" }
+ }
+ },
+ "Textures.Fields.Texture": {
+ "extends": "Item.Fields.Base",
+ "items": { "type": "string",
+ "enum": [ "url", "cachedurl", "lasthashcheck", "imagehash", "sizes" ]
+ }
+ },
+ "Textures.Details.Texture": {
+ "type": "object",
+ "properties": {
+ "textureid": { "$ref": "Library.Id", "required": "true" },
+ "url": { "type": "string", "description": "Original source URL" },
+ "cachedurl": { "type": "string", "description": "Cached URL on disk" },
+ "lasthashcheck": { "type": "string", "description": "Last time source was checked for changes" },
+ "imagehash": { "type": "string", "description": "Hash of image" },
+ "sizes": { "type": "array", "items": { "$ref": "Textures.Details.Size" } }
+ }
+ },
"Profiles.Password": {
"type": "object",
"properties": {
"field": { "$ref": "List.Filter.Fields.Songs", "required": true }
}
},
+ "List.Filter.Rule.Textures": {
+ "extends": "List.Filter.Rule",
+ "properties": {
+ "field": { "$ref": "List.Filter.Fields.Textures", "required": true }
+ }
+ },
"List.Filter.Movies": {
"type": [
{ "type": "object",
{ "$ref": "List.Filter.Rule.Songs" }
]
},
+ "List.Filter.Textures": {
+ "type": [
+ { "type": "object",
+ "properties": {
+ "and": { "type": "array",
+ "items": { "$ref": "List.Filter.Textures" },
+ "minItems": 1, "required": true
+ }
+ }
+ },
+ { "type": "object",
+ "properties": {
+ "or": { "type": "array",
+ "items": { "$ref": "List.Filter.Textures" },
+ "minItems": 1, "required": true
+ }
+ }
+ },
+ { "$ref": "List.Filter.Rule.Textures" }
+ ]
+ },
"List.Item.Base": {
"extends": [ "Video.Details.File", "Audio.Details.Media" ],
"properties": {
OMX_ERRORTYPE COMXCoreComponent::UseEGLImage(OMX_BUFFERHEADERTYPE** ppBufferHdr, OMX_U32 nPortIndex, OMX_PTR pAppPrivate, void* eglImage)
{
+ OMX_ERRORTYPE omx_err = OMX_ErrorNone;
+
if(!m_handle)
return OMX_ErrorUndefined;
- OMX_ERRORTYPE omx_err;
+ m_omx_output_use_buffers = false;
- omx_err = OMX_UseEGLImage(m_handle, ppBufferHdr, nPortIndex, pAppPrivate, eglImage);
- if(omx_err != OMX_ErrorNone)
+ OMX_PARAM_PORTDEFINITIONTYPE portFormat;
+ OMX_INIT_STRUCTURE(portFormat);
+ portFormat.nPortIndex = m_output_port;
+
+ omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat);
+ if(omx_err != OMX_ErrorNone)
+ return omx_err;
+
+ if(GetState() != OMX_StateIdle)
{
- CLog::Log(LOGERROR, "COMXCoreComponent::UseEGLImage - %s failed with omx_err(0x%x)\n",
+ if(GetState() != OMX_StateLoaded)
+ SetStateForComponent(OMX_StateLoaded);
+
+ SetStateForComponent(OMX_StateIdle);
+ }
+
+ omx_err = EnablePort(m_output_port, false);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - %s EnablePort failed with omx_err(0x%x)", CLASSNAME, __func__,
m_componentName.c_str(), omx_err);
+ return omx_err;
+ }
+
+ m_output_alignment = portFormat.nBufferAlignment;
+ m_output_buffer_count = portFormat.nBufferCountActual;
+ m_output_buffer_size = portFormat.nBufferSize;
+
+ if (portFormat.nBufferCountActual != 1)
+ {
+ CLog::Log(LOGERROR, "%s::%s - %s nBufferCountActual unexpected %d", CLASSNAME, __func__,
+ m_componentName.c_str(), portFormat.nBufferCountActual);
+ return omx_err;
+ }
+
+ CLog::Log(LOGDEBUG, "%s::%s component(%s) - port(%d), nBufferCountMin(%u), nBufferCountActual(%u), nBufferSize(%u) nBufferAlignmen(%u)\n",
+ CLASSNAME, __func__, m_componentName.c_str(), m_output_port, portFormat.nBufferCountMin,
+ portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment);
+
+ for (size_t i = 0; i < portFormat.nBufferCountActual; i++)
+ {
+ omx_err = OMX_UseEGLImage(m_handle, ppBufferHdr, nPortIndex, pAppPrivate, eglImage);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "%s::%s - %s failed with omx_err(0x%x)\n",
+ CLASSNAME, __func__, m_componentName.c_str(), omx_err);
+ return omx_err;
+ }
+
+ OMX_BUFFERHEADERTYPE *buffer = *ppBufferHdr;
+ buffer->nOutputPortIndex = m_output_port;
+ buffer->nFilledLen = 0;
+ buffer->nOffset = 0;
+ buffer->pAppPrivate = (void*)i;
+ m_omx_output_buffers.push_back(buffer);
+ m_omx_output_available.push(buffer);
}
+ omx_err = WaitForCommand(OMX_CommandPortEnable, m_output_port);
+ if(omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, " %s::%s - %s EnablePort failed with omx_err(0x%x)\n",
+ CLASSNAME, __func__, m_componentName.c_str(), omx_err);
+ return omx_err;
+ }
+ m_flush_output = false;
+
return omx_err;
}
#include "utils/log.h"
+#include "cores/omxplayer/OMXImage.h"
+
CRBP::CRBP()
{
m_initialized = false;
if (vc_gencmd(response, sizeof response, "get_mem gpu") == 0)
vc_gencmd_number_property(response, "gpu", &m_gpu_mem);
+ g_OMXImage.Initialize();
+ m_omx_image_init = true;
return true;
}
void CRBP::Deinitialize()
{
+ if (m_omx_image_init)
+ g_OMXImage.Deinitialize();
+
if(m_omx_initialized)
m_OMX->Deinitialize();
if(m_initialized)
m_DllBcmHost->Unload();
+ m_omx_image_init = false;
m_initialized = false;
m_omx_initialized = false;
}
DllBcmHost *m_DllBcmHost;
bool m_initialized;
bool m_omx_initialized;
+ bool m_omx_image_init;
int m_arm_mem;
int m_gpu_mem;
COMXCore *m_OMX;
#include "MusicThumbLoader.h"
#include "FileItem.h"
-#include "TextureCache.h"
+#include "TextureDatabase.h"
#include "music/tags/MusicInfoTag.h"
#include "music/tags/MusicInfoTagLoaderFactory.h"
#include "music/infoscanner/MusicInfoScanner.h"
if (!FillThumb(*pItem, false)) // Check for user thumbs but ignore folder thumbs
{
// No user thumb, use embedded art
- CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "music");
+ CStdString thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "music");
pItem->SetArt("thumb", thumb);
}
}
strItemPath.Format("fanart://Remote%i",i);
CFileItemPtr item(new CFileItem(strItemPath, false));
CStdString thumb = m_artist.fanart.GetPreviewURL(i);
- item->SetArt("thumb", CTextureCache::GetWrappedThumbURL(thumb));
+ item->SetArt("thumb", CTextureUtils::GetWrappedThumbURL(thumb));
item->SetIconImage("DefaultPicture.png");
item->SetLabel(g_localizeStrings.Get(20441));
result.clear();
if (flip && !result.empty())
- result = CTextureCache::GetWrappedImageURL(result, "", "flipped");
+ result = CTextureUtils::GetWrappedImageURL(result, "", "flipped");
// update thumb in the database
CMusicDatabase db;
if (!art->strThumb.empty())
albumArt = art->strThumb;
else
- albumArt = CTextureCache::GetWrappedImageURL(art->strFileName, "music");
+ albumArt = CTextureUtils::GetWrappedImageURL(art->strFileName, "music");
}
if (!albumArt.empty())
for (VECSONGS::iterator k = album.songs.begin(); k != album.songs.end(); ++k)
{
if (k->strThumb.empty() && !k->embeddedArt.empty())
- k->strThumb = CTextureCache::GetWrappedImageURL(k->strFileName, "music");
+ k->strThumb = CTextureUtils::GetWrappedImageURL(k->strFileName, "music");
}
}
}
return bResult;
}
-void CGUIWindowMusicBase::OnPrepareFileItems(CFileItemList &items)
-{
-}
-
bool CGUIWindowMusicBase::CheckFilterAdvanced(CFileItemList &items) const
{
CStdString content = items.GetContent();
void AddItemToPlayList(const CFileItemPtr &pItem, CFileItemList &queuedItems);
virtual void OnScan(int iItem) {};
void OnRipCD();
- virtual void OnPrepareFileItems(CFileItemList &items);
virtual CStdString GetStartFolder(const CStdString &dir);
virtual bool CheckFilterAdvanced(CFileItemList &items) const;
CGUIWindowMusicBase::FrameMove();
}
-void CGUIWindowMusicNav::OnPrepareFileItems(CFileItemList &items)
-{
- CGUIWindowMusicBase::OnPrepareFileItems(items);
-}
-
void CGUIWindowMusicNav::AddSearchFolder()
{
// we use a general viewstate (and not our member) here as our
virtual bool OnAction(const CAction& action);
virtual void FrameMove();
- virtual void OnPrepareFileItems(CFileItemList &items);
protected:
virtual void OnItemLoaded(CFileItem* pItem) {};
// override base class methods
void CGUIWindowMusicPlaylistEditor::OnPrepareFileItems(CFileItemList &items)
{
+ CGUIWindowMusicBase::OnPrepareFileItems(items);
+
RetrieveMusicInfo();
}
void CGUIWindowMusicSongs::OnPrepareFileItems(CFileItemList &items)
{
+ CGUIWindowMusicBase::OnPrepareFileItems(items);
+
RetrieveMusicInfo();
}
#include "video/VideoInfoTag.h"
#include "music/MusicDatabase.h"
#include "music/tags/MusicInfoTag.h"
-#include "TextureCache.h"
+#include "TextureDatabase.h"
#include "ThumbLoader.h"
#include "utils/URIUtils.h"
art.uri = upnp_server->BuildSafeResourceUri(
rooturi,
(*ips.GetFirstItem()).ToString(),
- CTextureCache::GetWrappedImageURL(thumb).c_str());
+ CTextureUtils::GetWrappedImageURL(thumb).c_str());
// Set DLNA profileID by extension, defaulting to JPEG.
if (URIUtils::HasExtension(thumb, ".png")) {
fanart = item.GetArt("fanart");
if (upnp_server && !fanart.empty())
- upnp_server->AddSafeResourceUri(object, rooturi, ips, CTextureCache::GetWrappedImageURL(fanart), "xbmc.org:*:fanart:*");
+ upnp_server->AddSafeResourceUri(object, rooturi, ips, CTextureUtils::GetWrappedImageURL(fanart), "xbmc.org:*:fanart:*");
return object;
#include "pictures/PictureInfoTag.h"
#include "interfaces/AnnouncementManager.h"
#include "settings/Settings.h"
-#include "TextureCache.h"
+#include "TextureDatabase.h"
#include "ThumbLoader.h"
#include "URL.h"
#include "utils/URIUtils.h"
else
thumb = g_infoManager.GetImage(VIDEOPLAYER_COVER, -1);
- thumb = CTextureCache::GetWrappedImageURL(thumb);
+ thumb = CTextureUtils::GetWrappedImageURL(thumb);
NPT_String ip;
if (g_application.getNetwork().GetFirstConnectedInterface()) {
int iMin = currentNode->Attribute("min") ? atoi(currentNode->Attribute("min")) : 0;
int iStep = currentNode->Attribute("step") ? atoi(currentNode->Attribute("step")) : 1;
int iMax = currentNode->Attribute("max") ? atoi(currentNode->Attribute("max")) : 255;
- CStdString strFormat(currentNode->Attribute("format"));
- setting = new CSettingInt(strKey, iLabelId, iValue, iMin, iStep, iMax, strFormat);
+ setting = new CSettingInt(strKey, iLabelId, iValue, iMin, iStep, iMax);
}
else if (strSettingsType.Equals("float"))
{
CSettingInt *intSetting = (CSettingInt *) setting;
if (intSetting)
{
- if (intSetting->GetControl().GetFormat() == SettingControlFormatInteger)
+ if (intSetting->GetControl()->GetFormat() == "integer")
{
m_intSettings.insert(make_pair(CStdString(intSetting->GetId()), (float) intSetting->GetValue()));
AddSlider(m_settingId++, intSetting->GetLabel(), &m_intSettings[intSetting->GetId()], (float)intSetting->GetMinimum(), (float)intSetting->GetStep(), (float)intSetting->GetMaximum(), CGUIDialogVideoSettings::FormatInteger, false);
}
- else if (intSetting->GetControl().GetFormat() == SettingControlFormatString)
+ else if (intSetting->GetControl()->GetFormat() == "string")
{
m_intTextSettings.insert(make_pair(CStdString(intSetting->GetId()), intSetting->GetValue()));
vector<pair<int, int> > entries;
void CGUIWindowPictures::OnPrepareFileItems(CFileItemList& items)
{
+ CGUIMediaWindow::OnPrepareFileItems(items);
+
for (int i=0;i<items.Size();++i )
if (items[i]->GetLabel().Equals("folder.jpg"))
items.Remove(i);
CStdString thumb;
if (pItem->IsPicture() && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && !pItem->IsCBR() && !pItem->IsPlayList())
{ // load the thumb from the image file
- thumb = pItem->HasArt("thumb") ? pItem->GetArt("thumb") : CTextureCache::GetWrappedThumbURL(pItem->GetPath());
+ thumb = pItem->HasArt("thumb") ? pItem->GetArt("thumb") : CTextureUtils::GetWrappedThumbURL(pItem->GetPath());
}
else if (pItem->IsVideo() && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && !pItem->IsCBR() && !pItem->IsPlayList())
{ // video
if (items.Size() < 4 || pItem->IsCBR() || pItem->IsCBZ())
{ // less than 4 items, so just grab the first thumb
items.Sort(SortByLabel, SortOrderAscending);
- CStdString thumb = CTextureCache::GetWrappedThumbURL(items[0]->GetPath());
+ CStdString thumb = CTextureUtils::GetWrappedThumbURL(items[0]->GetPath());
db.SetTextureForPath(pItem->GetPath(), "thumb", thumb);
CTextureCache::Get().BackgroundCacheImage(thumb);
pItem->SetArt("thumb", thumb);
vector<string> files;
for (int thumb = 0; thumb < 4; thumb++)
files.push_back(items[thumb]->GetPath());
- CStdString thumb = CTextureCache::GetWrappedImageURL(pItem->GetPath(), "picturefolder");
+ CStdString thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "picturefolder");
CStdString relativeCacheFile = CTextureCache::GetCacheFile(thumb) + ".png";
if (CPicture::CreateTiledThumb(files, CTextureCache::GetCachedPath(relativeCacheFile)))
{
PlayListURL.cpp \
PlayListWPL.cpp \
PlayListXML.cpp \
- SmartPlayList.cpp
+ SmartPlayList.cpp \
+ SmartPlaylistFileItemListModifier.cpp
LIB=playlists.a
CStdString strPlaylist = strFileName;
size_t maxBandwidth = 0;
+ // first strip off any query string
+ size_t baseEnd = strPlaylist.find('?');
+ if (baseEnd != std::string::npos)
+ strPlaylist = strPlaylist.substr(0, baseEnd);
+
// if we cannot get the last / we wont be able to determine the sub-playlists
- size_t baseEnd = strPlaylist.rfind('/');
+ baseEnd = strPlaylist.rfind('/');
if (baseEnd == std::string::npos)
return strPlaylist;
char string[17];
Field field;
SortBy sort;
- CSmartPlaylistRule::FIELD_TYPE type;
+ CDatabaseQueryRule::FIELD_TYPE type;
StringValidation::Validator validator;
bool browseable;
int localizedString;
} translateField;
static const translateField fields[] = {
- { "none", FieldNone, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 231 },
- { "filename", FieldFilename, SortByFile, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 561 },
- { "path", FieldPath, SortByPath, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 573 },
- { "album", FieldAlbum, SortByAlbum, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 558 },
- { "albumartist", FieldAlbumArtist, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 566 },
- { "artist", FieldArtist, SortByArtist, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 557 },
- { "tracknumber", FieldTrackNumber, SortByTrackNumber, CSmartPlaylistRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 554 },
- { "comment", FieldComment, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 569 },
- { "review", FieldReview, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 183 },
- { "themes", FieldThemes, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21895 },
- { "moods", FieldMoods, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 175 },
- { "styles", FieldStyles, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 176 },
- { "type", FieldAlbumType, SortByAlbumType, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 564 },
- { "label", FieldMusicLabel, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21899 },
- { "title", FieldTitle, SortByTitle, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 556 },
- { "sorttitle", FieldSortTitle, SortBySortTitle, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 171 },
- { "year", FieldYear, SortByYear, CSmartPlaylistRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, true, 562 },
- { "time", FieldTime, SortByTime, CSmartPlaylistRule::SECONDS_FIELD, StringValidation::IsTime, false, 180 },
- { "playcount", FieldPlaycount, SortByPlaycount, CSmartPlaylistRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 567 },
- { "lastplayed", FieldLastPlayed, SortByLastPlayed, CSmartPlaylistRule::DATE_FIELD, NULL, false, 568 },
- { "inprogress", FieldInProgress, SortByNone, CSmartPlaylistRule::BOOLEAN_FIELD, NULL, false, 575 },
- { "rating", FieldRating, SortByRating, CSmartPlaylistRule::NUMERIC_FIELD, CSmartPlaylistRule::ValidateRating, false, 563 },
- { "votes", FieldVotes, SortByVotes, CSmartPlaylistRule::TEXT_FIELD, StringValidation::IsPositiveInteger, false, 205 },
- { "top250", FieldTop250, SortByTop250, CSmartPlaylistRule::NUMERIC_FIELD, NULL, false, 13409 },
- { "mpaarating", FieldMPAA, SortByMPAA, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 20074 },
- { "dateadded", FieldDateAdded, SortByDateAdded, CSmartPlaylistRule::DATE_FIELD, NULL, false, 570 },
- { "genre", FieldGenre, SortByGenre, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 515 },
- { "plot", FieldPlot, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 207 },
- { "plotoutline", FieldPlotOutline, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 203 },
- { "tagline", FieldTagline, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 202 },
- { "set", FieldSet, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 20457 },
- { "director", FieldDirector, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 20339 },
- { "actor", FieldActor, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 20337 },
- { "writers", FieldWriter, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 20417 },
- { "airdate", FieldAirDate, SortByYear, CSmartPlaylistRule::DATE_FIELD, NULL, false, 20416 },
- { "hastrailer", FieldTrailer, SortByNone, CSmartPlaylistRule::BOOLEAN_FIELD, NULL, false, 20423 },
- { "studio", FieldStudio, SortByStudio, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 572 },
- { "country", FieldCountry, SortByCountry, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 574 },
- { "tvshow", FieldTvShowTitle, SortByTvShowTitle, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 20364 },
- { "status", FieldTvShowStatus, SortByTvShowStatus, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 126 },
- { "season", FieldSeason, SortBySeason, CSmartPlaylistRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20373 },
- { "episode", FieldEpisodeNumber, SortByEpisodeNumber, CSmartPlaylistRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20359 },
- { "numepisodes", FieldNumberOfEpisodes, SortByNumberOfEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20360 },
- { "numwatched", FieldNumberOfWatchedEpisodes, SortByNumberOfWatchedEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 21457 },
- { "videoresolution", FieldVideoResolution, SortByVideoResolution, CSmartPlaylistRule::NUMERIC_FIELD, NULL, false, 21443 },
- { "videocodec", FieldVideoCodec, SortByVideoCodec, CSmartPlaylistRule::TEXTIN_FIELD, NULL, false, 21445 },
- { "videoaspect", FieldVideoAspectRatio, SortByVideoAspectRatio, CSmartPlaylistRule::NUMERIC_FIELD, NULL, false, 21374 },
- { "audiochannels", FieldAudioChannels, SortByAudioChannels, CSmartPlaylistRule::NUMERIC_FIELD, NULL, false, 21444 },
- { "audiocodec", FieldAudioCodec, SortByAudioCodec, CSmartPlaylistRule::TEXTIN_FIELD, NULL, false, 21446 },
- { "audiolanguage", FieldAudioLanguage, SortByAudioLanguage, CSmartPlaylistRule::TEXTIN_FIELD, NULL, false, 21447 },
- { "subtitlelanguage", FieldSubtitleLanguage, SortBySubtitleLanguage, CSmartPlaylistRule::TEXTIN_FIELD, NULL, false, 21448 },
- { "random", FieldRandom, SortByRandom, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 590 },
- { "playlist", FieldPlaylist, SortByPlaylistOrder, CSmartPlaylistRule::PLAYLIST_FIELD, NULL, true, 559 },
- { "virtualfolder", FieldVirtualFolder, SortByNone, CSmartPlaylistRule::PLAYLIST_FIELD, NULL, true, 614 },
- { "tag", FieldTag, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, true, 20459 },
- { "instruments", FieldInstruments, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21892 },
- { "biography", FieldBiography, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21887 },
- { "born", FieldBorn, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21893 },
- { "bandformed", FieldBandFormed, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21894 },
- { "disbanded", FieldDisbanded, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21896 },
- { "died", FieldDied, SortByNone, CSmartPlaylistRule::TEXT_FIELD, NULL, false, 21897 }
+ { "none", FieldNone, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 231 },
+ { "filename", FieldFilename, SortByFile, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 561 },
+ { "path", FieldPath, SortByPath, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 573 },
+ { "album", FieldAlbum, SortByAlbum, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 558 },
+ { "albumartist", FieldAlbumArtist, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 566 },
+ { "artist", FieldArtist, SortByArtist, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 557 },
+ { "tracknumber", FieldTrackNumber, SortByTrackNumber, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 554 },
+ { "comment", FieldComment, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 569 },
+ { "review", FieldReview, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 183 },
+ { "themes", FieldThemes, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21895 },
+ { "moods", FieldMoods, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 175 },
+ { "styles", FieldStyles, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 176 },
+ { "type", FieldAlbumType, SortByAlbumType, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 564 },
+ { "label", FieldMusicLabel, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21899 },
+ { "title", FieldTitle, SortByTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 556 },
+ { "sorttitle", FieldSortTitle, SortBySortTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 171 },
+ { "year", FieldYear, SortByYear, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, true, 562 },
+ { "time", FieldTime, SortByTime, CDatabaseQueryRule::SECONDS_FIELD, StringValidation::IsTime, false, 180 },
+ { "playcount", FieldPlaycount, SortByPlaycount, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 567 },
+ { "lastplayed", FieldLastPlayed, SortByLastPlayed, CDatabaseQueryRule::DATE_FIELD, NULL, false, 568 },
+ { "inprogress", FieldInProgress, SortByNone, CDatabaseQueryRule::BOOLEAN_FIELD, NULL, false, 575 },
+ { "rating", FieldRating, SortByRating, CDatabaseQueryRule::NUMERIC_FIELD, CSmartPlaylistRule::ValidateRating, false, 563 },
+ { "votes", FieldVotes, SortByVotes, CDatabaseQueryRule::TEXT_FIELD, StringValidation::IsPositiveInteger, false, 205 },
+ { "top250", FieldTop250, SortByTop250, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 13409 },
+ { "mpaarating", FieldMPAA, SortByMPAA, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 20074 },
+ { "dateadded", FieldDateAdded, SortByDateAdded, CDatabaseQueryRule::DATE_FIELD, NULL, false, 570 },
+ { "genre", FieldGenre, SortByGenre, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 515 },
+ { "plot", FieldPlot, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 207 },
+ { "plotoutline", FieldPlotOutline, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 203 },
+ { "tagline", FieldTagline, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 202 },
+ { "set", FieldSet, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20457 },
+ { "director", FieldDirector, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20339 },
+ { "actor", FieldActor, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20337 },
+ { "writers", FieldWriter, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20417 },
+ { "airdate", FieldAirDate, SortByYear, CDatabaseQueryRule::DATE_FIELD, NULL, false, 20416 },
+ { "hastrailer", FieldTrailer, SortByNone, CDatabaseQueryRule::BOOLEAN_FIELD, NULL, false, 20423 },
+ { "studio", FieldStudio, SortByStudio, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 572 },
+ { "country", FieldCountry, SortByCountry, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 574 },
+ { "tvshow", FieldTvShowTitle, SortByTvShowTitle, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20364 },
+ { "status", FieldTvShowStatus, SortByTvShowStatus, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 126 },
+ { "season", FieldSeason, SortBySeason, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20373 },
+ { "episode", FieldEpisodeNumber, SortByEpisodeNumber, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20359 },
+ { "numepisodes", FieldNumberOfEpisodes, SortByNumberOfEpisodes, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 20360 },
+ { "numwatched", FieldNumberOfWatchedEpisodes, SortByNumberOfWatchedEpisodes, CDatabaseQueryRule::NUMERIC_FIELD, StringValidation::IsPositiveInteger, false, 21457 },
+ { "videoresolution", FieldVideoResolution, SortByVideoResolution, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21443 },
+ { "videocodec", FieldVideoCodec, SortByVideoCodec, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21445 },
+ { "videoaspect", FieldVideoAspectRatio, SortByVideoAspectRatio, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21374 },
+ { "audiochannels", FieldAudioChannels, SortByAudioChannels, CDatabaseQueryRule::NUMERIC_FIELD, NULL, false, 21444 },
+ { "audiocodec", FieldAudioCodec, SortByAudioCodec, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21446 },
+ { "audiolanguage", FieldAudioLanguage, SortByAudioLanguage, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21447 },
+ { "subtitlelanguage", FieldSubtitleLanguage, SortBySubtitleLanguage, CDatabaseQueryRule::TEXTIN_FIELD, NULL, false, 21448 },
+ { "random", FieldRandom, SortByRandom, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 590 },
+ { "playlist", FieldPlaylist, SortByPlaylistOrder, CDatabaseQueryRule::PLAYLIST_FIELD, NULL, true, 559 },
+ { "virtualfolder", FieldVirtualFolder, SortByNone, CDatabaseQueryRule::PLAYLIST_FIELD, NULL, true, 614 },
+ { "tag", FieldTag, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, true, 20459 },
+ { "instruments", FieldInstruments, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21892 },
+ { "biography", FieldBiography, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21887 },
+ { "born", FieldBorn, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21893 },
+ { "bandformed", FieldBandFormed, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21894 },
+ { "disbanded", FieldDisbanded, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21896 },
+ { "died", FieldDied, SortByNone, CDatabaseQueryRule::TEXT_FIELD, NULL, false, 21897 }
};
static const size_t NUM_FIELDS = sizeof(fields) / sizeof(translateField);
typedef struct
{
- char string[15];
- CSmartPlaylistRule::SEARCH_OPERATOR op;
- int localizedString;
-} operatorField;
-
-static const operatorField operators[] = {
- { "contains", CSmartPlaylistRule::OPERATOR_CONTAINS, 21400 },
- { "doesnotcontain", CSmartPlaylistRule::OPERATOR_DOES_NOT_CONTAIN, 21401 },
- { "is", CSmartPlaylistRule::OPERATOR_EQUALS, 21402 },
- { "isnot", CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL, 21403 },
- { "startswith", CSmartPlaylistRule::OPERATOR_STARTS_WITH, 21404 },
- { "endswith", CSmartPlaylistRule::OPERATOR_ENDS_WITH, 21405 },
- { "greaterthan", CSmartPlaylistRule::OPERATOR_GREATER_THAN, 21406 },
- { "lessthan", CSmartPlaylistRule::OPERATOR_LESS_THAN, 21407 },
- { "after", CSmartPlaylistRule::OPERATOR_AFTER, 21408 },
- { "before", CSmartPlaylistRule::OPERATOR_BEFORE, 21409 },
- { "inthelast", CSmartPlaylistRule::OPERATOR_IN_THE_LAST, 21410 },
- { "notinthelast", CSmartPlaylistRule::OPERATOR_NOT_IN_THE_LAST, 21411 },
- { "true", CSmartPlaylistRule::OPERATOR_TRUE, 20122 },
- { "false", CSmartPlaylistRule::OPERATOR_FALSE, 20424 },
- { "between", CSmartPlaylistRule::OPERATOR_BETWEEN, 21456 }
-};
-
-static const size_t NUM_OPERATORS = sizeof(operators) / sizeof(operatorField);
-
-typedef struct
-{
std::string name;
Field field;
bool canMix;
CSmartPlaylistRule::CSmartPlaylistRule()
{
- m_field = FieldNone;
- m_operator = OPERATOR_CONTAINS;
- m_parameter.clear();
-}
-
-bool CSmartPlaylistRule::Load(const TiXmlNode *node, const std::string &encoding /* = "UTF-8" */)
-{
- if (node == NULL)
- return false;
-
- const TiXmlElement *element = node->ToElement();
- if (element == NULL)
- return false;
-
- // format is:
- // <rule field="Genre" operator="contains">parameter</rule>
- // where parameter can either be a string or a list of
- // <value> tags containing a string
- const char *field = element->Attribute("field");
- const char *oper = element->Attribute("operator");
- if (field == NULL || oper == NULL)
- return false;
-
- m_field = TranslateField(field);
- m_operator = TranslateOperator(oper);
-
- if (m_operator == OPERATOR_TRUE || m_operator == OPERATOR_FALSE)
- return true;
-
- const TiXmlNode *parameter = element->FirstChild();
- if (parameter == NULL)
- return false;
-
- if (parameter->Type() == TiXmlNode::TINYXML_TEXT)
- {
- CStdString utf8Parameter;
- if (encoding.empty()) // utf8
- utf8Parameter = parameter->ValueStr();
- else
- g_charsetConverter.ToUtf8(encoding, parameter->ValueStr(), utf8Parameter);
-
- if (!utf8Parameter.empty())
- m_parameter.push_back(utf8Parameter);
- }
- else if (parameter->Type() == TiXmlNode::TINYXML_ELEMENT)
- {
- const TiXmlNode *valueNode = element->FirstChild("value");
- while (valueNode != NULL)
- {
- const TiXmlNode *value = valueNode->FirstChild();
- if (value != NULL && value->Type() == TiXmlNode::TINYXML_TEXT)
- {
- CStdString utf8Parameter;
- if (encoding.empty()) // utf8
- utf8Parameter = value->ValueStr();
- else
- g_charsetConverter.ToUtf8(encoding, value->ValueStr(), utf8Parameter);
-
- if (!utf8Parameter.empty())
- m_parameter.push_back(utf8Parameter);
- }
-
- valueNode = valueNode->NextSibling("value");
- }
- }
- else
- return false;
-
- return true;
-}
-
-bool CSmartPlaylistRule::Load(const CVariant &obj)
-{
- if (!obj.isObject() ||
- !obj.isMember("field") || !obj["field"].isString() ||
- !obj.isMember("operator") || !obj["operator"].isString())
- return false;
-
- m_field = TranslateField(obj["field"].asString().c_str());
- m_operator = TranslateOperator(obj["operator"].asString().c_str());
-
- if (m_operator == OPERATOR_TRUE || m_operator == OPERATOR_FALSE)
- return true;
-
- if (!obj.isMember("value") || (!obj["value"].isString() && !obj["value"].isArray()))
- return false;
-
- const CVariant &value = obj["value"];
- if (value.isString() && !value.asString().empty())
- m_parameter.push_back(value.asString());
- else if (value.isArray())
- {
- for (CVariant::const_iterator_array val = value.begin_array(); val != value.end_array(); val++)
- {
- if (val->isString() && !val->asString().empty())
- m_parameter.push_back(val->asString());
- }
- }
- else
- return false;
-
- return true;
-}
-
-bool CSmartPlaylistRule::Save(TiXmlNode *parent) const
-{
- if (parent == NULL || (m_parameter.empty() && m_operator != OPERATOR_TRUE && m_operator != OPERATOR_FALSE))
- return false;
-
- TiXmlElement rule("rule");
- rule.SetAttribute("field", TranslateField(m_field).c_str());
- rule.SetAttribute("operator", TranslateOperator(m_operator).c_str());
-
- for (vector<CStdString>::const_iterator it = m_parameter.begin(); it != m_parameter.end(); it++)
- {
- TiXmlElement value("value");
- TiXmlText text(it->c_str());
- value.InsertEndChild(text);
- rule.InsertEndChild(value);
- }
-
- parent->InsertEndChild(rule);
-
- return true;
-}
-
-bool CSmartPlaylistRule::Save(CVariant &obj) const
-{
- if (obj.isNull() || (m_parameter.empty() && m_operator != OPERATOR_TRUE && m_operator != OPERATOR_FALSE))
- return false;
-
- obj["field"] = TranslateField(m_field);
- obj["operator"] = TranslateOperator(m_operator);
-
- obj["value"] = CVariant(CVariant::VariantTypeArray);
- for (vector<CStdString>::const_iterator it = m_parameter.begin(); it != m_parameter.end(); it++)
- obj["value"].push_back(*it);
-
- return true;
}
-Field CSmartPlaylistRule::TranslateField(const char *field)
+int CSmartPlaylistRule::TranslateField(const char *field) const
{
for (unsigned int i = 0; i < NUM_FIELDS; i++)
if (StringUtils::EqualsNoCase(field, fields[i].string)) return fields[i].field;
return FieldNone;
}
-CStdString CSmartPlaylistRule::TranslateField(Field field)
+CStdString CSmartPlaylistRule::TranslateField(int field) const
{
for (unsigned int i = 0; i < NUM_FIELDS; i++)
if (field == fields[i].field) return fields[i].string;
return "none";
}
-CSmartPlaylistRule::SEARCH_OPERATOR CSmartPlaylistRule::TranslateOperator(const char *oper)
-{
- for (unsigned int i = 0; i < NUM_OPERATORS; i++)
- if (StringUtils::EqualsNoCase(oper, operators[i].string)) return operators[i].op;
- return OPERATOR_CONTAINS;
-}
-
-CStdString CSmartPlaylistRule::TranslateOperator(SEARCH_OPERATOR oper)
-{
- for (unsigned int i = 0; i < NUM_OPERATORS; i++)
- if (oper == operators[i].op) return operators[i].string;
- return "contains";
-}
-
Field CSmartPlaylistRule::TranslateGroup(const char *group)
{
for (unsigned int i = 0; i < NUM_GROUPS; i++)
return "";
}
-CStdString CSmartPlaylistRule::GetLocalizedField(Field field)
+CStdString CSmartPlaylistRule::GetLocalizedField(int field)
{
for (unsigned int i = 0; i < NUM_FIELDS; i++)
if (field == fields[i].field) return g_localizeStrings.Get(fields[i].localizedString);
return g_localizeStrings.Get(16018);
}
-CSmartPlaylistRule::FIELD_TYPE CSmartPlaylistRule::GetFieldType(Field field)
+CDatabaseQueryRule::FIELD_TYPE CSmartPlaylistRule::GetFieldType(int field) const
{
for (unsigned int i = 0; i < NUM_FIELDS; i++)
if (field == fields[i].field) return fields[i].type;
return TEXT_FIELD;
}
-bool CSmartPlaylistRule::IsFieldBrowseable(Field field)
+bool CSmartPlaylistRule::IsFieldBrowseable(int field)
{
for (unsigned int i = 0; i < NUM_FIELDS; i++)
if (field == fields[i].field) return fields[i].browseable;
return groups;
}
-CStdString CSmartPlaylistRule::GetLocalizedOperator(SEARCH_OPERATOR oper)
-{
- for (unsigned int i = 0; i < NUM_OPERATORS; i++)
- if (oper == operators[i].op) return g_localizeStrings.Get(operators[i].localizedString);
- return g_localizeStrings.Get(16018);
-}
-
CStdString CSmartPlaylistRule::GetLocalizedGroup(Field group)
{
for (unsigned int i = 0; i < NUM_GROUPS; i++)
return rule;
}
-CStdString CSmartPlaylistRule::GetParameter() const
-{
- return StringUtils::JoinString(m_parameter, RULE_VALUE_SEPARATOR);
-}
-
-void CSmartPlaylistRule::SetParameter(const CStdString &value)
-{
- m_parameter.clear();
- StringUtils::SplitString(value, RULE_VALUE_SEPARATOR, m_parameter);
-}
-
-void CSmartPlaylistRule::SetParameter(const std::vector<CStdString> &values)
-{
- m_parameter.assign(values.begin(), values.end());
-}
-
CStdString CSmartPlaylistRule::GetVideoResolutionQuery(const CStdString ¶meter) const
{
CStdString retVal(" IN (SELECT DISTINCT idFile FROM streamdetails WHERE iVideoWidth ");
return retVal;
}
-CStdString CSmartPlaylistRule::GetWhereClause(const CDatabase &db, const CStdString& strType) const
+CStdString CSmartPlaylistRule::GetBooleanQuery(const CStdString &negate, const CStdString &strType) const
+{
+ if (strType == "movies")
+ {
+ if (m_field == FieldInProgress)
+ return "movieview.idFile " + negate + " IN (SELECT DISTINCT idFile FROM bookmark WHERE type = 1)";
+ else if (m_field == FieldTrailer)
+ return negate + GetField(m_field, strType) + "!= ''";
+ }
+ else if (strType == "episodes")
+ {
+ if (m_field == FieldInProgress)
+ return "episodeview.idFile " + negate + " IN (SELECT DISTINCT idFile FROM bookmark WHERE type = 1)";
+ }
+ else if (strType == "tvshows")
+ {
+ if (m_field == FieldInProgress)
+ return negate + " ("
+ "(tvshowview.watchedcount > 0 AND tvshowview.watchedcount < tvshowview.totalCount) OR "
+ "(tvshowview.watchedcount = 0 AND EXISTS "
+ "(SELECT 1 FROM episodeview WHERE episodeview.idShow = " + GetField(FieldId, strType) + " AND episodeview.resumeTimeInSeconds > 0)"
+ ")"
+ ")";
+ }
+ return "";
+}
+
+CDatabaseQueryRule::SEARCH_OPERATOR CSmartPlaylistRule::GetOperator(const CStdString &strType) const
{
- SEARCH_OPERATOR op = m_operator;
+ SEARCH_OPERATOR op = CDatabaseQueryRule::GetOperator(strType);
if ((strType == "tvshows" || strType == "episodes") && m_field == FieldYear)
{ // special case for premiered which is a date rather than a year
// TODO: SMARTPLAYLISTS do we really need this, or should we just make this field the premiered date and request a date?
else if (op == OPERATOR_DOES_NOT_EQUAL)
op = OPERATOR_DOES_NOT_CONTAIN;
}
+ return op;
+}
+
+CStdString CSmartPlaylistRule::FormatParameter(const CStdString &operatorString, const CStdString ¶m, const CDatabase &db, const CStdString &strType) const
+{
+ // special-casing
+ if (m_field == FieldTime)
+ { // translate time to seconds
+ CStdString seconds; seconds.Format("%i", StringUtils::TimeStringToSeconds(param));
+ return db.PrepareSQL(operatorString.c_str(), seconds.c_str());
+ }
+ return CDatabaseQueryRule::FormatParameter(operatorString, param, db, strType);
+}
- CStdString operatorString, negate;
- if (GetFieldType(m_field) == TEXTIN_FIELD)
+CStdString CSmartPlaylistRule::FormatWhereClause(const CStdString &negate, const CStdString &oper, const CStdString ¶m,
+ const CDatabase &db, const CStdString &strType) const
+{
+ CStdString parameter = FormatParameter(oper, param, db, strType);
+
+ CStdString query;
+ CStdString table;
+ if (strType == "songs")
{
- if (op == OPERATOR_DOES_NOT_EQUAL)
- negate = " NOT";
+ table = "songview";
+
+ if (m_field == FieldGenre)
+ query = negate + " EXISTS (SELECT 1 FROM song_genre, genre WHERE song_genre.idSong = " + GetField(FieldId, strType) + " AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")";
+ else if (m_field == FieldArtist)
+ query = negate + " EXISTS (SELECT 1 FROM song_artist, artist WHERE song_artist.idSong = " + GetField(FieldId, strType) + " AND song_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
+ else if (m_field == FieldAlbumArtist)
+ query = negate + " EXISTS (SELECT 1 FROM album_artist, artist WHERE album_artist.idAlbum = " + table + "idAlbum AND album_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
+ else if (m_field == FieldLastPlayed && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
+ query = GetField(m_field, strType) + " is NULL or " + GetField(m_field, strType) + parameter;
}
- else
+ else if (strType == "albums")
{
- // the comparison piece
- switch (op)
- {
- case OPERATOR_CONTAINS:
- operatorString = " LIKE '%%%s%%'"; break;
- case OPERATOR_DOES_NOT_CONTAIN:
- negate = " NOT"; operatorString = " LIKE '%%%s%%'"; break;
- case OPERATOR_EQUALS:
- if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
- operatorString = " = %s";
- else
- operatorString = " LIKE '%s'";
- break;
- case OPERATOR_DOES_NOT_EQUAL:
- if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
- operatorString = " != %s";
- else
- {
- negate = " NOT";
- operatorString = " LIKE '%s'";
- }
- break;
- case OPERATOR_STARTS_WITH:
- operatorString = " LIKE '%s%%'"; break;
- case OPERATOR_ENDS_WITH:
- operatorString = " LIKE '%%%s'"; break;
- case OPERATOR_AFTER:
- case OPERATOR_GREATER_THAN:
- case OPERATOR_IN_THE_LAST:
- operatorString = " > ";
- if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
- operatorString += "%s";
- else
- operatorString += "'%s'";
- break;
- case OPERATOR_BEFORE:
- case OPERATOR_LESS_THAN:
- case OPERATOR_NOT_IN_THE_LAST:
- operatorString = " < ";
- if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD)
- operatorString += "%s";
- else
- operatorString += "'%s'";
- break;
- case OPERATOR_TRUE:
- operatorString = " = 1"; break;
- case OPERATOR_FALSE:
- negate = " NOT "; operatorString = " = 0"; break;
- default:
- break;
- }
+ table = "albumview";
+
+ if (m_field == FieldGenre)
+ query = negate + " EXISTS (SELECT 1 FROM song, song_genre, genre WHERE song.idAlbum = " + GetField(FieldId, strType) + " AND song.idSong = song_genre.idSong AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")";
+ else if (m_field == FieldArtist)
+ query = negate + " EXISTS (SELECT 1 FROM song, song_artist, artist WHERE song.idAlbum = " + GetField(FieldId, strType) + " AND song.idSong = song_artist.idSong AND song_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
+ else if (m_field == FieldAlbumArtist)
+ query = negate + " EXISTS (SELECT 1 FROM album_artist, artist WHERE album_artist.idAlbum = " + GetField(FieldId, strType) + " AND album_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
}
+ else if (strType == "artists")
+ {
+ table = "artistview";
- // boolean operators don't have any values in m_parameter, they work on the operator
- if (m_operator == OPERATOR_FALSE || m_operator == OPERATOR_TRUE)
+ if (m_field == FieldGenre)
+ query = negate + " EXISTS (SELECT DISTINCT song_artist.idArtist FROM song_artist, song_genre, genre WHERE song_artist.idArtist = " + GetField(FieldId, strType) + " AND song_artist.idSong = song_genre.idSong AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")";
+ }
+ else if (strType == "movies")
{
- if (strType == "movies")
- {
- if (m_field == FieldInProgress)
- return "movieview.idFile " + negate + " IN (SELECT DISTINCT idFile FROM bookmark WHERE type = 1)";
- else if (m_field == FieldTrailer)
- return negate + GetField(m_field, strType) + "!= ''";
- }
- else if (strType == "episodes")
- {
- if (m_field == FieldInProgress)
- return "episodeview.idFile " + negate + " IN (SELECT DISTINCT idFile FROM bookmark WHERE type = 1)";
- }
- else if (strType == "tvshows")
- {
- if (m_field == FieldInProgress)
- return negate + " ("
- "(tvshowview.watchedcount > 0 AND tvshowview.watchedcount < tvshowview.totalCount) OR "
- "(tvshowview.watchedcount = 0 AND EXISTS "
- "(SELECT 1 FROM episodeview WHERE episodeview.idShow = " + GetField(FieldId, strType) + " AND episodeview.resumeTimeInSeconds > 0)"
- ")"
- ")";
- }
+ table = "movieview";
+
+ if (m_field == FieldGenre)
+ query = negate + " EXISTS (SELECT 1 FROM genrelinkmovie JOIN genre ON genre.idGenre=genrelinkmovie.idGenre WHERE genrelinkmovie.idMovie = " + GetField(FieldId, strType) + " AND genre.strGenre" + parameter + ")";
+ else if (m_field == FieldDirector)
+ query = negate + " EXISTS (SELECT 1 FROM directorlinkmovie JOIN actors ON actors.idActor=directorlinkmovie.idDirector WHERE directorlinkmovie.idMovie = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldActor)
+ query = negate + " EXISTS (SELECT 1 FROM actorlinkmovie JOIN actors ON actors.idActor=actorlinkmovie.idActor WHERE actorlinkmovie.idMovie = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldWriter)
+ query = negate + " EXISTS (SELECT 1 FROM writerlinkmovie JOIN actors ON actors.idActor=writerlinkmovie.idWriter WHERE writerlinkmovie.idMovie = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldStudio)
+ query = negate + " EXISTS (SELECT 1 FROM studiolinkmovie JOIN studio ON studio.idStudio=studiolinkmovie.idStudio WHERE studiolinkmovie.idMovie = " + GetField(FieldId, strType) + " AND studio.strStudio" + parameter + ")";
+ else if (m_field == FieldCountry)
+ query = negate + " EXISTS (SELECT 1 FROM countrylinkmovie JOIN country ON country.idCountry=countrylinkmovie.idCountry WHERE countrylinkmovie.idMovie = " + GetField(FieldId, strType) + " AND country.strCountry" + parameter + ")";
+ else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
+ query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
+ else if (m_field == FieldTag)
+ query = negate + " EXISTS (SELECT 1 FROM taglinks JOIN tag ON tag.idTag = taglinks.idTag WHERE taglinks.idMedia = " + GetField(FieldId, strType) + " AND tag.strTag" + parameter + " AND taglinks.media_type = 'movie')";
}
-
- // The BETWEEN operator is handled special
- if (op == OPERATOR_BETWEEN)
+ else if (strType == "musicvideos")
{
- if (m_parameter.size() != 2)
- return "";
-
- FIELD_TYPE fieldType = GetFieldType(m_field);
- if (fieldType == NUMERIC_FIELD || m_field == FieldYear)
- return db.PrepareSQL("CAST(%s as DECIMAL(5,1)) BETWEEN %s AND %s", GetField(m_field, strType).c_str(), m_parameter[0].c_str(), m_parameter[1].c_str());
- else if (fieldType == SECONDS_FIELD)
- return db.PrepareSQL("CAST(%s as INTEGER) BETWEEN %s AND %s", GetField(m_field, strType).c_str(), m_parameter[0].c_str(), m_parameter[1].c_str());
- else
- return db.PrepareSQL("%s BETWEEN '%s' AND '%s'", GetField(m_field, strType).c_str(), m_parameter[0].c_str(), m_parameter[1].c_str());
+ table = "musicvideoview";
+
+ if (m_field == FieldGenre)
+ query = negate + " EXISTS (SELECT 1 FROM genrelinkmusicvideo JOIN genre ON genre.idGenre=genrelinkmusicvideo.idGenre WHERE genrelinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND genre.strGenre" + parameter + ")";
+ else if (m_field == FieldArtist)
+ query = negate + " EXISTS (SELECT 1 FROM artistlinkmusicvideo JOIN actors ON actors.idActor=artistlinkmusicvideo.idArtist WHERE artistlinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldStudio)
+ query = negate + " EXISTS (SELECT 1 FROM studiolinkmusicvideo JOIN studio ON studio.idStudio=studiolinkmusicvideo.idStudio WHERE studiolinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND studio.strStudio" + parameter + ")";
+ else if (m_field == FieldDirector)
+ query = negate + " EXISTS (SELECT 1 FROM directorlinkmusicvideo JOIN actors ON actors.idActor=directorlinkmusicvideo.idDirector WHERE directorlinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
+ query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
+ else if (m_field == FieldTag)
+ query = negate + " EXISTS (SELECT 1 FROM taglinks JOIN tag ON tag.idTag = taglinks.idTag WHERE taglinks.idMedia = " + GetField(FieldId, strType) + " AND tag.strTag" + parameter + " AND taglinks.media_type = 'musicvideo')";
}
-
- // now the query parameter
- CStdString wholeQuery;
- for (vector<CStdString>::const_iterator it = m_parameter.begin(); it != m_parameter.end(); /* it++ is done further down */)
+ else if (strType == "tvshows")
{
- CStdString parameter;
- if (GetFieldType(m_field) == TEXTIN_FIELD)
- {
- CStdStringArray split;
- StringUtils::SplitString(*it, ",", split);
- for (CStdStringArray::iterator itIn = split.begin(); itIn != split.end(); ++itIn)
- {
- if (!parameter.IsEmpty())
- parameter += ",";
- parameter += db.PrepareSQL("'%s'", (*itIn).Trim().c_str());
- }
- parameter = " IN (" + parameter + ")";
- }
- else
- parameter = db.PrepareSQL(operatorString.c_str(), it->c_str());
-
- if (GetFieldType(m_field) == DATE_FIELD)
- {
- if (m_operator == OPERATOR_IN_THE_LAST || m_operator == OPERATOR_NOT_IN_THE_LAST)
- { // translate time period
- CDateTime date=CDateTime::GetCurrentDateTime();
- CDateTimeSpan span;
- span.SetFromPeriod(*it);
- date-=span;
- parameter = db.PrepareSQL(operatorString.c_str(), date.GetAsDBDate().c_str());
- }
- }
- else if (m_field == FieldTime)
- { // translate time to seconds
- CStdString seconds; seconds.Format("%i", StringUtils::TimeStringToSeconds(*it));
- parameter = db.PrepareSQL(operatorString.c_str(), seconds.c_str());
- }
-
- CStdString query;
- CStdString table;
- if (strType == "songs")
- {
- table = "songview";
-
- if (m_field == FieldGenre)
- query = negate + " EXISTS (SELECT 1 FROM song_genre, genre WHERE song_genre.idSong = " + GetField(FieldId, strType) + " AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")";
- else if (m_field == FieldArtist)
- query = negate + " EXISTS (SELECT 1 FROM song_artist, artist WHERE song_artist.idSong = " + GetField(FieldId, strType) + " AND song_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
- else if (m_field == FieldAlbumArtist)
- query = negate + " EXISTS (SELECT 1 FROM album_artist, artist WHERE album_artist.idAlbum = " + table + "idAlbum AND album_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
- else if (m_field == FieldLastPlayed && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
- query = GetField(m_field, strType) + " is NULL or " + GetField(m_field, strType) + parameter;
- }
- else if (strType == "albums")
- {
- table = "albumview";
-
- if (m_field == FieldGenre)
- query = negate + " EXISTS (SELECT 1 FROM song, song_genre, genre WHERE song.idAlbum = " + GetField(FieldId, strType) + " AND song.idSong = song_genre.idSong AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")";
- else if (m_field == FieldArtist)
- query = negate + " EXISTS (SELECT 1 FROM song, song_artist, artist WHERE song.idAlbum = " + GetField(FieldId, strType) + " AND song.idSong = song_artist.idSong AND song_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
- else if (m_field == FieldAlbumArtist)
- query = negate + " EXISTS (SELECT 1 FROM album_artist, artist WHERE album_artist.idAlbum = " + GetField(FieldId, strType) + " AND album_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")";
- }
- else if (strType == "artists")
- {
- table = "artistview";
-
- if (m_field == FieldGenre)
- query = negate + " EXISTS (SELECT DISTINCT song_artist.idArtist FROM song_artist, song_genre, genre WHERE song_artist.idArtist = " + GetField(FieldId, strType) + " AND song_artist.idSong = song_genre.idSong AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")";
- }
- else if (strType == "movies")
- {
- table = "movieview";
-
- if (m_field == FieldGenre)
- query = negate + " EXISTS (SELECT 1 FROM genrelinkmovie JOIN genre ON genre.idGenre=genrelinkmovie.idGenre WHERE genrelinkmovie.idMovie = " + GetField(FieldId, strType) + " AND genre.strGenre" + parameter + ")";
- else if (m_field == FieldDirector)
- query = negate + " EXISTS (SELECT 1 FROM directorlinkmovie JOIN actors ON actors.idActor=directorlinkmovie.idDirector WHERE directorlinkmovie.idMovie = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldActor)
- query = negate + " EXISTS (SELECT 1 FROM actorlinkmovie JOIN actors ON actors.idActor=actorlinkmovie.idActor WHERE actorlinkmovie.idMovie = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldWriter)
- query = negate + " EXISTS (SELECT 1 FROM writerlinkmovie JOIN actors ON actors.idActor=writerlinkmovie.idWriter WHERE writerlinkmovie.idMovie = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldStudio)
- query = negate + " EXISTS (SELECT 1 FROM studiolinkmovie JOIN studio ON studio.idStudio=studiolinkmovie.idStudio WHERE studiolinkmovie.idMovie = " + GetField(FieldId, strType) + " AND studio.strStudio" + parameter + ")";
- else if (m_field == FieldCountry)
- query = negate + " EXISTS (SELECT 1 FROM countrylinkmovie JOIN country ON country.idCountry=countrylinkmovie.idCountry WHERE countrylinkmovie.idMovie = " + GetField(FieldId, strType) + " AND country.strCountry" + parameter + ")";
- else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
- query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
- else if (m_field == FieldTag)
- query = negate + " EXISTS (SELECT 1 FROM taglinks JOIN tag ON tag.idTag = taglinks.idTag WHERE taglinks.idMedia = " + GetField(FieldId, strType) + " AND tag.strTag" + parameter + " AND taglinks.media_type = 'movie')";
- }
- else if (strType == "musicvideos")
- {
- table = "musicvideoview";
-
- if (m_field == FieldGenre)
- query = negate + " EXISTS (SELECT 1 FROM genrelinkmusicvideo JOIN genre ON genre.idGenre=genrelinkmusicvideo.idGenre WHERE genrelinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND genre.strGenre" + parameter + ")";
- else if (m_field == FieldArtist)
- query = negate + " EXISTS (SELECT 1 FROM artistlinkmusicvideo JOIN actors ON actors.idActor=artistlinkmusicvideo.idArtist WHERE artistlinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldStudio)
- query = negate + " EXISTS (SELECT 1 FROM studiolinkmusicvideo JOIN studio ON studio.idStudio=studiolinkmusicvideo.idStudio WHERE studiolinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND studio.strStudio" + parameter + ")";
- else if (m_field == FieldDirector)
- query = negate + " EXISTS (SELECT 1 FROM directorlinkmusicvideo JOIN actors ON actors.idActor=directorlinkmusicvideo.idDirector WHERE directorlinkmusicvideo.idMVideo = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
- query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
- else if (m_field == FieldTag)
- query = negate + " EXISTS (SELECT 1 FROM taglinks JOIN tag ON tag.idTag = taglinks.idTag WHERE taglinks.idMedia = " + GetField(FieldId, strType) + " AND tag.strTag" + parameter + " AND taglinks.media_type = 'musicvideo')";
- }
- else if (strType == "tvshows")
- {
- table = "tvshowview";
-
- if (m_field == FieldGenre)
- query = negate + " EXISTS (SELECT 1 FROM genrelinktvshow JOIN genre ON genre.idGenre=genrelinktvshow.idGenre WHERE genrelinktvshow.idShow = " + GetField(FieldId, strType) + " AND genre.strGenre" + parameter + ")";
- else if (m_field == FieldDirector)
- query = negate + " EXISTS (SELECT 1 FROM directorlinktvshow JOIN actors ON actors.idActor=directorlinktvshow.idDirector WHERE directorlinktvshow.idShow = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldActor)
- query = negate + " EXISTS (SELECT 1 FROM actorlinktvshow JOIN actors ON actors.idActor=actorlinktvshow.idActor WHERE actorlinktvshow.idShow = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldStudio)
- query = negate + " (" + GetField(m_field, strType) + parameter + ")";
- else if (m_field == FieldMPAA)
- query = negate + " (" + GetField(m_field, strType) + parameter + ")";
- else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
- query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
- else if (m_field == FieldPlaycount)
- query = "CASE WHEN COALESCE(" + GetField(FieldNumberOfEpisodes, strType) + " - " + GetField(FieldNumberOfWatchedEpisodes, strType) + ", 0) > 0 THEN 0 ELSE 1 END " + parameter;
- else if (m_field == FieldTag)
- query = negate + " EXISTS (SELECT 1 FROM taglinks JOIN tag ON tag.idTag = taglinks.idTag WHERE taglinks.idMedia = " + GetField(FieldId, strType) + " AND tag.strTag" + parameter + " AND taglinks.media_type = 'tvshow')";
- }
- else if (strType == "episodes")
- {
- table = "episodeview";
-
- if (m_field == FieldGenre)
- query = negate + " EXISTS (SELECT 1 FROM genrelinktvshow JOIN genre ON genre.idGenre=genrelinktvshow.idGenre WHERE genrelinktvshow.idShow = " + table + ".idShow AND genre.strGenre" + parameter + ")";
- else if (m_field == FieldDirector)
- query = negate + " EXISTS (SELECT 1 FROM directorlinkepisode JOIN actors ON actors.idActor=directorlinkepisode.idDirector WHERE directorlinkepisode.idEpisode = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldActor)
- query = negate + " EXISTS (SELECT 1 FROM actorlinkepisode JOIN actors ON actors.idActor=actorlinkepisode.idActor WHERE actorlinkepisode.idEpisode = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if (m_field == FieldWriter)
- query = negate + " EXISTS (SELECT 1 FROM writerlinkepisode JOIN actors ON actors.idActor=writerlinkepisode.idWriter WHERE writerlinkepisode.idEpisode = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
- else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
- query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
- else if (m_field == FieldStudio)
- query = negate + " (" + GetField(FieldId, strType) + parameter + ")";
- else if (m_field == FieldMPAA)
- query = negate + " (" + GetField(FieldId, strType) + parameter + ")";
- }
- if (m_field == FieldVideoResolution)
- query = table + ".idFile" + negate + GetVideoResolutionQuery(*it);
- else if (m_field == FieldAudioChannels)
- query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND iAudioChannels " + parameter + ")";
- else if (m_field == FieldVideoCodec)
- query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strVideoCodec " + parameter + ")";
- else if (m_field == FieldAudioCodec)
- query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strAudioCodec " + parameter + ")";
- else if (m_field == FieldAudioLanguage)
- query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strAudioLanguage " + parameter + ")";
- else if (m_field == FieldSubtitleLanguage)
- query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strSubtitleLanguage " + parameter + ")";
- else if (m_field == FieldVideoAspectRatio)
- query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND fVideoAspect " + parameter + ")";
- if (m_field == FieldPlaycount && strType != "songs" && strType != "albums" && strType != "tvshows")
- { // playcount IS stored as NULL OR number IN video db
- if ((m_operator == OPERATOR_EQUALS && it->Equals("0")) ||
- (m_operator == OPERATOR_DOES_NOT_EQUAL && !it->Equals("0")) ||
- (m_operator == OPERATOR_LESS_THAN))
- {
- CStdString field = GetField(FieldPlaycount, strType);
- query = field + " IS NULL OR " + field + parameter;
- }
- }
-
- if (query.IsEmpty() && m_field != FieldNone)
+ table = "tvshowview";
+
+ if (m_field == FieldGenre)
+ query = negate + " EXISTS (SELECT 1 FROM genrelinktvshow JOIN genre ON genre.idGenre=genrelinktvshow.idGenre WHERE genrelinktvshow.idShow = " + GetField(FieldId, strType) + " AND genre.strGenre" + parameter + ")";
+ else if (m_field == FieldDirector)
+ query = negate + " EXISTS (SELECT 1 FROM directorlinktvshow JOIN actors ON actors.idActor=directorlinktvshow.idDirector WHERE directorlinktvshow.idShow = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldActor)
+ query = negate + " EXISTS (SELECT 1 FROM actorlinktvshow JOIN actors ON actors.idActor=actorlinktvshow.idActor WHERE actorlinktvshow.idShow = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldStudio)
+ query = negate + " (" + GetField(m_field, strType) + parameter + ")";
+ else if (m_field == FieldMPAA)
+ query = negate + " (" + GetField(m_field, strType) + parameter + ")";
+ else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
+ query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
+ else if (m_field == FieldPlaycount)
+ query = "CASE WHEN COALESCE(" + GetField(FieldNumberOfEpisodes, strType) + " - " + GetField(FieldNumberOfWatchedEpisodes, strType) + ", 0) > 0 THEN 0 ELSE 1 END " + parameter;
+ else if (m_field == FieldTag)
+ query = negate + " EXISTS (SELECT 1 FROM taglinks JOIN tag ON tag.idTag = taglinks.idTag WHERE taglinks.idMedia = " + GetField(FieldId, strType) + " AND tag.strTag" + parameter + " AND taglinks.media_type = 'tvshow')";
+ }
+ else if (strType == "episodes")
+ {
+ table = "episodeview";
+
+ if (m_field == FieldGenre)
+ query = negate + " EXISTS (SELECT 1 FROM genrelinktvshow JOIN genre ON genre.idGenre=genrelinktvshow.idGenre WHERE genrelinktvshow.idShow = " + table + ".idShow AND genre.strGenre" + parameter + ")";
+ else if (m_field == FieldDirector)
+ query = negate + " EXISTS (SELECT 1 FROM directorlinkepisode JOIN actors ON actors.idActor=directorlinkepisode.idDirector WHERE directorlinkepisode.idEpisode = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldActor)
+ query = negate + " EXISTS (SELECT 1 FROM actorlinkepisode JOIN actors ON actors.idActor=actorlinkepisode.idActor WHERE actorlinkepisode.idEpisode = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if (m_field == FieldWriter)
+ query = negate + " EXISTS (SELECT 1 FROM writerlinkepisode JOIN actors ON actors.idActor=writerlinkepisode.idWriter WHERE writerlinkepisode.idEpisode = " + GetField(FieldId, strType) + " AND actors.strActor" + parameter + ")";
+ else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST))
+ query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter;
+ else if (m_field == FieldStudio)
+ query = negate + " (" + GetField(FieldId, strType) + parameter + ")";
+ else if (m_field == FieldMPAA)
+ query = negate + " (" + GetField(FieldId, strType) + parameter + ")";
+ }
+ if (m_field == FieldVideoResolution)
+ query = table + ".idFile" + negate + GetVideoResolutionQuery(param);
+ else if (m_field == FieldAudioChannels)
+ query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND iAudioChannels " + parameter + ")";
+ else if (m_field == FieldVideoCodec)
+ query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strVideoCodec " + parameter + ")";
+ else if (m_field == FieldAudioCodec)
+ query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strAudioCodec " + parameter + ")";
+ else if (m_field == FieldAudioLanguage)
+ query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strAudioLanguage " + parameter + ")";
+ else if (m_field == FieldSubtitleLanguage)
+ query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND strSubtitleLanguage " + parameter + ")";
+ else if (m_field == FieldVideoAspectRatio)
+ query = negate + " EXISTS (SELECT 1 FROM streamdetails WHERE streamdetails.idFile = " + table + ".idFile AND fVideoAspect " + parameter + ")";
+ if (m_field == FieldPlaycount && strType != "songs" && strType != "albums" && strType != "tvshows")
+ { // playcount IS stored as NULL OR number IN video db
+ if ((m_operator == OPERATOR_EQUALS && param == "0") ||
+ (m_operator == OPERATOR_DOES_NOT_EQUAL && param != "0") ||
+ (m_operator == OPERATOR_LESS_THAN))
{
- string fmt = "%s";
- if (GetFieldType(m_field) == NUMERIC_FIELD)
- fmt = "CAST(%s as DECIMAL(5,1))";
- else if (GetFieldType(m_field) == SECONDS_FIELD)
- fmt = "CAST(%s as INTEGER)";
-
- query.Format(fmt.c_str(), GetField(m_field,strType).c_str());
- query += negate + parameter;
+ CStdString field = GetField(FieldPlaycount, strType);
+ query = field + " IS NULL OR " + field + parameter;
}
-
- it++;
- if (query.Equals(negate + parameter))
- query = "1";
-
- query = "(" + query + ")";
- if (it != m_parameter.end())
- query += " OR ";
-
- wholeQuery += query;
}
-
- return wholeQuery;
+ if (query.IsEmpty())
+ query = CDatabaseQueryRule::FormatWhereClause(negate, oper, param, db, strType);
+ return query;
}
-CStdString CSmartPlaylistRule::GetField(Field field, const CStdString& type)
+CStdString CSmartPlaylistRule::GetField(int field, const CStdString &type) const
{
- return DatabaseUtils::GetField(field, DatabaseUtils::MediaTypeFromString(type), DatabaseQueryPartWhere);
+ if (field >= FieldUnknown && field < FieldMax)
+ return DatabaseUtils::GetField((Field)field, DatabaseUtils::MediaTypeFromString(type), DatabaseQueryPartWhere);
+ return "";
}
-CSmartPlaylistRuleCombination::CSmartPlaylistRuleCombination()
- : m_type(CombinationAnd)
-{ }
-
CStdString CSmartPlaylistRuleCombination::GetWhereClause(const CDatabase &db, const CStdString& strType, std::set<CStdString> &referencedPlaylists) const
{
CStdString rule, currentRule;
// translate the combinations into SQL
- for (vector<CSmartPlaylistRuleCombination>::const_iterator it = m_combinations.begin(); it != m_combinations.end(); ++it)
+ for (CDatabaseQueryRuleCombinations::const_iterator it = m_combinations.begin(); it != m_combinations.end(); ++it)
{
if (it != m_combinations.begin())
rule += m_type == CombinationAnd ? " AND " : " OR ";
- rule += "(" + it->GetWhereClause(db, strType, referencedPlaylists) + ")";
+ boost::shared_ptr<CSmartPlaylistRuleCombination> combo = boost::static_pointer_cast<CSmartPlaylistRuleCombination>(*it);
+ if (combo)
+ rule += "(" + combo->GetWhereClause(db, strType, referencedPlaylists) + ")";
}
// translate the rules into SQL
- for (CSmartPlaylistRules::const_iterator it = m_rules.begin(); it != m_rules.end(); ++it)
+ for (CDatabaseQueryRules::const_iterator it = m_rules.begin(); it != m_rules.end(); ++it)
{
// don't include playlists that are meant to be displayed
// as a virtual folders in the SQL WHERE clause
- if (it->m_field == FieldVirtualFolder)
+ if ((*it)->m_field == FieldVirtualFolder)
continue;
if (!rule.empty())
rule += m_type == CombinationAnd ? " AND " : " OR ";
rule += "(";
CStdString currentRule;
- if (it->m_field == FieldPlaylist)
+ if ((*it)->m_field == FieldPlaylist)
{
- CStdString playlistFile = CSmartPlaylistDirectory::GetPlaylistByName(it->m_parameter.at(0), strType);
+ CStdString playlistFile = CSmartPlaylistDirectory::GetPlaylistByName((*it)->m_parameter.at(0), strType);
if (!playlistFile.IsEmpty() && referencedPlaylists.find(playlistFile) == referencedPlaylists.end())
{
referencedPlaylists.insert(playlistFile);
}
if (playlist.GetType().Equals(strType))
{
- if (it->m_operator == CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL)
+ if ((*it)->m_operator == CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL)
currentRule.Format("NOT (%s)", playlistQuery.c_str());
else
currentRule = playlistQuery;
}
}
else
- currentRule = (*it).GetWhereClause(db, strType);
+ currentRule = (*it)->GetWhereClause(db, strType);
// if we don't get a rule, we add '1' or '0' so the query is still valid and doesn't fail
if (currentRule.IsEmpty())
currentRule = m_type == CombinationAnd ? "'1'" : "'0'";
void CSmartPlaylistRuleCombination::GetVirtualFolders(const CStdString& strType, std::vector<CStdString> &virtualFolders) const
{
- for (vector<CSmartPlaylistRuleCombination>::const_iterator it = m_combinations.begin(); it != m_combinations.end(); ++it)
- it->GetVirtualFolders(strType, virtualFolders);
+ for (CDatabaseQueryRuleCombinations::const_iterator it = m_combinations.begin(); it != m_combinations.end(); ++it)
+ {
+ boost::shared_ptr<CSmartPlaylistRuleCombination> combo = boost::static_pointer_cast<CSmartPlaylistRuleCombination>(*it);
+ if (combo)
+ combo->GetVirtualFolders(strType, virtualFolders);
+ }
- for (CSmartPlaylistRules::const_iterator it = m_rules.begin(); it != m_rules.end(); ++it)
+ for (CDatabaseQueryRules::const_iterator it = m_rules.begin(); it != m_rules.end(); ++it)
{
- if ((it->m_field != FieldVirtualFolder && it->m_field != FieldPlaylist) || it->m_operator != CSmartPlaylistRule::OPERATOR_EQUALS)
+ if (((*it)->m_field != FieldVirtualFolder && (*it)->m_field != FieldPlaylist) || (*it)->m_operator != CDatabaseQueryRule::OPERATOR_EQUALS)
continue;
- CStdString playlistFile = CSmartPlaylistDirectory::GetPlaylistByName(it->m_parameter.at(0), strType);
+ CStdString playlistFile = CSmartPlaylistDirectory::GetPlaylistByName((*it)->m_parameter.at(0), strType);
if (playlistFile.empty())
continue;
- if (it->m_field == FieldVirtualFolder)
+ if ((*it)->m_field == FieldVirtualFolder)
virtualFolders.push_back(playlistFile);
else
{
}
}
-bool CSmartPlaylistRuleCombination::Load(const CVariant &obj)
-{
- if (!obj.isObject() && !obj.isArray())
- return false;
-
- CVariant child;
- if (obj.isObject())
- {
- if (obj.isMember("and") && obj["and"].isArray())
- {
- m_type = CombinationAnd;
- child = obj["and"];
- }
- else if (obj.isMember("or") && obj["or"].isArray())
- {
- m_type = CombinationOr;
- child = obj["or"];
- }
- else
- return false;
- }
- else
- child = obj;
-
- for (CVariant::const_iterator_array it = child.begin_array(); it != child.end_array(); it++)
- {
- if (!it->isObject())
- continue;
-
- if (it->isMember("and") || it->isMember("or"))
- {
- CSmartPlaylistRuleCombination combo;
- if (combo.Load(*it))
- m_combinations.push_back(combo);
- }
- else
- {
- CSmartPlaylistRule rule;
- if (rule.Load(*it))
- m_rules.push_back(rule);
- }
- }
-
- return true;
-}
-
-bool CSmartPlaylistRuleCombination::Save(CVariant &obj) const
-{
- if (!obj.isObject() || (m_combinations.empty() && m_rules.empty()))
- return false;
-
- CVariant comboArray(CVariant::VariantTypeArray);
- if (!m_combinations.empty())
- {
- for (CSmartPlaylistRuleCombinations::const_iterator combo = m_combinations.begin(); combo != m_combinations.end(); combo++)
- {
- CVariant comboObj(CVariant::VariantTypeObject);
- if (combo->Save(comboObj))
- comboArray.push_back(comboObj);
- }
-
- }
- if (!m_rules.empty())
- {
- for (CSmartPlaylistRules::const_iterator rule = m_rules.begin(); rule != m_rules.end(); rule++)
- {
- CVariant ruleObj(CVariant::VariantTypeObject);
- if (rule->Save(ruleObj))
- comboArray.push_back(ruleObj);
- }
- }
-
- obj[TranslateCombinationType()] = comboArray;
-
- return true;
-}
-
-std::string CSmartPlaylistRuleCombination::TranslateCombinationType() const
-{
- return m_type == CombinationAnd ? "and" : "or";
-}
-
void CSmartPlaylistRuleCombination::AddRule(const CSmartPlaylistRule &rule)
{
- m_rules.push_back(rule);
-}
-
-void CSmartPlaylistRuleCombination::AddCombination(const CSmartPlaylistRuleCombination &combination)
-{
- m_combinations.push_back(combination);
+ boost::shared_ptr<CSmartPlaylistRule> ptr(new CSmartPlaylistRule(rule));
+ m_rules.push_back(ptr);
}
CSmartPlaylist::CSmartPlaylist()
m_playlistName = obj["name"].asString();
if (obj.isMember("rules"))
- m_ruleCombination.Load(obj["rules"]);
+ m_ruleCombination.Load(obj["rules"], this);
if (obj.isMember("group") && obj["group"].isMember("type") && obj["group"]["type"].isString())
{
XMLUtils::SetString(pRoot, "match", m_ruleCombination.GetType() == CSmartPlaylistRuleCombination::CombinationAnd ? "all" : "one");
// add <rule> tags
- for (CSmartPlaylistRules::const_iterator it = m_ruleCombination.m_rules.begin(); it != m_ruleCombination.m_rules.end(); ++it)
- it->Save(pRoot);
+ m_ruleCombination.Save(pRoot);
// add <group> tag if necessary
if (!m_group.empty())
void CSmartPlaylist::Reset()
{
- m_ruleCombination.m_combinations.clear();
- m_ruleCombination.m_rules.clear();
- m_ruleCombination.SetType(CSmartPlaylistRuleCombination::CombinationAnd);
+ m_ruleCombination.clear();
m_limit = 0;
m_orderField = SortByNone;
m_orderDirection = SortOrderNone;
}
}
-void CSmartPlaylist::GetAvailableOperators(std::vector<std::string> &operatorList)
-{
- for (unsigned int index = 0; index < NUM_OPERATORS; index++)
- operatorList.push_back(operators[index].string);
-}
-
bool CSmartPlaylist::IsEmpty(bool ignoreSortAndLimit /* = true */) const
{
- bool empty = m_ruleCombination.m_rules.empty() && m_ruleCombination.m_combinations.empty();
+ bool empty = m_ruleCombination.empty();
if (empty && !ignoreSortAndLimit)
empty = m_limit <= 0 && m_orderField == SortByNone && m_orderDirection == SortOrderNone;
return false;
}
+
+CDatabaseQueryRule *CSmartPlaylist::CreateRule() const
+{
+ return new CSmartPlaylistRule();
+}
+CDatabaseQueryRuleCombination *CSmartPlaylist::CreateCombination() const
+{
+ return new CSmartPlaylistRuleCombination();
+}
#include <set>
#include <vector>
+#include <boost/shared_ptr.hpp>
+#include "dbwrappers/DatabaseQuery.h"
#include "utils/SortUtils.h"
#include "utils/StdString.h"
#include "utils/XBMCTinyXML.h"
-class CDatabase;
class CVariant;
-class ISmartPlaylistRule
-{
-public:
- virtual ~ISmartPlaylistRule() { }
-
- virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") = 0;
- virtual bool Load(const CVariant &obj) = 0;
- virtual bool Save(TiXmlNode *parent) const = 0;
- virtual bool Save(CVariant &obj) const = 0;
-};
-
-class CSmartPlaylistRule : public ISmartPlaylistRule
+class CSmartPlaylistRule : public CDatabaseQueryRule
{
public:
CSmartPlaylistRule();
virtual ~CSmartPlaylistRule() { }
- enum SEARCH_OPERATOR { OPERATOR_START = 0,
- OPERATOR_CONTAINS,
- OPERATOR_DOES_NOT_CONTAIN,
- OPERATOR_EQUALS,
- OPERATOR_DOES_NOT_EQUAL,
- OPERATOR_STARTS_WITH,
- OPERATOR_ENDS_WITH,
- OPERATOR_GREATER_THAN,
- OPERATOR_LESS_THAN,
- OPERATOR_AFTER,
- OPERATOR_BEFORE,
- OPERATOR_IN_THE_LAST,
- OPERATOR_NOT_IN_THE_LAST,
- OPERATOR_TRUE,
- OPERATOR_FALSE,
- OPERATOR_BETWEEN,
- OPERATOR_END
- };
-
- enum FIELD_TYPE { TEXT_FIELD = 0,
- NUMERIC_FIELD,
- DATE_FIELD,
- PLAYLIST_FIELD,
- SECONDS_FIELD,
- BOOLEAN_FIELD,
- TEXTIN_FIELD
- };
-
- virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8");
- virtual bool Load(const CVariant &obj);
- virtual bool Save(TiXmlNode *parent) const;
- virtual bool Save(CVariant &obj) const;
-
- CStdString GetParameter() const;
- void SetParameter(const CStdString &value);
- void SetParameter(const std::vector<CStdString> &values);
CStdString GetLocalizedRule() const;
- CStdString GetWhereClause(const CDatabase &db, const CStdString& strType) const;
- static Field TranslateField(const char *field);
- static CStdString TranslateField(Field field);
static SortBy TranslateOrder(const char *order);
static CStdString TranslateOrder(SortBy order);
- static CStdString GetField(Field field, const CStdString& strType);
- static CStdString TranslateOperator(SEARCH_OPERATOR oper);
static Field TranslateGroup(const char *group);
static CStdString TranslateGroup(Field group);
- static CStdString GetLocalizedField(Field field);
- static CStdString GetLocalizedOperator(SEARCH_OPERATOR oper);
+ static CStdString GetLocalizedField(int field);
static CStdString GetLocalizedGroup(Field group);
static bool CanGroupMix(Field group);
static std::vector<Field> GetFields(const CStdString &type);
static std::vector<SortBy> GetOrders(const CStdString &type);
static std::vector<Field> GetGroups(const CStdString &type);
- static FIELD_TYPE GetFieldType(Field field);
- static bool IsFieldBrowseable(Field field);
+ virtual FIELD_TYPE GetFieldType(int field) const;
+ static bool IsFieldBrowseable(int field);
static bool Validate(const std::string &input, void *data);
static bool ValidateRating(const std::string &input, void *data);
- Field m_field;
- SEARCH_OPERATOR m_operator;
- std::vector<CStdString> m_parameter;
-private:
- static SEARCH_OPERATOR TranslateOperator(const char *oper);
+protected:
+ virtual CStdString GetField(int field, const CStdString& type) const;
+ virtual int TranslateField(const char *field) const;
+ virtual CStdString TranslateField(int field) const;
+ virtual CStdString FormatParameter(const CStdString &negate, const CStdString &oper, const CDatabase &db, const CStdString &type) const;
+ virtual CStdString FormatWhereClause(const CStdString &negate, const CStdString &oper, const CStdString ¶m,
+ const CDatabase &db, const CStdString &type) const;
+ virtual SEARCH_OPERATOR GetOperator(const CStdString &type) const;
+ virtual CStdString GetBooleanQuery(const CStdString &negate, const CStdString &strType) const;
+private:
CStdString GetVideoResolutionQuery(const CStdString ¶meter) const;
};
-class CSmartPlaylistRuleCombination;
-
-typedef std::vector<CSmartPlaylistRule> CSmartPlaylistRules;
-typedef std::vector<CSmartPlaylistRuleCombination> CSmartPlaylistRuleCombinations;
-
-class CSmartPlaylistRuleCombination : public ISmartPlaylistRule
+class CSmartPlaylistRuleCombination : public CDatabaseQueryRuleCombination
{
public:
- CSmartPlaylistRuleCombination();
+ CSmartPlaylistRuleCombination() { }
virtual ~CSmartPlaylistRuleCombination() { }
- typedef enum {
- CombinationOr = 0,
- CombinationAnd
- } Combination;
-
- virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") { return false; }
- virtual bool Load(const CVariant &obj);
- virtual bool Save(TiXmlNode *parent) const { return false; }
- virtual bool Save(CVariant &obj) const;
-
CStdString GetWhereClause(const CDatabase &db, const CStdString& strType, std::set<CStdString> &referencedPlaylists) const;
void GetVirtualFolders(const CStdString& strType, std::vector<CStdString> &virtualFolders) const;
- std::string TranslateCombinationType() const;
-
- Combination GetType() const { return m_type; }
- void SetType(Combination combination) { m_type = combination; }
void AddRule(const CSmartPlaylistRule &rule);
- void AddCombination(const CSmartPlaylistRuleCombination &rule);
-
-private:
- friend class CSmartPlaylist;
- friend class CGUIDialogSmartPlaylistEditor;
- friend class CGUIDialogMediaFilter;
-
- Combination m_type;
- CSmartPlaylistRuleCombinations m_combinations;
- CSmartPlaylistRules m_rules;
};
-class CSmartPlaylist
+class CSmartPlaylist : public IDatabaseQueryRuleFactory
{
public:
CSmartPlaylist();
CStdString GetSaveLocation() const;
static void GetAvailableFields(const std::string &type, std::vector<std::string> &fieldList);
- static void GetAvailableOperators(std::vector<std::string> &operatorList);
static bool IsVideoType(const CStdString &type);
static bool IsMusicType(const CStdString &type);
static bool CheckTypeCompatibility(const CStdString &typeLeft, const CStdString &typeRight);
bool IsEmpty(bool ignoreSortAndLimit = true) const;
+
+ // rule creation
+ virtual CDatabaseQueryRule *CreateRule() const;
+ virtual CDatabaseQueryRuleCombination *CreateCombination() const;
private:
friend class CGUIDialogSmartPlaylistEditor;
friend class CGUIDialogMediaFilter;
--- /dev/null
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <map>
+
+#include "SmartPlaylistFileItemListModifier.h"
+#include "FileItem.h"
+#include "URL.h"
+#include "playlists/SmartPlayList.h"
+#include "utils/StringUtils.h"
+
+#define URL_OPTION_XSP "xsp"
+#define PROPERTY_SORT_ORDER "sort.order"
+#define PROPERTY_SORT_ASCENDING "sort.ascending"
+using namespace std;
+
+bool CSmartPlaylistFileItemListModifier::CanModify(const CFileItemList &items) const
+{
+ return !GetUrlOption(items.GetPath(), URL_OPTION_XSP).empty();
+}
+
+bool CSmartPlaylistFileItemListModifier::Modify(CFileItemList &items) const
+{
+ if (items.HasProperty(PROPERTY_SORT_ORDER))
+ return false;
+
+ std::string xspOption = GetUrlOption(items.GetPath(), URL_OPTION_XSP);
+ if (xspOption.empty())
+ return false;
+
+ // check for smartplaylist-specific sorting information
+ CSmartPlaylist xsp;
+ if (!xsp.LoadFromJson(xspOption))
+ return false;
+
+ items.SetProperty(PROPERTY_SORT_ORDER, (int)xsp.GetOrder());
+ items.SetProperty(PROPERTY_SORT_ASCENDING, xsp.GetOrderDirection() == SortOrderAscending);
+
+ return true;
+}
+
+std::string CSmartPlaylistFileItemListModifier::GetUrlOption(const std::string &path, const std::string &option)
+{
+ if (path.empty() || option.empty())
+ return StringUtils::Empty;
+
+ CURL url(path);
+ return url.GetOption(option);
+}
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <string>
+
+#include "IFileItemListModifier.h"
+
+class CSmartPlaylistFileItemListModifier : public IFileItemListModifier
+{
+public:
+ CSmartPlaylistFileItemListModifier() { }
+ virtual ~CSmartPlaylistFileItemListModifier() { }
+
+ virtual bool CanModify(const CFileItemList &items) const;
+ virtual bool Modify(CFileItemList &items) const;
+
+private:
+ static std::string GetUrlOption(const std::string &path, const std::string &option);
+};
return sProfilesManager;
}
-bool CProfilesManager::OnSettingsLoading()
-{
- return true;
-}
-
void CProfilesManager::OnSettingsLoaded()
{
// check them all
public:
static CProfilesManager& Get();
- virtual bool OnSettingsLoading();
virtual void OnSettingsLoaded();
virtual bool OnSettingsSaved();
virtual void OnSettingsCleared();
#include "settings/AdvancedSettings.h"
#include "RenderSystemGLES.h"
#include "guilib/MatrixGLES.h"
+#include "windowing/WindowingFactory.h"
#include "utils/log.h"
#include "utils/GLUtils.h"
#include "utils/TimeUtils.h"
m_pGUIshader = new CGUIShader*[SM_ESHADERCOUNT];
for (int i = 0; i < SM_ESHADERCOUNT; i++)
{
+ if (i == SM_TEXTURE_RGBA_OES)
+ {
+ if (!g_Windowing.IsExtSupported("GL_OES_EGL_image_external"))
+ {
+ m_pGUIshader[i] = NULL;
+ continue;
+ }
+ }
+
m_pGUIshader[i] = new CGUIShader( ShaderNames[i] );
if (!m_pGUIshader[i]->CompileAndLink())
m_DXVAForceProcessorRenderer = true;
m_DXVANoDeintProcForProgressive = false;
m_videoFpsDetect = 1;
+ m_videoBusyDialogDelay_ms = 500;
m_stagefrightConfig.useAVCcodec = -1;
m_stagefrightConfig.useVC1codec = -1;
m_stagefrightConfig.useVPXcodec = -1;
//0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps
XMLUtils::GetInt(pElement, "fpsdetect", m_videoFpsDetect, 0, 2);
+ // controls the delay, in milliseconds, until
+ // the busy dialog is shown when starting video playback.
+ XMLUtils::GetInt(pElement, "busydialogdelayms", m_videoBusyDialogDelay_ms, 0, 1000);
+
// Store global display latency settings
TiXmlElement* pVideoLatency = pElement->FirstChildElement("latency");
if (pVideoLatency)
bool m_DXVAForceProcessorRenderer;
bool m_DXVANoDeintProcForProgressive;
int m_videoFpsDetect;
+ int m_videoBusyDialogDelay_ms;
bool m_videoDisableHi10pMultithreading;
StagefrightConfig m_stagefrightConfig;
*/
#include "ISetting.h"
+#include "SettingDefinitions.h"
#include "utils/log.h"
#include "utils/XBMCTinyXML.h"
#include "utils/XMLUtils.h"
-#define XML_VISIBLE "visible"
-#define XML_REQUIREMENT "requirement"
-#define XML_CONDITION "condition"
-
using namespace std;
ISetting::ISetting(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
return false;
bool value;
- if (XMLUtils::GetBoolean(node, XML_VISIBLE, value))
+ if (XMLUtils::GetBoolean(node, SETTING_XML_ELM_VISIBLE, value))
m_visible = value;
- const TiXmlNode *requirementNode = node->FirstChild(XML_REQUIREMENT);
+ const TiXmlNode *requirementNode = node->FirstChild(SETTING_XML_ELM_REQUIREMENT);
if (requirementNode == NULL)
return true;
if (element == NULL)
return false;
- const char *idAttribute = element->Attribute(XML_ATTR_ID);
+ const char *idAttribute = element->Attribute(SETTING_XML_ATTR_ID);
if (idAttribute == NULL || strlen(idAttribute) <= 0)
return false;
#include "SettingRequirement.h"
-#define XML_SETTING "setting"
-
-#define XML_ATTR_ID "id"
-#define XML_ATTR_LABEL "label"
-#define XML_ATTR_HELP "help"
-#define XML_ATTR_TYPE "type"
-
class CSettingsManager;
class TiXmlNode;
--- /dev/null
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "ISettingControl.h"
+#include "SettingDefinitions.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
+#include "utils/XBMCTinyXML.h"
+
+bool ISettingControl::Deserialize(const TiXmlNode *node, bool update /* = false */)
+{
+ if (node == NULL)
+ return false;
+
+ const TiXmlElement *elem = node->ToElement();
+ if (elem == NULL)
+ return false;
+
+ const char *strTmp = elem->Attribute(SETTING_XML_ATTR_FORMAT);
+ std::string format;
+ if (strTmp != NULL)
+ format = strTmp;
+ if (!SetFormat(format))
+ {
+ CLog::Log(LOGERROR, "ISettingControl: error reading \"format\" attribute of <control>");
+ return false;
+ }
+
+ if ((strTmp = elem->Attribute(SETTING_XML_ATTR_DELAYED)) != NULL)
+ {
+ if (!StringUtils::EqualsNoCase(strTmp, "false") && !StringUtils::EqualsNoCase(strTmp, "true"))
+ {
+ CLog::Log(LOGERROR, "ISettingControl: error reading \"delayed\" attribute of <control>");
+ return false;
+ }
+ else
+ m_delayed = StringUtils::EqualsNoCase(strTmp, "true");
+ }
+
+ return true;
+}
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <string>
+
+class TiXmlNode;
+
+class ISettingControl
+{
+public:
+ ISettingControl()
+ : m_delayed(false)
+ { }
+ virtual ~ISettingControl() { }
+
+ virtual std::string GetType() const = 0;
+ const std::string& GetFormat() const { return m_format; }
+ bool GetDelayed() const { return m_delayed; }
+
+ virtual bool Deserialize(const TiXmlNode *node, bool update = false);
+
+protected:
+ virtual bool SetFormat(const std::string &format) { return true; }
+
+ bool m_delayed;
+ std::string m_format;
+};
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <string>
+
+class ISettingControl;
+
+/*!
+ \ingroup settings
+ \brief Interface for creating a new setting control of a custom setting control type.
+ */
+class ISettingControlCreator
+{
+public:
+ virtual ~ISettingControlCreator() { }
+
+ /*!
+ \brief Creates a new setting control of the given custom setting control type.
+
+ \param controlType string representation of the setting control type
+ \return A new setting control object of the given (custom) setting control type or NULL if the setting control type is unknown
+ */
+ virtual ISettingControl* CreateControl(const std::string &controlType) const = 0;
+};
SRCS=AdvancedSettings.cpp \
DisplaySettings.cpp \
ISetting.cpp \
+ ISettingControl.cpp \
MediaSettings.cpp \
MediaSourceSettings.cpp \
Setting.cpp \
#include <sstream>
#include "Setting.h"
+#include "SettingDefinitions.h"
#include "SettingsManager.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "utils/XBMCTinyXML.h"
#include "utils/XMLUtils.h"
-#define XML_ELM_LEVEL "level"
-#define XML_ELM_DEFAULT "default"
-#define XML_ELM_VALUE "value"
-
-#define XML_ELM_CONTROL "control"
-#define XML_ELM_CONSTRAINTS "constraints"
-#define XML_ELM_OPTIONS "options"
-#define XML_ELM_OPTION "option"
-#define XML_ELM_MINIMUM "minimum"
-#define XML_ELM_STEP "step"
-#define XML_ELM_MAXIMUM "maximum"
-#define XML_ELM_DEPENDENCIES "dependencies"
-#define XML_ELM_DEPENDENCY "dependency"
-#define XML_ELM_UPDATES "updates"
-#define XML_ELM_UPDATE "update"
-
CSetting::CSetting(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
: ISetting(id, settingsManager),
m_callback(NULL),
m_label(-1), m_help(-1),
m_level(SettingLevelStandard),
+ m_control(NULL),
m_changed(false)
{ }
m_callback(NULL),
m_label(-1), m_help(-1),
m_level(SettingLevelStandard),
+ m_control(NULL),
m_changed(false)
{
m_id = id;
Copy(setting);
}
+CSetting::~CSetting()
+{
+ delete m_control;
+}
+
bool CSetting::Deserialize(const TiXmlNode *node, bool update /* = false */)
{
// handle <visible> conditions
// get the attributes label and help
int tmp = -1;
- if (element->QueryIntAttribute(XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0)
+ if (element->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0)
m_label = tmp;
tmp = -1;
- if (element->QueryIntAttribute(XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0)
+ if (element->QueryIntAttribute(SETTING_XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0)
m_help = tmp;
- const char *parentSetting = element->Attribute("parent");
+ const char *parentSetting = element->Attribute(SETTING_XML_ATTR_PARENT);
if (parentSetting != NULL)
m_parentSetting = parentSetting;
// get the <level>
int level = -1;
- if (XMLUtils::GetInt(node, XML_ELM_LEVEL, level))
+ if (XMLUtils::GetInt(node, SETTING_XML_ELM_LEVEL, level))
m_level = (SettingLevel)level;
if (m_level < (int)SettingLevelBasic || m_level > (int)SettingLevelInternal)
m_level = SettingLevelStandard;
- const TiXmlNode *dependencies = node->FirstChild(XML_ELM_DEPENDENCIES);
+ const TiXmlNode *dependencies = node->FirstChild(SETTING_XML_ELM_DEPENDENCIES);
if (dependencies != NULL)
{
- const TiXmlNode *dependencyNode = dependencies->FirstChild(XML_ELM_DEPENDENCY);
+ const TiXmlNode *dependencyNode = dependencies->FirstChild(SETTING_XML_ELM_DEPENDENCY);
while (dependencyNode != NULL)
{
CSettingDependency dependency(m_settingsManager);
else
CLog::Log(LOGWARNING, "CSetting: error reading <dependency> tag of \"%s\"", m_id.c_str());
- dependencyNode = dependencyNode->NextSibling(XML_ELM_DEPENDENCY);
+ dependencyNode = dependencyNode->NextSibling(SETTING_XML_ELM_DEPENDENCY);
}
}
- const TiXmlElement *control = node->FirstChildElement(XML_ELM_CONTROL);
+ const TiXmlElement *control = node->FirstChildElement(SETTING_XML_ELM_CONTROL);
if (control != NULL)
{
- if (!m_control.Deserialize(control, update) ||
- m_control.GetType() == SettingControlTypeNone)
+ const char *controlType = control->Attribute(SETTING_XML_ATTR_TYPE);
+ if (controlType == NULL)
+ {
+ CLog::Log(LOGERROR, "CSetting: error reading \"type\" attribute of <control> tag of \"%s\"", m_id.c_str());
+ return false;
+ }
+
+ m_control = m_settingsManager->CreateControl(controlType);
+ if (m_control == NULL || !m_control->Deserialize(control, update))
{
CLog::Log(LOGERROR, "CSetting: error reading <control> tag of \"%s\"", m_id.c_str());
return false;
}
}
+ else if (!update && m_level < SettingLevelInternal)
+ {
+ CLog::Log(LOGERROR, "CSetting: missing <control> tag of \"%s\"", m_id.c_str());
+ return false;
+ }
- const TiXmlNode *updates = node->FirstChild(XML_ELM_UPDATES);
+ const TiXmlNode *updates = node->FirstChild(SETTING_XML_ELM_UPDATES);
if (updates != NULL)
{
- const TiXmlElement *updateElem = updates->FirstChildElement(XML_ELM_UPDATE);
+ const TiXmlElement *updateElem = updates->FirstChildElement(SETTING_XML_ELM_UPDATE);
while (updateElem != NULL)
{
CSettingUpdate update;
else
CLog::Log(LOGWARNING, "CSetting: error reading <update> tag of \"%s\"", m_id.c_str());
- updateElem = updateElem->NextSiblingElement(XML_ELM_UPDATE);
+ updateElem = updateElem->NextSiblingElement(SETTING_XML_ELM_UPDATE);
}
}
-
- if ((m_control.GetType() == SettingControlTypeSpinner || m_control.GetType() == SettingControlTypeEdit) &&
- m_control.GetFormat() == SettingControlFormatNone)
- {
- CLog::Log(LOGERROR, "CSetting: invalid <control> tag of \"%s\"", m_id.c_str());
- return false;
- }
return true;
}
m_label = setting.m_label;
m_help = setting.m_help;
m_level = setting.m_level;
- m_control = setting.m_control;
+
+ delete m_control;
+ if (setting.m_control != NULL)
+ {
+ m_control = m_settingsManager->CreateControl(setting.m_control->GetType());
+ *m_control = *setting.m_control;
+ }
+ else
+ m_control = NULL;
+
m_dependencies = setting.m_dependencies;
m_updates = setting.m_updates;
m_changed = setting.m_changed;
CSettingBool::CSettingBool(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
: CSetting(id, settingsManager),
m_value(false), m_default(false)
-{
- m_control.SetType(SettingControlTypeCheckmark);
- m_control.SetFormat(SettingControlFormatBoolean);
- m_control.SetAttributes(SettingControlAttributeNone);
-}
+{ }
CSettingBool::CSettingBool(const std::string &id, const CSettingBool &setting)
: CSetting(id, setting)
m_value(value), m_default(value)
{
m_label = label;
-
- m_control.SetType(SettingControlTypeCheckmark);
- m_control.SetFormat(SettingControlFormatBoolean);
- m_control.SetAttributes(SettingControlAttributeNone);
}
bool CSettingBool::Deserialize(const TiXmlNode *node, bool update /* = false */)
if (!CSetting::Deserialize(node, update))
return false;
-
- if (m_control.GetType() != SettingControlTypeCheckmark ||
- m_control.GetFormat() != SettingControlFormatBoolean ||
- m_control.GetAttributes() != SettingControlAttributeNone)
- {
- CLog::Log(LOGERROR, "CSettingBool: invalid <control> of \"%s\"", m_id.c_str());
- return false;
- }
// get the default value
bool value;
- if (XMLUtils::GetBoolean(node, XML_ELM_DEFAULT, value))
+ if (XMLUtils::GetBoolean(node, SETTING_XML_ELM_DEFAULT, value))
m_value = m_default = value;
else if (!update)
{
CSettingInt::CSettingInt(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
: CSetting(id, settingsManager),
m_value(0), m_default(0),
- m_min(0), m_step(1), m_max(0),
- m_format(-1), m_labelMin(-1), m_strFormat("%i")
+ m_min(0), m_step(1), m_max(0)
{ }
CSettingInt::CSettingInt(const std::string &id, const CSettingInt &setting)
copy(setting);
}
-CSettingInt::CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, int format, int minimumLabel, CSettingsManager *settingsManager /* = NULL */)
+CSettingInt::CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, CSettingsManager *settingsManager /* = NULL */)
: CSetting(id, settingsManager),
m_value(value), m_default(value),
- m_min(minimum), m_step(step), m_max(maximum),
- m_format(format), m_labelMin(minimumLabel), m_strFormat("%i")
+ m_min(minimum), m_step(step), m_max(maximum)
{
m_label = label;
-
- m_control.SetType(SettingControlTypeSpinner);
- if (format < 0)
- m_control.SetFormat(SettingControlFormatInteger);
- else
- m_control.SetFormat(SettingControlFormatString);
- m_control.SetAttributes(SettingControlAttributeNone);
-}
-
-CSettingInt::CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, const std::string &format, CSettingsManager *settingsManager /* = NULL */)
- : CSetting(id, settingsManager),
- m_value(value), m_default(value),
- m_min(minimum), m_step(step), m_max(maximum),
- m_format(-1), m_labelMin(-1), m_strFormat(format)
-{
- m_label = label;
-
- m_control.SetType(SettingControlTypeSpinner);
- if (format.empty())
- {
- m_strFormat = "%i";
- m_control.SetFormat(SettingControlFormatInteger);
- }
- else
- m_control.SetFormat(SettingControlFormatString);
- m_control.SetAttributes(SettingControlAttributeNone);
}
CSettingInt::CSettingInt(const std::string &id, int label, int value, const StaticIntegerSettingOptions &options, CSettingsManager *settingsManager /* = NULL */)
: CSetting(id, settingsManager),
m_value(value), m_default(value),
m_min(0), m_step(1), m_max(0),
- m_format(-1), m_labelMin(-1), m_strFormat("%i"),
m_options(options)
{
m_label = label;
-
- m_control.SetType(SettingControlTypeSpinner);
- m_control.SetFormat(SettingControlFormatString);
- m_control.SetAttributes(SettingControlAttributeNone);
}
bool CSettingInt::Deserialize(const TiXmlNode *node, bool update /* = false */)
if (!CSetting::Deserialize(node, update))
return false;
- if (m_control.GetType() == SettingControlTypeCheckmark)
- {
- CLog::Log(LOGERROR, "CSettingInt: invalid <control> of \"%s\"", m_id.c_str());
- return false;
- }
-
// get the default value
int value;
- if (XMLUtils::GetInt(node, XML_ELM_DEFAULT, value))
+ if (XMLUtils::GetInt(node, SETTING_XML_ELM_DEFAULT, value))
m_value = m_default = value;
else if (!update)
{
return false;
}
- if (m_control.GetFormat() == SettingControlFormatString)
- {
- const TiXmlNode *control = node->FirstChild(XML_ELM_CONTROL);
- if (control != NULL)
- XMLUtils::GetInt(control, "formatlabel", m_format);
- }
-
- const TiXmlNode *constraints = node->FirstChild(XML_ELM_CONSTRAINTS);
+ const TiXmlNode *constraints = node->FirstChild(SETTING_XML_ELM_CONSTRAINTS);
if (constraints != NULL)
{
// get the entries
- const TiXmlNode *options = constraints->FirstChild(XML_ELM_OPTIONS);
+ const TiXmlNode *options = constraints->FirstChild(SETTING_XML_ELM_OPTIONS);
if (options != NULL && options->FirstChild() != NULL)
{
if (options->FirstChild()->Type() == TiXmlNode::TINYXML_TEXT)
else
{
m_options.clear();
- const TiXmlElement *optionElement = options->FirstChildElement(XML_ELM_OPTION);
+ const TiXmlElement *optionElement = options->FirstChildElement(SETTING_XML_ELM_OPTION);
while (optionElement != NULL)
{
std::pair<int, int> entry;
- if (optionElement->QueryIntAttribute("label", &entry.first) == TIXML_SUCCESS && entry.first > 0)
+ if (optionElement->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &entry.first) == TIXML_SUCCESS && entry.first > 0)
{
entry.second = strtol(optionElement->FirstChild()->Value(), NULL, 10);
m_options.push_back(entry);
}
- optionElement = optionElement->NextSiblingElement(XML_ELM_OPTION);
+ optionElement = optionElement->NextSiblingElement(SETTING_XML_ELM_OPTION);
}
}
}
// get minimum
- if (XMLUtils::GetInt(constraints, XML_ELM_MINIMUM, m_min) &&
- m_control.GetFormat() == SettingControlFormatString)
- {
- const TiXmlElement *minimumElement = constraints->FirstChildElement(XML_ELM_MINIMUM);
- if (minimumElement->QueryIntAttribute(XML_ATTR_LABEL, &m_labelMin) != TIXML_SUCCESS)
- m_labelMin = -1;
- }
+ XMLUtils::GetInt(constraints, SETTING_XML_ELM_MINIMUM, m_min);
// get step
- XMLUtils::GetInt(constraints, XML_ELM_STEP, m_step);
+ XMLUtils::GetInt(constraints, SETTING_XML_ELM_STEP, m_step);
// get maximum
- XMLUtils::GetInt(constraints, XML_ELM_MAXIMUM, m_max);
-
- if (m_control.GetFormat() == SettingControlFormatString && m_labelMin < 0)
- {
- CStdString strFormat;
- if (XMLUtils::GetString(constraints, "format", strFormat) && !strFormat.empty())
- m_strFormat = strFormat;
- }
+ XMLUtils::GetInt(constraints, SETTING_XML_ELM_MAXIMUM, m_max);
}
return true;
m_min = setting.m_min;
m_step = setting.m_step;
m_max = setting.m_max;
- m_format = setting.m_format;
- m_labelMin = setting.m_labelMin;
- m_strFormat = setting.m_strFormat;
m_options = setting.m_options;
m_optionsFiller = setting.m_optionsFiller;
}
m_min(minimum), m_step(step), m_max(maximum)
{
m_label = label;
-
- m_control.SetType(SettingControlTypeSpinner);
- m_control.SetFormat(SettingControlFormatNumber);
- m_control.SetAttributes(SettingControlAttributeNone);
}
bool CSettingNumber::Deserialize(const TiXmlNode *node, bool update /* = false */)
if (!CSetting::Deserialize(node, update))
return false;
- if (m_control.GetType() == SettingControlTypeCheckmark ||
- m_control.GetType() == SettingControlTypeList)
- {
- CLog::Log(LOGERROR, "CSettingInt: invalid <control> of \"%s\"", m_id.c_str());
- return false;
- }
-
// get the default value
double value;
- if (XMLUtils::GetDouble(node, XML_ELM_DEFAULT, value))
+ if (XMLUtils::GetDouble(node, SETTING_XML_ELM_DEFAULT, value))
m_value = m_default = value;
else if (!update)
{
return false;
}
- const TiXmlNode *constraints = node->FirstChild(XML_ELM_CONSTRAINTS);
+ const TiXmlNode *constraints = node->FirstChild(SETTING_XML_ELM_CONSTRAINTS);
if (constraints != NULL)
{
// get the minimum value
- XMLUtils::GetDouble(constraints, XML_ELM_MINIMUM, m_min);
+ XMLUtils::GetDouble(constraints, SETTING_XML_ELM_MINIMUM, m_min);
// get the step value
- XMLUtils::GetDouble(constraints, XML_ELM_STEP, m_step);
+ XMLUtils::GetDouble(constraints, SETTING_XML_ELM_STEP, m_step);
// get the maximum value
- XMLUtils::GetDouble(constraints, XML_ELM_MAXIMUM, m_max);
+ XMLUtils::GetDouble(constraints, SETTING_XML_ELM_MAXIMUM, m_max);
}
return true;
CSettingString::CSettingString(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
: CSetting(id, settingsManager),
- m_allowEmpty(false), m_heading(-1)
+ m_allowEmpty(false)
{ }
CSettingString::CSettingString(const std::string &id, const CSettingString &setting)
CSettingString::CSettingString(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager /* = NULL */)
: CSetting(id, settingsManager),
m_value(value), m_default(value),
- m_allowEmpty(false), m_heading(-1)
+ m_allowEmpty(false)
{
m_label = label;
-
- m_control.SetType(SettingControlTypeEdit);
- m_control.SetFormat(SettingControlFormatString);
- m_control.SetAttributes(SettingControlAttributeNone);
}
bool CSettingString::Deserialize(const TiXmlNode *node, bool update /* = false */)
if (!CSetting::Deserialize(node, update))
return false;
- if (m_control.GetType() == SettingControlTypeCheckmark ||
- (m_control.GetType() == SettingControlTypeSpinner && (m_control.GetFormat() == SettingControlFormatInteger || m_control.GetFormat() == SettingControlFormatNumber)) ||
- (m_control.GetType() == SettingControlTypeEdit && m_control.GetFormat() == SettingControlFormatNumber))
- {
- CLog::Log(LOGERROR, "CSettingString: invalid <control> of \"%s\"", m_id.c_str());
- return false;
- }
-
- const TiXmlNode *control = node->FirstChild(XML_ELM_CONTROL);
- if (control != NULL)
- {
- // get heading
- XMLUtils::GetInt(control, "heading", m_heading);
- }
-
- const TiXmlNode *constraints = node->FirstChild(XML_ELM_CONSTRAINTS);
+ const TiXmlNode *constraints = node->FirstChild(SETTING_XML_ELM_CONSTRAINTS);
if (constraints != NULL)
{
// get allowempty (needs to be parsed before parsing the default value)
- XMLUtils::GetBoolean(constraints, "allowempty", m_allowEmpty);
+ XMLUtils::GetBoolean(constraints, SETTING_XML_ELM_ALLOWEMPTY, m_allowEmpty);
// get the entries
- const TiXmlNode *options = constraints->FirstChild(XML_ELM_OPTIONS);
+ const TiXmlNode *options = constraints->FirstChild(SETTING_XML_ELM_OPTIONS);
if (options != NULL && options->FirstChild() != NULL &&
options->FirstChild()->Type() == TiXmlNode::TINYXML_TEXT)
m_optionsFiller = options->FirstChild()->ValueStr();
// get the default value
CStdString value;
- if (XMLUtils::GetString(node, XML_ELM_DEFAULT, value) && !value.empty())
+ if (XMLUtils::GetString(node, SETTING_XML_ELM_DEFAULT, value) && !value.empty())
m_value = m_default = value;
else if (!update && !m_allowEmpty)
{
m_value = setting.m_value;
m_default = setting.m_default;
m_allowEmpty = setting.m_allowEmpty;
- m_heading = setting.m_heading;
}
CSettingAction::CSettingAction(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
: CSetting(id, settingsManager)
-{
- m_control.SetType(SettingControlTypeButton);
- m_control.SetFormat(SettingControlFormatAction);
- m_control.SetAttributes(SettingControlAttributeNone);
-}
+{ }
CSettingAction::CSettingAction(const std::string &id, const CSettingAction &setting)
: CSetting(id, setting)
-{
- m_control.SetType(SettingControlTypeButton);
- m_control.SetFormat(SettingControlFormatAction);
- m_control.SetAttributes(SettingControlAttributeNone);
-}
+{ }
bool CSettingAction::Deserialize(const TiXmlNode *node, bool update /* = false */)
{
if (!CSetting::Deserialize(node, update))
return false;
- if (m_control.GetType() != SettingControlTypeButton ||
- m_control.GetFormat() != SettingControlFormatAction ||
- m_control.GetAttributes() != SettingControlAttributeNone)
- {
- CLog::Log(LOGERROR, "CSettingAction: invalid <control> of \"%s\"", m_id.c_str());
- return false;
- }
-
return true;
}
#include "ISetting.h"
#include "ISettingCallback.h"
-#include "SettingControl.h"
+#include "ISettingControl.h"
#include "SettingDependency.h"
#include "SettingUpdate.h"
#include "threads/SharedSection.h"
public:
CSetting(const std::string &id, CSettingsManager *settingsManager = NULL);
CSetting(const std::string &id, const CSetting &setting);
- virtual ~CSetting() { }
+ virtual ~CSetting();
virtual bool Deserialize(const TiXmlNode *node, bool update = false);
bool IsEnabled() const;
const std::string& GetParent() const { return m_parentSetting; }
SettingLevel GetLevel() const { return m_level; }
- const CSettingControl& GetControl() const { return m_control; }
+ const ISettingControl* GetControl() const { return m_control; }
+ void SetControl(ISettingControl* control) { m_control = control; }
const SettingDependencies& GetDependencies() const { return m_dependencies; }
const std::set<CSettingUpdate>& GetUpdates() const { return m_updates; }
int m_help;
std::string m_parentSetting;
SettingLevel m_level;
- CSettingControl m_control;
+ ISettingControl *m_control;
SettingDependencies m_dependencies;
std::set<CSettingUpdate> m_updates;
bool m_changed;
public:
CSettingInt(const std::string &id, CSettingsManager *settingsManager = NULL);
CSettingInt(const std::string &id, const CSettingInt &setting);
- CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, int format, int minimumLabel, CSettingsManager *settingsManager = NULL);
- CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, const std::string &format, CSettingsManager *settingsManager = NULL);
+ CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, CSettingsManager *settingsManager = NULL);
CSettingInt(const std::string &id, int label, int value, const StaticIntegerSettingOptions &options, CSettingsManager *settingsManager = NULL);
virtual ~CSettingInt() { }
int GetStep() const { return m_step; }
int GetMaximum() const { return m_max; }
- int GetFormat() const { return m_format; }
- int GetMinimumLabel() const { return m_labelMin; }
- const std::string& GetFormatString() const { return m_strFormat; }
SettingOptionsType GetOptionsType() const;
const StaticIntegerSettingOptions& GetOptions() const { return m_options; }
const std::string& GetOptionsFiller() const { return m_optionsFiller; }
int m_min;
int m_step;
int m_max;
- int m_format;
- int m_labelMin;
- std::string m_strFormat;
StaticIntegerSettingOptions m_options;
std::string m_optionsFiller;
DynamicIntegerSettingOptions m_dynamicOptions;
virtual void SetDefault(const std::string &value);
virtual bool AllowEmpty() const { return m_allowEmpty; }
- virtual int GetHeading() const { return m_heading; }
SettingOptionsType GetOptionsType() const;
const std::string& GetOptionsFiller() const { return m_optionsFiller; }
std::string m_value;
std::string m_default;
bool m_allowEmpty;
- int m_heading;
std::string m_optionsFiller;
DynamicStringSettingOptions m_dynamicOptions;
};
CSettingAddon::CSettingAddon(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
: CSettingString(id, settingsManager),
m_addonType(ADDON::ADDON_UNKNOWN)
-{
- m_control.SetType(SettingControlTypeButton);
- m_control.SetFormat(SettingControlFormatAddon);
- m_control.SetAttributes(SettingControlAttributeNone);
-}
+{ }
CSettingAddon::CSettingAddon(const std::string &id, const CSettingAddon &setting)
: CSettingString(id, setting)
if (!CSettingString::Deserialize(node, update))
return false;
- if (m_control.GetType() != SettingControlTypeButton ||
- m_control.GetFormat() != SettingControlFormatAddon ||
- m_control.GetAttributes() != SettingControlAttributeNone)
+ if (m_control != NULL &&
+ (m_control->GetType() != "button" || m_control->GetFormat() != "addon"))
{
CLog::Log(LOGERROR, "CSettingAddon: invalid <control> of \"%s\"", m_id.c_str());
return false;
*/
#include "SettingConditions.h"
+#include "SettingDefinitions.h"
#include "SettingsManager.h"
#include "utils/StringUtils.h"
#include "utils/XBMCTinyXML.h"
return false;
// get the "name" attribute
- const char *strAttribute = elem->Attribute("name");
+ const char *strAttribute = elem->Attribute(SETTING_XML_ATTR_NAME);
if (strAttribute != NULL)
m_name = strAttribute;
// get the "setting" attribute
- strAttribute = elem->Attribute("setting");
+ strAttribute = elem->Attribute(SETTING_XML_ATTR_SETTING);
if (strAttribute != NULL)
m_setting = strAttribute;
#include <set>
#include <string>
+#include "SettingDefinitions.h"
#include "utils/BooleanLogic.h"
class CSettingsManager;
virtual ~CSettingConditionItem() { }
virtual bool Deserialize(const TiXmlNode *node);
- virtual const char* GetTag() const { return "condition"; }
+ virtual const char* GetTag() const { return SETTING_XML_ELM_CONDITION; }
virtual bool Check() const;
protected:
#include <vector>
#include "SettingControl.h"
+#include "settings/SettingDefinitions.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "utils/XBMCTinyXML.h"
+#include "utils/XMLUtils.h"
-bool CSettingControl::Deserialize(const TiXmlNode *node, bool update /* = false */)
+bool CSettingControlCheckmark::SetFormat(const std::string &format)
{
- if (node == NULL)
- return false;
+ return format.empty() || StringUtils::EqualsNoCase(format, "boolean");
+}
- const TiXmlElement *elem = node->ToElement();
- if (elem == NULL)
+bool CSettingControlSpinner::Deserialize(const TiXmlNode *node, bool update /* = false */)
+{
+ if (!ISettingControl::Deserialize(node, update))
return false;
- const char *strTmp = elem->Attribute("type");
- if ((strTmp == NULL && !update && m_type == SettingControlTypeNone) || (strTmp != NULL && !setType(strTmp)))
+ if (m_format == "string")
{
- CLog::Log(LOGERROR, "CSetting: error reading \"type\" attribute of <control>");
- return false;
+ XMLUtils::GetInt(node, SETTING_XML_ELM_CONTROL_FORMATLABEL, m_formatLabel);
+
+ // get the minimum label from <setting><constraints><minimum label="X" />
+ const TiXmlNode *settingNode = node->Parent();
+ if (settingNode != NULL)
+ {
+ const TiXmlNode *contraintsNode = settingNode->FirstChild(SETTING_XML_ELM_CONSTRAINTS);
+ if (contraintsNode != NULL)
+ {
+ const TiXmlNode *minimumNode = contraintsNode->FirstChild(SETTING_XML_ELM_MINIMUM);
+ if (minimumNode != NULL)
+ {
+ const TiXmlElement *minimumElem = minimumNode->ToElement();
+ if (minimumElem != NULL)
+ {
+ if (minimumElem->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &m_minimumLabel) != TIXML_SUCCESS)
+ m_minimumLabel = -1;
+ }
+ }
+ }
+ }
+
+ if (m_minimumLabel < 0)
+ {
+ std::string strFormat;
+ if (XMLUtils::GetString(node, SETTING_XML_ATTR_FORMAT, strFormat) && !strFormat.empty())
+ m_formatString = strFormat;
+ }
}
- strTmp = elem->Attribute("format");
- if ((strTmp == NULL && !update && m_format == SettingControlFormatNone) || (strTmp != NULL && !setFormat(strTmp)))
- {
- CLog::Log(LOGERROR, "CSetting: error reading \"format\" attribute of <control>");
+ return true;
+}
+
+bool CSettingControlSpinner::SetFormat(const std::string &format)
+{
+ if (!StringUtils::EqualsNoCase(format, "string") &&
+ !StringUtils::EqualsNoCase(format, "integer") &&
+ !StringUtils::EqualsNoCase(format, "number"))
return false;
- }
- if ((strTmp = elem->Attribute("attributes")) != NULL && !setAttributes(strTmp))
- {
- CLog::Log(LOGERROR, "CSetting: error reading \"attributes\" attribute of <control>");
+ m_format = format;
+ StringUtils::ToLower(m_format);
+
+ return true;
+}
+
+bool CSettingControlEdit::Deserialize(const TiXmlNode *node, bool update /* = false */)
+{
+ if (!ISettingControl::Deserialize(node, update))
return false;
- }
- if ((strTmp = elem->Attribute("delayed")) != NULL)
- {
- if (!StringUtils::EqualsNoCase(strTmp, "false") && !StringUtils::EqualsNoCase(strTmp, "true"))
- {
- CLog::Log(LOGERROR, "CSetting: error reading \"delayed\" attribute of <control>");
- return false;
- }
- else
- m_delayed = StringUtils::EqualsNoCase(strTmp, "true");
- }
+ XMLUtils::GetBoolean(node, SETTING_XML_ELM_CONTROL_HIDDEN, m_hidden);
+ XMLUtils::GetBoolean(node, SETTING_XML_ELM_CONTROL_VERIFYNEW, m_verifyNewValue);
+ XMLUtils::GetInt(node, SETTING_XML_ELM_CONTROL_HEADING, m_heading);
+
+ return true;
+}
+
+bool CSettingControlEdit::SetFormat(const std::string &format)
+{
+ if (!StringUtils::EqualsNoCase(format, "string") &&
+ !StringUtils::EqualsNoCase(format, "integer") &&
+ !StringUtils::EqualsNoCase(format, "number") &&
+ !StringUtils::EqualsNoCase(format, "ip") &&
+ !StringUtils::EqualsNoCase(format, "md5") &&
+ !StringUtils::EqualsNoCase(format, "path")) // TODO
+ return false;
+
+ m_format = format;
+ StringUtils::ToLower(m_format);
+
+ return true;
+}
+
+bool CSettingControlButton::Deserialize(const TiXmlNode *node, bool update /* = false */)
+{
+ if (!ISettingControl::Deserialize(node, update))
+ return false;
+ XMLUtils::GetInt(node, SETTING_XML_ELM_CONTROL_HEADING, m_heading);
+ XMLUtils::GetBoolean(node, SETTING_XML_ELM_CONTROL_HIDEVALUE, m_hideValue);
+
return true;
}
-bool CSettingControl::setType(const std::string &strType)
+bool CSettingControlButton::SetFormat(const std::string &format)
{
- if (StringUtils::EqualsNoCase(strType, "toggle"))
- m_type = SettingControlTypeCheckmark;
- else if (StringUtils::EqualsNoCase(strType, "spinner"))
- m_type = SettingControlTypeSpinner;
- else if (StringUtils::EqualsNoCase(strType, "edit"))
- {
- m_type = SettingControlTypeEdit;
- m_delayed = true;
- }
- else if (StringUtils::EqualsNoCase(strType, "list"))
- m_type = SettingControlTypeList;
- else if (StringUtils::EqualsNoCase(strType, "button"))
- m_type = SettingControlTypeButton;
- else
+ if (!StringUtils::EqualsNoCase(format, "string") && // TODO
+ !StringUtils::EqualsNoCase(format, "integer") && // TODO
+ !StringUtils::EqualsNoCase(format, "number") && // TODO
+ !StringUtils::EqualsNoCase(format, "path") &&
+ !StringUtils::EqualsNoCase(format, "addon") && // TODO
+ !StringUtils::EqualsNoCase(format, "action"))
return false;
+ m_format = format;
+ StringUtils::ToLower(m_format);
+
return true;
}
-bool CSettingControl::setFormat(const std::string &strFormat)
+bool CSettingControlList::Deserialize(const TiXmlNode *node, bool update /* = false */)
{
- if (StringUtils::EqualsNoCase(strFormat, "boolean"))
- m_format = SettingControlFormatBoolean;
- else if (StringUtils::EqualsNoCase(strFormat, "string"))
- m_format = SettingControlFormatString;
- else if (StringUtils::EqualsNoCase(strFormat, "integer"))
- m_format = SettingControlFormatInteger;
- else if (StringUtils::EqualsNoCase(strFormat, "number"))
- m_format = SettingControlFormatNumber;
- else if (StringUtils::EqualsNoCase(strFormat, "ip"))
- m_format = SettingControlFormatIP;
- else if (StringUtils::EqualsNoCase(strFormat, "md5"))
- m_format = SettingControlFormatMD5;
- else if (StringUtils::EqualsNoCase(strFormat, "path"))
- m_format = SettingControlFormatPath;
- else if (StringUtils::EqualsNoCase(strFormat, "addon"))
- m_format = SettingControlFormatAddon;
- else if (StringUtils::EqualsNoCase(strFormat, "action"))
- m_format = SettingControlFormatAction;
- else
+ if (!ISettingControl::Deserialize(node, update))
return false;
+
+ XMLUtils::GetInt(node, SETTING_XML_ELM_CONTROL_HEADING, m_heading);
return true;
}
-bool CSettingControl::setAttributes(const std::string &strAttributes)
+bool CSettingControlList::SetFormat(const std::string &format)
{
- std::vector<std::string> attributeList = StringUtils::Split(strAttributes, ",");
+ if (!StringUtils::EqualsNoCase(format, "string") &&
+ !StringUtils::EqualsNoCase(format, "integer"))
+ return false;
- int controlAttributes = SettingControlAttributeNone;
- for (std::vector<std::string>::const_iterator attribute = attributeList.begin(); attribute != attributeList.end(); ++attribute)
- {
- if (StringUtils::EqualsNoCase(*attribute, "hidden"))
- controlAttributes |= (int)SettingControlAttributeHidden;
- else if (StringUtils::EqualsNoCase(*attribute, "new"))
- controlAttributes |= (int)SettingControlAttributeVerifyNew;
- else if (StringUtils::EqualsNoCase(*attribute, "hide_value"))
- controlAttributes |= (int)SettingControlAttributeHideValue;
- else
- return false;
- }
+ m_format = format;
+ StringUtils::ToLower(m_format);
- m_attributes = (SettingControlAttribute)controlAttributes;
return true;
}
\ No newline at end of file
*
*/
-#include <string>
-
-class TiXmlNode;
-
-typedef enum {
- SettingControlTypeNone = 0,
- SettingControlTypeCheckmark,
- SettingControlTypeSpinner,
- SettingControlTypeEdit,
- SettingControlTypeList,
- SettingControlTypeButton
-} SettingControlType;
-
-typedef enum {
- SettingControlFormatNone = 0,
- SettingControlFormatBoolean,
- SettingControlFormatString,
- SettingControlFormatInteger,
- SettingControlFormatNumber,
- SettingControlFormatIP,
- SettingControlFormatMD5,
- SettingControlFormatPath,
- SettingControlFormatAddon,
- SettingControlFormatAction
-} SettingControlFormat;
-
-typedef enum {
- SettingControlAttributeNone = 0x0,
- SettingControlAttributeHidden = 0x1,
- SettingControlAttributeVerifyNew = 0x2,
- SettingControlAttributeHideValue = 0x4
-} SettingControlAttribute;
-
-class CSettingControl
+#include "ISettingControl.h"
+
+#define SETTING_XML_ELM_CONTROL_FORMATLABEL "formatlabel"
+#define SETTING_XML_ELM_CONTROL_HIDDEN "hidden"
+#define SETTING_XML_ELM_CONTROL_VERIFYNEW "verifynew"
+#define SETTING_XML_ELM_CONTROL_HEADING "heading"
+#define SETTING_XML_ELM_CONTROL_HIDEVALUE "hidevalue"
+
+class CSettingControlCheckmark : public ISettingControl
+{
+public:
+ CSettingControlCheckmark()
+ {
+ m_format = "boolean";
+ }
+ virtual ~CSettingControlCheckmark() { }
+
+ // implementation of ISettingControl
+ virtual std::string GetType() const { return "toggle"; }
+
+protected:
+ virtual bool SetFormat(const std::string &format);
+};
+
+class CSettingControlSpinner : public ISettingControl
{
public:
- CSettingControl(SettingControlType type = SettingControlTypeNone,
- SettingControlFormat format = SettingControlFormatNone,
- SettingControlAttribute attribute = SettingControlAttributeNone)
- : m_type(type), m_format(format), m_attributes(attribute),
- m_delayed(false)
+ CSettingControlSpinner()
+ : m_formatLabel(-1),
+ m_formatString("%i"),
+ m_minimumLabel(-1)
{ }
- virtual ~CSettingControl() { }
+ virtual ~CSettingControlSpinner() { }
+
+ // implementation of ISettingControl
+ virtual std::string GetType() const { return "spinner"; }
+ virtual bool Deserialize(const TiXmlNode *node, bool update = false);
+
+ int GetFormatLabel() const { return m_formatLabel; }
+ const std::string& GetFormatString() const { return m_formatString; }
+ int GetMinimumLabel() const { return m_minimumLabel; }
+
+protected:
+ virtual bool SetFormat(const std::string &format);
+
+ int m_formatLabel;
+ std::string m_formatString;
+ int m_minimumLabel;
+
+};
+
+class CSettingControlEdit : public ISettingControl
+{
+public:
+ CSettingControlEdit()
+ : m_hidden(false),
+ m_verifyNewValue(false),
+ m_heading(-1)
+ {
+ m_delayed = true;
+ }
+ virtual ~CSettingControlEdit() { }
- bool Deserialize(const TiXmlNode *node, bool update = false);
+ // implementation of ISettingControl
+ virtual std::string GetType() const { return "edit"; }
+ virtual bool Deserialize(const TiXmlNode *node, bool update = false);
- SettingControlType GetType() const { return m_type; }
- SettingControlFormat GetFormat() const { return m_format; }
- SettingControlAttribute GetAttributes() const { return m_attributes; }
- bool GetDelayed() const { return m_delayed; }
+ bool IsHidden() const { return m_hidden; }
+ bool VerifyNewValue() const { return m_verifyNewValue; }
+ int GetHeading() const { return m_heading; }
+
+protected:
+ virtual bool SetFormat(const std::string &format);
+
+ bool m_hidden;
+ bool m_verifyNewValue;
+ int m_heading;
+};
+
+class CSettingControlButton : public ISettingControl
+{
+public:
+ CSettingControlButton()
+ : m_heading(-1),
+ m_hideValue(false)
+ { }
+ virtual ~CSettingControlButton() { }
+
+ // implementation of ISettingControl
+ virtual std::string GetType() const { return "button"; }
+ virtual bool Deserialize(const TiXmlNode *node, bool update = false);
+
+ int GetHeading() const { return m_heading; }
+ bool HideValue() const { return m_hideValue; }
+
+protected:
+ virtual bool SetFormat(const std::string &format);
+
+ int m_heading;
+ bool m_hideValue;
+};
+
+class CSettingControlList : public ISettingControl
+{
+public:
+ CSettingControlList()
+ : m_heading(-1)
+ { }
+ virtual ~CSettingControlList() { }
- void SetType(SettingControlType type) { m_type = type; }
- void SetFormat(SettingControlFormat format) { m_format = format; }
- void SetAttributes(SettingControlAttribute attributes) { m_attributes = attributes; }
+ // implementation of ISettingControl
+ virtual std::string GetType() const { return "list"; }
+ virtual bool Deserialize(const TiXmlNode *node, bool update = false);
+
+ int GetHeading() const { return m_heading; }
protected:
- bool setType(const std::string &strType);
- bool setFormat(const std::string &strFormat);
- bool setAttributes(const std::string &strAttributes);
-
- SettingControlType m_type;
- SettingControlFormat m_format;
- SettingControlAttribute m_attributes;
- bool m_delayed;
+ virtual bool SetFormat(const std::string &format);
+
+ int m_heading;
};
--- /dev/null
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#define SETTING_XML_ROOT "settings"
+
+#define SETTING_XML_ELM_SECTION "section"
+#define SETTING_XML_ELM_CATEGORY "category"
+#define SETTING_XML_ELM_GROUP "group"
+#define SETTING_XML_ELM_SETTING "setting"
+#define SETTING_XML_ELM_VISIBLE "visible"
+#define SETTING_XML_ELM_REQUIREMENT "requirement"
+#define SETTING_XML_ELM_CONDITION "condition"
+#define SETTING_XML_ELM_LEVEL "level"
+#define SETTING_XML_ELM_DEFAULT "default"
+#define SETTING_XML_ELM_VALUE "value"
+#define SETTING_XML_ELM_CONTROL "control"
+#define SETTING_XML_ELM_CONSTRAINTS "constraints"
+#define SETTING_XML_ELM_OPTIONS "options"
+#define SETTING_XML_ELM_OPTION "option"
+#define SETTING_XML_ELM_MINIMUM "minimum"
+#define SETTING_XML_ELM_STEP "step"
+#define SETTING_XML_ELM_MAXIMUM "maximum"
+#define SETTING_XML_ELM_ALLOWEMPTY "allowempty"
+#define SETTING_XML_ELM_DEPENDENCIES "dependencies"
+#define SETTING_XML_ELM_DEPENDENCY "dependency"
+#define SETTING_XML_ELM_UPDATES "updates"
+#define SETTING_XML_ELM_UPDATE "update"
+#define SETTING_XML_ELM_ACCESS "access"
+
+#define SETTING_XML_ATTR_ID "id"
+#define SETTING_XML_ATTR_LABEL "label"
+#define SETTING_XML_ATTR_HELP "help"
+#define SETTING_XML_ATTR_TYPE "type"
+#define SETTING_XML_ATTR_PARENT "parent"
+#define SETTING_XML_ATTR_FORMAT "format"
+#define SETTING_XML_ATTR_DELAYED "delayed"
+#define SETTING_XML_ATTR_ON "on"
+#define SETTING_XML_ATTR_OPERATOR "operator"
+#define SETTING_XML_ATTR_NAME "name"
+#define SETTING_XML_ATTR_SETTING "setting"
+#define SETTING_XML_ATTR_BEFORE "before"
+#define SETTING_XML_ATTR_AFTER "after"
#include "SettingDependency.h"
#include "Setting.h"
+#include "SettingDefinitions.h"
#include "SettingsManager.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
return false;
m_target = SettingDependencyTargetSetting;
- const char *strTarget = elem->Attribute("on");
+ const char *strTarget = elem->Attribute(SETTING_XML_ATTR_ON);
if (strTarget != NULL && !setTarget(strTarget))
{
CLog::Log(LOGWARNING, "CSettingDependencyCondition: unknown target \"%s\"", strTarget);
}
m_operator = SettingDependencyOperatorEquals;
- const char *strOperator = elem->Attribute("operator");
+ const char *strOperator = elem->Attribute(SETTING_XML_ATTR_OPERATOR);
if (strOperator != NULL && !setOperator(strOperator))
{
CLog::Log(LOGWARNING, "CSettingDependencyCondition: unknown operator \"%s\"", strOperator);
if (elem == NULL)
return false;
- const char *strType = elem->Attribute("type");
+ const char *strType = elem->Attribute(SETTING_XML_ATTR_TYPE);
if (strType == NULL || strlen(strType) <= 0 || !setType(strType))
{
CLog::Log(LOGWARNING, "CSettingDependency: missing or unknown dependency type definition");
CSettingPath::CSettingPath(const std::string &id, CSettingsManager *settingsManager /* = NULL */)
: CSettingString(id, settingsManager),
m_writable(true)
-{
- m_control.SetType(SettingControlTypeButton);
- m_control.SetFormat(SettingControlFormatPath);
- m_control.SetAttributes(SettingControlAttributeNone);
-}
+{ }
CSettingPath::CSettingPath(const std::string &id, const CSettingPath &setting)
: CSettingString(id, setting)
if (!CSettingString::Deserialize(node, update))
return false;
- if (m_control.GetType() != SettingControlTypeButton ||
- m_control.GetFormat() != SettingControlFormatPath ||
- m_control.GetAttributes() != SettingControlAttributeNone)
+ if (m_control != NULL &&
+ (m_control->GetType() != "button" || m_control->GetFormat() != "path"))
{
CLog::Log(LOGERROR, "CSettingPath: invalid <control> of \"%s\"", m_id.c_str());
return false;
*/
#include "SettingSection.h"
+#include "SettingDefinitions.h"
#include "SettingsManager.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "utils/XBMCTinyXML.h"
-#define XML_CATEGORY "category"
-#define XML_GROUP "group"
-
template<class T> void addISetting(const TiXmlNode *node, const T &item, std::vector<T> &items)
{
if (node == NULL)
// check if there is a "before" or "after" attribute to place the setting at a specific position
int position = -1; // -1 => end, 0 => before, 1 => after
- const char *positionId = element->Attribute("before");
+ const char *positionId = element->Attribute(SETTING_XML_ATTR_BEFORE);
if (positionId != NULL && strlen(positionId) > 0)
position = 0;
- else if ((positionId = element->Attribute("after")) != NULL && strlen(positionId) > 0)
+ else if ((positionId = element->Attribute(SETTING_XML_ATTR_AFTER)) != NULL && strlen(positionId) > 0)
position = 1;
if (positionId != NULL && strlen(positionId) > 0 && position >= 0)
if (!ISetting::Deserialize(node, update))
return false;
- const TiXmlElement *settingElement = node->FirstChildElement(XML_SETTING);
+ const TiXmlElement *settingElement = node->FirstChildElement(SETTING_XML_ELM_SETTING);
while (settingElement != NULL)
{
std::string settingId;
update = (setting != NULL);
if (!update)
{
- const char* settingType = settingElement->Attribute(XML_ATTR_TYPE);
+ const char* settingType = settingElement->Attribute(SETTING_XML_ATTR_TYPE);
if (settingType == NULL || strlen(settingType) <= 0)
{
CLog::Log(LOGERROR, "CSettingGroup: unable to read setting type of \"%s\"", settingId.c_str());
addISetting(settingElement, setting, m_settings);
}
- settingElement = settingElement->NextSiblingElement(XML_SETTING);
+ settingElement = settingElement->NextSiblingElement(SETTING_XML_ELM_SETTING);
}
return true;
return false;
int tmp = -1;
- if (element->QueryIntAttribute(XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0)
+ if (element->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0)
m_label = tmp;
- if (element->QueryIntAttribute(XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0)
+ if (element->QueryIntAttribute(SETTING_XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0)
m_help = tmp;
- const TiXmlNode *accessNode = node->FirstChild("access");
+ const TiXmlNode *accessNode = node->FirstChild(SETTING_XML_ELM_ACCESS);
if (accessNode != NULL && !m_accessCondition.Deserialize(accessNode))
return false;
- const TiXmlNode *groupNode = node->FirstChildElement(XML_GROUP);
+ const TiXmlNode *groupNode = node->FirstChildElement(SETTING_XML_ELM_GROUP);
while (groupNode != NULL)
{
std::string groupId;
}
}
- groupNode = groupNode->NextSibling(XML_GROUP);
+ groupNode = groupNode->NextSibling(SETTING_XML_ELM_GROUP);
}
return true;
return false;
int tmp = -1;
- if (element->QueryIntAttribute(XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0)
+ if (element->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0)
m_label = tmp;
- if (element->QueryIntAttribute(XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0)
+ if (element->QueryIntAttribute(SETTING_XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0)
m_help = tmp;
- const TiXmlNode *categoryNode = node->FirstChild(XML_CATEGORY);
+ const TiXmlNode *categoryNode = node->FirstChild(SETTING_XML_ELM_CATEGORY);
while (categoryNode != NULL)
{
std::string categoryId;
}
}
- categoryNode = categoryNode->NextSibling(XML_CATEGORY);
+ categoryNode = categoryNode->NextSibling(SETTING_XML_ELM_CATEGORY);
}
return true;
*/
#include "SettingUpdate.h"
+#include "SettingDefinitions.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "utils/XBMCTinyXML.h"
if (elem == NULL)
return false;
- const char *strType = elem->Attribute("type");
+ const char *strType = elem->Attribute(SETTING_XML_ATTR_TYPE);
if (strType == NULL || strlen(strType) <= 0 || !setType(strType))
{
CLog::Log(LOGWARNING, "CSettingUpdate: missing or unknown update type definition");
#include "settings/MediaSettings.h"
#include "settings/MediaSourceSettings.h"
#include "settings/SettingAddon.h"
+#include "settings/SettingControl.h"
#include "settings/SettingsManager.h"
#include "settings/SettingPath.h"
#include "settings/SkinSettings.h"
return NULL;
}
+ISettingControl* CSettings::CreateControl(const std::string &controlType) const
+{
+ if (StringUtils::EqualsNoCase(controlType, "toggle"))
+ return new CSettingControlCheckmark();
+ else if (StringUtils::EqualsNoCase(controlType, "spinner"))
+ return new CSettingControlSpinner();
+ else if (StringUtils::EqualsNoCase(controlType, "edit"))
+ return new CSettingControlEdit();
+ else if (StringUtils::EqualsNoCase(controlType, "button"))
+ return new CSettingControlButton();
+ else if (StringUtils::EqualsNoCase(controlType, "list"))
+ return new CSettingControlList();
+
+ return NULL;
+}
+
bool CSettings::Initialize()
{
CSingleLock lock(m_critical);
// register custom setting types
InitializeSettingTypes();
+ // register custom setting controls
+ InitializeControls();
// option fillers and conditions need to be
// initialized before the setting definitions
m_settingsManager->RegisterSettingType("path", this);
}
+void CSettings::InitializeControls()
+{
+ m_settingsManager->RegisterSettingControl("toggle", this);
+ m_settingsManager->RegisterSettingControl("spinner", this);
+ m_settingsManager->RegisterSettingControl("edit", this);
+ m_settingsManager->RegisterSettingControl("button", this);
+ m_settingsManager->RegisterSettingControl("list", this);
+}
+
void CSettings::InitializeVisibility()
{
// hide some settings if necessary
settingSet.insert("audiooutput.audiodevice");
settingSet.insert("audiooutput.passthroughdevice");
settingSet.insert("audiooutput.streamsilence");
+ settingSet.insert("audiooutput.normalizelevels");
settingSet.insert("lookandfeel.skin");
settingSet.insert("lookandfeel.skinsettings");
settingSet.insert("lookandfeel.font");
#include <string>
#include "settings/ISettingCallback.h"
+#include "settings/ISettingControlCreator.h"
#include "settings/ISettingCreator.h"
#include "threads/CriticalSection.h"
setting types.
\sa CSettingsManager
*/
-class CSettings : public ISettingCreator
+class CSettings : public ISettingCreator, public ISettingControlCreator
{
public:
/*!
// implementation of ISettingCreator
virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const;
+ // implementation of ISettingControlCreator
+ virtual ISettingControl* CreateControl(const std::string &controlType) const;
+
/*!
\brief Initializes the setting system with the generic
settings definition and platform specific setting definitions.
bool Initialize(const std::string &file);
bool InitializeDefinitions();
void InitializeSettingTypes();
+ void InitializeControls();
void InitializeVisibility();
void InitializeDefaults();
void InitializeOptionFillers();
*/
#include "SettingsManager.h"
+#include "SettingDefinitions.h"
#include "SettingSection.h"
#include "Setting.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "utils/XBMCTinyXML.h"
-#define XML_ROOT "settings"
-#define XML_SECTION "section"
-
CSettingsManager::CSettingsManager()
: m_initialized(false), m_loaded(false)
m_settingsHandlers.clear();
m_subSettings.clear();
m_settingCreators.clear();
+ m_settingControlCreators.clear();
Clear();
}
if (m_initialized || root == NULL)
return false;
- if (!StringUtils::EqualsNoCase(root->ValueStr(), XML_ROOT))
+ if (!StringUtils::EqualsNoCase(root->ValueStr(), SETTING_XML_ROOT))
{
CLog::Log(LOGERROR, "CSettingsManager: error reading settings definition: doesn't contain <settings> tag");
return false;
}
- const TiXmlNode *sectionNode = root->FirstChild(XML_SECTION);
+ const TiXmlNode *sectionNode = root->FirstChild(SETTING_XML_ELM_SECTION);
while (sectionNode != NULL)
{
std::string sectionId;
}
}
- sectionNode = sectionNode->NextSibling(XML_SECTION);
+ sectionNode = sectionNode->NextSibling(SETTING_XML_ELM_SECTION);
}
for (SettingMap::iterator itSettingDep = m_settings.begin(); itSettingDep != m_settings.end(); ++itSettingDep)
bool CSettingsManager::Load(const TiXmlElement *root, bool &updated, bool triggerEvents /* = true */, std::map<std::string, CSetting*> *loadedSettings /* = NULL */)
{
- CExclusiveLock lock(m_critical);
+ CSharedLock lock(m_critical);
CExclusiveLock settingsLock(m_settingsCritical);
if (m_loaded || root == NULL)
return false;
m_settingCreators.insert(make_pair(settingType, settingCreator));
}
+void CSettingsManager::RegisterSettingControl(const std::string &controlType, ISettingControlCreator *settingControlCreator)
+{
+ if (controlType.empty() || settingControlCreator == NULL)
+ return;
+
+ CExclusiveLock lock(m_critical);
+ SettingControlCreatorMap::const_iterator creatorIt = m_settingControlCreators.find(controlType);
+ if (creatorIt == m_settingControlCreators.end())
+ m_settingControlCreators.insert(make_pair(controlType, settingControlCreator));
+}
+
void CSettingsManager::RegisterSettingsHandler(ISettingsHandler *settingsHandler)
{
if (settingsHandler == NULL)
return NULL;
}
+ISettingControl* CSettingsManager::CreateControl(const std::string &controlType) const
+{
+ if (controlType.empty())
+ return NULL;
+
+ CSharedLock lock(m_critical);
+ SettingControlCreatorMap::const_iterator creator = m_settingControlCreators.find(controlType);
+ if (creator != m_settingControlCreators.end() && creator->second != NULL)
+ return creator->second->CreateControl(controlType);
+
+ return NULL;
+}
+
bool CSettingsManager::OnSettingsLoading()
{
CSharedLock lock(m_critical);
#include "ISetting.h"
#include "ISettingCallback.h"
+#include "ISettingControlCreator.h"
#include "ISettingCreator.h"
#include "ISettingsHandler.h"
#include "ISubSettings.h"
\brief Settings manager responsible for initializing, loading and handling
all settings.
*/
-class CSettingsManager : public ISettingCreator, private ISettingCallback,
+class CSettingsManager : public ISettingCreator, public ISettingControlCreator,
+ private ISettingCallback,
private ISettingsHandler, private ISubSettings
{
public:
// implementation of ISettingCreator
virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const;
+ // implementation of ISettingControlCreator
+ virtual ISettingControl* CreateControl(const std::string &controlType) const;
+
/*!
\brief Initializes the settings manager using the setting definitions
represented by the given XML element.
void RegisterSettingType(const std::string &settingType, ISettingCreator *settingCreator);
/*!
+ \brief Registers a custom setting control type and its
+ ISettingControlCreator implementation
+
+ When a setting control definition for a registered custom setting control
+ type is found its ISettingControlCreator implementation is called to create
+ and deserialize the setting control definition.
+
+ \param controlType String representation of the custom setting control type
+ \param settingControlCreator ISettingControlCreator implementation
+ */
+ void RegisterSettingControl(const std::string &controlType, ISettingControlCreator *settingControlCreator);
+
+ /*!
\brief Registers the given ISettingsHandler implementation.
\param settingsHandler ISettingsHandler implementation
typedef std::map<std::string, ISettingCreator*> SettingCreatorMap;
SettingCreatorMap m_settingCreators;
+ typedef std::map<std::string, ISettingControlCreator*> SettingControlCreatorMap;
+ SettingControlCreatorMap m_settingControlCreators;
+
std::set<ISubSettings*> m_subSettings;
typedef std::vector<ISettingsHandler*> SettingsHandlers;
SettingsHandlers m_settingsHandlers;
*
*/
+#include <set>
+
#include "GUIControlSettings.h"
#include "FileItem.h"
#include "Util.h"
#include "guilib/GUIWindowManager.h"
#include "guilib/LocalizeStrings.h"
#include "settings/SettingAddon.h"
+#include "settings/SettingControl.h"
#include "settings/SettingPath.h"
#include "settings/Settings.h"
#include "settings/MediaSourceSettings.h"
{
m_pSpin->Clear();
- switch (m_pSetting->GetControl().GetFormat())
+ const std::string &controlFormat = m_pSetting->GetControl()->GetFormat();
+ if (controlFormat == "number")
{
- case SettingControlFormatNumber:
- {
- CSettingNumber *pSettingNumber = (CSettingNumber *)m_pSetting;
- m_pSpin->SetType(SPIN_CONTROL_TYPE_FLOAT);
- m_pSpin->SetFloatRange((float)pSettingNumber->GetMinimum(), (float)pSettingNumber->GetMaximum());
- m_pSpin->SetFloatInterval((float)pSettingNumber->GetStep());
+ CSettingNumber *pSettingNumber = (CSettingNumber *)m_pSetting;
+ m_pSpin->SetType(SPIN_CONTROL_TYPE_FLOAT);
+ m_pSpin->SetFloatRange((float)pSettingNumber->GetMinimum(), (float)pSettingNumber->GetMaximum());
+ m_pSpin->SetFloatInterval((float)pSettingNumber->GetStep());
- m_pSpin->SetFloatValue((float)pSettingNumber->GetValue());
- break;
- }
+ m_pSpin->SetFloatValue((float)pSettingNumber->GetValue());
+ }
+ else if (controlFormat == "integer")
+ {
+ m_pSpin->SetType(SPIN_CONTROL_TYPE_TEXT);
+ FillIntegerSettingControl();
+ }
+ else if (controlFormat == "string")
+ {
+ m_pSpin->SetType(SPIN_CONTROL_TYPE_TEXT);
- case SettingControlFormatInteger:
- {
- m_pSpin->SetType(SPIN_CONTROL_TYPE_TEXT);
+ if (m_pSetting->GetType() == SettingTypeInteger)
FillIntegerSettingControl();
- break;
- }
-
- case SettingControlFormatString:
+ else if (m_pSetting->GetType() == SettingTypeString)
{
- m_pSpin->SetType(SPIN_CONTROL_TYPE_TEXT);
-
- if (m_pSetting->GetType() == SettingTypeInteger)
- FillIntegerSettingControl();
- else if (m_pSetting->GetType() == SettingTypeString)
+ CSettingString *pSettingString = (CSettingString *)m_pSetting;
+ if (pSettingString->GetOptionsType() == SettingOptionsTypeDynamic)
{
- CSettingString *pSettingString = (CSettingString *)m_pSetting;
- if (pSettingString->GetOptionsType() == SettingOptionsTypeDynamic)
- {
- DynamicStringSettingOptions options = pSettingString->UpdateDynamicOptions();
- for (std::vector< std::pair<std::string, std::string> >::const_iterator option = options.begin(); option != options.end(); ++option)
- m_pSpin->AddLabel(option->first, option->second);
+ DynamicStringSettingOptions options = pSettingString->UpdateDynamicOptions();
+ for (std::vector< std::pair<std::string, std::string> >::const_iterator option = options.begin(); option != options.end(); ++option)
+ m_pSpin->AddLabel(option->first, option->second);
- m_pSpin->SetStringValue(pSettingString->GetValue());
- }
+ m_pSpin->SetStringValue(pSettingString->GetValue());
}
- break;
}
-
- default:
- break;
}
}
{
std::string strLabel;
int i = pSettingInt->GetMinimum();
- if (pSettingInt->GetMinimumLabel() > -1)
+ const CSettingControlSpinner *control = static_cast<const CSettingControlSpinner*>(pSettingInt->GetControl());
+ if (control->GetMinimumLabel() > -1)
{
- strLabel = g_localizeStrings.Get(pSettingInt->GetMinimumLabel());
+ strLabel = g_localizeStrings.Get(control->GetMinimumLabel());
m_pSpin->AddLabel(strLabel, pSettingInt->GetMinimum());
i += pSettingInt->GetStep();
}
+
for (; i <= pSettingInt->GetMaximum(); i += pSettingInt->GetStep())
{
- if (pSettingInt->GetFormat() > -1)
- strLabel = StringUtils::Format(g_localizeStrings.Get(pSettingInt->GetFormat()).c_str(), i);
+ if (control->GetFormatLabel() > -1)
+ strLabel = StringUtils::Format(g_localizeStrings.Get(control->GetFormatLabel()).c_str(), i);
else
- strLabel = StringUtils::Format(pSettingInt->GetFormatString().c_str(), i);
+ strLabel = StringUtils::Format(control->GetFormatString().c_str(), i);
m_pSpin->AddLabel(strLabel, i);
}
if (!GetItems(m_pSetting, options) || options.Size() <= 1)
return false;
+ const CSettingControlList *control = static_cast<const CSettingControlList*>(m_pSetting->GetControl());
+
dialog->Reset();
dialog->SetHeading(g_localizeStrings.Get(m_pSetting->GetLabel()));
dialog->SetItems(&options);
bool CGUIControlListSetting::GetItems(CSetting *setting, CFileItemList &items)
{
- switch (setting->GetControl().GetFormat())
+ const CSettingControlList *control = static_cast<const CSettingControlList*>(setting->GetControl());
+ const std::string &controlFormat = control->GetFormat();
+ if (controlFormat == "integer")
+ return GetIntegerItems(setting, items);
+ else if (controlFormat == "string")
{
- case SettingControlFormatInteger:
+ if (setting->GetType() == SettingTypeInteger)
return GetIntegerItems(setting, items);
-
- case SettingControlFormatString:
+ else if (setting->GetType() == SettingTypeString)
{
- if (setting->GetType() == SettingTypeInteger)
- return GetIntegerItems(setting, items);
- else if (setting->GetType() == SettingTypeString)
+ CSettingString *pSettingString = (CSettingString *)setting;
+ if (pSettingString->GetOptionsType() == SettingOptionsTypeDynamic)
{
- CSettingString *pSettingString = (CSettingString *)setting;
- if (pSettingString->GetOptionsType() == SettingOptionsTypeDynamic)
+ DynamicStringSettingOptions options = pSettingString->UpdateDynamicOptions();
+ for (DynamicStringSettingOptions::const_iterator option = options.begin(); option != options.end(); ++option)
{
- DynamicStringSettingOptions options = pSettingString->UpdateDynamicOptions();
- for (DynamicStringSettingOptions::const_iterator option = options.begin(); option != options.end(); ++option)
- {
- CFileItemPtr pItem = GetItem(option->first, option->second);
+ CFileItemPtr pItem = GetItem(option->first, option->second);
- if (StringUtils::EqualsNoCase(option->second, pSettingString->GetValue()))
- pItem->Select(true);
+ if (StringUtils::EqualsNoCase(option->second, pSettingString->GetValue()))
+ pItem->Select(true);
- items.Add(pItem);
- }
+ items.Add(pItem);
}
}
- break;
}
-
- default:
- return false;
}
+ else
+ return false;
return true;
}
if (m_pButton == NULL)
return false;
- bool success = false;
- switch (m_pSetting->GetControl().GetFormat())
+ const std::string &controlFormat = m_pSetting->GetControl()->GetFormat();
+ if (controlFormat == "addon")
{
- case SettingControlFormatAddon:
- {
- // prompt for the addon
- CSettingAddon *setting = (CSettingAddon *)m_pSetting;
- CStdString addonID = setting->GetValue();
- if (!CGUIWindowAddonBrowser::SelectAddonID(setting->GetAddonType(), addonID, setting->AllowEmpty()) == 1)
- return false;
-
- success = setting->SetValue(addonID);
- break;
- }
-
- case SettingControlFormatPath:
- {
- success = GetPath((CSettingPath *)m_pSetting);
- break;
- }
-
- case SettingControlFormatAction:
- {
- // simply call the OnSettingAction callback and whoever knows what to
- // do can do so (based on the setting's identification
- CSettingAction *pSettingAction = (CSettingAction *)m_pSetting;
- pSettingAction->OnSettingAction(pSettingAction);
- success = true;
- break;
- }
-
- default:
+ // prompt for the addon
+ CSettingAddon *setting = (CSettingAddon *)m_pSetting;
+ CStdString addonID = setting->GetValue();
+ if (!CGUIWindowAddonBrowser::SelectAddonID(setting->GetAddonType(), addonID, setting->AllowEmpty()) == 1)
return false;
+
+ return setting->SetValue(addonID);
+ }
+ if (controlFormat == "path")
+ return GetPath((CSettingPath *)m_pSetting);
+ if (controlFormat == "action")
+ {
+ // simply call the OnSettingAction callback and whoever knows what to
+ // do can do so (based on the setting's identification
+ CSettingAction *pSettingAction = (CSettingAction *)m_pSetting;
+ pSettingAction->OnSettingAction(pSettingAction);
+ return true;
}
- return success;
+ return false;
}
void CGUIControlButtonSetting::Update()
CGUIControlBaseSetting::Update();
if (m_pSetting->GetType() == SettingTypeString &&
- !(m_pSetting->GetControl().GetAttributes() & SettingControlAttributeHideValue))
+ !static_cast<const CSettingControlButton*>(m_pSetting->GetControl())->HideValue())
{
std::string strText = ((CSettingString *)m_pSetting)->GetValue();
- switch (m_pSetting->GetControl().GetFormat())
+ const std::string &controlFormat = m_pSetting->GetControl()->GetFormat();
+ if (controlFormat == "addon")
{
- case SettingControlFormatAddon:
- {
- ADDON::AddonPtr addon;
- if (ADDON::CAddonMgr::Get().GetAddon(strText, addon))
- strText = addon->Name();
- if (strText.empty())
- strText = g_localizeStrings.Get(231); // None
- break;
- }
-
- case SettingControlFormatPath:
- {
- CStdString shortPath;
- if (CUtil::MakeShortenPath(strText, shortPath, 30))
- strText = shortPath;
- break;
- }
-
- default:
- break;
+ ADDON::AddonPtr addon;
+ if (ADDON::CAddonMgr::Get().GetAddon(strText, addon))
+ strText = addon->Name();
+ if (strText.empty())
+ strText = g_localizeStrings.Get(231); // None
+ }
+ else if (controlFormat == "path")
+ {
+ CStdString shortPath;
+ if (CUtil::MakeShortenPath(strText, shortPath, 30))
+ strText = shortPath;
}
m_pButton->SetLabel2(strText);
g_mediaManager.GetNetworkLocations(shares);
g_mediaManager.GetLocalDrives(shares);
- if (!CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(pathSetting->GetHeading()), path, pathSetting->Writable()))
+ if (!CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(static_cast<const CSettingControlButton*>(pathSetting->GetControl())->GetHeading()), path, pathSetting->Writable()))
return false;
return pathSetting->SetValue(path);
CGUIControlEditSetting::CGUIControlEditSetting(CGUIEditControl *pEdit, int id, CSetting *pSetting)
: CGUIControlBaseSetting(id, pSetting)
{
+ const CSettingControlEdit* control = static_cast<const CSettingControlEdit*>(pSetting->GetControl());
m_pEdit = pEdit;
m_pEdit->SetID(id);
int heading = m_pSetting->GetLabel();
- if (m_pSetting->GetType() == SettingTypeString)
- {
- CSettingString *pSettingString = (CSettingString *)m_pSetting;
- if (pSettingString->GetHeading() > 0)
- heading = pSettingString->GetHeading();
- }
+ if (control->GetHeading() > 0)
+ heading = control->GetHeading();
if (heading < 0)
heading = 0;
CGUIEditControl::INPUT_TYPE inputType = CGUIEditControl::INPUT_TYPE_TEXT;
- const CSettingControl& control = pSetting->GetControl();
- switch (control.GetFormat())
+ const std::string &controlFormat = control->GetFormat();
+ if (controlFormat == "string")
{
- case SettingControlFormatString:
- if (control.GetAttributes() & SettingControlAttributeHidden)
- inputType = CGUIEditControl::INPUT_TYPE_PASSWORD;
- break;
-
- case SettingControlFormatInteger:
- if (control.GetAttributes() & SettingControlAttributeVerifyNew)
- inputType = CGUIEditControl::INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW;
- else
- inputType = CGUIEditControl::INPUT_TYPE_NUMBER;
- break;
-
- case SettingControlFormatIP:
- inputType = CGUIEditControl::INPUT_TYPE_IPADDRESS;
- break;
-
- case SettingControlFormatMD5:
- inputType = CGUIEditControl::INPUT_TYPE_PASSWORD_MD5;
- break;
-
- default:
- break;
+ if (control->IsHidden())
+ inputType = CGUIEditControl::INPUT_TYPE_PASSWORD;
+ }
+ else if (controlFormat == "integer")
+ {
+ if (control->VerifyNewValue())
+ inputType = CGUIEditControl::INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW;
+ else
+ inputType = CGUIEditControl::INPUT_TYPE_NUMBER;
}
+ else if (controlFormat == "ip")
+ inputType = CGUIEditControl::INPUT_TYPE_IPADDRESS;
+ else if (controlFormat == "md5")
+ inputType = CGUIEditControl::INPUT_TYPE_PASSWORD_MD5;
+
m_pEdit->SetInputType(inputType, heading);
Update();
m_resetSetting = new CSettingAction(RESET_SETTING_ID);
m_resetSetting->SetLabel(10041);
m_resetSetting->SetHelp(10045);
+ m_resetSetting->SetControl(m_settings.CreateControl("button"));
m_dummyCategory = new CSettingCategory(EMPTY_CATEGORY_ID);
m_dummyCategory->SetLabel(10046);
}
// create the proper controls
- switch (pSetting->GetControl().GetType())
+ std::string controlType = pSetting->GetControl()->GetType();
+ if (controlType == "toggle")
{
- case SettingControlTypeCheckmark:
- {
- pControl = new CGUIRadioButtonControl(*m_pOriginalRadioButton);
- if (pControl == NULL)
- return NULL;
+ pControl = new CGUIRadioButtonControl(*m_pOriginalRadioButton);
+ if (pControl == NULL)
+ return NULL;
- ((CGUIRadioButtonControl *)pControl)->SetLabel(label);
- pSettingControl.reset(new CGUIControlRadioButtonSetting((CGUIRadioButtonControl *)pControl, iControlID, pSetting));
- break;
- }
-
- case SettingControlTypeSpinner:
- {
- pControl = new CGUISpinControlEx(*m_pOriginalSpin);
- if (pControl == NULL)
- return NULL;
+ ((CGUIRadioButtonControl *)pControl)->SetLabel(label);
+ pSettingControl.reset(new CGUIControlRadioButtonSetting((CGUIRadioButtonControl *)pControl, iControlID, pSetting));
+ }
+ else if (controlType == "spinner")
+ {
+ pControl = new CGUISpinControlEx(*m_pOriginalSpin);
+ if (pControl == NULL)
+ return NULL;
- ((CGUISpinControlEx *)pControl)->SetText(label);
- pSettingControl.reset(new CGUIControlSpinExSetting((CGUISpinControlEx *)pControl, iControlID, pSetting));
- break;
- }
-
- case SettingControlTypeEdit:
- {
- pControl = new CGUIEditControl(*m_pOriginalEdit);
- if (pControl == NULL)
- return NULL;
+ ((CGUISpinControlEx *)pControl)->SetText(label);
+ pSettingControl.reset(new CGUIControlSpinExSetting((CGUISpinControlEx *)pControl, iControlID, pSetting));
+ }
+ else if (controlType == "edit")
+ {
+ pControl = new CGUIEditControl(*m_pOriginalEdit);
+ if (pControl == NULL)
+ return NULL;
- ((CGUIEditControl *)pControl)->SetLabel(label);
- pSettingControl.reset(new CGUIControlEditSetting((CGUIEditControl *)pControl, iControlID, pSetting));
- break;
- }
-
- case SettingControlTypeList:
- {
- pControl = new CGUIButtonControl(*m_pOriginalButton);
- if (pControl == NULL)
- return NULL;
+ ((CGUIEditControl *)pControl)->SetLabel(label);
+ pSettingControl.reset(new CGUIControlEditSetting((CGUIEditControl *)pControl, iControlID, pSetting));
+ }
+ else if (controlType == "list")
+ {
+ pControl = new CGUIButtonControl(*m_pOriginalButton);
+ if (pControl == NULL)
+ return NULL;
- ((CGUIButtonControl *)pControl)->SetLabel(label);
- pSettingControl.reset(new CGUIControlListSetting((CGUIButtonControl *)pControl, iControlID, pSetting));
- break;
- }
-
- case SettingControlTypeButton:
- {
- pControl = new CGUIButtonControl(*m_pOriginalButton);
- if (pControl == NULL)
- return NULL;
-
- ((CGUIButtonControl *)pControl)->SetLabel(label);
- pSettingControl.reset(new CGUIControlButtonSetting((CGUIButtonControl *)pControl, iControlID, pSetting));
- break;
- }
-
- case SettingControlTypeNone:
- default:
+ ((CGUIButtonControl *)pControl)->SetLabel(label);
+ pSettingControl.reset(new CGUIControlListSetting((CGUIButtonControl *)pControl, iControlID, pSetting));
+ }
+ else if (controlType == "button")
+ {
+ pControl = new CGUIButtonControl(*m_pOriginalButton);
+ if (pControl == NULL)
return NULL;
+
+ ((CGUIButtonControl *)pControl)->SetLabel(label);
+ pSettingControl.reset(new CGUIControlButtonSetting((CGUIButtonControl *)pControl, iControlID, pSetting));
}
+ else
+ return NULL;
- if (pSetting->GetControl().GetDelayed())
+ if (pSetting->GetControl()->GetDelayed())
pSettingControl->SetDelayed();
return AddSettingControl(pControl, pSettingControl, width, iControlID);
TestBasicEnvironment.cpp \
TestFileItem.cpp \
TestTextureCache.cpp \
+ TestURL.cpp \
TestUtils.cpp \
xbmc-test.cpp
--- /dev/null
+/*
+ * Copyright (C) 2005-2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "URL.h"
+
+#include "gtest/gtest.h"
+
+using ::testing::Test;
+using ::testing::WithParamInterface;
+using ::testing::ValuesIn;
+
+struct TestURLGetWithoutUserDetailsData
+{
+ std::string input;
+ std::string expected;
+ bool redact;
+};
+
+std::ostream& operator<<(std::ostream& os,
+ const TestURLGetWithoutUserDetailsData& rhs)
+{
+ return os << "(Input: " << rhs.input <<
+ "; Redact: " << (rhs.redact?"true":"false") <<
+ "; Expected: " << rhs.expected << ")";
+}
+
+class TestURLGetWithoutUserDetails : public Test,
+ public WithParamInterface<TestURLGetWithoutUserDetailsData>
+{
+};
+
+TEST_P(TestURLGetWithoutUserDetails, GetWithoutUserDetails)
+{
+ CURL input(GetParam().input);
+ std::string result = input.GetWithoutUserDetails(GetParam().redact);
+ EXPECT_EQ(result, GetParam().expected);
+}
+
+const TestURLGetWithoutUserDetailsData values[] = {
+ { std::string("smb://example.com/example"), std::string("smb://example.com/example"), false },
+ { std::string("smb://example.com/example"), std::string("smb://example.com/example"), true },
+ { std::string("smb://god:universe@example.com/example"), std::string("smb://example.com/example"), false },
+ { std::string("smb://god@example.com/example"), std::string("smb://USERNAME@example.com/example"), true },
+ { std::string("smb://god:universe@example.com/example"), std::string("smb://USERNAME:PASSWORD@example.com/example"), true },
+ { std::string("http://god:universe@example.com:8448/example|auth=digest"), std::string("http://USERNAME:PASSWORD@example.com:8448/example|auth=digest"), true }
+ };
+
+INSTANTIATE_TEST_CASE_P(URL, TestURLGetWithoutUserDetails, ValuesIn(values));
FieldBorn,
FieldBandFormed,
FieldDisbanded,
- FieldDied
+ FieldDied,
+ FieldMax
} Field;
typedef std::set<Field> Fields;
#endif
if (m_item.IsVideo())
{
- CLog::Log(LOGDEBUG, "%s - Saving file state for video item %s", __FUNCTION__, progressTrackingFile.c_str());
+ std::string redactPath = CURL::GetRedacted(progressTrackingFile);
+ CLog::Log(LOGDEBUG, "%s - Saving file state for video item %s", __FUNCTION__, redactPath.c_str());
CVideoDatabase videodatabase;
if (!videodatabase.Open())
{
if (m_updatePlayCount)
{
- CLog::Log(LOGDEBUG, "%s - Marking video item %s as watched", __FUNCTION__, progressTrackingFile.c_str());
+ CLog::Log(LOGDEBUG, "%s - Marking video item %s as watched", __FUNCTION__, redactPath.c_str());
// consider this item as played
videodatabase.IncrementPlayCount(m_item);
if (m_item.IsAudio())
{
- CLog::Log(LOGDEBUG, "%s - Saving file state for audio item %s", __FUNCTION__, m_item.GetPath().c_str());
+ std::string redactPath = CURL::GetRedacted(progressTrackingFile);
+ CLog::Log(LOGDEBUG, "%s - Saving file state for audio item %s", __FUNCTION__, redactPath.c_str());
if (m_updatePlayCount)
{
else
{
// consider this item as played
- CLog::Log(LOGDEBUG, "%s - Marking audio item %s as listened", __FUNCTION__, m_item.GetPath().c_str());
+ CLog::Log(LOGDEBUG, "%s - Marking audio item %s as listened", __FUNCTION__, redactPath.c_str());
musicdatabase.IncrementPlayCount(m_item);
musicdatabase.Close();
void URIUtils::Split(const CStdString& strFileNameAndPath,
CStdString& strPath, CStdString& strFileName)
{
+ std::string strPathT, strFileNameT;
+ Split(strFileNameAndPath, strPathT, strFileNameT);
+ strPath = strPathT;
+ strFileName = strFileNameT;
+}
+
+void URIUtils::Split(const std::string& strFileNameAndPath,
+ std::string& strPath, std::string& strFileName)
+{
//Splits a full filename in path and file.
//ex. smb://computer/share/directory/filename.ext -> strPath:smb://computer/share/directory/ and strFileName:filename.ext
//Trailing slash will be preserved
if (i == 0)
i--;
- strPath = strFileNameAndPath.Left(i + 1);
- strFileName = strFileNameAndPath.Right(strFileNameAndPath.size() - i - 1);
+ // take left including the directory separator
+ strPath = strFileNameAndPath.substr(0, i+1);
+ // everything to the right of the directory separator
+ strFileName = strFileNameAndPath.substr(i+1);
}
CStdStringArray URIUtils::SplitPath(const CStdString& strPath)
const CStdString& strNewExtension);
static void Split(const CStdString& strFileNameAndPath,
CStdString& strPath, CStdString& strFileName);
+ static void Split(const std::string& strFileNameAndPath,
+ std::string& strPath, std::string& strFileName);
static CStdStringArray SplitPath(const CStdString& strPath);
static void GetCommonPath(CStdString& strPath, const CStdString& strPath2);
#include "utils/CPUInfo.h"
#include "Temperature.h"
+#include "settings/AdvancedSettings.h"
#include "gtest/gtest.h"
EXPECT_GE(g_cpuInfo.getCPUFrequency(), 0.f);
}
+namespace
+{
+class TemporarySetting
+{
+public:
+
+ TemporarySetting(std::string &setting, const char *newValue) :
+ m_Setting(setting),
+ m_OldValue(setting)
+ {
+ m_Setting = newValue;
+ }
+
+ ~TemporarySetting()
+ {
+ m_Setting = m_OldValue;
+ }
+
+private:
+
+ std::string &m_Setting;
+ std::string m_OldValue;
+};
+}
+
TEST(TestCPUInfo, getTemperature)
{
+ TemporarySetting command(g_advancedSettings.m_cpuTempCmd, "echo '50 c'");
CTemperature t;
EXPECT_TRUE(g_cpuInfo.getTemperature(t));
EXPECT_TRUE(t.IsValid());
EXPECT_STREQ("", varstr.c_str());
}
-TEST_F(TestCharsetConverter, isBidiCharset)
-{
- EXPECT_TRUE(g_charsetConverter.isBidiCharset("ISO-8859-6"));
- EXPECT_FALSE(g_charsetConverter.isBidiCharset("Bogus"));
-}
-
TEST_F(TestCharsetConverter, unknownToUTF8_1)
{
refstra1 = "test_unknownToUTF8";
*/
#include "utils/HttpHeader.h"
-
#include "gtest/gtest.h"
TEST(TestHttpHeader, General)
{
CHttpHeader a;
- CStdString str = "Host: xbmc.org\r\n"
+ std::string str = "Host: xbmc.org\r\n"
"Accept: text/*, text/html, text/html;level=1, */*\r\n"
"Accept-Language: en\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: XBMC/snapshot (compatible; MSIE 5.5; Windows NT"
" 4.0)\r\n"
"Connection: Keep-Alive\r\n";
- CStdString refstr, varstr;
+ std::string refstr, varstr;
a.Parse(str);
- refstr = "accept: text/*, text/html, text/html;level=1, */*\n"
- "accept-encoding: gzip, deflate\n"
+ /* Should be in the same order as above */
+ refstr = "\n"
+ "host: xbmc.org\n"
+ "accept: text/*, text/html, text/html;level=1, */*\n"
"accept-language: en\n"
- "connection: Keep-Alive\n"
+ "accept-encoding: gzip, deflate\n"
"content-type: text/html; charset=ISO-8859-4\n"
- "host: xbmc.org\n"
"user-agent: XBMC/snapshot (compatible; MSIE 5.5; Windows NT 4.0)\n"
+ "connection: Keep-Alive\n"
"\n";
varstr.clear();
- a.GetHeader(varstr);
+ varstr = a.GetHeader();
EXPECT_STREQ(refstr.c_str(), varstr.c_str());
refstr = "XBMC/snapshot (compatible; MSIE 5.5; Windows NT 4.0)";
varstr = a.GetValue("User-Agent");
EXPECT_STREQ(refstr.c_str(), varstr.c_str());
- refstr = "text/html; charset=ISO-8859-4";
+ /* No charset should be here */
+ refstr = "text/html";
varstr = a.GetMimeType();
EXPECT_STREQ(refstr.c_str(), varstr.c_str());
else
strSQL=PrepareSQL("select idMovie from movie where idFile=%i", idFile);
- CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, strFilenameAndPath.c_str(), strSQL.c_str());
+ CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, CURL::GetRedacted(strFilenameAndPath).c_str(), strSQL.c_str());
m_pDS->query(strSQL.c_str());
if (m_pDS->num_rows() > 0)
idMovie = m_pDS->fv("idMovie").get_asInt();
CStdString strSQL=PrepareSQL("select idEpisode from episode where idFile=%i", idFile);
- CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, strFilenameAndPath.c_str(), strSQL.c_str());
+ CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, CURL::GetRedacted(strFilenameAndPath).c_str(), strSQL.c_str());
pDS->query(strSQL.c_str());
if (pDS->num_rows() > 0)
{
CStdString strSQL=PrepareSQL("select idMVideo from musicvideo where idFile=%i", idFile);
- CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, strFilenameAndPath.c_str(), strSQL.c_str());
+ CLog::Log(LOGDEBUG, "%s (%s), query = %s", __FUNCTION__, CURL::GetRedacted(strFilenameAndPath).c_str(), strSQL.c_str());
m_pDS->query(strSQL.c_str());
int idMVideo=-1;
if (m_pDS->num_rows() > 0)
CStdString strSQL=PrepareSQL("insert into movie (idMovie, idFile) values (NULL, %i)", idFile);
m_pDS->exec(strSQL.c_str());
idMovie = (int)m_pDS->lastinsertid();
-// CommitTransaction();
}
return idMovie;
strSQL=PrepareSQL("insert into tvshowlinkpath values (%i,%i)",idTvShow,idPath);
m_pDS->exec(strSQL.c_str());
-// CommitTransaction();
-
return idTvShow;
}
catch (...)
return false;
}
+bool CVideoDatabase::GetSeasonInfo(int idSeason, CVideoInfoTag& details)
+{
+ if (idSeason < 0)
+ return false;
+
+ try
+ {
+ if (!m_pDB.get() || !m_pDS.get())
+ return false;
+
+ CStdString sql = PrepareSQL("SELECT idShow FROM seasons WHERE idSeason=%i", idSeason);
+ if (!m_pDS->query(sql.c_str()))
+ return false;
+
+ int idShow = -1;
+ if (m_pDS->num_rows() == 1)
+ idShow = m_pDS->fv(0).get_asInt();
+
+ m_pDS->close();
+
+ if (idShow < 0)
+ return false;
+
+ CFileItemList seasons;
+ if (!GetSeasonsNav(StringUtils::Format("videodb://tvshows/titles/%ld/", idShow), seasons, -1, -1, -1, -1, idShow, false) || seasons.Size() <= 0)
+ return false;
+
+ for (int index = 0; index < seasons.Size(); index++)
+ {
+ const CFileItemPtr season = seasons.Get(index);
+ if (season->HasVideoInfoTag() && season->GetVideoInfoTag()->m_iDbId == idSeason && season->GetVideoInfoTag()->m_iIdShow == idShow)
+ {
+ details = *season->GetVideoInfoTag();
+ return true;
+ }
+ }
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "%s (%i) failed", __FUNCTION__, idSeason);
+ }
+ return false;
+}
+
bool CVideoDatabase::GetEpisodeInfo(const CStdString& strFilenameAndPath, CVideoInfoTag& details, int idEpisode /* = -1 */)
{
try
// query DB for any movies matching imdbid and year
CStdString strSQL = PrepareSQL("select files.playCount, files.lastPlayed from movie,files where files.idFile=movie.idFile and movie.c%02d='%s' and movie.c%02d=%i and movie.idMovie!=%i and files.playCount > 0", VIDEODB_ID_IDENT, details.m_strIMDBNumber.c_str(), VIDEODB_ID_YEAR, details.m_iYear, idMovie);
m_pDS->query(strSQL.c_str());
-
+
if (!m_pDS->eof())
{
int playCount = m_pDS->fv("files.playCount").get_asInt();
return -1;
}
+int CVideoDatabase::SetDetailsForSeason(const CVideoInfoTag& details, const std::map<std::string, std::string> &artwork, int idShow, int idSeason /* = -1 */)
+{
+ if (idShow < 0 || details.m_iSeason < 0)
+ return -1;
+
+ try
+ {
+ BeginTransaction();
+ if (idSeason < 0)
+ {
+ idSeason = AddSeason(idShow, details.m_iSeason);
+ if (idSeason < 0)
+ {
+ CommitTransaction();
+ return -1;
+ }
+ }
+
+ SetArtForItem(idSeason, "season", artwork);
+
+ // and insert the new row
+ CStdString sql = PrepareSQL("UPDATE seasons SET season=%i WHERE idSeason=%i", details.m_iSeason, idSeason);
+ m_pDS->exec(sql.c_str());
+ CommitTransaction();
+
+ return idSeason;
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "%s (%i) failed", __FUNCTION__, idSeason);
+ }
+ RollbackTransaction();
+ return -1;
+}
+
int CVideoDatabase::SetDetailsForEpisode(const CStdString& strFilenameAndPath, const CVideoInfoTag& details, const map<string, string> &artwork, int idShow, int idEpisode)
{
try
return GetSingleValue(query, m_pDS2);
}
+bool CVideoDatabase::RemoveArtForItem(int mediaId, const std::string &mediaType, const std::string &artType)
+{
+ return ExecuteQuery(PrepareSQL("DELETE FROM art WHERE media_id=%i AND media_type='%s' AND type='%s'", mediaId, mediaType.c_str(), artType.c_str()));
+}
+
+bool CVideoDatabase::RemoveArtForItem(int mediaId, const std::string &mediaType, const std::set<std::string> &artTypes)
+{
+ bool result = true;
+ for (set<string>::const_iterator i = artTypes.begin(); i != artTypes.end(); ++i)
+ result &= RemoveArtForItem(mediaId, mediaType, *i);
+
+ return result;
+}
+
bool CVideoDatabase::GetTvShowSeasonArt(int showId, map<int, map<string, string> > &seasonArt)
{
try
bool LoadVideoInfo(const CStdString& strFilenameAndPath, CVideoInfoTag& details);
bool GetMovieInfo(const CStdString& strFilenameAndPath, CVideoInfoTag& details, int idMovie = -1);
bool GetTvShowInfo(const CStdString& strPath, CVideoInfoTag& details, int idTvShow = -1);
+ bool GetSeasonInfo(int idSeason, CVideoInfoTag& details);
bool GetEpisodeInfo(const CStdString& strFilenameAndPath, CVideoInfoTag& details, int idEpisode = -1);
bool GetMusicVideoInfo(const CStdString& strFilenameAndPath, CVideoInfoTag& details, int idMVideo=-1);
bool GetSetInfo(int idSet, CVideoInfoTag& details);
int SetDetailsForMovie(const CStdString& strFilenameAndPath, const CVideoInfoTag& details, const std::map<std::string, std::string> &artwork, int idMovie = -1);
int SetDetailsForTvShow(const CStdString& strPath, const CVideoInfoTag& details, const std::map<std::string, std::string> &artwork, const std::map<int, std::map<std::string, std::string> > &seasonArt, int idTvShow = -1);
+ int SetDetailsForSeason(const CVideoInfoTag& details, const std::map<std::string, std::string> &artwork, int idShow, int idSeason = -1);
int SetDetailsForEpisode(const CStdString& strFilenameAndPath, const CVideoInfoTag& details, const std::map<std::string, std::string> &artwork, int idShow, int idEpisode=-1);
int SetDetailsForMusicVideo(const CStdString& strFilenameAndPath, const CVideoInfoTag& details, const std::map<std::string, std::string> &artwork, int idMVideo = -1);
void SetStreamDetailsForFile(const CStreamDetails& details, const CStdString &strFileNameAndPath);
void SetArtForItem(int mediaId, const std::string &mediaType, const std::map<std::string, std::string> &art);
bool GetArtForItem(int mediaId, const std::string &mediaType, std::map<std::string, std::string> &art);
std::string GetArtForItem(int mediaId, const std::string &mediaType, const std::string &artType);
+ bool RemoveArtForItem(int mediaId, const std::string &mediaType, const std::string &artType);
+ bool RemoveArtForItem(int mediaId, const std::string &mediaType, const std::set<std::string> &artTypes);
bool GetTvShowSeasonArt(int mediaId, std::map<int, std::map<std::string, std::string> > &seasonArt);
bool GetArtTypes(const std::string &mediaType, std::vector<std::string> &artTypes);
CStdString fastHash = GetFastHash(strDirectory);
if (m_database.GetPathHash(strDirectory, dbHash) && !fastHash.IsEmpty() && fastHash == dbHash)
{ // fast hashes match - no need to process anything
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Skipping dir '%s' due to no change (fasthash)", strDirectory.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Skipping dir '%s' due to no change (fasthash)", CURL::GetRedacted(strDirectory).c_str());
hash = fastHash;
bSkip = true;
}
if (hash != dbHash && !hash.IsEmpty())
{
if (dbHash.IsEmpty())
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Scanning dir '%s' as not in the database", strDirectory.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Scanning dir '%s' as not in the database", CURL::GetRedacted(strDirectory).c_str());
else
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Rescanning dir '%s' due to change (%s != %s)", strDirectory.c_str(), dbHash.c_str(), hash.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Rescanning dir '%s' due to change (%s != %s)", CURL::GetRedacted(strDirectory).c_str(), dbHash.c_str(), hash.c_str());
}
else
{ // they're the same or the hash is empty (dir empty/dir not retrievable)
if (hash.IsEmpty() && !dbHash.IsEmpty())
{
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Skipping dir '%s' as it's empty or doesn't exist - adding to clean list", strDirectory.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Skipping dir '%s' as it's empty or doesn't exist - adding to clean list", CURL::GetRedacted(strDirectory).c_str());
m_pathsToClean.insert(m_database.GetPathId(strDirectory));
}
else
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Skipping dir '%s' due to no change", strDirectory.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Skipping dir '%s' due to no change", CURL::GetRedacted(strDirectory).c_str());
bSkip = true;
if (m_handle)
OnDirectoryScanned(strDirectory);
{
m_database.SetPathHash(strDirectory, hash);
m_pathsToClean.insert(m_database.GetPathId(strDirectory));
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Finished adding information from dir %s", strDirectory.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Finished adding information from dir %s", CURL::GetRedacted(strDirectory).c_str());
}
}
else
{
m_pathsToClean.insert(m_database.GetPathId(strDirectory));
- CLog::Log(LOGDEBUG, "VideoInfoScanner: No (new) information was found in dir %s", strDirectory.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: No (new) information was found in dir %s", CURL::GetRedacted(strDirectory).c_str());
}
}
else if (hash != dbHash && (content == CONTENT_MOVIES || content == CONTENT_MUSICVIDEOS))
ret = RetrieveInfoForMusicVideo(pItem.get(), bDirNames, info2, useLocal, pURL, pDlgProgress);
else
{
- CLog::Log(LOGERROR, "VideoInfoScanner: Unknown content type %d (%s)", info2->Content(), pItem->GetPath().c_str());
+ CLog::Log(LOGERROR, "VideoInfoScanner: Unknown content type %d (%s)", info2->Content(), CURL::GetRedacted(pItem->GetPath()).c_str());
FoundSomeInfo = false;
break;
}
if (ret == INFO_ADDED || ret == INFO_HAVE_ALREADY)
FoundSomeInfo = true;
else if (ret == INFO_NOT_FOUND)
- CLog::Log(LOGWARNING, "No information found for item '%s', it won't be added to the library.", pItem->GetPath().c_str());
+ {
+ CLog::Log(LOGWARNING, "No information found for item '%s', it won't be added to the library.", CURL::GetRedacted(pItem->GetPath()).c_str());
+ }
pURL = NULL;
{
CStdString decode(items[i]->GetPath());
CURL::Decode(decode);
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Could not enumerate file %s", decode.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Could not enumerate file %s", CURL::GetRedacted(decode).c_str());
}
}
}
strTitle.Format("%s - %ix%i - %s", showInfo->m_strTitle.c_str(), movieDetails.m_iSeason, movieDetails.m_iEpisode, strTitle.c_str());
}
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Adding new item to %s:%s", TranslateContent(content).c_str(), pItem->GetPath().c_str());
+ std::string redactPath = pItem->GetPath();
+ CURL::Decode(redactPath);
+ redactPath = CURL::GetRedacted(redactPath);
+
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Adding new item to %s:%s", TranslateContent(content).c_str(), redactPath.c_str());
long lResult = -1;
if (content == CONTENT_MOVIES)
type = "malformed";
}
if (result != CNfoFile::NO_NFO)
- CLog::Log(LOGDEBUG, "VideoInfoScanner: Found matching %s NFO file: %s", type.c_str(), strNfoFile.c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: Found matching %s NFO file: %s", type.c_str(), CURL::GetRedacted(strNfoFile).c_str());
if (result == CNfoFile::FULL_NFO)
{
if (info->Content() == CONTENT_TVSHOWS)
}
}
else
- CLog::Log(LOGDEBUG, "VideoInfoScanner: No NFO file found. Using title search for '%s'", pItem->GetPath().c_str());
+ CLog::Log(LOGDEBUG, "VideoInfoScanner: No NFO file found. Using title search for '%s'", CURL::GetRedacted(pItem->GetPath()).c_str());
return result;
}
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "utils/Variant.h"
-#include "TextureCache.h"
+#include "TextureDatabase.h"
#include "filesystem/File.h"
#include <sstream>
actor["role"] = m_cast[i].strRole;
actor["order"] = m_cast[i].order;
if (!m_cast[i].thumb.IsEmpty())
- actor["thumbnail"] = CTextureCache::GetWrappedImageURL(m_cast[i].thumb);
+ actor["thumbnail"] = CTextureUtils::GetWrappedImageURL(m_cast[i].thumb);
value["cast"].push_back(actor);
}
value["set"] = m_strSet;
bool result=false;
if (m_thumb)
{
- CLog::Log(LOGDEBUG,"%s - trying to extract thumb from video file %s", __FUNCTION__, m_item.GetPath().c_str());
+ CLog::Log(LOGDEBUG,"%s - trying to extract thumb from video file %s", __FUNCTION__, CURL::GetRedacted(m_item.GetPath()).c_str());
// construct the thumb cache file
CTextureDetails details;
details.file = CTextureCache::GetCacheFile(m_target) + ".jpg";
else if (!m_item.HasVideoInfoTag() || !m_item.GetVideoInfoTag()->HasStreamDetails())
{
// No tag or no details set, so extract them
- CLog::Log(LOGDEBUG,"%s - trying to extract filestream details from video file %s", __FUNCTION__, m_item.GetPath().c_str());
+ CLog::Log(LOGDEBUG,"%s - trying to extract filestream details from video file %s", __FUNCTION__, CURL::GetRedacted(m_item.GetPath()).c_str());
result = CDVDFileInfo::GetFileStreamDetails(&m_item);
}
if (URIUtils::IsStack(path))
path = CStackDirectory::GetFirstStackedFile(path);
- return CTextureCache::GetWrappedImageURL(path, "video");
+ return CTextureUtils::GetWrappedImageURL(path, "video");
}
void CVideoThumbLoader::OnJobComplete(unsigned int jobID, bool success, CJob* job)
strItemPath.Format("fanart://Remote%i",i);
CFileItemPtr item(new CFileItem(strItemPath, false));
CStdString thumb = m_movieItem->GetVideoInfoTag()->m_fanart.GetPreviewURL(i);
- item->SetArt("thumb", CTextureCache::GetWrappedThumbURL(thumb));
+ item->SetArt("thumb", CTextureUtils::GetWrappedThumbURL(thumb));
item->SetIconImage("DefaultPicture.png");
item->SetLabel(g_localizeStrings.Get(20441));
// set the fanart image
if (flip && !result.IsEmpty())
- result = CTextureCache::GetWrappedImageURL(result, "", "flipped");
+ result = CTextureUtils::GetWrappedImageURL(result, "", "flipped");
CVideoDatabase db;
if (db.Open())
{
item.SetPath(pItem->GetVideoInfoTag()->m_strFileNameAndPath);
item.SetProperty("original_listitem_url", pItem->GetPath());
}
- CLog::Log(LOGDEBUG, "%s %s", __FUNCTION__, item.GetPath().c_str());
+ CLog::Log(LOGDEBUG, "%s %s", __FUNCTION__, CURL::GetRedacted(item.GetPath()).c_str());
if (item.GetPath().Left(17) == "pvr://recordings/")
{
return true;
}
-void CGUIWindowVideoNav::OnPrepareFileItems(CFileItemList &items)
-{
- CGUIWindowVideoBase::OnPrepareFileItems(items);
-}
-
void CGUIWindowVideoNav::GetContextButtons(int itemNumber, CContextButtons &buttons)
{
CFileItemPtr item;
if (result.Equals("fanart://None") || !CFile::Exists(result))
result.clear();
if (!result.IsEmpty() && flip)
- result = CTextureCache::GetWrappedImageURL(result, "", "flipped");
+ result = CTextureUtils::GetWrappedImageURL(result, "", "flipped");
// update the db
CVideoDatabase db;
virtual bool OnAction(const CAction &action);
virtual bool OnMessage(CGUIMessage& message);
- virtual void OnPrepareFileItems(CFileItemList &items);
-
virtual void OnInfo(CFileItem* pItem, ADDON::ScraperPtr &info);
static bool CanDelete(const CStdString& strPath);
static bool DeleteItem(CFileItem* pItem, bool bUnavailable=false);
#define XBMC_RELEASED 0
#define XBMC_PRESSED 1
+/* Hat definitions */
+#define XBMC_HAT_CENTERED 0
+#define XBMC_HAT_UP 0x01
+#define XBMC_HAT_RIGHT 0x02
+#define XBMC_HAT_DOWN 0x04
+#define XBMC_HAT_LEFT 0x08
+#define XBMC_HAT_LEFTUP XBMC_HAT_UP | XBMC_HAT_LEFT
+#define XBMC_HAT_RIGHTUP XBMC_HAT_UP | XBMC_HAT_RIGHT
+#define XBMC_HAT_LEFTDOWN XBMC_HAT_DOWN | XBMC_HAT_LEFT
+#define XBMC_HAT_RIGHTDOWN XBMC_HAT_DOWN | XBMC_HAT_RIGHT
+
/* Event enumerations */
typedef enum {
XBMC_NOEVENT = 0, /* Unused (do not remove) */
unsigned char which; /* The joystick device index */
unsigned char axis; /* The joystick axis index */
int16_t value; /* The axis value (range: -32768 to 32767) */
+ float fvalue; /* The axis value (range: -1.0 to 1.0) */
} XBMC_JoyAxisEvent;
/* Joystick trackball motion event structure */
/*
-* Copyright (C) 2010-2013 Team XBMC
+ * Copyright (C) 2010-2013 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
*/
#include "system.h"
-#include <list>
+
#include "WinEventsAndroid.h"
+
#include "Application.h"
-#include "threads/CriticalSection.h"
+#include "guilib/GUIWindowManager.h"
+#include "input/XBMC_vkeys.h"
+#include "input/SDLJoystick.h"
+#include "utils/log.h"
+#include "windowing/WindowingFactory.h"
+
+#include "android/jni/View.h"
+
+#define DEBUG_MESSAGEPUMP 0
+
+#define ALMOST_ZERO 0.125f
+enum {
+ EVENT_STATE_TEST,
+ EVENT_STATE_HOLD,
+ EVENT_STATE_REPEAT
+};
+
+/************************************************************************/
+/************************************************************************/
+static bool different_event(XBMC_Event &curEvent, XBMC_Event &newEvent)
+{
+ // different type
+ if (curEvent.type != newEvent.type)
+ return true;
+
+ // Hat
+ if(newEvent.type == XBMC_JOYHATMOTION)
+ return (curEvent.jhat.value != newEvent.jhat.value);
+
+ // different axis
+ if (curEvent.jaxis.axis != newEvent.jaxis.axis)
+ return true;
-static CCriticalSection g_inputCond;
+ // different axis direction (handles -1 vs 1)
+ if (signbit(curEvent.jaxis.fvalue) != signbit(newEvent.jaxis.fvalue))
+ return true;
-static std::list<XBMC_Event> events;
+ // different axis value (handles 0 vs 1 or -1)
+ if ((fabs(curEvent.jaxis.fvalue) < ALMOST_ZERO) != (fabs(newEvent.jaxis.fvalue) < ALMOST_ZERO))
+ return true;
-void CWinEventsAndroid::DeInit()
+ return false;
+}
+
+/************************************************************************/
+/************************************************************************/
+CWinEventsAndroid::CWinEventsAndroid()
+: CThread("CWinEventsAndroid")
{
+ CLog::Log(LOGDEBUG, "CWinEventsAndroid::CWinEventsAndroid");
+ Create();
}
-void CWinEventsAndroid::Init()
+CWinEventsAndroid::~CWinEventsAndroid()
{
+ m_bStop = true;
+ StopThread(true);
}
void CWinEventsAndroid::MessagePush(XBMC_Event *newEvent)
{
- CSingleLock lock(g_inputCond);
- events.push_back(*newEvent);
+ CSingleLock lock(m_eventsCond);
+
+ m_events.push_back(*newEvent);
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "push event, size(%d), fvalue(%f)",
+ m_events.size(), newEvent->jaxis.fvalue);
+ #endif
+}
+
+void CWinEventsAndroid::MessagePushRepeat(XBMC_Event *repeatEvent)
+{
+ CSingleLock lock(m_eventsCond);
+
+ std::list<XBMC_Event>::iterator itt;
+ for (itt = m_events.begin(); itt != m_events.end(); ++itt)
+ {
+ // we have events pending, if we we just
+ // repush, we might push the repeat event
+ // in back of a canceling non-active event.
+ // do not repush if pending are different event.
+ if (different_event(*itt, *repeatEvent))
+ {
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "repush skip, size(%d), fvalue(%f)",
+ m_events.size(), repeatEvent->jaxis.fvalue);
+ #endif
+ return;
+ }
+ }
+ // is a repeat, push it
+ m_events.push_back(*repeatEvent);
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "repush event, size(%d), fvalue(%f)",
+ m_events.size(), repeatEvent->jaxis.fvalue);
+ #endif
}
bool CWinEventsAndroid::MessagePump()
{
bool ret = false;
- // Do not always loop, only pump the initial queued count events. else if ui keep pushing
- // events the loop won't finish then it will block xbmc main message loop.
- for (size_t pumpEventCount = GetQueueSize(); pumpEventCount > 0; --pumpEventCount)
+ // Do not always loop, only pump the initial queued count events. else if ui keep pushing
+ // events the loop won't finish then it will block xbmc main message loop.
+ for (size_t pumpEventCount = GetQueueSize(); pumpEventCount > 0; --pumpEventCount)
{
-
- // Pop up only one event per time since in App::OnEvent it may init modal dialog which init
- // deeper message loop and call the deeper MessagePump from there.
- XBMC_Event pumpEvent;
- {
- CSingleLock lock(g_inputCond);
- if (events.size() == 0)
- return ret;
- pumpEvent = events.front();
- events.pop_front();
- }
-
- ret |= g_application.OnEvent(pumpEvent);
+ // Pop up only one event per time since in App::OnEvent it may init modal dialog which init
+ // deeper message loop and call the deeper MessagePump from there.
+ XBMC_Event pumpEvent;
+ {
+ CSingleLock lock(m_eventsCond);
+ if (m_events.empty())
+ return ret;
+ pumpEvent = m_events.front();
+ m_events.pop_front();
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, " pop event, size(%d), fvalue(%f)",
+ m_events.size(), pumpEvent.jaxis.fvalue);
+ #endif
+ }
+
+ if ((pumpEvent.type == XBMC_JOYBUTTONUP) ||
+ (pumpEvent.type == XBMC_JOYBUTTONDOWN) ||
+ (pumpEvent.type == XBMC_JOYAXISMOTION) ||
+ (pumpEvent.type == XBMC_JOYHATMOTION))
+ {
+ int item;
+ int type;
+ uint32_t holdTime;
+ APP_InputDevice input_device;
+ float amount = 1.0f;
+ short input_type;
+
+ type = pumpEvent.type;
+ switch (type)
+ {
+ case XBMC_JOYAXISMOTION:
+ // The typical joystick keymap xml has the following where 'id' is the axis
+ // and 'limit' is which action to choose (ie. Up or Down).
+ // <axis id="5" limit="-1">Up</axis>
+ // <axis id="5" limit="+1">Down</axis>
+ // One would think that limits is in reference to fvalue but
+ // it is really in reference to id :) The sign of item passed
+ // into ProcessJoystickEvent indicates the action mapping.
+ item = pumpEvent.jaxis.axis;
+ if (fabs(pumpEvent.jaxis.fvalue) < ALMOST_ZERO)
+ amount = 0.0f;
+ else if (pumpEvent.jaxis.fvalue < 0.0f)
+ item = -item;
+ holdTime = 0;
+ input_device.id = pumpEvent.jaxis.which;
+ input_type = JACTIVE_AXIS;
+ break;
+
+ case XBMC_JOYHATMOTION:
+ item = pumpEvent.jhat.hat | 0xFFF00000 | (pumpEvent.jhat.value<<16);
+ holdTime = 0;
+ input_device.id = pumpEvent.jhat.which;
+ input_type = JACTIVE_HAT;
+ break;
+
+ case XBMC_JOYBUTTONUP:
+ case XBMC_JOYBUTTONDOWN:
+ item = pumpEvent.jbutton.button;
+ holdTime = pumpEvent.jbutton.holdTime;
+ input_device.id = pumpEvent.jbutton.which;
+ input_type = JACTIVE_BUTTON;
+ break;
+ }
+
+ // look for device name in our inputdevice cache
+ // so we can lookup and match the right joystick.xxx.xml
+ for (size_t i = 0; i < m_input_devices.size(); i++)
+ {
+ if (m_input_devices[i].id == input_device.id)
+ input_device.name = m_input_devices[i].name;
+ }
+ if (input_device.name.empty())
+ {
+ // not in inputdevice cache, fetch and cache it.
+ CJNIViewInputDevice view_input_device = CJNIViewInputDevice::getDevice(input_device.id);
+ input_device.name = view_input_device.getName();
+ CLog::Log(LOGDEBUG, "CWinEventsAndroid::MessagePump:caching id(%d), device(%s)",
+ input_device.id, input_device.name.c_str());
+ m_input_devices.push_back(input_device);
+ }
+
+ if (type == XBMC_JOYAXISMOTION || type == XBMC_JOYHATMOTION)
+ {
+ // Joystick autorepeat -> only handle axis
+ CSingleLock lock(m_lasteventCond);
+ m_lastevent.push(pumpEvent);
+ }
+
+ if (fabs(amount) >= ALMOST_ZERO)
+ {
+ ret |= g_application.ProcessJoystickEvent(input_device.name,
+ item, input_type, amount, holdTime);
+ }
+ }
+ else
+ {
+ ret |= g_application.OnEvent(pumpEvent);
+ }
+
+ if (pumpEvent.type == XBMC_MOUSEBUTTONUP)
+ g_windowManager.SendMessage(GUI_MSG_UNFOCUS_ALL, 0, 0, 0, 0);
}
return ret;
size_t CWinEventsAndroid::GetQueueSize()
{
- CSingleLock lock(g_inputCond);
- return events.size();
+ CSingleLock lock(m_eventsCond);
+ return m_events.size();
+}
+
+void CWinEventsAndroid::Process()
+{
+ uint32_t timeout = 10;
+ uint32_t holdTimeout = 500;
+ uint32_t repeatTimeout = 100;
+ uint32_t repeatDuration = 0;
+
+ XBMC_Event cur_event;
+ int state = EVENT_STATE_TEST;
+ while (!m_bStop)
+ {
+ // run a 10ms (timeout) wait cycle
+ Sleep(timeout);
+
+ CSingleLock lock(m_lasteventCond);
+
+ switch(state)
+ {
+ default:
+ case EVENT_STATE_TEST:
+ // check for axis action events
+ if (!m_lastevent.empty())
+ {
+ if ((m_lastevent.front().type == XBMC_JOYAXISMOTION && fabs(m_lastevent.front().jaxis.fvalue) >= ALMOST_ZERO)
+ || (m_lastevent.front().type == XBMC_JOYHATMOTION && m_lastevent.front().jhat.value > XBMC_HAT_CENTERED))
+ {
+ // new active event
+ cur_event = m_lastevent.front();
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "test -> hold, size(%d), fvalue(%f)",
+ m_lastevent.size(), m_lastevent.front().jaxis.fvalue);
+ #endif
+ m_lastevent.pop();
+ repeatDuration = 0;
+ state = EVENT_STATE_HOLD;
+ break;
+ }
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "munch test, size(%d), fvalue(%f)",
+ m_lastevent.size(), m_lastevent.front().jaxis.fvalue);
+ #endif
+ // non-active event, eat it
+ m_lastevent.pop();
+ }
+ break;
+
+ case EVENT_STATE_HOLD:
+ repeatDuration += timeout;
+ if (!m_lastevent.empty())
+ {
+ if (different_event(cur_event, m_lastevent.front()))
+ {
+ // different axis event, cycle back to test
+ state = EVENT_STATE_TEST;
+ break;
+ }
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "munch hold, size(%d), fvalue(%f)",
+ m_lastevent.size(), m_lastevent.front().jaxis.fvalue);
+ #endif
+ // same axis event, eat it
+ m_lastevent.pop();
+ }
+ if (repeatDuration >= holdTimeout)
+ {
+ CLog::Log(LOGDEBUG, "hold ->repeat, size(%d), repeatDuration(%d)", m_lastevent.size(), repeatDuration);
+ state = EVENT_STATE_REPEAT;
+ }
+ break;
+
+ case EVENT_STATE_REPEAT:
+ repeatDuration += timeout;
+ if (!m_lastevent.empty())
+ {
+ if (different_event(cur_event, m_lastevent.front()))
+ {
+ // different axis event, cycle back to test
+ state = EVENT_STATE_TEST;
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "repeat-> test, size(%d), fvalue(%f)",
+ m_lastevent.size(), m_lastevent.front().jaxis.fvalue);
+ #endif
+ break;
+ }
+ #if DEBUG_MESSAGEPUMP
+ CLog::Log(LOGDEBUG, "munch repeat, size(%d), fvalue(%f)",
+ m_lastevent.size(), m_lastevent.front().jaxis.fvalue);
+ #endif
+ // same axis event, eat it
+ m_lastevent.pop();
+ }
+ if (repeatDuration >= holdTimeout)
+ {
+ // this is a repeat, push it
+ MessagePushRepeat(&cur_event);
+ // assuming holdTimeout > repeatTimeout,
+ // just subtract the repeatTimeout
+ // to get the next cycle time
+ repeatDuration -= repeatTimeout;
+ }
+ break;
+ }
+ }
}
/*
-* Copyright (C) 2010-2013 Team XBMC
+ * Copyright (C) 2010-2013 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
#ifndef WINDOW_EVENTS_ANDROID_H
#define WINDOW_EVENTS_ANDROID_H
+#include <list>
+#include <queue>
+#include <vector>
+#include <string>
+
+#include "threads/Event.h"
+#include "threads/Thread.h"
+#include "threads/CriticalSection.h"
#include "windowing/WinEvents.h"
-class CWinEventsAndroid : public IWinEvents
+typedef struct {
+ int32_t id;
+ std::string name;
+} APP_InputDevice;
+
+class CWinEventsAndroid : public IWinEvents, public CThread
{
public:
- static void Init();
- static void DeInit();
- void MessagePush(XBMC_Event *newEvent);
- bool MessagePump();
+ CWinEventsAndroid();
+ ~CWinEventsAndroid();
+
+ void MessagePush(XBMC_Event *newEvent);
+ void MessagePushRepeat(XBMC_Event *repeatEvent);
+ bool MessagePump();
virtual size_t GetQueueSize();
+
+private:
+ // for CThread
+ virtual void Process();
+
+ CCriticalSection m_eventsCond;
+ std::list<XBMC_Event> m_events;
+
+ CCriticalSection m_lasteventCond;
+ std::queue<XBMC_Event> m_lastevent;
+
+ std::vector<APP_InputDevice> m_input_devices;
};
#endif // WINDOW_EVENTS_ANDROID_H
EGLConfig GetEGLConfig();
+ EGLDisplay GetEGLDisplay();
+ EGLContext GetEGLContext();
protected:
virtual bool PresentRenderImpl(const CDirtyRegionList &dirty);
virtual void SetVSyncImpl(bool enable);
bool CreateWindow(RESOLUTION_INFO &res);
- EGLDisplay GetEGLDisplay();
- EGLContext GetEGLContext();
int m_displayWidth;
int m_displayHeight;
#include <list>
#include "WinEventsIOS.h"
#include "input/XBMC_vkeys.h"
+#include "input/SDLJoystick.h"
#include "Application.h"
#include "windowing/WindowingFactory.h"
#include "threads/CriticalSection.h"
// the jbutton.which will be the keyID to translate using joystick.AppleRemote.xml
// jbutton.holdTime is the time the button is hold in ms (for repeated keypresses)
std::string joystickName = "AppleRemote";
- bool isAxis = false;
float fAmount = 1.0;
unsigned char wKeyID = pumpEvent.jbutton.which;
unsigned int holdTime = pumpEvent.jbutton.holdTime;
CLog::Log(LOGDEBUG,"CWinEventsIOS: Button press keyID = %i", wKeyID);
- ret |= g_application.ProcessJoystickEvent(joystickName, wKeyID, isAxis, fAmount, holdTime);
+ ret |= g_application.ProcessJoystickEvent(joystickName, wKeyID, JACTIVE_BUTTON, fAmount, holdTime);
}
else
ret |= g_application.OnEvent(pumpEvent);
#if defined(TARGET_ANDROID)
#include "xbmc/android/activity/XBMCApp.h"
#endif
+#include "FileItemListModification.h"
#define CONTROL_BTNVIEWASICONS 2
#define CONTROL_BTNSORTBY 3
CStdString strParentPath = m_history.GetParentPath();
- CLog::Log(LOGDEBUG,"CGUIMediaWindow::GetDirectory (%s)", strDirectory.c_str());
- CLog::Log(LOGDEBUG," ParentPath = [%s]", strParentPath.c_str());
+ CLog::Log(LOGDEBUG,"CGUIMediaWindow::GetDirectory (%s)",
+ CURL::GetRedacted(strDirectory).c_str());
+ CLog::Log(LOGDEBUG," ParentPath = [%s]", CURL::GetRedacted(strParentPath).c_str());
// see if we can load a previously cached folder
CFileItemList cachedItems(strDirectory);
CStdString filter;
CURL url(directory);
if (canfilter && url.HasOption("filter"))
- {
- filter = url.GetOption("filter");
directory = RemoveParameterFromPath(directory, "filter");
- }
CFileItemList items;
if (!GetDirectory(directory, items))
{
- CLog::Log(LOGERROR,"CGUIMediaWindow::GetDirectory(%s) failed", strDirectory.c_str());
+ CLog::Log(LOGERROR,"CGUIMediaWindow::GetDirectory(%s) failed", url.GetRedacted().c_str());
// Try to return to the previous directory, if not the same
// else fallback to root
if (strDirectory.Equals(strCurrentDirectory) || !Update(m_history.RemoveParentPath()))
ClearFileItems();
m_vecItems->Copy(items);
- // only set the filter path if it hasn't been marked
- // as preset or if it's empty
- if (updateFilterPath || m_strFilterPath.empty())
- {
- if (items.HasProperty(PROPERTY_PATH_DB))
- m_strFilterPath = items.GetProperty(PROPERTY_PATH_DB).asString();
- else
- m_strFilterPath = items.GetPath();
- }
-
- // maybe the filter path can contain a filter
- if (!canfilter && CanContainFilter(m_strFilterPath))
- canfilter = true;
-
- // check if the filter path contains a filter
- CURL filterPathUrl(m_strFilterPath);
- if (canfilter && filter.empty())
- {
- if (filterPathUrl.HasOption("filter"))
- filter = filterPathUrl.GetOption("filter");
- }
-
- // check if there is a filter and re-apply it
- if (canfilter && !filter.empty())
- {
- if (!m_filter.LoadFromJson(filter))
- {
- CLog::Log(LOGWARNING, "CGUIMediaWindow::Update: unable to load existing filter (%s)", filter.c_str());
- m_filter.Reset();
- m_strFilterPath = m_vecItems->GetPath();
- }
- else
- {
- // add the filter to the filter path
- filterPathUrl.SetOption("filter", filter);
- m_strFilterPath = filterPathUrl.Get();
- }
- }
+ // check the given path for filter data
+ UpdateFilterPath(strDirectory, items, updateFilterPath);
// if we're getting the root source listing
// make sure the path history is clean
// It's used to load tag info for music.
void CGUIMediaWindow::OnPrepareFileItems(CFileItemList &items)
{
-
+ CFileItemListModification::Get().Modify(items);
}
// \brief This function will be called by Update() before
g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_NONE);
CFileItemPtr pItem=m_vecItems->Get(iItem);
- CLog::Log(LOGDEBUG, "%s %s", __FUNCTION__, pItem->GetPath().c_str());
+ CLog::Log(LOGDEBUG, "%s %s", __FUNCTION__, CURL::GetRedacted(pItem->GetPath()).c_str());
bool bResult = false;
if (pItem->IsInternetStream() || pItem->IsPlayList())
return true;
}
+void CGUIMediaWindow::UpdateFilterPath(const CStdString &strDirectory, const CFileItemList &items, bool updateFilterPath)
+{
+ bool canfilter = CanContainFilter(strDirectory);
+
+ CStdString filter;
+ CURL url(strDirectory);
+ if (canfilter && url.HasOption("filter"))
+ filter = url.GetOption("filter");
+
+ // only set the filter path if it hasn't been marked
+ // as preset or if it's empty
+ if (updateFilterPath || m_strFilterPath.empty())
+ {
+ if (items.HasProperty(PROPERTY_PATH_DB))
+ m_strFilterPath = items.GetProperty(PROPERTY_PATH_DB).asString();
+ else
+ m_strFilterPath = items.GetPath();
+ }
+
+ // maybe the filter path can contain a filter
+ if (!canfilter && CanContainFilter(m_strFilterPath))
+ canfilter = true;
+
+ // check if the filter path contains a filter
+ CURL filterPathUrl(m_strFilterPath);
+ if (canfilter && filter.empty())
+ {
+ if (filterPathUrl.HasOption("filter"))
+ filter = filterPathUrl.GetOption("filter");
+ }
+
+ // check if there is a filter and re-apply it
+ if (canfilter && !filter.empty())
+ {
+ if (!m_filter.LoadFromJson(filter))
+ {
+ CLog::Log(LOGWARNING, "CGUIMediaWindow::UpdateFilterPath(): unable to load existing filter (%s)", filter.c_str());
+ m_filter.Reset();
+ m_strFilterPath = m_vecItems->GetPath();
+ }
+ else
+ {
+ // add the filter to the filter path
+ filterPathUrl.SetOption("filter", filter);
+ m_strFilterPath = filterPathUrl.Get();
+ }
+ }
+}
+
void CGUIMediaWindow::OnFilterItems(const CStdString &filter)
{
CFileItemPtr currentItem;
\return true if the given path can contain a "filter" parameter otherwise false
*/
virtual bool CanContainFilter(const CStdString &strDirectory) const { return false; }
+ virtual void UpdateFilterPath(const CStdString &strDirector, const CFileItemList &items, bool updateFilterPath);
virtual bool Filter(bool advanced = true);
/* \brief Called on response to a GUI_MSG_FILTER_ITEMS message