diff options
147 files changed, 7648 insertions, 5402 deletions
diff --git a/.gitignore b/.gitignore index 512a9f5e57..1ec2ba38a5 100644 --- a/.gitignore +++ b/.gitignore @@ -407,7 +407,6 @@ lib/cpluff/stamp-h1 /system/hdhomerun.dll /system/ssh.dll /system/sqlite3.dll -/system/libsamplerate-0.dll /system/libnfs.dll /system/dnssd.dll /system/libcec.dll @@ -1101,10 +1100,6 @@ lib/cpluff/stamp-h1 /lib/win32/libmms_win32/msvc++/Debug /lib/win32/libmms_win32/msvc++/Release -# /lib/win32/libsamplerate -/lib/win32/libsamplerate/libsamplerate_win32/Debug -/lib/win32/libsamplerate/libsamplerate_win32/Release - # /lib/win32/sqlite /lib/win32/sqlite/libsqlite_win32/Debug /lib/win32/sqlite/libsqlite_win32/Release diff --git a/XBMC.xcodeproj/project.pbxproj b/XBMC.xcodeproj/project.pbxproj index 878016bc12..1a346f1d8b 100644 --- a/XBMC.xcodeproj/project.pbxproj +++ b/XBMC.xcodeproj/project.pbxproj @@ -217,35 +217,35 @@ 43BF09221080C6BA00E25290 /* NptUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF08E41080C6BA00E25290 /* NptUtils.cpp */; }; 43BF09231080C6BA00E25290 /* NptXml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF08E71080C6BA00E25290 /* NptXml.cpp */; }; 43BF09241080C6BA00E25290 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF08E91080C6BA00E25290 /* NptZip.cpp */; }; - 43BF09331080C71700E25290 /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF092F1080C71700E25290 /* NptBsdNetwork.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09341080C71700E25290 /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09301080C71700E25290 /* NptBsdSockets.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF094A1080C76E00E25290 /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF093E1080C76E00E25290 /* NptPosixNetwork.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF094B1080C76E00E25290 /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF093F1080C76E00E25290 /* NptPosixQueue.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF094C1080C76E00E25290 /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09401080C76E00E25290 /* NptPosixSystem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF094D1080C76E00E25290 /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09411080C76E00E25290 /* NptPosixThreads.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF094E1080C76E00E25290 /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09421080C76E00E25290 /* NptSelectableMessageQueue.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09511080C79900E25290 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF094F1080C79900E25290 /* NptPosixDynamicLibraries.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09611080C82D00E25290 /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09571080C82D00E25290 /* NptStdcDebug.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09621080C82D00E25290 /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09581080C82D00E25290 /* NptStdcEnvironment.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09981080D13F00E25290 /* ConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09921080D13F00E25290 /* ConnectionManagerSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09991080D13F00E25290 /* ContentDirectorySCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09931080D13F00E25290 /* ContentDirectorySCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF099A1080D13F00E25290 /* ContentDirectorywSearchSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09941080D13F00E25290 /* ContentDirectorywSearchSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF099D1080D17600E25290 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF099B1080D17600E25290 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09A21080D1E900E25290 /* AVTransportSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF099E1080D1E900E25290 /* AVTransportSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09A31080D1E900E25290 /* RenderingControlSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF099F1080D1E900E25290 /* RenderingControlSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 43BF09AB1080D2ED00E25290 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09A81080D2ED00E25290 /* RdrConnectionManagerSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09331080C71700E25290 /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF092F1080C71700E25290 /* NptBsdNetwork.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09341080C71700E25290 /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09301080C71700E25290 /* NptBsdSockets.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF094A1080C76E00E25290 /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF093E1080C76E00E25290 /* NptPosixNetwork.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF094B1080C76E00E25290 /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF093F1080C76E00E25290 /* NptPosixQueue.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF094C1080C76E00E25290 /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09401080C76E00E25290 /* NptPosixSystem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF094D1080C76E00E25290 /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09411080C76E00E25290 /* NptPosixThreads.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF094E1080C76E00E25290 /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09421080C76E00E25290 /* NptSelectableMessageQueue.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09511080C79900E25290 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF094F1080C79900E25290 /* NptPosixDynamicLibraries.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09611080C82D00E25290 /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09571080C82D00E25290 /* NptStdcDebug.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09621080C82D00E25290 /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09581080C82D00E25290 /* NptStdcEnvironment.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09981080D13F00E25290 /* ConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09921080D13F00E25290 /* ConnectionManagerSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09991080D13F00E25290 /* ContentDirectorySCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09931080D13F00E25290 /* ContentDirectorySCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF099A1080D13F00E25290 /* ContentDirectorywSearchSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09941080D13F00E25290 /* ContentDirectorywSearchSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF099D1080D17600E25290 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF099B1080D17600E25290 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09A21080D1E900E25290 /* AVTransportSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF099E1080D1E900E25290 /* AVTransportSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09A31080D1E900E25290 /* RenderingControlSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF099F1080D1E900E25290 /* RenderingControlSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 43BF09AB1080D2ED00E25290 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BF09A81080D2ED00E25290 /* RdrConnectionManagerSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 551C3A45175A12010051AAAD /* VDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 551C3A43175A12010051AAAD /* VDA.cpp */; }; - 552840CC1626163B00ED1333 /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 552840CC1626163B00ED1333 /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 552A226915F7E14B0015C0D0 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552A226815F7E14B0015C0D0 /* main.cpp */; }; - 553840F215F360B400CE061B /* PltMimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 553840ED15F360B400CE061B /* PltMimeType.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 553840F315F360B400CE061B /* PltProtocolInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 553840EF15F360B400CE061B /* PltProtocolInfo.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 5538431D15F3626C00CE061B /* PltDownloader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5538431B15F3626C00CE061B /* PltDownloader.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 553840F215F360B400CE061B /* PltMimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 553840ED15F360B400CE061B /* PltMimeType.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 553840F315F360B400CE061B /* PltProtocolInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 553840EF15F360B400CE061B /* PltProtocolInfo.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 5538431D15F3626C00CE061B /* PltDownloader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5538431B15F3626C00CE061B /* PltDownloader.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 5538432715F3633800CE061B /* NptCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5538431F15F3633700CE061B /* NptCrypto.cpp */; }; 5538432815F3633800CE061B /* NptDigest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5538432115F3633700CE061B /* NptDigest.cpp */; }; 5538432915F3633800CE061B /* NptHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5538432315F3633700CE061B /* NptHash.cpp */; }; - 5538432B15F3646C00CE061B /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5538432A15F3646C00CE061B /* NptPosixTime.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 5538433115F3678900CE061B /* NptCocoaEnviroment.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5538432D15F3678900CE061B /* NptCocoaEnviroment.mm */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 5538433415F3685C00CE061B /* NptAppleAutoreleasePool.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5538433315F3685C00CE061B /* NptAppleAutoreleasePool.mm */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 5538432B15F3646C00CE061B /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5538432A15F3646C00CE061B /* NptPosixTime.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 5538433115F3678900CE061B /* NptCocoaEnviroment.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5538432D15F3678900CE061B /* NptCocoaEnviroment.mm */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 5538433415F3685C00CE061B /* NptAppleAutoreleasePool.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5538433315F3685C00CE061B /* NptAppleAutoreleasePool.mm */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 5558ED10176396CD00118C35 /* StereoscopicsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5558ED0E176396CD00118C35 /* StereoscopicsManager.cpp */; }; 55611BA31766672F00754072 /* RenderFlags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55611BA21766672F00754072 /* RenderFlags.cpp */; }; 55D3604E1826CAB900DA66D2 /* OverlayRendererGUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55D3604C1826CAB900DA66D2 /* OverlayRendererGUI.cpp */; }; @@ -347,6 +347,24 @@ 7CC30DB116291A5C003E7579 /* MusicThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC30DAF16291A5C003E7579 /* MusicThumbLoader.cpp */; }; 7CC30DC016291C2C003E7579 /* VideoThumbLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC30DBE16291C2C003E7579 /* VideoThumbLoader.cpp */; }; 7CC30E8A16296078003E7579 /* EdenVideoArtUpdater.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC30E8816296078003E7579 /* EdenVideoArtUpdater.cpp */; }; + 7CC7B6B31918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */; }; + 7CC7B6B41918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */; }; + 7CC7B6B51918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */; }; + 7CC7B6B61918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */; }; + 7CC7B6B71918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */; }; + 7CC7B6B81918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */; }; + 7CC7B6B91918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */; }; + 7CC7B6BA1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */; }; + 7CC7B6BB1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */; }; + 7CC7B6C0191869EA00DDB120 /* SettingCreator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */; }; + 7CC7B6C1191869EA00DDB120 /* SettingCreator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */; }; + 7CC7B6C2191869EA00DDB120 /* SettingCreator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */; }; + 7CC7B6C3191869EA00DDB120 /* SettingUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */; }; + 7CC7B6C4191869EA00DDB120 /* SettingUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */; }; + 7CC7B6C5191869EA00DDB120 /* SettingUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */; }; + 7CC7B6C819186A8800DDB120 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */; }; + 7CC7B6C919186A8800DDB120 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */; }; + 7CC7B6CA19186A8800DDB120 /* SettingConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */; }; 7CC82C9318284F9F0010DF30 /* CharsetDetection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC82C9118284F9F0010DF30 /* CharsetDetection.cpp */; }; 7CC82C9418284F9F0010DF30 /* CharsetDetection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC82C9118284F9F0010DF30 /* CharsetDetection.cpp */; }; 7CC82C9518284F9F0010DF30 /* CharsetDetection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC82C9118284F9F0010DF30 /* CharsetDetection.cpp */; }; @@ -355,8 +373,8 @@ 7CCFD98D151494E100211D82 /* PCMCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCFD98A151494E100211D82 /* PCMCodec.cpp */; }; 7CDAE9050FFCA3520040B25F /* DVDTSCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */; }; 7CDAEA7D1001CD6E0040B25F /* karaokelyricstextustar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */; }; - 7CDAEA8C1001EBA70040B25F /* PltConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA891001EBA70040B25F /* PltConstants.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 7CDAEA8D1001EBA70040B25F /* PltIconsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA8B1001EBA70040B25F /* PltIconsData.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 7CDAEA8C1001EBA70040B25F /* PltConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA891001EBA70040B25F /* PltConstants.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 7CDAEA8D1001EBA70040B25F /* PltIconsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA8B1001EBA70040B25F /* PltIconsData.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CEBD8A80F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */; }; 7CEE2E5B13D6B71E000ABF2A /* TimeSmoother.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE2E5913D6B71E000ABF2A /* TimeSmoother.cpp */; }; 7CF0504B190A1D7200222135 /* FFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05049190A1D7200222135 /* FFmpeg.cpp */; }; @@ -366,7 +384,7 @@ 7CF05057191195DA00222135 /* MediaType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05051191195DA00222135 /* MediaType.cpp */; }; 7CF05058191195DA00222135 /* MediaType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF05051191195DA00222135 /* MediaType.cpp */; }; 7CF1FB0C123B1AF000B2CBCB /* Variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CF1FB09123B1AF000B2CBCB /* Variant.cpp */; }; - 810C9F630D67BD2F0095F5DD /* PltMediaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 810C9F600D67BD2F0095F5DD /* PltMediaConnect.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + 810C9F630D67BD2F0095F5DD /* PltMediaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 810C9F600D67BD2F0095F5DD /* PltMediaConnect.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 810C9FA90D67D1FB0095F5DD /* MythDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 810C9FA50D67D1FB0095F5DD /* MythDirectory.cpp */; }; 810C9FAA0D67D1FB0095F5DD /* MythFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 810C9FA70D67D1FB0095F5DD /* MythFile.cpp */; }; 815EE6350E17F1DC009FBE3C /* DVDInputStreamRTMP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 815EE6330E17F1DC009FBE3C /* DVDInputStreamRTMP.cpp */; }; @@ -451,10 +469,10 @@ DF0ABB74183A94A30018445D /* Utf8Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0ABB71183A94A30018445D /* Utf8Utils.cpp */; }; DF0ABB75183A94A30018445D /* Utf8Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0ABB71183A94A30018445D /* Utf8Utils.cpp */; }; DF0DF15C13A3ADA7008ED511 /* NFSDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0DF15913A3ADA7008ED511 /* NFSDirectory.cpp */; }; - DF2345E115FA639500A934F6 /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - DF2345E215FA639500A934F6 /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - DF2345E315FA639500A934F6 /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - DF2345E415FA639500A934F6 /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + DF2345E115FA639500A934F6 /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + DF2345E215FA639500A934F6 /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + DF2345E315FA639500A934F6 /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + DF2345E415FA639500A934F6 /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; DF24A6B41406C7C500C7721E /* AFPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF24A6B01406C7C500C7721E /* AFPDirectory.cpp */; }; DF28DF4D17B8379E0077F41A /* ProfilesOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28DF4B17B8379E0077F41A /* ProfilesOperations.cpp */; }; DF28DF4E17B8379E0077F41A /* ProfilesOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF28DF4B17B8379E0077F41A /* ProfilesOperations.cpp */; }; @@ -588,7 +606,6 @@ DFB65FD115373AE7006B8FF1 /* AERemap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAD15373AE7006B8FF1 /* AERemap.cpp */; }; DFB65FD215373AE7006B8FF1 /* AEStreamInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAF15373AE7006B8FF1 /* AEStreamInfo.cpp */; }; DFB65FD315373AE7006B8FF1 /* AEUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */; }; - DFB65FD415373AE7006B8FF1 /* AEWAVLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB315373AE7006B8FF1 /* AEWAVLoader.cpp */; }; DFB6610915374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB6610615374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp */; }; DFBB4308178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; }; DFBB4309178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; }; @@ -813,7 +830,6 @@ DFF0F14517528350002DA3A4 /* AERemap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAD15373AE7006B8FF1 /* AERemap.cpp */; }; DFF0F14617528350002DA3A4 /* AEStreamInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAF15373AE7006B8FF1 /* AEStreamInfo.cpp */; }; DFF0F14717528350002DA3A4 /* AEUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */; }; - DFF0F14817528350002DA3A4 /* AEWAVLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB315373AE7006B8FF1 /* AEWAVLoader.cpp */; }; DFF0F14917528350002DA3A4 /* AEFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65F6515373AE7006B8FF1 /* AEFactory.cpp */; }; DFF0F14A17528350002DA3A4 /* EmuFileWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14E30D25F9F900618676 /* EmuFileWrapper.cpp */; }; DFF0F14B17528350002DA3A4 /* emu_dummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14B90D25F9F900618676 /* emu_dummy.cpp */; }; @@ -1039,7 +1055,7 @@ DFF0F22E17528350002DA3A4 /* MythSession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3BBB7980D7EA78A00CAAFD3 /* MythSession.cpp */; }; DFF0F22F17528350002DA3A4 /* NFSDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0DF15913A3ADA7008ED511 /* NFSDirectory.cpp */; }; DFF0F23017528350002DA3A4 /* NFSFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D67D1444A8B0007C6459 /* NFSFile.cpp */; }; - DFF0F23117528350002DA3A4 /* NptXbmcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4E91BB70E7F7338001F0546 /* NptXbmcFile.cpp */; }; + DFF0F23117528350002DA3A4 /* NptXbmcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4E91BB70E7F7338001F0546 /* NptXbmcFile.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; DFF0F23217528350002DA3A4 /* NSFFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E173C0D25F9FA00618676 /* NSFFileDirectory.cpp */; }; DFF0F23317528350002DA3A4 /* OGGFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E173E0D25F9FA00618676 /* OGGFileDirectory.cpp */; }; DFF0F23417528350002DA3A4 /* PipeFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D67F1444A8B0007C6459 /* PipeFile.cpp */; }; @@ -1076,7 +1092,7 @@ DFF0F25317528350002DA3A4 /* udf25.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 433219D312E4C6A500CD7486 /* udf25.cpp */; }; DFF0F25417528350002DA3A4 /* UDFDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 433219D512E4C6A500CD7486 /* UDFDirectory.cpp */; }; DFF0F25517528350002DA3A4 /* UDFFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6931444A8B0007C6459 /* UDFFile.cpp */; }; - DFF0F25617528350002DA3A4 /* UPnPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E175B0D25F9FA00618676 /* UPnPDirectory.cpp */; }; + DFF0F25617528350002DA3A4 /* UPnPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E175B0D25F9FA00618676 /* UPnPDirectory.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; DFF0F25717528350002DA3A4 /* UPnPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6951444A8B0007C6459 /* UPnPFile.cpp */; }; DFF0F25817528350002DA3A4 /* DirectoryNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17600D25F9FA00618676 /* DirectoryNode.cpp */; }; DFF0F25917528350002DA3A4 /* DirectoryNodeEpisodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17660D25F9FA00618676 /* DirectoryNodeEpisodes.cpp */; }; @@ -1286,11 +1302,11 @@ DFF0F32817528350002DA3A4 /* NetworkLinux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 432D7CE312D86DA500CE4C49 /* NetworkLinux.cpp */; }; DFF0F32917528350002DA3A4 /* ZeroconfBrowserOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49ACD9D10074A4000A86ECD /* ZeroconfBrowserOSX.cpp */; }; DFF0F32A17528350002DA3A4 /* ZeroconfOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E46F7C2C0F77219700C25D29 /* ZeroconfOSX.cpp */; }; - DFF0F32B17528350002DA3A4 /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; }; - DFF0F32C17528350002DA3A4 /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; }; - DFF0F32D17528350002DA3A4 /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; }; - DFF0F32E17528350002DA3A4 /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; }; - DFF0F32F17528350002DA3A4 /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; }; + DFF0F32B17528350002DA3A4 /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + DFF0F32C17528350002DA3A4 /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + DFF0F32D17528350002DA3A4 /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + DFF0F32E17528350002DA3A4 /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + DFF0F32F17528350002DA3A4 /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; DFF0F33017528350002DA3A4 /* UPnPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F563529416E53FAB00D21BAD /* UPnPSettings.cpp */; }; DFF0F33117528350002DA3A4 /* WebSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772B151BAF4C00B5B63B /* WebSocket.cpp */; }; DFF0F33217528350002DA3A4 /* WebSocketManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772D151BAF4C00B5B63B /* WebSocketManager.cpp */; }; @@ -1392,7 +1408,6 @@ DFF0F39217528350002DA3A4 /* RenderSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C779E1F104A57E500F444C4 /* RenderSystem.cpp */; }; DFF0F39317528350002DA3A4 /* GUIControlSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFADD172D9C5100A43CF7 /* GUIControlSettings.cpp */; }; DFF0F39417528350002DA3A4 /* GUIDialogContentSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */; }; - DFF0F39517528350002DA3A4 /* GUIDialogSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A816E5402100D21BAD /* GUIDialogSettings.cpp */; }; DFF0F39617528350002DA3A4 /* GUIWindowSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B016E5403400D21BAD /* GUIWindowSettings.cpp */; }; DFF0F39717528350002DA3A4 /* GUIWindowSettingsCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B216E5403400D21BAD /* GUIWindowSettingsCategory.cpp */; }; DFF0F39817528350002DA3A4 /* GUIWindowSettingsScreenCalibration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B616E5403400D21BAD /* GUIWindowSettingsScreenCalibration.cpp */; }; @@ -1794,7 +1809,7 @@ E38E20570D25F9FD00618676 /* SIDFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17510D25F9FA00618676 /* SIDFileDirectory.cpp */; }; E38E20580D25F9FD00618676 /* SmartPlaylistDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17530D25F9FA00618676 /* SmartPlaylistDirectory.cpp */; }; E38E205B0D25F9FD00618676 /* StackDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17590D25F9FA00618676 /* StackDirectory.cpp */; }; - E38E205C0D25F9FD00618676 /* UPnPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E175B0D25F9FA00618676 /* UPnPDirectory.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E205C0D25F9FD00618676 /* UPnPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E175B0D25F9FA00618676 /* UPnPDirectory.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; E38E205E0D25F9FD00618676 /* DirectoryNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17600D25F9FA00618676 /* DirectoryNode.cpp */; }; E38E20610D25F9FD00618676 /* DirectoryNodeEpisodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17660D25F9FA00618676 /* DirectoryNodeEpisodes.cpp */; }; E38E20630D25F9FD00618676 /* DirectoryNodeMoviesOverview.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E176A0D25F9FA00618676 /* DirectoryNodeMoviesOverview.cpp */; }; @@ -1873,36 +1888,36 @@ E38E20D10D25F9FD00618676 /* GUIWindowWeather.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18490D25F9FA00618676 /* GUIWindowWeather.cpp */; }; E38E20D60D25F9FD00618676 /* LangCodeExpander.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18560D25F9FA00618676 /* LangCodeExpander.cpp */; }; E38E20D70D25F9FD00618676 /* LangInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E18580D25F9FA00618676 /* LangInfo.cpp */; }; - E38E21740D25F9FD00618676 /* MediaCrawler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ABD0D25F9FB00618676 /* MediaCrawler.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21760D25F9FD00618676 /* PltMicroMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AC20D25F9FB00618676 /* PltMicroMediaController.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21780D25F9FD00618676 /* PltAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AC70D25F9FB00618676 /* PltAction.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21790D25F9FD00618676 /* PltArgument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AC90D25F9FB00618676 /* PltArgument.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E217A0D25F9FD00618676 /* PltCtrlPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ACB0D25F9FB00618676 /* PltCtrlPoint.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E217B0D25F9FD00618676 /* PltCtrlPointTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ACD0D25F9FB00618676 /* PltCtrlPointTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E217C0D25F9FD00618676 /* PltDatagramStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ACF0D25F9FB00618676 /* PltDatagramStream.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E217D0D25F9FD00618676 /* PltDeviceData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD10D25F9FB00618676 /* PltDeviceData.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E217E0D25F9FD00618676 /* PltDeviceHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD30D25F9FB00618676 /* PltDeviceHost.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21800D25F9FD00618676 /* PltEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD70D25F9FB00618676 /* PltEvent.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21810D25F9FD00618676 /* PltHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD90D25F9FB00618676 /* PltHttp.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21820D25F9FD00618676 /* PltHttpClientTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ADB0D25F9FB00618676 /* PltHttpClientTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21830D25F9FD00618676 /* PltHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ADD0D25F9FB00618676 /* PltHttpServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21840D25F9FD00618676 /* PltHttpServerTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AE00D25F9FB00618676 /* PltHttpServerTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21890D25F9FD00618676 /* PltService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AEA0D25F9FB00618676 /* PltService.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E218A0D25F9FD00618676 /* PltSsdp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AEC0D25F9FB00618676 /* PltSsdp.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E218B0D25F9FD00618676 /* PltStateVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AEF0D25F9FB00618676 /* PltStateVariable.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E218D0D25F9FD00618676 /* PltTaskManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AF30D25F9FB00618676 /* PltTaskManager.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E218E0D25F9FD00618676 /* PltThreadTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AF50D25F9FB00618676 /* PltThreadTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E218F0D25F9FD00618676 /* PltUPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AF70D25F9FB00618676 /* PltUPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21900D25F9FD00618676 /* PltMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B000D25F9FB00618676 /* PltMediaController.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21910D25F9FD00618676 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B030D25F9FB00618676 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21930D25F9FD00618676 /* PltDidl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B0B0D25F9FB00618676 /* PltDidl.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21940D25F9FD00618676 /* PltFileMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B0D0D25F9FB00618676 /* PltFileMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21950D25F9FD00618676 /* PltMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B0F0D25F9FB00618676 /* PltMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21740D25F9FD00618676 /* MediaCrawler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ABD0D25F9FB00618676 /* MediaCrawler.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21760D25F9FD00618676 /* PltMicroMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AC20D25F9FB00618676 /* PltMicroMediaController.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21780D25F9FD00618676 /* PltAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AC70D25F9FB00618676 /* PltAction.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21790D25F9FD00618676 /* PltArgument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AC90D25F9FB00618676 /* PltArgument.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E217A0D25F9FD00618676 /* PltCtrlPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ACB0D25F9FB00618676 /* PltCtrlPoint.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E217B0D25F9FD00618676 /* PltCtrlPointTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ACD0D25F9FB00618676 /* PltCtrlPointTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E217C0D25F9FD00618676 /* PltDatagramStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ACF0D25F9FB00618676 /* PltDatagramStream.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E217D0D25F9FD00618676 /* PltDeviceData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD10D25F9FB00618676 /* PltDeviceData.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E217E0D25F9FD00618676 /* PltDeviceHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD30D25F9FB00618676 /* PltDeviceHost.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21800D25F9FD00618676 /* PltEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD70D25F9FB00618676 /* PltEvent.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21810D25F9FD00618676 /* PltHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AD90D25F9FB00618676 /* PltHttp.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21820D25F9FD00618676 /* PltHttpClientTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ADB0D25F9FB00618676 /* PltHttpClientTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21830D25F9FD00618676 /* PltHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1ADD0D25F9FB00618676 /* PltHttpServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21840D25F9FD00618676 /* PltHttpServerTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AE00D25F9FB00618676 /* PltHttpServerTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21890D25F9FD00618676 /* PltService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AEA0D25F9FB00618676 /* PltService.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E218A0D25F9FD00618676 /* PltSsdp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AEC0D25F9FB00618676 /* PltSsdp.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E218B0D25F9FD00618676 /* PltStateVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AEF0D25F9FB00618676 /* PltStateVariable.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E218D0D25F9FD00618676 /* PltTaskManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AF30D25F9FB00618676 /* PltTaskManager.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E218E0D25F9FD00618676 /* PltThreadTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AF50D25F9FB00618676 /* PltThreadTask.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E218F0D25F9FD00618676 /* PltUPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1AF70D25F9FB00618676 /* PltUPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21900D25F9FD00618676 /* PltMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B000D25F9FB00618676 /* PltMediaController.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21910D25F9FD00618676 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B030D25F9FB00618676 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21930D25F9FD00618676 /* PltDidl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B0B0D25F9FB00618676 /* PltDidl.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21940D25F9FD00618676 /* PltFileMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B0D0D25F9FB00618676 /* PltFileMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21950D25F9FD00618676 /* PltMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B0F0D25F9FB00618676 /* PltMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; E38E21960D25F9FD00618676 /* PltMediaCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B120D25F9FB00618676 /* PltMediaCache.cpp */; }; - E38E21970D25F9FD00618676 /* PltMediaItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B140D25F9FB00618676 /* PltMediaItem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E21990D25F9FD00618676 /* PltMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B180D25F9FB00618676 /* PltMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E219B0D25F9FD00618676 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B1B0D25F9FB00618676 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - E38E219F0D25F9FD00618676 /* PltLightSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B250D25F9FB00618676 /* PltLightSample.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21970D25F9FD00618676 /* PltMediaItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B140D25F9FB00618676 /* PltMediaItem.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E21990D25F9FD00618676 /* PltMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B180D25F9FB00618676 /* PltMediaServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E219B0D25F9FD00618676 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B1B0D25F9FB00618676 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E38E219F0D25F9FD00618676 /* PltLightSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1B250D25F9FB00618676 /* PltLightSample.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; E38E222B0D25F9FE00618676 /* dataset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CD70D25F9FC00618676 /* dataset.cpp */; }; E38E22310D25F9FE00618676 /* qry_dat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CDF0D25F9FC00618676 /* qry_dat.cpp */; }; E38E22320D25F9FE00618676 /* sqlitedataset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CE20D25F9FC00618676 /* sqlitedataset.cpp */; }; @@ -2223,7 +2238,6 @@ E49911AD174E5CFE00741B6D /* AERemap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAD15373AE7006B8FF1 /* AERemap.cpp */; }; E49911AE174E5CFE00741B6D /* AEStreamInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FAF15373AE7006B8FF1 /* AEStreamInfo.cpp */; }; E49911AF174E5CFE00741B6D /* AEUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */; }; - E49911B0174E5CFE00741B6D /* AEWAVLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB315373AE7006B8FF1 /* AEWAVLoader.cpp */; }; E49911B1174E5CFE00741B6D /* AEFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65F6515373AE7006B8FF1 /* AEFactory.cpp */; }; E49911B2174E5D0A00741B6D /* EmuFileWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14E30D25F9F900618676 /* EmuFileWrapper.cpp */; }; E49911B3174E5D0A00741B6D /* emu_dummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E14B90D25F9F900618676 /* emu_dummy.cpp */; }; @@ -2449,7 +2463,7 @@ E4991297174E5D9900741B6D /* MythSession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3BBB7980D7EA78A00CAAFD3 /* MythSession.cpp */; }; E4991298174E5D9900741B6D /* NFSDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0DF15913A3ADA7008ED511 /* NFSDirectory.cpp */; }; E4991299174E5D9900741B6D /* NFSFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D67D1444A8B0007C6459 /* NFSFile.cpp */; }; - E499129A174E5D9900741B6D /* NptXbmcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4E91BB70E7F7338001F0546 /* NptXbmcFile.cpp */; }; + E499129A174E5D9900741B6D /* NptXbmcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4E91BB70E7F7338001F0546 /* NptXbmcFile.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; E499129B174E5D9900741B6D /* NSFFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E173C0D25F9FA00618676 /* NSFFileDirectory.cpp */; }; E499129C174E5D9900741B6D /* OGGFileDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E173E0D25F9FA00618676 /* OGGFileDirectory.cpp */; }; E499129D174E5D9900741B6D /* PipeFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D67F1444A8B0007C6459 /* PipeFile.cpp */; }; @@ -2486,7 +2500,7 @@ E49912BC174E5D9900741B6D /* udf25.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 433219D312E4C6A500CD7486 /* udf25.cpp */; }; E49912BD174E5D9900741B6D /* UDFDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 433219D512E4C6A500CD7486 /* UDFDirectory.cpp */; }; E49912BE174E5D9900741B6D /* UDFFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6931444A8B0007C6459 /* UDFFile.cpp */; }; - E49912BF174E5D9900741B6D /* UPnPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E175B0D25F9FA00618676 /* UPnPDirectory.cpp */; }; + E49912BF174E5D9900741B6D /* UPnPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E175B0D25F9FA00618676 /* UPnPDirectory.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; E49912C0174E5D9900741B6D /* UPnPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D6951444A8B0007C6459 /* UPnPFile.cpp */; }; E49912C1174E5DA000741B6D /* DirectoryNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17600D25F9FA00618676 /* DirectoryNode.cpp */; }; E49912C2174E5DA000741B6D /* DirectoryNodeEpisodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17660D25F9FA00618676 /* DirectoryNodeEpisodes.cpp */; }; @@ -2696,11 +2710,11 @@ E49913A9174E5F2100741B6D /* NetworkLinux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 432D7CE312D86DA500CE4C49 /* NetworkLinux.cpp */; }; E49913AA174E5F2100741B6D /* ZeroconfBrowserOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49ACD9D10074A4000A86ECD /* ZeroconfBrowserOSX.cpp */; }; E49913AB174E5F2100741B6D /* ZeroconfOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E46F7C2C0F77219700C25D29 /* ZeroconfOSX.cpp */; }; - E49913AC174E5F3300741B6D /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; }; - E49913AD174E5F3300741B6D /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; }; - E49913AE174E5F3300741B6D /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; }; - E49913AF174E5F3300741B6D /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; }; - E49913B0174E5F3300741B6D /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; }; + E49913AC174E5F3300741B6D /* UPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345D915FA639500A934F6 /* UPnP.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + E49913AD174E5F3300741B6D /* UPnPInternal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DB15FA639500A934F6 /* UPnPInternal.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + E49913AE174E5F3300741B6D /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + E49913AF174E5F3300741B6D /* UPnPRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DD15FA639500A934F6 /* UPnPRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; + E49913B0174E5F3300741B6D /* UPnPServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2345DF15FA639500A934F6 /* UPnPServer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP"; }; }; E49913B1174E5F3300741B6D /* UPnPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F563529416E53FAB00D21BAD /* UPnPSettings.cpp */; }; E49913B2174E5F3700741B6D /* WebSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772B151BAF4C00B5B63B /* WebSocket.cpp */; }; E49913B3174E5F3700741B6D /* WebSocketManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52772D151BAF4C00B5B63B /* WebSocketManager.cpp */; }; @@ -2802,7 +2816,6 @@ E4991416174E602700741B6D /* RenderSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C779E1F104A57E500F444C4 /* RenderSystem.cpp */; }; E4991417174E603C00741B6D /* GUIControlSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFECFADD172D9C5100A43CF7 /* GUIControlSettings.cpp */; }; E4991418174E603C00741B6D /* GUIDialogContentSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */; }; - E4991419174E603C00741B6D /* GUIDialogSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A816E5402100D21BAD /* GUIDialogSettings.cpp */; }; E499141A174E603C00741B6D /* GUIWindowSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B016E5403400D21BAD /* GUIWindowSettings.cpp */; }; E499141B174E603C00741B6D /* GUIWindowSettingsCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B216E5403400D21BAD /* GUIWindowSettingsCategory.cpp */; }; E499141C174E603C00741B6D /* GUIWindowSettingsScreenCalibration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B616E5403400D21BAD /* GUIWindowSettingsScreenCalibration.cpp */; }; @@ -3046,7 +3059,7 @@ E4A249F71095C880003D74C6 /* AutorunMediaJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A249F51095C880003D74C6 /* AutorunMediaJob.cpp */; }; E4DC97540FFE5BA8008E0C07 /* SAPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4DC97500FFE5BA8008E0C07 /* SAPDirectory.cpp */; }; E4DC97550FFE5BA8008E0C07 /* SAPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4DC97520FFE5BA8008E0C07 /* SAPFile.cpp */; }; - E4E91BB80E7F7338001F0546 /* NptXbmcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4E91BB70E7F7338001F0546 /* NptXbmcFile.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + E4E91BB80E7F7338001F0546 /* NptXbmcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4E91BB70E7F7338001F0546 /* NptXbmcFile.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; EC720A8F155091BB00FFD782 /* ilog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC720A8D155091BB00FFD782 /* ilog.cpp */; }; EC720A9D1550927000FFD782 /* XbmcContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC720A9B1550927000FFD782 /* XbmcContext.cpp */; }; F500E35617F3412C004FC217 /* WinEvents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F500E35517F3412C004FC217 /* WinEvents.cpp */; }; @@ -3095,9 +3108,8 @@ F55BA70C17AB2265002A36D1 /* StereoscopicsManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5558ED0E176396CD00118C35 /* StereoscopicsManager.cpp */; }; F55BA71017AB2293002A36D1 /* RenderFlags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55611BA21766672F00754072 /* RenderFlags.cpp */; }; F55BA71117AB2293002A36D1 /* RenderFlags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55611BA21766672F00754072 /* RenderFlags.cpp */; }; - F563529616E53FAB00D21BAD /* UPnPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F563529416E53FAB00D21BAD /* UPnPSettings.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; + F563529616E53FAB00D21BAD /* UPnPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F563529416E53FAB00D21BAD /* UPnPSettings.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; F56352AA16E5402100D21BAD /* GUIDialogContentSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */; }; - F56352AD16E5402100D21BAD /* GUIDialogSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352A816E5402100D21BAD /* GUIDialogSettings.cpp */; }; F56352BB16E5403400D21BAD /* GUIWindowSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B016E5403400D21BAD /* GUIWindowSettings.cpp */; }; F56352BC16E5403400D21BAD /* GUIWindowSettingsCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B216E5403400D21BAD /* GUIWindowSettingsCategory.cpp */; }; F56352BE16E5403400D21BAD /* GUIWindowSettingsScreenCalibration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352B616E5403400D21BAD /* GUIWindowSettingsScreenCalibration.cpp */; }; @@ -3869,6 +3881,18 @@ 7CC30DBF16291C2C003E7579 /* VideoThumbLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoThumbLoader.h; sourceTree = "<group>"; }; 7CC30E8816296078003E7579 /* EdenVideoArtUpdater.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EdenVideoArtUpdater.cpp; sourceTree = "<group>"; }; 7CC30E8916296078003E7579 /* EdenVideoArtUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdenVideoArtUpdater.h; sourceTree = "<group>"; }; + 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIDialogSettingsBase.cpp; path = dialogs/GUIDialogSettingsBase.cpp; sourceTree = "<group>"; }; + 7CC7B6AE1918699000DDB120 /* GUIDialogSettingsBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIDialogSettingsBase.h; path = dialogs/GUIDialogSettingsBase.h; sourceTree = "<group>"; }; + 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIDialogSettingsManagerBase.cpp; path = dialogs/GUIDialogSettingsManagerBase.cpp; sourceTree = "<group>"; }; + 7CC7B6B01918699000DDB120 /* GUIDialogSettingsManagerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIDialogSettingsManagerBase.h; path = dialogs/GUIDialogSettingsManagerBase.h; sourceTree = "<group>"; }; + 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIDialogSettingsManualBase.cpp; path = dialogs/GUIDialogSettingsManualBase.cpp; sourceTree = "<group>"; }; + 7CC7B6B21918699000DDB120 /* GUIDialogSettingsManualBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIDialogSettingsManualBase.h; path = dialogs/GUIDialogSettingsManualBase.h; sourceTree = "<group>"; }; + 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SettingCreator.cpp; sourceTree = "<group>"; }; + 7CC7B6BD191869EA00DDB120 /* SettingCreator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingCreator.h; sourceTree = "<group>"; }; + 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SettingUtils.cpp; sourceTree = "<group>"; }; + 7CC7B6BF191869EA00DDB120 /* SettingUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingUtils.h; sourceTree = "<group>"; }; + 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SettingConditions.cpp; sourceTree = "<group>"; }; + 7CC7B6C719186A8800DDB120 /* SettingConditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingConditions.h; sourceTree = "<group>"; }; 7CC82C9118284F9F0010DF30 /* CharsetDetection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CharsetDetection.cpp; sourceTree = "<group>"; }; 7CC82C9218284F9F0010DF30 /* CharsetDetection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharsetDetection.h; sourceTree = "<group>"; }; 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Builtins.cpp; sourceTree = "<group>"; }; @@ -4325,8 +4349,6 @@ DFB65FB015373AE7006B8FF1 /* AEStreamInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AEStreamInfo.h; sourceTree = "<group>"; }; DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AEUtil.cpp; sourceTree = "<group>"; }; DFB65FB215373AE7006B8FF1 /* AEUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AEUtil.h; sourceTree = "<group>"; }; - DFB65FB315373AE7006B8FF1 /* AEWAVLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AEWAVLoader.cpp; sourceTree = "<group>"; }; - DFB65FB415373AE7006B8FF1 /* AEWAVLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AEWAVLoader.h; sourceTree = "<group>"; }; DFB6610615374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDAudioCodecPassthrough.cpp; sourceTree = "<group>"; }; DFB6610715374E80006B8FF1 /* DVDAudioCodecPassthrough.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDAudioCodecPassthrough.h; sourceTree = "<group>"; }; DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddonCallbacksCodec.cpp; sourceTree = "<group>"; }; @@ -5479,8 +5501,6 @@ F563529516E53FAB00D21BAD /* UPnPSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPnPSettings.h; sourceTree = "<group>"; }; F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIDialogContentSettings.cpp; path = dialogs/GUIDialogContentSettings.cpp; sourceTree = "<group>"; }; F56352A316E5402100D21BAD /* GUIDialogContentSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIDialogContentSettings.h; path = dialogs/GUIDialogContentSettings.h; sourceTree = "<group>"; }; - F56352A816E5402100D21BAD /* GUIDialogSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIDialogSettings.cpp; path = dialogs/GUIDialogSettings.cpp; sourceTree = "<group>"; }; - F56352A916E5402100D21BAD /* GUIDialogSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIDialogSettings.h; path = dialogs/GUIDialogSettings.h; sourceTree = "<group>"; }; F56352B016E5403400D21BAD /* GUIWindowSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIWindowSettings.cpp; path = windows/GUIWindowSettings.cpp; sourceTree = "<group>"; }; F56352B116E5403400D21BAD /* GUIWindowSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIWindowSettings.h; path = windows/GUIWindowSettings.h; sourceTree = "<group>"; }; F56352B216E5403400D21BAD /* GUIWindowSettingsCategory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIWindowSettingsCategory.cpp; path = windows/GUIWindowSettingsCategory.cpp; sourceTree = "<group>"; }; @@ -7280,8 +7300,6 @@ DFB65FB015373AE7006B8FF1 /* AEStreamInfo.h */, DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */, DFB65FB215373AE7006B8FF1 /* AEUtil.h */, - DFB65FB315373AE7006B8FF1 /* AEWAVLoader.cpp */, - DFB65FB415373AE7006B8FF1 /* AEWAVLoader.h */, ); path = Utils; sourceTree = "<group>"; @@ -8811,10 +8829,16 @@ DF8990191709BB2D00B35C21 /* MediaSourceSettings.h */, DFECFAF4172D9CAB00A43CF7 /* SettingAddon.cpp */, DFECFAF5172D9CAB00A43CF7 /* SettingAddon.h */, + 7CC7B6C619186A8800DDB120 /* SettingConditions.cpp */, + 7CC7B6C719186A8800DDB120 /* SettingConditions.h */, DFECFAFA172D9CAB00A43CF7 /* SettingControl.cpp */, DFECFAFB172D9CAB00A43CF7 /* SettingControl.h */, + 7CC7B6BC191869EA00DDB120 /* SettingCreator.cpp */, + 7CC7B6BD191869EA00DDB120 /* SettingCreator.h */, DFECFAFE172D9CAB00A43CF7 /* SettingPath.cpp */, DFECFAFF172D9CAB00A43CF7 /* SettingPath.h */, + 7CC7B6BE191869EA00DDB120 /* SettingUtils.cpp */, + 7CC7B6BF191869EA00DDB120 /* SettingUtils.h */, 18B7C38E129420E5009E7A26 /* Settings.cpp */, 18B7C38F129420E5009E7A26 /* Settings.h */, DF89901A1709BB2D00B35C21 /* SkinSettings.cpp */, @@ -9227,8 +9251,12 @@ DFECFADE172D9C5100A43CF7 /* GUIControlSettings.h */, F56352A216E5402100D21BAD /* GUIDialogContentSettings.cpp */, F56352A316E5402100D21BAD /* GUIDialogContentSettings.h */, - F56352A816E5402100D21BAD /* GUIDialogSettings.cpp */, - F56352A916E5402100D21BAD /* GUIDialogSettings.h */, + 7CC7B6AD1918699000DDB120 /* GUIDialogSettingsBase.cpp */, + 7CC7B6AE1918699000DDB120 /* GUIDialogSettingsBase.h */, + 7CC7B6AF1918699000DDB120 /* GUIDialogSettingsManagerBase.cpp */, + 7CC7B6B01918699000DDB120 /* GUIDialogSettingsManagerBase.h */, + 7CC7B6B11918699000DDB120 /* GUIDialogSettingsManualBase.cpp */, + 7CC7B6B21918699000DDB120 /* GUIDialogSettingsManualBase.h */, ); name = dialogs; sourceTree = "<group>"; @@ -10689,7 +10717,6 @@ DFB65FD115373AE7006B8FF1 /* AERemap.cpp in Sources */, DFB65FD215373AE7006B8FF1 /* AEStreamInfo.cpp in Sources */, DFB65FD315373AE7006B8FF1 /* AEUtil.cpp in Sources */, - DFB65FD415373AE7006B8FF1 /* AEWAVLoader.cpp in Sources */, DFB6610915374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp in Sources */, 7C0B98A4154B79C30065A238 /* AEDeviceInfo.cpp in Sources */, 7C6EB330155BD1D40080368A /* ImageFile.cpp in Sources */, @@ -10835,7 +10862,6 @@ 1DAFDB7C16DFDCA7007F8C68 /* PeripheralBusCEC.cpp in Sources */, F563529616E53FAB00D21BAD /* UPnPSettings.cpp in Sources */, F56352AA16E5402100D21BAD /* GUIDialogContentSettings.cpp in Sources */, - F56352AD16E5402100D21BAD /* GUIDialogSettings.cpp in Sources */, F56352BB16E5403400D21BAD /* GUIWindowSettings.cpp in Sources */, F56352BC16E5403400D21BAD /* GUIWindowSettingsCategory.cpp in Sources */, F56352BE16E5403400D21BAD /* GUIWindowSettingsScreenCalibration.cpp in Sources */, @@ -10926,6 +10952,12 @@ 7C8AE854189DE47F00C33786 /* CoreAudioHelpers.cpp in Sources */, 7CF0504B190A1D7200222135 /* FFmpeg.cpp in Sources */, 7CF05056191195DA00222135 /* MediaType.cpp in Sources */, + 7CC7B6B31918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */, + 7CC7B6B61918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */, + 7CC7B6B91918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */, + 7CC7B6C0191869EA00DDB120 /* SettingCreator.cpp in Sources */, + 7CC7B6C3191869EA00DDB120 /* SettingUtils.cpp in Sources */, + 7CC7B6C819186A8800DDB120 /* SettingConditions.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -11102,7 +11134,6 @@ DFF0F14517528350002DA3A4 /* AERemap.cpp in Sources */, DFF0F14617528350002DA3A4 /* AEStreamInfo.cpp in Sources */, DFF0F14717528350002DA3A4 /* AEUtil.cpp in Sources */, - DFF0F14817528350002DA3A4 /* AEWAVLoader.cpp in Sources */, DFF0F14917528350002DA3A4 /* AEFactory.cpp in Sources */, DFF0F14A17528350002DA3A4 /* EmuFileWrapper.cpp in Sources */, DFF0F14B17528350002DA3A4 /* emu_dummy.cpp in Sources */, @@ -11682,7 +11713,6 @@ DFF0F39217528350002DA3A4 /* RenderSystem.cpp in Sources */, DFF0F39317528350002DA3A4 /* GUIControlSettings.cpp in Sources */, DFF0F39417528350002DA3A4 /* GUIDialogContentSettings.cpp in Sources */, - DFF0F39517528350002DA3A4 /* GUIDialogSettings.cpp in Sources */, DFF0F39617528350002DA3A4 /* GUIWindowSettings.cpp in Sources */, DFF0F39717528350002DA3A4 /* GUIWindowSettingsCategory.cpp in Sources */, DFF0F39817528350002DA3A4 /* GUIWindowSettingsScreenCalibration.cpp in Sources */, @@ -11974,6 +12004,12 @@ DF374B2518AC2BA20076B514 /* CoreAudioHelpers.cpp in Sources */, 7CF0504D190A1D7200222135 /* FFmpeg.cpp in Sources */, 7CF05058191195DA00222135 /* MediaType.cpp in Sources */, + 7CC7B6B51918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */, + 7CC7B6B81918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */, + 7CC7B6BB1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */, + 7CC7B6C2191869EA00DDB120 /* SettingCreator.cpp in Sources */, + 7CC7B6C5191869EA00DDB120 /* SettingUtils.cpp in Sources */, + 7CC7B6CA19186A8800DDB120 /* SettingConditions.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -12157,7 +12193,6 @@ E49911AD174E5CFE00741B6D /* AERemap.cpp in Sources */, E49911AE174E5CFE00741B6D /* AEStreamInfo.cpp in Sources */, E49911AF174E5CFE00741B6D /* AEUtil.cpp in Sources */, - E49911B0174E5CFE00741B6D /* AEWAVLoader.cpp in Sources */, E49911B1174E5CFE00741B6D /* AEFactory.cpp in Sources */, E49911B2174E5D0A00741B6D /* EmuFileWrapper.cpp in Sources */, E49911B3174E5D0A00741B6D /* emu_dummy.cpp in Sources */, @@ -12737,7 +12772,6 @@ E4991416174E602700741B6D /* RenderSystem.cpp in Sources */, E4991417174E603C00741B6D /* GUIControlSettings.cpp in Sources */, E4991418174E603C00741B6D /* GUIDialogContentSettings.cpp in Sources */, - E4991419174E603C00741B6D /* GUIDialogSettings.cpp in Sources */, E499141A174E603C00741B6D /* GUIWindowSettings.cpp in Sources */, E499141B174E603C00741B6D /* GUIWindowSettingsCategory.cpp in Sources */, E499141C174E603C00741B6D /* GUIWindowSettingsScreenCalibration.cpp in Sources */, @@ -13024,6 +13058,12 @@ DF374B2418AC2BA20076B514 /* CoreAudioHelpers.cpp in Sources */, 7CF0504C190A1D7200222135 /* FFmpeg.cpp in Sources */, 7CF05057191195DA00222135 /* MediaType.cpp in Sources */, + 7CC7B6B41918699000DDB120 /* GUIDialogSettingsBase.cpp in Sources */, + 7CC7B6B71918699000DDB120 /* GUIDialogSettingsManagerBase.cpp in Sources */, + 7CC7B6BA1918699000DDB120 /* GUIDialogSettingsManualBase.cpp in Sources */, + 7CC7B6C1191869EA00DDB120 /* SettingCreator.cpp in Sources */, + 7CC7B6C4191869EA00DDB120 /* SettingUtils.cpp in Sources */, + 7CC7B6C919186A8800DDB120 /* SettingConditions.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -13149,7 +13189,6 @@ "-lfreetype", "-lfontconfig", "-lsqlite3", - "-lsamplerate", "-ltinyxml", "-lmicrohttpd", "-lyajl", @@ -13276,7 +13315,6 @@ "-lfreetype", "-lfontconfig", "-lsqlite3", - "-lsamplerate", "-ltinyxml", "-lmicrohttpd", "-lyajl", @@ -13432,7 +13470,6 @@ "-lfreetype", "-lfontconfig", "-lsqlite3", - "-lsamplerate", "-ltinyxml", "-lmicrohttpd", "-lsmbclient", @@ -13538,7 +13575,6 @@ "-lfreetype", "-lfontconfig", "-lsqlite3", - "-lsamplerate", "-ltinyxml", "-lmicrohttpd", "-lsmbclient", diff --git a/addons/skin.confluence/720p/DialogContentSettings.xml b/addons/skin.confluence/720p/DialogContentSettings.xml index 80ba38228b..dd6f0eb49c 100644 --- a/addons/skin.confluence/720p/DialogContentSettings.xml +++ b/addons/skin.confluence/720p/DialogContentSettings.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <window> - <defaultcontrol always="true">3</defaultcontrol> + <defaultcontrol always="true">20</defaultcontrol> <coordinates> <system>1</system> <left>240</left> @@ -69,7 +69,7 @@ <textcolor>blue</textcolor> <shadowcolor>black</shadowcolor> </control> - <control type="spincontrolex" id="3"> + <control type="spincontrolex" id="20"> <description>Content Picker</description> <left>30</left> <top>100</top> @@ -83,7 +83,7 @@ <onup>28</onup> <ondown>5</ondown> <onleft>60</onleft> - <onright>4</onright> + <onright>21</onright> </control> <control type="label"> <description>Content Picker label</description> @@ -92,7 +92,7 @@ <width>280</width> <height>40</height> <font>font13_title</font> - <label>$INFO[Control.GetLabel(3)]</label> + <label>$INFO[Control.GetLabel(20)]</label> <align>left</align> <aligny>center</aligny> <textcolor>white</textcolor> @@ -154,15 +154,15 @@ <textcolor>blue</textcolor> <shadowcolor>black</shadowcolor> </control> - <control type="list" id="4"> + <control type="list" id="21"> <left>400</left> <top>100</top> <width>360</width> <height>241</height> - <onup>4</onup> - <onleft>3</onleft> + <onup>21</onup> + <onleft>20</onleft> <onright>60</onright> - <ondown>4</ondown> + <ondown>21</ondown> <pagecontrol>60</pagecontrol> <scrolltime>200</scrolltime> <itemlayout height="45"> @@ -199,7 +199,7 @@ <top>0</top> <width>360</width> <height>40</height> - <visible>!Control.HasFocus(4)</visible> + <visible>!Control.HasFocus(21)</visible> <texture border="5">button-nofocus.png</texture> </control> <control type="image"> @@ -207,7 +207,7 @@ <top>0</top> <width>360</width> <height>40</height> - <visible>Control.HasFocus(4)</visible> + <visible>Control.HasFocus(21)</visible> <texture border="5">button-focus2.png</texture> </control> <control type="image"> @@ -241,8 +241,8 @@ <texturesliderbarfocus border="0,14,0,14">ScrollBarV_bar_focus.png</texturesliderbarfocus> <textureslidernib>ScrollBarNib.png</textureslidernib> <textureslidernibfocus>ScrollBarNib.png</textureslidernibfocus> - <onleft>4</onleft> - <onright>3</onright> + <onleft>21</onleft> + <onright>20</onright> <showonepage>true</showonepage> <orientation>vertical</orientation> </control> @@ -266,7 +266,7 @@ <width>740</width> <height>220</height> <itemgap>4</itemgap> - <onup>3</onup> + <onup>20</onup> <ondown>28</ondown> <onleft>5</onleft> <onright>5</onright> @@ -299,10 +299,10 @@ <aligny>center</aligny> <font>font12_title</font> <label>186</label> - <onleft>6</onleft> + <onleft>22</onleft> <onright>29</onright> - <onup>30</onup> - <ondown>3</ondown> + <onup>5</onup> + <ondown>20</ondown> </control> <control type="button" id="29"> <description>Cancel Button</description> @@ -315,11 +315,11 @@ <font>font12_title</font> <label>222</label> <onleft>28</onleft> - <onright>6</onright> - <onup>30</onup> - <ondown>3</ondown> + <onright>22</onright> + <onup>5</onup> + <ondown>20</ondown> </control> - <control type="button" id="6"> + <control type="button" id="22"> <description>Settings Button</description> <left>90</left> <top>0</top> @@ -331,8 +331,8 @@ <label>5</label> <onleft>29</onleft> <onright>28</onright> - <onup>30</onup> - <ondown>3</ondown> + <onup>5</onup> + <ondown>20</ondown> </control> </control> </control> diff --git a/addons/skin.confluence/720p/DialogMediaFilter.xml b/addons/skin.confluence/720p/DialogMediaFilter.xml index 82dda0152a..569f61b7c4 100644 --- a/addons/skin.confluence/720p/DialogMediaFilter.xml +++ b/addons/skin.confluence/720p/DialogMediaFilter.xml @@ -92,6 +92,7 @@ <font>font13</font> <textcolor>grey2</textcolor> <focusedcolor>white</focusedcolor> + <invalidcolor>invalid</invalidcolor> <texturenofocus border="5">button-nofocus.png</texturenofocus> <texturefocus border="5">button-focus2.png</texturefocus> </control> @@ -119,7 +120,7 @@ <aligny>center</aligny> <reverse>yes</reverse> </control> - <control type="sliderex" id="10"> + <control type="sliderex" id="13"> <description>Default Slider</description> <left>0</left> <top>0</top> diff --git a/addons/skin.confluence/720p/DialogPVRTimerSettings.xml b/addons/skin.confluence/720p/DialogPVRTimerSettings.xml index cb55e08d4d..ff9d181f68 100644 --- a/addons/skin.confluence/720p/DialogPVRTimerSettings.xml +++ b/addons/skin.confluence/720p/DialogPVRTimerSettings.xml @@ -129,7 +129,7 @@ <aligny>center</aligny> <reverse>yes</reverse> </control> - <control type="sliderex" id="10"> + <control type="sliderex" id="13"> <description>Default Slider</description> <height>40</height> <texturefocus border="5">button-focus2.png</texturefocus> diff --git a/addons/skin.confluence/720p/DialogPeripheralSettings.xml b/addons/skin.confluence/720p/DialogPeripheralSettings.xml index 578c72e0a3..5984de6e07 100644 --- a/addons/skin.confluence/720p/DialogPeripheralSettings.xml +++ b/addons/skin.confluence/720p/DialogPeripheralSettings.xml @@ -54,15 +54,6 @@ <ondown>5</ondown> <visible>system.getbool(input.enablemouse)</visible> </control> - <control type="label" id="3"> - <description>No Settings Label</description> - <left>20</left> - <top>180</top> - <width>640</width> - <align>center</align> - <label>35004</label> - <font>font13</font> - </control> <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> @@ -127,7 +118,7 @@ <aligny>center</aligny> <reverse>yes</reverse> </control> - <control type="sliderex" id="10"> + <control type="sliderex" id="13"> <description>Default Slider</description> <height>40</height> <texturenofocus border="5">button-nofocus.png</texturenofocus> diff --git a/addons/skin.confluence/720p/LockSettings.xml b/addons/skin.confluence/720p/LockSettings.xml index ffc95cbc51..b857fb076e 100644 --- a/addons/skin.confluence/720p/LockSettings.xml +++ b/addons/skin.confluence/720p/LockSettings.xml @@ -24,7 +24,7 @@ <height>40</height> <texture>dialogheader.png</texture> </control> - <control type="label"> + <control type="label" id="2"> <description>header label</description> <left>40</left> <top>20</top> @@ -61,9 +61,8 @@ <width>640</width> <height>410</height> <itemgap>5</itemgap> - <pagecontrol>60</pagecontrol> <onleft>28</onleft> - <onright>60</onright> + <onright>29</onright> <onup>28</onup> <ondown>28</ondown> </control> diff --git a/addons/skin.confluence/720p/ProfileSettings.xml b/addons/skin.confluence/720p/ProfileSettings.xml index 76643d2d35..17aba87c75 100644 --- a/addons/skin.confluence/720p/ProfileSettings.xml +++ b/addons/skin.confluence/720p/ProfileSettings.xml @@ -24,14 +24,14 @@ <height>40</height> <texture>dialogheader.png</texture> </control> - <control type="label"> + <control type="label" id="2"> <description>header label</description> <left>40</left> <top>20</top> <width>620</width> <height>30</height> <font>font13_title</font> - <label>$INFO[Window.Property(heading)]</label> + <label>-</label> <align>center</align> <aligny>center</aligny> <textcolor>selected</textcolor> @@ -54,7 +54,7 @@ <ondown>1</ondown> <visible>system.getbool(input.enablemouse)</visible> </control> - <control type="image" id="2"> + <control type="image" id="101"> <description>profile image</description> <left>30</left> <top>70</top> @@ -76,7 +76,7 @@ <textcolor>blue</textcolor> <label>$LOCALIZE[20093]</label> </control> - <control type="label" id="1000"> + <control type="label" id="102"> <description>profile name Value</description> <left>200</left> <top>95</top> @@ -95,7 +95,7 @@ <textcolor>blue</textcolor> <label>$LOCALIZE[20070]</label> </control> - <control type="label" id="1001"> + <control type="label" id="103"> <description>profile directory Value</description> <left>200</left> <top>180</top> diff --git a/addons/skin.confluence/720p/SettingsCategory.xml b/addons/skin.confluence/720p/SettingsCategory.xml index 21903c6dec..56ec98bc73 100644 --- a/addons/skin.confluence/720p/SettingsCategory.xml +++ b/addons/skin.confluence/720p/SettingsCategory.xml @@ -238,6 +238,18 @@ <aligny>center</aligny> <reverse>yes</reverse> </control> + <control type="sliderex" id="13"> + <description>Default Slider</description> + <posx>0</posx> + <posy>0</posy> + <height>40</height> + <font>font13</font> + <textcolor>grey2</textcolor> + <focusedcolor>white</focusedcolor> + <texturefocus border="0,2,0,2">MenuItemFO.png</texturefocus> + <texturenofocus border="0,2,0,2">MenuItemNF.png</texturenofocus> + <aligny>center</aligny> + </control> <control type="image" id="11"> <description>separator image</description> <height>2</height> diff --git a/addons/skin.confluence/720p/VideoOSDSettings.xml b/addons/skin.confluence/720p/VideoOSDSettings.xml index 78d31b8bcb..1ccef8ef9e 100644 --- a/addons/skin.confluence/720p/VideoOSDSettings.xml +++ b/addons/skin.confluence/720p/VideoOSDSettings.xml @@ -71,15 +71,6 @@ <ondown>2</ondown> <visible>system.getbool(input.enablemouse)</visible> </control> - <control type="label" id="3"> - <description>No Settings Label</description> - <left>20</left> - <top>180</top> - <width>760</width> - <align>center</align> - <label>13390</label> - <font>font13</font> - </control> <control type="grouplist" id="5"> <description>control area</description> <left>40</left> @@ -111,7 +102,7 @@ <orientation>vertical</orientation> </control> </control> - <control type="sliderex" id="10"> + <control type="sliderex" id="13"> <description>Default Slider</description> <height>40</height> <texturenofocus border="5">button-nofocus.png</texturenofocus> diff --git a/addons/xbmc.gui/addon.xml b/addons/xbmc.gui/addon.xml index f368ffcef0..a3f956bf07 100644 --- a/addons/xbmc.gui/addon.xml +++ b/addons/xbmc.gui/addon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<addon id="xbmc.gui" version="5.0.1" provider-name="Team XBMC"> +<addon id="xbmc.gui" version="5.0.2" provider-name="Team XBMC"> <backwards-compatibility abi="5.0.0"/> <requires> <import addon="xbmc.core" version="0.1.0"/> diff --git a/addons/xbmc.json/addon.xml b/addons/xbmc.json/addon.xml index a3af97a73e..ff510de05c 100644 --- a/addons/xbmc.json/addon.xml +++ b/addons/xbmc.json/addon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<addon id="xbmc.json" version="6.15.0" provider-name="Team XBMC"> +<addon id="xbmc.json" version="6.15.2" provider-name="Team XBMC"> <backwards-compatibility abi="6.0.0"/> <requires> <import addon="xbmc.core" version="0.1.0"/> diff --git a/configure.in b/configure.in index 20caba5afe..f016c70423 100644 --- a/configure.in +++ b/configure.in @@ -1037,7 +1037,6 @@ AC_CHECK_HEADER([mpeg2dec/mpeg2convert.h],, AC_MSG_ERROR($missing_library), AC_INCLUDES_DEFAULT() [#include <mpeg2dec/mpeg2.h>]) AC_CHECK_HEADER([jpeglib.h],, AC_MSG_ERROR($missing_library)) -AC_CHECK_HEADER([samplerate.h],, AC_MSG_ERROR($missing_library)) AC_CHECK_HEADER([ogg/ogg.h],, AC_MSG_ERROR($missing_library)) AC_CHECK_HEADER([vorbis/vorbisfile.h],, AC_MSG_ERROR($missing_library)) AC_CHECK_HEADER([libmodplug/modplug.h],, AC_MSG_ERROR($missing_library)) @@ -1116,9 +1115,6 @@ PKG_CHECK_MODULES([PCRE], [libpcre], [INCLUDES="$INCLUDES $PCRE_CFLAGS"; LIBS="$LIBS $PCRE_LIBS"]; \ AC_DEFINE([HAVE_LIBPCRE],[1],["Define to 1 if libpcre is installed"]), AC_MSG_ERROR($missing_library)) -PKG_CHECK_MODULES([SAMPLERATE], [samplerate], - [INCLUDES="$INCLUDES $SAMPLERATE_CFLAGS"; LIBS="$LIBS $SAMPLERATE_LIBS"], - AC_MSG_ERROR($missing_library)) PKG_CHECK_MODULES([FREETYPE2], [freetype2], [INCLUDES="$INCLUDES $FREETYPE2_CFLAGS"; LIBS="$LIBS $FREETYPE2_LIBS"], AC_MSG_ERROR($missing_library)) diff --git a/docs/README.armel b/docs/README.armel index fdbec70af8..066cc0887d 100644 --- a/docs/README.armel +++ b/docs/README.armel @@ -217,7 +217,7 @@ It is also assumed that you have it setup with either Angstrom or Ubuntu. For Angstrom: # opkg update - # opkg install subversion make g++ gcc gawk pmount libtool automake gperf unzip bison libsdl-1.2-dev libsdl-image-1.2-dev libsdl-gfx-dev libsdl-mixer-1.2-dev libfribidi-dev liblzo-dev libfreetype-dev libsqlite3-dev libasound2 python-sqlite3 libcurl4 libxrandr-dev libxrender-dev libmad-dev libogg-dev libvorbis-dev libmysqlclient-dev libpcre-dev libdbus-glib-1-dev hal-dev libjasper-dev libfontconfig-dev boost-dev libxt-dev libxmu-dev libpng-dev libjpeg-dev libsamplerate0-dev + # opkg install subversion make g++ gcc gawk pmount libtool automake gperf unzip bison libsdl-1.2-dev libsdl-image-1.2-dev libsdl-gfx-dev libsdl-mixer-1.2-dev libfribidi-dev liblzo-dev libfreetype-dev libsqlite3-dev libasound2 python-sqlite3 libcurl4 libxrandr-dev libxrender-dev libmad-dev libogg-dev libvorbis-dev libmysqlclient-dev libpcre-dev libdbus-glib-1-dev hal-dev libjasper-dev libfontconfig-dev boost-dev libxt-dev libxmu-dev libpng-dev libjpeg-dev Unfortunately this will only install the packages that are available through opkg. There will be further packages that need to be installed. Either use the method mentioned below, or selectively find and install packages, mentioned at the bottom of this README. diff --git a/docs/README.linux b/docs/README.linux index 627aeb1fd0..844d3a3bab 100644 --- a/docs/README.linux +++ b/docs/README.linux @@ -48,7 +48,7 @@ Build-Depends: autoconf, automake, autopoint, autotools-dev, cmake, curl, libhal-storage-dev, libiso9660-dev, libjasper-dev, libjpeg-dev, libltdl-dev, liblzo2-dev, libmad0-dev, libmicrohttpd-dev, libmodplug-dev, libmpcdec-dev, libmpeg2-4-dev, libmysqlclient-dev, libnfs-dev, libogg-dev, libpcre3-dev, libplist-dev, libpng12-dev | libpng-dev, libpostproc-dev, - libpulse-dev, librtmp-dev, libsamplerate-dev, libsdl-dev, libsdl-image1.2-dev, libsdl-mixer1.2-dev, + libpulse-dev, librtmp-dev, libsdl-dev, libsdl-image1.2-dev, libsdl-mixer1.2-dev, libshairplay-dev, libsmbclient-dev, libsqlite3-dev, libssh-dev, libssl-dev, libswscale-dev, libtag1-dev (>= 1.8), libtiff-dev, libtinyxml-dev, libtool, libudev-dev, libusb-dev, libva-dev, libvdpau-dev, libvorbis-dev, libxinerama-dev, libxml2-dev, libxmu-dev, libxrandr-dev, libxslt1-dev, diff --git a/docs/README.ubuntu b/docs/README.ubuntu index 1c597d6ba9..fe20abefd2 100644 --- a/docs/README.ubuntu +++ b/docs/README.ubuntu @@ -73,7 +73,7 @@ Here is the magic command to get the build dependencies (used to compile the ver For Ubuntu (all versions >= 7.04): - $ sudo apt-get install automake bison build-essential cmake curl cvs default-jre fp-compiler gawk gdc gettext git-core gperf libasound2-dev libass-dev libboost-dev libboost-thread-dev libbz2-dev libcap-dev libcdio-dev libcurl3 libcurl4-gnutls-dev libdbus-1-dev libenca-dev libflac-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libglew-dev libiso9660-dev libjasper-dev libjpeg-dev liblzo2-dev libmad0-dev libmicrohttpd-dev libmodplug-dev libmpeg2-4-dev libmpeg3-dev libmysqlclient-dev libnfs-dev libogg-dev libogg-dev libpcre3-dev libplist-dev libpng-dev libpulse-dev libsamplerate-dev libsdl-dev libsdl-gfx1.2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsmbclient-dev libsqlite3-dev libssh-dev libssl-dev libtiff-dev libtinyxml-dev libtool libudev-dev libusb-dev libvdpau-dev libvorbisenc2 libxml2-dev libxmu-dev libxrandr-dev libxrender-dev libxslt1-dev libxt-dev libyajl-dev mesa-utils nasm pmount python-dev python-imaging python-sqlite swig unzip yasm zip zlib1g-dev + $ sudo apt-get install automake bison build-essential cmake curl cvs default-jre fp-compiler gawk gdc gettext git-core gperf libasound2-dev libass-dev libboost-dev libboost-thread-dev libbz2-dev libcap-dev libcdio-dev libcurl3 libcurl4-gnutls-dev libdbus-1-dev libenca-dev libflac-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libglew-dev libiso9660-dev libjasper-dev libjpeg-dev liblzo2-dev libmad0-dev libmicrohttpd-dev libmodplug-dev libmpeg2-4-dev libmpeg3-dev libmysqlclient-dev libnfs-dev libogg-dev libogg-dev libpcre3-dev libplist-dev libpng-dev libpulse-dev libsdl-dev libsdl-gfx1.2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsmbclient-dev libsqlite3-dev libssh-dev libssl-dev libtiff-dev libtinyxml-dev libtool libudev-dev libusb-dev libvdpau-dev libvorbisenc2 libxml2-dev libxmu-dev libxrandr-dev libxrender-dev libxslt1-dev libxt-dev libyajl-dev mesa-utils nasm pmount python-dev python-imaging python-sqlite swig unzip yasm zip zlib1g-dev For >= 10.10: $ sudo apt-get install autopoint libltdl-dev diff --git a/language/English/strings.po b/language/English/strings.po index 45eaba3652..0f3946c3df 100755 --- a/language/English/strings.po +++ b/language/English/strings.po @@ -5279,6 +5279,7 @@ msgstr "" #: skin.confluence #: skin.touched #: xbmc\profiles\ProfilesManager.cpp +#: xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp msgctxt "#13200" msgid "Profiles" msgstr "" @@ -6463,6 +6464,7 @@ msgid "%i ms" msgstr "" #: system/settings/settings.xml +#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp msgctxt "#14047" msgid "%i %%" msgstr "" @@ -6494,7 +6496,10 @@ msgctxt "#14053" msgid "GUI filters" msgstr "" -#empty string with id 14054 +#: xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp +msgctxt "#14054" +msgid "%2.1f dB" +msgstr "" msgctxt "#14055" msgid "Use background scanning" @@ -7726,7 +7731,11 @@ msgctxt "#19102" msgid "Please switch to another channel." msgstr "" -#empty string with id 19103 +#. Title of numeric dialog for choosing a channel by entering a number +#: xbmc/pvr/windows/GUIWindowPVRCommon.cpp +msgctxt "#19103" +msgid "Go to channel" +msgstr "" msgctxt "#19104" msgid "Enter the name of the folder for the recording" @@ -11171,11 +11180,18 @@ msgstr "" #. Filter (media data) from string value to string value #: xbmc/dialogs/GUIDialogMediaFilter.cpp +#: xbmc/settings/SettingControl.cpp msgctxt "#21469" msgid "%s to %s" msgstr "" -#empty strings from id 21470 to 21601 +#. Field (e.g. "Genre") [count] +#: xbmc/dialogs/GUIDialogMediaFilter.cpp +msgctxt "#21470" +msgid "%s [%d]" +msgstr "" + +#empty strings from id 21471 to 21601 #: xbmc/Util.cpp msgctxt "#21602" diff --git a/project/BuildDependencies/scripts/libsamplerate_d.bat b/project/BuildDependencies/scripts/libsamplerate_d.bat deleted file mode 100644 index eb40fc8108..0000000000 --- a/project/BuildDependencies/scripts/libsamplerate_d.bat +++ /dev/null @@ -1,14 +0,0 @@ -@ECHO OFF - -SET LOC_PATH=%CD% -SET FILES=%LOC_PATH%\libsamplerate_d.txt - -CALL dlextract.bat libsamplerate %FILES% - -cd %TMP_PATH% - -copy include\samplerate.h "%CUR_PATH%\include" /Y -copy lib\libsamplerate-0.lib "%CUR_PATH%\lib\" /Y -copy bin\libsamplerate-0.dll "%XBMC_PATH%\system\" /Y - -cd %LOC_PATH% diff --git a/project/BuildDependencies/scripts/libsamplerate_d.txt b/project/BuildDependencies/scripts/libsamplerate_d.txt deleted file mode 100644 index 6a0e2d32b1..0000000000 --- a/project/BuildDependencies/scripts/libsamplerate_d.txt +++ /dev/null @@ -1,3 +0,0 @@ -; filename mirror of the file source of the file -libsamplerate-vc100-0.1.7-lib.tar.bz2 http://mirrors.xbmc.org/build-deps/win32/ http://winkde.org/pub/kde/ports/win32/releases/stable/4.5.4/libsamplerate-vc100-0.1.7-lib.tar.bz2 -libsamplerate-vc100-0.1.7-bin.tar.bz2 http://mirrors.xbmc.org/build-deps/win32/ http://winkde.org/pub/kde/ports/win32/releases/stable/4.5.4/libsamplerate-vc100-0.1.7-bin.tar.bz2
\ No newline at end of file diff --git a/project/VS2010Express/XBMC.vcxproj b/project/VS2010Express/XBMC.vcxproj index 2a7b908268..9f6e71d6d7 100644 --- a/project/VS2010Express/XBMC.vcxproj +++ b/project/VS2010Express/XBMC.vcxproj @@ -113,7 +113,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release (OpenGL)|Win32'"> <ClCompile> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions> - <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\ffmpeg;..\..\lib\ffmpeg\include-xbmc-win32;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_GL;__STDC_CONSTANT_MACROS;XMD_H;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> @@ -129,11 +129,12 @@ <AdditionalDependencies>DInput8.lib;DSound.lib;winmm.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;yajl.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)XBMC.exe</OutputFile> <IgnoreSpecificDefaultLibraries>libc;msvcrt;libci;msvcprt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> - <DelayLoadDLLs>dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;avcodec-55.dll;avfilter-4.dll;avformat-55.dll;avutil-52.dll;postproc-52.dll;swresample-0.dll;swscale-2.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <GenerateDebugInformation>true</GenerateDebugInformation> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <RandomizedBaseAddress>true</RandomizedBaseAddress> <DataExecutionPrevention>true</DataExecutionPrevention> + <AdditionalLibraryDirectories>..\..\lib\win32\ffmpeg\.libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <Manifest> <AdditionalManifestFiles>VC90.CRT.x86.manifest;win81.manifest;%(AdditionalManifestFiles)</AdditionalManifestFiles> @@ -142,7 +143,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug (DirectX)|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> @@ -158,7 +159,7 @@ <IgnoreSpecificDefaultLibraries>libc;msvcrt;libcmt;msvcrtd;msvcprtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <ModuleDefinitionFile> </ModuleDefinitionFile> - <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;avcodec-55.dll;avfilter-4.dll;avformat-55.dll;avutil-52.dll;postproc-52.dll;swresample-0.dll;swscale-2.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;avcodec-55.dll;avfilter-4.dll;avformat-55.dll;avutil-52.dll;postproc-52.dll;swresample-0.dll;swscale-2.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <EntryPointSymbol> </EntryPointSymbol> @@ -173,7 +174,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Testsuite|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\ffmpeg;..\..\lib\ffmpeg\include-xbmc-win32;..\..\lib\liblame\include;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\lib\gtest\include;..\..\xbmc\cores\AudioEngine\;..\..\xbmc\cores\AudioEngine\Utils\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;..\..\lib\gtest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>_CONSOLE;NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> @@ -191,13 +192,14 @@ <IgnoreSpecificDefaultLibraries>libc;msvcrt;libcmt;msvcrtd;msvcprtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <ModuleDefinitionFile> </ModuleDefinitionFile> - <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;avcodec-55.dll;avfilter-4.dll;avformat-55.dll;avutil-52.dll;postproc-52.dll;swresample-0.dll;swscale-2.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <SubSystem>Console</SubSystem> <EntryPointSymbol> </EntryPointSymbol> <RandomizedBaseAddress>true</RandomizedBaseAddress> <DataExecutionPrevention>true</DataExecutionPrevention> + <AdditionalLibraryDirectories>..\..\lib\win32\ffmpeg\.libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <Manifest> <AdditionalManifestFiles>VC90.CRT.x86.manifest;win81.manifest;%(AdditionalManifestFiles)</AdditionalManifestFiles> @@ -207,7 +209,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release (DirectX)|Win32'"> <ClCompile> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions> - <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;__STDC_CONSTANT_MACROS;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> @@ -221,7 +223,7 @@ <AdditionalDependencies>D3dx9.lib;DInput8.lib;DSound.lib;winmm.lib;Mpr.lib;Iphlpapi.lib;PowrProf.lib;setupapi.lib;dwmapi.lib;yajl.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)XBMC.exe</OutputFile> <IgnoreSpecificDefaultLibraries>libc;msvcrt;libci;msvcprt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> - <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;avcodec-55.dll;avfilter-4.dll;avformat-55.dll;avutil-52.dll;postproc-52.dll;swresample-0.dll;swscale-2.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;avcodec-55.dll;avfilter-4.dll;avformat-55.dll;avutil-52.dll;postproc-52.dll;swresample-0.dll;swscale-2.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <GenerateDebugInformation>true</GenerateDebugInformation> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <RandomizedBaseAddress>true</RandomizedBaseAddress> @@ -235,7 +237,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug (OpenGL)|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\ffmpeg;..\..\lib\ffmpeg\include-xbmc-win32;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_GL;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> @@ -251,12 +253,13 @@ <IgnoreSpecificDefaultLibraries>libc;msvcrt;libcmt;msvcrtd;msvcprtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <ModuleDefinitionFile> </ModuleDefinitionFile> - <DelayLoadDLLs>dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>libxslt.dll;dnssd.dll;dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;avcodec-55.dll;avfilter-4.dll;avformat-55.dll;avutil-52.dll;postproc-52.dll;swresample-0.dll;swscale-2.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <EntryPointSymbol> </EntryPointSymbol> <RandomizedBaseAddress>true</RandomizedBaseAddress> <DataExecutionPrevention>true</DataExecutionPrevention> + <AdditionalLibraryDirectories>..\..\lib\win32\ffmpeg\.libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <Manifest> <AdditionalManifestFiles>VC90.CRT.x86.manifest;win81.manifest;%(AdditionalManifestFiles)</AdditionalManifestFiles> @@ -265,7 +268,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\ffmpeg;..\..\lib\ffmpeg\include-xbmc-win32;..\..\lib\liblame\include;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> @@ -316,7 +319,6 @@ <ClCompile Include="..\..\xbmc\cores\AudioEngine\Utils\AERemap.cpp" /> <ClCompile Include="..\..\xbmc\cores\AudioEngine\Utils\AEStreamInfo.cpp" /> <ClCompile Include="..\..\xbmc\cores\AudioEngine\Utils\AEUtil.cpp" /> - <ClCompile Include="..\..\xbmc\cores\AudioEngine\Utils\AEWAVLoader.cpp" /> <ClCompile Include="..\..\xbmc\cores\dvdplayer\DVDCodecs\Audio\DVDAudioCodecPassthrough.cpp" /> <ClCompile Include="..\..\xbmc\cores\dvdplayer\DVDCodecs\Video\CrystalHD.cpp" /> <ClCompile Include="..\..\xbmc\cores\dvdplayer\DVDCodecs\Video\DVDVideoCodec.cpp" /> @@ -895,7 +897,9 @@ <ClCompile Include="..\..\xbmc\SectionLoader.cpp" /> <ClCompile Include="..\..\xbmc\settings\AdvancedSettings.cpp" /> <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogContentSettings.cpp" /> - <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettings.cpp" /> + <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsBase.cpp" /> + <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManagerBase.cpp" /> + <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManualBase.cpp" /> <ClCompile Include="..\..\xbmc\settings\DisplaySettings.cpp" /> <ClCompile Include="..\..\xbmc\settings\lib\ISetting.cpp" /> <ClCompile Include="..\..\xbmc\settings\lib\ISettingControl.cpp" /> @@ -910,9 +914,12 @@ <ClCompile Include="..\..\xbmc\settings\MediaSettings.cpp" /> <ClCompile Include="..\..\xbmc\settings\MediaSourceSettings.cpp" /> <ClCompile Include="..\..\xbmc\settings\SettingAddon.cpp" /> + <ClCompile Include="..\..\xbmc\settings\SettingConditions.cpp" /> <ClCompile Include="..\..\xbmc\settings\SettingControl.cpp" /> + <ClCompile Include="..\..\xbmc\settings\SettingCreator.cpp" /> <ClCompile Include="..\..\xbmc\settings\SettingPath.cpp" /> <ClCompile Include="..\..\xbmc\settings\Settings.cpp" /> + <ClCompile Include="..\..\xbmc\settings\SettingUtils.cpp" /> <ClCompile Include="..\..\xbmc\settings\SkinSettings.cpp" /> <ClCompile Include="..\..\xbmc\settings\VideoSettings.cpp" /> <ClCompile Include="..\..\xbmc\settings\windows\GUIControlSettings.cpp" /> @@ -994,7 +1001,6 @@ <ClInclude Include="..\..\xbmc\cores\AudioEngine\Utils\AERemap.h" /> <ClInclude Include="..\..\xbmc\cores\AudioEngine\Utils\AEStreamInfo.h" /> <ClInclude Include="..\..\xbmc\cores\AudioEngine\Utils\AEUtil.h" /> - <ClInclude Include="..\..\xbmc\cores\AudioEngine\Utils\AEWAVLoader.h" /> <ClInclude Include="..\..\xbmc\cores\dvdplayer\DVDCodecs\Audio\DVDAudioCodecPassthrough.h" /> <ClInclude Include="..\..\xbmc\cores\dvdplayer\DVDDemuxers\DVDDemuxBXA.h" /> <ClInclude Include="..\..\xbmc\cores\dvdplayer\DVDDemuxers\DVDDemuxCDDA.h" /> @@ -1028,6 +1034,7 @@ <ClInclude Include="..\..\xbmc\guilib\GUIKeyboardFactory.h" /> <ClInclude Include="..\..\xbmc\guilib\iimage.h" /> <ClInclude Include="..\..\xbmc\guilib\imagefactory.h" /> + <ClInclude Include="..\..\xbmc\guilib\ISliderCallback.h" /> <ClInclude Include="..\..\xbmc\IFileItemListModifier.h" /> <ClInclude Include="..\..\xbmc\input\touch\generic\GenericTouchActionHandler.h" /> <ClInclude Include="..\..\xbmc\input\touch\generic\GenericTouchSwipeDetector.h" /> @@ -1100,7 +1107,9 @@ <ClInclude Include="..\..\xbmc\profiles\ProfilesManager.h" /> <ClInclude Include="..\..\xbmc\profiles\windows\GUIWindowSettingsProfile.h" /> <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogContentSettings.h" /> - <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettings.h" /> + <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsBase.h" /> + <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManagerBase.h" /> + <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManualBase.h" /> <ClInclude Include="..\..\xbmc\settings\DisplaySettings.h" /> <ClInclude Include="..\..\xbmc\settings\lib\ISetting.h" /> <ClInclude Include="..\..\xbmc\settings\lib\ISettingCallback.h" /> @@ -1121,8 +1130,11 @@ <ClInclude Include="..\..\xbmc\settings\MediaSettings.h" /> <ClInclude Include="..\..\xbmc\settings\MediaSourceSettings.h" /> <ClInclude Include="..\..\xbmc\settings\SettingAddon.h" /> + <ClInclude Include="..\..\xbmc\settings\SettingConditions.h" /> <ClInclude Include="..\..\xbmc\settings\SettingControl.h" /> + <ClInclude Include="..\..\xbmc\settings\SettingCreator.h" /> <ClInclude Include="..\..\xbmc\settings\SettingPath.h" /> + <ClInclude Include="..\..\xbmc\settings\SettingUtils.h" /> <ClInclude Include="..\..\xbmc\settings\SkinSettings.h" /> <ClInclude Include="..\..\xbmc\settings\windows\GUIControlSettings.h" /> <ClInclude Include="..\..\xbmc\settings\windows\GUIWindowSettings.h" /> diff --git a/project/VS2010Express/XBMC.vcxproj.filters b/project/VS2010Express/XBMC.vcxproj.filters index 994db7f5d9..43c0c7595f 100644 --- a/project/VS2010Express/XBMC.vcxproj.filters +++ b/project/VS2010Express/XBMC.vcxproj.filters @@ -2355,9 +2355,6 @@ <ClCompile Include="..\..\xbmc\cores\AudioEngine\Utils\AEUtil.cpp"> <Filter>cores\AudioEngine\Utils</Filter> </ClCompile> - <ClCompile Include="..\..\xbmc\cores\AudioEngine\Utils\AEWAVLoader.cpp"> - <Filter>cores\AudioEngine\Utils</Filter> - </ClCompile> <ClCompile Include="..\..\xbmc\cores\AudioEngine\Utils\AEDeviceInfo.cpp"> <Filter>cores\AudioEngine\Utils</Filter> </ClCompile> @@ -2897,9 +2894,6 @@ <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogContentSettings.cpp"> <Filter>settings\dialogs</Filter> </ClCompile> - <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettings.cpp"> - <Filter>settings\dialogs</Filter> - </ClCompile> <ClCompile Include="..\..\xbmc\settings\windows\GUIWindowSettings.cpp"> <Filter>settings\windows</Filter> </ClCompile> @@ -3110,6 +3104,24 @@ <ClCompile Include="..\..\xbmc\media\MediaType.cpp"> <Filter>media</Filter> </ClCompile> + <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsBase.cpp"> + <Filter>settings\dialogs</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManagerBase.cpp"> + <Filter>settings\dialogs</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\settings\SettingCreator.cpp"> + <Filter>settings</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\settings\SettingConditions.cpp"> + <Filter>settings</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManualBase.cpp"> + <Filter>settings\dialogs</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\settings\SettingUtils.cpp"> + <Filter>settings</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\xbmc\win32\pch.h"> @@ -5450,9 +5462,6 @@ <ClInclude Include="..\..\xbmc\cores\AudioEngine\Utils\AEUtil.h"> <Filter>cores\AudioEngine\Utils</Filter> </ClInclude> - <ClInclude Include="..\..\xbmc\cores\AudioEngine\Utils\AEWAVLoader.h"> - <Filter>cores\AudioEngine\Utils</Filter> - </ClInclude> <ClInclude Include="..\..\xbmc\cores\AudioEngine\Utils\AEDeviceInfo.h"> <Filter>cores\AudioEngine\Utils</Filter> </ClInclude> @@ -5841,9 +5850,6 @@ <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogContentSettings.h"> <Filter>settings\dialogs</Filter> </ClInclude> - <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettings.h"> - <Filter>settings\dialogs</Filter> - </ClInclude> <ClInclude Include="..\..\xbmc\settings\windows\GUIWindowSettings.h"> <Filter>settings\windows</Filter> </ClInclude> @@ -6097,6 +6103,27 @@ <ClInclude Include="..\..\xbmc\media\MediaType.h"> <Filter>media</Filter> </ClInclude> + <ClInclude Include="..\..\xbmc\guilib\ISliderCallback.h"> + <Filter>guilib</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsBase.h"> + <Filter>settings\dialogs</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManagerBase.h"> + <Filter>settings\dialogs</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\settings\SettingCreator.h"> + <Filter>settings</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\settings\SettingConditions.h"> + <Filter>settings</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\settings\dialogs\GUIDialogSettingsManualBase.h"> + <Filter>settings\dialogs</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\settings\SettingUtils.h"> + <Filter>settings</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ResourceCompile Include="..\..\xbmc\win32\XBMC_PC.rc"> diff --git a/project/VS2010Express/libPlatinum.vcxproj b/project/VS2010Express/libPlatinum.vcxproj index 77fbbf9546..7f2ef95422 100644 --- a/project/VS2010Express/libPlatinum.vcxproj +++ b/project/VS2010Express/libPlatinum.vcxproj @@ -50,7 +50,7 @@ </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> <PreprocessorDefinitions>_LIB;NPT_CONFIG_ENABLE_LOGGING;_SECURE_SCL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PrecompiledHeader> </PrecompiledHeader> @@ -63,7 +63,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Testsuite|Win32'"> <ClCompile> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;NPT_CONFIG_ENABLE_LOGGING;_SECURE_SCL=0;_HAS_ITERATOR_DEBUGGING=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>true</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -80,7 +80,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> <PreprocessorDefinitions>_LIB;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PrecompiledHeader> </PrecompiledHeader> diff --git a/project/VS2010Express/test-XbmcThreads.vcxproj b/project/VS2010Express/test-XbmcThreads.vcxproj index b52d51d9f8..317d4dc27b 100644 --- a/project/VS2010Express/test-XbmcThreads.vcxproj +++ b/project/VS2010Express/test-XbmcThreads.vcxproj @@ -123,7 +123,7 @@ <OutputFile>$(OutDir)XBMC.exe</OutputFile> <AdditionalLibraryDirectories>..\..\lib\libSDL-WIN32\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <IgnoreSpecificDefaultLibraries>libc;msvcrt;libci;msvcprt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> - <DelayLoadDLLs>dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <GenerateDebugInformation>true</GenerateDebugInformation> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <SubSystem>Windows</SubSystem> @@ -216,7 +216,7 @@ <OutputFile>$(OutDir)XBMC.exe</OutputFile> <AdditionalLibraryDirectories>..\..\lib\libSDL-WIN32\lib;..\..\xbmc\cores\DSPlayer\Libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <IgnoreSpecificDefaultLibraries>libc;msvcrt;libci;msvcprt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> - <DelayLoadDLLs>dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <GenerateDebugInformation>true</GenerateDebugInformation> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <SubSystem>Windows</SubSystem> @@ -260,7 +260,7 @@ <IgnoreSpecificDefaultLibraries>libc;msvcrt;libcmt;msvcrtd;msvcprtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <ModuleDefinitionFile> </ModuleDefinitionFile> - <DelayLoadDLLs>dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;libsamplerate-0.dll;%(DelayLoadDLLs)</DelayLoadDLLs> + <DelayLoadDLLs>dwmapi.dll;libmicrohttpd-5.dll;ssh.dll;sqlite3.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <GenerateDebugInformation>true</GenerateDebugInformation> <ProgramDatabaseFile>$(OutDir)XBMC.pdb</ProgramDatabaseFile> <SubSystem>Windows</SubSystem> @@ -304,4 +304,4 @@ </VisualStudio> </ProjectExtensions> <Import Project="$(SolutionDir)\$(ProjectFileName).targets.user" Condition="Exists('$(SolutionDir)\$(ProjectFileName).targets.user')" /> -</Project>
\ No newline at end of file +</Project> diff --git a/tools/darwin/Configurations/App.xcconfig b/tools/darwin/Configurations/App.xcconfig index 3b7cf497b7..e55bd4f0c3 100644 --- a/tools/darwin/Configurations/App.xcconfig +++ b/tools/darwin/Configurations/App.xcconfig @@ -25,6 +25,6 @@ HEADER_SEARCH_PATHS = $(inherited) $SRCROOT xbmc xbmc/linux xbmc/osx xbmc/cores/ LIBRARY_SEARCH_PATHS = $(inherited) $(SRCROOT) $(SRCROOT)/lib/libRTV $(SRCROOT)/lib/libXDAAP $(SRCROOT)/lib/cmyth/libcmyth $(SRCROOT)/lib/cmyth/librefmem $(SRCROOT)/lib/libsquish $(SRCROOT)/lib/SlingboxLib $(SRCROOT)/xbmc/interfaces/json-rpc "$(SRCROOT)/xbmc/interfaces/python" "$(SRCROOT)/xbmc/interfaces/legacy" FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/System/Library/PrivateFrameworks/" "$(SDKROOT)/System/Library/Frameworks/" -XBMC_OTHER_LDFLAGS_COMMON = $(inherited) -Wl,-headerpad_max_install_names -Wl,-all_load -L$XBMC_DEPENDS/lib -lbz2 -lintl -lexpat -lssl -lgpg-error -lresolv -lffi -lssh -llzo2 -lpcre -lpcrecpp -lfribidi -lfreetype -lfontconfig -lsqlite3 -lsamplerate -ltinyxml -lmicrohttpd -lsmbclient -lpython2.6 -lyajl -ljpeg -lcrypto -lgcrypt -lavdevice -lavfilter -lavcodec -lavformat -lpostproc -lavutil -lswresample -lswscale -ltag -L$XBMC_DEPENDS/lib/mysql -lmysqlclient -lxml2 -lxslt +XBMC_OTHER_LDFLAGS_COMMON = $(inherited) -Wl,-headerpad_max_install_names -Wl,-all_load -L$XBMC_DEPENDS/lib -lbz2 -lintl -lexpat -lssl -lgpg-error -lresolv -lffi -lssh -llzo2 -lpcre -lpcrecpp -lfribidi -lfreetype -lfontconfig -lsqlite3 -ltinyxml -lmicrohttpd -lsmbclient -lpython2.6 -lyajl -ljpeg -lcrypto -lgcrypt -lavdevice -lavfilter -lavcodec -lavformat -lpostproc -lavutil -lswresample -lswscale -ltag -L$XBMC_DEPENDS/lib/mysql -lmysqlclient -lxml2 -lxslt diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile index 8368a24d5d..3e02fc03a5 100644 --- a/tools/depends/target/Makefile +++ b/tools/depends/target/Makefile @@ -10,7 +10,7 @@ DEPENDS = \ openssl gmp nettle gnutls libssh2 curl \ libjpeg-turbo tiff jasper libpng \ libogg libvorbis libflac fribidi libmpeg2 \ - libass libsamplerate \ + libass \ libmodplug librtmp libxml2 yajl libmicrohttpd mysql libffi \ python26 afpfs-ng libshairplay \ libplist libcec libbluray boost tinyxml dummy-libxbmc \ diff --git a/tools/depends/target/libsamplerate/Makefile b/tools/depends/target/libsamplerate/Makefile deleted file mode 100644 index 2f87beb9e3..0000000000 --- a/tools/depends/target/libsamplerate/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -include ../../Makefile.include -DEPS= ../../Makefile.include Makefile - -# lib name, version -LIBNAME=libsamplerate -VERSION=0.1.7 -SOURCE=$(LIBNAME)-$(VERSION) -ARCHIVE=$(SOURCE).tar.gz - -# configuration settings -CONFIGURE=cp -f $(CONFIG_SUB) $(CONFIG_GUESS) .; \ - cp -f $(CONFIG_SUB) $(CONFIG_GUESS) Cfg; \ - ./configure --prefix=$(PREFIX) --disable-sndfile --disable-fftw --disable-shared - -LIBDYLIB=$(PLATFORM)/src/.libs/$(LIBNAME).a - -CLEAN_FILES=$(ARCHIVE) $(PLATFORM) - -all: .installed-$(PLATFORM) - -$(TARBALLS_LOCATION)/$(ARCHIVE): - cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - -$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) - rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) - cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) - cd $(PLATFORM); $(CONFIGURE) - -$(LIBDYLIB): $(PLATFORM) - $(MAKE) -C $(PLATFORM) - -.installed-$(PLATFORM): $(LIBDYLIB) - $(MAKE) -C $(PLATFORM) install - touch $@ - -clean: - $(MAKE) -C $(PLATFORM) clean - rm -f .installed-$(PLATFORM) - -distclean:: - rm -rf $(PLATFORM) .installed-$(PLATFORM) - diff --git a/xbmc/Autorun.cpp b/xbmc/Autorun.cpp index 27519508ce..1a59139618 100644 --- a/xbmc/Autorun.cpp +++ b/xbmc/Autorun.cpp @@ -505,7 +505,7 @@ bool CAutorun::CanResumePlayDVD(const CStdString& path) return false; } -void CAutorun::SettingOptionAudioCdActionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CAutorun::SettingOptionAudioCdActionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { list.push_back(make_pair(g_localizeStrings.Get(16018), AUTOCD_NONE)); list.push_back(make_pair(g_localizeStrings.Get(14098), AUTOCD_PLAY)); @@ -514,7 +514,7 @@ void CAutorun::SettingOptionAudioCdActionsFiller(const CSetting *setting, std::v #endif } -void CAutorun::SettingOptionAudioCdEncodersFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CAutorun::SettingOptionAudioCdEncodersFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { #ifdef HAVE_LIBMP3LAME list.push_back(make_pair(g_localizeStrings.Get(34000), CDDARIP_ENCODER_LAME)); diff --git a/xbmc/Autorun.h b/xbmc/Autorun.h index 02633cd652..04c10c87f2 100644 --- a/xbmc/Autorun.h +++ b/xbmc/Autorun.h @@ -64,8 +64,8 @@ public: void HandleAutorun(); static void ExecuteAutorun(const CStdString& path = "", bool bypassSettings = false, bool ignoreplaying = false, bool startFromBeginning = false); - static void SettingOptionAudioCdActionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionAudioCdEncodersFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); + static void SettingOptionAudioCdActionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionAudioCdEncodersFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); protected: static bool RunDisc(XFILE::IDirectory* pDir, const CStdString& strDrive, int& nAddedToPlaylist, bool bRoot, bool bypassSettings, bool startFromBeginning); diff --git a/xbmc/LangInfo.cpp b/xbmc/LangInfo.cpp index 3f2e04fea2..39a1c4e206 100644 --- a/xbmc/LangInfo.cpp +++ b/xbmc/LangInfo.cpp @@ -633,7 +633,7 @@ const CStdString& CLangInfo::GetSpeedUnitString() const return g_localizeStrings.Get(SPEED_UNIT_STRINGS+m_currentRegion->m_speedUnit); } -void CLangInfo::SettingOptionsLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CLangInfo::SettingOptionsLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { //find languages... CFileItemList items; @@ -660,7 +660,7 @@ void CLangInfo::SettingOptionsLanguagesFiller(const CSetting *setting, std::vect list.push_back(make_pair(vecLanguage[i], vecLanguage[i])); } -void CLangInfo::SettingOptionsStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CLangInfo::SettingOptionsStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { list.push_back(make_pair(g_localizeStrings.Get(308), "original")); list.push_back(make_pair(g_localizeStrings.Get(309), "default")); @@ -672,7 +672,7 @@ void CLangInfo::SettingOptionsStreamLanguagesFiller(const CSetting *setting, std list.push_back(make_pair(*language, *language)); } -void CLangInfo::SettingOptionsRegionsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CLangInfo::SettingOptionsRegionsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { CStdStringArray regions; g_langInfo.GetRegionNames(regions); diff --git a/xbmc/LangInfo.h b/xbmc/LangInfo.h index b432da7786..e4d62b2769 100644 --- a/xbmc/LangInfo.h +++ b/xbmc/LangInfo.h @@ -132,9 +132,9 @@ public: static void LoadTokens(const TiXmlNode* pTokens, std::vector<CStdString>& vecTokens); - static void SettingOptionsLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsRegionsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); + static void SettingOptionsLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsStreamLanguagesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsRegionsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); protected: void SetDefaults(); diff --git a/xbmc/PasswordManager.cpp b/xbmc/PasswordManager.cpp index 4ed2461c95..68a439d13e 100644 --- a/xbmc/PasswordManager.cpp +++ b/xbmc/PasswordManager.cpp @@ -66,9 +66,8 @@ bool CPasswordManager::PromptToAuthenticateURL(CURL &url) { CSingleLock lock(m_critSection); - CStdString passcode; - CStdString username = url.GetUserName(); - CStdString path = GetLookupPath(url); + std::string passcode; + std::string username = url.GetUserName(); bool saveDetails = false; if (!CGUIDialogLockSettings::ShowAndGetUserAndPassword(username, passcode, url.GetWithoutUserDetails(), &saveDetails)) diff --git a/xbmc/addons/AddonDll.h b/xbmc/addons/AddonDll.h index 856c39c7db..66c0c8e7dc 100644 --- a/xbmc/addons/AddonDll.h +++ b/xbmc/addons/AddonDll.h @@ -18,12 +18,13 @@ * <http://www.gnu.org/licenses/>. * */ +#include <math.h> + #include "Addon.h" #include "DllAddon.h" #include "AddonManager.h" #include "AddonStatusHandler.h" #include "AddonCallbacks.h" -#include "settings/dialogs/GUIDialogSettings.h" #include "utils/URIUtils.h" #include "filesystem/File.h" #include "filesystem/SpecialProtocol.h" diff --git a/xbmc/addons/ScreenSaver.cpp b/xbmc/addons/ScreenSaver.cpp index 8eadfded00..77c5d562f9 100644 --- a/xbmc/addons/ScreenSaver.cpp +++ b/xbmc/addons/ScreenSaver.cpp @@ -18,6 +18,7 @@ * */ #include "ScreenSaver.h" +#include "guilib/GraphicContext.h" #include "interfaces/generic/ScriptInvocationManager.h" #include "settings/DisplaySettings.h" #include "utils/AlarmClock.h" diff --git a/xbmc/addons/Skin.cpp b/xbmc/addons/Skin.cpp index 690c565604..d8549888be 100644 --- a/xbmc/addons/Skin.cpp +++ b/xbmc/addons/Skin.cpp @@ -279,7 +279,7 @@ const INFO::CSkinVariableString* CSkinInfo::CreateSkinVariable(const CStdString& return m_includes.CreateSkinVariable(name, context); } -void CSkinInfo::SettingOptionsSkinColorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CSkinInfo::SettingOptionsSkinColorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { CStdString settingValue = ((const CSettingString*)setting)->GetValue(); // Remove the .xml extension from the Themes @@ -320,7 +320,7 @@ void CSkinInfo::SettingOptionsSkinColorsFiller(const CSetting *setting, std::vec } } -void CSkinInfo::SettingOptionsSkinFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CSkinInfo::SettingOptionsSkinFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { CStdString settingValue = ((const CSettingString*)setting)->GetValue(); bool currentValueSet = false; @@ -388,7 +388,7 @@ void CSkinInfo::SettingOptionsSkinFontsFiller(const CSetting *setting, std::vect current = list[0].second; } -void CSkinInfo::SettingOptionsSkinSoundFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CSkinInfo::SettingOptionsSkinSoundFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { CStdString settingValue = ((const CSettingString*)setting)->GetValue(); current = "SKINDEFAULT"; @@ -428,7 +428,7 @@ void CSkinInfo::SettingOptionsSkinSoundFiller(const CSetting *setting, std::vect } } -void CSkinInfo::SettingOptionsSkinThemesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CSkinInfo::SettingOptionsSkinThemesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { // get the choosen theme and remove the extension from the current theme (backward compat) CStdString settingValue = ((const CSettingString*)setting)->GetValue(); @@ -457,7 +457,7 @@ void CSkinInfo::SettingOptionsSkinThemesFiller(const CSetting *setting, std::vec } } -void CSkinInfo::SettingOptionsStartupWindowsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CSkinInfo::SettingOptionsStartupWindowsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { int settingValue = ((const CSettingInt *)setting)->GetValue(); current = -1; diff --git a/xbmc/addons/Skin.h b/xbmc/addons/Skin.h index aa1635f84e..1191330a69 100644 --- a/xbmc/addons/Skin.h +++ b/xbmc/addons/Skin.h @@ -115,11 +115,11 @@ public: void LoadIncludes(); const INFO::CSkinVariableString* CreateSkinVariable(const CStdString& name, int context); - static void SettingOptionsSkinColorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsSkinFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsSkinSoundFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsSkinThemesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsStartupWindowsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); + static void SettingOptionsSkinColorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsSkinFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsSkinSoundFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsSkinThemesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsStartupWindowsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); protected: /*! \brief Given a resolution, retrieve the corresponding directory name diff --git a/xbmc/addons/Visualisation.cpp b/xbmc/addons/Visualisation.cpp index 9bb1d5f99c..622eee1cd7 100644 --- a/xbmc/addons/Visualisation.cpp +++ b/xbmc/addons/Visualisation.cpp @@ -22,6 +22,8 @@ #include "utils/fft.h" #include "GUIInfoManager.h" #include "Application.h" +#include "guilib/GraphicContext.h" +#include "guilib/WindowIDs.h" #include "music/tags/MusicInfoTag.h" #include "settings/Settings.h" #include "settings/AdvancedSettings.h" diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp index 67f61c1691..fe8d51c593 100644 --- a/xbmc/cores/AudioEngine/AEFactory.cpp +++ b/xbmc/cores/AudioEngine/AEFactory.cpp @@ -291,17 +291,17 @@ void CAEFactory::GarbageCollect() AE->GarbageCollect(); } -void CAEFactory::SettingOptionsAudioDevicesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CAEFactory::SettingOptionsAudioDevicesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { SettingOptionsAudioDevicesFillerGeneral(setting, list, current, false); } -void CAEFactory::SettingOptionsAudioDevicesPassthroughFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CAEFactory::SettingOptionsAudioDevicesPassthroughFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { SettingOptionsAudioDevicesFillerGeneral(setting, list, current, true); } -void CAEFactory::SettingOptionsAudioQualityLevelsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CAEFactory::SettingOptionsAudioQualityLevelsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { if (!AE) return; @@ -316,7 +316,7 @@ void CAEFactory::SettingOptionsAudioQualityLevelsFiller(const CSetting *setting, list.push_back(std::make_pair(g_localizeStrings.Get(13509), AE_QUALITY_REALLYHIGH)); } -void CAEFactory::SettingOptionsAudioStreamsilenceFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CAEFactory::SettingOptionsAudioStreamsilenceFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { if (!AE) return; @@ -374,9 +374,9 @@ void CAEFactory::UnregisterAudioCallback() AE->UnregisterAudioCallback(); } -bool CAEFactory::IsSettingVisible(const std::string &condition, const std::string &value, const std::string &settingId) +bool CAEFactory::IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting) { - if (settingId.empty() || value.empty() || !AE) + if (setting == NULL || value.empty() || !AE) return false; return AE->IsSettingVisible(value); diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h index 59f9316bba..1d8bf36cab 100644 --- a/xbmc/cores/AudioEngine/AEFactory.h +++ b/xbmc/cores/AudioEngine/AEFactory.h @@ -70,11 +70,11 @@ public: static IAEStream *FreeStream(IAEStream *stream); static void GarbageCollect(); - static void SettingOptionsAudioDevicesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsAudioDevicesPassthroughFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsAudioQualityLevelsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionsAudioStreamsilenceFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static bool IsSettingVisible(const std::string &condition, const std::string &value, const std::string &settingId); + static void SettingOptionsAudioDevicesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsAudioDevicesPassthroughFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsAudioQualityLevelsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionsAudioStreamsilenceFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static bool IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting); static void KeepConfiguration(unsigned int millis); static void DeviceChange(); diff --git a/xbmc/cores/AudioEngine/Makefile.in b/xbmc/cores/AudioEngine/Makefile.in index b49c3cc499..c2196536c0 100644 --- a/xbmc/cores/AudioEngine/Makefile.in +++ b/xbmc/cores/AudioEngine/Makefile.in @@ -60,7 +60,6 @@ SRCS += Utils/AEUtil.cpp SRCS += Utils/AEStreamInfo.cpp SRCS += Utils/AEPackIEC61937.cpp SRCS += Utils/AEBitstreamPacker.cpp -SRCS += Utils/AEWAVLoader.cpp SRCS += Utils/AEELDParser.cpp SRCS += Utils/AEDeviceInfo.cpp SRCS += Utils/AELimiter.cpp diff --git a/xbmc/cores/AudioEngine/Utils/AEWAVLoader.cpp b/xbmc/cores/AudioEngine/Utils/AEWAVLoader.cpp deleted file mode 100644 index de9029b44f..0000000000 --- a/xbmc/cores/AudioEngine/Utils/AEWAVLoader.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/* - * 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/>. - * - */ - -#include "AEWAVLoader.h" - - -#include "system.h" -#include "utils/log.h" -#include "utils/EndianSwap.h" -#include "filesystem/File.h" -#include "URL.h" -#include <samplerate.h> - -#include "AEConvert.h" -#include "AEUtil.h" -#include "AERemap.h" - -#ifdef TARGET_WINDOWS -#pragma comment(lib, "libsamplerate-0.lib") -#endif - -typedef struct -{ - char chunk_id[4]; - uint32_t chunksize; -} WAVE_CHUNK; - -CAEWAVLoader::CAEWAVLoader() : - m_valid (false), - m_sampleRate (0 ), - m_outputSampleRate (0 ), - m_frameCount (0 ), - m_outputFrameCount (0 ), - m_sampleCount (0 ), - m_outputSampleCount (0 ), - m_samples (NULL ), - m_outputSamples (NULL ) -{ -} - -CAEWAVLoader::~CAEWAVLoader() -{ - UnLoad(); -} - -bool CAEWAVLoader::Load(const std::string &filename) -{ - UnLoad(); - - m_filename = filename; - - XFILE::CFile file; - if (!file.Open(m_filename)) - { - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - Failed to create loader: %s", m_filename.c_str()); - return false; - } - - struct __stat64 st; - if (file.Stat(&st) < 0) - { - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - Failed to stat file: %s", m_filename.c_str()); - return false; - } - - bool isRIFF = false; - bool isWAVE = false; - bool isFMT = false; - bool isPCM = false; - bool isDATA = false; - - uint32_t sampleRate; - uint32_t byteRate; - uint16_t blockAlign; - uint16_t bitsPerSample; - - WAVE_CHUNK chunk; - while (file.Read(&chunk, sizeof(chunk)) == sizeof(chunk)) - { - chunk.chunksize = Endian_SwapLE32(chunk.chunksize); - - /* if its the RIFF header */ - if (!isRIFF && memcmp(chunk.chunk_id, "RIFF", 4) == 0) - { - isRIFF = true; - - /* work around invalid chunksize, I have seen this in one file so far (shutter.wav) */ - if (chunk.chunksize == st.st_size) - chunk.chunksize -= 8; - - /* sanity check on the chunksize */ - if (chunk.chunksize > st.st_size - 8) - { - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - Corrupt WAV header: %s", m_filename.c_str()); - file.Close(); - return false; - } - - /* we only support WAVE files */ - char format[4]; - if (file.Read(&format, 4) != 4) - break; - isWAVE = memcmp(format, "WAVE", 4) == 0; - if (!isWAVE) - break; - } - /* if its the fmt section */ - else if (!isFMT && memcmp(chunk.chunk_id, "fmt ", 4) == 0) - { - isFMT = true; - if (chunk.chunksize < 16) - break; - uint16_t format; - if (file.Read(&format, sizeof(format)) != sizeof(format)) - break; - format = Endian_SwapLE16(format); - if (format != WAVE_FORMAT_PCM) - break; - - uint16_t channelCount; - if (file.Read(&channelCount , 2) != 2) - break; - if (file.Read(&sampleRate , 4) != 4) - break; - if (file.Read(&byteRate , 4) != 4) - break; - if (file.Read(&blockAlign , 2) != 2) - break; - if (file.Read(&bitsPerSample, 2) != 2) - break; - - channelCount = Endian_SwapLE16(channelCount); - /* TODO: support > 2 channel count */ - if (channelCount > 2) - break; - - static AEChannel layouts[][3] = { - {AE_CH_FC, AE_CH_NULL}, - {AE_CH_FL, AE_CH_FR, AE_CH_NULL} - }; - - m_channels = layouts[channelCount - 1]; - m_sampleRate = Endian_SwapLE32(sampleRate ); - byteRate = Endian_SwapLE32(byteRate ); - blockAlign = Endian_SwapLE16(blockAlign ); - bitsPerSample = Endian_SwapLE16(bitsPerSample); - isPCM = true; - - if (chunk.chunksize > 16) - file.Seek(chunk.chunksize - 16, SEEK_CUR); - } - /* if we have the PCM info and its the DATA section */ - else if (isPCM && !isDATA && memcmp(chunk.chunk_id, "data", 4) == 0) - { - unsigned int bytesPerSample = bitsPerSample >> 3; - m_sampleCount = chunk.chunksize / bytesPerSample; - m_frameCount = m_sampleCount / m_channels.Count(); - isDATA = m_frameCount > 0; - - /* get the conversion function */ - CAEConvert::AEConvertToFn convertFn; - switch (bitsPerSample) - { - case 8 : convertFn = CAEConvert::ToFloat(AE_FMT_U8 ); break; - case 16: convertFn = CAEConvert::ToFloat(AE_FMT_S16LE); break; - case 32: convertFn = CAEConvert::ToFloat(AE_FMT_S32LE); break; - default: - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - Unsupported data format in wav: %s", m_filename.c_str()); - file.Close(); - return false; - } - - /* read in each sample */ - unsigned int size = bytesPerSample * m_sampleCount; - m_samples = (float* )_aligned_malloc(sizeof(float) * m_sampleCount, 16); - uint8_t *raw = (uint8_t *)_aligned_malloc(size, 16); - if (file.Read(raw, size) != size) - { - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - WAV data shorter then expected: %s", m_filename.c_str()); - _aligned_free(m_samples); - _aligned_free(raw); - m_samples = NULL; - file.Close(); - return false; - } - - /* convert the samples to float */ - convertFn(raw, m_sampleCount, m_samples); - _aligned_free(raw); - } - else - { - /* skip any unknown sections */ - file.Seek(chunk.chunksize, SEEK_CUR); - } - } - - if (!isRIFF || !isWAVE || !isFMT || !isPCM || !isDATA || m_sampleCount == 0) - { - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - Invalid, or un-supported WAV file: %s", m_filename.c_str()); - file.Close(); - return false; - } - - /* close the file as we have the samples now */ - file.Close(); - - m_outputChannels = m_channels; - m_outputSampleRate = m_sampleRate; - m_outputSamples = m_samples; - m_outputSampleCount = m_sampleCount; - m_outputFrameCount = m_frameCount; - - CLog::Log(LOGINFO, "CAEWAVLoader::Initialize - Sound Loaded: %s", m_filename.c_str()); - m_valid = true; - return true; -} - -bool CAEWAVLoader::Initialize(unsigned int resampleRate, CAEChannelInfo channelLayout, enum AEStdChLayout stdChLayout/* = AE_CH_LAYOUT_INVALID */) -{ - if (!m_valid) - { - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - File has not been loaded"); - return false; - } - - DeInitialize(); - - /* if the sample rates do not match */ - if (m_sampleRate != resampleRate) - { - unsigned int space = (unsigned int)((((float)m_sampleCount / (float)m_sampleRate) * (float)resampleRate) * 2.0f); - SRC_DATA data; - data.data_in = m_samples; - data.input_frames = m_frameCount; - data.data_out = (float*)_aligned_malloc(sizeof(float) * space, 16); - data.output_frames = space / m_channels.Count(); - data.src_ratio = (double)resampleRate / (double)m_sampleRate; -#ifdef TARGET_DARWIN_IOS - if (src_simple(&data, SRC_SINC_FASTEST, m_channels.Count()) != 0) -#else - if (src_simple(&data, SRC_SINC_MEDIUM_QUALITY, m_channels.Count()) != 0) -#endif - { - CLog::Log(LOGERROR, "CAEWAVLoader::Initialize - Failed to resample audio: %s", m_filename.c_str()); - _aligned_free(data.data_out); - return false; - } - - if (m_outputSamples != m_samples) - _aligned_free(m_outputSamples); - - m_outputSamples = data.data_out; - m_outputFrameCount = data.output_frames_gen; - m_outputSampleCount = data.output_frames_gen * m_channels.Count(); - m_outputSampleRate = resampleRate; - } - else - { - m_outputSamples = m_samples; - m_outputFrameCount = m_frameCount; - m_outputSampleCount = m_sampleCount; - m_outputSampleRate = m_sampleRate; - } - - /* if the channel layouts do not match */ - if (m_channels != channelLayout) - { - CAERemap remap; - if (!remap.Initialize(m_channels, channelLayout, false, false, stdChLayout)) - return false; - - /* adjust the output format parameters */ - m_outputSampleCount = m_outputFrameCount * channelLayout.Count(); - m_outputChannels = channelLayout; - - float *remapped = (float*)_aligned_malloc(sizeof(float) * m_outputSampleCount, 16); - remap.Remap(m_outputSamples, remapped, m_outputFrameCount); - - /* assign the remapped buffer */ - if (m_outputSamples != m_samples) - _aligned_free(m_outputSamples); - m_outputSamples = remapped; - } - - return true; -} - -void CAEWAVLoader::UnLoad() -{ - DeInitialize(); - - _aligned_free(m_samples); - m_samples = NULL; - m_sampleCount = 0; - m_frameCount = 0; - m_channels.Reset(); - - m_outputSamples = NULL; - m_outputSampleCount = 0; - m_outputFrameCount = 0; - m_outputChannels.Reset(); -} - -void CAEWAVLoader::DeInitialize() -{ - /* only free m_outputSamples if it is a seperate buffer */ - if (m_outputSamples != m_samples) - _aligned_free(m_outputSamples); - - m_outputSamples = m_samples; - m_outputSampleCount = m_sampleCount; - m_outputFrameCount = m_frameCount; - m_outputChannels = m_channels; -} - -CAEChannelInfo CAEWAVLoader::GetChannelLayout() -{ - return m_outputChannels; -} - -unsigned int CAEWAVLoader::GetSampleRate() -{ - return m_outputSampleRate; -} - -unsigned int CAEWAVLoader::GetSampleCount() -{ - return m_outputSampleCount; -} - -unsigned int CAEWAVLoader::GetFrameCount() -{ - return m_outputFrameCount; -} - -float* CAEWAVLoader::GetSamples() -{ - if (!m_valid || m_outputSamples == NULL) - return NULL; - - return m_outputSamples; -} - -bool CAEWAVLoader::IsCompatible(const unsigned int sampleRate, const CAEChannelInfo &channelInfo) -{ - return ( - m_outputSampleRate == sampleRate && - m_outputChannels == channelInfo - ); -} diff --git a/xbmc/cores/AudioEngine/Utils/AEWAVLoader.h b/xbmc/cores/AudioEngine/Utils/AEWAVLoader.h deleted file mode 100644 index e96bbba7ba..0000000000 --- a/xbmc/cores/AudioEngine/Utils/AEWAVLoader.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once -/* - * 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/>. - * - */ - -#include "utils/StdString.h" -#include "AEAudioFormat.h" - -class CAEWAVLoader -{ -public: - CAEWAVLoader(); - ~CAEWAVLoader(); - - /** - * Load a WAV file into memory - * @param filename The filename to load - * @return true on success - */ - bool Load(const std::string &filename); - - /** - * Unload and release the samples loaded by CAWEAVLoader::Load - */ - void UnLoad(); - - /** - * Initialize the loaded file for the required output format - * @param sampleRate The desired output sample rate - * @param channelLayout The desired output channel layout - * @param stdChLayout The channels that are actually used in the layout - */ - bool Initialize(unsigned int resampleRate, CAEChannelInfo channelLayout, enum AEStdChLayout stdChLayout = AE_CH_LAYOUT_INVALID); - - /** - * DeInitialize the remapped/resampled output - */ - void DeInitialize(); - - /** - * Returns if the current sample buffer is valid - * @return true if the current sample buffer is valid - */ - bool IsValid() { return m_valid; } - - CAEChannelInfo GetChannelLayout(); - unsigned int GetSampleRate(); - unsigned int GetSampleCount(); - unsigned int GetFrameCount(); - float* GetSamples(); - bool IsCompatible(const unsigned int sampleRate, const CAEChannelInfo &channelInfo); - -private: - std::string m_filename; - bool m_valid; - - CAEChannelInfo m_channels , m_outputChannels; - unsigned int m_sampleRate , m_outputSampleRate; - unsigned int m_frameCount , m_outputFrameCount; - unsigned int m_sampleCount , m_outputSampleCount; - float *m_samples , *m_outputSamples; -}; - diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.cpp b/xbmc/cores/VideoRenderers/BaseRenderer.cpp index 970b822e4d..83c3adbc8d 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.cpp +++ b/xbmc/cores/VideoRenderers/BaseRenderer.cpp @@ -739,7 +739,7 @@ void CBaseRenderer::MarkDirty() g_windowManager.MarkDirty(m_destRect); } -void CBaseRenderer::SettingOptionsRenderMethodsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CBaseRenderer::SettingOptionsRenderMethodsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { list.push_back(make_pair(g_localizeStrings.Get(13416), RENDER_METHOD_AUTO)); diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h index dc2712ad07..fb41ccf1bd 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.h +++ b/xbmc/cores/VideoRenderers/BaseRenderer.h @@ -102,7 +102,7 @@ public: virtual void RegisterRenderUpdateCallBack(const void *ctx, RenderUpdateCallBackFn fn); virtual void RegisterRenderFeaturesCallBack(const void *ctx, RenderFeaturesCallBackFn fn); - static void SettingOptionsRenderMethodsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); + static void SettingOptionsRenderMethodsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); protected: void ChooseBestResolution(float fps); diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp index bf69f0ae5a..61c2196e82 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.cpp @@ -21,12 +21,15 @@ #include "DVDVideoCodec.h" #include "windowing/WindowingFactory.h" #include "settings/Settings.h" +#include "settings/lib/Setting.h" -bool CDVDVideoCodec::IsSettingVisible(const std::string &condition, const std::string &value, const std::string &settingId) +bool CDVDVideoCodec::IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting) { - if (settingId.empty() || value.empty()) + if (setting == NULL || value.empty()) return false; + const std::string &settingId = setting->GetId(); + // check if we are running on nvidia hardware std::string gpuvendor = g_Windowing.GetRenderVendor(); std::transform(gpuvendor.begin(), gpuvendor.end(), gpuvendor.begin(), ::tolower); @@ -69,7 +72,7 @@ bool CDVDVideoCodec::IsCodecDisabled(DVDCodecAvailableType* map, unsigned int si } } if(index > -1) - return (!CSettings::Get().GetBool(map[index].setting) || !CDVDVideoCodec::IsSettingVisible("unused", "unused", map[index].setting)); + return (!CSettings::Get().GetBool(map[index].setting) || !CDVDVideoCodec::IsSettingVisible("unused", "unused", CSettings::Get().GetSetting(map[index].setting))); return false; //don't disable what we don't have } diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h index 1553789c07..741017df49 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h @@ -30,6 +30,8 @@ extern "C" { #include "libavcodec/avcodec.h" } +class CSetting; + struct DVDCodecAvailableType { AVCodecID codec; @@ -279,7 +281,7 @@ public: * Hide or Show Settings depending on the currently running hardware * */ - static bool IsSettingVisible(const std::string &condition, const std::string &value, const std::string &settingId); + static bool IsSettingVisible(const std::string &condition, const std::string &value, const CSetting *setting); /** * Interact with user settings so that user disabled codecs are disabled diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp index 122e92297c..1b0f7e8460 100644 --- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp +++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamFile.cpp @@ -91,7 +91,7 @@ bool CDVDInputStreamFile::Open(const char* strFile, const std::string& content) if (m_pFile->GetImplemenation() && (content.empty() || content == "application/octet-stream")) m_content = m_pFile->GetImplemenation()->GetContent(); - m_eof = true; + m_eof = false; return true; } diff --git a/xbmc/cores/paplayer/DVDPlayerCodec.cpp b/xbmc/cores/paplayer/DVDPlayerCodec.cpp index b960e3b120..5a130931b5 100644 --- a/xbmc/cores/paplayer/DVDPlayerCodec.cpp +++ b/xbmc/cores/paplayer/DVDPlayerCodec.cpp @@ -197,8 +197,6 @@ bool DVDPlayerCodec::Init(const CStdString &strFile, unsigned int filecache) m_bCanSeek = false; if (m_pInputStream->Seek(0, SEEK_POSSIBLE)) { - // reset eof flag of stream, with eof set seek returns always success - m_pInputStream->Seek(0, SEEK_SET); if (Seek(1) != DVD_NOPTS_VALUE) { // rewind stream to beginning diff --git a/xbmc/dbwrappers/DatabaseQuery.cpp b/xbmc/dbwrappers/DatabaseQuery.cpp index d2fcd9aae3..d7c28d255b 100644 --- a/xbmc/dbwrappers/DatabaseQuery.cpp +++ b/xbmc/dbwrappers/DatabaseQuery.cpp @@ -56,8 +56,6 @@ static const operatorField operators[] = { static const size_t NUM_OPERATORS = sizeof(operators) / sizeof(operatorField); -#define RULE_VALUE_SEPARATOR " / " - CDatabaseQueryRule::CDatabaseQueryRule() { m_field = 0; @@ -231,13 +229,13 @@ void CDatabaseQueryRule::GetAvailableOperators(std::vector<std::string> &operato CStdString CDatabaseQueryRule::GetParameter() const { - return StringUtils::JoinString(m_parameter, RULE_VALUE_SEPARATOR); + return StringUtils::JoinString(m_parameter, DATABASEQUERY_RULE_VALUE_SEPARATOR); } void CDatabaseQueryRule::SetParameter(const CStdString &value) { m_parameter.clear(); - StringUtils::SplitString(value, RULE_VALUE_SEPARATOR, m_parameter); + StringUtils::SplitString(value, DATABASEQUERY_RULE_VALUE_SEPARATOR, m_parameter); } void CDatabaseQueryRule::SetParameter(const std::vector<CStdString> &values) diff --git a/xbmc/dbwrappers/DatabaseQuery.h b/xbmc/dbwrappers/DatabaseQuery.h index 61428e70c6..a865889187 100644 --- a/xbmc/dbwrappers/DatabaseQuery.h +++ b/xbmc/dbwrappers/DatabaseQuery.h @@ -25,6 +25,8 @@ #include "utils/StdString.h" +#define DATABASEQUERY_RULE_VALUE_SEPARATOR " / " + class CDatabase; class CVariant; class TiXmlNode; diff --git a/xbmc/dialogs/GUIDialogContextMenu.cpp b/xbmc/dialogs/GUIDialogContextMenu.cpp index 0617b2184b..f45cb03f03 100644 --- a/xbmc/dialogs/GUIDialogContextMenu.cpp +++ b/xbmc/dialogs/GUIDialogContextMenu.cpp @@ -563,7 +563,7 @@ bool CGUIDialogContextMenu::OnContextButton(const CStdString &type, const CFileI if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; - CStdString strNewPassword = ""; + std::string strNewPassword = ""; if (!CGUIDialogLockSettings::ShowAndGetLock(share->m_iLockMode,strNewPassword)) return false; // password entry and re-entry succeeded, write out the lock data @@ -625,7 +625,7 @@ bool CGUIDialogContextMenu::OnContextButton(const CStdString &type, const CFileI if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; - CStdString strNewPW; + std::string strNewPW; CStdString strNewLockMode; if (CGUIDialogLockSettings::ShowAndGetLock(share->m_iLockMode,strNewPW)) strNewLockMode = StringUtils::Format("%i",share->m_iLockMode); diff --git a/xbmc/dialogs/GUIDialogMediaFilter.cpp b/xbmc/dialogs/GUIDialogMediaFilter.cpp index 63cdbc8e54..c1e3b199a0 100644 --- a/xbmc/dialogs/GUIDialogMediaFilter.cpp +++ b/xbmc/dialogs/GUIDialogMediaFilter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2013 Team XBMC + * Copyright (C) 2012-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -19,34 +19,28 @@ */ #include "GUIDialogMediaFilter.h" +#include "DbUrl.h" #include "FileItem.h" #include "GUIUserMessages.h" #include "XBDateTime.h" -#include "dialogs/GUIDialogSelect.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" #include "music/MusicDatabase.h" +#include "music/MusicDbUrl.h" #include "playlists/SmartPlayList.h" +#include "settings/SettingUtils.h" +#include "settings/lib/Setting.h" +#include "settings/windows/GUIControlSettings.h" #include "utils/log.h" -#include "utils/MathUtils.h" #include "utils/StringUtils.h" #include "video/VideoDatabase.h" +#include "video/VideoDbUrl.h" -#define TIMEOUT_DELAY 500 - -// list of controls #define CONTROL_HEADING 2 -// list of controls from CGUIDialogSettings -#define CONTROL_GROUP_LIST 5 -#define CONTROL_DEFAULT_BUTTON 7 -#define CONTROL_DEFAULT_RADIOBUTTON 8 -#define CONTROL_DEFAULT_SPIN 9 -#define CONTROL_DEFAULT_SLIDER 10 #define CONTROL_CLEAR_BUTTON 27 #define CONTROL_OKAY_BUTTON 28 #define CONTROL_CANCEL_BUTTON 29 -#define CONTROL_START 30 #define CHECK_ALL -1 #define CHECK_NO 0 @@ -55,92 +49,80 @@ #define CHECK_LABEL_NO 106 #define CHECK_LABEL_YES 107 -using namespace std; - static const CGUIDialogMediaFilter::Filter filterList[] = { - { "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 }, + { "movies", FieldTitle, 556, SettingTypeString, "edit", "string", CDatabaseQueryRule::OPERATOR_CONTAINS }, + { "movies", FieldRating, 563, SettingTypeNumber, "range", "number", CDatabaseQueryRule::OPERATOR_BETWEEN }, + //{ "movies", FieldTime, 180, SettingTypeInteger, "range", "time", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "movies", FieldInProgress, 575, SettingTypeInteger, "toggle", "", CDatabaseQueryRule::OPERATOR_FALSE }, + { "movies", FieldYear, 562, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "movies", FieldTag, 20459, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "movies", FieldGenre, 515, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "movies", FieldActor, 20337, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "movies", FieldDirector, 20339, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "movies", FieldStudio, 572, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + + { "tvshows", FieldTitle, 556, SettingTypeString, "edit", "string", CDatabaseQueryRule::OPERATOR_CONTAINS }, + //{ "tvshows", FieldTvShowStatus, 126, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "tvshows", FieldRating, 563, SettingTypeNumber, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "tvshows", FieldInProgress, 575, SettingTypeInteger, "toggle", "", CDatabaseQueryRule::OPERATOR_FALSE }, + { "tvshows", FieldYear, 562, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "tvshows", FieldTag, 20459, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "tvshows", FieldGenre, 515, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "tvshows", FieldActor, 20337, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "tvshows", FieldDirector, 20339, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "tvshows", FieldStudio, 572, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + + { "episodes", FieldTitle, 556, SettingTypeString, "edit", "string", CDatabaseQueryRule::OPERATOR_CONTAINS }, + { "episodes", FieldRating, 563, SettingTypeNumber, "range", "number", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "episodes", FieldAirDate, 20416, SettingTypeInteger, "range", "date", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "episodes", FieldInProgress, 575, SettingTypeInteger, "toggle", "", CDatabaseQueryRule::OPERATOR_FALSE }, + { "episodes", FieldActor, 20337, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "episodes", FieldDirector, 20339, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + + { "musicvideos", FieldTitle, 556, SettingTypeString, "edit", "string", CDatabaseQueryRule::OPERATOR_CONTAINS }, + { "musicvideos", FieldArtist, 557, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "musicvideos", FieldAlbum, 558, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + //{ "musicvideos", FieldTime, 180, SettingTypeInteger, "range", "time", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "musicvideos", FieldYear, 562, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "musicvideos", FieldTag, 20459, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "musicvideos", FieldGenre, 515, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "musicvideos", FieldDirector, 20339, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "musicvideos", FieldStudio, 572, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + + { "artists", FieldArtist, 557, SettingTypeString, "edit", "string", CDatabaseQueryRule::OPERATOR_CONTAINS }, + { "artists", FieldGenre, 515, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + + { "albums", FieldAlbum, 556, SettingTypeString, "edit", "string", CDatabaseQueryRule::OPERATOR_CONTAINS }, + { "albums", FieldArtist, 557, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "albums", FieldRating, 563, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "albums", FieldAlbumType, 564, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "albums", FieldYear, 562, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "albums", FieldGenre, 515, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "albums", FieldMusicLabel, 21899, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + + { "songs", FieldTitle, 556, SettingTypeString, "edit", "string", CDatabaseQueryRule::OPERATOR_CONTAINS }, + { "songs", FieldAlbum, 558, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "songs", FieldArtist, 557, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "songs", FieldTime, 180, SettingTypeInteger, "range", "time", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "songs", FieldRating, 563, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "songs", FieldYear, 562, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, + { "songs", FieldGenre, 515, SettingTypeList, "list", "string", CDatabaseQueryRule::OPERATOR_EQUALS }, + { "songs", FieldPlaycount, 567, SettingTypeInteger, "range", "integer", CDatabaseQueryRule::OPERATOR_BETWEEN }, }; #define NUM_FILTERS sizeof(filterList) / sizeof(CGUIDialogMediaFilter::Filter) +using namespace std; + CGUIDialogMediaFilter::CGUIDialogMediaFilter() - : CGUIDialogSettings(WINDOW_DIALOG_MEDIA_FILTER, "DialogMediaFilter.xml"), - m_dbUrl(NULL), - m_filter(NULL) -{ - m_delayTimer = new CTimer(this); -} + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_MEDIA_FILTER, "DialogMediaFilter.xml"), + m_dbUrl(NULL), + m_filter(NULL) +{ } CGUIDialogMediaFilter::~CGUIDialogMediaFilter() { Reset(); - delete m_delayTimer; } bool CGUIDialogMediaFilter::OnMessage(CGUIMessage& message) @@ -149,45 +131,15 @@ bool CGUIDialogMediaFilter::OnMessage(CGUIMessage& message) { case GUI_MSG_CLICKED: { - int control = message.GetSenderId(); - - if (control == CONTROL_CLEAR_BUTTON) + if (message.GetSenderId()== CONTROL_CLEAR_BUTTON) { m_filter->Reset(); m_filter->SetType(m_mediaType); - if (m_delayTimer && m_delayTimer->IsRunning()) - m_delayTimer->Stop(); - for (map<uint32_t, Filter>::iterator filter = m_filters.begin(); filter != m_filters.end(); filter++) + for (map<std::string, Filter>::iterator filter = m_filters.begin(); filter != m_filters.end(); filter++) { filter->second.rule = NULL; - - switch (filter->second.type) - { - case SettingInfo::STRING: - case SettingInfo::EDIT: - ((CStdString *)filter->second.data)->clear(); - break; - - case SettingInfo::CHECK: - *(int *)filter->second.data = CHECK_ALL; - break; - - case SettingInfo::BUTTON: - ((CStdString *)filter->second.data)->clear(); - SET_CONTROL_LABEL2(filter->second.controlIndex, *(CStdString *)filter->second.data); - break; - - case SettingInfo::RANGE: - *(((float **)filter->second.data)[0]) = m_settings[filter->second.controlIndex - CONTROL_START].min; - *(((float **)filter->second.data)[1]) = m_settings[filter->second.controlIndex - CONTROL_START].max; - break; - - default: - continue; - } - - UpdateSetting(filter->first); + filter->second.setting->Reset(); } TriggerFilter(); @@ -213,7 +165,7 @@ bool CGUIDialogMediaFilter::OnMessage(CGUIMessage& message) break; } - return CGUIDialogSettings::OnMessage(message); + return CGUIDialogSettingsManualBase::OnMessage(message); } void CGUIDialogMediaFilter::ShowAndEditMediaFilter(const std::string &path, CSmartPlaylist &filter) @@ -225,6 +177,7 @@ void CGUIDialogMediaFilter::ShowAndEditMediaFilter(const std::string &path, CSma // initialize and show the dialog dialog->Initialize(); dialog->m_filter = &filter; + // must be called after setting the filter/smartplaylist if (!dialog->SetPath(path)) return; @@ -234,133 +187,154 @@ void CGUIDialogMediaFilter::ShowAndEditMediaFilter(const std::string &path, CSma void CGUIDialogMediaFilter::OnWindowLoaded() { - CGUIDialogSettings::OnWindowLoaded(); + CGUIDialogSettingsManualBase::OnWindowLoaded(); + // we don't need the cancel button so let's hide it SET_CONTROL_HIDDEN(CONTROL_CANCEL_BUTTON); } -void CGUIDialogMediaFilter::CreateSettings() +void CGUIDialogMediaFilter::OnInitWindow() { - if (m_filter == NULL) - return; + CGUIDialogSettingsManualBase::OnInitWindow(); - m_settings.clear(); - int handledRules = 0; - for (unsigned int index = 0; index < NUM_FILTERS; index++) - { - if (filterList[index].mediaType != m_mediaType) - continue; + UpdateControls(); +} - Filter filter = filterList[index]; - filter.controlIndex = CONTROL_START + m_settings.size(); +void CGUIDialogMediaFilter::OnSettingChanged(const CSetting *setting) +{ + CGUIDialogSettingsManualBase::OnSettingChanged(setting); - // check the smartplaylist if it contains a matching rule - for (CDatabaseQueryRules::iterator rule = m_filter->m_ruleCombination.m_rules.begin(); rule != m_filter->m_ruleCombination.m_rules.end(); rule++) + map<std::string, Filter>::iterator it = m_filters.find(setting->GetId()); + if (it == m_filters.end()) + return; + + bool remove = false; + Filter& filter = it->second; + + if (filter.controlType == "edit") + { + std::string value = setting->ToString(); + if (!value.empty()) { - if ((*rule)->m_field == filter.field) - { - filter.rule = (CSmartPlaylistRule *)rule->get(); - handledRules++; - break; - } + if (filter.rule == NULL) + filter.rule = AddRule(filter.field, filter.ruleOperator); + filter.rule->m_parameter.clear(); + filter.rule->m_parameter.push_back(value); } - - switch (filter.type) + else + remove = true; + } + else if (filter.controlType == "toggle") + { + int choice = static_cast<const CSettingInt*>(setting)->GetValue(); + if (choice > CHECK_ALL) { - case SettingInfo::STRING: - case SettingInfo::EDIT: - { - if (filter.rule != NULL && filter.rule->m_parameter.size() == 1) - filter.data = new CStdString(filter.rule->m_parameter.at(0)); - else - filter.data = new CStdString(); - - if (filter.type == SettingInfo::STRING) - AddString(filter.field, filter.label, (CStdString *)filter.data); - else - AddEdit(filter.field, filter.label, (CStdString *)filter.data); - break; - } - - case SettingInfo::CHECK: - { - if (filter.rule == NULL) - filter.data = new int(CHECK_ALL); - else - filter.data = new int(filter.rule->m_operator == CDatabaseQueryRule::OPERATOR_TRUE ? CHECK_YES : CHECK_NO); + CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator = choice == CHECK_YES ? CDatabaseQueryRule::OPERATOR_TRUE : CDatabaseQueryRule::OPERATOR_FALSE; + if (filter.rule == NULL) + filter.rule = AddRule(filter.field, ruleOperator); + else + filter.rule->m_operator = ruleOperator; + } + else + remove = true; + } + else if (filter.controlType == "list") + { + std::vector<CVariant> values = CSettingUtils::GetList(static_cast<const CSettingList*>(setting)); + if (!values.empty()) + { + if (filter.rule == NULL) + filter.rule = AddRule(filter.field, filter.ruleOperator); - vector<pair<int, int> > entries; - entries.push_back(pair<int, int>(CHECK_ALL, CHECK_LABEL_ALL)); - entries.push_back(pair<int, int>(CHECK_NO, CHECK_LABEL_NO)); - entries.push_back(pair<int, int>(CHECK_YES, CHECK_LABEL_YES)); - AddSpin(filter.field, filter.label, (int *)filter.data, entries); - break; - } + filter.rule->m_parameter.clear(); + for (std::vector<CVariant>::const_iterator itValue = values.begin(); itValue != values.end(); ++itValue) + filter.rule->m_parameter.push_back(itValue->asString()); + } + else + remove = true; + } + else if (filter.controlType == "range") + { + const CSettingList *settingList = static_cast<const CSettingList*>(setting); + std::vector<CVariant> values = CSettingUtils::GetList(settingList); + if (values.size() != 2) + return; - case SettingInfo::BUTTON: - { - CStdString *values = new CStdString(); - if (filter.rule != NULL && filter.rule->m_parameter.size() > 0) - *values = filter.rule->GetParameter(); - filter.data = values; + std::string strValueLower, strValueUpper; - AddButton(filter.field, filter.label); - break; - } + const CSetting *definition = settingList->GetDefinition(); + if (definition->GetType() == SettingTypeInteger) + { + const CSettingInt *definitionInt = static_cast<const CSettingInt*>(definition); + int valueLower = static_cast<int>(values.at(0).asInteger()); + int valueUpper = static_cast<int>(values.at(1).asInteger()); - case SettingInfo::RANGE: + if (valueLower > definitionInt->GetMinimum() || + valueUpper < definitionInt->GetMaximum()) { - float min = 0, interval = 0, max = 0; - RANGEFORMATFUNCTION format; - GetRange(filter, min, interval, max, format); - - // don't create the filter if there's no real range - if (min == max) - break; - - float *valueLower = new float(); - float *valueUpper = new float(); - if (filter.rule != NULL && filter.rule->m_parameter.size() == 2) + if (filter.controlFormat == "date") { - *valueLower = (float)strtod(filter.rule->m_parameter.at(0), NULL); - *valueUpper = (float)strtod(filter.rule->m_parameter.at(1), NULL); + strValueLower = CDateTime(static_cast<time_t>(valueLower)).GetAsDBDate(); + strValueUpper = CDateTime(static_cast<time_t>(valueUpper)).GetAsDBDate(); + } + else if (filter.controlFormat == "time") + { + strValueLower = CDateTime(static_cast<time_t>(valueLower)).GetAsLocalizedTime("mm:ss"); + strValueUpper = CDateTime(static_cast<time_t>(valueUpper)).GetAsLocalizedTime("mm:ss"); } else { - *valueLower = min; - *valueUpper = max; - - if (filter.rule != NULL) - { - DeleteRule(filter.field); - filter.rule = NULL; - } + strValueLower = values.at(0).asString(); + strValueUpper = values.at(1).asString(); } + } + } + else if (definition->GetType() == SettingTypeNumber) + { + const CSettingNumber *definitionNumber = static_cast<const CSettingNumber*>(definition); + float valueLower = values.at(0).asFloat(); + float valueUpper = values.at(1).asFloat(); - AddRangeSlider(filter.field, filter.label, valueLower, valueUpper, min, interval, max, format); - filter.data = m_settings[filter.controlIndex - CONTROL_START].data; - break; + if (valueLower > definitionNumber->GetMinimum() || + valueUpper < definitionNumber->GetMaximum()) + { + strValueLower = values.at(0).asString(); + strValueUpper = values.at(1).asString(); } + } + else + return; - default: - filter.controlIndex = -1; - if (filter.rule != NULL) - handledRules--; - continue; + if (!strValueLower.empty() && !strValueUpper.empty()) + { + // prepare the filter rule + if (filter.rule == NULL) + filter.rule = AddRule(filter.field, filter.ruleOperator); + filter.rule->m_parameter.clear(); + + filter.rule->m_parameter.push_back(strValueLower); + filter.rule->m_parameter.push_back(strValueUpper); } + else + remove = true; + } + else + return; - m_filters[filter.field] = filter; + // we need to remove the existing rule for the title + if (remove && filter.rule != NULL) + { + DeleteRule(filter.field); + filter.rule = NULL; } - // make sure that no change in capacity size is needed when adding new rules - // which would copy around the rules and our pointers in the Filter struct - // wouldn't work anymore - m_filter->m_ruleCombination.m_rules.reserve(m_filters.size() + (m_filter->m_ruleCombination.m_rules.size() - handledRules)); + CGUIMessage msg(GUI_MSG_REFRESH_LIST, GetID(), 0); + g_windowManager.SendThreadMessage(msg, WINDOW_DIALOG_MEDIA_FILTER); } -void CGUIDialogMediaFilter::SetupPage() +void CGUIDialogMediaFilter::SetupView() { - CGUIDialogSettings::SetupPage(); + CGUIDialogSettingsManualBase::SetupView(); // set the heading label based on the media type uint32_t localizedMediaId = 0; @@ -379,210 +353,172 @@ void CGUIDialogMediaFilter::SetupPage() else if (m_mediaType == "songs") localizedMediaId = 134; - CStdString format = StringUtils::Format(g_localizeStrings.Get(1275).c_str(), g_localizeStrings.Get(localizedMediaId).c_str()); - SET_CONTROL_LABEL(CONTROL_HEADING, format); - - // now we can finally set the label/values of the button settings (genre, actors etc) - for (map<uint32_t, Filter>::const_iterator filter = m_filters.begin(); filter != m_filters.end(); filter++) - { - if (filter->second.type == SettingInfo::BUTTON && - filter->second.controlIndex >= 0 && filter->second.data != NULL) - SET_CONTROL_LABEL2(filter->second.controlIndex, *(CStdString *)filter->second.data); - } - - UpdateControls(); + // set the heading + SET_CONTROL_LABEL(CONTROL_HEADING, StringUtils::Format(g_localizeStrings.Get(1275).c_str(), g_localizeStrings.Get(localizedMediaId).c_str())); } -void CGUIDialogMediaFilter::OnTimeout() +void CGUIDialogMediaFilter::InitializeSettings() { - CGUIMessage msg(GUI_MSG_REFRESH_LIST, GetID(), 0); - g_windowManager.SendThreadMessage(msg, WINDOW_DIALOG_MEDIA_FILTER); -} + CGUIDialogSettingsManualBase::InitializeSettings(); -void CGUIDialogMediaFilter::OnSettingChanged(SettingInfo &setting) -{ - map<uint32_t, Filter>::iterator it = m_filters.find(setting.id); - if (it == m_filters.end()) + if (m_filter == NULL) return; - bool changed = true; - bool delay = false; - bool remove = false; - Filter& filter = it->second; + Reset(true); + + int handledRules = 0; + + CSettingCategory *category = AddCategory("filter", -1); + if (category == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogMediaFilter: unable to setup filters"); + return; + } + + CSettingGroup *group = AddGroup(category); + if (group == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogMediaFilter: unable to setup filters"); + return; + } - switch (filter.type) + for (unsigned int index = 0; index < NUM_FILTERS; index++) { - case SettingInfo::STRING: - case SettingInfo::EDIT: + if (filterList[index].mediaType != m_mediaType) + continue; + + Filter filter = filterList[index]; + + // check the smartplaylist if it contains a matching rule + for (CDatabaseQueryRules::iterator rule = m_filter->m_ruleCombination.m_rules.begin(); rule != m_filter->m_ruleCombination.m_rules.end(); rule++) { - CStdString *str = static_cast<CStdString*>(filter.data); - if (!str->empty()) + if ((*rule)->m_field == filter.field) { - if (filter.rule == NULL) - filter.rule = AddRule(filter.field, filter.ruleOperator); - filter.rule->m_parameter.clear(); - filter.rule->m_parameter.push_back(*str); - // trigger the live filtering with a delay in case the user - // types several characters in a short time - delay = true; + filter.rule = (CSmartPlaylistRule *)rule->get(); + handledRules++; + break; } - else - remove = true; - - break; } - - case SettingInfo::CHECK: - { - int choice = *(int *)setting.data; - if (choice > CHECK_ALL) - { - CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator = choice == CHECK_YES ? CDatabaseQueryRule::OPERATOR_TRUE : CDatabaseQueryRule::OPERATOR_FALSE; - if (filter.rule == NULL) - filter.rule = AddRule(filter.field, ruleOperator); - else - filter.rule->m_operator = ruleOperator; - } - else - remove = true; - break; + std::string settingId = StringUtils::Format("filter.%s.%d", filter.mediaType.c_str(), filter.field); + if (filter.controlType == "edit") + { + CVariant data; + if (filter.rule != NULL && filter.rule->m_parameter.size() == 1) + data = filter.rule->m_parameter.at(0); + + if (filter.settingType == SettingTypeString) + filter.setting = AddEdit(group, settingId, filter.label, 0, data.asString(), true, false, filter.label, true); + else if (filter.settingType == SettingTypeInteger) + filter.setting = AddEdit(group, settingId, filter.label, 0, static_cast<int>(data.asInteger()), 0, 1, 0, false, filter.label, true); + else if (filter.settingType == SettingTypeNumber) + filter.setting = AddEdit(group, settingId, filter.label, 0, data.asFloat(), 0.0f, 1.0f, 0.0f, false, filter.label, true); } - - case SettingInfo::BUTTON: + else if (filter.controlType == "toggle") { - CFileItemList items; - OnBrowse(filter, items); - - if (items.Size() > 0) - { - if (filter.rule == NULL) - filter.rule = AddRule(filter.field, filter.ruleOperator); + int value = CHECK_ALL; + if (filter.rule != NULL) + value = filter.rule->m_operator == CDatabaseQueryRule::OPERATOR_TRUE ? CHECK_YES : CHECK_NO; - filter.rule->m_parameter.clear(); - for (int index = 0; index < items.Size(); index++) - filter.rule->m_parameter.push_back(items[index]->GetLabel()); + StaticIntegerSettingOptions entries; + entries.push_back(pair<int, int>(CHECK_LABEL_ALL, CHECK_ALL)); + entries.push_back(pair<int, int>(CHECK_LABEL_NO, CHECK_NO)); + entries.push_back(pair<int, int>(CHECK_LABEL_YES, CHECK_YES)); - *(CStdString *)filter.data = filter.rule->GetParameter(); - } - else + filter.setting = AddSpinner(group, settingId, filter.label, 0, value, entries, true); + } + else if (filter.controlType == "list") + { + std::vector<std::string> values; + if (filter.rule != NULL && filter.rule->m_parameter.size() > 0) { - remove = true; - *(CStdString *)filter.data = ""; + values = StringUtils::Split(filter.rule->GetParameter(), DATABASEQUERY_RULE_VALUE_SEPARATOR); + if (values.size() == 1 && values.at(0).empty()) + values.erase(values.begin()); } - SET_CONTROL_LABEL2(filter.controlIndex, *(CStdString *)filter.data); - break; + filter.setting = AddList(group, settingId, filter.label, 0, values, GetStringListOptions, filter.label); } - - case SettingInfo::RANGE: + else if (filter.controlType == "range") { - SettingInfo &setting = m_settings[filter.controlIndex - CONTROL_START]; - float *valueLower = ((float **)filter.data)[0]; - float *valueUpper = ((float **)filter.data)[1]; - - if (*valueLower > setting.min || *valueUpper < setting.max) + CVariant valueLower, valueUpper; + if (filter.rule != NULL) { - if (filter.rule == NULL) - filter.rule = AddRule(filter.field, filter.ruleOperator); - - filter.rule->m_parameter.clear(); - if (filter.field == FieldAirDate) + if (filter.rule->m_parameter.size() == 2) { - CDateTime lower = (time_t)*valueLower; - CDateTime upper = (time_t)*valueUpper; - filter.rule->m_parameter.push_back(lower.GetAsDBDate()); - filter.rule->m_parameter.push_back(upper.GetAsDBDate()); + valueLower = filter.rule->m_parameter.at(0); + valueUpper = filter.rule->m_parameter.at(1); } else { - CStdString tmp = StringUtils::Format("%.1f", *valueLower); - filter.rule->m_parameter.push_back(tmp); - tmp.clear(); - tmp = StringUtils::Format("%.1f", *valueUpper); - filter.rule->m_parameter.push_back(tmp); + DeleteRule(filter.field); + filter.rule = NULL; } } - else + + if (filter.settingType == SettingTypeInteger) { - remove = true; - *((float **)filter.data)[0] = setting.min; - *((float **)filter.data)[1] = setting.max; - } + int min, interval, max; + GetRange(filter, min, interval, max); - // trigger the live filtering with a delay in case the user - // moves the slider several steps in a short time - delay = true; - break; - } + // don't create the filter if there's no real range + if (min == max) + break; - default: - changed = false; - break; - } + int iValueLower = valueLower.isNull() ? min : static_cast<int>(valueLower.asInteger()); + int iValueUpper = valueUpper.isNull() ? max : static_cast<int>(valueUpper.asInteger()); + + if (filter.controlFormat == "integer") + filter.setting = AddRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, min, interval, max, -1, 21469, true); + else if (filter.controlFormat == "percentage") + filter.setting = AddPercentageRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, -1, 1, 21469, true); + else if (filter.controlFormat == "date") + filter.setting = AddDateRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, min, interval, max, -1, 21469, true); + else if (filter.controlFormat == "time") + filter.setting = AddTimeRange(group, settingId, filter.label, 0, iValueLower, iValueUpper, min, interval, max, -1, 21469, true); + } + else if (filter.settingType == SettingTypeNumber) + { + float min, interval, max; + GetRange(filter, min, interval, max); - // we need to remove the existing rule for the title - if (remove && filter.rule != NULL) - { - DeleteRule(filter.field); - filter.rule = NULL; - } + // don't create the filter if there's no real range + if (min == max) + break; - if (changed) - { - if (!delay) - { - CGUIMessage msg(GUI_MSG_REFRESH_LIST, GetID(), 0); - OnMessage(msg); + float fValueLower = valueLower.isNull() ? min : valueLower.asFloat(); + float fValueUpper = valueUpper.isNull() ? max : valueUpper.asFloat(); + + filter.setting = AddRange(group, settingId, filter.label, 0, fValueLower, fValueUpper, min, interval, max, -1, 21469, true); + } } - else if (m_delayTimer) + else { - if (m_delayTimer->IsRunning()) - m_delayTimer->Restart(); - else - m_delayTimer->Start(TIMEOUT_DELAY, false); - } - } -} + if (filter.rule != NULL) + handledRules--; -void CGUIDialogMediaFilter::Reset() -{ - if (m_delayTimer && m_delayTimer->IsRunning()) - m_delayTimer->Stop(); - - delete m_dbUrl; - m_dbUrl = NULL; + CLog::Log(LOGWARNING, "CGUIDialogMediaFilter: filter %d of media type %s with unknown control type '%s'", + filter.field, filter.mediaType.c_str(), filter.controlType.c_str()); + continue; + } - // delete all the setting's data - for (map<uint32_t, Filter>::iterator filter = m_filters.begin(); filter != m_filters.end(); filter++) - { - switch (filter->second.type) + if (filter.setting == NULL) { - case SettingInfo::STRING: - case SettingInfo::EDIT: - case SettingInfo::BUTTON: - delete (CStdString *)filter->second.data; - break; + if (filter.rule != NULL) + handledRules--; - case SettingInfo::CHECK: - delete (int *)filter->second.data; - break; - - case SettingInfo::RANGE: - if (filter->second.data != NULL) - { - delete ((float **)filter->second.data)[0]; - delete ((float **)filter->second.data)[1]; - } - delete (float *)filter->second.data; - break; - - default: - continue; + CLog::Log(LOGWARNING, "CGUIDialogMediaFilter: failed to create filter %d of media type %s with control type '%s'", + filter.field, filter.mediaType.c_str(), filter.controlType.c_str()); + continue; } + + m_filters.insert(make_pair(settingId, filter)); } - m_filters.clear(); + // make sure that no change in capacity size is needed when adding new rules + // which would copy around the rules and our pointers in the Filter struct + // wouldn't work anymore + m_filter->m_ruleCombination.m_rules.reserve(m_filters.size() + (m_filter->m_ruleCombination.m_rules.size() - handledRules)); } bool CGUIDialogMediaFilter::SetPath(const std::string &path) @@ -631,28 +567,28 @@ bool CGUIDialogMediaFilter::SetPath(const std::string &path) void CGUIDialogMediaFilter::UpdateControls() { - for (map<uint32_t, Filter>::iterator itFilter = m_filters.begin(); itFilter != m_filters.end(); itFilter++) + for (map<std::string, Filter>::iterator itFilter = m_filters.begin(); itFilter != m_filters.end(); itFilter++) { - if (itFilter->second.type == SettingInfo::BUTTON) - { - CFileItemList items; - OnBrowse(itFilter->second, items, true); + if (itFilter->second.controlType != "list") + continue; - int size = items.Size(); - if (items.Size() == 1 && items[0]->HasProperty("total")) - size = (int)items[0]->GetProperty("total").asInteger(); + std::vector<std::string> items; + int size = GetItems(itFilter->second, items, true); - CStdString label = g_localizeStrings.Get(itFilter->second.label); - if (size <= 0 || - (size == 1 && itFilter->second.field != FieldSet && itFilter->second.field != FieldTag)) - CONTROL_DISABLE(itFilter->second.controlIndex); - else - { - CONTROL_ENABLE(itFilter->second.controlIndex); - label = StringUtils::Format("%s [%d]", label.c_str(), size); - } - SET_CONTROL_LABEL(itFilter->second.controlIndex, label); + std::string label = g_localizeStrings.Get(itFilter->second.label); + BaseSettingControlPtr control = GetSettingControl(itFilter->second.setting->GetId()); + if (control == NULL) + continue; + + if (size <= 0 || + (size == 1 && itFilter->second.field != FieldSet && itFilter->second.field != FieldTag)) + CONTROL_DISABLE(control->GetID()); + else + { + CONTROL_ENABLE(control->GetID()); + label = StringUtils::Format(g_localizeStrings.Get(21470), label.c_str(), size); } + SET_CONTROL_LABEL(control->GetID(), label); } } @@ -665,24 +601,37 @@ void CGUIDialogMediaFilter::TriggerFilter() const g_windowManager.SendThreadMessage(message); } -void CGUIDialogMediaFilter::OnBrowse(const Filter &filter, CFileItemList &items, bool countOnly /* = false */) +void CGUIDialogMediaFilter::Reset(bool filtersOnly /* = false */) +{ + if (!filtersOnly) + { + delete m_dbUrl; + m_dbUrl = NULL; + } + + m_filters.clear(); +} + +int CGUIDialogMediaFilter::GetItems(const Filter &filter, std::vector<std::string> &items, bool countOnly /* = false */) { CFileItemList selectItems; + + // remove the rule for the field of the filter we want to retrieve items for + CSmartPlaylist tmpFilter = *m_filter; + for (CDatabaseQueryRules::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++) + { + if ((*rule)->m_field == filter.field) + { + tmpFilter.m_ruleCombination.m_rules.erase(rule); + break; + } + } + if (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "episodes" || m_mediaType == "musicvideos") { CVideoDatabase videodb; if (!videodb.Open()) - return; - - CSmartPlaylist tmpFilter = *m_filter; - for (CDatabaseQueryRules::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++) - { - if ((*rule)->m_field == filter.field) - { - tmpFilter.m_ruleCombination.m_rules.erase(rule); - break; - } - } + return -1; std::set<CStdString> playlists; CDatabase::Filter dbfilter; @@ -713,17 +662,7 @@ void CGUIDialogMediaFilter::OnBrowse(const Filter &filter, CFileItemList &items, { CMusicDatabase musicdb; if (!musicdb.Open()) - return; - - CSmartPlaylist tmpFilter = *m_filter; - for (CDatabaseQueryRules::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++) - { - if ((*rule)->m_field == filter.field) - { - tmpFilter.m_ruleCombination.m_rules.erase(rule); - break; - } - } + return -1; std::set<CStdString> playlists; CDatabase::Filter dbfilter; @@ -741,34 +680,24 @@ void CGUIDialogMediaFilter::OnBrowse(const Filter &filter, CFileItemList &items, musicdb.GetMusicLabelsNav(m_dbUrl->ToString(), selectItems, dbfilter, countOnly); } - if (selectItems.Size() <= 0) - return; + int size = selectItems.Size(); + if (size <= 0) + return 0; if (countOnly) { - items.Copy(selectItems); - return; + if (size == 1 && selectItems.Get(0)->HasProperty("total")) + return (int)selectItems.Get(0)->GetProperty("total").asInteger(); + return 0; } // sort the items selectItems.Sort(SortByLabel, SortOrderAscending); - CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - pDialog->Reset(); - pDialog->SetItems(&selectItems); - CStdString strHeading = StringUtils::Format(g_localizeStrings.Get(13401), g_localizeStrings.Get(filter.label).c_str()); - pDialog->SetHeading(strHeading); - pDialog->SetMultiSelection(true); + for (int index = 0; index < size; ++index) + items.push_back(selectItems.Get(index)->GetLabel()); - if (filter.rule != NULL && !filter.rule->m_parameter.empty()) - pDialog->SetSelected(filter.rule->m_parameter); - - pDialog->DoModal(); - if (pDialog->IsConfirmed()) - items.Copy(pDialog->GetSelectedItems()); - else - items.Clear(); - pDialog->Reset(); + return items.size(); } CSmartPlaylistRule* CGUIDialogMediaFilter::AddRule(Field field, CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator /* = CDatabaseQueryRule::OPERATOR_CONTAINS */) @@ -793,31 +722,39 @@ void CGUIDialogMediaFilter::DeleteRule(Field field) } } -void CGUIDialogMediaFilter::GetRange(const Filter &filter, float &min, float &interval, float &max, RANGEFORMATFUNCTION &formatFunction) +void CGUIDialogMediaFilter::GetStringListOptions(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) +{ + if (setting == NULL || data == NULL) + return; + + CGUIDialogMediaFilter *mediaFilter = static_cast<CGUIDialogMediaFilter*>(data); + + std::map<std::string, Filter>::const_iterator itFilter = mediaFilter->m_filters.find(setting->GetId()); + if (itFilter == mediaFilter->m_filters.end()) + return; + + std::vector<std::string> items; + if (mediaFilter->GetItems(itFilter->second, items, false) <= 0) + return; + + for (std::vector<std::string>::const_iterator item = items.begin(); item != items.end(); ++item) + list.push_back(make_pair(*item, *item)); +} + +void CGUIDialogMediaFilter::GetRange(const Filter &filter, int &min, int &interval, int &max) { - if (filter.field == FieldRating) + if (filter.field == FieldRating && + (m_mediaType == "albums" || m_mediaType == "songs")) { - if (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "episodes") - { - min = 0.0f; - interval = 0.1f; - max = 10.0f; - formatFunction = RangeAsFloat; - } - else if (m_mediaType == "albums" || m_mediaType == "songs") - { - min = 0.0f; - interval = 1.0f; - max = 5.0f; - formatFunction = RangeAsInt; - } + min = 0; + interval = 1; + max = 5; } else if (filter.field == FieldYear) { - formatFunction = RangeAsInt; - min = 0.0f; - interval = 1.0f; - max = 0.0f; + min = 0; + interval = 1; + max = 0; if (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "musicvideos") { @@ -860,10 +797,9 @@ void CGUIDialogMediaFilter::GetRange(const Filter &filter, float &min, float &in } else if (filter.field == FieldAirDate) { - formatFunction = RangeAsDate; - min = 0.0f; - interval = 1.0f; - max = 0.0f; + min = 0; + interval = 1; + max = 0; if (m_mediaType == "episodes") { @@ -875,27 +811,36 @@ void CGUIDialogMediaFilter::GetRange(const Filter &filter, float &min, float &in } else if (filter.field == FieldTime) { - formatFunction = RangeAsTime; - min = 0.0f; - interval = 10.0f; - max = 0.0f; + min = 0; + interval = 10; + max = 0; if (m_mediaType == "songs") GetMinMax("songview", "iDuration", min, max); } else if (filter.field == FieldPlaycount) { - formatFunction = RangeAsInt; - min = 0.0f; - interval = 1.0f; - max = 0.0f; + min = 0; + interval = 1; + max = 0; if (m_mediaType == "songs") GetMinMax("songview", "iTimesPlayed", min, max); } } -bool CGUIDialogMediaFilter::GetMinMax(const CStdString &table, const CStdString &field, float &min, float &max, const CDatabase::Filter &filter /* = CDatabase::Filter() */) +void CGUIDialogMediaFilter::GetRange(const Filter &filter, float &min, float &interval, float &max) +{ + if (filter.field == FieldRating && + (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "episodes")) + { + min = 0.0f; + interval = 0.1f; + max = 10.0f; + } +} + +bool CGUIDialogMediaFilter::GetMinMax(const std::string &table, const std::string &field, int &min, int &max, const CDatabase::Filter &filter /* = CDatabase::Filter() */) { if (table.empty() || field.empty()) return false; @@ -945,8 +890,8 @@ bool CGUIDialogMediaFilter::GetMinMax(const CStdString &table, const CStdString CStdString strSQL = "SELECT %s FROM %s "; - min = (float)strtod(db->GetSingleValue(db->PrepareSQL(strSQL, CStdString("MIN(" + field + ")").c_str(), table.c_str()) + strSQLExtra).c_str(), NULL); - max = (float)strtod(db->GetSingleValue(db->PrepareSQL(strSQL, CStdString("MAX(" + field + ")").c_str(), table.c_str()) + strSQLExtra).c_str(), NULL); + min = static_cast<int>(strtol(db->GetSingleValue(db->PrepareSQL(strSQL, CStdString("MIN(" + field + ")").c_str(), table.c_str()) + strSQLExtra).c_str(), NULL, 0)); + max = static_cast<int>(strtol(db->GetSingleValue(db->PrepareSQL(strSQL, CStdString("MAX(" + field + ")").c_str(), table.c_str()) + strSQLExtra).c_str(), NULL, 0)); db->Close(); delete db; @@ -954,54 +899,3 @@ bool CGUIDialogMediaFilter::GetMinMax(const CStdString &table, const CStdString return true; } - -CStdString CGUIDialogMediaFilter::RangeAsFloat(float valueLower, float valueUpper, float minimum) -{ - CStdString text; - if (valueLower != valueUpper) - text = StringUtils::Format(g_localizeStrings.Get(21467).c_str(), valueLower, valueUpper); - else - text = StringUtils::Format("%.1f", valueLower); - return text; -} - -CStdString CGUIDialogMediaFilter::RangeAsInt(float valueLower, float valueUpper, float minimum) -{ - CStdString text; - if (valueLower != valueUpper) - text = StringUtils::Format(g_localizeStrings.Get(21468).c_str(), - MathUtils::round_int((double)valueLower), - MathUtils::round_int((double)valueUpper)); - else - text = StringUtils::Format("%d", MathUtils::round_int((double)valueLower)); - return text; -} - -CStdString CGUIDialogMediaFilter::RangeAsDate(float valueLower, float valueUpper, float minimum) -{ - CDateTime from = (time_t)valueLower; - CDateTime to = (time_t)valueUpper; - CStdString text; - if (valueLower != valueUpper) - text = StringUtils::Format(g_localizeStrings.Get(21469).c_str(), - from.GetAsLocalizedDate().c_str(), - to.GetAsLocalizedDate().c_str()); - else - text = StringUtils::Format("%s", - from.GetAsLocalizedDate().c_str()); - return text; -} - -CStdString CGUIDialogMediaFilter::RangeAsTime(float valueLower, float valueUpper, float minimum) -{ - CDateTime from = (time_t)valueLower; - CDateTime to = (time_t)valueUpper; - CStdString text; - if (valueLower != valueUpper) - text = StringUtils::Format(g_localizeStrings.Get(21469).c_str(), - from.GetAsLocalizedTime("mm:ss").c_str(), - to.GetAsLocalizedTime("mm:ss").c_str()); - else - text = StringUtils::Format("%s", from.GetAsLocalizedTime("mm:ss").c_str()); - return text; -} diff --git a/xbmc/dialogs/GUIDialogMediaFilter.h b/xbmc/dialogs/GUIDialogMediaFilter.h index 203dee09cc..64f7fbf909 100644 --- a/xbmc/dialogs/GUIDialogMediaFilter.h +++ b/xbmc/dialogs/GUIDialogMediaFilter.h @@ -1,6 +1,6 @@ #pragma once /* - * Copyright (C) 2012-2013 Team XBMC + * Copyright (C) 2012-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -22,23 +22,24 @@ #include <map> #include <string> -#include "DbUrl.h" #include "dbwrappers/Database.h" -#include "playlists/SmartPlayList.h" -#include "settings/dialogs/GUIDialogSettings.h" -#include "threads/Timer.h" +#include "dbwrappers/DatabaseQuery.h" +#include "settings/dialogs/GUIDialogSettingsManualBase.h" #include "utils/DatabaseUtils.h" -#include "utils/StdString.h" -class CFileItemList; +class CDbUrl; +class CSetting; +class CSmartPlaylist; +class CSmartPlaylistRule; -class CGUIDialogMediaFilter : public CGUIDialogSettings, protected ITimerCallback +class CGUIDialogMediaFilter : public CGUIDialogSettingsManualBase { public: CGUIDialogMediaFilter(); virtual ~CGUIDialogMediaFilter(); - virtual bool OnMessage(CGUIMessage& message); + // specializations of CGUIControl + virtual bool OnMessage(CGUIMessage &message); static void ShowAndEditMediaFilter(const std::string &path, CSmartPlaylist &filter); @@ -46,41 +47,49 @@ public: std::string mediaType; Field field; uint32_t label; - SettingInfo::SETTING_TYPE type; + int settingType; + std::string controlType; + std::string controlFormat; CDatabaseQueryRule::SEARCH_OPERATOR ruleOperator; - void *data; + CSetting *setting; CSmartPlaylistRule *rule; - int controlIndex; + void *data; } Filter; protected: + // specializations of CGUIWindow virtual void OnWindowLoaded(); + virtual void OnInitWindow(); - virtual void CreateSettings(); - virtual void SetupPage(); - virtual void OnSettingChanged(SettingInfo &setting); + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); - virtual void OnTimeout(); + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save() { } + virtual unsigned int GetDelayMs() const { return 500; } + + // specialization of CGUIDialogSettingsManualBase + virtual void SetupView(); + virtual void InitializeSettings(); - void Reset(); bool SetPath(const std::string &path); void UpdateControls(); void TriggerFilter() const; + void Reset(bool filtersOnly = false); + + int GetItems(const Filter &filter, std::vector<std::string> &items, bool countOnly = false); + void GetRange(const Filter &filter, int &min, int &interval, int &max); + void GetRange(const Filter &filter, float &min, float &interval, float &max); + bool GetMinMax(const std::string &table, const std::string &field, int &min, int &max, const CDatabase::Filter &filter = CDatabase::Filter()); - void OnBrowse(const Filter &filter, CFileItemList &items, bool countOnly = false); 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()); - static CStdString RangeAsFloat(float valueLower, float valueUpper, float minimum); - static CStdString RangeAsInt(float valueLower, float valueUpper, float minimum); - static CStdString RangeAsDate(float valueLower, float valueUpper, float minimum); - static CStdString RangeAsTime(float valueLower, float valueUpper, float minimum); + static void GetStringListOptions(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); CDbUrl* m_dbUrl; std::string m_mediaType; CSmartPlaylist *m_filter; - std::map<uint32_t, Filter> m_filters; - CTimer *m_delayTimer; + std::map<std::string, Filter> m_filters; }; diff --git a/xbmc/epg/GUIEPGGridContainer.cpp b/xbmc/epg/GUIEPGGridContainer.cpp index bc5c68bd87..c7fbffd176 100644 --- a/xbmc/epg/GUIEPGGridContainer.cpp +++ b/xbmc/epg/GUIEPGGridContainer.cpp @@ -1069,8 +1069,7 @@ void CGUIEPGGridContainer::SetChannel(const CStdString &channel) } } - if (iChannelIndex >= 0) - ScrollToChannelOffset(iChannelIndex); + SetSelectedChannel(iChannelIndex); } void CGUIEPGGridContainer::SetChannel(const CPVRChannel &channel) @@ -1086,8 +1085,7 @@ void CGUIEPGGridContainer::SetChannel(const CPVRChannel &channel) } } - if (iChannelIndex >= 0) - ScrollToChannelOffset(iChannelIndex); + SetSelectedChannel(iChannelIndex); } void CGUIEPGGridContainer::SetChannel(int channel) @@ -1266,6 +1264,27 @@ bool CGUIEPGGridContainer::OnMouseWheel(char wheel, const CPoint &point) return true; } +void CGUIEPGGridContainer::SetSelectedChannel(int channelIndex) +{ + if (channelIndex < 0) + return; + + if (channelIndex - m_channelOffset < m_channelsPerPage && channelIndex - m_channelOffset >= 0) + { + SetChannel(channelIndex - m_channelOffset); + } + else if(channelIndex < m_channels - m_channelsPerPage) + { + ScrollToChannelOffset(channelIndex - m_channelsPerPage + 1); + SetChannel(m_channelsPerPage - 1); + } + else + { + ScrollToChannelOffset(m_channels - m_channelsPerPage); + SetChannel(channelIndex - (m_channels - m_channelsPerPage)); + } +} + int CGUIEPGGridContainer::GetSelectedItem() const { if (m_gridIndex.empty() || diff --git a/xbmc/epg/GUIEPGGridContainer.h b/xbmc/epg/GUIEPGGridContainer.h index 8ae80e3def..1d3eacc48c 100644 --- a/xbmc/epg/GUIEPGGridContainer.h +++ b/xbmc/epg/GUIEPGGridContainer.h @@ -65,6 +65,7 @@ namespace EPG const int GetNumChannels() { return m_channels; }; virtual int GetSelectedItem() const; const int GetSelectedChannel() { return m_channelCursor + m_channelOffset; } + void SetSelectedChannel(int channelIndex); virtual EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event); virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions); diff --git a/xbmc/filesystem/Makefile.in b/xbmc/filesystem/Makefile.in index c5a6738597..623bbb8c64 100644 --- a/xbmc/filesystem/Makefile.in +++ b/xbmc/filesystem/Makefile.in @@ -124,6 +124,7 @@ SRCS += BlurayDirectory.cpp endif ifeq (@USE_UPNP@,1) +INCLUDES+=-I@abs_top_srcdir@/lib/libUPnP INCLUDES+=-I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Core INCLUDES+=-I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Platinum INCLUDES+=-I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Devices/MediaConnect diff --git a/xbmc/filesystem/NptXbmcFile.cpp b/xbmc/filesystem/NptXbmcFile.cpp index 57e73553a0..77fb616070 100644 --- a/xbmc/filesystem/NptXbmcFile.cpp +++ b/xbmc/filesystem/NptXbmcFile.cpp @@ -32,18 +32,19 @@ /*---------------------------------------------------------------------- | includes +---------------------------------------------------------------------*/ +#include <limits> +#include <Neptune/Source/Core/NptDebug.h> +#include <Neptune/Source/Core/NptFile.h> +#include <Neptune/Source/Core/NptInterfaces.h> +#include <Neptune/Source/Core/NptStrings.h> +#include <Neptune/Source/Core/NptThreads.h> +#include <Neptune/Source/Core/NptUtils.h> + #include "File.h" #include "FileFactory.h" #include "utils/log.h" #include "Util.h" #include "URL.h" -#include <limits> -#include "NptUtils.h" -#include "NptFile.h" -#include "NptThreads.h" -#include "NptInterfaces.h" -#include "NptStrings.h" -#include "NptDebug.h" #ifdef TARGET_WINDOWS #define S_IWUSR _S_IWRITE diff --git a/xbmc/filesystem/UPnPDirectory.cpp b/xbmc/filesystem/UPnPDirectory.cpp index dfc1105944..6fb2b07aa7 100644 --- a/xbmc/filesystem/UPnPDirectory.cpp +++ b/xbmc/filesystem/UPnPDirectory.cpp @@ -22,12 +22,13 @@ * <http://www.gnu.org/licenses/>. * */ +#include <Platinum/Source/Platinum/Platinum.h> +#include <Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h> + #include "UPnPDirectory.h" #include "URL.h" #include "network/upnp/UPnP.h" #include "network/upnp/UPnPInternal.h" -#include "Platinum.h" -#include "PltSyncMediaBrowser.h" #include "video/VideoInfoTag.h" #include "FileItem.h" #include "utils/log.h" diff --git a/xbmc/guilib/GUIFontManager.cpp b/xbmc/guilib/GUIFontManager.cpp index 476accd5d7..ff1cce0e61 100644 --- a/xbmc/guilib/GUIFontManager.cpp +++ b/xbmc/guilib/GUIFontManager.cpp @@ -570,7 +570,7 @@ bool GUIFontManager::IsFontSetUnicode(const CStdString& strFontSet) return false; } -void GUIFontManager::SettingOptionsFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void GUIFontManager::SettingOptionsFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { CFileItemList items; CFileItemList items2; diff --git a/xbmc/guilib/GUIFontManager.h b/xbmc/guilib/GUIFontManager.h index 44d44b4c52..ec96d48432 100644 --- a/xbmc/guilib/GUIFontManager.h +++ b/xbmc/guilib/GUIFontManager.h @@ -80,7 +80,7 @@ public: bool IsFontSetUnicode(const CStdString& strFontSet); bool GetFirstFontSetUnicode(CStdString& strFontSet); - static void SettingOptionsFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); + static void SettingOptionsFontsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); protected: void ReloadTTFFonts(); diff --git a/xbmc/input/linux/LinuxInputDevices.cpp b/xbmc/input/linux/LinuxInputDevices.cpp index 4b642ae7e6..ee21474288 100644 --- a/xbmc/input/linux/LinuxInputDevices.cpp +++ b/xbmc/input/linux/LinuxInputDevices.cpp @@ -931,9 +931,9 @@ void CLinuxInputDevice::GetInfo(int fd) //printf("pref: %d\n", m_devicePreferredId); } -char* CLinuxInputDevice::GetDeviceName() +const std::string& CLinuxInputDevice::GetFileName() { - return m_deviceName; + return m_fileName; } bool CLinuxInputDevice::IsUnplugged() @@ -945,6 +945,11 @@ bool CLinuxInputDevices::CheckDevice(const char *device) { int fd; + // Does the device exists? + struct stat buffer; + if (stat(device, &buffer) != 0) + return false; + /* Check if we are able to open the device */ fd = open(device, O_RDWR); if (fd < 0) @@ -1016,7 +1021,7 @@ void CLinuxInputDevices::CheckHotplugged() for (size_t j = 0; j < m_devices.size(); j++) { - if (strcmp(m_devices[j]->GetDeviceName(),buf) == 0) + if (m_devices[j]->GetFileName().compare(buf) == 0) { ispresent = true; break; diff --git a/xbmc/input/linux/LinuxInputDevices.h b/xbmc/input/linux/LinuxInputDevices.h index c385ed76aa..384a83aa9d 100644 --- a/xbmc/input/linux/LinuxInputDevices.h +++ b/xbmc/input/linux/LinuxInputDevices.h @@ -41,7 +41,7 @@ public: CLinuxInputDevice(const std::string fileName, int index); ~CLinuxInputDevice(); XBMC_Event ReadEvent(); - char* GetDeviceName(); + const std::string& GetFileName(); bool IsUnplugged(); private: diff --git a/xbmc/interfaces/json-rpc/SettingsOperations.cpp b/xbmc/interfaces/json-rpc/SettingsOperations.cpp index 07094f744c..c5e1457939 100644 --- a/xbmc/interfaces/json-rpc/SettingsOperations.cpp +++ b/xbmc/interfaces/json-rpc/SettingsOperations.cpp @@ -24,6 +24,7 @@ #include "settings/SettingControl.h" #include "settings/SettingPath.h" #include "settings/Settings.h" +#include "settings/SettingUtils.h" #include "settings/lib/Setting.h" #include "settings/lib/SettingSection.h" #include "guilib/LocalizeStrings.h" @@ -597,8 +598,8 @@ bool CSettingsOperations::SerializeSettingList(const CSettingList* setting, CVar !SerializeSetting(setting->GetDefinition(), obj["definition"])) return false; - SerializeSettingListValues(CSettings::Get().GetList(setting->GetId()), obj["value"]); - SerializeSettingListValues(CSettings::ListToValues(setting, setting->GetDefault()), obj["default"]); + SerializeSettingListValues(CSettingUtils::GetList(setting), obj["value"]); + SerializeSettingListValues(CSettingUtils::ListToValues(setting, setting->GetDefault()), obj["default"]); obj["elementtype"] = obj["definition"]["type"]; obj["delimiter"] = setting->GetDelimiter(); @@ -684,6 +685,35 @@ bool CSettingsOperations::SerializeSettingControl(const ISettingControl* control obj["heading"] = g_localizeStrings.Get(list->GetHeading()); obj["multiselect"] = list->CanMultiSelect(); } + else if (type == "slider") + { + const CSettingControlSlider* slider = static_cast<const CSettingControlSlider*>(control); + if (slider == NULL) + return false; + + if (slider->GetHeading() >= 0) + obj["heading"] = g_localizeStrings.Get(slider->GetHeading()); + obj["popup"] = slider->UsePopup(); + if (slider->GetFormatLabel() >= 0) + obj["formatlabel"] = g_localizeStrings.Get(slider->GetFormatLabel()); + else + obj["formatlabel"] = slider->GetFormatString(); + } + else if (type == "range") + { + const CSettingControlRange* range = static_cast<const CSettingControlRange*>(control); + if (range == NULL) + return false; + + if (range->GetFormatLabel() >= 0) + obj["formatlabel"] = g_localizeStrings.Get(range->GetFormatLabel()); + else + obj["formatlabel"] = ""; + if (range->GetValueFormatLabel() >= 0) + obj["formatvalue"] = g_localizeStrings.Get(range->GetValueFormatLabel()); + else + obj["formatvalue"] = range->GetValueFormat(); + } else if (type != "toggle") return false; diff --git a/xbmc/interfaces/json-rpc/schema/types.json b/xbmc/interfaces/json-rpc/schema/types.json index 7b71c1b08d..5b6f8f554b 100644 --- a/xbmc/interfaces/json-rpc/schema/types.json +++ b/xbmc/interfaces/json-rpc/schema/types.json @@ -1529,13 +1529,31 @@ "multiselect": { "type": "boolean", "required": true } } }, + "Setting.Details.ControlSlider": { + "extends": "Setting.Details.ControlHeading", + "properties": { + "type": { "type": "string", "required": true, "enum": [ "slider" ] }, + "formatlabel": { "type": "string", "required": true }, + "popup": { "type": "boolean", "required": true } + } + }, + "Setting.Details.ControlRange": { + "extends": "Setting.Details.ControlBase", + "properties": { + "type": { "type": "string", "required": true, "enum": [ "range" ] }, + "formatlabel": { "type": "string", "required": true }, + "formatvalue": { "type": "string", "required": true } + } + }, "Setting.Details.Control": { "type": [ { "$ref": "Setting.Details.ControlCheckmark", "required": true }, { "$ref": "Setting.Details.ControlSpinner", "required": true }, { "$ref": "Setting.Details.ControlEdit", "required": true }, { "$ref": "Setting.Details.ControlButton", "required": true }, - { "$ref": "Setting.Details.ControlList", "required": true } + { "$ref": "Setting.Details.ControlList", "required": true }, + { "$ref": "Setting.Details.ControlSlider", "required": true }, + { "$ref": "Setting.Details.ControlRange", "required": true } ] }, "Setting.Details.Base": { diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt index d36e8d82f3..0bffdbe7af 100644 --- a/xbmc/interfaces/json-rpc/schema/version.txt +++ b/xbmc/interfaces/json-rpc/schema/version.txt @@ -1 +1 @@ -6.15.1 +6.15.2 diff --git a/xbmc/linux/LinuxTimezone.cpp b/xbmc/linux/LinuxTimezone.cpp index f639791d36..cf9ee6c307 100644 --- a/xbmc/linux/LinuxTimezone.cpp +++ b/xbmc/linux/LinuxTimezone.cpp @@ -252,14 +252,14 @@ CStdString CLinuxTimezone::GetOSConfiguredTimezone() return timezoneName; } -void CLinuxTimezone::SettingOptionsTimezoneCountriesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CLinuxTimezone::SettingOptionsTimezoneCountriesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { vector<CStdString> countries = g_timezone.GetCounties(); for (unsigned int i = 0; i < countries.size(); i++) list.push_back(make_pair(countries[i], countries[i])); } -void CLinuxTimezone::SettingOptionsTimezonesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CLinuxTimezone::SettingOptionsTimezonesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { current = ((const CSettingString*)setting)->GetValue(); bool found = false; diff --git a/xbmc/linux/LinuxTimezone.h b/xbmc/linux/LinuxTimezone.h index 393d6aef6b..04d13fda9c 100644 --- a/xbmc/linux/LinuxTimezone.h +++ b/xbmc/linux/LinuxTimezone.h @@ -47,8 +47,8 @@ public: void SetTimezone(CStdString timezone); int m_IsDST; - static void SettingOptionsTimezoneCountriesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsTimezonesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); + static void SettingOptionsTimezoneCountriesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsTimezonesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); private: std::vector<CStdString> m_counties; diff --git a/xbmc/music/windows/GUIWindowMusicNav.cpp b/xbmc/music/windows/GUIWindowMusicNav.cpp index 33a753f8a6..1e6e67625d 100644 --- a/xbmc/music/windows/GUIWindowMusicNav.cpp +++ b/xbmc/music/windows/GUIWindowMusicNav.cpp @@ -19,6 +19,7 @@ */ #include "GUIWindowMusicNav.h" +#include "addons/AddonManager.h" #include "utils/FileUtils.h" #include "utils/URIUtils.h" #include "PlayListPlayer.h" diff --git a/xbmc/network/upnp/Makefile.in b/xbmc/network/upnp/Makefile.in index f0ab298ddb..0dda664a05 100644 --- a/xbmc/network/upnp/Makefile.in +++ b/xbmc/network/upnp/Makefile.in @@ -1,5 +1,6 @@ ifeq (@USE_UPNP@, 1) -INCLUDES+=-I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Core \ +INCLUDES+=-I@abs_top_srcdir@/lib/libUPnP \ + -I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Core \ -I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Platinum \ -I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Devices/MediaConnect \ -I@abs_top_srcdir@/lib/libUPnP/Platinum/Source/Devices/MediaRenderer \ diff --git a/xbmc/network/upnp/UPnP.cpp b/xbmc/network/upnp/UPnP.cpp index 62801a8064..3331301a46 100644 --- a/xbmc/network/upnp/UPnP.cpp +++ b/xbmc/network/upnp/UPnP.cpp @@ -23,6 +23,7 @@ */ #include <set> +#include <Platinum/Source/Platinum/Platinum.h> #include "threads/SystemClock.h" #include "UPnP.h" @@ -35,7 +36,6 @@ #include "ApplicationMessenger.h" #include "network/Network.h" #include "utils/log.h" -#include "Platinum.h" #include "URL.h" #include "profiles/ProfilesManager.h" #include "settings/Settings.h" diff --git a/xbmc/network/upnp/UPnPInternal.cpp b/xbmc/network/upnp/UPnPInternal.cpp index d4b5c4eace..2de930cb9c 100644 --- a/xbmc/network/upnp/UPnPInternal.cpp +++ b/xbmc/network/upnp/UPnPInternal.cpp @@ -17,10 +17,11 @@ * <http://www.gnu.org/licenses/>. * */ +#include <Platinum/Source/Platinum/Platinum.h> + #include "UPnPInternal.h" #include "UPnP.h" #include "UPnPServer.h" -#include "Platinum.h" #include "URL.h" #include "Util.h" #include "settings/AdvancedSettings.h" diff --git a/xbmc/network/upnp/UPnPInternal.h b/xbmc/network/upnp/UPnPInternal.h index 8e9c089d14..f0bbf991a5 100644 --- a/xbmc/network/upnp/UPnPInternal.h +++ b/xbmc/network/upnp/UPnPInternal.h @@ -18,11 +18,12 @@ * */ #pragma once +#include <Neptune/Source/Core/NptTypes.h> +#include <Neptune/Source/Core/NptReferences.h> +#include <Neptune/Source/Core/NptStrings.h> + #include "system.h" #include "utils/StdString.h" -#include "NptTypes.h" -#include "NptReferences.h" -#include "NptStrings.h" #include "FileItem.h" class CUPnPServer; diff --git a/xbmc/network/upnp/UPnPPlayer.cpp b/xbmc/network/upnp/UPnPPlayer.cpp index 4d41d1038e..e7fbf81201 100644 --- a/xbmc/network/upnp/UPnPPlayer.cpp +++ b/xbmc/network/upnp/UPnPPlayer.cpp @@ -18,13 +18,13 @@ * <http://www.gnu.org/licenses/>. * */ +#include <Platinum/Source/Platinum/Platinum.h> +#include <Platinum/Source/Devices/MediaRenderer/PltMediaController.h> +#include <Platinum/Source/Devices/MediaServer/PltDidl.h> #include "UPnPPlayer.h" #include "UPnP.h" #include "UPnPInternal.h" -#include "Platinum.h" -#include "PltMediaController.h" -#include "PltDidl.h" #include "FileItem.h" #include "threads/Event.h" #include "utils/log.h" diff --git a/xbmc/network/upnp/UPnPRenderer.cpp b/xbmc/network/upnp/UPnPRenderer.cpp index 213093a121..1a1754a46b 100644 --- a/xbmc/network/upnp/UPnPRenderer.cpp +++ b/xbmc/network/upnp/UPnPRenderer.cpp @@ -17,11 +17,12 @@ * <http://www.gnu.org/licenses/>. * */ +#include <Platinum/Source/Platinum/Platinum.h> + #include "network/Network.h" #include "UPnPRenderer.h" #include "UPnP.h" #include "UPnPInternal.h" -#include "Platinum.h" #include "Application.h" #include "ApplicationMessenger.h" #include "FileItem.h" diff --git a/xbmc/network/upnp/UPnPRenderer.h b/xbmc/network/upnp/UPnPRenderer.h index cbb08c39cb..9a7dec284a 100644 --- a/xbmc/network/upnp/UPnPRenderer.h +++ b/xbmc/network/upnp/UPnPRenderer.h @@ -18,7 +18,8 @@ * */ #pragma once -#include "PltMediaRenderer.h" +#include <Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h> + #include "interfaces/IAnnouncer.h" namespace UPNP diff --git a/xbmc/network/upnp/UPnPServer.cpp b/xbmc/network/upnp/UPnPServer.cpp index 6096eeb923..06546b1d2e 100644 --- a/xbmc/network/upnp/UPnPServer.cpp +++ b/xbmc/network/upnp/UPnPServer.cpp @@ -17,11 +17,12 @@ * <http://www.gnu.org/licenses/>. * */ +#include <Platinum/Source/Platinum/Platinum.h> + #include "UPnPServer.h" #include "UPnPInternal.h" #include "Application.h" #include "view/GUIViewState.h" -#include "Platinum.h" #include "video/VideoThumbLoader.h" #include "music/Artist.h" #include "music/MusicThumbLoader.h" diff --git a/xbmc/network/upnp/UPnPServer.h b/xbmc/network/upnp/UPnPServer.h index 3ea349a35d..1518be967d 100644 --- a/xbmc/network/upnp/UPnPServer.h +++ b/xbmc/network/upnp/UPnPServer.h @@ -18,7 +18,8 @@ * */ #pragma once -#include "PltMediaConnect.h" +#include <Platinum/Source/Devices/MediaConnect/PltMediaConnect.h> + #include "interfaces/IAnnouncer.h" #include "FileItem.h" diff --git a/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp b/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp index 8da2a9f55c..16b4aed84a 100644 --- a/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp +++ b/xbmc/peripherals/dialogs/GUIDialogPeripheralManager.cpp @@ -95,7 +95,7 @@ bool CGUIDialogPeripheralManager::OpenSettingsDialog(void) CGUIDialogPeripheralSettings *dialog = (CGUIDialogPeripheralSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PERIPHERAL_SETTINGS); if (dialog) { - dialog->SetFileItem(GetCurrentListItem()); + dialog->SetFileItem(GetCurrentListItem().get()); dialog->DoModal(); return true; } diff --git a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp index 95df796df0..4e86cdd056 100644 --- a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp +++ b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp @@ -19,227 +19,213 @@ */ #include "GUIDialogPeripheralSettings.h" +#include "FileItem.h" #include "addons/Skin.h" +#include "dialogs/GUIDialogYesNo.h" #include "peripherals/Peripherals.h" #include "settings/lib/Setting.h" +#include "settings/lib/SettingSection.h" #include "utils/log.h" -#include "video/dialogs/GUIDialogVideoSettings.h" + +#define CONTROL_BUTTON_DEFAULTS 50 using namespace std; using namespace PERIPHERALS; -#define BUTTON_DEFAULTS 50 - -CGUIDialogPeripheralSettings::CGUIDialogPeripheralSettings(void) : - CGUIDialogSettings(WINDOW_DIALOG_PERIPHERAL_SETTINGS, "DialogPeripheralSettings.xml"), +CGUIDialogPeripheralSettings::CGUIDialogPeripheralSettings() + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_PERIPHERAL_SETTINGS, "DialogPeripheralSettings.xml"), m_item(NULL), - m_bIsInitialising(true), - m_settingId(0) -{ -} + m_initialising(false) +{ } -CGUIDialogPeripheralSettings::~CGUIDialogPeripheralSettings(void) +CGUIDialogPeripheralSettings::~CGUIDialogPeripheralSettings() { - if (m_item) + if (m_item != NULL) delete m_item; + + m_settingsMap.clear(); } -void CGUIDialogPeripheralSettings::SetFileItem(CFileItemPtr item) +bool CGUIDialogPeripheralSettings::OnMessage(CGUIMessage &message) { - if (m_item) + if (message.GetMessage() == GUI_MSG_CLICKED && + message.GetSenderId() == CONTROL_BUTTON_DEFAULTS) { - delete m_item; - m_boolSettings.clear(); - m_intSettings.clear(); - m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); + OnResetSettings(); + return true; } - m_item = new CFileItem(*item.get()); + return CGUIDialogSettingsManualBase::OnMessage(message); } -void CGUIDialogPeripheralSettings::CreateSettings() +void CGUIDialogPeripheralSettings::SetFileItem(const CFileItem *item) { - m_bIsInitialising = true; - m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml"); + if (item == NULL) + return; - if (m_item) - { - CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); - if (peripheral) - { - vector<CSetting *> settings = peripheral->GetSettings(); - for (size_t iPtr = 0; iPtr < settings.size(); iPtr++) - { - CSetting *setting = settings[iPtr]; - if (!setting->IsVisible()) - { - CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); - continue; - } - - switch(setting->GetType()) - { - case SettingTypeBool: - { - CSettingBool *boolSetting = (CSettingBool *) setting; - if (boolSetting) - { - m_boolSettings.insert(make_pair(CStdString(boolSetting->GetId()), boolSetting->GetValue())); - AddBool(m_settingId++, boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetId()], true); - } - } - break; - case SettingTypeInteger: - { - CSettingInt *intSetting = (CSettingInt *) setting; - if (intSetting) - { - if (intSetting->GetOptions().empty()) - { - 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 - { - m_intTextSettings.insert(make_pair(CStdString(intSetting->GetId()), intSetting->GetValue())); - vector<pair<int, int> > entries; - StaticIntegerSettingOptions::const_iterator entriesItr = intSetting->GetOptions().begin(); - while (entriesItr != intSetting->GetOptions().end()) - { - entries.push_back(make_pair(entriesItr->first, entriesItr->second)); - ++entriesItr; - } - AddSpin(m_settingId++, intSetting->GetLabel(), &m_intTextSettings[intSetting->GetId()], entries); - } - } - } - break; - case SettingTypeNumber: - { - CSettingNumber *floatSetting = (CSettingNumber *) setting; - if (floatSetting) - { - m_floatSettings.insert(make_pair(CStdString(floatSetting->GetId()), (float)floatSetting->GetValue())); - AddSlider(m_settingId++, floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetId()], (float)floatSetting->GetMinimum(), (float)floatSetting->GetStep(), (float)floatSetting->GetMaximum(), CGUIDialogVideoSettings::FormatFloat, false); - } - } - break; - case SettingTypeString: - { - CSettingString *stringSetting = (CSettingString *) setting; - if (stringSetting) - { - m_stringSettings.insert(make_pair(CStdString(stringSetting->GetId()), stringSetting->GetValue())); - AddString(m_settingId++, stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetId()]); - } - } - break; - default: - //TODO add more types if needed - CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); - break; - } - } - } - else - { - CLog::Log(LOGDEBUG, "%s - no peripheral", __FUNCTION__); - } - } + if (m_item != NULL) + delete m_item; - m_bIsInitialising = false; + m_item = new CFileItem(*item); } -void CGUIDialogPeripheralSettings::UpdatePeripheralSettings(void) +void CGUIDialogPeripheralSettings::OnSettingChanged(const CSetting *setting) { - if (!m_item || m_bIsInitialising) + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + // we need to copy the new value of the setting from the copy to the + // original setting + std::map<std::string, CSetting*>::iterator itSetting = m_settingsMap.find(setting->GetId()); + if (itSetting == m_settingsMap.end()) + return; + + itSetting->second->FromString(setting->ToString()); +} + +void CGUIDialogPeripheralSettings::Save() +{ + if (m_item == NULL || m_initialising) return; CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); - if (!peripheral) + if (peripheral == NULL) return; - map<CStdString, bool>::iterator boolItr = m_boolSettings.begin(); - while (boolItr != m_boolSettings.end()) - { - peripheral->SetSetting((*boolItr).first, (*boolItr).second); - ++boolItr; - } + peripheral->PersistSettings(); +} + +void CGUIDialogPeripheralSettings::OnResetSettings() +{ + if (m_item == NULL) + return; + + CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); + if (peripheral == NULL) + return; + + if (!CGUIDialogYesNo::ShowAndGetInput(10041, 0, 10042, 0)) + return; + + // reset the settings in the peripheral + peripheral->ResetDefaultSettings(); - map<CStdString, float>::iterator intItr = m_intSettings.begin(); - while (intItr != m_intSettings.end()) + // re-create all settings and their controls + SetupView(); +} + +void CGUIDialogPeripheralSettings::InitializeSettings() +{ + if (m_item == NULL) { - peripheral->SetSetting((*intItr).first, (int) (*intItr).second); - ++intItr; + m_initialising = false; + return; } - map<CStdString, int>::iterator intTextItr = m_intTextSettings.begin(); - while (intTextItr != m_intTextSettings.end()) + m_initialising = true; + bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); + + CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); + if (peripheral == NULL) { - peripheral->SetSetting((*intTextItr).first, (*intTextItr).second); - ++intTextItr; + CLog::Log(LOGDEBUG, "%s - no peripheral", __FUNCTION__); + m_initialising = false; + return; } - map<CStdString, float>::iterator floatItr = m_floatSettings.begin(); - while (floatItr != m_floatSettings.end()) + m_settingsMap.clear(); + CGUIDialogSettingsManualBase::InitializeSettings(); + + CSettingCategory *category = AddCategory("peripheralsettings", -1); + if (category == NULL) { - peripheral->SetSetting((*floatItr).first, (*floatItr).second); - ++floatItr; + CLog::Log(LOGERROR, "CGUIDialogPeripheralSettings: unable to setup settings"); + return; } - map<CStdString, CStdString>::iterator stringItr = m_stringSettings.begin(); - while (stringItr != m_stringSettings.end()) + CSettingGroup *group = AddGroup(category); + if (group == NULL) { - peripheral->SetSetting((*stringItr).first, (*stringItr).second); - ++stringItr; + CLog::Log(LOGERROR, "CGUIDialogPeripheralSettings: unable to setup settings"); + return; } + + vector<CSetting*> settings = peripheral->GetSettings(); + for (vector<CSetting*>::iterator itSetting = settings.begin(); itSetting != settings.end(); ++itSetting) + { + CSetting *setting = *itSetting; + if (setting == NULL) + continue; - peripheral->PersistSettings(); -} + if (!setting->IsVisible()) + { + CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); + continue; + } -bool CGUIDialogPeripheralSettings::OnMessage(CGUIMessage &message) -{ - if (message.GetMessage() == GUI_MSG_CLICKED && - message.GetSenderId() == BUTTON_DEFAULTS) - { - ResetDefaultSettings(); - return true; - } + // we need to create a copy of the setting because the CSetting instances + // are destroyed when leaving the dialog + CSetting *settingCopy = NULL; + switch(setting->GetType()) + { + case SettingTypeBool: + { + CSettingBool *settingBool = new CSettingBool(setting->GetId(), *static_cast<CSettingBool*>(setting)); + settingBool->SetControl(GetCheckmarkControl()); - return CGUIDialogSettings::OnMessage(message); -} + settingCopy = static_cast<CSetting*>(settingBool); + break; + } -void CGUIDialogPeripheralSettings::OnOkay(void) -{ - UpdatePeripheralSettings(); -} + case SettingTypeInteger: + { + CSettingInt *intSetting = static_cast<CSettingInt*>(setting); + if (intSetting == NULL) + break; + + CSettingInt *settingInt = new CSettingInt(setting->GetId(), *intSetting); + if (settingInt->GetOptions().empty()) + settingInt->SetControl(GetSliderControl("integer", false, -1, usePopup, -1, "%i")); + else + settingInt->SetControl(GetSpinnerControl("string")); + + settingCopy = static_cast<CSetting*>(settingInt); + break; + } -void CGUIDialogPeripheralSettings::ResetDefaultSettings(void) -{ - if (m_item) - { - CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); - if (!peripheral) - return; - - /* reset the settings in the peripheral */ - peripheral->ResetDefaultSettings(); - - CSingleLock lock(g_graphicsContext); - - /* clear the settings */ - m_boolSettings.clear(); - m_intSettings.clear(); - m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); - - /* reinit the window */ - CreateSettings(); - SetupPage(); // will clear the previous controls first + case SettingTypeNumber: + { + CSettingNumber *settingNumber = new CSettingNumber(setting->GetId(), *static_cast<CSettingNumber*>(setting)); + settingNumber->SetControl(GetSliderControl("number", false, -1, usePopup, -1, "%2.2f")); + + settingCopy = static_cast<CSetting*>(settingNumber); + break; + } + + case SettingTypeString: + { + CSettingString *settingString = new CSettingString(setting->GetId(), *static_cast<CSettingString*>(setting)); + settingString->SetControl(GetEditControl("string")); + + settingCopy = static_cast<CSetting*>(settingString); + break; + } + + default: + // TODO: add more types if needed + CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); + break; + } + + if (settingCopy != NULL && settingCopy->GetControl() != NULL) + { + settingCopy->SetLevel(SettingLevelBasic); + group->AddSetting(settingCopy); + m_settingsMap.insert(std::make_pair(setting->GetId(), setting)); + } } + + m_initialising = false; } diff --git a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h index 60fee01f2f..373bd5bfbc 100644 --- a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h +++ b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h @@ -1,6 +1,6 @@ #pragma once /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -19,33 +19,37 @@ * */ -#include "guilib/GUIDialog.h" -#include "settings/dialogs/GUIDialogSettings.h" -#include "FileItem.h" +#include "settings/dialogs/GUIDialogSettingsManualBase.h" + +class CFileItem; namespace PERIPHERALS { - class CGUIDialogPeripheralSettings : public CGUIDialogSettings - { - public: - CGUIDialogPeripheralSettings(void); - virtual ~CGUIDialogPeripheralSettings(void); - - virtual void SetFileItem(CFileItemPtr item); - virtual bool OnMessage(CGUIMessage &message); - protected: - virtual void CreateSettings(); - virtual void OnOkay(void); - virtual void ResetDefaultSettings(void); - virtual void UpdatePeripheralSettings(void); - - CFileItem * m_item; - bool m_bIsInitialising; - std::map<CStdString, bool> m_boolSettings; - std::map<CStdString, float> m_intSettings; - std::map<CStdString, int> m_intTextSettings; - std::map<CStdString, float> m_floatSettings; - std::map<CStdString, CStdString> m_stringSettings; - int m_settingId; - }; +class CGUIDialogPeripheralSettings : public CGUIDialogSettingsManualBase +{ +public: + CGUIDialogPeripheralSettings(); + virtual ~CGUIDialogPeripheralSettings(); + + // specializations of CGUIControl + virtual bool OnMessage(CGUIMessage &message); + + virtual void SetFileItem(const CFileItem *item); + +protected: + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save(); + virtual void OnResetSettings(); + + // specialization of CGUIDialogSettingsManualBase + virtual void InitializeSettings(); + + CFileItem *m_item; + bool m_initialising; + std::map<std::string, CSetting*> m_settingsMap; +}; } diff --git a/xbmc/powermanagement/PowerManager.cpp b/xbmc/powermanagement/PowerManager.cpp index 35b5a2182f..7090b278ca 100644 --- a/xbmc/powermanagement/PowerManager.cpp +++ b/xbmc/powermanagement/PowerManager.cpp @@ -295,7 +295,7 @@ void CPowerManager::OnLowBattery() CAnnouncementManager::Announce(System, "xbmc", "OnLowBattery"); } -void CPowerManager::SettingOptionsShutdownStatesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CPowerManager::SettingOptionsShutdownStatesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { if (g_powerManager.CanPowerdown()) list.push_back(make_pair(g_localizeStrings.Get(13005), POWERSTATE_SHUTDOWN)); diff --git a/xbmc/powermanagement/PowerManager.h b/xbmc/powermanagement/PowerManager.h index 789dd7a863..0b1f10a9a8 100644 --- a/xbmc/powermanagement/PowerManager.h +++ b/xbmc/powermanagement/PowerManager.h @@ -85,7 +85,7 @@ public: void ProcessEvents(); - static void SettingOptionsShutdownStatesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); + static void SettingOptionsShutdownStatesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); private: void OnSleep(); diff --git a/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp b/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp index 3cbef55f5e..864b4fef5a 100644 --- a/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp +++ b/xbmc/profiles/dialogs/GUIDialogLockSettings.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -19,125 +19,146 @@ */ #include "GUIDialogLockSettings.h" -#include "dialogs/GUIDialogNumeric.h" -#include "guilib/GUIKeyboardFactory.h" -#include "dialogs/GUIDialogGamepad.h" +#include "URL.h" #include "dialogs/GUIDialogContextMenu.h" +#include "dialogs/GUIDialogGamepad.h" +#include "guilib/GUIKeyboardFactory.h" +#include "dialogs/GUIDialogNumeric.h" #include "guilib/GUIWindowManager.h" -#include "URL.h" #include "guilib/LocalizeStrings.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingSection.h" +#include "settings/windows/GUIControlSettings.h" +#include "utils/log.h" #include "utils/StringUtils.h" -CGUIDialogLockSettings::CGUIDialogLockSettings(void) - : CGUIDialogSettings(WINDOW_DIALOG_LOCK_SETTINGS, "LockSettings.xml") -{ -} +#define SETTING_USERNAME "user.name" +#define SETTING_PASSWORD "user.password" +#define SETTING_PASSWORD_REMEMBER "user.rememberpassword" -CGUIDialogLockSettings::~CGUIDialogLockSettings(void) +#define SETTING_LOCKCODE "lock.code" +#define SETTING_LOCK_MUSIC "lock.music" +#define SETTING_LOCK_VIDEOS "lock.videos" +#define SETTING_LOCK_PICTURES "lock.pictures" +#define SETTING_LOCK_PROGRAMS "lock.programs" +#define SETTING_LOCK_FILEMANAGER "lock.filemanager" +#define SETTING_LOCK_SETTINGS "lock.settings" +#define SETTING_LOCK_ADDONMANAGER "lock.addonmanager" -{ -} +CGUIDialogLockSettings::CGUIDialogLockSettings() + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_LOCK_SETTINGS, "LockSettings.xml"), + m_changed(false), + m_details(true), + m_conditionalDetails(false), + m_getUser(false), + m_saveUserDetails(NULL), + m_buttonLabel(20091) +{ } -void CGUIDialogLockSettings::OnCancel() +CGUIDialogLockSettings::~CGUIDialogLockSettings() +{ } + +bool CGUIDialogLockSettings::ShowAndGetLock(LockType &lockMode, std::string &password, int header /* = 20091 */) { - m_bChanged = false; + CProfile::CLock locks(lockMode, password); + if (!ShowAndGetLock(locks, header, false, false)) + return false; + + locks.Validate(); + lockMode = locks.mode; + password = locks.code; + + return true; } -void CGUIDialogLockSettings::SetupPage() +bool CGUIDialogLockSettings::ShowAndGetLock(CProfile::CLock &locks, int buttonLabel /* = 20091 */, bool conditional /* = false */, bool details /* = true */) { - CGUIDialogSettings::SetupPage(); - // update our settings label - if (m_bGetUser) - { - CStdString strLabel2(CURL::Decode(m_strURL)); - CStdString strLabel = StringUtils::Format(g_localizeStrings.Get(20152), strLabel2.c_str()); - SET_CONTROL_LABEL(2, strLabel); - } - else - SET_CONTROL_LABEL(2,g_localizeStrings.Get(20066)); - SET_CONTROL_HIDDEN(3); + CGUIDialogLockSettings *dialog = static_cast<CGUIDialogLockSettings*>(g_windowManager.GetWindow(WINDOW_DIALOG_LOCK_SETTINGS)); + if (dialog == NULL) + return false; + + dialog->m_locks = locks; + dialog->m_buttonLabel = buttonLabel; + dialog->m_getUser = false; + dialog->m_conditionalDetails = conditional; + dialog->m_details = details; + dialog->DoModal(); + + if (!dialog->m_changed) + return false; + + locks = dialog->m_locks; + return true; } -void CGUIDialogLockSettings::EnableDetails(bool bEnable) +bool CGUIDialogLockSettings::ShowAndGetUserAndPassword(std::string &user, std::string &password, const std::string &url, bool *saveUserDetails) { - for (int i=2;i<9;++i) - { - m_settings[i].enabled = bEnable || !m_bConditionalDetails; - UpdateSetting(i+1); - } + CGUIDialogLockSettings *dialog = static_cast<CGUIDialogLockSettings*>(g_windowManager.GetWindow(WINDOW_DIALOG_LOCK_SETTINGS)); + if (dialog == NULL) + return false; + + dialog->m_getUser = true; + dialog->m_locks.code = password; + dialog->m_user = user; + dialog->m_url = url; + dialog->m_saveUserDetails = saveUserDetails; + dialog->DoModal(); + + if (!dialog->m_changed) + return false; + + user = dialog->m_user; + password = dialog->m_locks.code; + return true; } -void CGUIDialogLockSettings::CreateSettings() +void CGUIDialogLockSettings::OnSettingChanged(const CSetting *setting) { - // clear out any old settings - m_settings.clear(); - // create our settings - if (m_bGetUser) - { - AddButton(1,20142); - if (!m_strUser.empty()) - m_settings[0].name = StringUtils::Format("%s (%s)",g_localizeStrings.Get(20142).c_str(),m_strUser.c_str()); - AddButton(2,12326); - if (!m_locks.code.empty()) - m_settings[1].name = StringUtils::Format("%s (%s)",g_localizeStrings.Get(12326).c_str(),g_localizeStrings.Get(20141).c_str()); - if (m_saveUserDetails) - AddBool(3, 13423, m_saveUserDetails); + if (setting == NULL) return; - } - AddButton(1,m_iButtonLabel); - if (m_locks.mode > LOCK_MODE_QWERTY) - m_locks.mode = LOCK_MODE_EVERYONE; - if (m_locks.mode != LOCK_MODE_EVERYONE) - m_settings[0].name = StringUtils::Format("%s (%s)", g_localizeStrings.Get(m_iButtonLabel).c_str(), g_localizeStrings.Get(12336+m_locks.mode).c_str()); - else - m_settings[0].name = StringUtils::Format("%s (%s)", g_localizeStrings.Get(m_iButtonLabel).c_str(), g_localizeStrings.Get(1223).c_str()); - if (m_bDetails) - { - AddSeparator(2); - AddBool(3,20038,&m_locks.music); - AddBool(4,20039,&m_locks.video); - AddBool(5,20040,&m_locks.pictures); - AddBool(6,20041,&m_locks.programs); - AddBool(7,20042,&m_locks.files); - - std::vector<std::pair<int, int> > settingsLevelOptions; - settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::NONE, 106)); - settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::ALL, 593)); - settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::STANDARD, 10037)); - settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::ADVANCED, 10038)); - settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::EXPERT, 10039)); - AddSpin(8, 20043, (int*)&m_locks.settings, settingsLevelOptions); - - AddBool(9,24090,&m_locks.addonManager); - EnableDetails(m_locks.mode != LOCK_MODE_EVERYONE); - } + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_USERNAME) + m_user = static_cast<const CSettingString*>(setting)->GetValue(); + else if (settingId == SETTING_PASSWORD) + m_locks.code = static_cast<const CSettingString*>(setting)->GetValue(); + else if (settingId == SETTING_PASSWORD_REMEMBER) + *m_saveUserDetails = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_LOCK_MUSIC) + m_locks.music = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_LOCK_VIDEOS) + m_locks.video = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_LOCK_PICTURES) + m_locks.pictures = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_LOCK_PROGRAMS) + m_locks.programs = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_LOCK_FILEMANAGER) + m_locks.files = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_LOCK_SETTINGS) + m_locks.settings = static_cast<LOCK_LEVEL::SETTINGS_LOCK>(static_cast<const CSettingInt*>(setting)->GetValue()); + else if (settingId == SETTING_LOCK_ADDONMANAGER) + m_locks.addonManager = static_cast<const CSettingBool*>(setting)->GetValue(); + + m_changed = true; } -void CGUIDialogLockSettings::OnSettingChanged(SettingInfo &setting) +void CGUIDialogLockSettings::OnSettingAction(const CSetting *setting) { - // check and update anything that needs it - if (setting.id == 1) + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingAction(setting); + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_LOCKCODE) { - if (m_bGetUser) - { - CStdString strHeading; - CStdString strDecodeUrl(CURL::Decode(m_strURL)); - strHeading = StringUtils::Format("%s %s", g_localizeStrings.Get(14062).c_str(), strDecodeUrl.c_str()); - if (CGUIKeyboardFactory::ShowAndGetInput(m_strUser,strHeading,true)) - { - m_bChanged = true; - m_settings[0].name = StringUtils::Format("%s (%s)", g_localizeStrings.Get(20142).c_str(), m_strUser.c_str()); - UpdateSetting(1); - } - return; - } CContextButtons choices; choices.Add(1, 1223); choices.Add(2, 12337); choices.Add(3, 12338); choices.Add(4, 12339); - int choice = CGUIDialogContextMenu::ShowAndGetChoice(choices); CStdString newPassword; @@ -145,25 +166,30 @@ void CGUIDialogLockSettings::OnSettingChanged(SettingInfo &setting) bool bResult = false; switch(choice) { - case 1: - iLockMode = LOCK_MODE_EVERYONE; //Disabled! Need check routine!!! - bResult = true; - break; - case 2: - iLockMode = LOCK_MODE_NUMERIC; - bResult = CGUIDialogNumeric::ShowAndVerifyNewPassword(newPassword); - break; - case 3: - iLockMode = LOCK_MODE_GAMEPAD; - bResult = CGUIDialogGamepad::ShowAndVerifyNewPassword(newPassword); - break; - case 4: - iLockMode = LOCK_MODE_QWERTY; - bResult = CGUIKeyboardFactory::ShowAndVerifyNewPassword(newPassword); - break; - default: - break; + case 1: + iLockMode = LOCK_MODE_EVERYONE; //Disabled! Need check routine!!! + bResult = true; + break; + + case 2: + iLockMode = LOCK_MODE_NUMERIC; + bResult = CGUIDialogNumeric::ShowAndVerifyNewPassword(newPassword); + break; + + case 3: + iLockMode = LOCK_MODE_GAMEPAD; + bResult = CGUIDialogGamepad::ShowAndVerifyNewPassword(newPassword); + break; + + case 4: + iLockMode = LOCK_MODE_QWERTY; + bResult = CGUIKeyboardFactory::ShowAndVerifyNewPassword(newPassword); + break; + + default: + break; } + if (bResult) { if (iLockMode == LOCK_MODE_EVERYONE) @@ -172,83 +198,116 @@ void CGUIDialogLockSettings::OnSettingChanged(SettingInfo &setting) if (m_locks.code == "-") iLockMode = LOCK_MODE_EVERYONE; m_locks.mode = iLockMode; - if (m_bDetails) - EnableDetails(m_locks.mode != LOCK_MODE_EVERYONE); - m_bChanged = true; - if (m_locks.mode != LOCK_MODE_EVERYONE) - setting.name = StringUtils::Format("%s (%s)",g_localizeStrings.Get(m_iButtonLabel).c_str(),g_localizeStrings.Get(12336+m_locks.mode).c_str()); - else - setting.name = StringUtils::Format("%s (%s)",g_localizeStrings.Get(m_iButtonLabel).c_str(),g_localizeStrings.Get(1223).c_str()); - - UpdateSetting(1); - } - } - if (setting.id == 2 && m_bGetUser) - { - CStdString strDecodeUrl(CURL::Decode(m_strURL)); - CStdString strHeading = StringUtils::Format("%s %s", g_localizeStrings.Get(20143).c_str(), strDecodeUrl.c_str()); - if (CGUIKeyboardFactory::ShowAndGetInput(m_locks.code,strHeading,true,true)) - { - m_settings[1].name = StringUtils::Format("%s (%s)", g_localizeStrings.Get(12326).c_str(), g_localizeStrings.Get(20141).c_str()); - m_bChanged = true; - UpdateSetting(2); + + setLockCodeLabel(); + setDetailSettingsEnabled(m_locks.mode != LOCK_MODE_EVERYONE); + m_changed = true; } - return; } - if (setting.id > 1) - m_bChanged = true; } -bool CGUIDialogLockSettings::ShowAndGetUserAndPassword(CStdString& strUser, CStdString& strPassword, const CStdString& strURL, bool *saveUserDetails) +void CGUIDialogLockSettings::OnCancel() { - CGUIDialogLockSettings *dialog = (CGUIDialogLockSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_LOCK_SETTINGS); - if (!dialog) return false; - dialog->m_bGetUser = true; - dialog->m_locks.code = strPassword; - dialog->m_strUser = strUser; - dialog->m_strURL = strURL; - dialog->m_bChanged = false; - dialog->m_saveUserDetails = saveUserDetails; - dialog->DoModal(); - if (dialog->m_bChanged) - { - strUser = dialog->m_strUser; - strPassword = dialog->m_locks.code; - return true; - } + m_changed = false; - return false; + CGUIDialogSettingsManualBase::OnCancel(); } -bool CGUIDialogLockSettings::ShowAndGetLock(LockType& iLockMode, CStdString& strPassword, int iHeader) +void CGUIDialogLockSettings::SetupView() { - CProfile::CLock locks(iLockMode, strPassword); - if (ShowAndGetLock(locks, iHeader, false, false)) + CGUIDialogSettingsManualBase::SetupView(); + + // set the title + if (m_getUser) + SetHeading(StringUtils::Format(g_localizeStrings.Get(20152).c_str(), CURL::Decode(m_url).c_str())); + else { - locks.Validate(); - iLockMode = locks.mode; - strPassword = locks.code; - return true; + SetHeading(20066); + setLockCodeLabel(); + setDetailSettingsEnabled(m_locks.mode != LOCK_MODE_EVERYONE); } - return false; } -bool CGUIDialogLockSettings::ShowAndGetLock(CProfile::CLock &locks, int iButtonLabel, bool bConditional, bool bDetails) +void CGUIDialogLockSettings::InitializeSettings() { - CGUIDialogLockSettings *dialog = (CGUIDialogLockSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_LOCK_SETTINGS); - if (!dialog) return false; - dialog->m_locks = locks; - dialog->m_iButtonLabel = iButtonLabel; - dialog->m_bChanged = false; - dialog->m_bGetUser = false; - dialog->m_bConditionalDetails = bConditional; - dialog->m_bDetails = bDetails; - dialog->DoModal(); - if (dialog->m_bChanged) + CGUIDialogSettingsManualBase::InitializeSettings(); + + CSettingCategory *category = AddCategory("locksettings", -1); + if (category == NULL) { - locks = dialog->m_locks; - return true; + CLog::Log(LOGERROR, "CGUIDialogLockSettings: unable to setup settings"); + return; + } + + CSettingGroup *group = AddGroup(category); + if (group == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogLockSettings: unable to setup settings"); + return; } - return false; + if (m_getUser) + { + AddEdit(group, SETTING_USERNAME, 20142, 0, m_user); + AddEdit(group, SETTING_PASSWORD, 12326, 0, m_locks.code, false, true); + if (m_saveUserDetails != NULL) + AddToggle(group, SETTING_PASSWORD_REMEMBER, 13423, 0, *m_saveUserDetails); + + return; + } + + AddButton(group, SETTING_LOCKCODE, m_buttonLabel, 0); + + if (m_details) + { + CSettingGroup *groupDetails = AddGroup(category); + if (groupDetails == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogLockSettings: unable to setup settings"); + return; + } + + AddToggle(groupDetails, SETTING_LOCK_MUSIC, 20038, 0, m_locks.music); + AddToggle(groupDetails, SETTING_LOCK_VIDEOS, 20039, 0, m_locks.video); + AddToggle(groupDetails, SETTING_LOCK_PICTURES, 20040, 0, m_locks.pictures); + AddToggle(groupDetails, SETTING_LOCK_PROGRAMS, 20041, 0, m_locks.programs); + AddToggle(groupDetails, SETTING_LOCK_FILEMANAGER, 20042, 0, m_locks.files); + + StaticIntegerSettingOptions settingsLevelOptions; + settingsLevelOptions.push_back(std::make_pair(106, LOCK_LEVEL::NONE)); + settingsLevelOptions.push_back(std::make_pair(593, LOCK_LEVEL::ALL)); + settingsLevelOptions.push_back(std::make_pair(10037, LOCK_LEVEL::STANDARD)); + settingsLevelOptions.push_back(std::make_pair(10038, LOCK_LEVEL::ADVANCED)); + settingsLevelOptions.push_back(std::make_pair(10039, LOCK_LEVEL::EXPERT)); + AddSpinner(groupDetails, SETTING_LOCK_SETTINGS, 20043, 0, static_cast<int>(m_locks.settings), settingsLevelOptions); + + AddToggle(groupDetails, SETTING_LOCK_ADDONMANAGER, 24090, 0, m_locks.addonManager); + } + + m_changed = false; +} + +void CGUIDialogLockSettings::setDetailSettingsEnabled(bool enabled) +{ + if (!m_details) + return; + + enabled |= !m_conditionalDetails; + GetSettingControl(SETTING_LOCK_MUSIC)->GetSetting()->SetEnabled(enabled); + GetSettingControl(SETTING_LOCK_VIDEOS)->GetSetting()->SetEnabled(enabled); + GetSettingControl(SETTING_LOCK_PICTURES)->GetSetting()->SetEnabled(enabled); + GetSettingControl(SETTING_LOCK_PROGRAMS)->GetSetting()->SetEnabled(enabled); + GetSettingControl(SETTING_LOCK_FILEMANAGER)->GetSetting()->SetEnabled(enabled); + GetSettingControl(SETTING_LOCK_SETTINGS)->GetSetting()->SetEnabled(enabled); + GetSettingControl(SETTING_LOCK_ADDONMANAGER)->GetSetting()->SetEnabled(enabled); +} + +void CGUIDialogLockSettings::setLockCodeLabel() +{ + // adjust label2 of the lock code button + if (m_locks.mode > LOCK_MODE_QWERTY) + m_locks.mode = LOCK_MODE_EVERYONE; + BaseSettingControlPtr settingControl = GetSettingControl(SETTING_LOCKCODE); + if (settingControl != NULL && settingControl->GetControl() != NULL) + SET_CONTROL_LABEL2(settingControl->GetID(), g_localizeStrings.Get(m_locks.mode == LOCK_MODE_EVERYONE ? 1223 : 12336 + m_locks.mode)); } diff --git a/xbmc/profiles/dialogs/GUIDialogLockSettings.h b/xbmc/profiles/dialogs/GUIDialogLockSettings.h index 1ef5bf196f..7110b4682d 100644 --- a/xbmc/profiles/dialogs/GUIDialogLockSettings.h +++ b/xbmc/profiles/dialogs/GUIDialogLockSettings.h @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -22,32 +22,44 @@ #include "GUIPassword.h" #include "profiles/Profile.h" -#include "settings/dialogs/GUIDialogSettings.h" +#include "settings/dialogs/GUIDialogSettingsManualBase.h" -class CGUIDialogLockSettings : public CGUIDialogSettings +class CGUIDialogLockSettings : public CGUIDialogSettingsManualBase { public: - CGUIDialogLockSettings(void); - virtual ~CGUIDialogLockSettings(void); - static bool ShowAndGetLock(LockType& iLockMode, CStdString& strPassword, int iHeader=20091); - static bool ShowAndGetLock(CProfile::CLock &locks, int iButtonLabel = 20091, bool bConditional = false, bool bDetails = true); - static bool ShowAndGetUserAndPassword(CStdString& strUser, CStdString& strPassword, const CStdString& strURL, bool *saveUserDetails); + CGUIDialogLockSettings(); + virtual ~CGUIDialogLockSettings(); + + static bool ShowAndGetLock(LockType &lockMode, std::string &password, int header = 20091); + static bool ShowAndGetLock(CProfile::CLock &locks, int buttonLabel = 20091, bool conditional = false, bool details = true); + static bool ShowAndGetUserAndPassword(std::string &user, std::string &password, const std::string &url, bool *saveUserDetails); + protected: + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save() { } virtual void OnCancel(); - virtual void SetupPage(); - virtual void CreateSettings(); - virtual void OnSettingChanged(SettingInfo &setting); - void EnableDetails(bool bEnable); + virtual void SetupView(); - CProfile::CLock m_locks; - CStdString m_strUser; - CStdString m_strURL; - bool m_bChanged; - bool m_bDetails; - bool m_bConditionalDetails; - bool m_bGetUser; - int m_iButtonLabel; - bool *m_saveUserDetails; -}; + // specialization of CGUIDialogSettingsManualBase + virtual void InitializeSettings(); + +private: + void setDetailSettingsEnabled(bool enabled); + void setLockCodeLabel(); + bool m_changed; + CProfile::CLock m_locks; + std::string m_user; + std::string m_url; + bool m_details; + bool m_conditionalDetails; + bool m_getUser; + bool* m_saveUserDetails; + int m_buttonLabel; +};
\ No newline at end of file diff --git a/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp b/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp index 1150a4ac03..0791886e4f 100644 --- a/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp +++ b/xbmc/profiles/dialogs/GUIDialogProfileSettings.cpp @@ -19,366 +19,389 @@ */ #include "GUIDialogProfileSettings.h" +#include "FileItem.h" +#include "GUIPassword.h" +#include "Util.h" #include "dialogs/GUIDialogFileBrowser.h" +#include "dialogs/GUIDialogYesNo.h" +#include "filesystem/Directory.h" +#include "filesystem/File.h" +#include "guilib/GUIImage.h" #include "guilib/GUIKeyboardFactory.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/LocalizeStrings.h" #include "profiles/ProfilesManager.h" #include "profiles/dialogs/GUIDialogLockSettings.h" -#include "guilib/GUIImage.h" -#include "guilib/GUIWindowManager.h" +#include "settings/lib/Setting.h" #include "storage/MediaManager.h" -#include "Util.h" +#include "utils/log.h" #include "utils/URIUtils.h" -#include "GUIPassword.h" -#include "dialogs/GUIDialogYesNo.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "FileItem.h" -#include "settings/Settings.h" -#include "guilib/LocalizeStrings.h" -#include "TextureCache.h" -using namespace XFILE; +#define CONTROL_PROFILE_IMAGE CONTROL_SETTINGS_CUSTOM + 1 +#define CONTROL_PROFILE_NAME CONTROL_SETTINGS_CUSTOM + 2 +#define CONTROL_PROFILE_DIRECTORY CONTROL_SETTINGS_CUSTOM + 3 -#define CONTROL_PROFILE_IMAGE 2 -#define CONTROL_START 30 +#define SETTING_PROFILE_NAME "profile.name" +#define SETTING_PROFILE_IMAGE "profile.image" +#define SETTING_PROFILE_DIRECTORY "profile.directory" +#define SETTING_PROFILE_LOCKS "profile.locks" +#define SETTING_PROFILE_MEDIA "profile.media" +#define SETTING_PROFILE_MEDIA_SOURCES "profile.mediasources" -CGUIDialogProfileSettings::CGUIDialogProfileSettings(void) - : CGUIDialogSettings(WINDOW_DIALOG_PROFILE_SETTINGS, "ProfileSettings.xml") -{ - m_bNeedSave = false; -} +CGUIDialogProfileSettings::CGUIDialogProfileSettings() + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_PROFILE_SETTINGS, "ProfileSettings.xml"), + m_needsSaving(false) +{ } -CGUIDialogProfileSettings::~CGUIDialogProfileSettings(void) -{ -} +CGUIDialogProfileSettings::~CGUIDialogProfileSettings() +{ } -bool CGUIDialogProfileSettings::OnMessage(CGUIMessage &message) +bool CGUIDialogProfileSettings::ShowForProfile(unsigned int iProfile, bool firstLogin) { - if (message.GetMessage() == GUI_MSG_CLICKED) + if (firstLogin && iProfile > CProfilesManager::Get().GetNumberOfProfiles()) + return false; + + CGUIDialogProfileSettings *dialog = (CGUIDialogProfileSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PROFILE_SETTINGS); + if (dialog == NULL) + return false; + + dialog->m_needsSaving = false; + dialog->m_isDefault = iProfile == 0; + dialog->m_showDetails = !firstLogin; + + const CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); + if (profile == NULL) { - int iControl = message.GetSenderId(); - if (iControl == 500) - Close(); - if (iControl == 501) + dialog->m_name.clear(); + dialog->m_dbMode = 2; + dialog->m_sourcesMode = 2; + dialog->m_locks = CProfile::CLock(); + + bool bLock = CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser; + dialog->m_locks.addonManager = bLock; + dialog->m_locks.settings = (bLock) ? LOCK_LEVEL::ALL : LOCK_LEVEL::NONE; + dialog->m_locks.files = bLock; + + dialog->m_directory.clear(); + dialog->m_thumb.clear(); + + // prompt for a name + CStdString profileName; + if (!CGUIKeyboardFactory::ShowAndGetInput(profileName, g_localizeStrings.Get(20093),false) || profileName.empty()) + return false; + dialog->m_name = profileName; + + // create a default path + std::string defaultDir = URIUtils::AddFileToFolder("profiles", CUtil::MakeLegalFileName(dialog->m_name)); + URIUtils::AddSlashAtEnd(defaultDir); + XFILE::CDirectory::Create(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); + + // prompt for the user to change it if they want + std::string userDir = defaultDir; + if (GetProfilePath(userDir, false)) // can't be the master user { - m_bNeedSave = false; - Close(); + if (!StringUtils::StartsWith(userDir, defaultDir)) // user chose a different folder + XFILE::CDirectory::Remove(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); } + dialog->m_directory = userDir; + dialog->m_needsSaving = true; } - return CGUIDialogSettings::OnMessage(message); -} + else + { + dialog->m_name = profile->getName(); + dialog->m_thumb = profile->getThumb(); + dialog->m_directory = profile->getDirectory(); + dialog->m_dbMode = profile->canWriteDatabases() ? 0 : 1; + if (profile->hasDatabases()) + dialog->m_dbMode += 2; + dialog->m_sourcesMode = profile->canWriteSources() ? 0 : 1; + if (profile->hasSources()) + dialog->m_sourcesMode += 2; -void CGUIDialogProfileSettings::OnWindowLoaded() -{ - CGUIDialogSettings::OnWindowLoaded(); - CGUIImage *pImage = (CGUIImage*)GetControl(2); - m_strDefaultImage = pImage ? pImage->GetFileName() : ""; -} + dialog->m_locks = profile->GetLocks(); + } -void CGUIDialogProfileSettings::SetupPage() -{ - CGUIDialogSettings::SetupPage(); - SET_CONTROL_LABEL(1000,m_strName); - SET_CONTROL_LABEL(1001,m_strDirectory); - CGUIImage *pImage = (CGUIImage*)GetControl(2); - if (pImage) - pImage->SetFileName(!m_strThumb.empty() ? m_strThumb : m_strDefaultImage); -} + dialog->DoModal(); + if (dialog->m_needsSaving) + { + if (iProfile >= CProfilesManager::Get().GetNumberOfProfiles()) + { + if (dialog->m_name.empty() || dialog->m_directory.empty()) + return false; -void CGUIDialogProfileSettings::CreateSettings() -{ - // clear out any old settings - m_settings.clear(); + /*CStdString strLabel; + strLabel.Format(g_localizeStrings.Get(20047),dialog->m_strName); + if (!CGUIDialogYesNo::ShowAndGetInput(g_localizeStrings.Get(20058),strLabel,dialog->m_strDirectory,"")) + { + CDirectory::Remove(URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(), dialog->m_strDirectory)); + return false; + }*/ - AddButton(1,20093); - AddButton(2,20065); - if (!m_bIsDefault && m_bShowDetails) - AddButton(3,20070); + // check for old profile settings + CProfile profile(dialog->m_directory, dialog->m_name, CProfilesManager::Get().GetNextProfileId()); + CProfilesManager::Get().AddProfile(profile); + bool exists = XFILE::CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/guisettings.xml")); - if (m_bShowDetails) - AddButton(4,20066); - if (!m_bShowDetails && m_locks.mode == LOCK_MODE_EVERYONE && CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) - AddButton(4,20066); + if (exists && !CGUIDialogYesNo::ShowAndGetInput(20058, 20104, 20105, 20022)) + exists = false; - if (!m_bIsDefault && m_bShowDetails) - { - SettingInfo setting; - setting.id = 5; - setting.name = g_localizeStrings.Get(20060); - setting.data = &m_iDbMode; - setting.type = SettingInfo::SPIN; - setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(20062))); - setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(20063))); - setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(20061))); - if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) - setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(20107))); - - m_settings.push_back(setting); - - SettingInfo setting2; - setting2.id = 6; - setting2.name = g_localizeStrings.Get(20094); - setting2.data = &m_iSourcesMode; - setting2.type = SettingInfo::SPIN; - setting2.entry.push_back(make_pair(setting2.entry.size(), g_localizeStrings.Get(20062))); - setting2.entry.push_back(make_pair(setting2.entry.size(), g_localizeStrings.Get(20063))); - setting2.entry.push_back(make_pair(setting2.entry.size(), g_localizeStrings.Get(20061))); - if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) - setting2.entry.push_back(make_pair(setting2.entry.size(), g_localizeStrings.Get(20107))); + if (!exists) + { + // copy masterprofile guisettings to new profile guisettings + // If the user selects 'start fresh', do nothing as a fresh + // guisettings.xml will be created on first profile use. + if (CGUIDialogYesNo::ShowAndGetInput(20058,20048,20102,20022,20044,20064)) + { + XFILE::CFile::Cache(URIUtils::AddFileToFolder("special://masterprofile/", "guisettings.xml"), + URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/guisettings.xml")); + } + } - m_settings.push_back(setting2); + exists = XFILE::CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/sources.xml")); + if (exists && !CGUIDialogYesNo::ShowAndGetInput(20058, 20106, 20105, 20022)) + exists = false; + + if (!exists) + { + if ((dialog->m_sourcesMode & 2) == 2) + // prompt user to copy masterprofile's sources.xml file + // If 'start fresh' (no) is selected, do nothing. + if (CGUIDialogYesNo::ShowAndGetInput(20058, 20071, 20102, 20022, 20044, 20064)) + { + XFILE::CFile::Cache(URIUtils::AddFileToFolder("special://masterprofile/", "sources.xml"), + URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory + "/sources.xml")); + } + } + } + + /*if (!dialog->m_bIsNewUser) + if (!CGUIDialogYesNo::ShowAndGetInput(20067,20103,20022,20022)) + return false;*/ + + CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); + assert(profile); + profile->setName(dialog->m_name); + profile->setDirectory(dialog->m_directory); + profile->setThumb(dialog->m_thumb); + profile->setWriteDatabases(!((dialog->m_dbMode & 1) == 1)); + profile->setWriteSources(!((dialog->m_sourcesMode & 1) == 1)); + profile->setDatabases((dialog->m_dbMode & 2) == 2); + profile->setSources((dialog->m_sourcesMode & 2) == 2); + profile->SetLocks(dialog->m_locks); + CProfilesManager::Get().Save(); + + return true; } + + return dialog->m_needsSaving; } -void CGUIDialogProfileSettings::OnSettingChanged(unsigned int num) +void CGUIDialogProfileSettings::OnWindowLoaded() { - // setting has changed - update anything that needs it - if (num >= m_settings.size()) return; - OnSettingChanged(m_settings.at(num)); + CGUIDialogSettingsManualBase::OnWindowLoaded(); + + CGUIImage *image = (CGUIImage*)GetControl(CONTROL_PROFILE_IMAGE); + m_defaultImage = image ? image->GetFileName() : ""; } -void CGUIDialogProfileSettings::OnSettingChanged(SettingInfo &setting) +void CGUIDialogProfileSettings::OnSettingChanged(const CSetting *setting) { - // check and update anything that needs it - if (setting.id == 1) + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_PROFILE_NAME) { - if (CGUIKeyboardFactory::ShowAndGetInput(m_strName,g_localizeStrings.Get(20093),false)) - { - m_bNeedSave = true; - SET_CONTROL_LABEL(1000,m_strName); - } + m_name = static_cast<const CSettingString*>(setting)->GetValue(); + updateProfileName(); } - if (setting.id == 2) + else if (settingId == SETTING_PROFILE_MEDIA) + m_dbMode = static_cast<const CSettingInt*>(setting)->GetValue(); + else if (settingId == SETTING_PROFILE_MEDIA_SOURCES) + m_sourcesMode = static_cast<const CSettingInt*>(setting)->GetValue(); + + m_needsSaving = true; +} + +void CGUIDialogProfileSettings::OnSettingAction(const CSetting *setting) +{ + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingAction(setting); + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_PROFILE_IMAGE) { - CStdString strThumb; VECSOURCES shares; g_mediaManager.GetLocalDrives(shares); + CFileItemList items; - if (!m_strThumb.empty()) + if (!m_thumb.empty()) { CFileItemPtr item(new CFileItem("thumb://Current", false)); - item->SetArt("thumb", m_strThumb); + item->SetArt("thumb", m_thumb); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } + CFileItemPtr item(new CFileItem("thumb://None", false)); - item->SetArt("thumb", m_strDefaultImage); + item->SetArt("thumb", m_defaultImage); item->SetLabel(g_localizeStrings.Get(20018)); items.Add(item); - if (CGUIDialogFileBrowser::ShowAndGetImage(items,shares,g_localizeStrings.Get(1030),strThumb) && - !strThumb.Equals("thumb://Current")) + + CStdString thumb; + if (CGUIDialogFileBrowser::ShowAndGetImage(items, shares, g_localizeStrings.Get(1030), thumb) && + !thumb.Equals("thumb://Current")) { - m_bNeedSave = true; - m_strThumb = strThumb.Equals("thumb://None") ? "" : strThumb; + m_needsSaving = true; + m_thumb = thumb.Equals("thumb://None") ? "" : thumb; - CGUIImage *pImage = (CGUIImage*)GetControl(2); - if (pImage) - { - pImage->SetFileName(""); - pImage->SetInvalid(); - pImage->SetFileName(!m_strThumb.empty() ? m_strThumb : m_strDefaultImage); - } + CGUIImage *image = (CGUIImage*)GetControl(CONTROL_PROFILE_IMAGE); + if (image == NULL) + return; + + image->SetFileName(""); + image->SetInvalid(); + image->SetFileName(!m_thumb.empty() ? m_thumb : m_defaultImage); } } - if (setting.id == 3) + else if (settingId == SETTING_PROFILE_DIRECTORY) { - if (OnProfilePath(m_strDirectory, m_bIsDefault)) - { - m_bNeedSave = true; - SET_CONTROL_LABEL(1001,m_strDirectory); - } - } + if (!GetProfilePath(m_directory, m_isDefault)) + return; - if (setting.id == 4) + m_needsSaving = true; + updateProfileDirectory(); + } + else if (settingId == SETTING_PROFILE_LOCKS) { - if (m_bShowDetails) + if (m_showDetails) { - if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE && !m_bIsDefault) + if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE && !m_isDefault) { - if (CGUIDialogYesNo::ShowAndGetInput(20066,20118,20119,20022)) + if (CGUIDialogYesNo::ShowAndGetInput(20066, 20118, 20119, 20022)) g_passwordManager.SetMasterLockMode(false); if (CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE) return; } - if (CGUIDialogLockSettings::ShowAndGetLock(m_locks, m_bIsDefault ? 12360 : 20068, CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || m_bIsDefault)) - m_bNeedSave = true; + if (CGUIDialogLockSettings::ShowAndGetLock(m_locks, m_isDefault ? 12360 : 20068, + CProfilesManager::Get().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE || m_isDefault)) + m_needsSaving = true; } else { - if (CGUIDialogLockSettings::ShowAndGetLock(m_locks, m_bIsDefault ? 12360 : 20068, false, false)) - m_bNeedSave = true; + if (CGUIDialogLockSettings::ShowAndGetLock(m_locks, m_isDefault ? 12360 : 20068, false, false)) + m_needsSaving = true; } } - if (setting.id > 4) - m_bNeedSave = true; } void CGUIDialogProfileSettings::OnCancel() { - m_bNeedSave = false; -} + m_needsSaving = false; -bool CGUIDialogProfileSettings::OnProfilePath(CStdString &dir, bool isDefault) -{ - VECSOURCES shares; - CMediaSource share; - share.strName = "Profiles"; - share.strPath = "special://masterprofile/profiles/"; - shares.push_back(share); - CStdString strDirectory; - if (dir.empty()) - strDirectory = share.strPath; - else - strDirectory = URIUtils::AddFileToFolder("special://masterprofile/", dir); - if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares,g_localizeStrings.Get(657),strDirectory,true)) - { - dir = strDirectory; - if (!isDefault) - dir.erase(0,24); - return true; - } - return false; + CGUIDialogSettingsManualBase::OnCancel(); } -bool CGUIDialogProfileSettings::ShowForProfile(unsigned int iProfile, bool firstLogin) +void CGUIDialogProfileSettings::SetupView() { - CGUIDialogProfileSettings *dialog = (CGUIDialogProfileSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PROFILE_SETTINGS); - if (!dialog) return false; - if (iProfile == 0) - dialog->m_bIsDefault = true; - else - dialog->m_bIsDefault = false; - if (firstLogin && iProfile > CProfilesManager::Get().GetNumberOfProfiles()) - return false; + CGUIDialogSettingsManualBase::SetupView(); - dialog->m_bNeedSave = false; - dialog->m_bShowDetails = !firstLogin; - dialog->SetProperty("heading", g_localizeStrings.Get(firstLogin ? 20255 : 20067)); + // set the heading + SetHeading(!m_showDetails ? 20255 : 20067); - const CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); + // set the profile name and directory + updateProfileName(); + updateProfileDirectory(); - if (!profile) - { // defaults - dialog->m_strName.clear(); - dialog->m_iDbMode = 2; - dialog->m_iSourcesMode = 2; - dialog->m_locks = CProfile::CLock(); + // set the image + CGUIImage *image = (CGUIImage*)GetControl(CONTROL_PROFILE_IMAGE); + if (image != NULL) + image->SetFileName(!m_thumb.empty() ? m_thumb : m_defaultImage); +} - bool bLock = CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser; - dialog->m_locks.addonManager = bLock; - dialog->m_locks.settings = (bLock) ? LOCK_LEVEL::ALL : LOCK_LEVEL::NONE; - dialog->m_locks.files = bLock; +void CGUIDialogProfileSettings::InitializeSettings() +{ + CGUIDialogSettingsManualBase::InitializeSettings(); - dialog->m_strDirectory.clear(); - dialog->m_strThumb.clear(); - // prompt for a name - if (!CGUIKeyboardFactory::ShowAndGetInput(dialog->m_strName,g_localizeStrings.Get(20093),false) || dialog->m_strName.empty()) - return false; - // create a default path - CStdString defaultDir = URIUtils::AddFileToFolder("profiles",CUtil::MakeLegalFileName(dialog->m_strName)); - URIUtils::AddSlashAtEnd(defaultDir); - CDirectory::Create(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); - // prompt for the user to change it if they want - CStdString userDir = defaultDir; - if (dialog->OnProfilePath(userDir, false)) // can't be the master user - { - if (!StringUtils::StartsWith(userDir, defaultDir)) // user chose a different folder - CDirectory::Remove(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); - } - dialog->m_strDirectory = userDir; - dialog->m_bNeedSave = true; - } - else + CSettingCategory *category = AddCategory("profilesettings", -1); + if (category == NULL) { - dialog->m_strName = profile->getName(); - dialog->m_strThumb = profile->getThumb(); - dialog->m_strDirectory = profile->getDirectory(); - dialog->m_iDbMode = profile->canWriteDatabases()?0:1; - dialog->m_iSourcesMode = profile->canWriteSources()?0:1; - if (profile->hasDatabases()) - dialog->m_iDbMode += 2; - if (profile->hasSources()) - dialog->m_iSourcesMode += 2; + CLog::Log(LOGERROR, "CGUIDialogProfileSettings: unable to setup settings"); + return; + } - dialog->m_locks = profile->GetLocks(); + CSettingGroup *group = AddGroup(category); + if (group == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogProfileSettings: unable to setup settings"); + return; } - dialog->DoModal(); - if (dialog->m_bNeedSave) + + AddEdit(group, SETTING_PROFILE_NAME, 20093, 0, m_name); + AddButton(group, SETTING_PROFILE_IMAGE, 20065, 0); + + if (!m_isDefault && m_showDetails) + AddButton(group, SETTING_PROFILE_DIRECTORY, 20070, 0); + + if (m_showDetails || + (m_locks.mode == LOCK_MODE_EVERYONE && CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE)) + AddButton(group, SETTING_PROFILE_LOCKS, 20066, 0); + + if (!m_isDefault && m_showDetails) { - if (iProfile >= CProfilesManager::Get().GetNumberOfProfiles()) + CSettingGroup *groupMedia = AddGroup(category); + if (groupMedia == NULL) { - if (dialog->m_strName.empty() || dialog->m_strDirectory.empty()) - return false; - /*CStdString strLabel; - strLabel.Format(g_localizeStrings.Get(20047),dialog->m_strName); - if (!CGUIDialogYesNo::ShowAndGetInput(g_localizeStrings.Get(20058),strLabel,dialog->m_strDirectory,"")) - { - CDirectory::Remove(URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(), dialog->m_strDirectory)); - return false; - }*/ - - // check for old profile settings - CProfile profile(dialog->m_strDirectory, dialog->m_strName, CProfilesManager::Get().GetNextProfileId()); - CProfilesManager::Get().AddProfile(profile); - bool bExists = CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", - dialog->m_strDirectory+"/guisettings.xml")); + CLog::Log(LOGERROR, "CGUIDialogProfileSettings: unable to setup settings"); + return; + } - if (bExists) - if (!CGUIDialogYesNo::ShowAndGetInput(20058,20104,20105,20022)) - bExists = false; + StaticIntegerSettingOptions entries; + entries.push_back(std::make_pair(0, 20062)); + entries.push_back(std::make_pair(1, 20063)); + entries.push_back(std::make_pair(2, 20061)); + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) + entries.push_back(std::make_pair(3, 20107)); - if (!bExists) - { - // copy masterprofile guisettings to new profile guisettings - // If the user selects 'start fresh', do nothing as a fresh - // guisettings.xml will be created on first profile use. - if (CGUIDialogYesNo::ShowAndGetInput(20058,20048,20102,20022,20044,20064)) - { - CFile::Cache(URIUtils::AddFileToFolder("special://masterprofile/","guisettings.xml"), - URIUtils::AddFileToFolder("special://masterprofile/", - dialog->m_strDirectory+"/guisettings.xml")); - } - } + AddSpinner(groupMedia, SETTING_PROFILE_MEDIA, 20060, 0, m_dbMode, entries); + AddSpinner(groupMedia, SETTING_PROFILE_MEDIA_SOURCES, 20094, 0, m_sourcesMode, entries); + } +} - bExists = CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", - dialog->m_strDirectory+"/sources.xml")); - if (bExists) - if (!CGUIDialogYesNo::ShowAndGetInput(20058,20106,20105,20022)) - bExists = false; +bool CGUIDialogProfileSettings::GetProfilePath(std::string &directory, bool isDefault) +{ + VECSOURCES shares; + CMediaSource share; + share.strName = g_localizeStrings.Get(13200); + share.strPath = "special://masterprofile/profiles/"; + shares.push_back(share); - if (!bExists) - { - if ((dialog->m_iSourcesMode & 2) == 2) - // prompt user to copy masterprofile's sources.xml file - // If 'start fresh' (no) is selected, do nothing. - if (CGUIDialogYesNo::ShowAndGetInput(20058,20071,20102,20022,20044,20064)) - { - CFile::Cache(URIUtils::AddFileToFolder("special://masterprofile/","sources.xml"), - URIUtils::AddFileToFolder("special://masterprofile/", - dialog->m_strDirectory+"/sources.xml")); - } - } - } + CStdString strDirectory; + if (directory.empty()) + strDirectory = share.strPath; + else + strDirectory = URIUtils::AddFileToFolder("special://masterprofile/", directory); - /*if (!dialog->m_bIsNewUser) - if (!CGUIDialogYesNo::ShowAndGetInput(20067,20103,20022,20022)) - return false;*/ + if (!CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(657), strDirectory, true)) + return false; - CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); - assert(profile); - profile->setName(dialog->m_strName); - profile->setDirectory(dialog->m_strDirectory); - profile->setThumb(dialog->m_strThumb); - profile->setWriteDatabases(!((dialog->m_iDbMode & 1) == 1)); - profile->setWriteSources(!((dialog->m_iSourcesMode & 1) == 1)); - profile->setDatabases((dialog->m_iDbMode & 2) == 2); - profile->setSources((dialog->m_iSourcesMode & 2) == 2); - profile->SetLocks(dialog->m_locks); + directory = strDirectory; + if (!isDefault) + directory.erase(0, 24); - CProfilesManager::Get().Save(); - return true; - } + return true; +} - return !dialog->m_bNeedSave; +void CGUIDialogProfileSettings::updateProfileName() +{ + SET_CONTROL_LABEL(CONTROL_PROFILE_NAME, m_name); } +void CGUIDialogProfileSettings::updateProfileDirectory() +{ + SET_CONTROL_LABEL(CONTROL_PROFILE_DIRECTORY, m_directory); +} diff --git a/xbmc/profiles/dialogs/GUIDialogProfileSettings.h b/xbmc/profiles/dialogs/GUIDialogProfileSettings.h index 49330a9909..7861f56a8b 100644 --- a/xbmc/profiles/dialogs/GUIDialogProfileSettings.h +++ b/xbmc/profiles/dialogs/GUIDialogProfileSettings.h @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -20,44 +20,56 @@ * */ -#include "MediaSource.h" +#include <string> + #include "profiles/Profile.h" -#include "settings/dialogs/GUIDialogSettings.h" +#include "settings/dialogs/GUIDialogSettingsManualBase.h" -class CGUIDialogProfileSettings : public CGUIDialogSettings +class CGUIDialogProfileSettings : public CGUIDialogSettingsManualBase { public: - CGUIDialogProfileSettings(void); - virtual ~CGUIDialogProfileSettings(void); - virtual bool OnMessage(CGUIMessage &message); + CGUIDialogProfileSettings(); + virtual ~CGUIDialogProfileSettings(); static bool ShowForProfile(unsigned int iProfile, bool firstLogin = false); + protected: - virtual void OnCancel(); + // specializations of CGUIWindow virtual void OnWindowLoaded(); - virtual void SetupPage(); - virtual void CreateSettings(); - void OnSettingChanged(unsigned int setting); - virtual void OnSettingChanged(SettingInfo &setting); + + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save() { } + virtual void OnCancel(); + virtual void SetupView(); + + // specialization of CGUIDialogSettingsManualBase + virtual void InitializeSettings(); /*! \brief Prompt for a change in profile path - \param dir Current directory for the profile, new profile directory will be returned here + \param directory Current directory for the profile, new profile directory will be returned here \param isDefault whether this is the default profile or not \return true if the profile path has been changed, false otherwise. */ - bool OnProfilePath(CStdString &dir, bool isDefault); - - bool m_bNeedSave; - CStdString m_strName; - CStdString m_strThumb; - CStdString m_strDirectory; - int m_iSourcesMode; - int m_iDbMode; - bool m_bIsDefault; - bool m_bIsNewUser; - bool m_bShowDetails; + static bool GetProfilePath(std::string &directory, bool isDefault); + + void updateProfileName(); + void updateProfileDirectory(); + + bool m_needsSaving; + std::string m_name; + std::string m_thumb; + std::string m_directory; + int m_sourcesMode; + int m_dbMode; + bool m_isDefault; + bool m_isNewUser; + bool m_showDetails; CProfile::CLock m_locks; - CStdString m_strDefaultImage; + std::string m_defaultImage; }; - diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp index c580622b76..13da2bd106 100644 --- a/xbmc/pvr/PVRManager.cpp +++ b/xbmc/pvr/PVRManager.cpp @@ -1520,7 +1520,7 @@ bool CPVRManager::OnAction(const CAction &action) return false; } -void CPVRManager::SettingOptionsPvrStartLastChannelFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CPVRManager::SettingOptionsPvrStartLastChannelFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { list.push_back(make_pair(g_localizeStrings.Get(106), PVR::START_LAST_CHANNEL_OFF)); list.push_back(make_pair(g_localizeStrings.Get(19190), PVR::START_LAST_CHANNEL_MIN)); diff --git a/xbmc/pvr/PVRManager.h b/xbmc/pvr/PVRManager.h index c8461ac478..505bed6ab1 100644 --- a/xbmc/pvr/PVRManager.h +++ b/xbmc/pvr/PVRManager.h @@ -552,7 +552,7 @@ namespace PVR */ bool OnAction(const CAction &action); - static void SettingOptionsPvrStartLastChannelFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); + static void SettingOptionsPvrStartLastChannelFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); /*! * @brief Create EPG tags for all channels in internal channel groups diff --git a/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp b/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp index c72342dbc3..d944a405b1 100644 --- a/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp +++ b/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2013 Team XBMC + * Copyright (C) 2012-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -19,404 +19,512 @@ */ #include "GUIDialogPVRTimerSettings.h" -#include "guilib/GUIKeyboardFactory.h" +#include "FileItem.h" #include "dialogs/GUIDialogNumeric.h" #include "guilib/LocalizeStrings.h" -#include "utils/StringUtils.h" - #include "pvr/PVRManager.h" -#include "pvr/timers/PVRTimerInfoTag.h" -#include "pvr/channels/PVRChannelGroupsContainer.h" #include "pvr/addons/PVRClient.h" +#include "pvr/channels/PVRChannelGroupsContainer.h" +#include "pvr/timers/PVRTimerInfoTag.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingsManager.h" +#include "settings/windows/GUIControlSettings.h" +#include "utils/log.h" +#include "utils/StringUtils.h" using namespace std; using namespace PVR; -#define CONTROL_TMR_ACTIVE 20 -#define CONTROL_TMR_CHNAME_TV 21 -#define CONTROL_TMR_DAY 22 -#define CONTROL_TMR_BEGIN 23 -#define CONTROL_TMR_END 24 -#define CONTROL_TMR_PRIORITY 26 -#define CONTROL_TMR_LIFETIME 27 -#define CONTROL_TMR_FIRST_DAY 28 -#define CONTROL_TMR_NAME 29 -#define CONTROL_TMR_DIR 30 -#define CONTROL_TMR_RADIO 50 -#define CONTROL_TMR_CHNAME_RADIO 51 +#define SETTING_TMR_ACTIVE "timer.active" +#define SETTING_TMR_CHNAME_TV "timer.tvchannelname" +#define SETTING_TMR_DAY "timer.day" +#define SETTING_TMR_BEGIN "timer.begin" +#define SETTING_TMR_END "timer.end" +#define SETTING_TMR_PRIORITY "timer.priority" +#define SETTING_TMR_LIFETIME "timer.lifetime" +#define SETTING_TMR_FIRST_DAY "timer.firstday" +#define SETTING_TMR_NAME "timer.name" +#define SETTING_TMR_DIR "timer.directory" +#define SETTING_TMR_RADIO "timer.radio" +#define SETTING_TMR_CHNAME_RADIO "timer.radiochannelname" CGUIDialogPVRTimerSettings::CGUIDialogPVRTimerSettings(void) - : CGUIDialogSettings(WINDOW_DIALOG_PVR_TIMER_SETTING, "DialogPVRTimerSettings.xml") + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_PVR_TIMER_SETTING, "DialogPVRTimerSettings.xml"), + m_tmp_iFirstDay(0), + m_tmp_day(11), + m_bTimerActive(false), + m_timerItem(NULL) { - m_cancelled = true; - m_tmp_day = 11; - m_bTimerActive = false; - m_tmp_iFirstDay = 0; - m_timerItem = NULL; m_loadType = LOAD_EVERY_TIME; } -void CGUIDialogPVRTimerSettings::AddChannelNames(CFileItemList &channelsList, SETTINGSTRINGS &channelNames, bool bRadio) +void CGUIDialogPVRTimerSettings::SetTimer(CFileItem *item) { - int entry = 0; - int timerChannelID; - g_PVRChannelGroups->GetGroupAll(bRadio)->GetMembers(channelsList); + m_timerItem = item; - channelNames.push_back("0 dummy"); - m_channelEntries.insert(std::make_pair(std::make_pair(bRadio, entry++), PVR_VIRTUAL_CHANNEL_UID)); + m_timerItem->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsSystemTime(m_timerStartTime); + m_timerItem->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsSystemTime(m_timerEndTime); + m_timerStartTimeStr = m_timerItem->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsLocalizedTime("", false); + m_timerEndTimeStr = m_timerItem->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsLocalizedTime("", false); - if (m_timerItem->GetPVRTimerInfoTag()->ChannelTag()) - timerChannelID = m_timerItem->GetPVRTimerInfoTag()->ChannelTag()->ChannelID(); - else - timerChannelID = PVR_VIRTUAL_CHANNEL_UID; + m_tmp_iFirstDay = 0; + m_tmp_day = 11; +} - for (int i = 0; i < channelsList.Size(); i++) +void CGUIDialogPVRTimerSettings::OnSettingChanged(const CSetting *setting) +{ + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + CPVRTimerInfoTag* tag = m_timerItem->GetPVRTimerInfoTag(); + if (tag == NULL) + return; + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_TMR_ACTIVE) + m_bTimerActive = static_cast<const CSettingBool*>(setting)->GetValue(); + if (settingId == SETTING_TMR_RADIO || settingId == SETTING_TMR_CHNAME_TV || settingId == SETTING_TMR_CHNAME_RADIO) { - CStdString string; - CFileItemPtr item = channelsList[i]; - const CPVRChannel *channel = item->GetPVRChannelInfoTag(); - string = StringUtils::Format("%i %s", channel->ChannelNumber(), channel->ChannelName().c_str()); - channelNames.push_back(string); - if (channel->ChannelID() == timerChannelID) - m_selectedChannelEntry = entry; - m_channelEntries.insert(std::make_pair(std::make_pair(bRadio, entry++), channel->ChannelID())); + if (settingId == SETTING_TMR_RADIO) + { + tag->m_bIsRadio = static_cast<const CSettingBool*>(setting)->GetValue(); + m_selectedChannelEntry = 0; + } + else + m_selectedChannelEntry = static_cast<const CSettingInt*>(setting)->GetValue(); + + std::map<std::pair<bool, int>, int>::iterator itc = m_channelEntries.find(std::make_pair(tag->m_bIsRadio, m_selectedChannelEntry)); + if (itc != m_channelEntries.end()) + { + CPVRChannelPtr channel = g_PVRChannelGroups->GetChannelById(itc->second); + if (channel) + { + tag->m_iClientChannelUid = channel->UniqueID(); + tag->m_iClientId = channel->ClientID(); + tag->m_bIsRadio = channel->IsRadio(); + tag->m_iChannelNumber = channel->ChannelNumber(); + } + else + { + tag->m_iClientChannelUid = PVR_VIRTUAL_CHANNEL_UID; + tag->m_iClientId = PVR_VIRTUAL_CLIENT_ID; + tag->m_iChannelNumber = 0; + } + // Update channel pointer from above values + tag->UpdateChannel(); + } } + else if (settingId == SETTING_TMR_DAY) + { + m_tmp_day = static_cast<const CSettingInt*>(setting)->GetValue(); + + if (m_tmp_day <= 10) + SetTimerFromWeekdaySetting(*tag); + else + { + CDateTime time = CDateTime::GetCurrentDateTime(); + CDateTime timestart = m_timerStartTime; + CDateTime timestop = m_timerEndTime; + int m_tmp_diff; + + // get diffence of timer in days between today and timer start date + tm time_cur; time.GetAsTm(time_cur); + tm time_tmr; timestart.GetAsTm(time_tmr); - int iControl = bRadio ? CONTROL_TMR_CHNAME_RADIO : CONTROL_TMR_CHNAME_TV; - AddSpin(iControl, 19078, &m_selectedChannelEntry, channelNames.size(), channelNames); - EnableSettings(iControl, m_timerItem->GetPVRTimerInfoTag()->m_bIsRadio == bRadio); + m_tmp_diff = time_tmr.tm_yday - time_cur.tm_yday; + if (time_tmr.tm_yday - time_cur.tm_yday < 0) + m_tmp_diff = 365; + + CDateTime newStart = timestart + CDateTimeSpan(m_tmp_day - 11 - m_tmp_diff, 0, 0, 0); + CDateTime newEnd = timestop + CDateTimeSpan(m_tmp_day - 11 - m_tmp_diff, 0, 0, 0); + + // add a day to end time if end time is before start time + // TODO: this should be removed after separate end date control was added + if (newEnd < newStart) + newEnd += CDateTimeSpan(1, 0, 0, 0); + + tag->SetStartFromLocalTime(newStart); + tag->SetEndFromLocalTime(newEnd); + + tag->m_bIsRepeating = false; + tag->m_iWeekdays = 0; + } + } + else if (settingId == SETTING_TMR_PRIORITY) + tag->m_iPriority = static_cast<const CSettingInt*>(setting)->GetValue(); + else if (settingId == SETTING_TMR_LIFETIME) + tag->m_iLifetime = static_cast<const CSettingInt*>(setting)->GetValue(); + else if (settingId == SETTING_TMR_FIRST_DAY) + { + m_tmp_iFirstDay = static_cast<const CSettingInt*>(setting)->GetValue(); + + CDateTime newFirstDay; + if (m_tmp_iFirstDay > 0) + newFirstDay = CDateTime::GetCurrentDateTime() + CDateTimeSpan(m_tmp_iFirstDay - 1, 0, 0, 0); + + tag->SetFirstDayFromLocalTime(newFirstDay); + } + else if (settingId == SETTING_TMR_NAME) + tag->m_strTitle = static_cast<const CSettingString*>(setting)->GetValue(); + else if (settingId == SETTING_TMR_DIR) + tag->m_strDirectory = static_cast<const CSettingString*>(setting)->GetValue(); + + tag->UpdateSummary(); } -void CGUIDialogPVRTimerSettings::SetWeekdaySettingFromTimer(const CPVRTimerInfoTag &timer) +void CGUIDialogPVRTimerSettings::OnSettingAction(const CSetting *setting) { - if (timer.m_bIsRepeating) + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingAction(setting); + + CPVRTimerInfoTag* tag = m_timerItem->GetPVRTimerInfoTag(); + if (tag == NULL) + return; + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_TMR_BEGIN) { - if (timer.m_iWeekdays == 0x01) - m_tmp_day = 0; - else if (timer.m_iWeekdays == 0x02) - m_tmp_day = 1; - else if (timer.m_iWeekdays == 0x04) - m_tmp_day = 2; - else if (timer.m_iWeekdays == 0x08) - m_tmp_day = 3; - else if (timer.m_iWeekdays == 0x10) - m_tmp_day = 4; - else if (timer.m_iWeekdays == 0x20) - m_tmp_day = 5; - else if (timer.m_iWeekdays == 0x40) - m_tmp_day = 6; - else if (timer.m_iWeekdays == 0x1F) - m_tmp_day = 7; - else if (timer.m_iWeekdays == 0x3F) - m_tmp_day = 8; - else if (timer.m_iWeekdays == 0x7F) - m_tmp_day = 9; - else if (timer.m_iWeekdays == 0x60) - m_tmp_day = 10; + if (CGUIDialogNumeric::ShowAndGetTime(m_timerStartTime, g_localizeStrings.Get(14066))) + { + CDateTime timestart = m_timerStartTime; + int start_day = tag->StartAsLocalTime().GetDay(); + int start_month = tag->StartAsLocalTime().GetMonth(); + int start_year = tag->StartAsLocalTime().GetYear(); + int start_hour = timestart.GetHour(); + int start_minute = timestart.GetMinute(); + CDateTime newStart(start_year, start_month, start_day, start_hour, start_minute, 0); + tag->SetStartFromLocalTime(newStart); + + m_timerStartTimeStr = tag->StartAsLocalTime().GetAsLocalizedTime("", false); + setButtonLabels(); + } } + else if (settingId == SETTING_TMR_END) + { + if (CGUIDialogNumeric::ShowAndGetTime(m_timerEndTime, g_localizeStrings.Get(14066))) + { + CDateTime timestop = m_timerEndTime; + // TODO: add separate end date control to schedule a show with more then 24 hours + int start_day = tag->StartAsLocalTime().GetDay(); + int start_month = tag->StartAsLocalTime().GetMonth(); + int start_year = tag->StartAsLocalTime().GetYear(); + int start_hour = timestop.GetHour(); + int start_minute = timestop.GetMinute(); + CDateTime newEnd(start_year, start_month, start_day, start_hour, start_minute, 0); + + // add a day to end time if end time is before start time + // TODO: this should be removed after separate end date control was added + if (newEnd < tag->StartAsLocalTime()) + newEnd += CDateTimeSpan(1, 0, 0, 0); + + tag->SetEndFromLocalTime(newEnd); + + m_timerEndTimeStr = tag->EndAsLocalTime().GetAsLocalizedTime("", false); + setButtonLabels(); + } + } + + tag->UpdateSummary(); } -void CGUIDialogPVRTimerSettings::SetTimerFromWeekdaySetting(CPVRTimerInfoTag &timer) +void CGUIDialogPVRTimerSettings::Save() { - timer.m_bIsRepeating = true; + CPVRTimerInfoTag* tag = m_timerItem->GetPVRTimerInfoTag(); - if (m_tmp_day == 0) - timer.m_iWeekdays = 0x01; - else if (m_tmp_day == 1) - timer.m_iWeekdays = 0x02; - else if (m_tmp_day == 2) - timer.m_iWeekdays = 0x04; - else if (m_tmp_day == 3) - timer.m_iWeekdays = 0x08; - else if (m_tmp_day == 4) - timer.m_iWeekdays = 0x10; - else if (m_tmp_day == 5) - timer.m_iWeekdays = 0x20; - else if (m_tmp_day == 6) - timer.m_iWeekdays = 0x40; - else if (m_tmp_day == 7) - timer.m_iWeekdays = 0x1F; - else if (m_tmp_day == 8) - timer.m_iWeekdays = 0x3F; - else if (m_tmp_day == 9) - timer.m_iWeekdays = 0x7F; - else if (m_tmp_day == 10) - timer.m_iWeekdays = 0x60; + // Set the timer's title to the channel name if it's 'New Timer' or empty + if (tag->m_strTitle == g_localizeStrings.Get(19056) || tag->m_strTitle.empty()) + { + CPVRChannelPtr channel = g_PVRChannelGroups->GetByUniqueID(tag->m_iClientChannelUid, tag->m_iClientId); + if (channel) + tag->m_strTitle = channel->ChannelName(); + } + + if (m_bTimerActive) + tag->m_state = PVR_TIMER_STATE_SCHEDULED; else - timer.m_iWeekdays = 0; + tag->m_state = PVR_TIMER_STATE_CANCELLED; +} + +void CGUIDialogPVRTimerSettings::SetupView() +{ + CGUIDialogSettingsManualBase::SetupView(); + + setButtonLabels(); } -void CGUIDialogPVRTimerSettings::CreateSettings() +void CGUIDialogPVRTimerSettings::InitializeSettings() { + CGUIDialogSettingsManualBase::InitializeSettings(); + + CSettingCategory *category = AddCategory("pvrtimersettings", -1); + if (category == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings: unable to setup settings"); + return; + } + + CSettingGroup *group = AddGroup(category); + if (group == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings: unable to setup settings"); + return; + } + + // add a condition + m_settingsManager->AddCondition("IsTimerDayRepeating", IsTimerDayRepeating); + CPVRTimerInfoTag* tag = m_timerItem->GetPVRTimerInfoTag(); - // clear out any old settings - m_settings.clear(); m_selectedChannelEntry = 0; m_channelEntries.clear(); - - // create our settings controls m_bTimerActive = tag->IsActive(); - AddBool(CONTROL_TMR_ACTIVE, 19074, &m_bTimerActive); - AddButton(CONTROL_TMR_NAME, 19075, &tag->m_strTitle, true); + + AddToggle(group, SETTING_TMR_ACTIVE, 19074, 0, m_bTimerActive); + AddEdit(group, SETTING_TMR_NAME, 19075, 0, tag->m_strTitle, false, false, 19097); if (tag->SupportsFolders()) - AddButton(CONTROL_TMR_DIR, 19076, &tag->m_strDirectory, true); + AddEdit(group, SETTING_TMR_DIR, 19076, 0, tag->m_strDirectory, true, false, 19104); - AddBool(CONTROL_TMR_RADIO, 19077, &tag->m_bIsRadio); + AddToggle(group, SETTING_TMR_RADIO, 19077, 0, tag->m_bIsRadio); /// Channel names { // For TV - CFileItemList channelslist_tv; - SETTINGSTRINGS channelstrings_tv; - AddChannelNames(channelslist_tv, channelstrings_tv, false); + AddChannelNames(group, false); // For Radio - CFileItemList channelslist_radio; - SETTINGSTRINGS channelstrings_radio; - AddChannelNames(channelslist_radio, channelstrings_radio, true); + AddChannelNames(group, true); } /// Day { - SETTINGSTRINGS daystrings; - tm time_cur; - tm time_tmr; - - for (unsigned int iDayPtr = 19086; iDayPtr <= 19096; iDayPtr++) - daystrings.push_back(g_localizeStrings.Get(iDayPtr)); - CDateTime time = CDateTime::GetCurrentDateTime(); - CDateTime timestart = tag->StartAsLocalTime(); - - /* get diffence of timer in days between today and timer start date */ - time.GetAsTm(time_cur); - timestart.GetAsTm(time_tmr); + // get diffence of timer in days between today and timer start date + tm time_cur; CDateTime::GetCurrentDateTime().GetAsTm(time_cur); + tm time_tmr; tag->StartAsLocalTime().GetAsTm(time_tmr); m_tmp_day += time_tmr.tm_yday - time_cur.tm_yday; if (time_tmr.tm_yday - time_cur.tm_yday < 0) m_tmp_day += 365; - for (int i = 1; i < 365; ++i) - { - CStdString string = time.GetAsLocalizedDate(); - daystrings.push_back(string); - time += CDateTimeSpan(1, 0, 0, 0); - } - SetWeekdaySettingFromTimer(*tag); - AddSpin(CONTROL_TMR_DAY, 19079, &m_tmp_day, daystrings.size(), daystrings); + AddSpinner(group, SETTING_TMR_DAY, 19079, 0, m_tmp_day, DaysOptionsFiller); } - AddButton(CONTROL_TMR_BEGIN, 19080, &timerStartTimeStr, true); - AddButton(CONTROL_TMR_END, 19081, &timerEndTimeStr, true); - AddSpin(CONTROL_TMR_PRIORITY, 19082, &tag->m_iPriority, 0, 99); - AddSpin(CONTROL_TMR_LIFETIME, 19083, &tag->m_iLifetime, 0, 365); + AddButton(group, SETTING_TMR_BEGIN, 19080, 0); + AddButton(group, SETTING_TMR_END, 19081, 0); + AddSpinner(group, SETTING_TMR_PRIORITY, 19082, 0, tag->m_iPriority, 0, 1, 99); + AddSpinner(group, SETTING_TMR_LIFETIME, 19083, 0, tag->m_iLifetime, 0, 1, 365); /// First day { - SETTINGSTRINGS daystrings; - tm time_cur; - tm time_tmr; - CDateTime time = CDateTime::GetCurrentDateTime(); CDateTime timestart = tag->FirstDayAsLocalTime(); - /* get diffence of timer in days between today and timer start date */ + // get diffence of timer in days between today and timer start date if (time < timestart) { - time.GetAsTm(time_cur); - timestart.GetAsTm(time_tmr); + tm time_cur; time.GetAsTm(time_cur); + tm time_tmr; timestart.GetAsTm(time_tmr); m_tmp_iFirstDay += time_tmr.tm_yday - time_cur.tm_yday + 1; if (time_tmr.tm_yday - time_cur.tm_yday < 0) m_tmp_iFirstDay += 365; } - daystrings.push_back(g_localizeStrings.Get(19030)); + CSettingInt *settingFirstDay = AddSpinner(group, SETTING_TMR_FIRST_DAY, 19084, 0, m_tmp_iFirstDay, DaysOptionsFiller); - for (int i = 1; i < 365; ++i) - { - CStdString string = time.GetAsLocalizedDate(); - daystrings.push_back(string); - time += CDateTimeSpan(1, 0, 0, 0); - } - - AddSpin(CONTROL_TMR_FIRST_DAY, 19084, &m_tmp_iFirstDay, daystrings.size(), daystrings); - - if (tag->m_bIsRepeating) - EnableSettings(CONTROL_TMR_FIRST_DAY, true); - else - EnableSettings(CONTROL_TMR_FIRST_DAY, false); + // define an enable dependency with m_tmp_day <= 10 + CSettingDependency depdendencyFirstDay(SettingDependencyTypeEnable, m_settingsManager); + depdendencyFirstDay.And() + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition("IsTimerDayRepeating", "true", SETTING_TMR_DAY, false, m_settingsManager))); + SettingDependencies deps; + deps.push_back(depdendencyFirstDay); + settingFirstDay->SetDependencies(deps); } } -void CGUIDialogPVRTimerSettings::OnSettingChanged(SettingInfo &setting) +CSetting* CGUIDialogPVRTimerSettings::AddChannelNames(CSettingGroup *group, bool bRadio) { - CPVRTimerInfoTag* tag = m_timerItem->GetPVRTimerInfoTag(); + std::vector< std::pair<std::string, int> > options; + getChannelNames(bRadio, options, m_selectedChannelEntry, true); + + int timerChannelID; + if (m_timerItem->GetPVRTimerInfoTag()->ChannelTag()) + timerChannelID = m_timerItem->GetPVRTimerInfoTag()->ChannelTag()->ChannelID(); + else + timerChannelID = PVR_VIRTUAL_CHANNEL_UID; - if (setting.id == CONTROL_TMR_NAME) + for (std::vector< std::pair<std::string, int> >::const_iterator option = options.begin(); option != options.end(); ++option) { - if (CGUIKeyboardFactory::ShowAndGetInput(tag->m_strTitle, g_localizeStrings.Get(19097), false)) + std::map<std::pair<bool, int>, int>::const_iterator channelEntry = m_channelEntries.find(std::make_pair(bRadio, option->second)); + if (channelEntry != m_channelEntries.end() && channelEntry->second == timerChannelID) { - UpdateSetting(CONTROL_TMR_NAME); + m_selectedChannelEntry = option->second; + break; } } - if (setting.id == CONTROL_TMR_DIR && CGUIKeyboardFactory::ShowAndGetInput(tag->m_strDirectory, g_localizeStrings.Get(19104), false)) - UpdateSetting(CONTROL_TMR_DIR); - else if (setting.id == CONTROL_TMR_RADIO || setting.id == CONTROL_TMR_CHNAME_TV || setting.id == CONTROL_TMR_CHNAME_RADIO) - { - if (setting.id == CONTROL_TMR_RADIO) - { - m_selectedChannelEntry = 0; - UpdateSetting(CONTROL_TMR_CHNAME_TV); - EnableSettings(CONTROL_TMR_CHNAME_TV, !tag->m_bIsRadio); - UpdateSetting(CONTROL_TMR_CHNAME_RADIO); - EnableSettings(CONTROL_TMR_CHNAME_RADIO, tag->m_bIsRadio); - } - std::map<std::pair<bool, int>, int>::iterator itc = m_channelEntries.find(std::make_pair(tag->m_bIsRadio, m_selectedChannelEntry)); - if (itc != m_channelEntries.end()) - { - CPVRChannelPtr channel = g_PVRChannelGroups->GetChannelById(itc->second); - if (channel) - { - tag->m_iClientChannelUid = channel->UniqueID(); - tag->m_iClientId = channel->ClientID(); - tag->m_bIsRadio = channel->IsRadio(); - tag->m_iChannelNumber = channel->ChannelNumber(); - } - else - { - tag->m_iClientChannelUid = PVR_VIRTUAL_CHANNEL_UID; - tag->m_iClientId = PVR_VIRTUAL_CLIENT_ID; - tag->m_iChannelNumber = 0; - } - // Update channel pointer from above values - tag->UpdateChannel(); - } - } - else if (setting.id == CONTROL_TMR_DAY && m_tmp_day > 10) - { - CDateTime time = CDateTime::GetCurrentDateTime(); - CDateTime timestart = timerStartTime; - CDateTime timestop = timerEndTime; - int m_tmp_diff; - tm time_cur; - tm time_tmr; - - /* get diffence of timer in days between today and timer start date */ - time.GetAsTm(time_cur); - timestart.GetAsTm(time_tmr); + CSettingInt *setting = AddSpinner(group, bRadio ? SETTING_TMR_CHNAME_RADIO : SETTING_TMR_CHNAME_TV, 19078, 0, m_selectedChannelEntry, ChannelNamesOptionsFiller); + if (setting == NULL) + return NULL; - m_tmp_diff = time_tmr.tm_yday - time_cur.tm_yday; - if (time_tmr.tm_yday - time_cur.tm_yday < 0) - m_tmp_diff = 365; - - CDateTime newStart = timestart + CDateTimeSpan(m_tmp_day-11-m_tmp_diff, 0, 0, 0); - CDateTime newEnd = timestop + CDateTimeSpan(m_tmp_day-11-m_tmp_diff, 0, 0, 0); - - /* add a day to end time if end time is before start time */ - // TODO this should be removed after separate end date control was added - if (newEnd < newStart) - newEnd += CDateTimeSpan(1, 0, 0, 0); + // define an enable dependency with tag->m_bIsRadio + CSettingDependency depdendencyIsRadio(SettingDependencyTypeEnable, m_settingsManager); + depdendencyIsRadio.And() + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_TMR_RADIO, "true", SettingDependencyOperatorEquals, !bRadio, m_settingsManager))); + SettingDependencies deps; + deps.push_back(depdendencyIsRadio); + setting->SetDependencies(deps); - tag->SetStartFromLocalTime(newStart); - tag->SetEndFromLocalTime(newEnd); - - EnableSettings(CONTROL_TMR_FIRST_DAY, false); + return setting; +} - tag->m_bIsRepeating = false; - tag->m_iWeekdays = 0; - } - else if (setting.id == CONTROL_TMR_DAY && m_tmp_day <= 10) +void CGUIDialogPVRTimerSettings::SetWeekdaySettingFromTimer(const CPVRTimerInfoTag &timer) +{ + if (timer.m_bIsRepeating) { - EnableSettings(CONTROL_TMR_FIRST_DAY, true); - SetTimerFromWeekdaySetting(*tag); + if (timer.m_iWeekdays == 0x01) + m_tmp_day = 0; + else if (timer.m_iWeekdays == 0x02) + m_tmp_day = 1; + else if (timer.m_iWeekdays == 0x04) + m_tmp_day = 2; + else if (timer.m_iWeekdays == 0x08) + m_tmp_day = 3; + else if (timer.m_iWeekdays == 0x10) + m_tmp_day = 4; + else if (timer.m_iWeekdays == 0x20) + m_tmp_day = 5; + else if (timer.m_iWeekdays == 0x40) + m_tmp_day = 6; + else if (timer.m_iWeekdays == 0x1F) + m_tmp_day = 7; + else if (timer.m_iWeekdays == 0x3F) + m_tmp_day = 8; + else if (timer.m_iWeekdays == 0x7F) + m_tmp_day = 9; + else if (timer.m_iWeekdays == 0x60) + m_tmp_day = 10; } - else if (setting.id == CONTROL_TMR_BEGIN) - { - if (CGUIDialogNumeric::ShowAndGetTime(timerStartTime, g_localizeStrings.Get(14066))) - { - CDateTime timestart = timerStartTime; - int start_day = tag->StartAsLocalTime().GetDay(); - int start_month = tag->StartAsLocalTime().GetMonth(); - int start_year = tag->StartAsLocalTime().GetYear(); - int start_hour = timestart.GetHour(); - int start_minute = timestart.GetMinute(); - CDateTime newStart(start_year, start_month, start_day, start_hour, start_minute, 0); - tag->SetStartFromLocalTime(newStart); +} - timerStartTimeStr = tag->StartAsLocalTime().GetAsLocalizedTime("", false); - UpdateSetting(CONTROL_TMR_BEGIN); - } - } - else if (setting.id == CONTROL_TMR_END) - { - if (CGUIDialogNumeric::ShowAndGetTime(timerEndTime, g_localizeStrings.Get(14066))) - { - CDateTime timestop = timerEndTime; - // TODO add separate end date control to schedule a show with more then 24 hours - int start_day = tag->StartAsLocalTime().GetDay(); - int start_month = tag->StartAsLocalTime().GetMonth(); - int start_year = tag->StartAsLocalTime().GetYear(); - int start_hour = timestop.GetHour(); - int start_minute = timestop.GetMinute(); - CDateTime newEnd(start_year, start_month, start_day, start_hour, start_minute, 0); - - /* add a day to end time if end time is before start time */ - // TODO this should be removed after separate end date control was added - if (newEnd < tag->StartAsLocalTime()) - newEnd += CDateTimeSpan(1, 0, 0, 0); +void CGUIDialogPVRTimerSettings::SetTimerFromWeekdaySetting(CPVRTimerInfoTag &timer) +{ + timer.m_bIsRepeating = true; - tag->SetEndFromLocalTime(newEnd); + if (m_tmp_day == 0) + timer.m_iWeekdays = 0x01; + else if (m_tmp_day == 1) + timer.m_iWeekdays = 0x02; + else if (m_tmp_day == 2) + timer.m_iWeekdays = 0x04; + else if (m_tmp_day == 3) + timer.m_iWeekdays = 0x08; + else if (m_tmp_day == 4) + timer.m_iWeekdays = 0x10; + else if (m_tmp_day == 5) + timer.m_iWeekdays = 0x20; + else if (m_tmp_day == 6) + timer.m_iWeekdays = 0x40; + else if (m_tmp_day == 7) + timer.m_iWeekdays = 0x1F; + else if (m_tmp_day == 8) + timer.m_iWeekdays = 0x3F; + else if (m_tmp_day == 9) + timer.m_iWeekdays = 0x7F; + else if (m_tmp_day == 10) + timer.m_iWeekdays = 0x60; + else + timer.m_iWeekdays = 0; +} - timerEndTimeStr = tag->EndAsLocalTime().GetAsLocalizedTime("", false); - UpdateSetting(CONTROL_TMR_END); - } - } - else if (setting.id == CONTROL_TMR_FIRST_DAY && m_tmp_day <= 10) +void CGUIDialogPVRTimerSettings::getChannelNames(bool bRadio, std::vector< std::pair<std::string, int> > &list, int ¤t, bool updateChannelEntries /* = false */) +{ + CFileItemList channelsList; + g_PVRChannelGroups->GetGroupAll(bRadio)->GetMembers(channelsList); + + int entry = 0; + list.push_back(std::make_pair("0 dummy", entry)); + if (updateChannelEntries) + m_channelEntries.insert(std::make_pair(std::make_pair(bRadio, entry), PVR_VIRTUAL_CHANNEL_UID)); + ++entry; + + for (int i = 0; i < channelsList.Size(); i++) { - CDateTime newFirstDay; - if (m_tmp_iFirstDay > 0) - newFirstDay = CDateTime::GetCurrentDateTime() + CDateTimeSpan(m_tmp_iFirstDay-1, 0, 0, 0); + const CPVRChannel *channel = channelsList[i]->GetPVRChannelInfoTag(); - tag->SetFirstDayFromLocalTime(newFirstDay); + list.push_back(std::make_pair(StringUtils::Format("%i %s", channel->ChannelNumber(), channel->ChannelName().c_str()), entry)); + if (updateChannelEntries) + m_channelEntries.insert(std::make_pair(std::make_pair(bRadio, entry), channel->ChannelID())); + ++entry; } +} - tag->UpdateSummary(); +void CGUIDialogPVRTimerSettings::setButtonLabels() +{ + // timer start time + BaseSettingControlPtr settingControl = GetSettingControl(SETTING_TMR_BEGIN); + if (settingControl != NULL && settingControl->GetControl() != NULL) + SET_CONTROL_LABEL2(settingControl->GetID(), m_timerStartTimeStr); + + // timer end time + settingControl = GetSettingControl(SETTING_TMR_END); + if (settingControl != NULL && settingControl->GetControl() != NULL) + SET_CONTROL_LABEL2(settingControl->GetID(), m_timerEndTimeStr); } -void CGUIDialogPVRTimerSettings::SetTimer(CFileItem *item) + bool CGUIDialogPVRTimerSettings::IsTimerDayRepeating(const std::string &condition, const std::string &value, const CSetting *setting) + { + if (setting == NULL || setting->GetType() != SettingTypeInteger) + return false; + + bool result = static_cast<const CSettingInt*>(setting)->GetValue() <= 10; + return result == StringUtils::EqualsNoCase(value, "true"); + } + +void CGUIDialogPVRTimerSettings::ChannelNamesOptionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { - m_timerItem = item; - m_cancelled = true; + if (data == NULL) + return; - m_timerItem->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsSystemTime(timerStartTime); - m_timerItem->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsSystemTime(timerEndTime); - timerStartTimeStr = m_timerItem->GetPVRTimerInfoTag()->StartAsLocalTime().GetAsLocalizedTime("", false); - timerEndTimeStr = m_timerItem->GetPVRTimerInfoTag()->EndAsLocalTime().GetAsLocalizedTime("", false); + CGUIDialogPVRTimerSettings *dialog = static_cast<CGUIDialogPVRTimerSettings*>(data); + if (dialog == NULL) + return; - m_tmp_iFirstDay = 0; - m_tmp_day = 11; + dialog->getChannelNames(setting->GetId() == SETTING_TMR_CHNAME_RADIO, list, current, false); } -void CGUIDialogPVRTimerSettings::OnOkay() +void CGUIDialogPVRTimerSettings::DaysOptionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { - m_cancelled = false; - CPVRTimerInfoTag* tag = m_timerItem->GetPVRTimerInfoTag(); + if (setting == NULL || data == NULL) + return; - // Set the timer's title to the channel name if it's 'New Timer' or empty - if (tag->m_strTitle == g_localizeStrings.Get(19056) || tag->m_strTitle.empty()) + CGUIDialogPVRTimerSettings *dialog = static_cast<CGUIDialogPVRTimerSettings*>(data); + if (dialog == NULL) + return; + + const CPVRTimerInfoTag *tag = dialog->m_timerItem->GetPVRTimerInfoTag(); + if (tag == NULL) + return; + + if (setting->GetId() == SETTING_TMR_DAY) { - CPVRChannelPtr channel = g_PVRChannelGroups->GetByUniqueID(tag->m_iClientChannelUid, tag->m_iClientId); - if (channel) - tag->m_strTitle = channel->ChannelName(); + for (unsigned int iDayPtr = 19086; iDayPtr <= 19096; iDayPtr++) + list.push_back(std::make_pair(g_localizeStrings.Get(iDayPtr), list.size())); + } + else if (setting->GetId() == SETTING_TMR_FIRST_DAY) + list.push_back(std::make_pair(g_localizeStrings.Get(19030), 0)); + + CDateTime time = CDateTime::GetCurrentDateTime(); + for (int i = 1; i < 365; ++i) + { + CStdString string = time.GetAsLocalizedDate(); + list.push_back(std::make_pair(time.GetAsLocalizedDate(), list.size())); + time += CDateTimeSpan(1, 0, 0, 0); } - - if (m_bTimerActive) - tag->m_state = PVR_TIMER_STATE_SCHEDULED; - else - tag->m_state = PVR_TIMER_STATE_CANCELLED; } diff --git a/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h b/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h index c721554529..e233eeb205 100644 --- a/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h +++ b/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.h @@ -1,6 +1,6 @@ #pragma once /* - * Copyright (C) 2012-2013 Team XBMC + * Copyright (C) 2012-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -19,37 +19,56 @@ * */ +#include <map> + #include "XBDateTime.h" -#include "settings/dialogs/GUIDialogSettings.h" -#include "guilib/GUIListItem.h" +#include "settings/dialogs/GUIDialogSettingsManualBase.h" class CFileItem; +class CSetting; +class CSettingGroup; namespace PVR { class CPVRTimerInfoTag; - class CGUIDialogPVRTimerSettings : public CGUIDialogSettings + class CGUIDialogPVRTimerSettings : public CGUIDialogSettingsManualBase { public: - CGUIDialogPVRTimerSettings(void); - virtual ~CGUIDialogPVRTimerSettings(void) {} + CGUIDialogPVRTimerSettings(); + virtual ~CGUIDialogPVRTimerSettings() { } + void SetTimer(CFileItem *item); - bool GetOK() { return !m_cancelled; } protected: - virtual void CreateSettings(); - virtual void OnSettingChanged(SettingInfo &setting); - virtual void OnOkay(); - virtual void OnCancel() { m_cancelled = true; } - virtual void AddChannelNames(CFileItemList &channelsList, SETTINGSTRINGS &channelNames, bool bRadio); + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save(); + virtual void SetupView(); + + // specialization of CGUIDialogSettingsManualBase + virtual void InitializeSettings(); + + virtual CSetting* AddChannelNames(CSettingGroup *group, bool bRadio); virtual void SetWeekdaySettingFromTimer(const CPVRTimerInfoTag &timer); virtual void SetTimerFromWeekdaySetting(CPVRTimerInfoTag &timer); - SYSTEMTIME timerStartTime; - SYSTEMTIME timerEndTime; - CStdString timerStartTimeStr; - CStdString timerEndTimeStr; + void getChannelNames(bool bRadio, std::vector< std::pair<std::string, int> > &list, int ¤t, bool updateChannelEntries = false); + void setButtonLabels(); + + static bool IsTimerDayRepeating(const std::string &condition, const std::string &value, const CSetting *setting); + + static void ChannelNamesOptionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void DaysOptionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + + SYSTEMTIME m_timerStartTime; + SYSTEMTIME m_timerEndTime; + std::string m_timerStartTimeStr; + std::string m_timerEndTimeStr; int m_tmp_iFirstDay; int m_tmp_day; bool m_bTimerActive; @@ -57,6 +76,5 @@ namespace PVR std::map<std::pair<bool, int>, int> m_channelEntries; CFileItem *m_timerItem; - bool m_cancelled; }; } diff --git a/xbmc/pvr/windows/GUIWindowPVRChannels.cpp b/xbmc/pvr/windows/GUIWindowPVRChannels.cpp index 41d5e7ecff..74ba3c6186 100644 --- a/xbmc/pvr/windows/GUIWindowPVRChannels.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRChannels.cpp @@ -264,6 +264,26 @@ void CGUIWindowPVRChannels::UpdateData(bool bUpdateSelectedFile /* = true */) m_parent->SetLabel(CONTROL_LABELGROUP, currentGroup->GroupName()); } +bool CGUIWindowPVRChannels::OnAction(const CAction &action) +{ + switch (action.GetID()) + { + case REMOTE_0: + case REMOTE_1: + case REMOTE_2: + case REMOTE_3: + case REMOTE_4: + case REMOTE_5: + case REMOTE_6: + case REMOTE_7: + case REMOTE_8: + case REMOTE_9: + return ActionInputChannelNumber(action.GetID() - REMOTE_0); + } + + return false; +} + bool CGUIWindowPVRChannels::OnClickButton(CGUIMessage &message) { bool bReturn = false; diff --git a/xbmc/pvr/windows/GUIWindowPVRChannels.h b/xbmc/pvr/windows/GUIWindowPVRChannels.h index 3f9a982f48..fe61c20808 100644 --- a/xbmc/pvr/windows/GUIWindowPVRChannels.h +++ b/xbmc/pvr/windows/GUIWindowPVRChannels.h @@ -45,6 +45,7 @@ namespace PVR void Notify(const Observable &obs, const ObservableMessage msg); void ResetObservers(void); void UnregisterObservers(void); + bool OnAction(const CAction &action); private: bool OnClickButton(CGUIMessage &message); diff --git a/xbmc/pvr/windows/GUIWindowPVRCommon.cpp b/xbmc/pvr/windows/GUIWindowPVRCommon.cpp index 6b356537e8..96caba2daa 100644 --- a/xbmc/pvr/windows/GUIWindowPVRCommon.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRCommon.cpp @@ -22,6 +22,7 @@ #include "Application.h" #include "ApplicationMessenger.h" +#include "dialogs/GUIDialogNumeric.h" #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" @@ -566,6 +567,36 @@ bool CGUIWindowPVRCommon::ActionDeleteChannel(CFileItem *item) return true; } +bool CGUIWindowPVRCommon::ActionInputChannelNumber(int input, bool bGuideGrid) +{ + CStdString strInput = StringUtils::Format("%i", input); + if (CGUIDialogNumeric::ShowAndGetNumber(strInput, g_localizeStrings.Get(19103))) + { + int iChannelNumber = atoi(strInput.c_str()); + if (iChannelNumber > 0) + { + int itemIndex = 0; + VECFILEITEMS items = m_parent->m_vecItems->GetList(); + for(VECFILEITEMS::iterator it = items.begin(); it != items.end(); ++it) + { + if(((*it)->HasPVRChannelInfoTag() && (*it)->GetPVRChannelInfoTag()->ChannelNumber() == iChannelNumber) || + ((*it)->HasEPGInfoTag() && (*it)->GetEPGInfoTag()->HasPVRChannel() && (*it)->GetEPGInfoTag()->PVRChannelNumber() == iChannelNumber)) + { + // different handling for guide grid + if (bGuideGrid && m_parent->m_guideGrid) + m_parent->m_guideGrid->SetChannel((*(*it)->GetEPGInfoTag()->ChannelTag())); + else + m_parent->m_viewControl.SetSelectedItem(itemIndex); + return true; + } + itemIndex++; + } + } + } + + return false; +} + bool CGUIWindowPVRCommon::UpdateEpgForChannel(CFileItem *item) { CPVRChannel *channel = item->GetPVRChannelInfoTag(); @@ -599,10 +630,9 @@ bool CGUIWindowPVRCommon::ShowTimerSettings(CFileItem *item) pDlgInfo->DoModal(); /* Get modify flag from window and return it to caller */ - return pDlgInfo->GetOK(); + return pDlgInfo->IsConfirmed(); } - bool CGUIWindowPVRCommon::PlayRecording(CFileItem *item, bool bPlayMinimized /* = false */) { if (!item->HasPVRRecordingInfoTag()) diff --git a/xbmc/pvr/windows/GUIWindowPVRCommon.h b/xbmc/pvr/windows/GUIWindowPVRCommon.h index 7320c56f94..05d4228192 100644 --- a/xbmc/pvr/windows/GUIWindowPVRCommon.h +++ b/xbmc/pvr/windows/GUIWindowPVRCommon.h @@ -117,6 +117,7 @@ namespace PVR virtual bool ActionPlayChannel(CFileItem *item); virtual bool ActionPlayEpg(CFileItem *item); virtual bool ActionDeleteChannel(CFileItem *item); + virtual bool ActionInputChannelNumber(int input, bool bGuideGrid = false); virtual bool PlayRecording(CFileItem *item, bool bPlayMinimized = false); virtual bool PlayFile(CFileItem *item, bool bPlayMinimized = false); diff --git a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp index b8c2063ba0..c0b149f876 100644 --- a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp @@ -120,6 +120,27 @@ void CGUIWindowPVRGuide::GetContextButtons(int itemNumber, CContextButtons &butt buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ } +bool CGUIWindowPVRGuide::OnAction(const CAction &action) +{ + switch (action.GetID()) + { + case REMOTE_0: + case REMOTE_1: + case REMOTE_2: + case REMOTE_3: + case REMOTE_4: + case REMOTE_5: + case REMOTE_6: + case REMOTE_7: + case REMOTE_8: + case REMOTE_9: + if (m_iGuideView != GUIDE_VIEW_CHANNEL) + return ActionInputChannelNumber(action.GetID() - REMOTE_0, (m_iGuideView == GUIDE_VIEW_TIMELINE)); + break; + } + + return false; +} bool CGUIWindowPVRGuide::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { @@ -519,7 +540,7 @@ void CGUIWindowPVRGuide::UpdateButtons(void) m_parent->SetLabel(m_iControlButton, g_localizeStrings.Get(19222) + ": " + g_localizeStrings.Get(19032)); } -void CGUIWindowPVRGuide::SettingOptionsEpgGuideViewFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CGUIWindowPVRGuide::SettingOptionsEpgGuideViewFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { list.push_back(make_pair(g_localizeStrings.Get(19029), PVR::GUIDE_VIEW_CHANNEL)); list.push_back(make_pair(g_localizeStrings.Get(19030), PVR::GUIDE_VIEW_NOW)); diff --git a/xbmc/pvr/windows/GUIWindowPVRGuide.h b/xbmc/pvr/windows/GUIWindowPVRGuide.h index 988ef06b73..8a4ea76dc6 100644 --- a/xbmc/pvr/windows/GUIWindowPVRGuide.h +++ b/xbmc/pvr/windows/GUIWindowPVRGuide.h @@ -48,6 +48,7 @@ namespace PVR CGUIWindowPVRGuide(CGUIWindowPVR *parent); virtual ~CGUIWindowPVRGuide(void); + bool OnAction(const CAction &action); void GetContextButtons(int itemNumber, CContextButtons &buttons) const; bool OnContextButton(int itemNumber, CONTEXT_BUTTON button); void UpdateData(bool bUpdateSelectedFile = true); @@ -56,7 +57,7 @@ namespace PVR void UnregisterObservers(void); void ResetObservers(void); - static void SettingOptionsEpgGuideViewFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); + static void SettingOptionsEpgGuideViewFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); private: bool SelectPlayingFile(void); diff --git a/xbmc/settings/DisplaySettings.cpp b/xbmc/settings/DisplaySettings.cpp index 878b4f43a2..246a0476bb 100644 --- a/xbmc/settings/DisplaySettings.cpp +++ b/xbmc/settings/DisplaySettings.cpp @@ -595,7 +595,7 @@ RESOLUTION CDisplaySettings::GetResolutionForScreen() return RES_DESKTOP; } -void CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { list.push_back(make_pair(g_localizeStrings.Get(13551), 0)); @@ -603,7 +603,7 @@ void CDisplaySettings::SettingOptionsRefreshChangeDelaysFiller(const CSetting *s list.push_back(make_pair(StringUtils::Format(g_localizeStrings.Get(13553).c_str(), (double)i / 10.0), i)); } -void CDisplaySettings::SettingOptionsRefreshRatesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CDisplaySettings::SettingOptionsRefreshRatesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { // get the proper resolution RESOLUTION res = CDisplaySettings::Get().GetDisplayResolution(); @@ -635,7 +635,7 @@ void CDisplaySettings::SettingOptionsRefreshRatesFiller(const CSetting *setting, current = GetStringFromResolution(res, g_Windowing.DefaultRefreshRate(resInfo.iScreen, refreshrates).RefreshRate); } -void CDisplaySettings::SettingOptionsResolutionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CDisplaySettings::SettingOptionsResolutionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { RESOLUTION res = CDisplaySettings::Get().GetDisplayResolution(); RESOLUTION_INFO info = CDisplaySettings::Get().GetResolutionInfo(res); @@ -664,7 +664,7 @@ void CDisplaySettings::SettingOptionsResolutionsFiller(const CSetting *setting, } } -void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { if (g_advancedSettings.m_canWindowed) list.push_back(make_pair(g_localizeStrings.Get(242), DM_WINDOWED)); @@ -690,7 +690,7 @@ void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std: #endif } -void CDisplaySettings::SettingOptionsVerticalSyncsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CDisplaySettings::SettingOptionsVerticalSyncsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { // This ifdef is intended to catch everything except Linux and FreeBSD #if defined(TARGET_LINUX) && !defined(TARGET_DARWIN) && !defined(TARGET_ANDROID) && !defined(TARGET_RASPBERRY_PI) @@ -701,7 +701,7 @@ void CDisplaySettings::SettingOptionsVerticalSyncsFiller(const CSetting *setting list.push_back(make_pair(g_localizeStrings.Get(13108), VSYNC_ALWAYS)); } -void CDisplaySettings::SettingOptionsStereoscopicModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CDisplaySettings::SettingOptionsStereoscopicModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { for (int i = RENDER_STEREO_MODE_OFF; i < RENDER_STEREO_MODE_COUNT; i++) { @@ -711,13 +711,13 @@ void CDisplaySettings::SettingOptionsStereoscopicModesFiller(const CSetting *set } } -void CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t) +void CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { - SettingOptionsStereoscopicModesFiller(setting, list, current); + SettingOptionsStereoscopicModesFiller(setting, list, current, data); list.push_back(make_pair(g_localizeStrings.Get(36525), RENDER_STEREO_MODE_AUTO)); // option for autodetect } -void CDisplaySettings::SettingOptionsMonitorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t) +void CDisplaySettings::SettingOptionsMonitorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data) { #if defined(HAS_GLX) std::vector<CStdString> monitors; diff --git a/xbmc/settings/DisplaySettings.h b/xbmc/settings/DisplaySettings.h index bead24b392..931eb280ea 100644 --- a/xbmc/settings/DisplaySettings.h +++ b/xbmc/settings/DisplaySettings.h @@ -89,14 +89,14 @@ public: bool IsNonLinearStretched() const { return m_nonLinearStretched; } void SetNonLinearStretched(bool nonLinearStretch) { m_nonLinearStretched = nonLinearStretch; } - static void SettingOptionsRefreshChangeDelaysFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionsRefreshRatesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - static void SettingOptionsResolutionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionsScreensFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionsVerticalSyncsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionsStereoscopicModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionsPreferredStereoscopicViewModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); - static void SettingOptionsMonitorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); + static void SettingOptionsRefreshChangeDelaysFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionsRefreshRatesFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); + static void SettingOptionsResolutionsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionsScreensFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionsVerticalSyncsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionsStereoscopicModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionsPreferredStereoscopicViewModesFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SettingOptionsMonitorsFiller(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); protected: CDisplaySettings(); diff --git a/xbmc/settings/Makefile b/xbmc/settings/Makefile index 38611880ef..45f0857c18 100644 --- a/xbmc/settings/Makefile +++ b/xbmc/settings/Makefile @@ -3,9 +3,12 @@ SRCS=AdvancedSettings.cpp \ MediaSettings.cpp \ MediaSourceSettings.cpp \ SettingAddon.cpp \ + SettingConditions.cpp \ SettingControl.cpp \ + SettingCreator.cpp \ SettingPath.cpp \ Settings.cpp \ + SettingUtils.cpp \ SkinSettings.cpp \ VideoSettings.cpp \ diff --git a/xbmc/settings/SettingAddon.cpp b/xbmc/settings/SettingAddon.cpp index f6d38eaa1b..c3415fabc4 100644 --- a/xbmc/settings/SettingAddon.cpp +++ b/xbmc/settings/SettingAddon.cpp @@ -31,6 +31,11 @@ CSettingAddon::CSettingAddon(const std::string &id, CSettingsManager *settingsMa : CSettingString(id, settingsManager), m_addonType(ADDON::ADDON_UNKNOWN) { } + +CSettingAddon::CSettingAddon(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager /* = NULL */) + : CSettingString(id, label, value, settingsManager), + m_addonType(ADDON::ADDON_UNKNOWN) +{ } CSettingAddon::CSettingAddon(const std::string &id, const CSettingAddon &setting) : CSettingString(id, setting) diff --git a/xbmc/settings/SettingAddon.h b/xbmc/settings/SettingAddon.h index fb58f15f2b..3b2ce9f199 100644 --- a/xbmc/settings/SettingAddon.h +++ b/xbmc/settings/SettingAddon.h @@ -26,6 +26,7 @@ class CSettingAddon : public CSettingString { public: CSettingAddon(const std::string &id, CSettingsManager *settingsManager = NULL); + CSettingAddon(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager = NULL); CSettingAddon(const std::string &id, const CSettingAddon &setting); virtual ~CSettingAddon() { } @@ -34,6 +35,7 @@ public: virtual bool Deserialize(const TiXmlNode *node, bool update = false); ADDON::TYPE GetAddonType() const { return m_addonType; } + void SetAddonType(ADDON::TYPE addonType) { m_addonType = addonType; } private: void copy(const CSettingAddon &setting); diff --git a/xbmc/settings/SettingConditions.cpp b/xbmc/settings/SettingConditions.cpp new file mode 100644 index 0000000000..ff10d49601 --- /dev/null +++ b/xbmc/settings/SettingConditions.cpp @@ -0,0 +1,307 @@ +/* + * 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 "SettingConditions.h" +#include "Application.h" +#include "GUIPassword.h" +#include "Util.h" +#include "addons/AddonManager.h" +#include "addons/Skin.h" +#if defined(TARGET_ANDROID) +#include "android/activity/AndroidFeatures.h" +#endif // defined(TARGET_ANDROID) +#include "cores/AudioEngine/AEFactory.h" +#if defined(HAVE_LIBCRYSTALHD) +#include "cores/dvdplayer/DVDCodecs/Video/CrystalHD.h" +#endif // defined(HAVE_LIBCRYSTALHD) +#include "cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" +#include "guilib/LocalizeStrings.h" +#include "peripherals/Peripherals.h" +#include "profiles/ProfilesManager.h" +#include "pvr/PVRManager.h" +#include "settings/SettingAddon.h" +#if defined(HAS_LIBAMCODEC) +#include "utils/AMLUtils.h" +#endif // defined(HAS_LIBAMCODEC) +#include "utils/SystemInfo.h" +#include "windowing/WindowingFactory.h" + +bool AddonHasSettings(const std::string &condition, const std::string &value, const CSetting *setting) +{ + if (setting == NULL) + return false; + + const CSettingAddon *settingAddon = dynamic_cast<const CSettingAddon*>(setting); + if (settingAddon == NULL) + return false; + + ADDON::AddonPtr addon; + if (!ADDON::CAddonMgr::Get().GetAddon(settingAddon->GetValue(), addon, settingAddon->GetAddonType()) || addon == NULL) + return false; + + if (addon->Type() == ADDON::ADDON_SKIN) + return ((ADDON::CSkinInfo*)addon.get())->HasSkinFile("SkinSettings.xml"); + + return addon->HasSettings(); +} + +bool CheckMasterLock(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return g_passwordManager.IsMasterLockUnlocked(StringUtils::EqualsNoCase(value, "true")); +} + +bool CheckPVRParentalPin(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return PVR::g_PVRManager.CheckParentalPIN(g_localizeStrings.Get(19262).c_str()); +} + +bool HasPeripherals(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return PERIPHERALS::g_peripherals.GetNumberOfPeripherals() > 0; +} + +bool IsFullscreen(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return g_Windowing.IsFullScreen(); +} + +bool IsMasterUser(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return g_passwordManager.bMasterUser; +} + +bool IsUsingTTFSubtitles(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CUtil::IsUsingTTFSubtitles(); +} + +bool ProfileCanWriteDatabase(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().canWriteDatabases(); +} + +bool ProfileCanWriteSources(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().canWriteSources(); +} + +bool ProfileHasAddons(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().hasAddons(); +} + +bool ProfileHasDatabase(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().hasDatabases(); +} + +bool ProfileHasSources(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().hasSources(); +} + +bool ProfileHasAddonManagerLocked(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().addonmanagerLocked(); +} + +bool ProfileHasFilesLocked(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().filesLocked(); +} + +bool ProfileHasMusicLocked(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().musicLocked(); +} + +bool ProfileHasPicturesLocked(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().picturesLocked(); +} + +bool ProfileHasProgramsLocked(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().programsLocked(); +} + +bool ProfileHasSettingsLocked(const std::string &condition, const std::string &value, const CSetting *setting) +{ + LOCK_LEVEL::SETTINGS_LOCK slValue=LOCK_LEVEL::ALL; + if (StringUtils::EqualsNoCase(value, "none")) + slValue = LOCK_LEVEL::NONE; + else if (StringUtils::EqualsNoCase(value, "standard")) + slValue = LOCK_LEVEL::STANDARD; + else if (StringUtils::EqualsNoCase(value, "advanced")) + slValue = LOCK_LEVEL::ADVANCED; + else if (StringUtils::EqualsNoCase(value, "expert")) + slValue = LOCK_LEVEL::EXPERT; + return slValue <= CProfilesManager::Get().GetCurrentProfile().settingsLockLevel(); +} + +bool ProfileHasVideosLocked(const std::string &condition, const std::string &value, const CSetting *setting) +{ + return CProfilesManager::Get().GetCurrentProfile().videoLocked(); +} + +bool ProfileLockMode(const std::string &condition, const std::string &value, const CSetting *setting) +{ + char *tmp = NULL; + LockType lock = (LockType)strtol(value.c_str(), &tmp, 0); + if (tmp != NULL && *tmp != '\0') + return false; + + return CProfilesManager::Get().GetCurrentProfile().getLockMode() == lock; +} + +std::set<std::string> CSettingConditions::m_simpleConditions; +std::map<std::string, SettingConditionCheck> CSettingConditions::m_complexConditions; + +void CSettingConditions::Initialize() +{ + if (!m_simpleConditions.empty()) + return; + + // add simple conditions + m_simpleConditions.insert("true"); +#ifdef HAS_UPNP + m_simpleConditions.insert("has_upnp"); +#endif +#ifdef HAS_AIRPLAY + m_simpleConditions.insert("has_airplay"); +#endif +#ifdef HAS_EVENT_SERVER + m_simpleConditions.insert("has_event_server"); +#endif +#ifdef HAVE_X11 + m_simpleConditions.insert("have_x11"); +#endif +#ifdef HAS_GL + m_simpleConditions.insert("has_gl"); +#endif +#ifdef HAS_GLX + m_simpleConditions.insert("has_glx"); +#endif +#ifdef HAS_GLES + m_simpleConditions.insert("has_gles"); +#endif +#if HAS_GLES == 2 + m_simpleConditions.insert("has_glesv2"); +#endif +#ifdef HAS_KARAOKE + m_simpleConditions.insert("has_karaoke"); +#endif +#ifdef HAS_SDL_JOYSTICK + m_simpleConditions.insert("has_sdl_joystick"); +#endif +#ifdef HAS_SKIN_TOUCHED + m_simpleConditions.insert("has_skin_touched"); +#endif +#ifdef HAS_TIME_SERVER + m_simpleConditions.insert("has_time_server"); +#endif +#ifdef HAS_WEB_SERVER + m_simpleConditions.insert("has_web_server"); +#endif +#ifdef HAS_ZEROCONF + m_simpleConditions.insert("has_zeroconf"); +#endif +#ifdef HAVE_LIBCRYSTALHD + m_simpleConditions.insert("have_libcrystalhd"); + if (CCrystalHD::GetInstance()->DevicePresent()) + m_simpleConditions.insert("hascrystalhddevice"); +#endif +#ifdef HAVE_LIBOPENMAX + m_simpleConditions.insert("have_libopenmax"); +#endif +#ifdef HAVE_LIBVA + m_simpleConditions.insert("have_libva"); +#endif +#ifdef HAVE_LIBVDPAU + m_simpleConditions.insert("have_libvdpau"); +#endif +#ifdef TARGET_ANDROID + if (CAndroidFeatures::GetVersion() > 15) + m_simpleConditions.insert("has_mediacodec"); +#endif +#ifdef HAS_LIBSTAGEFRIGHT + m_simpleConditions.insert("have_libstagefrightdecoder"); +#endif +#ifdef HAVE_VIDEOTOOLBOXDECODER + m_simpleConditions.insert("have_videotoolboxdecoder"); + if (g_sysinfo.HasVideoToolBoxDecoder()) + m_simpleConditions.insert("hasvideotoolboxdecoder"); +#endif +#ifdef HAS_LIBAMCODEC + if (aml_present()) + m_simpleConditions.insert("have_amcodec"); +#endif +#ifdef TARGET_DARWIN_IOS_ATV2 + if (g_sysinfo.IsAppleTV2()) + m_simpleConditions.insert("isappletv2"); +#endif +#if defined(TARGET_WINDOWS) && defined(HAS_DX) + m_simpleConditions.insert("has_dx"); + m_simpleConditions.insert("hasdxva2"); +#endif + + if (g_application.IsStandAlone()) + m_simpleConditions.insert("isstandalone"); + + if(CAEFactory::SupportsQualitySetting()) + m_simpleConditions.insert("has_ae_quality_levels"); + + // add complex conditions + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("addonhassettings", AddonHasSettings)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("checkmasterlock", CheckMasterLock)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("checkpvrparentalpin", CheckPVRParentalPin)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("hasperipherals", HasPeripherals)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("isfullscreen", IsFullscreen)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("ismasteruser", IsMasterUser)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("isusingttfsubtitles", IsUsingTTFSubtitles)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilecanwritedatabase", ProfileCanWriteDatabase)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilecanwritesources", ProfileCanWriteSources)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehasaddons", ProfileHasAddons)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehasdatabase", ProfileHasDatabase)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehassources", ProfileHasSources)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehasaddonmanagerlocked", ProfileHasAddonManagerLocked)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehasfileslocked", ProfileHasFilesLocked)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehasmusiclocked", ProfileHasMusicLocked)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehaspictureslocked", ProfileHasPicturesLocked)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehasprogramslocked", ProfileHasProgramsLocked)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehassettingslocked", ProfileHasSettingsLocked)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilehasvideoslocked", ProfileHasVideosLocked)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("profilelockmode", ProfileLockMode)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("aesettingvisible", CAEFactory::IsSettingVisible)); + m_complexConditions.insert(std::pair<std::string, SettingConditionCheck>("codecoptionvisible", CDVDVideoCodec::IsSettingVisible)); +} + +bool CSettingConditions::Check(const std::string &condition, const std::string &value /* = "" */, const CSetting *setting /* = NULL */) +{ + if (m_simpleConditions.find(condition) != m_simpleConditions.end()) + return true; + + std::map<std::string, SettingConditionCheck>::const_iterator itCondition = m_complexConditions.find(condition); + if (itCondition != m_complexConditions.end()) + return itCondition->second(condition, value, setting); + + return Check(condition); +} diff --git a/xbmc/settings/SettingConditions.h b/xbmc/settings/SettingConditions.h new file mode 100644 index 0000000000..77e5c6beed --- /dev/null +++ b/xbmc/settings/SettingConditions.h @@ -0,0 +1,40 @@ +#pragma once +/* + * Copyright (C) 2014 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 <string> + +#include "settings/lib/SettingConditions.h" + +class CSettingConditions +{ +public: + static void Initialize(); + + static const std::set<std::string>& GetSimpleConditions() { return m_simpleConditions; } + static const std::map<std::string, SettingConditionCheck>& GetComplexConditions() { return m_complexConditions; } + + static bool Check(const std::string &condition, const std::string &value = "", const CSetting *setting = NULL); + +private: + static std::set<std::string> m_simpleConditions; + static std::map<std::string, SettingConditionCheck> m_complexConditions; +}; diff --git a/xbmc/settings/SettingControl.cpp b/xbmc/settings/SettingControl.cpp index 92e64faae2..de2b2479e5 100644 --- a/xbmc/settings/SettingControl.cpp +++ b/xbmc/settings/SettingControl.cpp @@ -27,6 +27,26 @@ #include "utils/XBMCTinyXML.h" #include "utils/XMLUtils.h" +ISettingControl* CSettingControlCreator::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(); + else if (StringUtils::EqualsNoCase(controlType, "slider")) + return new CSettingControlSlider(); + else if (StringUtils::EqualsNoCase(controlType, "range")) + return new CSettingControlRange(); + + return NULL; +} + bool CSettingControlCheckmark::SetFormat(const std::string &format) { return format.empty() || StringUtils::EqualsNoCase(format, "boolean"); @@ -103,8 +123,7 @@ bool CSettingControlEdit::SetFormat(const std::string &format) !StringUtils::EqualsNoCase(format, "integer") && !StringUtils::EqualsNoCase(format, "number") && !StringUtils::EqualsNoCase(format, "ip") && - !StringUtils::EqualsNoCase(format, "md5") && - !StringUtils::EqualsNoCase(format, "path")) // TODO + !StringUtils::EqualsNoCase(format, "md5")) return false; m_format = format; @@ -126,11 +145,8 @@ bool CSettingControlButton::Deserialize(const TiXmlNode *node, bool update /* = bool CSettingControlButton::SetFormat(const std::string &format) { - 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 + if (!StringUtils::EqualsNoCase(format, "path") && + !StringUtils::EqualsNoCase(format, "addon") && !StringUtils::EqualsNoCase(format, "action")) return false; @@ -161,4 +177,89 @@ bool CSettingControlList::SetFormat(const std::string &format) StringUtils::ToLower(m_format); return true; -}
\ No newline at end of file +} + +bool CSettingControlSlider::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_POPUP, m_popup); + + XMLUtils::GetInt(node, SETTING_XML_ELM_CONTROL_FORMATLABEL, m_formatLabel); + if (m_formatLabel < 0) + { + std::string strFormat; + if (XMLUtils::GetString(node, SETTING_XML_ATTR_FORMAT, strFormat) && !strFormat.empty()) + m_formatString = strFormat; + } + + return true; +} + +bool CSettingControlSlider::SetFormat(const std::string &format) +{ + if (StringUtils::EqualsNoCase(format, "percentage")) + m_format = "%i %%"; + else if (StringUtils::EqualsNoCase(format, "integer")) + m_format = "%d"; + else if (StringUtils::EqualsNoCase(format, "number")) + m_format = "%.1f"; + else + return false; + + m_format = format; + StringUtils::ToLower(m_format); + + return true; +} + +bool CSettingControlRange::Deserialize(const TiXmlNode *node, bool update /* = false */) +{ + if (!ISettingControl::Deserialize(node, update)) + return false; + + const TiXmlElement *formatLabel = node->FirstChildElement(SETTING_XML_ELM_CONTROL_FORMATLABEL); + if (formatLabel != NULL) + { + XMLUtils::GetInt(node, SETTING_XML_ELM_CONTROL_FORMATLABEL, m_formatLabel); + if (m_formatLabel < 0) + return false; + + const char *formatValue = formatLabel->Attribute(SETTING_XML_ELM_CONTROL_FORMATVALUE); + if (formatValue != NULL) + { + if (StringUtils::IsInteger(formatValue)) + m_valueFormatLabel = (int)strtol(formatValue, NULL, 0); + else + { + m_valueFormat = formatValue; + if (!m_valueFormat.empty()) + m_valueFormatLabel = -1; + } + } + } + + return true; +} + +bool CSettingControlRange::SetFormat(const std::string &format) +{ + if (StringUtils::EqualsNoCase(format, "percentage")) + m_valueFormat = "%i %%"; + else if (StringUtils::EqualsNoCase(format, "integer")) + m_valueFormat = "%d"; + else if (StringUtils::EqualsNoCase(format, "number")) + m_valueFormat = "%.1f"; + else if (StringUtils::EqualsNoCase(format, "date") || + StringUtils::EqualsNoCase(format, "time")) + m_valueFormat.clear(); + else + return false; + + m_format = format; + StringUtils::ToLower(m_format); + + return true; +} diff --git a/xbmc/settings/SettingControl.h b/xbmc/settings/SettingControl.h index 4d9901dc22..f9d43029d2 100644 --- a/xbmc/settings/SettingControl.h +++ b/xbmc/settings/SettingControl.h @@ -20,6 +20,7 @@ */ #include "settings/lib/ISettingControl.h" +#include "settings/lib/ISettingControlCreator.h" #define SETTING_XML_ELM_CONTROL_FORMATLABEL "formatlabel" #define SETTING_XML_ELM_CONTROL_HIDDEN "hidden" @@ -27,6 +28,20 @@ #define SETTING_XML_ELM_CONTROL_HEADING "heading" #define SETTING_XML_ELM_CONTROL_HIDEVALUE "hidevalue" #define SETTING_XML_ELM_CONTROL_MULTISELECT "multiselect" +#define SETTING_XML_ELM_CONTROL_POPUP "popup" +#define SETTING_XML_ELM_CONTROL_FORMATVALUE "value" + +class CVariant; + +class CSettingControlCreator : public ISettingControlCreator +{ +public: + CSettingControlCreator() { } + virtual ~CSettingControlCreator() { } + + // implementation of ISettingControlCreator + virtual ISettingControl* CreateControl(const std::string &controlType) const; +}; class CSettingControlCheckmark : public ISettingControl { @@ -39,8 +54,6 @@ public: // implementation of ISettingControl virtual std::string GetType() const { return "toggle"; } - -protected: virtual bool SetFormat(const std::string &format); }; @@ -57,18 +70,19 @@ public: // implementation of ISettingControl virtual std::string GetType() const { return "spinner"; } virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetFormatLabel() const { return m_formatLabel; } + void SetFormatLabel(int formatLabel) { m_formatLabel = formatLabel; } const std::string& GetFormatString() const { return m_formatString; } + void SetFormatString(const std::string &formatString) { m_formatString = formatString; } int GetMinimumLabel() const { return m_minimumLabel; } + void SetMinimumLabel(int minimumLabel) { m_minimumLabel = minimumLabel; } protected: - virtual bool SetFormat(const std::string &format); - int m_formatLabel; std::string m_formatString; int m_minimumLabel; - }; class CSettingControlEdit : public ISettingControl @@ -86,14 +100,16 @@ public: // implementation of ISettingControl virtual std::string GetType() const { return "edit"; } virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); bool IsHidden() const { return m_hidden; } + void SetHidden(bool hidden) { m_hidden = hidden; } bool VerifyNewValue() const { return m_verifyNewValue; } + void SetVerifyNewValue(bool verifyNewValue) { m_verifyNewValue = verifyNewValue; } int GetHeading() const { return m_heading; } + void SetHeading(int heading) { m_heading = heading; } protected: - virtual bool SetFormat(const std::string &format); - bool m_hidden; bool m_verifyNewValue; int m_heading; @@ -111,13 +127,14 @@ public: // implementation of ISettingControl virtual std::string GetType() const { return "button"; } virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetHeading() const { return m_heading; } + void SetHeading(int heading) { m_heading = heading; } bool HideValue() const { return m_hideValue; } + void SetHideValue(bool hideValue) { m_hideValue = hideValue; } protected: - virtual bool SetFormat(const std::string &format); - int m_heading; bool m_hideValue; }; @@ -134,13 +151,82 @@ public: // implementation of ISettingControl virtual std::string GetType() const { return "list"; } virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); int GetHeading() const { return m_heading; } + void SetHeading(int heading) { m_heading = heading; } bool CanMultiSelect() const { return m_multiselect; } + void SetMultiSelect(bool multiselect) { m_multiselect = multiselect; } -protected: - virtual bool SetFormat(const std::string &format); - +protected: int m_heading; bool m_multiselect; }; + +class CSettingControlSlider; +typedef std::string (*SettingControlSliderFormatter)(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum); + +class CSettingControlSlider : public ISettingControl +{ +public: + CSettingControlSlider() + : m_heading(-1), + m_popup(false), + m_formatLabel(-1), + m_formatString("%i"), + m_formatter(NULL) + { } + virtual ~CSettingControlSlider() { } + + // implementation of ISettingControl + virtual std::string GetType() const { return "slider"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); + + int GetHeading() const { return m_heading; } + void SetHeading(int heading) { m_heading = heading; } + bool UsePopup() const { return m_popup; } + void SetPopup(bool popup) { m_popup = popup; } + int GetFormatLabel() const { return m_formatLabel; } + void SetFormatLabel(int formatLabel) { m_formatLabel = formatLabel; } + const std::string& GetFormatString() const { return m_formatString; } + void SetFormatString(const std::string &formatString) { m_formatString = formatString; } + + SettingControlSliderFormatter GetFormatter() const { return m_formatter; } + void SetFormatter(SettingControlSliderFormatter formatter) { m_formatter = formatter; } + +protected: + int m_heading; + bool m_popup; + int m_formatLabel; + std::string m_formatString; + SettingControlSliderFormatter m_formatter; +}; + +class CSettingControlRange : public ISettingControl +{ +public: + CSettingControlRange() + : m_formatLabel(21469), + m_valueFormatLabel(-1), + m_valueFormat("%s") + { } + virtual ~CSettingControlRange() { } + + // implementation of ISettingControl + virtual std::string GetType() const { return "range"; } + virtual bool Deserialize(const TiXmlNode *node, bool update = false); + virtual bool SetFormat(const std::string &format); + + int GetFormatLabel() const { return m_formatLabel; } + void SetFormatLabel(int formatLabel) { m_formatLabel = formatLabel; } + int GetValueFormatLabel() const { return m_valueFormatLabel; } + void SetValueFormatLabel(int valueFormatLabel) { m_valueFormatLabel = valueFormatLabel; } + const std::string& GetValueFormat() const { return m_valueFormat; } + void SetValueFormat(const std::string &valueFormat) { m_valueFormat = valueFormat; } + +protected: + int m_formatLabel; + int m_valueFormatLabel; + std::string m_valueFormat; +}; diff --git a/xbmc/settings/SettingCreator.cpp b/xbmc/settings/SettingCreator.cpp new file mode 100644 index 0000000000..7e04476748 --- /dev/null +++ b/xbmc/settings/SettingCreator.cpp @@ -0,0 +1,34 @@ +/* + * 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 "SettingCreator.h" +#include "settings/SettingAddon.h" +#include "settings/SettingPath.h" +#include "utils/StringUtils.h" + +CSetting* CSettingCreator::CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager /* = NULL */) const +{ + if (StringUtils::EqualsNoCase(settingType, "addon")) + return new CSettingAddon(settingId, settingsManager); + else if (StringUtils::EqualsNoCase(settingType, "path")) + return new CSettingPath(settingId, settingsManager); + + return NULL; +} diff --git a/xbmc/settings/SettingCreator.h b/xbmc/settings/SettingCreator.h new file mode 100644 index 0000000000..50e2744c77 --- /dev/null +++ b/xbmc/settings/SettingCreator.h @@ -0,0 +1,32 @@ +#pragma once +/* + * Copyright (C) 2014 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 "settings/lib/ISettingCreator.h" + +class CSettingCreator : public ISettingCreator +{ +public: + CSettingCreator() { } + virtual ~CSettingCreator() { } + + // implementation of ISettingCreator + virtual CSetting* CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager = NULL) const; +}; diff --git a/xbmc/settings/SettingPath.cpp b/xbmc/settings/SettingPath.cpp index b331c08c57..80fcc1fe42 100644 --- a/xbmc/settings/SettingPath.cpp +++ b/xbmc/settings/SettingPath.cpp @@ -32,6 +32,11 @@ CSettingPath::CSettingPath(const std::string &id, CSettingsManager *settingsMana : CSettingString(id, settingsManager), m_writable(true) { } + +CSettingPath::CSettingPath(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager /* = NULL */) + : CSettingString(id, label, value, settingsManager), + m_writable(true) +{ } CSettingPath::CSettingPath(const std::string &id, const CSettingPath &setting) : CSettingString(id, setting) diff --git a/xbmc/settings/SettingPath.h b/xbmc/settings/SettingPath.h index d4bc580055..ad55fdc618 100644 --- a/xbmc/settings/SettingPath.h +++ b/xbmc/settings/SettingPath.h @@ -27,6 +27,7 @@ class CSettingPath : public CSettingString { public: CSettingPath(const std::string &id, CSettingsManager *settingsManager = NULL); + CSettingPath(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager = NULL); CSettingPath(const std::string &id, const CSettingPath &setting); virtual ~CSettingPath() { } @@ -36,7 +37,9 @@ public: virtual bool SetValue(const std::string &value); bool Writable() const { return m_writable; } + void SetWritable(bool writable) { m_writable = writable; } const std::vector<std::string>& GetSources() const { return m_sources; } + void SetSources(const std::vector<std::string> &sources) { m_sources = sources; } private: void copy(const CSettingPath &setting); diff --git a/xbmc/settings/SettingUtils.cpp b/xbmc/settings/SettingUtils.cpp new file mode 100644 index 0000000000..bb17374a00 --- /dev/null +++ b/xbmc/settings/SettingUtils.cpp @@ -0,0 +1,133 @@ +/* + * 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 "SettingUtils.h" +#include "settings/lib/Setting.h" +#include "utils/StringUtils.h" + +std::vector<CVariant> CSettingUtils::GetList(const CSettingList *settingList) +{ + return ListToValues(settingList, settingList->GetValue()); +} + +bool CSettingUtils::SetList(CSettingList *settingList, const std::vector<CVariant> &value) +{ + SettingPtrList newValues; + if (!ValuesToList(settingList, value, newValues)) + return false; + + return settingList->SetValue(newValues); +} + +std::vector<CVariant> CSettingUtils::ListToValues(const CSettingList *setting, const std::vector< boost::shared_ptr<CSetting> > &values) +{ + std::vector<CVariant> realValues; + + if (setting == NULL) + return realValues; + + for (SettingPtrList::const_iterator it = values.begin(); it != values.end(); ++it) + { + switch (setting->GetElementType()) + { + case SettingTypeBool: + realValues.push_back(static_cast<const CSettingBool*>(it->get())->GetValue()); + break; + + case SettingTypeInteger: + realValues.push_back(static_cast<const CSettingInt*>(it->get())->GetValue()); + break; + + case SettingTypeNumber: + realValues.push_back(static_cast<const CSettingNumber*>(it->get())->GetValue()); + break; + + case SettingTypeString: + realValues.push_back(static_cast<const CSettingString*>(it->get())->GetValue()); + break; + + default: + break; + } + } + + return realValues; +} + +bool CSettingUtils::ValuesToList(const CSettingList *setting, const std::vector<CVariant> &values, + std::vector< boost::shared_ptr<CSetting> > &newValues) +{ + if (setting == NULL) + return false; + + int index = 0; + bool ret = true; + for (std::vector<CVariant>::const_iterator itValue = values.begin(); itValue != values.end(); ++itValue) + { + CSetting *settingValue = setting->GetDefinition()->Clone(StringUtils::Format("%s.%d", setting->GetId().c_str(), index++)); + if (settingValue == NULL) + return false; + + switch (setting->GetElementType()) + { + case SettingTypeBool: + if (!itValue->isBoolean()) + ret = false; + else + ret = static_cast<CSettingBool*>(settingValue)->SetValue(itValue->asBoolean()); + break; + + case SettingTypeInteger: + if (!itValue->isInteger()) + ret = false; + else + ret = static_cast<CSettingInt*>(settingValue)->SetValue((int)itValue->asInteger()); + break; + + case SettingTypeNumber: + if (!itValue->isDouble()) + ret = false; + else + ret = static_cast<CSettingNumber*>(settingValue)->SetValue(itValue->asDouble()); + break; + + case SettingTypeString: + if (!itValue->isString()) + ret = false; + else + ret = static_cast<CSettingString*>(settingValue)->SetValue(itValue->asString()); + break; + + default: + ret = false; + break; + } + + if (!ret) + { + delete settingValue; + return false; + } + + newValues.push_back(SettingPtr(settingValue)); + } + + return true; +} diff --git a/xbmc/settings/SettingUtils.h b/xbmc/settings/SettingUtils.h new file mode 100644 index 0000000000..3f2dd55bb1 --- /dev/null +++ b/xbmc/settings/SettingUtils.h @@ -0,0 +1,50 @@ +#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 <vector> +#include <boost/shared_ptr.hpp> + +#include "utils/Variant.h" + +class CSettingList; +class CSetting; + +class CSettingUtils +{ +public: + /*! + \brief Gets the values of the given list setting. + + \param settingList List setting + \return List of values of the given list setting + */ + static std::vector<CVariant> GetList(const CSettingList *settingList); + /*! + \brief Sets the values of the given list setting. + + \param settingList List setting + \param value Values to set + \return True if setting the values was successful, false otherwise + */ + static bool SetList(CSettingList *settingList, const std::vector<CVariant> &value); + + static std::vector<CVariant> ListToValues(const CSettingList *setting, const std::vector< boost::shared_ptr<CSetting> > &values); + static bool ValuesToList(const CSettingList *setting, const std::vector<CVariant> &values, std::vector< boost::shared_ptr<CSetting> > &newValues); +}; diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index 75da811007..b8b44b7168 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -23,16 +23,11 @@ #include "Settings.h" #include "Application.h" #include "Autorun.h" -#include "GUIPassword.h" #include "LangInfo.h" #include "Util.h" -#include "addons/AddonManager.h" #include "addons/Skin.h" #include "cores/AudioEngine/AEFactory.h" #include "cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" -#if defined(HAVE_LIBCRYSTALHD) -#include "cores/dvdplayer/DVDCodecs/Video/CrystalHD.h" -#endif // defined(HAVE_LIBCRYSTALHD) #include "cores/playercorefactory/PlayerCoreFactory.h" #include "cores/VideoRenderers/BaseRenderer.h" #include "filesystem/File.h" @@ -69,8 +64,10 @@ #include "settings/MediaSettings.h" #include "settings/MediaSourceSettings.h" #include "settings/SettingAddon.h" +#include "settings/SettingConditions.h" #include "settings/SettingControl.h" #include "settings/SettingPath.h" +#include "settings/SettingUtils.h" #include "settings/SkinSettings.h" #include "settings/lib/SettingsManager.h" #include "threads/SingleLock.h" @@ -83,147 +80,12 @@ #include "utils/XBMCTinyXML.h" #include "view/ViewStateSettings.h" #include "windowing/WindowingFactory.h" -#if defined(TARGET_ANDROID) -#include "android/activity/AndroidFeatures.h" -#endif - -#if defined(HAS_LIBAMCODEC) -#include "utils/AMLUtils.h" -#endif #define SETTINGS_XML_FOLDER "special://xbmc/system/settings/" #define SETTINGS_XML_ROOT "settings" using namespace XFILE; -bool AddonHasSettings(const std::string &condition, const std::string &value, const std::string &settingId) -{ - if (settingId.empty()) - return false; - - CSettingAddon *setting = (CSettingAddon*)CSettings::Get().GetSetting(settingId); - if (setting == NULL) - return false; - - ADDON::AddonPtr addon; - if (!ADDON::CAddonMgr::Get().GetAddon(setting->GetValue(), addon, setting->GetAddonType()) || addon == NULL) - return false; - - if (addon->Type() == ADDON::ADDON_SKIN) - return ((ADDON::CSkinInfo*)addon.get())->HasSkinFile("SkinSettings.xml"); - - return addon->HasSettings(); -} - -bool CheckMasterLock(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return g_passwordManager.IsMasterLockUnlocked(StringUtils::EqualsNoCase(value, "true")); -} - -bool CheckPVRParentalPin(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return PVR::g_PVRManager.CheckParentalPIN(g_localizeStrings.Get(19262).c_str()); -} - -bool HasPeripherals(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return PERIPHERALS::g_peripherals.GetNumberOfPeripherals() > 0; -} - -bool IsFullscreen(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return g_Windowing.IsFullScreen(); -} - -bool IsMasterUser(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return g_passwordManager.bMasterUser; -} - -bool IsUsingTTFSubtitles(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CUtil::IsUsingTTFSubtitles(); -} - -bool ProfileCanWriteDatabase(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().canWriteDatabases(); -} - -bool ProfileCanWriteSources(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().canWriteSources(); -} - -bool ProfileHasAddons(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().hasAddons(); -} - -bool ProfileHasDatabase(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().hasDatabases(); -} - -bool ProfileHasSources(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().hasSources(); -} - -bool ProfileHasAddonManagerLocked(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().addonmanagerLocked(); -} - -bool ProfileHasFilesLocked(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().filesLocked(); -} - -bool ProfileHasMusicLocked(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().musicLocked(); -} - -bool ProfileHasPicturesLocked(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().picturesLocked(); -} - -bool ProfileHasProgramsLocked(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().programsLocked(); -} - -bool ProfileHasSettingsLocked(const std::string &condition, const std::string &value, const std::string &settingId) -{ - LOCK_LEVEL::SETTINGS_LOCK slValue=LOCK_LEVEL::ALL; - if (StringUtils::EqualsNoCase(value, "none")) - slValue = LOCK_LEVEL::NONE; - else if (StringUtils::EqualsNoCase(value, "standard")) - slValue = LOCK_LEVEL::STANDARD; - else if (StringUtils::EqualsNoCase(value, "advanced")) - slValue = LOCK_LEVEL::ADVANCED; - else if (StringUtils::EqualsNoCase(value, "expert")) - slValue = LOCK_LEVEL::EXPERT; - return slValue <= CProfilesManager::Get().GetCurrentProfile().settingsLockLevel(); -} - -bool ProfileHasVideosLocked(const std::string &condition, const std::string &value, const std::string &settingId) -{ - return CProfilesManager::Get().GetCurrentProfile().videoLocked(); -} - -bool ProfileLockMode(const std::string &condition, const std::string &value, const std::string &settingId) -{ - char *tmp = NULL; - LockType lock = (LockType)strtol(value.c_str(), &tmp, 0); - if (tmp != NULL && *tmp != '\0') - return false; - - return CProfilesManager::Get().GetCurrentProfile().getLockMode() == lock; -} - CSettings::CSettings() : m_initialized(false) { @@ -243,32 +105,6 @@ CSettings& CSettings::Get() return sSettings; } -CSetting* CSettings::CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager /* = NULL */) const -{ - if (StringUtils::EqualsNoCase(settingType, "addon")) - return new CSettingAddon(settingId, settingsManager); - else if (StringUtils::EqualsNoCase(settingType, "path")) - return new CSettingPath(settingId, settingsManager); - - 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); @@ -565,8 +401,7 @@ std::vector<CVariant> CSettings::GetList(const std::string &id) const if (setting == NULL || setting->GetType() != SettingTypeList) return std::vector<CVariant>(); - CSettingList *listSetting = static_cast<CSettingList*>(setting); - return ListToValues(listSetting, listSetting->GetValue()); + return CSettingUtils::GetList(static_cast<CSettingList*>(setting)); } bool CSettings::SetList(const std::string &id, const std::vector<CVariant> &value) @@ -575,57 +410,7 @@ bool CSettings::SetList(const std::string &id, const std::vector<CVariant> &valu if (setting == NULL || setting->GetType() != SettingTypeList) return false; - CSettingList *listSetting = static_cast<CSettingList*>(setting); - SettingPtrList newValues; - bool ret = true; - int index = 0; - for (std::vector<CVariant>::const_iterator itValue = value.begin(); itValue != value.end(); ++itValue) - { - CSetting *settingValue = listSetting->GetDefinition()->Clone(StringUtils::Format("%s.%d", listSetting->GetId().c_str(), index++)); - if (settingValue == NULL) - return false; - - switch (listSetting->GetElementType()) - { - case SettingTypeBool: - if (!itValue->isBoolean()) - return false; - ret = static_cast<CSettingBool*>(settingValue)->SetValue(itValue->asBoolean()); - break; - - case SettingTypeInteger: - if (!itValue->isInteger()) - return false; - ret = static_cast<CSettingInt*>(settingValue)->SetValue((int)itValue->asInteger()); - break; - - case SettingTypeNumber: - if (!itValue->isDouble()) - return false; - ret = static_cast<CSettingNumber*>(settingValue)->SetValue(itValue->asDouble()); - break; - - case SettingTypeString: - if (!itValue->isString()) - return false; - ret = static_cast<CSettingString*>(settingValue)->SetValue(itValue->asString()); - break; - - default: - ret = false; - break; - } - - if (!ret) - { - delete settingValue; - return false; - } - - newValues.push_back(SettingPtr(settingValue)); - } - - return listSetting->SetValue(newValues); + return CSettingUtils::SetList(static_cast<CSettingList*>(setting), value); } bool CSettings::LoadSetting(const TiXmlNode *node, const std::string &settingId) @@ -633,41 +418,6 @@ bool CSettings::LoadSetting(const TiXmlNode *node, const std::string &settingId) return m_settingsManager->LoadSetting(node, settingId); } -std::vector<CVariant> CSettings::ListToValues(const CSettingList *setting, const std::vector< boost::shared_ptr<CSetting> > &values) -{ - std::vector<CVariant> realValues; - - if (setting == NULL) - return realValues; - - for (SettingPtrList::const_iterator it = values.begin(); it != values.end(); ++it) - { - switch (setting->GetElementType()) - { - case SettingTypeBool: - realValues.push_back(static_cast<const CSettingBool*>(it->get())->GetValue()); - break; - - case SettingTypeInteger: - realValues.push_back(static_cast<const CSettingInt*>(it->get())->GetValue()); - break; - - case SettingTypeNumber: - realValues.push_back(static_cast<const CSettingNumber*>(it->get())->GetValue()); - break; - - case SettingTypeString: - realValues.push_back(static_cast<const CSettingString*>(it->get())->GetValue()); - break; - - default: - break; - } - } - - return realValues; -} - bool CSettings::Initialize(const std::string &file) { CXBMCTinyXML xmlDoc; @@ -749,6 +499,8 @@ void CSettings::InitializeControls() m_settingsManager->RegisterSettingControl("edit", this); m_settingsManager->RegisterSettingControl("button", this); m_settingsManager->RegisterSettingControl("list", this); + m_settingsManager->RegisterSettingControl("slider", this); + m_settingsManager->RegisterSettingControl("range", this); } void CSettings::InitializeVisibility() @@ -853,118 +605,17 @@ void CSettings::InitializeOptionFillers() void CSettings::InitializeConditions() { - // add basic conditions - m_settingsManager->AddCondition("true"); -#ifdef HAS_UPNP - m_settingsManager->AddCondition("has_upnp"); -#endif -#ifdef HAS_AIRPLAY - m_settingsManager->AddCondition("has_airplay"); -#endif -#ifdef HAS_EVENT_SERVER - m_settingsManager->AddCondition("has_event_server"); -#endif -#ifdef HAVE_X11 - m_settingsManager->AddCondition("have_x11"); -#endif -#ifdef HAS_GL - m_settingsManager->AddCondition("has_gl"); -#endif -#ifdef HAS_GLX - m_settingsManager->AddCondition("has_glx"); -#endif -#ifdef HAS_GLES - m_settingsManager->AddCondition("has_gles"); -#endif -#if HAS_GLES == 2 - m_settingsManager->AddCondition("has_glesv2"); -#endif -#ifdef HAS_KARAOKE - m_settingsManager->AddCondition("has_karaoke"); -#endif -#ifdef HAS_SDL_JOYSTICK - m_settingsManager->AddCondition("has_sdl_joystick"); -#endif -#ifdef HAS_SKIN_TOUCHED - m_settingsManager->AddCondition("has_skin_touched"); -#endif -#ifdef HAS_TIME_SERVER - m_settingsManager->AddCondition("has_time_server"); -#endif -#ifdef HAS_WEB_SERVER - m_settingsManager->AddCondition("has_web_server"); -#endif -#ifdef HAS_ZEROCONF - m_settingsManager->AddCondition("has_zeroconf"); -#endif -#ifdef HAVE_LIBCRYSTALHD - m_settingsManager->AddCondition("have_libcrystalhd"); - if (CCrystalHD::GetInstance()->DevicePresent()) - m_settingsManager->AddCondition("hascrystalhddevice"); -#endif -#ifdef HAVE_LIBOPENMAX - m_settingsManager->AddCondition("have_libopenmax"); -#endif -#ifdef HAVE_LIBVA - m_settingsManager->AddCondition("have_libva"); -#endif -#ifdef HAVE_LIBVDPAU - m_settingsManager->AddCondition("have_libvdpau"); -#endif -#ifdef TARGET_ANDROID - if (CAndroidFeatures::GetVersion() > 15) - m_settingsManager->AddCondition("has_mediacodec"); -#endif -#ifdef HAS_LIBSTAGEFRIGHT - m_settingsManager->AddCondition("have_libstagefrightdecoder"); -#endif -#ifdef HAVE_VIDEOTOOLBOXDECODER - m_settingsManager->AddCondition("have_videotoolboxdecoder"); - if (g_sysinfo.HasVideoToolBoxDecoder()) - m_settingsManager->AddCondition("hasvideotoolboxdecoder"); -#endif -#ifdef HAS_LIBAMCODEC - if (aml_present()) - m_settingsManager->AddCondition("have_amcodec"); -#endif -#ifdef TARGET_DARWIN_IOS_ATV2 - if (g_sysinfo.IsAppleTV2()) - m_settingsManager->AddCondition("isappletv2"); -#endif -#if defined(TARGET_WINDOWS) && defined(HAS_DX) - m_settingsManager->AddCondition("has_dx"); - m_settingsManager->AddCondition("hasdxva2"); -#endif + CSettingConditions::Initialize(); - if (g_application.IsStandAlone()) - m_settingsManager->AddCondition("isstandalone"); - - if(CAEFactory::SupportsQualitySetting()) - m_settingsManager->AddCondition("has_ae_quality_levels"); + // add basic conditions + const std::set<std::string> &simpleConditions = CSettingConditions::GetSimpleConditions(); + for (std::set<std::string>::const_iterator itCondition = simpleConditions.begin(); itCondition != simpleConditions.end(); ++itCondition) + m_settingsManager->AddCondition(*itCondition); // add more complex conditions - m_settingsManager->AddCondition("addonhassettings", AddonHasSettings); - m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock); - m_settingsManager->AddCondition("checkpvrparentalpin", CheckPVRParentalPin); - m_settingsManager->AddCondition("hasperipherals", HasPeripherals); - m_settingsManager->AddCondition("isfullscreen", IsFullscreen); - m_settingsManager->AddCondition("ismasteruser", IsMasterUser); - m_settingsManager->AddCondition("isusingttfsubtitles", IsUsingTTFSubtitles); - m_settingsManager->AddCondition("profilecanwritedatabase", ProfileCanWriteDatabase); - m_settingsManager->AddCondition("profilecanwritesources", ProfileCanWriteSources); - m_settingsManager->AddCondition("profilehasaddons", ProfileHasAddons); - m_settingsManager->AddCondition("profilehasdatabase", ProfileHasDatabase); - m_settingsManager->AddCondition("profilehassources", ProfileHasSources); - m_settingsManager->AddCondition("profilehasaddonmanagerlocked", ProfileHasAddonManagerLocked); - m_settingsManager->AddCondition("profilehasfileslocked", ProfileHasFilesLocked); - m_settingsManager->AddCondition("profilehasmusiclocked", ProfileHasMusicLocked); - m_settingsManager->AddCondition("profilehaspictureslocked", ProfileHasPicturesLocked); - m_settingsManager->AddCondition("profilehasprogramslocked", ProfileHasProgramsLocked); - m_settingsManager->AddCondition("profilehassettingslocked", ProfileHasSettingsLocked); - m_settingsManager->AddCondition("profilehasvideoslocked", ProfileHasVideosLocked); - m_settingsManager->AddCondition("profilelockmode", ProfileLockMode); - m_settingsManager->AddCondition("aesettingvisible", CAEFactory::IsSettingVisible); - m_settingsManager->AddCondition("codecoptionvisible", CDVDVideoCodec::IsSettingVisible); + const std::map<std::string, SettingConditionCheck> &complexConditions = CSettingConditions::GetComplexConditions(); + for (std::map<std::string, SettingConditionCheck>::const_iterator itCondition = complexConditions.begin(); itCondition != complexConditions.end(); ++itCondition) + m_settingsManager->AddCondition(itCondition->first, itCondition->second); } void CSettings::InitializeISettingsHandlers() diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 529e23c955..f0c8b4abd5 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -25,9 +25,9 @@ #include <boost/shared_ptr.hpp> +#include "settings/SettingControl.h" +#include "settings/SettingCreator.h" #include "settings/lib/ISettingCallback.h" -#include "settings/lib/ISettingControlCreator.h" -#include "settings/lib/ISettingCreator.h" #include "threads/CriticalSection.h" #include "utils/Variant.h" @@ -44,7 +44,7 @@ class TiXmlNode; setting types. \sa CSettingsManager */ -class CSettings : public ISettingCreator, public ISettingControlCreator +class CSettings : public CSettingCreator, public CSettingControlCreator { public: /*! @@ -63,11 +63,7 @@ public: */ static CSettings& Get(); - // 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; + CSettingsManager* GetSettingsManager() const { return m_settingsManager; } /*! \brief Initializes the setting system with the generic @@ -261,8 +257,6 @@ public: \return True if the setting was successfully loaded from the given XML node, false otherwise */ bool LoadSetting(const TiXmlNode *node, const std::string &settingId); - - static std::vector<CVariant> ListToValues(const CSettingList *setting, const std::vector< boost::shared_ptr<CSetting> > &values); private: CSettings(const CSettings&); CSettings const& operator=(CSettings const&); diff --git a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp index 7b5aad31c4..cf716418a1 100644 --- a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp +++ b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -18,43 +18,53 @@ * */ +#include <limits.h> + #include "GUIDialogContentSettings.h" +#include "FileItem.h" +#include "addons/AddonManager.h" #include "addons/GUIDialogAddonSettings.h" +#include "filesystem/AddonsDirectory.h" +#include "dialogs/GUIDialogKaiToast.h" #include "guilib/GUIWindowManager.h" #include "guilib/Key.h" -#include "addons/IAddon.h" -#include "FileItem.h" -#include "video/VideoDatabase.h" -#include "video/VideoInfoScanner.h" #include "interfaces/Builtins.h" -#include "filesystem/AddonsDirectory.h" -#include "dialogs/GUIDialogKaiToast.h" - -#include <climits> +#include "settings/lib/Setting.h" +#include "settings/lib/SettingDependency.h" +#include "settings/lib/SettingsManager.h" +#include "settings/windows/GUIControlSettings.h" +#include "utils/log.h" +#include "video/VideoInfoScanner.h" -#define CONTROL_CONTENT_TYPE 3 -#define CONTROL_SCRAPER_LIST 4 -#define CONTROL_SCRAPER_SETTINGS 6 +#define CONTROL_CONTENT_TYPE 20 +#define CONTROL_SCRAPER_LIST 21 +#define CONTROL_SCRAPER_SETTINGS 22 #define CONTROL_START 30 +#define SETTING_SCAN_RECURSIVE "scanrecursive" +#define SETTING_USE_DIRECTORY_NAMES "usedirectorynames" +#define SETTING_CONTAINS_SINGLE_ITEM "containssingleitem" +#define SETTING_EXCLUDE "exclude" +#define SETTING_NO_UPDATING "noupdating" + using namespace std; using namespace ADDON; -CGUIDialogContentSettings::CGUIDialogContentSettings(void) - : CGUIDialogSettings(WINDOW_DIALOG_CONTENT_SETTINGS, "DialogContentSettings.xml"), m_origContent(CONTENT_NONE) -{ - m_bNeedSave = false; - m_bShowScanSettings = false; - m_bScanRecursive = false; - m_bUseDirNames = false; - m_bSingleItem = false; - m_bExclude = false; - m_bNoUpdate = false; - m_content = CONTENT_NONE; - m_vecItems = new CFileItemList; -} - -CGUIDialogContentSettings::~CGUIDialogContentSettings(void) +CGUIDialogContentSettings::CGUIDialogContentSettings() + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_CONTENT_SETTINGS, "DialogContentSettings.xml"), + m_needsSaving(false), + m_content(CONTENT_NONE), + m_originalContent(CONTENT_NONE), + m_showScanSettings(false), + m_scanRecursive(false), + m_useDirectoryNames(false), + m_containsSingleItem(false), + m_exclude(false), + m_noUpdating(false), + m_vecItems(new CFileItemList) +{ } + +CGUIDialogContentSettings::~CGUIDialogContentSettings() { delete m_vecItems; } @@ -63,195 +73,359 @@ bool CGUIDialogContentSettings::OnMessage(CGUIMessage &message) { switch (message.GetMessage()) { - case GUI_MSG_WINDOW_DEINIT: + case GUI_MSG_WINDOW_DEINIT: { m_scrapers.clear(); m_vecItems->Clear(); - CGUIDialogSettings::OnMessage(message); - } - break; - case GUI_MSG_CLICKED: - int iControl = message.GetSenderId(); - - if (iControl == CONTROL_CONTENT_TYPE) - { - CGUIMessage msg(GUI_MSG_ITEM_SELECTED,GetID(), CONTROL_CONTENT_TYPE); - g_windowManager.SendMessage(msg); - m_content = (CONTENT_TYPE) msg.GetParam1(); - SetupPage(); + break; } - if (iControl == CONTROL_SCRAPER_LIST) + + case GUI_MSG_CLICKED: { - // we handle only select actions - int action = message.GetParam1(); - if (!(action == ACTION_SELECT_ITEM || action == ACTION_MOUSE_LEFT_CLICK)) - break; - - CGUIMessage msg(GUI_MSG_ITEM_SELECTED,GetID(), CONTROL_SCRAPER_LIST); - g_windowManager.SendMessage(msg); - int iSelected = msg.GetParam1(); - if (iSelected == m_vecItems->Size() - 1) - { // Get More... item, path 'addons://more/<content>' - // This is tricky - ideally we want to completely save the state of this dialog, - // close it while linking to the addon manager, then reopen it on return. - // For now, we just close the dialog + send the GetPath() to open the addons window - CStdString content = m_vecItems->Get(iSelected)->GetPath().substr(14); - OnCancel(); - Close(); - CBuiltins::Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.metadata.scraper." + content + ",return)"); - return true; + int iControl = message.GetSenderId(); + + if (iControl == CONTROL_CONTENT_TYPE) + { + CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_CONTENT_TYPE); + g_windowManager.SendMessage(msg); + m_content = static_cast<CONTENT_TYPE>(msg.GetParam1()); + SetupView(); } - AddonPtr last = m_scraper; - m_scraper = m_scrapers[m_content][iSelected]; - m_lastSelected[m_content] = m_scraper; + else if (iControl == CONTROL_SCRAPER_LIST) + { + // we handle only select actions + int action = message.GetParam1(); + if (action != ACTION_SELECT_ITEM && action != ACTION_MOUSE_LEFT_CLICK) + break; + + CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_SCRAPER_LIST); + g_windowManager.SendMessage(msg); + int iSelected = msg.GetParam1(); + if (iSelected == m_vecItems->Size() - 1) + { // Get More... item, path 'addons://more/<content>' + // This is tricky - ideally we want to completely save the state of this dialog, + // close it while linking to the addon manager, then reopen it on return. + // For now, we just close the dialog + send the GetPath() to open the addons window + std::string content = m_vecItems->Get(iSelected)->GetPath().substr(14); + OnCancel(); + Close(); + CBuiltins::Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.metadata.scraper." + content + ",return)"); + return true; + } + + AddonPtr last = m_scraper; + m_scraper = boost::dynamic_pointer_cast<CScraper>(m_scrapers[m_content][iSelected]); + m_lastSelected[m_content] = m_scraper; - if (m_scraper != last) - SetupPage(); + if (m_scraper != last) + SetupView(); - if (m_scraper != last) - m_bNeedSave = true; - CONTROL_ENABLE_ON_CONDITION(CONTROL_SCRAPER_SETTINGS, m_scraper->HasSettings()); - SET_CONTROL_FOCUS(CONTROL_START,0); + if (m_scraper != last) + m_needsSaving = true; + CONTROL_ENABLE_ON_CONDITION(CONTROL_SCRAPER_SETTINGS, m_scraper->HasSettings()); + SET_CONTROL_FOCUS(CONTROL_START, 0); + } + else if (iControl == CONTROL_SCRAPER_SETTINGS) + { + bool result = CGUIDialogAddonSettings::ShowAndGetInput(m_scraper, false); + if (result) + m_needsSaving = true; + return result; + } + + break; } - if (iControl == CONTROL_SCRAPER_SETTINGS) + + default: + break; + } + + return CGUIDialogSettingsManualBase::OnMessage(message); +} + +CFileItemPtr CGUIDialogContentSettings::GetCurrentListItem(int offset) +{ + int currentItem = -1; + if (m_exclude) + return CFileItemPtr(); + + for (int i = 0; i < m_vecItems->Size(); ++i) + { + if (m_vecItems->Get(i)->IsSelected()) + { + currentItem = i; + break; + } + } + + if (currentItem == -1) + return CFileItemPtr(); + + return m_vecItems->Get((currentItem + offset) % m_vecItems->Size()); +} + +void CGUIDialogContentSettings::SetContent(CONTENT_TYPE content) +{ + m_content = m_originalContent = content; +} + +void CGUIDialogContentSettings::SetScanSettings(const VIDEO::SScanSettings &scanSettings) +{ + m_scanRecursive = (scanSettings.recurse > 0 && !scanSettings.parent_name) || + (scanSettings.recurse > 1 && scanSettings.parent_name); + m_useDirectoryNames = scanSettings.parent_name; + m_exclude = scanSettings.exclude; + m_containsSingleItem = scanSettings.parent_name_root; + m_noUpdating = scanSettings.noupdate; +} + +bool CGUIDialogContentSettings::Show(ADDON::ScraperPtr& scraper, CONTENT_TYPE content /* = CONTENT_NONE */) +{ + VIDEO::SScanSettings dummy; + return Show(scraper, dummy, content); +} + +bool CGUIDialogContentSettings::Show(ADDON::ScraperPtr& scraper, VIDEO::SScanSettings& settings, CONTENT_TYPE content /* = CONTENT_NONE */) +{ + CGUIDialogContentSettings *dialog = (CGUIDialogContentSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_CONTENT_SETTINGS); + if (dialog == NULL) + return false; + + if (scraper != NULL) + { + dialog->SetContent(content != CONTENT_NONE ? content : scraper->Content()); + dialog->SetScraper(scraper); + // toast selected but disabled scrapers + if (!scraper->Enabled()) + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(24024), scraper->Name(), 2000, true); + } + + dialog->SetScanSettings(settings); + dialog->DoModal(); + + bool confirmed = dialog->IsConfirmed(); + if (confirmed) + { + scraper = dialog->GetScraper(); + content = dialog->GetContent(); + + if (scraper == NULL || content == CONTENT_NONE) + settings.exclude = dialog->GetExclude(); + else { - if (CGUIDialogAddonSettings::ShowAndGetInput(m_scraper, false)) - m_bNeedSave = true; - return m_bNeedSave; + settings.exclude = false; + settings.noupdate = dialog->GetNoUpdating(); + scraper->SetPathSettings(content, ""); + + if (content == CONTENT_TVSHOWS) + { + settings.parent_name = settings.parent_name_root = dialog->GetContainsSingleItem(); + settings.recurse = 0; + } + else if (content == CONTENT_MOVIES || content == CONTENT_MUSICVIDEOS) + { + if (dialog->GetUseDirectoryNames()) + { + settings.parent_name = true; + settings.parent_name_root = false; + settings.recurse = dialog->GetScanRecursive() ? INT_MAX : 1; + + if (dialog->GetContainsSingleItem()) + { + settings.parent_name_root = true; + settings.recurse = 0; + } + } + else + { + settings.parent_name = false; + settings.parent_name_root = false; + settings.recurse = dialog->GetScanRecursive() ? INT_MAX : 0; + } + } } } - return CGUIDialogSettings::OnMessage(message); + + return confirmed; +} + +void CGUIDialogContentSettings::OnInitWindow() +{ + m_lastSelected.clear(); + + // save our current scraper (if any) + if (m_scraper != NULL) + m_lastSelected[m_content] = m_scraper; + + FillContentTypes(); + m_needsSaving = false; + + CGUIDialogSettingsManualBase::OnInitWindow(); +} + +void CGUIDialogContentSettings::OnSettingChanged(const CSetting *setting) +{ + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_CONTAINS_SINGLE_ITEM) + m_containsSingleItem = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_NO_UPDATING) + m_noUpdating = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_USE_DIRECTORY_NAMES) + m_useDirectoryNames = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_SCAN_RECURSIVE) + { + m_scanRecursive = static_cast<const CSettingBool*>(setting)->GetValue(); + m_settingsManager->SetBool(SETTING_CONTAINS_SINGLE_ITEM, false); + } + else if (settingId == SETTING_EXCLUDE) + m_exclude = static_cast<const CSettingBool*>(setting)->GetValue(); + + m_needsSaving = true; +} + +void CGUIDialogContentSettings::Save() +{ + if (!m_needsSaving || + m_scraper == NULL) + return; + + if (m_content == CONTENT_NONE) + { + m_scraper.reset(); + return; + } +} + +void CGUIDialogContentSettings::OnOkay() +{ + // watch for content change, but same scraper + if (m_content != m_originalContent) + m_needsSaving = true; + + CGUIDialogSettingsManualBase::OnOkay(); } -void CGUIDialogContentSettings::SetupPage() +void CGUIDialogContentSettings::OnCancel() +{ + m_needsSaving = false; + + CGUIDialogSettingsManualBase::OnCancel(); +} + +void CGUIDialogContentSettings::SetupView() { CGUIMessage msgReset(GUI_MSG_LABEL_RESET, GetID(), CONTROL_SCRAPER_LIST); OnMessage(msgReset); + m_vecItems->Clear(); if (m_content == CONTENT_NONE) { - m_bShowScanSettings = false; + m_showScanSettings = false; SET_CONTROL_HIDDEN(CONTROL_SCRAPER_LIST); CONTROL_DISABLE(CONTROL_SCRAPER_SETTINGS); } else { - FillListControl(); + FillScraperList(); SET_CONTROL_VISIBLE(CONTROL_SCRAPER_LIST); - if (m_scraper && m_scraper->Enabled()) + if (m_scraper != NULL && m_scraper->Enabled()) { - m_bShowScanSettings = true; - ScraperPtr scraper = boost::dynamic_pointer_cast<CScraper>(m_scraper); - if (scraper && scraper->Supports(m_content) && scraper->HasSettings()) + m_showScanSettings = true; + if (m_scraper && m_scraper->Supports(m_content) && m_scraper->HasSettings()) CONTROL_ENABLE(CONTROL_SCRAPER_SETTINGS); } else CONTROL_DISABLE(CONTROL_SCRAPER_SETTINGS); } - CreateSettings(); - CGUIDialogSettings::SetupPage(); SET_CONTROL_VISIBLE(CONTROL_CONTENT_TYPE); + + CGUIDialogSettingsManualBase::SetupView(); } -void CGUIDialogContentSettings::CreateSettings() +void CGUIDialogContentSettings::InitializeSettings() { - // crappy setting dependencies part 1 - m_settings.clear(); - switch (m_content) + CGUIDialogSettingsManualBase::InitializeSettings(); + + CSettingCategory *category = AddCategory("contentsettings", -1); + if (category == NULL) { - case CONTENT_TVSHOWS: - { - AddBool(1,20379,&m_bSingleItem, m_bShowScanSettings); - AddBool(2,20432,&m_bNoUpdate, m_bShowScanSettings); - } - break; - case CONTENT_MOVIES: - { - AddBool(1,20329,&m_bUseDirNames, m_bShowScanSettings); - AddBool(2,20346,&m_bScanRecursive, m_bShowScanSettings && ((m_bUseDirNames && !m_bSingleItem) || !m_bUseDirNames)); - AddBool(3,20383,&m_bSingleItem, m_bShowScanSettings && (m_bUseDirNames && !m_bScanRecursive)); - AddBool(4,20432,&m_bNoUpdate, m_bShowScanSettings); - } - break; - case CONTENT_MUSICVIDEOS: - { - AddBool(1,20330,&m_bUseDirNames, m_bShowScanSettings); - AddBool(2,20346,&m_bScanRecursive, m_bShowScanSettings && ((m_bUseDirNames && !m_bSingleItem) || !m_bUseDirNames)); - AddBool(3,20383,&m_bSingleItem, m_bShowScanSettings && (m_bUseDirNames && !m_bScanRecursive)); - AddBool(4,20432,&m_bNoUpdate, m_bShowScanSettings); - } - break; - case CONTENT_ALBUMS: - case CONTENT_ARTISTS: - break; - case CONTENT_NONE: - default: - { - AddBool(1,20380,&m_bExclude, !m_bShowScanSettings); - } + CLog::Log(LOGERROR, "CGUIDialogContentSettings: unable to setup settings"); + return; } -} -void CGUIDialogContentSettings::OnSettingChanged(SettingInfo &setting) -{ - CreateSettings(); + CSettingGroup *group = AddGroup(category); + if (group == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogContentSettings: unable to setup settings"); + return; + } - // crappy setting dependencies part 2 - if (m_content == CONTENT_MOVIES) + switch (m_content) { - if (setting.id == 2) // use dir names + case CONTENT_TVSHOWS: { - m_bSingleItem = false; - UpdateSetting(3); // scan recursively - UpdateSetting(4); // single item - } - else if (setting.id == 3) - { - m_bSingleItem = false; - UpdateSetting(4); + AddToggle(group, SETTING_CONTAINS_SINGLE_ITEM, 20379, 0, m_containsSingleItem, false, m_showScanSettings); + AddToggle(group, SETTING_NO_UPDATING, 20432, 0, m_noUpdating, false, m_showScanSettings); + break; } - else if (setting.id == 4) + + case CONTENT_MOVIES: + case CONTENT_MUSICVIDEOS: { - m_bScanRecursive = false; - UpdateSetting(3); + AddToggle(group, SETTING_USE_DIRECTORY_NAMES, m_content == CONTENT_MOVIES ? 20329 : 20330, 0, m_useDirectoryNames, false, m_showScanSettings); + CSettingBool *settingScanRecursive = AddToggle(group, SETTING_SCAN_RECURSIVE, 20346, 0, m_scanRecursive, false, m_showScanSettings); + CSettingBool *settingContainsSingleItem = AddToggle(group, SETTING_CONTAINS_SINGLE_ITEM, 20383, 0, m_containsSingleItem, false, m_showScanSettings); + AddToggle(group, SETTING_NO_UPDATING, 20432, 0, m_noUpdating, false, m_showScanSettings); + + // define an enable dependency with (m_useDirectoryNames && !m_containsSingleItem) || !m_useDirectoryNames + CSettingDependency dependencyScanRecursive(SettingDependencyTypeEnable, m_settingsManager); + dependencyScanRecursive.Or() + ->Add(CSettingDependencyConditionCombinationPtr((new CSettingDependencyConditionCombination(BooleanLogicOperationAnd, m_settingsManager)) // m_useDirectoryNames && !m_containsSingleItem + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_USE_DIRECTORY_NAMES, "true", SettingDependencyOperatorEquals, false, m_settingsManager))) // m_useDirectoryNames + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_CONTAINS_SINGLE_ITEM, "false", SettingDependencyOperatorEquals, false, m_settingsManager))))) // !m_containsSingleItem + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_USE_DIRECTORY_NAMES, "false", SettingDependencyOperatorEquals, false, m_settingsManager))); // !m_useDirectoryNames + + // define an enable dependency with m_useDirectoryNames && !m_scanRecursive + CSettingDependency depdendencyContainsSingleItem(SettingDependencyTypeEnable, m_settingsManager); + depdendencyContainsSingleItem.And() + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_USE_DIRECTORY_NAMES, "true", SettingDependencyOperatorEquals, false, m_settingsManager))) // m_useDirectoryNames + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_SCAN_RECURSIVE, "false", SettingDependencyOperatorEquals, false, m_settingsManager))); // !m_scanRecursive + + SettingDependencies deps; + deps.push_back(dependencyScanRecursive); + settingScanRecursive->SetDependencies(deps); + + deps.clear(); + deps.push_back(depdendencyContainsSingleItem); + settingContainsSingleItem->SetDependencies(deps); + break; } - } - m_bNeedSave = true; -} -void CGUIDialogContentSettings::OnOkay() -{ // watch for content change, but same scraper - if (m_content != m_origContent) - m_bNeedSave = true; -} - -void CGUIDialogContentSettings::OnCancel() -{ - m_bNeedSave = false; -} + case CONTENT_ALBUMS: + case CONTENT_ARTISTS: + break; -void CGUIDialogContentSettings::OnInitWindow() -{ - m_lastSelected.clear(); - // save our current scraper (if any) - if (m_scraper) - m_lastSelected[m_content] = m_scraper; - FillContentTypes(); - m_bNeedSave = false; - CGUIDialogSettings::OnInitWindow(); + case CONTENT_NONE: + default: + AddToggle(group, SETTING_EXCLUDE, 20380, 0, m_exclude, false, !m_showScanSettings); + break; + } } void CGUIDialogContentSettings::FillContentTypes() { - CGUIMessage msg(GUI_MSG_LABEL_RESET,GetID(),CONTROL_CONTENT_TYPE); + CGUIMessage msg(GUI_MSG_LABEL_RESET, GetID(), CONTROL_CONTENT_TYPE); g_windowManager.SendMessage(msg); if (m_content == CONTENT_ALBUMS || m_content == CONTENT_ARTISTS) - { FillContentTypes(m_content); - } else { FillContentTypes(CONTENT_MOVIES); @@ -259,36 +433,36 @@ void CGUIDialogContentSettings::FillContentTypes() FillContentTypes(CONTENT_MUSICVIDEOS); // add 'None' to spinner - CGUIMessage msg2(GUI_MSG_LABEL_ADD,GetID(),CONTROL_CONTENT_TYPE); - msg2.SetLabel(TranslateContent(CONTENT_NONE, true)); - msg2.SetParam1((int) CONTENT_NONE); + CGUIMessage msg2(GUI_MSG_LABEL_ADD, GetID(), CONTROL_CONTENT_TYPE); + msg2.SetLabel(ADDON::TranslateContent(CONTENT_NONE, true)); + msg2.SetParam1(static_cast<int>(CONTENT_NONE)); g_windowManager.SendMessage(msg2); } - CONTROL_SELECT_ITEM(CONTROL_CONTENT_TYPE, (int) m_content); + CONTROL_SELECT_ITEM(CONTROL_CONTENT_TYPE, static_cast<int>(m_content)); } -void CGUIDialogContentSettings::FillContentTypes(const CONTENT_TYPE &content) +void CGUIDialogContentSettings::FillContentTypes(CONTENT_TYPE content) { // grab all scrapers which support this content-type VECADDONS addons; - TYPE type = ScraperTypeFromContent(content); + TYPE type = ADDON::ScraperTypeFromContent(content); if (!CAddonMgr::Get().GetAddons(type, addons)) return; AddonPtr addon; - CStdString defaultID; + std::string defaultID; if (CAddonMgr::Get().GetDefault(type, addon)) defaultID = addon->ID(); - for (IVECADDONS it = addons.begin(); it != addons.end(); it++) + for (IVECADDONS it = addons.begin(); it != addons.end(); ++it) { bool isDefault = ((*it)->ID() == defaultID); - map<CONTENT_TYPE,VECADDONS>::iterator iter=m_scrapers.find(content); + map<CONTENT_TYPE, VECADDONS>::iterator iter = m_scrapers.find(content); AddonPtr scraper = (*it)->Clone(); - if (m_scraper && m_scraper->ID() == (*it)->ID()) + if (m_scraper != NULL && m_scraper->ID() == (*it)->ID()) { // don't overwrite preconfigured scraper scraper = m_scraper; } @@ -309,23 +483,27 @@ void CGUIDialogContentSettings::FillContentTypes(const CONTENT_TYPE &content) } // add CONTENT type to spinner - CGUIMessage msg(GUI_MSG_LABEL_ADD,GetID(),CONTROL_CONTENT_TYPE); - msg.SetLabel(TranslateContent(content, true)); - msg.SetParam1((int) content); + CGUIMessage msg(GUI_MSG_LABEL_ADD, GetID(), CONTROL_CONTENT_TYPE); + msg.SetLabel(ADDON::TranslateContent(content, true)); + msg.SetParam1(static_cast<int>(content)); g_windowManager.SendMessage(msg); } -void CGUIDialogContentSettings::FillListControl() +void CGUIDialogContentSettings::FillScraperList() { - int iIndex=0; + int iIndex = 0; int selectedIndex = 0; if (m_lastSelected.find(m_content) != m_lastSelected.end()) - m_scraper = m_lastSelected[m_content]; + m_scraper = boost::dynamic_pointer_cast<CScraper>(m_lastSelected[m_content]); else - CAddonMgr::Get().GetDefault(ScraperTypeFromContent(m_content), m_scraper); + { + AddonPtr scraperAddon; + CAddonMgr::Get().GetDefault(ADDON::ScraperTypeFromContent(m_content), scraperAddon); + m_scraper = boost::dynamic_pointer_cast<CScraper>(scraperAddon); + } - for (IVECADDONS iter=m_scrapers.find(m_content)->second.begin();iter!=m_scrapers.find(m_content)->second.end();++iter) + for (IVECADDONS iter = m_scrapers.find(m_content)->second.begin(); iter != m_scrapers.find(m_content)->second.end(); ++iter) { CFileItemPtr item(new CFileItem((*iter)->Name())); item->SetPath((*iter)->ID()); @@ -336,149 +514,15 @@ void CGUIDialogContentSettings::FillListControl() selectedIndex = iIndex; } m_vecItems->Add(item); + iIndex++; } // add the "Get More..." item - m_vecItems->Add(XFILE::CAddonsDirectory::GetMoreItem(TranslateContent(m_content))); + m_vecItems->Add(XFILE::CAddonsDirectory::GetMoreItem(ADDON::TranslateContent(m_content))); CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), CONTROL_SCRAPER_LIST, 0, 0, m_vecItems); OnMessage(msg); CGUIMessage msg2(GUI_MSG_ITEM_SELECT, GetID(), CONTROL_SCRAPER_LIST, selectedIndex); OnMessage(msg2); } - -CFileItemPtr CGUIDialogContentSettings::GetCurrentListItem(int offset) -{ - int currentItem = -1; - if(m_bExclude) - return CFileItemPtr(); - for (int i=0;i<m_vecItems->Size();++i ) - { - if (m_vecItems->Get(i)->IsSelected()) - { - currentItem = i; - break; - } - } - - if (currentItem == -1) - return CFileItemPtr(); - - int item = (currentItem + offset) % m_vecItems->Size(); - if (item < 0) item += m_vecItems->Size(); - return m_vecItems->Get(item); -} - -bool CGUIDialogContentSettings::ShowForDirectory(const CStdString& strDirectory, ADDON::ScraperPtr& scraper, VIDEO::SScanSettings& settings) -{ - CVideoDatabase database; - database.Open(); - scraper = database.GetScraperForPath(strDirectory, settings); - bool bResult = Show(scraper,settings); - if (bResult) - database.SetScraperForPath(strDirectory,scraper,settings); - - return bResult; -} - -bool CGUIDialogContentSettings::Show(ADDON::ScraperPtr& scraper, CONTENT_TYPE musicContext/*=CONTENT_NONE*/) -{ - VIDEO::SScanSettings dummy; - return Show(scraper,dummy,musicContext); -} - -bool CGUIDialogContentSettings::Show(ADDON::ScraperPtr& scraper, VIDEO::SScanSettings& settings, CONTENT_TYPE musicContext/*=CONTENT_NONE*/) -{ - CGUIDialogContentSettings *dialog = (CGUIDialogContentSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_CONTENT_SETTINGS); - if (!dialog) - return false; - - if (scraper) - { - dialog->m_content = musicContext != CONTENT_NONE ? musicContext : scraper->Content(); - dialog->m_origContent = dialog->m_content; - dialog->m_scraper = scraper; - // toast selected but disabled scrapers - if (!scraper->Enabled()) - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(24024), scraper->Name(), 2000, true); - } - - dialog->m_bScanRecursive = (settings.recurse > 0 && !settings.parent_name) || (settings.recurse > 1 && settings.parent_name); - dialog->m_bUseDirNames = settings.parent_name; - dialog->m_bExclude = settings.exclude; - dialog->m_bSingleItem = settings.parent_name_root; - dialog->m_bNoUpdate = settings.noupdate; - dialog->m_bNeedSave = false; - dialog->DoModal(); - if (dialog->m_bNeedSave) - { - scraper = boost::dynamic_pointer_cast<CScraper>(dialog->m_scraper); - CONTENT_TYPE content = dialog->m_content; - if (!scraper || content == CONTENT_NONE) - { - scraper.reset(); - settings.exclude = dialog->m_bExclude; - } - else - { - settings.exclude = false; - settings.noupdate = dialog->m_bNoUpdate; - scraper->SetPathSettings(content, ""); - - if (content == CONTENT_TVSHOWS) - { - settings.parent_name = dialog->m_bSingleItem; - settings.parent_name_root = dialog->m_bSingleItem; - settings.recurse = 0; - } - else if (content == CONTENT_MOVIES) - { - if (dialog->m_bUseDirNames) - { - settings.parent_name = true; - settings.parent_name_root = false; - settings.recurse = dialog->m_bScanRecursive ? INT_MAX : 1; - - if (dialog->m_bSingleItem) - { - settings.parent_name_root = true; - settings.recurse = 0; - } - } - else - { - settings.parent_name = false; - settings.parent_name_root = false; - settings.recurse = dialog->m_bScanRecursive ? INT_MAX : 0; - } - } - else if (content == CONTENT_MUSICVIDEOS) - { - if (dialog->m_bUseDirNames) - { - settings.parent_name = true; - settings.parent_name_root = false; - settings.recurse = dialog->m_bScanRecursive ? INT_MAX : 1; - - if (dialog->m_bSingleItem) - { - settings.parent_name_root = true; - settings.recurse = 0; - } - } - else - { - settings.parent_name = false; - settings.parent_name_root = false; - settings.recurse = dialog->m_bScanRecursive ? INT_MAX : 0; - } - } - } - } - - dialog->m_scraper.reset(); - dialog->m_content = dialog->m_origContent = CONTENT_NONE; - return dialog->m_bNeedSave; -} - diff --git a/xbmc/settings/dialogs/GUIDialogContentSettings.h b/xbmc/settings/dialogs/GUIDialogContentSettings.h index ed84c4c853..9cf5bdbf19 100644 --- a/xbmc/settings/dialogs/GUIDialogContentSettings.h +++ b/xbmc/settings/dialogs/GUIDialogContentSettings.h @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -20,11 +20,11 @@ * */ -#include <vector> +#include <map> +#include "addons/Addon.h" #include "addons/Scraper.h" -#include "addons/AddonManager.h" -#include "settings/dialogs/GUIDialogSettings.h" +#include "settings/dialogs/GUIDialogSettingsManualBase.h" namespace VIDEO { @@ -32,45 +32,70 @@ namespace VIDEO } class CFileItemList; -class CGUIDialogContentSettings : public CGUIDialogSettings +class CGUIDialogContentSettings : public CGUIDialogSettingsManualBase { public: - CGUIDialogContentSettings(void); - virtual ~CGUIDialogContentSettings(void); - virtual bool OnMessage(CGUIMessage& message); + CGUIDialogContentSettings(); + virtual ~CGUIDialogContentSettings(); - static bool Show(ADDON::ScraperPtr& scraper, CONTENT_TYPE musicContext = CONTENT_NONE); - static bool Show(ADDON::ScraperPtr& scraper, VIDEO::SScanSettings& settings, CONTENT_TYPE musicContext = CONTENT_NONE); - static bool ShowForDirectory(const CStdString& strDirectory, ADDON::ScraperPtr& scraper, VIDEO::SScanSettings& settings); + // specializations of CGUIControl + virtual bool OnMessage(CGUIMessage &message); + + // specialization of CGUIWindow virtual bool HasListItems() const { return true; }; virtual CFileItemPtr GetCurrentListItem(int offset = 0); + + CONTENT_TYPE GetContent() const { return m_content; } + void SetContent(CONTENT_TYPE content); + + const ADDON::ScraperPtr& GetScraper() const { return m_scraper; } + void SetScraper(ADDON::ScraperPtr scraper) { m_scraper = scraper; } + + void SetScanSettings(const VIDEO::SScanSettings &scanSettings); + bool GetScanRecursive() const { return m_scanRecursive; } + bool GetUseDirectoryNames() const { return m_useDirectoryNames; } + bool GetContainsSingleItem() const { return m_containsSingleItem; } + bool GetExclude() const { return m_exclude; } + bool GetNoUpdating() const { return m_noUpdating; } + + static bool Show(ADDON::ScraperPtr& scraper, CONTENT_TYPE content = CONTENT_NONE); + static bool Show(ADDON::ScraperPtr& scraper, VIDEO::SScanSettings& settings, CONTENT_TYPE content = CONTENT_NONE); + protected: + // specializations of CGUIWindow + virtual void OnInitWindow(); + + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save(); virtual void OnOkay(); virtual void OnCancel(); - virtual void OnInitWindow(); - virtual void SetupPage(); - virtual void CreateSettings(); + virtual void SetupView(); + + // specialization of CGUIDialogSettingsManualBase + virtual void InitializeSettings(); + +private: void FillContentTypes(); - void FillContentTypes(const CONTENT_TYPE& content); - void AddContentType(const CONTENT_TYPE& content); - void FillListControl(); - virtual void OnSettingChanged(SettingInfo& setting); - - bool m_bNeedSave; - - bool m_bShowScanSettings; - bool m_bScanRecursive; - bool m_bUseDirNames; - bool m_bSingleItem; - bool m_bExclude; - bool m_bNoUpdate; - std::map<CONTENT_TYPE, ADDON::VECADDONS> m_scrapers; - std::map<CONTENT_TYPE, ADDON::AddonPtr> m_lastSelected; - CFileItemList* m_vecItems; + void FillContentTypes(CONTENT_TYPE content); + void FillScraperList(); - CStdString m_strContentType; - ADDON::AddonPtr m_scraper; - CStdString m_defaultScraper; + bool m_needsSaving; CONTENT_TYPE m_content; - CONTENT_TYPE m_origContent; + CONTENT_TYPE m_originalContent; + ADDON::ScraperPtr m_scraper; + + bool m_showScanSettings; + bool m_scanRecursive; + bool m_useDirectoryNames; + bool m_containsSingleItem; + bool m_exclude; + bool m_noUpdating; + + std::map<CONTENT_TYPE, ADDON::VECADDONS> m_scrapers; + std::map<CONTENT_TYPE, ADDON::AddonPtr> m_lastSelected; + CFileItemList* m_vecItems; }; diff --git a/xbmc/settings/dialogs/GUIDialogSettings.cpp b/xbmc/settings/dialogs/GUIDialogSettings.cpp deleted file mode 100644 index 72137132b1..0000000000 --- a/xbmc/settings/dialogs/GUIDialogSettings.cpp +++ /dev/null @@ -1,702 +0,0 @@ -/* - * 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 "GUIDialogSettings.h" -#include "dialogs/GUIDialogSlider.h" -#include "guilib/GUIEditControl.h" -#include "guilib/GUISpinControlEx.h" -#include "guilib/GUIRadioButtonControl.h" -#include "guilib/GUISettingsSliderControl.h" -#include "guilib/GUIImage.h" -#include "guilib/GUIControlGroupList.h" -#include "guilib/LocalizeStrings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" -#include "guilib/GUIKeyboardFactory.h" - -#define CONTROL_GROUP_LIST 5 -#define CONTROL_SETTINGS_LABEL 2 -#define CONTROL_NONE_AVAILABLE 3 -#define CONTROL_DEFAULT_BUTTON 7 -#define CONTROL_DEFAULT_RADIOBUTTON 8 -#define CONTROL_DEFAULT_SPIN 9 -#define CONTROL_DEFAULT_SLIDER 10 -#define CONTROL_DEFAULT_SEPARATOR 11 -#define CONTROL_DEFAULT_EDIT 12 -#define CONTROL_DEFAULT_EDIT_NUM 13 -#define CONTROL_OKAY_BUTTON 28 -#define CONTROL_CANCEL_BUTTON 29 -#define CONTROL_START 30 -#define CONTROL_PAGE 60 - -using namespace std; - -CGUIDialogSettings::CGUIDialogSettings(int id, const char *xmlFile) - : CGUIDialog(id, xmlFile) -{ - m_pOriginalEdit = NULL; - m_pOriginalEditNum = NULL; - m_pOriginalSpin = NULL; - m_pOriginalRadioButton = NULL; - m_pOriginalSettingsButton = NULL; - m_pOriginalSlider = NULL; - m_pOriginalSeparator = NULL; - m_usePopupSliders = false; - m_loadType = KEEP_IN_MEMORY; -} - -CGUIDialogSettings::~CGUIDialogSettings(void) -{ -} - -bool CGUIDialogSettings::OnMessage(CGUIMessage &message) -{ - switch (message.GetMessage()) - { - case GUI_MSG_CLICKED: - { - unsigned int iControl = message.GetSenderId(); - if (iControl >= CONTROL_OKAY_BUTTON && iControl < CONTROL_PAGE) - OnClick(iControl); - return true; - } - break; - case GUI_MSG_WINDOW_DEINIT: - { - CGUIDialog::OnMessage(message); - FreeControls(); - m_settings.clear(); - return true; - } - break; - } - return CGUIDialog::OnMessage(message); -} - -void CGUIDialogSettings::SetupPage() -{ - // cleanup first, if necessary - FreeControls(); - m_pOriginalEdit = (CGUIEditControl*)GetControl(CONTROL_DEFAULT_EDIT); - m_pOriginalEditNum = (CGUIEditControl*)GetControl(CONTROL_DEFAULT_EDIT_NUM); - m_pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN); - m_pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON); - m_pOriginalSettingsButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON); - m_pOriginalSlider = (CGUISettingsSliderControl *)GetControl(CONTROL_DEFAULT_SLIDER); - m_pOriginalSeparator = (CGUIImage *)GetControl(CONTROL_DEFAULT_SEPARATOR); - if (m_pOriginalEdit) m_pOriginalEdit->SetVisible(false); - if (m_pOriginalEditNum) m_pOriginalEditNum->SetVisible(false); - if (m_pOriginalSpin) m_pOriginalSpin->SetVisible(false); - if (m_pOriginalRadioButton) m_pOriginalRadioButton->SetVisible(false); - if (m_pOriginalSettingsButton) m_pOriginalSettingsButton->SetVisible(false); - if (m_pOriginalSlider) m_pOriginalSlider->SetVisible(false); - if (m_pOriginalSeparator) m_pOriginalSeparator->SetVisible(false); - - // update our settings label - if (GetID() == WINDOW_DIALOG_PVR_TIMER_SETTING) - { - SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, g_localizeStrings.Get(19057)); - } - else - { - SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, g_localizeStrings.Get(13395 + GetID() - WINDOW_DIALOG_VIDEO_OSD_SETTINGS)); - } - - CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CONTROL_GROUP_LIST); - if (!group) - return; - - if (!m_settings.size()) - { // no settings available - SET_CONTROL_VISIBLE(CONTROL_NONE_AVAILABLE); - return; - } - else - { - SET_CONTROL_HIDDEN(CONTROL_NONE_AVAILABLE); - } - - // create our controls - for (unsigned int i = 0; i < m_settings.size(); i++) - { - SettingInfo &setting = m_settings.at(i); - AddSetting(setting, group->GetWidth(), CONTROL_START + i); - } -} - -void CGUIDialogSettings::EnableSettings(unsigned int id, bool enabled) -{ - for (unsigned int i = 0; i < m_settings.size(); i++) - { - if (m_settings[i].id != id) - continue; - m_settings[i].enabled = enabled; - if (enabled) - { - CONTROL_ENABLE(i + CONTROL_START); - } - else - { - CONTROL_DISABLE(i + CONTROL_START); - } - return; - } - CLog::Log(LOGWARNING, "%s - Invalid setting specified", __FUNCTION__); -} - -void CGUIDialogSettings::UpdateSetting(unsigned int id) -{ - unsigned int settingNum = (unsigned int)-1; - for (unsigned int i = 0; i < m_settings.size(); i++) - { - if (m_settings[i].id == id) - { - settingNum = i; - break; - } - } - if(settingNum == (unsigned int)-1) - return; - - SettingInfo &setting = m_settings.at(settingNum); - unsigned int controlID = settingNum + CONTROL_START; - if (setting.type == SettingInfo::SPIN) - { - CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(controlID); - if (pControl && setting.data) pControl->SetValue(*(int *)setting.data); - } - else if (setting.type == SettingInfo::CHECK) - { - CGUIRadioButtonControl *pControl = (CGUIRadioButtonControl *)GetControl(controlID); - if (pControl && setting.data) pControl->SetSelected(*(bool *)setting.data); - } - else if (setting.type == SettingInfo::CHECK_UCHAR) - { - CGUIRadioButtonControl *pControl = (CGUIRadioButtonControl *)GetControl(controlID); - if (pControl && setting.data) pControl->SetSelected(*(unsigned char*)setting.data ? true : false); - } - else if (setting.type == SettingInfo::SLIDER) - { - CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl *)GetControl(controlID); - if (pControl && setting.data) - { - float value = *(float *)setting.data; - pControl->SetFloatValue(value); - if (setting.formatFunction.standard) pControl->SetTextValue(setting.formatFunction.standard(value, setting.interval)); - } - } - else if (setting.type == SettingInfo::BUTTON_DIALOG) - { - SET_CONTROL_LABEL(controlID,setting.name); - CGUIButtonControl *pControl = (CGUIButtonControl *)GetControl(controlID); - if (pControl && setting.data) pControl->SetLabel2(*(CStdString *)setting.data); - } - else if (setting.type == SettingInfo::EDIT) - { - SET_CONTROL_LABEL(controlID, setting.name); - if (setting.data) SET_CONTROL_LABEL2(controlID, string(*(CStdString *)setting.data)); - } - else if (setting.type == SettingInfo::EDIT_NUM) - { - CGUIEditControl *pControl = (CGUIEditControl *)GetControl(controlID); - if (pControl && setting.data) { - CStdString strIndex = StringUtils::Format("%i", *(int *)setting.data); - pControl->SetLabel2(strIndex); - } - } - else if (setting.type == SettingInfo::STRING) - { - SET_CONTROL_LABEL(controlID, setting.name); - string strNewValue = string(*(CStdString *)setting.data); - if (strNewValue.empty()) - strNewValue = "-"; - SET_CONTROL_LABEL2(controlID, strNewValue); - } - else if (setting.type == SettingInfo::RANGE) - { - CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl *)GetControl(controlID); - float** value = (float **)setting.data; - if (pControl && setting.data) - { - pControl->SetFloatValue(*(value[0]), CGUISliderControl::RangeSelectorLower); - pControl->SetFloatValue(*(value[1]), CGUISliderControl::RangeSelectorUpper); - if (setting.formatFunction.range) pControl->SetTextValue(setting.formatFunction.range(*(value[0]), *(value[1]), setting.interval)); - } - } - - if (setting.enabled) - { - CONTROL_ENABLE(controlID); - } - else - { - CONTROL_DISABLE(controlID); - } -} - -bool CGUIDialogSettings::OnBack(int actionID) -{ - OnCancel(); - return CGUIDialog::OnBack(actionID); -} - -void CGUIDialogSettings::OnClick(int iID) -{ - if (iID == CONTROL_OKAY_BUTTON) - { - OnOkay(); - Close(); - return; - } - if (iID == CONTROL_CANCEL_BUTTON) - { - OnCancel(); - Close(); - return; - } - unsigned int settingNum = iID - CONTROL_START; - if (settingNum >= m_settings.size()) return; - SettingInfo &setting = m_settings.at(settingNum); - if (setting.type == SettingInfo::SPIN) - { - CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(iID); - if (setting.data) *(int *)setting.data = pControl->GetValue(); - } - else if (setting.type == SettingInfo::BUTTON_DIALOG) - { - CGUIButtonControl *pControl = (CGUIButtonControl *)GetControl(iID); - if (setting.data) *(CStdString *)setting.data = pControl->GetLabel2(); - } - else if (setting.type == SettingInfo::EDIT) - { - CGUIEditControl *pControl = (CGUIEditControl *)GetControl(iID); - if (setting.data) *(CStdString *)setting.data = pControl->GetLabel2(); - } - else if (setting.type == SettingInfo::EDIT_NUM) - { - CGUIEditControl *pControl = (CGUIEditControl *)GetControl(iID); - if (setting.data) { - CStdString strIndex = pControl->GetLabel2(); - *(int *)setting.data = atol(strIndex.c_str()); - } - } - else if (setting.type == SettingInfo::CHECK) - { - CGUIRadioButtonControl *pControl = (CGUIRadioButtonControl *)GetControl(iID); - if (setting.data) *(bool *)setting.data = pControl->IsSelected(); - } - else if (setting.type == SettingInfo::CHECK_UCHAR) - { - CGUIRadioButtonControl *pControl = (CGUIRadioButtonControl *)GetControl(iID); - if (setting.data) *(unsigned char*)setting.data = pControl->IsSelected() ? 1 : 0; - } - else if (setting.type == SettingInfo::SLIDER) - { - CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl *)GetControl(iID); - if (setting.data) *(float *)setting.data = pControl->GetFloatValue(); - if (setting.formatFunction.standard) pControl->SetTextValue(setting.formatFunction.standard(pControl->GetFloatValue(), setting.interval)); - } - else if (setting.type == SettingInfo::BUTTON && m_usePopupSliders && setting.data) - { // we're using popup sliders - CGUIDialogSlider::ShowAndGetInput(setting.name, *(float *)setting.data, setting.min, setting.interval, setting.max, this, &setting); - if (setting.formatFunction.standard) - SET_CONTROL_LABEL2(iID, setting.formatFunction.standard(*(float *)setting.data, setting.interval)); - } - else if (setting.type == SettingInfo::STRING) - { - CGUIKeyboardFactory::ShowAndGetInput(*(CStdString *) setting.data, true); - string strNewValue = string(*(CStdString *)setting.data); - if (strNewValue.empty()) - strNewValue = "-"; - SET_CONTROL_LABEL2(iID, strNewValue); - } - else if (setting.type == SettingInfo::RANGE) - { - CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl *)GetControl(iID); - if (setting.data) - { - *((float **)setting.data)[0] = pControl->GetFloatValue(CGUISliderControl::RangeSelectorLower); - *((float **)setting.data)[1] = pControl->GetFloatValue(CGUISliderControl::RangeSelectorUpper); - } - if (setting.formatFunction.range) - pControl->SetTextValue(setting.formatFunction.range(pControl->GetFloatValue(CGUISliderControl::RangeSelectorLower), - pControl->GetFloatValue(CGUISliderControl::RangeSelectorUpper), - setting.interval)); - } - OnSettingChanged(setting); -} - -void CGUIDialogSettings::FreeControls() -{ - // just clear our group list - CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CONTROL_GROUP_LIST); - if (group) - { - group->FreeResources(); - group->ClearAll(); - } -} - -void CGUIDialogSettings::AddSetting(SettingInfo &setting, float width, int iControlID) -{ - CGUIControl *pControl = NULL; - if (setting.type == SettingInfo::BUTTON_DIALOG && m_pOriginalSettingsButton) - { - pControl = new CGUIButtonControl(*m_pOriginalSettingsButton); - if (!pControl) return ; - ((CGUIButtonControl *)pControl)->SetLabel(setting.name); - pControl->SetWidth(width); - if (setting.data) ((CGUIButtonControl *)pControl)->SetLabel2(*(CStdString *)setting.data); - } - else if (setting.type == SettingInfo::BUTTON && m_pOriginalSettingsButton) - { - pControl = new CGUIButtonControl(*m_pOriginalSettingsButton); - if (!pControl) return ; - ((CGUIButtonControl *)pControl)->SetLabel(setting.name); - if (setting.formatFunction.standard) - ((CGUIButtonControl *)pControl)->SetLabel2(setting.formatFunction.standard(*(float *)setting.data, setting.interval)); - pControl->SetWidth(width); - } - else if (setting.type == SettingInfo::EDIT && m_pOriginalEdit) - { - pControl = new CGUIEditControl(*m_pOriginalEdit); - if (!pControl) return ; - ((CGUIEditControl *)pControl)->SetLabel(setting.name); - pControl->SetWidth(width); - if (setting.data) ((CGUIEditControl *)pControl)->SetLabel2(*(CStdString *)setting.data); - } - else if (setting.type == SettingInfo::EDIT_NUM && m_pOriginalEditNum) - { - pControl = new CGUIEditControl(*m_pOriginalEditNum); - if (!pControl) return ; - ((CGUIEditControl *)pControl)->SetLabel(setting.name); - pControl->SetWidth(width); - ((CGUIEditControl *)pControl)->SetInputType(CGUIEditControl::INPUT_TYPE_NUMBER, 0); - if (setting.data) { - CStdString strIndex = StringUtils::Format("%i", *(int *)setting.data); - ((CGUIEditControl *)pControl)->SetLabel2(strIndex); - } - } - else if (setting.type == SettingInfo::SEPARATOR && m_pOriginalSeparator) - { - pControl = new CGUIImage(*m_pOriginalSeparator); - if (!pControl) return ; - pControl->SetWidth(width); - } - else if (setting.type == SettingInfo::CHECK || setting.type == SettingInfo::CHECK_UCHAR) - { - if (!m_pOriginalRadioButton) return; - pControl = new CGUIRadioButtonControl(*m_pOriginalRadioButton); - if (!pControl) return ; - ((CGUIRadioButtonControl *)pControl)->SetLabel(setting.name); - pControl->SetWidth(width); - if (setting.data) ((CGUIRadioButtonControl *)pControl)->SetSelected(*(bool *)setting.data == 1); - } - else if (setting.type == SettingInfo::SPIN && setting.entry.size() > 0 && m_pOriginalSpin) - { - pControl = new CGUISpinControlEx(*m_pOriginalSpin); - if (!pControl) return ; - pControl->SetWidth(width); - ((CGUISpinControlEx *)pControl)->SetText(setting.name); - pControl->SetWidth(width); - for (unsigned int i = 0; i < setting.entry.size(); i++) - ((CGUISpinControlEx *)pControl)->AddLabel(setting.entry[i].second, setting.entry[i].first); - if (setting.data) ((CGUISpinControlEx *)pControl)->SetValue(*(int *)setting.data); - } - else if (setting.type == SettingInfo::SLIDER) - { - if (!m_pOriginalSlider) return; - pControl = new CGUISettingsSliderControl(*m_pOriginalSlider); - if (!pControl) return ; - pControl->SetWidth(width); - ((CGUISettingsSliderControl *)pControl)->SetText(setting.name); - if (setting.formatFunction.standard) - ((CGUISettingsSliderControl *)pControl)->SetTextValue(setting.formatFunction.standard(*(float *)setting.data, setting.interval)); - ((CGUISettingsSliderControl *)pControl)->SetType(SLIDER_CONTROL_TYPE_FLOAT); - ((CGUISettingsSliderControl *)pControl)->SetFloatRange(setting.min, setting.max); - ((CGUISettingsSliderControl *)pControl)->SetFloatInterval(setting.interval); - if (setting.data) ((CGUISettingsSliderControl *)pControl)->SetFloatValue(*(float *)setting.data); - } - else if (setting.type == SettingInfo::STRING && m_pOriginalSettingsButton) - { - pControl = new CGUIButtonControl(*m_pOriginalSettingsButton); - if (!pControl) return ; - ((CGUIButtonControl *)pControl)->SetLabel(setting.name); - string strValue = string(*(CStdString *)setting.data); - if (strValue.empty()) - strValue = "-"; - ((CGUIButtonControl *)pControl)->SetLabel2(strValue); - pControl->SetWidth(width); - } - else if (setting.type == SettingInfo::RANGE) - { - if (!m_pOriginalSlider) return; - pControl = new CGUISettingsSliderControl(*m_pOriginalSlider); - if (!pControl) return ; - pControl->SetWidth(width); - ((CGUISettingsSliderControl *)pControl)->SetText(setting.name); - if (setting.formatFunction.range) - ((CGUISettingsSliderControl *)pControl)->SetTextValue(setting.formatFunction.range(*((float **)setting.data)[0], *((float **)setting.data)[1], setting.interval)); - ((CGUISettingsSliderControl *)pControl)->SetType(SLIDER_CONTROL_TYPE_FLOAT); - ((CGUISettingsSliderControl *)pControl)->SetRangeSelection(true); - ((CGUISettingsSliderControl *)pControl)->SetFloatRange(setting.min, setting.max); - ((CGUISettingsSliderControl *)pControl)->SetFloatInterval(setting.interval); - if (setting.data) - { - ((CGUISettingsSliderControl *)pControl)->SetFloatValue(*((float **)setting.data)[0], CGUISliderControl::RangeSelectorLower); - ((CGUISettingsSliderControl *)pControl)->SetFloatValue(*((float **)setting.data)[1], CGUISliderControl::RangeSelectorUpper); - } - } - if (!pControl) return; - - pControl->SetID(iControlID); - pControl->SetVisible(true); - pControl->SetEnabled(setting.enabled); - CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CONTROL_GROUP_LIST); - if (group) - { - pControl->AllocResources(); - group->AddControl(pControl); - } - else - delete pControl; -} - -void CGUIDialogSettings::AddEdit(unsigned int id, int label, CStdString *str, bool enabled) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::EDIT; - setting.enabled = enabled; - setting.data = str; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddNumEdit(unsigned int id, int label, int *current, bool enabled) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::EDIT_NUM; - setting.enabled = enabled; - setting.data = current; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddButton(unsigned int id, int label, float *current, float min, float interval, float max, FORMATFUNCTION function) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::BUTTON; - setting.data = current; - setting.min = min; - setting.max = max; - setting.interval = interval; - setting.formatFunction.standard = function; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddButton(unsigned int id, int label, CStdString *str, bool bOn) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::BUTTON_DIALOG; - setting.enabled = bOn; - setting.data = str; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddString(unsigned int id, int label, CStdString *current) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::STRING; - setting.data = current; - setting.enabled = true; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddBool(unsigned int id, int label, bool *on, bool enabled) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::CHECK; - setting.data = on; - setting.enabled = enabled; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddSpin(unsigned int id, int label, int *current, unsigned int max, const SETTINGSTRINGS &entries) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::SPIN; - setting.data = current; - for (unsigned int i = 0; i < max; i++) - setting.entry.push_back(make_pair(i, entries[i])); - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddSpin(unsigned int id, int label, int *current, unsigned int max, const int *entries) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::SPIN; - setting.data = current; - for (unsigned int i = 0; i < max; i++) - setting.entry.push_back(make_pair(i, g_localizeStrings.Get(entries[i]))); - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddSpin(unsigned int id, int label, int *current, unsigned int min, unsigned int max, const char* minLabel) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::SPIN; - setting.data = current; - for (unsigned int i = min; i <= max; i++) - { - CStdString format; - if (i == min && minLabel) - format = minLabel; - else - format = StringUtils::Format("%i", i); - setting.entry.push_back(make_pair(i, format)); - } - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddSpin(unsigned int id, int label, int *current, vector<pair<int, CStdString> > &values) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::SPIN; - setting.data = current; - setting.entry = values; - if (values.size() <= 1) - setting.enabled = false; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddSpin(unsigned int id, int label, int *current, vector<pair<int, int> > &values) -{ - vector<pair<int, CStdString> > entries; - for(unsigned i = 0; i < values.size(); i++) - entries.push_back(make_pair(values[i].first, g_localizeStrings.Get(values[i].second))); - AddSpin(id, label, current, entries); -} - -void CGUIDialogSettings::AddSlider(unsigned int id, int label, float *current, float min, float interval, float max, FORMATFUNCTION function, bool allowPopup /* = true*/) -{ - if (m_usePopupSliders && allowPopup) - { - AddButton(id, label, current, min, interval, max, function); - return; - } - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::SLIDER; - setting.min = min; - setting.interval = interval; - setting.max = max; - setting.data = current; - setting.formatFunction.standard = function; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddRangeSlider(unsigned int id, int label, float *currentLower, float* currentUpper, float min, float interval, float max, RANGEFORMATFUNCTION function) -{ - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(label); - setting.type = SettingInfo::RANGE; - setting.min = min; - setting.interval = interval; - setting.max = max; - - float** data = new float*[2]; - data[0] = currentLower; - data[1] = currentUpper; - setting.data = data; - - setting.formatFunction.range = function; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::AddSeparator(unsigned int id) -{ - SettingInfo setting; - setting.id = id; - setting.type = SettingInfo::SEPARATOR; - setting.data = NULL; - m_settings.push_back(setting); -} - -void CGUIDialogSettings::OnInitWindow() -{ - CreateSettings(); - SetInitialVisibility(); - SetupPage(); - // set the default focus control - m_lastControlID = CONTROL_START; - - for (unsigned int i = 0; i < m_settings.size(); i++) - { - if (m_settings.at(i).enabled) - { - m_lastControlID = CONTROL_START + i; - break; - } - } - CGUIDialog::OnInitWindow(); -} - -void CGUIDialogSettings::OnSliderChange(void *data, CGUISliderControl *slider) -{ - if (!data || !slider) - return; - - SettingInfo *setting = (SettingInfo *)data; - if (setting->type == SettingInfo::SLIDER || (setting->type == SettingInfo::BUTTON && m_usePopupSliders && !slider->GetRangeSelection())) - { - *(float *)setting->data = slider->GetFloatValue(); - OnSettingChanged(*setting); - if (setting->formatFunction.standard) - slider->SetTextValue(setting->formatFunction.standard(slider->GetFloatValue(), setting->interval)); - } - else if (setting->type == SettingInfo::RANGE || (setting->type == SettingInfo::BUTTON && m_usePopupSliders && slider->GetRangeSelection())) - { - *((float **)setting->data)[0] = slider->GetFloatValue(CGUISliderControl::RangeSelectorLower); - *((float **)setting->data)[1] = slider->GetFloatValue(CGUISliderControl::RangeSelectorUpper); - OnSettingChanged(*setting); - if (setting->formatFunction.range) - slider->SetTextValue(setting->formatFunction.range(slider->GetFloatValue(CGUISliderControl::RangeSelectorLower), slider->GetFloatValue(CGUISliderControl::RangeSelectorUpper), setting->interval)); - } -} diff --git a/xbmc/settings/dialogs/GUIDialogSettings.h b/xbmc/settings/dialogs/GUIDialogSettings.h deleted file mode 100644 index 2b3778b54b..0000000000 --- a/xbmc/settings/dialogs/GUIDialogSettings.h +++ /dev/null @@ -1,119 +0,0 @@ -#pragma once - -/* - * 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 "guilib/GUIDialog.h" -#include "guilib/ISliderCallback.h" - -class CGUISpinControlEx; -class CGUIButtonControl; -class CGUIRadioButtonControl; -class CGUISettingsSliderControl; -class CGUIEditControl; -class CGUIImage; -class CGUIEditControl; - -typedef std::vector<CStdString> SETTINGSTRINGS; -typedef CStdString (*FORMATFUNCTION) (float value, float min); -typedef CStdString (*RANGEFORMATFUNCTION) (float valueLower, float valueUpper, float min); - -class SettingInfo -{ -public: - enum SETTING_TYPE { NONE=0, EDIT, EDIT_NUM, BUTTON, BUTTON_DIALOG, CHECK, CHECK_UCHAR, SPIN, SLIDER, SEPARATOR, STRING, RANGE }; - SettingInfo() - { - id = 0; - data = NULL; - type = NONE; - enabled = true; - min = 0; - max = 0; - interval = 0; - formatFunction.standard = NULL; - }; - SETTING_TYPE type; - CStdString name; - unsigned int id; - void *data; - float min; - float max; - float interval; - union - { - FORMATFUNCTION standard; - RANGEFORMATFUNCTION range; - } formatFunction; - std::vector<std::pair<int, CStdString> > entry; - bool enabled; -}; - -class CGUIDialogSettings : - public CGUIDialog, public ISliderCallback -{ -public: - CGUIDialogSettings(int id, const char *xmlFile); - virtual ~CGUIDialogSettings(void); - virtual bool OnMessage(CGUIMessage &message); - - virtual void OnSliderChange(void *data, CGUISliderControl *slider); -protected: - virtual void OnOkay() {}; - virtual void OnCancel() {}; - virtual bool OnBack(int actionID); - virtual void OnInitWindow(); - virtual void SetupPage(); - virtual void CreateSettings() {}; - void UpdateSetting(unsigned int setting); - void EnableSettings(unsigned int setting, bool enabled); - virtual void OnSettingChanged(SettingInfo &setting) {}; - void FreeControls(); - void OnClick(int iControlID); - - void AddSetting(SettingInfo &setting, float width, int iControlID); - - void AddEdit(unsigned int id, int label, CStdString *str, bool enabled = true); - void AddNumEdit(unsigned int id, int label, int *current, bool enabled = true); - void AddButton(unsigned int id, int label, float *current = NULL, float min = 0, float interval = 0, float max = 0, FORMATFUNCTION function = NULL); - void AddButton(unsigned int it, int label, CStdString *str, bool bOn=true); - void AddBool(unsigned int id, int label, bool *on, bool enabled = true); - void AddSpin(unsigned int id, int label, int *current, unsigned int max, const SETTINGSTRINGS &entries); - void AddString(unsigned int id, int label, CStdString *current); - void AddSpin(unsigned int id, int label, int *current, unsigned int max, const int *entries); - void AddSpin(unsigned int id, int label, int *current, unsigned int min, unsigned int max, const char* minLabel = NULL); - void AddSpin(unsigned int id, int label, int *current, std::vector<std::pair<int, CStdString> > &values); - void AddSpin(unsigned int id, int label, int *current, std::vector<std::pair<int, int> > &values); - void AddSlider(unsigned int id, int label, float *current, float min, float interval, float max, FORMATFUNCTION formatFunction, bool allowPopup = true); - void AddRangeSlider(unsigned int id, int label, float *currentLower, float* currentUpper, float min, float interval, float max, RANGEFORMATFUNCTION formatFunction); - void AddSeparator(unsigned int id); - - CGUIEditControl *m_pOriginalEdit; - CGUIEditControl *m_pOriginalEditNum; - CGUISpinControlEx *m_pOriginalSpin; - CGUIRadioButtonControl *m_pOriginalRadioButton; - CGUIButtonControl *m_pOriginalSettingsButton; - CGUISettingsSliderControl *m_pOriginalSlider; - CGUIImage *m_pOriginalSeparator; - - std::vector<SettingInfo> m_settings; - - bool m_usePopupSliders; -}; diff --git a/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp b/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp new file mode 100644 index 0000000000..76e7c72cf5 --- /dev/null +++ b/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp @@ -0,0 +1,818 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://www.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 "GUIDialogSettingsBase.h" +#include "GUIUserMessages.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "dialogs/GUIDialogTextViewer.h" +#include "dialogs/GUIDialogYesNo.h" +#include "guilib/GUIControlGroupList.h" +#include "guilib/GUIEditControl.h" +#include "guilib/GUIImage.h" +#include "guilib/GUIRadioButtonControl.h" +#include "guilib/GUISettingsSliderControl.h" +#include "guilib/GUISpinControlEx.h" +#include "guilib/GUIToggleButtonControl.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/Key.h" +#include "guilib/LocalizeStrings.h" +#include "settings/SettingControl.h" +#include "settings/lib/SettingSection.h" +#include "settings/lib/SettingsManager.h" +#include "settings/windows/GUIControlSettings.h" +#include "utils/StringUtils.h" + +using namespace std; + +#if defined(TARGET_WINDOWS) // disable 4355: 'this' used in base member initializer list +#pragma warning(push) +#pragma warning(disable: 4355) +#endif // defined(TARGET_WINDOWS) + +#define CATEGORY_GROUP_ID 3 +#define SETTINGS_GROUP_ID 5 + +#define CONTROL_DEFAULT_BUTTON 7 +#define CONTROL_DEFAULT_RADIOBUTTON 8 +#define CONTROL_DEFAULT_SPIN 9 +#define CONTROL_DEFAULT_CATEGORY_BUTTON 10 +#define CONTROL_DEFAULT_SEPARATOR 11 +#define CONTROL_DEFAULT_EDIT 12 +#define CONTROL_DEFAULT_SLIDER 13 + +CGUIDialogSettingsBase::CGUIDialogSettingsBase(int windowId, const std::string &xmlFile) + : CGUIDialog(windowId, xmlFile), + m_iSetting(0), m_iCategory(0), + m_resetSetting(NULL), + m_dummyCategory(NULL), + m_pOriginalSpin(NULL), + m_pOriginalSlider(NULL), + m_pOriginalRadioButton(NULL), + m_pOriginalCategoryButton(NULL), + m_pOriginalButton(NULL), + m_pOriginalEdit(NULL), + m_pOriginalImage(NULL), + m_newOriginalEdit(false), + m_delayedTimer(this), + m_confirmed(false) +{ + m_loadType = KEEP_IN_MEMORY; +} + +CGUIDialogSettingsBase::~CGUIDialogSettingsBase() +{ + FreeControls(); + DeleteControls(); +} + +bool CGUIDialogSettingsBase::OnMessage(CGUIMessage &message) +{ + switch (message.GetMessage()) + { + case GUI_MSG_WINDOW_INIT: + { + m_delayedSetting.reset(); + if (message.GetParam1() != WINDOW_INVALID) + { // coming to this window first time (ie not returning back from some other window) + // so we reset our section and control states + m_iCategory = 0; + ResetControlStates(); + } + + if (AllowResettingSettings()) + { + m_resetSetting = new CSettingAction(SETTINGS_RESET_SETTING_ID); + m_resetSetting->SetLabel(10041); + m_resetSetting->SetHelp(10045); + m_resetSetting->SetControl(CreateControl("button")); + } + + m_dummyCategory = new CSettingCategory(SETTINGS_EMPTY_CATEGORY_ID); + m_dummyCategory->SetLabel(10046); + m_dummyCategory->SetHelp(10047); + break; + } + + case GUI_MSG_WINDOW_DEINIT: + { + // cancel any delayed changes + if (m_delayedSetting != NULL) + { + m_delayedTimer.Stop(); + CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), m_delayedSetting->GetID()); + OnMessage(message); + } + + CGUIDialog::OnMessage(message); + FreeControls(); + return true; + } + + case GUI_MSG_FOCUSED: + { + CGUIDialog::OnMessage(message); + int focusedControl = GetFocusedControlID(); + + // cancel any delayed changes + if (m_delayedSetting != NULL && m_delayedSetting->GetID() != focusedControl) + { + m_delayedTimer.Stop(); + CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), m_delayedSetting->GetID(), 1); // param1 = 1 for "reset the control if it's invalid" + g_windowManager.SendThreadMessage(message, GetID()); + } + // update the value of the previous setting (in case it was invalid) + else if (m_iSetting >= CONTROL_SETTINGS_START_CONTROL && m_iSetting < (int)(CONTROL_SETTINGS_START_CONTROL + m_settingControls.size())) + { + BaseSettingControlPtr control = GetSettingControl(m_iSetting); + if (control != NULL && control->GetSetting() != NULL && !control->IsValid()) + { + CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), m_iSetting, 1); // param1 = 1 for "reset the control if it's invalid" + g_windowManager.SendThreadMessage(message, GetID()); + } + } + + CVariant description; + + // check if we have changed the category and need to create new setting controls + if (focusedControl >= CONTROL_SETTINGS_START_BUTTONS && focusedControl < (int)(CONTROL_SETTINGS_START_BUTTONS + m_categories.size())) + { + int categoryIndex = focusedControl - CONTROL_SETTINGS_START_BUTTONS; + const CSettingCategory* category = m_categories.at(categoryIndex); + if (categoryIndex != m_iCategory) + { + if (!category->CanAccess()) + { + // unable to go to this category - focus the previous one + SET_CONTROL_FOCUS(CONTROL_SETTINGS_START_BUTTONS + m_iCategory, 0); + return false; + } + + m_iCategory = categoryIndex; + CreateSettings(); + } + + description = category->GetHelp(); + } + else if (focusedControl >= CONTROL_SETTINGS_START_CONTROL && focusedControl < (int)(CONTROL_SETTINGS_START_CONTROL + m_settingControls.size())) + { + m_iSetting = focusedControl; + CSetting *setting = GetSettingControl(focusedControl)->GetSetting(); + if (setting != NULL) + description = setting->GetHelp(); + } + + // set the description of the currently focused category/setting + if (description.isInteger() || + (description.isString() && !description.empty())) + SetDescription(description); + + return true; + } + + case GUI_MSG_CLICKED: + { + int iControl = message.GetSenderId(); + if (iControl == CONTROL_SETTINGS_OKAY_BUTTON) + { + OnOkay(); + Close(); + return true; + } + + if (iControl == CONTROL_SETTINGS_CANCEL_BUTTON) + { + OnCancel(); + Close(); + return true; + } + + BaseSettingControlPtr control = GetSettingControl(iControl); + if (control != NULL) + OnClick(control); + + break; + } + + case GUI_MSG_UPDATE_ITEM: + { + if (m_delayedSetting != NULL && m_delayedSetting->GetID() == message.GetControlId()) + { + // first get the delayed setting and reset its member variable + // to avoid handling the delayed setting twice in case the OnClick() + // performed later causes the window to be deinitialized (e.g. when + // changing the language) + BaseSettingControlPtr delayedSetting = m_delayedSetting; + m_delayedSetting.reset(); + + // if updating the setting fails and param1 has been specifically set + // we need to call OnSettingChanged() to restore a valid value in the + // setting control + if (!delayedSetting->OnClick() && message.GetParam1() != 0) + OnSettingChanged(delayedSetting->GetSetting()); + return true; + } + + if (message.GetControlId() >= CONTROL_SETTINGS_START_CONTROL && message.GetControlId() < (int)(CONTROL_SETTINGS_START_CONTROL + m_settingControls.size())) + { + BaseSettingControlPtr settingControl = GetSettingControl(message.GetControlId()); + if (settingControl.get() != NULL && settingControl->GetSetting() != NULL) + { + settingControl->Update(); + return true; + } + } + break; + } + + case GUI_MSG_UPDATE: + { + if (IsActive() && HasID(message.GetSenderId())) + { + int focusedControl = GetFocusedControlID(); + CreateSettings(); + SET_CONTROL_FOCUS(focusedControl, 0); + } + break; + } + + default: + break; + } + + return CGUIDialog::OnMessage(message); +} + +bool CGUIDialogSettingsBase::OnAction(const CAction &action) +{ + switch (action.GetID()) + { + case ACTION_SETTINGS_RESET: + { + OnResetSettings(); + return true; + } + + default: + break; + } + + return CGUIDialog::OnAction(action); +} + +bool CGUIDialogSettingsBase::OnBack(int actionID) +{ + m_lastControlID = 0; // don't save the control as we go to a different window each time + + // if the setting dialog is not a window but a dialog we need to close differently + if (!IsDialog()) + return CGUIWindow::OnBack(actionID); + + return CGUIDialog::OnBack(actionID); +} + +void CGUIDialogSettingsBase::DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions) +{ + // update alpha status of current button + bool bAlphaFaded = false; + CGUIControl *control = GetFirstFocusableControl(CONTROL_SETTINGS_START_BUTTONS + m_iCategory); + if (control && !control->HasFocus()) + { + if (control->GetControlType() == CGUIControl::GUICONTROL_BUTTON) + { + control->SetFocus(true); + ((CGUIButtonControl *)control)->SetAlpha(0x80); + bAlphaFaded = true; + } + else if (control->GetControlType() == CGUIControl::GUICONTROL_TOGGLEBUTTON) + { + control->SetFocus(true); + ((CGUIButtonControl *)control)->SetSelected(true); + bAlphaFaded = true; + } + } + CGUIDialog::DoProcess(currentTime, dirtyregions); + if (control && bAlphaFaded) + { + control->SetFocus(false); + if (control->GetControlType() == CGUIControl::GUICONTROL_BUTTON) + ((CGUIButtonControl *)control)->SetAlpha(0xFF); + else + ((CGUIButtonControl *)control)->SetSelected(false); + } +} + +void CGUIDialogSettingsBase::OnInitWindow() +{ + m_confirmed = false; + SetupView(); + CGUIDialog::OnInitWindow(); +} + +void CGUIDialogSettingsBase::SetupControls(bool createSettings /* = true */) +{ + // cleanup first, if necessary + FreeControls(); + + // get the section + CSettingSection *section = GetSection(); + if (section == NULL) + return; + + // update the screen string + SetHeading(section->GetLabel()); + + // get the categories we need + m_categories = section->GetCategories((SettingLevel)GetSettingLevel()); + if (m_categories.empty()) + m_categories.push_back(m_dummyCategory); + + // get all controls + m_pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN); + m_pOriginalSlider = (CGUISettingsSliderControl*)GetControl(CONTROL_DEFAULT_SLIDER); + m_pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON); + m_pOriginalCategoryButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_CATEGORY_BUTTON); + m_pOriginalButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON); + m_pOriginalImage = (CGUIImage *)GetControl(CONTROL_DEFAULT_SEPARATOR); + m_pOriginalEdit = (CGUIEditControl *)GetControl(CONTROL_DEFAULT_EDIT); + if (!m_pOriginalEdit || m_pOriginalEdit->GetControlType() != CGUIControl::GUICONTROL_EDIT) + { + delete m_pOriginalEdit; + m_pOriginalEdit = new CGUIEditControl(*m_pOriginalButton); + m_newOriginalEdit = true; + } + + if (m_pOriginalSpin) m_pOriginalSpin->SetVisible(false); + if (m_pOriginalSlider) m_pOriginalSlider->SetVisible(false); + if (m_pOriginalRadioButton) m_pOriginalRadioButton->SetVisible(false); + if (m_pOriginalButton) m_pOriginalButton->SetVisible(false); + if (m_pOriginalCategoryButton) m_pOriginalCategoryButton->SetVisible(false); + m_pOriginalEdit->SetVisible(false); + if (m_pOriginalImage) m_pOriginalImage->SetVisible(false); + + if (m_pOriginalCategoryButton != NULL) + { + // setup our control groups... + CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CATEGORY_GROUP_ID); + if (!group) + return; + + // go through the categories and create the necessary buttons + int buttonIdOffset = 0; + for (SettingCategoryList::const_iterator category = m_categories.begin(); category != m_categories.end(); category++) + { + CGUIButtonControl *pButton = NULL; + if (m_pOriginalCategoryButton->GetControlType() == CGUIControl::GUICONTROL_TOGGLEBUTTON) + pButton = new CGUIToggleButtonControl(*(CGUIToggleButtonControl *)m_pOriginalCategoryButton); + else + pButton = new CGUIButtonControl(*m_pOriginalCategoryButton); + pButton->SetLabel(GetLocalizedString((*category)->GetLabel())); + pButton->SetID(CONTROL_SETTINGS_START_BUTTONS + buttonIdOffset); + pButton->SetVisible(true); + pButton->AllocResources(); + + group->AddControl(pButton); + buttonIdOffset++; + } + } + + if (createSettings) + CreateSettings(); + + // set focus correctly depending on whether there are categories visible or not + m_defaultControl = m_pOriginalCategoryButton != NULL ? CATEGORY_GROUP_ID : SETTINGS_GROUP_ID; +} + +void CGUIDialogSettingsBase::FreeControls() +{ + // clear the category group + CGUIControlGroupList *control = (CGUIControlGroupList *)GetControl(CATEGORY_GROUP_ID); + if (control) + { + control->FreeResources(); + control->ClearAll(); + } + m_categories.clear(); + FreeSettingsControls(); +} + +void CGUIDialogSettingsBase::DeleteControls() +{ + if (m_newOriginalEdit) + { + delete m_pOriginalEdit; + m_pOriginalEdit = NULL; + } + + delete m_resetSetting; + m_resetSetting = NULL; + delete m_dummyCategory; + m_dummyCategory = NULL; +} + +void CGUIDialogSettingsBase::FreeSettingsControls() +{ + // clear the settings group + CGUIControlGroupList *control = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID); + if (control) + { + control->FreeResources(); + control->ClearAll(); + } + + for (std::vector<BaseSettingControlPtr>::iterator control = m_settingControls.begin(); control != m_settingControls.end(); control++) + (*control)->Clear(); + + m_settingControls.clear(); +} + +void CGUIDialogSettingsBase::OnTimeout() +{ + UpdateSettingControl(m_delayedSetting); +} + +void CGUIDialogSettingsBase::OnSettingChanged(const CSetting *setting) +{ + if (setting == NULL || setting->GetType() == SettingTypeNone || + setting->GetType() == SettingTypeAction) + return; + + UpdateSettingControl(setting->GetId()); +} + +void CGUIDialogSettingsBase::OnSettingPropertyChanged(const CSetting *setting, const char *propertyName) +{ + if (setting == NULL || propertyName == NULL) + return; + + UpdateSettingControl(setting->GetId()); +} + +std::string CGUIDialogSettingsBase::GetLocalizedString(uint32_t labelId) const +{ + return g_localizeStrings.Get(labelId); +} + +void CGUIDialogSettingsBase::SetupView() +{ + SetupControls(); +} + +std::set<std::string> CGUIDialogSettingsBase::CreateSettings() +{ + FreeSettingsControls(); + + std::set<std::string> settingMap; + + if (m_categories.size() <= 0) + return settingMap; + + if (m_iCategory < 0 || m_iCategory >= (int)m_categories.size()) + m_iCategory = 0; + + CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID); + if (group == NULL) + return settingMap; + + const CSettingCategory* category = m_categories.at(m_iCategory); + if (category == NULL) + return settingMap; + + // set the description of the current category + SetDescription(category->GetHelp()); + + const SettingGroupList& groups = category->GetGroups((SettingLevel)GetSettingLevel()); + int iControlID = CONTROL_SETTINGS_START_CONTROL; + bool first = true; + for (SettingGroupList::const_iterator groupIt = groups.begin(); groupIt != groups.end(); groupIt++) + { + if (*groupIt == NULL) + continue; + + const SettingList& settings = (*groupIt)->GetSettings((SettingLevel)GetSettingLevel()); + if (settings.size() <= 0) + continue; + + if (first) + first = false; + else + AddSeparator(group->GetWidth(), iControlID); + + for (SettingList::const_iterator settingIt = settings.begin(); settingIt != settings.end(); settingIt++) + { + CSetting *pSetting = *settingIt; + settingMap.insert(pSetting->GetId()); + AddSetting(pSetting, group->GetWidth(), iControlID); + } + } + + if (AllowResettingSettings() && !settingMap.empty()) + { + // add "Reset" control + AddSeparator(group->GetWidth(), iControlID); + AddSetting(m_resetSetting, group->GetWidth(), iControlID); + } + + // update our settings (turns controls on/off as appropriate) + UpdateSettings(); + + return settingMap; +} + +void CGUIDialogSettingsBase::UpdateSettings() +{ + for (vector<BaseSettingControlPtr>::iterator it = m_settingControls.begin(); it != m_settingControls.end(); it++) + { + BaseSettingControlPtr pSettingControl = *it; + CSetting *pSetting = pSettingControl->GetSetting(); + CGUIControl *pControl = pSettingControl->GetControl(); + if (pSetting == NULL || pControl == NULL) + continue; + + pSettingControl->Update(); + } +} + +CGUIControl* CGUIDialogSettingsBase::AddSetting(CSetting *pSetting, float width, int &iControlID) +{ + if (pSetting == NULL) + return NULL; + + BaseSettingControlPtr pSettingControl; + CGUIControl *pControl = NULL; + + // determine the label and any possible indentation in case of sub settings + string label = GetLocalizedString(pSetting->GetLabel()); + int parentLevels = 0; + CSetting *parentSetting = GetSetting(pSetting->GetParent()); + while (parentSetting != NULL) + { + parentLevels++; + parentSetting = GetSetting(parentSetting->GetParent()); + } + + if (parentLevels > 0) + { + // add additional 2 spaces indentation for anything past one level + string indentation; + for (int index = 1; index < parentLevels; index++) + indentation.append(" "); + label = StringUtils::Format(g_localizeStrings.Get(168).c_str(), indentation.c_str(), label.c_str()); + } + + // create the proper controls + if (!pSetting->GetControl()) + return NULL; + + std::string controlType = pSetting->GetControl()->GetType(); + if (controlType == "toggle") + { + if (m_pOriginalRadioButton != NULL) + pControl = new CGUIRadioButtonControl(*m_pOriginalRadioButton); + if (pControl == NULL) + return NULL; + + ((CGUIRadioButtonControl *)pControl)->SetLabel(label); + pSettingControl.reset(new CGUIControlRadioButtonSetting((CGUIRadioButtonControl *)pControl, iControlID, pSetting)); + } + else if (controlType == "spinner") + { + if (m_pOriginalSpin != NULL) + pControl = new CGUISpinControlEx(*m_pOriginalSpin); + if (pControl == NULL) + return NULL; + + ((CGUISpinControlEx *)pControl)->SetText(label); + pSettingControl.reset(new CGUIControlSpinExSetting((CGUISpinControlEx *)pControl, iControlID, pSetting)); + } + else if (controlType == "edit") + { + if (m_pOriginalEdit != NULL) + pControl = new CGUIEditControl(*m_pOriginalEdit); + if (pControl == NULL) + return NULL; + + ((CGUIEditControl *)pControl)->SetLabel(label); + pSettingControl.reset(new CGUIControlEditSetting((CGUIEditControl *)pControl, iControlID, pSetting)); + } + else if (controlType == "list") + { + if (m_pOriginalButton != NULL) + pControl = new CGUIButtonControl(*m_pOriginalButton); + if (pControl == NULL) + return NULL; + + ((CGUIButtonControl *)pControl)->SetLabel(label); + pSettingControl.reset(new CGUIControlListSetting((CGUIButtonControl *)pControl, iControlID, pSetting)); + } + else if (controlType == "button" || controlType == "slider") + { + if (controlType == "button" || + static_cast<const CSettingControlSlider*>(pSetting->GetControl())->UsePopup()) + { + if (m_pOriginalButton != NULL) + pControl = new CGUIButtonControl(*m_pOriginalButton); + if (pControl == NULL) + return NULL; + + ((CGUIButtonControl *)pControl)->SetLabel(label); + pSettingControl.reset(new CGUIControlButtonSetting((CGUIButtonControl *)pControl, iControlID, pSetting)); + } + else + { + if (m_pOriginalSlider != NULL) + pControl = new CGUISettingsSliderControl(*m_pOriginalSlider); + if (pControl == NULL) + return NULL; + + ((CGUISettingsSliderControl *)pControl)->SetText(label); + pSettingControl.reset(new CGUIControlSliderSetting((CGUISettingsSliderControl *)pControl, iControlID, pSetting)); + } + } + else if (controlType == "range") + { + if (m_pOriginalSlider != NULL) + pControl = new CGUISettingsSliderControl(*m_pOriginalSlider); + if (pControl == NULL) + return NULL; + + ((CGUISettingsSliderControl *)pControl)->SetText(label); + pSettingControl.reset(new CGUIControlRangeSetting((CGUISettingsSliderControl *)pControl, iControlID, pSetting)); + } + else + return NULL; + + if (pSetting->GetControl()->GetDelayed()) + pSettingControl->SetDelayed(); + + return AddSettingControl(pControl, pSettingControl, width, iControlID); +} + +CGUIControl* CGUIDialogSettingsBase::AddSeparator(float width, int &iControlID) +{ + if (m_pOriginalImage == NULL) + return NULL; + + CGUIControl *pControl = new CGUIImage(*m_pOriginalImage); + if (pControl == NULL) + return NULL; + + return AddSettingControl(pControl, BaseSettingControlPtr(new CGUIControlSeparatorSetting((CGUIImage *)pControl, iControlID)), width, iControlID); +} + +CGUIControl* CGUIDialogSettingsBase::AddSettingControl(CGUIControl *pControl, BaseSettingControlPtr pSettingControl, float width, int &iControlID) +{ + if (pControl == NULL) + { + pSettingControl.reset(); + return NULL; + } + + pControl->SetID(iControlID++); + pControl->SetVisible(true); + pControl->SetWidth(width); + + CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID); + if (group != NULL) + { + pControl->AllocResources(); + group->AddControl(pControl); + } + m_settingControls.push_back(pSettingControl); + + return pControl; +} + +void CGUIDialogSettingsBase::SetHeading(const CVariant &label) +{ + SetControlLabel(CONTROL_SETTINGS_LABEL, label); +} + +void CGUIDialogSettingsBase::SetDescription(const CVariant &label) +{ + SetControlLabel(CONTROL_SETTINGS_DESCRIPTION, label); +} + +void CGUIDialogSettingsBase::OnResetSettings() +{ + if (CGUIDialogYesNo::ShowAndGetInput(10041, 0, 10042, 0)) + { + for(vector<BaseSettingControlPtr>::iterator it = m_settingControls.begin(); it != m_settingControls.end(); it++) + { + CSetting *setting = (*it)->GetSetting(); + if (setting != NULL) + setting->Reset(); + } + } +} + +void CGUIDialogSettingsBase::OnClick(BaseSettingControlPtr pSettingControl) +{ + if (AllowResettingSettings() && + pSettingControl->GetSetting()->GetId() == SETTINGS_RESET_SETTING_ID) + { + OnAction(CAction(ACTION_SETTINGS_RESET)); + return; + } + + // we need to first set the delayed setting and then execute OnClick() + // because OnClick() triggers OnSettingChanged() and there we need to + // know if the changed setting is delayed or not + if (pSettingControl->IsDelayed()) + { + m_delayedSetting = pSettingControl; + // for some controls we need to update its displayed data/text before + // OnClick() is called after the delay timer has expired because + // otherwise the displayed value of the control does not match with + // the user's interaction + pSettingControl->Update(true); + + // either start or restart the delay timer which will result in a call to + // the control's OnClick() method to update the setting's value + if (m_delayedTimer.IsRunning()) + m_delayedTimer.Restart(); + else + m_delayedTimer.Start(GetDelayMs()); + + return; + } + + // if changing the setting fails + // we need to restore the proper state + if (!pSettingControl->OnClick()) + pSettingControl->Update(); +} + +void CGUIDialogSettingsBase::UpdateSettingControl(const std::string &settingId) +{ + if (settingId.empty()) + return; + + return UpdateSettingControl(GetSettingControl(settingId)); +} + +void CGUIDialogSettingsBase::UpdateSettingControl(BaseSettingControlPtr pSettingControl) +{ + if (pSettingControl == NULL) + return; + + // we send a thread message so that it's processed the following frame (some settings won't + // like being changed during Render()) + CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), pSettingControl->GetID()); + g_windowManager.SendThreadMessage(message, GetID()); +} + +void CGUIDialogSettingsBase::SetControlLabel(int controlId, const CVariant &label) +{ + if (GetControl(controlId) == NULL) + return; + + if (label.isString()) + SET_CONTROL_LABEL(controlId, label.asString()); + else if (label.isInteger() && label.asInteger() >= 0) + { + int labelId = static_cast<uint32_t>(label.asInteger()); + std::string localizedString = GetLocalizedString(labelId); + if (!localizedString.empty()) + SET_CONTROL_LABEL(controlId, localizedString); + else + SET_CONTROL_LABEL(controlId, labelId); + } + else + SET_CONTROL_LABEL(controlId, ""); +} + +BaseSettingControlPtr CGUIDialogSettingsBase::GetSettingControl(const std::string &strSetting) +{ + for (vector<BaseSettingControlPtr>::iterator control = m_settingControls.begin(); control != m_settingControls.end(); control++) + { + if ((*control)->GetSetting() != NULL && (*control)->GetSetting()->GetId() == strSetting) + return *control; + } + + return BaseSettingControlPtr(); +} + +BaseSettingControlPtr CGUIDialogSettingsBase::GetSettingControl(int controlId) +{ + if (controlId < CONTROL_SETTINGS_START_CONTROL || controlId >= (int)(CONTROL_SETTINGS_START_CONTROL + m_settingControls.size())) + return BaseSettingControlPtr(); + + return m_settingControls[controlId - CONTROL_SETTINGS_START_CONTROL]; +} diff --git a/xbmc/settings/dialogs/GUIDialogSettingsBase.h b/xbmc/settings/dialogs/GUIDialogSettingsBase.h new file mode 100644 index 0000000000..024b6cfd66 --- /dev/null +++ b/xbmc/settings/dialogs/GUIDialogSettingsBase.h @@ -0,0 +1,161 @@ +#pragma once +/* + * Copyright (C) 2014 Team XBMC + * http://www.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 "guilib/GUIDialog.h" +#include "settings/SettingControl.h" +#include "settings/lib/ISettingCallback.h" +#include "threads/Timer.h" + +#define CONTROL_SETTINGS_LABEL 2 +#define CONTROL_SETTINGS_DESCRIPTION 6 + +#define CONTROL_SETTINGS_OKAY_BUTTON 28 +#define CONTROL_SETTINGS_CANCEL_BUTTON 29 + +#define CONTROL_SETTINGS_CUSTOM 100 + +#define CONTROL_SETTINGS_START_BUTTONS -100 +#define CONTROL_SETTINGS_START_CONTROL -80 + +#define SETTINGS_RESET_SETTING_ID "settings.reset" +#define SETTINGS_EMPTY_CATEGORY_ID "categories.empty" + +class CGUIControl; +class CGUIControlBaseSetting; +class CGUIImage; +class CGUISpinControlEx; +class CGUIEditControl; +class CGUIButtonControl; +class CGUIRadioButtonControl; +class CGUISettingsSliderControl; + +class CSetting; +class CSettingAction; +class CSettingCategory; +class CSettingSection; + +typedef boost::shared_ptr<CGUIControlBaseSetting> BaseSettingControlPtr; + +class CGUIDialogSettingsBase + : public CGUIDialog, + public CSettingControlCreator, + protected ITimerCallback, + protected ISettingCallback +{ +public: + CGUIDialogSettingsBase(int windowId, const std::string &xmlFile); + virtual ~CGUIDialogSettingsBase(); + + // specializations of CGUIControl + virtual bool OnMessage(CGUIMessage &message); + virtual bool OnAction(const CAction &action); + virtual bool OnBack(int actionID); + virtual void DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions); + + virtual bool IsConfirmed() const { return m_confirmed; } + +protected: + // specializations of CGUIWindow + virtual void OnInitWindow(); + + // implementations of ITimerCallback + virtual void OnTimeout(); + + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName); + + // new virtual methods + virtual bool AllowResettingSettings() const { return true; } + virtual int GetSettingLevel() const { return 0; } + virtual CSettingSection* GetSection() = 0; + virtual CSetting* GetSetting(const std::string &settingId) = 0; + virtual void Save() = 0; + virtual unsigned int GetDelayMs() const { return 1500; } + virtual std::string GetLocalizedString(uint32_t labelId) const; + + virtual void OnOkay() { m_confirmed = true; } + virtual void OnCancel() { } + + virtual void SetupView(); + virtual std::set<std::string> CreateSettings(); + virtual void UpdateSettings(); + + virtual CGUIControl* AddSetting(CSetting *pSetting, float width, int &iControlID); + virtual CGUIControl* AddSettingControl(CGUIControl *pControl, BaseSettingControlPtr pSettingControl, float width, int &iControlID); + + virtual void SetupControls(bool createSettings = true); + virtual void FreeControls(); + virtual void DeleteControls(); + virtual void FreeSettingsControls(); + + virtual void SetHeading(const CVariant &label); + virtual void SetDescription(const CVariant &label); + + virtual void OnResetSettings(); + + /*! + \brief A setting control has been interacted with by the user + + This method is called when the user manually interacts (clicks, + edits) with a setting control. It contains handling for both + delayed and undelayed settings and either starts the delay timer + or triggers the setting change which, on success, results in a + callback to OnSettingChanged(). + + \param pSettingControl Setting control that has been interacted with + */ + virtual void OnClick(BaseSettingControlPtr pSettingControl); + + void UpdateSettingControl(const std::string &settingId); + void UpdateSettingControl(BaseSettingControlPtr pSettingControl); + void SetControlLabel(int controlId, const CVariant &label); + + BaseSettingControlPtr GetSettingControl(const std::string &setting); + BaseSettingControlPtr GetSettingControl(int controlId); + + CGUIControl* AddSeparator(float width, int &iControlID); + + std::vector<CSettingCategory*> m_categories; + std::vector<BaseSettingControlPtr> m_settingControls; + + int m_iSetting; + int m_iCategory; + CSettingAction *m_resetSetting; + CSettingCategory *m_dummyCategory; + + CGUISpinControlEx *m_pOriginalSpin; + CGUISettingsSliderControl *m_pOriginalSlider; + CGUIRadioButtonControl *m_pOriginalRadioButton; + CGUIButtonControl *m_pOriginalCategoryButton; + CGUIButtonControl *m_pOriginalButton; + CGUIEditControl *m_pOriginalEdit; + CGUIImage *m_pOriginalImage; + bool m_newOriginalEdit; + + BaseSettingControlPtr m_delayedSetting; ///< Current delayed setting \sa CBaseSettingControl::SetDelayed() + CTimer m_delayedTimer; ///< Delayed setting timer + + bool m_confirmed; +}; diff --git a/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.cpp b/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.cpp new file mode 100644 index 0000000000..13f3083327 --- /dev/null +++ b/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://www.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 "GUIDialogSettingsManagerBase.h" +#include "settings/lib/SettingsManager.h" + +using namespace std; + +CGUIDialogSettingsManagerBase::CGUIDialogSettingsManagerBase(int windowId, const std::string &xmlFile) + : CGUIDialogSettingsBase(windowId, xmlFile), + m_settingsManager(NULL) +{ } + +CGUIDialogSettingsManagerBase::~CGUIDialogSettingsManagerBase() +{ + m_settingsManager = NULL; +} + +CSetting* CGUIDialogSettingsManagerBase::GetSetting(const std::string &settingId) +{ + assert(m_settingsManager != NULL); + + return m_settingsManager->GetSetting(settingId); +} + +std::set<std::string> CGUIDialogSettingsManagerBase::CreateSettings() +{ + assert(m_settingsManager != NULL); + + std::set<std::string> settings = CGUIDialogSettingsBase::CreateSettings(); + + if (!settings.empty()) + m_settingsManager->RegisterCallback(this, settings); + + return settings; +} + +void CGUIDialogSettingsManagerBase::FreeSettingsControls() +{ + assert(m_settingsManager != NULL); + + CGUIDialogSettingsBase::FreeSettingsControls(); + + m_settingsManager->UnregisterCallback(this); +} + +ISettingControl* CGUIDialogSettingsManagerBase::CreateControl(const std::string &controlType) +{ + assert(m_settingsManager != NULL); + + return m_settingsManager->CreateControl(controlType); +} diff --git a/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.h b/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.h new file mode 100644 index 0000000000..2a4732aa87 --- /dev/null +++ b/xbmc/settings/dialogs/GUIDialogSettingsManagerBase.h @@ -0,0 +1,43 @@ +#pragma once +/* + * Copyright (C) 2014 Team XBMC + * http://www.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 "settings/dialogs/GUIDialogSettingsBase.h" + +class CSettingsManager; + +class CGUIDialogSettingsManagerBase : public CGUIDialogSettingsBase +{ +public: + CGUIDialogSettingsManagerBase(int windowId, const std::string &xmlFile); + virtual ~CGUIDialogSettingsManagerBase(); + +protected: + // implementation of CGUIDialogSettingsBase + virtual CSetting* GetSetting(const std::string &settingId); + + virtual std::set<std::string> CreateSettings(); + virtual void FreeSettingsControls(); + + // implementation of ISettingControlCreator + virtual ISettingControl* CreateControl(const std::string &controlType); + + CSettingsManager *m_settingsManager; +}; diff --git a/xbmc/settings/dialogs/GUIDialogSettingsManualBase.cpp b/xbmc/settings/dialogs/GUIDialogSettingsManualBase.cpp new file mode 100644 index 0000000000..fcb1e22b03 --- /dev/null +++ b/xbmc/settings/dialogs/GUIDialogSettingsManualBase.cpp @@ -0,0 +1,1046 @@ +/* + * 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 "GUIDialogSettingsManualBase.h" +#include "guilib/LocalizeStrings.h" +#include "settings/SettingAddon.h" +#include "settings/SettingPath.h" +#include "settings/SettingUtils.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingSection.h" +#include "settings/lib/SettingsManager.h" +#include "utils/StringUtils.h" + +using namespace std; + +CGUIDialogSettingsManualBase::CGUIDialogSettingsManualBase(int windowId, const std::string &xmlFile) + : CGUIDialogSettingsManagerBase(windowId, xmlFile), + m_section(NULL) +{ + m_settingsManager = new CSettingsManager(); +} + +CGUIDialogSettingsManualBase::~CGUIDialogSettingsManualBase() +{ + m_settingsManager->Clear(); + m_section = NULL; + delete m_settingsManager; +} + +void CGUIDialogSettingsManualBase::OnOkay() +{ + Save(); + + CGUIDialogSettingsBase::OnOkay(); +} + +void CGUIDialogSettingsManualBase::SetupView() +{ + InitializeSettings(); + + // add the created setting section to the settings manager and mark it as ready + m_settingsManager->AddSection(m_section); + m_settingsManager->SetInitialized(); + m_settingsManager->SetLoaded(); + + CGUIDialogSettingsBase::SetupView(); +} + +void CGUIDialogSettingsManualBase::InitializeSettings() +{ + m_settingsManager->Clear(); + m_section = NULL; + + // create a new section + m_section = new CSettingSection(GetProperty("xmlfile").asString(), m_settingsManager); +} + +CSettingCategory* CGUIDialogSettingsManualBase::AddCategory(const std::string &id, int label, int help /* = -1 */) +{ + if (id.empty()) + return NULL; + + CSettingCategory *category = new CSettingCategory(id, m_settingsManager); + if (category == NULL) + return NULL; + + category->SetLabel(label); + if (help >= 0) + category->SetHelp(help); + + m_section->AddCategory(category); + return category; +} + +CSettingGroup* CGUIDialogSettingsManualBase::AddGroup(CSettingCategory *category) +{ + if (category == NULL) + return NULL; + + size_t groups = category->GetGroups().size(); + + CSettingGroup *group = new CSettingGroup(StringUtils::Format("%zu", groups + 1), m_settingsManager); + if (group == NULL) + return NULL; + + category->AddGroup(group); + return group; +} + +CSettingBool* CGUIDialogSettingsManualBase::AddToggle(CSettingGroup *group, const std::string &id, int label, int level, bool value, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingBool *setting = new CSettingBool(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetCheckmarkControl(delayed)); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddEdit(CSettingGroup *group, const std::string &id, int label, int level, int value, + int minimum /* = 0 */, int step /* = 1 */, int maximum /* = 0 */, bool verifyNewValue /* = false */, + int heading /* = -1 */, bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, minimum, step, maximum, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetEditControl("integer", delayed, false, verifyNewValue, heading)); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingNumber* CGUIDialogSettingsManualBase::AddEdit(CSettingGroup *group, const std::string &id, int label, int level, float value, + float minimum /* = 0.0f */, float step /* = 1.0f */, float maximum /* = 0.0f */, + bool verifyNewValue /* = false */, int heading /* = -1 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingNumber *setting = new CSettingNumber(id, label, value, minimum, step, maximum, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetEditControl("number", delayed, false, verifyNewValue, heading)); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingString* CGUIDialogSettingsManualBase::AddEdit(CSettingGroup *group, const std::string &id, int label, int level, std::string value, + bool allowEmpty /* = false */, bool hidden /* = false */, + int heading /* = -1 */, bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingString *setting = new CSettingString(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetEditControl("string", delayed, hidden, false, heading)); + setting->SetAllowEmpty(allowEmpty); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingString* CGUIDialogSettingsManualBase::AddIp(CSettingGroup *group, const std::string &id, int label, int level, std::string value, + bool allowEmpty /* = false */, int heading /* = -1 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingString *setting = new CSettingString(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetEditControl("ip", delayed, false, false, heading)); + setting->SetAllowEmpty(allowEmpty); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingString* CGUIDialogSettingsManualBase::AddPasswordMd5(CSettingGroup *group, const std::string &id, int label, int level, std::string value, + bool allowEmpty /* = false */, int heading /* = -1 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingString *setting = new CSettingString(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetEditControl("md5", delayed, false, false, heading)); + setting->SetAllowEmpty(allowEmpty); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingAction* CGUIDialogSettingsManualBase::AddButton(CSettingGroup *group, const std::string &id, int label, int level, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingAction *setting = new CSettingAction(id, label, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetButtonControl("action", delayed)); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingAddon* CGUIDialogSettingsManualBase::AddAddon(CSettingGroup *group, const std::string &id, int label, int level, std::string value, ADDON::TYPE addonType, + bool allowEmpty /* = false */, int heading /* = -1 */, bool hideValue /* = false */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingAddon *setting = new CSettingAddon(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetButtonControl("addon", delayed, heading, hideValue)); + setting->SetAddonType(addonType); + setting->SetAllowEmpty(allowEmpty); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingPath* CGUIDialogSettingsManualBase::AddPath(CSettingGroup *group, const std::string &id, int label, int level, std::string value, bool writable /* = true */, + const std::vector<std::string> &sources /* = std::vector<std::string>() */, bool allowEmpty /* = false */, + int heading /* = -1 */, bool hideValue /* = false */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingPath *setting = new CSettingPath(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetButtonControl("path", delayed, heading, hideValue)); + setting->SetWritable(writable); + setting->SetSources(sources); + setting->SetAllowEmpty(allowEmpty); + setting->SetAllowEmpty(allowEmpty); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingString* CGUIDialogSettingsManualBase::AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, std::string value, + StringSettingOptionsFiller filler, bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || filler == NULL || + GetSetting(id) != NULL) + return NULL; + + CSettingString *setting = new CSettingString(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSpinnerControl("string", delayed)); + setting->SetOptionsFiller(filler, this); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, int minimum, int step, int maximum, + int formatLabel /* = -1 */, int minimumLabel /* = -1 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSpinnerControl("string", delayed, minimumLabel, formatLabel)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, int minimum, int step, int maximum, + const std::string &formatString, int minimumLabel /* = -1 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSpinnerControl("string", delayed, minimumLabel, -1, formatString)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, const StaticIntegerSettingOptions &entries, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || entries.empty() || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSpinnerControl("string", delayed)); + setting->SetOptions(entries); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, IntegerSettingOptionsFiller filler, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || filler == NULL || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSpinnerControl("string", delayed)); + setting->SetOptionsFiller(filler, this); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingNumber* CGUIDialogSettingsManualBase::AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, float value, float minimum, float step, float maximum, + int formatLabel /* = -1 */, int minimumLabel /* = -1 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingNumber *setting = new CSettingNumber(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSpinnerControl("number", delayed, minimumLabel, formatLabel)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingNumber* CGUIDialogSettingsManualBase::AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, float value, float minimum, float step, float maximum, + const std::string &formatString, int minimumLabel /* = -1 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingNumber *setting = new CSettingNumber(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSpinnerControl("number", delayed, minimumLabel, -1, formatString)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingString* CGUIDialogSettingsManualBase::AddList(CSettingGroup *group, const std::string &id, int label, int level, std::string value, + StringSettingOptionsFiller filler, int heading, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || filler == NULL || + GetSetting(id) != NULL) + return NULL; + + CSettingString *setting = new CSettingString(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetListControl("string", false, heading, false)); + setting->SetOptionsFiller(filler, this); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddList(CSettingGroup *group, const std::string &id, int label, int level, int value, const StaticIntegerSettingOptions &entries, + int heading, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || entries.empty() || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetListControl("integer", false, heading, false)); + setting->SetOptions(entries); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddList(CSettingGroup *group, const std::string &id, int label, int level, int value, IntegerSettingOptionsFiller filler, + int heading, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || filler == NULL || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetListControl("integer", false, heading, false)); + setting->SetOptionsFiller(filler, this); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingList* CGUIDialogSettingsManualBase::AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector<std::string> values, + StringSettingOptionsFiller filler, int heading, int minimumItems /* = 0 */, int maximumItems /* = -1 */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || filler == NULL || + GetSetting(id) != NULL) + return NULL; + + CSettingString *settingDefinition = new CSettingString(id, m_settingsManager); + if (settingDefinition == NULL) + return NULL; + + settingDefinition->SetOptionsFiller(filler, this); + + CSettingList *setting = new CSettingList(id, settingDefinition, label, m_settingsManager); + if (setting == NULL) + { + delete settingDefinition; + return NULL; + } + + std::vector<CVariant> valueList; + for (std::vector<std::string>::const_iterator itValue = values.begin(); itValue != values.end(); ++itValue) + valueList.push_back(CVariant(*itValue)); + SettingPtrList settingValues; + if (!CSettingUtils::ValuesToList(setting, valueList, settingValues)) + { + delete settingDefinition; + delete setting; + return NULL; + } + // setting the default will also set the actual value on an unchanged setting + setting->SetDefault(settingValues); + + setting->SetControl(GetListControl("string", false, heading, true)); + setting->SetMinimumItems(minimumItems); + setting->SetMaximumItems(maximumItems); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingList* CGUIDialogSettingsManualBase::AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector<int> values, + const StaticIntegerSettingOptions &entries, int heading, int minimumItems /* = 0 */, int maximumItems /* = -1 */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || entries.empty() || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *settingDefinition = new CSettingInt(id, m_settingsManager); + if (settingDefinition == NULL) + return NULL; + + settingDefinition->SetOptions(entries); + + CSettingList *setting = new CSettingList(id, settingDefinition, label, m_settingsManager); + if (setting == NULL) + { + delete settingDefinition; + return NULL; + } + + std::vector<CVariant> valueList; + for (std::vector<int>::const_iterator itValue = values.begin(); itValue != values.end(); ++itValue) + valueList.push_back(CVariant(*itValue)); + SettingPtrList settingValues; + if (!CSettingUtils::ValuesToList(setting, valueList, settingValues)) + { + delete settingDefinition; + delete setting; + return NULL; + } + // setting the default will also set the actual value on an unchanged setting + setting->SetDefault(settingValues); + + setting->SetControl(GetListControl("integer", false, heading, true)); + setting->SetMinimumItems(minimumItems); + setting->SetMaximumItems(maximumItems); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingList* CGUIDialogSettingsManualBase::AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector<int> values, + IntegerSettingOptionsFiller filler, int heading, int minimumItems /* = 0 */, int maximumItems /* = -1 */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || filler == NULL || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *settingDefinition = new CSettingInt(id, m_settingsManager); + if (settingDefinition == NULL) + return NULL; + + settingDefinition->SetOptionsFiller(filler, this); + + CSettingList *setting = new CSettingList(id, settingDefinition, label, m_settingsManager); + if (setting == NULL) + { + delete settingDefinition; + return NULL; + } + + std::vector<CVariant> valueList; + for (std::vector<int>::const_iterator itValue = values.begin(); itValue != values.end(); ++itValue) + valueList.push_back(CVariant(*itValue)); + SettingPtrList settingValues; + if (!CSettingUtils::ValuesToList(setting, valueList, settingValues)) + { + delete settingDefinition; + delete setting; + return NULL; + } + // setting the default will also set the actual value on an unchanged setting + setting->SetDefault(settingValues); + + setting->SetControl(GetListControl("integer", false, heading, true)); + setting->SetMinimumItems(minimumItems); + setting->SetMaximumItems(maximumItems); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddPercentageSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, int formatLabel, + int step /* = 1 */, int heading /* = -1 */, bool usePopup /* = false */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSliderControl("percentage", delayed, heading, usePopup, formatLabel)); + setting->SetMinimum(0); + setting->SetStep(step); + setting->SetMaximum(100); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddPercentageSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, const std::string &formatString, + int step /* = 1 */, int heading /* = -1 */, bool usePopup /* = false */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSliderControl("percentage", delayed, heading, usePopup, -1, formatString)); + setting->SetMinimum(0); + setting->SetStep(step); + setting->SetMaximum(100); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, int formatLabel, int minimum, int step, + int maximum, int heading /* = -1 */, bool usePopup /* = false */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSliderControl("integer", delayed, heading, usePopup, formatLabel)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingInt* CGUIDialogSettingsManualBase::AddSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, const std::string &formatString, + int minimum, int step, int maximum, int heading /* = -1 */, bool usePopup /* = false */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *setting = new CSettingInt(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSliderControl("integer", delayed, heading, usePopup, -1, formatString)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingNumber* CGUIDialogSettingsManualBase::AddSlider(CSettingGroup *group, const std::string &id, int label, int level, float value, int formatLabel, float minimum, + float step, float maximum, int heading /* = -1 */, bool usePopup /* = false */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingNumber *setting = new CSettingNumber(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSliderControl("number", delayed, heading, usePopup, formatLabel)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingNumber* CGUIDialogSettingsManualBase::AddSlider(CSettingGroup *group, const std::string &id, int label, int level, float value, const std::string &formatString, + float minimum, float step, float maximum, int heading /* = -1 */, bool usePopup /* = false */, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingNumber *setting = new CSettingNumber(id, label, value, m_settingsManager); + if (setting == NULL) + return NULL; + + setting->SetControl(GetSliderControl("number", delayed, heading, usePopup, -1, formatString)); + setting->SetMinimum(minimum); + setting->SetStep(step); + setting->SetMaximum(maximum); + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingList* CGUIDialogSettingsManualBase::AddPercentageRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, + int valueFormatLabel, int step /* = 1 */, int formatLabel /* = 21469 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, 0, step, 100, "percentage", formatLabel, valueFormatLabel, "", delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddPercentageRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, + const std::string &valueFormatString /* = "%i %%" */, int step /* = 1 */, int formatLabel /* = 21469 */, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, 0, step, 100, "percentage", formatLabel, -1, valueFormatString, delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, + int step, int maximum, int valueFormatLabel, int formatLabel /* = 21469 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "integer", formatLabel, valueFormatLabel, "", delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, + int step, int maximum, const std::string &valueFormatString /* = "%d" */, int formatLabel /* = 21469 */, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "integer", formatLabel, -1, valueFormatString, delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddRange(CSettingGroup *group, const std::string &id, int label, int level, float valueLower, float valueUpper, float minimum, + float step, float maximum, int valueFormatLabel, int formatLabel /* = 21469 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "number", formatLabel, valueFormatLabel, "", delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddRange(CSettingGroup *group, const std::string &id, int label, int level, float valueLower, float valueUpper, float minimum, + float step, float maximum, const std::string &valueFormatString /* = "%.1f" */, int formatLabel /* = 21469 */, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "number", formatLabel, -1, valueFormatString, delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddDateRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, + int step, int maximum, int valueFormatLabel, int formatLabel /* = 21469 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "date", formatLabel, valueFormatLabel, "", delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddDateRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, + int step, int maximum, const std::string &valueFormatString /* = "" */, int formatLabel /* = 21469 */, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "date", formatLabel, -1, valueFormatString, delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddTimeRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, + int step, int maximum, int valueFormatLabel, int formatLabel /* = 21469 */, bool delayed /* = false */, + bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "time", formatLabel, valueFormatLabel, "", delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddTimeRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, + int step, int maximum, const std::string &valueFormatString /* = "mm:ss" */, int formatLabel /* = 21469 */, + bool delayed /* = false */, bool visible /* = true */, int help /* = -1 */) +{ + return AddRange(group, id, label, level, valueLower, valueUpper, minimum, step, maximum, "time", formatLabel, -1, valueFormatString, delayed, visible, help); +} + +CSettingList* CGUIDialogSettingsManualBase::AddRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, + int step, int maximum, const std::string &format, int formatLabel, int valueFormatLabel, + const std::string &valueFormatString, bool delayed, bool visible, int help) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingInt *settingDefinition = new CSettingInt(id, m_settingsManager); + if (settingDefinition == NULL) + return NULL; + + settingDefinition->SetMinimum(minimum); + settingDefinition->SetStep(step); + settingDefinition->SetMaximum(maximum); + + CSettingList *setting = new CSettingList(id, settingDefinition, label, m_settingsManager); + if (setting == NULL) + { + delete settingDefinition; + return NULL; + } + + std::vector<CVariant> valueList; + valueList.push_back(valueLower); + valueList.push_back(valueUpper); + SettingPtrList settingValues; + if (!CSettingUtils::ValuesToList(setting, valueList, settingValues)) + { + delete settingDefinition; + delete setting; + return NULL; + } + // setting the default will also set the actual value on an unchanged setting + setting->SetDefault(settingValues); + + setting->SetControl(GetRangeControl(format, delayed, formatLabel, valueFormatLabel, valueFormatString)); + setting->SetMinimumItems(2); + setting->SetMaximumItems(2); + + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +CSettingList* CGUIDialogSettingsManualBase::AddRange(CSettingGroup *group, const std::string &id, int label, int level, float valueLower, float valueUpper, float minimum, + float step, float maximum, const std::string &format, int formatLabel, int valueFormatLabel, + const std::string &valueFormatString, bool delayed, bool visible, int help) +{ + if (group == NULL || id.empty() || label < 0 || + GetSetting(id) != NULL) + return NULL; + + CSettingNumber *settingDefinition = new CSettingNumber(id, m_settingsManager); + if (settingDefinition == NULL) + return NULL; + + settingDefinition->SetMinimum(minimum); + settingDefinition->SetStep(step); + settingDefinition->SetMaximum(maximum); + + CSettingList *setting = new CSettingList(id, settingDefinition, label, m_settingsManager); + if (setting == NULL) + { + delete settingDefinition; + return NULL; + } + + std::vector<CVariant> valueList; + valueList.push_back(valueLower); + valueList.push_back(valueUpper); + SettingPtrList settingValues; + if (!CSettingUtils::ValuesToList(setting, valueList, settingValues)) + { + delete settingDefinition; + delete setting; + return NULL; + } + // setting the default will also set the actual value on an unchanged setting + setting->SetDefault(settingValues); + + setting->SetControl(GetRangeControl(format, delayed, formatLabel, valueFormatLabel, valueFormatString)); + setting->SetMinimumItems(2); + setting->SetMaximumItems(2); + + setSettingDetails(setting, level, visible, help); + + group->AddSetting(setting); + return setting; +} + +void CGUIDialogSettingsManualBase::setSettingDetails(CSetting *setting, int level, bool visible, int help) +{ + if (setting == NULL) + return; + + if (level < 0) + level = SettingLevelBasic; + else if (level > SettingLevelExpert) + level = SettingLevelExpert; + + setting->SetLevel(static_cast<SettingLevel>(level)); + setting->SetVisible(visible); + if (help >= 0) + setting->SetHelp(help); +} + +ISettingControl* CGUIDialogSettingsManualBase::GetCheckmarkControl(bool delayed /* = false */) +{ + CSettingControlCheckmark *control = new CSettingControlCheckmark(); + control->SetDelayed(delayed); + + return control; +} + +ISettingControl* CGUIDialogSettingsManualBase::GetEditControl(const std::string &format, bool delayed /* = false */, bool hidden /* = false */, bool verifyNewValue /* = false */, int heading /* = -1 */) +{ + CSettingControlEdit *control = new CSettingControlEdit(); + if (!control->SetFormat(format)) + { + delete control; + return NULL; + } + + control->SetDelayed(delayed); + control->SetHidden(hidden); + control->SetVerifyNewValue(verifyNewValue); + control->SetHeading(heading); + + return control; +} + +ISettingControl* CGUIDialogSettingsManualBase::GetButtonControl(const std::string &format, bool delayed /* = false */, int heading /* = -1 */, bool hideValue /* = false */) +{ + CSettingControlButton *control = new CSettingControlButton(); + if (!control->SetFormat(format)) + { + delete control; + return NULL; + } + + control->SetDelayed(delayed); + control->SetHeading(heading); + control->SetHideValue(hideValue); + + return control; +} + +ISettingControl* CGUIDialogSettingsManualBase::GetSpinnerControl(const std::string &format, bool delayed /* = false */, int minimumLabel /* = -1 */, int formatLabel /* = -1 */, const std::string &formatString /* = "" */) +{ + CSettingControlSpinner *control = new CSettingControlSpinner(); + if (!control->SetFormat(format)) + { + delete control; + return NULL; + } + + control->SetDelayed(delayed); + if (formatLabel >= 0) + control->SetFormatLabel(formatLabel); + if (!formatString.empty()) + control->SetFormatString(formatString); + if (minimumLabel >= 0) + control->SetMinimumLabel(minimumLabel); + + return control; +} + +ISettingControl* CGUIDialogSettingsManualBase::GetListControl(const std::string &format, bool delayed /* = false */, int heading /* = -1 */, bool multiselect /* = false */) +{ + CSettingControlList *control = new CSettingControlList(); + if (!control->SetFormat(format)) + { + delete control; + return NULL; + } + + control->SetDelayed(delayed); + control->SetHeading(heading); + control->SetMultiSelect(multiselect); + + return control; +} + +ISettingControl* CGUIDialogSettingsManualBase::GetSliderControl(const std::string &format, bool delayed /* = false */, int heading /* = -1 */, bool usePopup /* = false */, + int formatLabel /* = -1 */, const std::string &formatString /* = "" */) +{ + CSettingControlSlider *control = new CSettingControlSlider(); + if (!control->SetFormat(format)) + { + delete control; + return NULL; + } + + control->SetDelayed(delayed); + if (heading >= 0) + control->SetHeading(heading); + control->SetPopup(usePopup); + if (formatLabel >= 0) + control->SetFormatLabel(formatLabel); + if (!formatString.empty()) + control->SetFormatString(formatString); + + return control; +} + +ISettingControl* CGUIDialogSettingsManualBase::GetRangeControl(const std::string &format, bool delayed /* = false */, int formatLabel /* = -1 */, + int valueFormatLabel /* = -1 */, const std::string &valueFormatString /* = "" */) +{ + CSettingControlRange *control = new CSettingControlRange(); + if (!control->SetFormat(format)) + { + delete control; + return NULL; + } + + control->SetDelayed(delayed); + if (formatLabel >= 0) + control->SetFormatLabel(formatLabel); + if (valueFormatLabel >= 0) + control->SetValueFormatLabel(valueFormatLabel); + if (!valueFormatString.empty()) + control->SetValueFormat(valueFormatString); + + return control; +} diff --git a/xbmc/settings/dialogs/GUIDialogSettingsManualBase.h b/xbmc/settings/dialogs/GUIDialogSettingsManualBase.h new file mode 100644 index 0000000000..ba9880ba4e --- /dev/null +++ b/xbmc/settings/dialogs/GUIDialogSettingsManualBase.h @@ -0,0 +1,163 @@ +#pragma once + +/* + * 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 <map> + +#include "addons/IAddon.h" +#include "settings/dialogs/GUIDialogSettingsManagerBase.h" +#include "settings/lib/SettingDefinitions.h" + +class CSetting; +class CSettingAction; +class CSettingAddon; +class CSettingBool; +class CSettingCategory; +class CSettingGroup; +class CSettingInt; +class CSettingList; +class CSettingNumber; +class CSettingPath; +class CSettingSection; +class CSettingString; + +class CGUIDialogSettingsManualBase : public CGUIDialogSettingsManagerBase +{ +public: + CGUIDialogSettingsManualBase(int windowId, const std::string &xmlFile); + virtual ~CGUIDialogSettingsManualBase(); + +protected: + // implementation of CGUIDialogSettingsBase + virtual CSettingSection* GetSection() { return m_section; } + virtual void OnOkay(); + virtual void SetupView(); + + virtual void InitializeSettings(); + + CSettingCategory* AddCategory(const std::string &id, int label, int help = -1); + CSettingGroup* AddGroup(CSettingCategory *category); + // checkmark control + CSettingBool* AddToggle(CSettingGroup *group, const std::string &id, int label, int level, bool value, bool delayed = false, bool visible = true, int help = -1); + // edit controls + CSettingInt* AddEdit(CSettingGroup *group, const std::string &id, int label, int level, int value, int minimum = 0, int step = 1, int maximum = 0, + bool verifyNewValue = false, int heading = -1, bool delayed = false, bool visible = true, int help = -1); + CSettingNumber* AddEdit(CSettingGroup *group, const std::string &id, int label, int level, float value, float minimum = 0.0f, float step = 1.0f, float maximum = 0.0f, + bool verifyNewValue = false, int heading = -1, bool delayed = false, bool visible = true, int help = -1); + CSettingString* AddEdit(CSettingGroup *group, const std::string &id, int label, int level, std::string value, bool allowEmpty = false, + bool hidden = false, int heading = -1, bool delayed = false, bool visible = true, int help = -1); + CSettingString* AddIp(CSettingGroup *group, const std::string &id, int label, int level, std::string value, bool allowEmpty = false, + int heading = -1, bool delayed = false, bool visible = true, int help = -1); + CSettingString* AddPasswordMd5(CSettingGroup *group, const std::string &id, int label, int level, std::string value, bool allowEmpty = false, + int heading = -1, bool delayed = false, bool visible = true, int help = -1); + // button controls + CSettingAction* AddButton(CSettingGroup *group, const std::string &id, int label, int level, bool delayed = false, bool visible = true, int help = -1); + CSettingAddon* AddAddon(CSettingGroup *group, const std::string &id, int label, int level, std::string value, ADDON::TYPE addonType, + bool allowEmpty = false, int heading = -1, bool hideValue = false, bool delayed = false, bool visible = true, int help = -1); + CSettingPath* AddPath(CSettingGroup *group, const std::string &id, int label, int level, std::string value, bool writable = true, + const std::vector<std::string> &sources = std::vector<std::string>(), bool allowEmpty = false, int heading = -1, bool hideValue = false, + bool delayed = false, bool visible = true, int help = -1); + + // spinner controls + CSettingString* AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, std::string value, StringSettingOptionsFiller filler, + bool delayed = false, bool visible = true, int help = -1); + CSettingInt* AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, int minimum, int step, int maximum, int formatLabel = -1, + int minimumLabel = -1, bool delayed = false, bool visible = true, int help = -1); + CSettingInt* AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, int minimum, int step, int maximum, const std::string &formatString, + int minimumLabel = -1, bool delayed = false, bool visible = true, int help = -1); + CSettingInt* AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, const StaticIntegerSettingOptions &entries, + bool delayed = false, bool visible = true, int help = -1); + CSettingInt* AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, int value, IntegerSettingOptionsFiller filler, + bool delayed = false, bool visible = true, int help = -1); + CSettingNumber* AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, float value, float minimum, float step, float maximum, + int formatLabel = -1, int minimumLabel = -1, bool delayed = false, bool visible = true, int help = -1); + CSettingNumber* AddSpinner(CSettingGroup *group, const std::string &id, int label, int level, float value, float minimum, float step, float maximum, + const std::string &formatString, int minimumLabel = -1, bool delayed = false, bool visible = true, int help = -1); + + // list controls + CSettingString* AddList(CSettingGroup *group, const std::string &id, int label, int level, std::string value, StringSettingOptionsFiller filler, + int heading, bool visible = true, int help = -1); + CSettingInt* AddList(CSettingGroup *group, const std::string &id, int label, int level, int value, const StaticIntegerSettingOptions &entries, + int heading, bool visible = true, int help = -1); + CSettingInt* AddList(CSettingGroup *group, const std::string &id, int label, int level, int value, IntegerSettingOptionsFiller filler, + int heading, bool visible = true, int help = -1); + CSettingList* AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector<std::string> values, StringSettingOptionsFiller filler, + int heading, int minimumItems = 0, int maximumItems = -1, bool visible = true, int help = -1); + CSettingList* AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector<int> values, const StaticIntegerSettingOptions &entries, + int heading, int minimumItems = 0, int maximumItems = -1, bool visible = true, int help = -1); + CSettingList* AddList(CSettingGroup *group, const std::string &id, int label, int level, std::vector<int> values, IntegerSettingOptionsFiller filler, + int heading, int minimumItems = 0, int maximumItems = -1, bool visible = true, int help = -1); + + // slider controls + CSettingInt* AddPercentageSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, int formatLabel, int step = 1, int heading = -1, + bool usePopup = false, bool delayed = false, bool visible = true, int help = -1); + CSettingInt* AddPercentageSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, const std::string &formatString, int step = 1, + int heading = -1, bool usePopup = false, bool delayed = false, bool visible = true, int help = -1); + CSettingInt* AddSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, int formatLabel, int minimum, int step, int maximum, + int heading = -1, bool usePopup = false, bool delayed = false, bool visible = true, int help = -1); + CSettingInt* AddSlider(CSettingGroup *group, const std::string &id, int label, int level, int value, const std::string &formatString, int minimum, int step, int maximum, + int heading = -1, bool usePopup = false, bool delayed = false, bool visible = true, int help = -1); + CSettingNumber* AddSlider(CSettingGroup *group, const std::string &id, int label, int level, float value, int formatLabel, float minimum, float step, float maximum, + int heading = -1, bool usePopup = false, bool delayed = false, bool visible = true, int help = -1); + CSettingNumber* AddSlider(CSettingGroup *group, const std::string &id, int label, int level, float value, const std::string &formatString, float minimum, float step, + float maximum, int heading = -1, bool usePopup = false, bool delayed = false, bool visible = true, int help = -1); + + // range controls + CSettingList* AddPercentageRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int valueFormatLabel, int step = 1, + int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddPercentageRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, + const std::string &valueFormatString = "%i %%", int step = 1, int formatLabel = 21469, + bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, int step, int maximum, + int valueFormatLabel, int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, int step, int maximum, + const std::string &valueFormatString = "%d", int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddRange(CSettingGroup *group, const std::string &id, int label, int level, float valueLower, float valueUpper, float minimum, float step, float maximum, + int valueFormatLabel, int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddRange(CSettingGroup *group, const std::string &id, int label, int level, float valueLower, float valueUpper, float minimum, float step, float maximum, + const std::string &valueFormatString = "%.1f", int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddDateRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, int step, int maximum, + int valueFormatLabel, int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddDateRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, int step, int maximum, + const std::string &valueFormatString = "", int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddTimeRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, int step, int maximum, + int valueFormatLabel, int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + CSettingList* AddTimeRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, int step, int maximum, + const std::string &valueFormatString = "mm:ss", int formatLabel = 21469, bool delayed = false, bool visible = true, int help = -1); + + ISettingControl* GetCheckmarkControl(bool delayed = false); + ISettingControl* GetEditControl(const std::string &format, bool delayed = false, bool hidden = false, bool verifyNewValue = false, int heading = -1); + ISettingControl* GetButtonControl(const std::string &format, bool delayed = false, int heading = -1, bool hideValue = false); + ISettingControl* GetSpinnerControl(const std::string &format, bool delayed = false, int minimumLabel = -1, int formatLabel = -1, const std::string &formatString = ""); + ISettingControl* GetListControl(const std::string &format, bool delayed = false, int heading = -1, bool multiselect = false); + ISettingControl* GetSliderControl(const std::string &format, bool delayed = false, int heading = -1, bool usePopup = false, int formatLabel = -1, const std::string &formatString = ""); + ISettingControl* GetRangeControl(const std::string &format, bool delayed = false, int formatLabel = -1, int valueFormatLabel = -1, const std::string &valueFormatString = ""); + +private: + CSettingList* AddRange(CSettingGroup *group, const std::string &id, int label, int level, int valueLower, int valueUpper, int minimum, int step, int maximum, + const std::string &format, int formatLabel, int valueFormatLabel, const std::string &valueFormatString, bool delayed, bool visible, int help); + CSettingList* AddRange(CSettingGroup *group, const std::string &id, int label, int level, float valueLower, float valueUpper, float minimum, float step, float maximum, + const std::string &format, int formatLabel, int valueFormatLabel, const std::string &valueFormatString, bool delayed, bool visible, int help); + + void setSettingDetails(CSetting *setting, int level, bool visible, int help); + + CSettingSection *m_section; +}; diff --git a/xbmc/settings/dialogs/Makefile b/xbmc/settings/dialogs/Makefile index 07aa371fd4..4f382e1648 100644 --- a/xbmc/settings/dialogs/Makefile +++ b/xbmc/settings/dialogs/Makefile @@ -1,5 +1,7 @@ SRCS=GUIDialogContentSettings.cpp \ - GUIDialogSettings.cpp \ + GUIDialogSettingsBase.cpp \ + GUIDialogSettingsManagerBase.cpp \ + GUIDialogSettingsManualBase.cpp \ LIB=settings_dialogs.a diff --git a/xbmc/settings/lib/ISettingControl.h b/xbmc/settings/lib/ISettingControl.h index 8ef118f232..bdb5408f59 100644 --- a/xbmc/settings/lib/ISettingControl.h +++ b/xbmc/settings/lib/ISettingControl.h @@ -34,12 +34,12 @@ public: virtual std::string GetType() const = 0; const std::string& GetFormat() const { return m_format; } bool GetDelayed() const { return m_delayed; } + void SetDelayed(bool delayed) { m_delayed = delayed; } virtual bool Deserialize(const TiXmlNode *node, bool update = false); - -protected: virtual bool SetFormat(const std::string &format) { return true; } +protected: bool m_delayed; std::string m_format; }; diff --git a/xbmc/settings/lib/Setting.cpp b/xbmc/settings/lib/Setting.cpp index 9b2896b831..4c959b667b 100644 --- a/xbmc/settings/lib/Setting.cpp +++ b/xbmc/settings/lib/Setting.cpp @@ -32,6 +32,7 @@ CSetting::CSetting(const std::string &id, CSettingsManager *settingsManager /* = : ISetting(id, settingsManager), m_callback(NULL), m_label(-1), m_help(-1), + m_enabled(true), m_level(SettingLevelStandard), m_control(NULL), m_changed(false) @@ -41,6 +42,7 @@ CSetting::CSetting(const std::string &id, const CSetting &setting) : ISetting(id, setting.m_settingsManager), m_callback(NULL), m_label(-1), m_help(-1), + m_enabled(true), m_level(SettingLevelStandard), m_control(NULL), m_changed(false) @@ -147,6 +149,9 @@ bool CSetting::Deserialize(const TiXmlNode *node, bool update /* = false */) bool CSetting::IsEnabled() const { + if (m_dependencies.empty()) + return m_enabled; + bool enabled = true; for (SettingDependencies::const_iterator depIt = m_dependencies.begin(); depIt != m_dependencies.end(); ++depIt) { @@ -163,6 +168,16 @@ bool CSetting::IsEnabled() const return enabled; } +void CSetting::SetEnabled(bool enabled) +{ + if (!m_dependencies.empty() || + m_enabled == enabled) + return; + + m_enabled = enabled; + OnSettingPropertyChanged(this, "enabled"); +} + bool CSetting::IsVisible() const { if (!ISetting::IsVisible()) @@ -254,6 +269,15 @@ CSettingList::CSettingList(const std::string &id, CSetting *settingDefinition, C m_minimumItems(0), m_maximumItems(-1) { } +CSettingList::CSettingList(const std::string &id, CSetting *settingDefinition, int label, CSettingsManager *settingsManager /* = NULL */) + : CSetting(id, settingsManager), + m_definition(settingDefinition), + m_delimiter("|"), + m_minimumItems(0), m_maximumItems(-1) +{ + m_label = label; +} + CSettingList::CSettingList(const std::string &id, const CSettingList &setting) : CSetting(id, setting), m_definition(NULL), @@ -675,19 +699,35 @@ bool CSettingBool::fromString(const std::string &strValue, bool &value) const 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_min(0), m_step(1), m_max(0), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) { } CSettingInt::CSettingInt(const std::string &id, const CSettingInt &setting) - : CSetting(id, setting) + : CSetting(id, setting), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) { copy(setting); } +CSettingInt::CSettingInt(const std::string &id, int label, int value, CSettingsManager *settingsManager /* = NULL */) + : CSetting(id, settingsManager), + m_value(value), m_default(value), + m_min(0), m_step(1), m_max(0), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) +{ + m_label = label; +} + 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_min(minimum), m_step(step), m_max(maximum), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) { m_label = label; } @@ -696,7 +736,9 @@ CSettingInt::CSettingInt(const std::string &id, int label, int value, const Stat : CSetting(id, settingsManager), m_value(value), m_default(value), m_min(0), m_step(1), m_max(0), - m_options(options) + m_options(options), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) { m_label = label; } @@ -731,7 +773,15 @@ bool CSettingInt::Deserialize(const TiXmlNode *node, bool update /* = false */) if (options != NULL && options->FirstChild() != NULL) { if (options->FirstChild()->Type() == TiXmlNode::TINYXML_TEXT) - m_optionsFiller = options->FirstChild()->ValueStr(); + { + m_optionsFillerName = options->FirstChild()->ValueStr(); + if (!m_optionsFillerName.empty()) + { + m_optionsFiller = (IntegerSettingOptionsFiller)m_settingsManager->GetSettingOptionsFiller(this); + if (m_optionsFiller == NULL) + CLog::Log(LOGWARNING, "CSettingInt: unknown options filler \"%s\" of \"%s\"", m_optionsFillerName.c_str(), m_id.c_str()); + } + } else { m_options.clear(); @@ -811,8 +861,8 @@ bool CSettingInt::CheckValidity(int value) const if (!ok) return false; } - else if (m_optionsFiller.empty() && m_min != m_max && - (value < m_min || value > m_max)) + else if (m_optionsFillerName.empty() && m_optionsFiller == NULL && + m_min != m_max && (value < m_min || value > m_max)) return false; return true; @@ -862,7 +912,7 @@ SettingOptionsType CSettingInt::GetOptionsType() const CSharedLock lock(m_critical); if (!m_options.empty()) return SettingOptionsTypeStatic; - if (!m_optionsFiller.empty()) + if (!m_optionsFillerName.empty() || m_optionsFiller != NULL) return SettingOptionsTypeDynamic; return SettingOptionsTypeNone; @@ -872,15 +922,19 @@ DynamicIntegerSettingOptions CSettingInt::UpdateDynamicOptions() { CExclusiveLock lock(m_critical); DynamicIntegerSettingOptions options; - if (m_optionsFiller.empty() || m_settingsManager == NULL) + if (m_optionsFiller == NULL && + (m_optionsFillerName.empty() || m_settingsManager == NULL)) return options; - IntegerSettingOptionsFiller filler = (IntegerSettingOptionsFiller)m_settingsManager->GetSettingOptionsFiller(this); - if (filler == NULL) - return options; + if (m_optionsFiller == NULL) + { + m_optionsFiller = (IntegerSettingOptionsFiller)m_settingsManager->GetSettingOptionsFiller(this); + if (m_optionsFiller == NULL) + return options; + } int bestMatchingValue = m_value; - filler(this, options, bestMatchingValue); + m_optionsFiller(this, options, bestMatchingValue, m_optionsFillerData); if (bestMatchingValue != m_value) SetValue(bestMatchingValue); @@ -920,7 +974,10 @@ void CSettingInt::copy(const CSettingInt &setting) m_step = setting.m_step; m_max = setting.m_max; m_options = setting.m_options; + m_optionsFillerName = setting.m_optionsFillerName; m_optionsFiller = setting.m_optionsFiller; + m_optionsFillerData = setting.m_optionsFillerData; + m_dynamicOptions = setting.m_dynamicOptions; } bool CSettingInt::fromString(const std::string &strValue, int &value) @@ -948,6 +1005,14 @@ CSettingNumber::CSettingNumber(const std::string &id, const CSettingNumber &sett copy(setting); } +CSettingNumber::CSettingNumber(const std::string &id, int label, float value, CSettingsManager *settingsManager /* = NULL */) + : CSetting(id, settingsManager), + m_value(value), m_default(value), + m_min(0.0), m_step(1.0), m_max(0.0) +{ + m_label = label; +} + CSettingNumber::CSettingNumber(const std::string &id, int label, float value, float minimum, float step, float maximum, CSettingsManager *settingsManager /* = NULL */) : CSetting(id, settingsManager), m_value(value), m_default(value), @@ -1101,11 +1166,15 @@ bool CSettingNumber::fromString(const std::string &strValue, double &value) CSettingString::CSettingString(const std::string &id, CSettingsManager *settingsManager /* = NULL */) : CSetting(id, settingsManager), - m_allowEmpty(false) + m_allowEmpty(false), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) { } CSettingString::CSettingString(const std::string &id, const CSettingString &setting) - : CSetting(id, setting) + : CSetting(id, setting), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) { copy(setting); } @@ -1113,7 +1182,9 @@ CSettingString::CSettingString(const std::string &id, const CSettingString &sett 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_allowEmpty(false), + m_optionsFiller(NULL), + m_optionsFillerData(NULL) { m_label = label; } @@ -1140,7 +1211,15 @@ bool CSettingString::Deserialize(const TiXmlNode *node, bool update /* = false * 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(); + { + m_optionsFillerName = options->FirstChild()->ValueStr(); + if (!m_optionsFillerName.empty()) + { + m_optionsFiller = (StringSettingOptionsFiller)m_settingsManager->GetSettingOptionsFiller(this); + if (m_optionsFiller == NULL) + CLog::Log(LOGWARNING, "CSettingString: unknown options filler \"%s\" of \"%s\"", m_optionsFillerName.c_str(), m_id.c_str()); + } + } } // get the default value @@ -1208,7 +1287,7 @@ void CSettingString::SetDefault(const std::string &value) SettingOptionsType CSettingString::GetOptionsType() const { CSharedLock lock(m_critical); - if (!m_optionsFiller.empty()) + if (!m_optionsFillerName.empty() || m_optionsFiller != NULL) return SettingOptionsTypeDynamic; return SettingOptionsTypeNone; @@ -1218,15 +1297,19 @@ DynamicStringSettingOptions CSettingString::UpdateDynamicOptions() { CExclusiveLock lock(m_critical); DynamicStringSettingOptions options; - if (m_optionsFiller.empty() || m_settingsManager == NULL) + if (m_optionsFiller == NULL && + (m_optionsFillerName.empty() || m_settingsManager == NULL)) return options; - StringSettingOptionsFiller filler = (StringSettingOptionsFiller)m_settingsManager->GetSettingOptionsFiller(this); - if (filler == NULL) - return options; + if (m_optionsFiller == NULL) + { + m_optionsFiller = (StringSettingOptionsFiller)m_settingsManager->GetSettingOptionsFiller(this); + if (m_optionsFiller == NULL) + return options; + } std::string bestMatchingValue = m_value; - filler(this, options, bestMatchingValue); + m_optionsFiller(this, options, bestMatchingValue, m_optionsFillerData); if (bestMatchingValue != m_value) SetValue(bestMatchingValue); @@ -1263,12 +1346,22 @@ void CSettingString::copy(const CSettingString &setting) m_value = setting.m_value; m_default = setting.m_default; m_allowEmpty = setting.m_allowEmpty; + m_optionsFillerName = setting.m_optionsFillerName; + m_optionsFiller = setting.m_optionsFiller; + m_optionsFillerData = setting.m_optionsFillerData; + m_dynamicOptions = setting.m_dynamicOptions; } CSettingAction::CSettingAction(const std::string &id, CSettingsManager *settingsManager /* = NULL */) : CSetting(id, settingsManager) { } +CSettingAction::CSettingAction(const std::string &id, int label, CSettingsManager *settingsManager /* = NULL */) + : CSetting(id, settingsManager) +{ + m_label = label; +} + CSettingAction::CSettingAction(const std::string &id, const CSettingAction &setting) : CSetting(id, setting) { } diff --git a/xbmc/settings/lib/Setting.h b/xbmc/settings/lib/Setting.h index 7bec9b08e2..7f89295904 100644 --- a/xbmc/settings/lib/Setting.h +++ b/xbmc/settings/lib/Setting.h @@ -29,6 +29,7 @@ #include "ISetting.h" #include "ISettingCallback.h" #include "ISettingControl.h" +#include "SettingDefinitions.h" #include "SettingDependency.h" #include "SettingUpdate.h" #include "threads/SharedSection.h" @@ -65,13 +66,6 @@ typedef enum { SettingOptionsTypeDynamic } SettingOptionsType; -typedef std::pair<int, int> StaticIntegerSettingOption; -typedef std::vector<StaticIntegerSettingOption> StaticIntegerSettingOptions; -typedef std::pair<std::string, int> DynamicIntegerSettingOption; -typedef std::vector<DynamicIntegerSettingOption> DynamicIntegerSettingOptions; -typedef std::pair<std::string, std::string> DynamicStringSettingOption; -typedef std::vector<DynamicStringSettingOption> DynamicStringSettingOptions; - /*! \ingroup settings \brief Setting base class containing all the properties which are common to @@ -101,20 +95,26 @@ public: int GetHelp() const { return m_help; } void SetHelp(int help) { m_help = help; } bool IsEnabled() const; + void SetEnabled(bool enabled); bool IsDefault() const { return !m_changed; } const std::string& GetParent() const { return m_parentSetting; } + void SetParent(const std::string& parentSetting) { m_parentSetting = parentSetting; } SettingLevel GetLevel() const { return m_level; } + void SetLevel(SettingLevel level) { m_level = level; } const ISettingControl* GetControl() const { return m_control; } + ISettingControl* GetControl() { return m_control; } void SetControl(ISettingControl* control) { m_control = control; } const SettingDependencies& GetDependencies() const { return m_dependencies; } + void SetDependencies(const SettingDependencies &dependencies) { m_dependencies = dependencies; } const std::set<CSettingUpdate>& GetUpdates() const { return m_updates; } + void SetCallback(ISettingCallback *callback) { m_callback = callback; } + // overrides of ISetting virtual bool IsVisible() const; protected: - friend class CSettingsManager; - + // implementation of ISettingCallback virtual bool OnSettingChanging(const CSetting *setting); virtual void OnSettingChanged(const CSetting *setting); virtual void OnSettingAction(const CSetting *setting); @@ -126,6 +126,7 @@ protected: ISettingCallback *m_callback; int m_label; int m_help; + bool m_enabled; std::string m_parentSetting; SettingLevel m_level; ISettingControl *m_control; @@ -149,6 +150,7 @@ class CSettingList : public CSetting { public: CSettingList(const std::string &id, CSetting *settingDefinition, CSettingsManager *settingsManager = NULL); + CSettingList(const std::string &id, CSetting *settingDefinition, int label, CSettingsManager *settingsManager = NULL); CSettingList(const std::string &id, const CSettingList &setting); virtual ~CSettingList(); @@ -165,10 +167,14 @@ public: int GetElementType() const; const CSetting* GetDefinition() const { return m_definition; } + void SetDefinition(CSetting *definition) { m_definition = definition; } const std::string& GetDelimiter() const { return m_delimiter; } + void SetDelimiter(const std::string &delimiter) { m_delimiter = delimiter; } int GetMinimumItems() const { return m_minimumItems; } + void SetMinimumItems(int minimumItems) { m_minimumItems = minimumItems; } int GetMaximumItems() const { return m_maximumItems; } + void SetMaximumItems(int maximumItems) { m_maximumItems = maximumItems; } bool FromString(const std::vector<std::string> &value); @@ -239,6 +245,7 @@ class CSettingInt : public CSetting 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, 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() { } @@ -261,12 +268,26 @@ public: void SetDefault(int value); int GetMinimum() const { return m_min; } + void SetMinimum(int minimum) { m_min = minimum; } int GetStep() const { return m_step; } + void SetStep(int step) { m_step = step; } int GetMaximum() const { return m_max; } + void SetMaximum(int maximum) { m_max = maximum; } SettingOptionsType GetOptionsType() const; const StaticIntegerSettingOptions& GetOptions() const { return m_options; } - const std::string& GetOptionsFiller() const { return m_optionsFiller; } + void SetOptions(const StaticIntegerSettingOptions &options) { m_options = options; } + const std::string& GetOptionsFillerName() const { return m_optionsFillerName; } + void SetOptionsFillerName(const std::string &optionsFillerName, void *data = NULL) + { + m_optionsFillerName = optionsFillerName; + m_optionsFillerData = data; + } + void SetOptionsFiller(IntegerSettingOptionsFiller optionsFiller, void *data = NULL) + { + m_optionsFiller = optionsFiller; + m_optionsFillerData = data; + } DynamicIntegerSettingOptions UpdateDynamicOptions(); private: @@ -279,7 +300,9 @@ private: int m_step; int m_max; StaticIntegerSettingOptions m_options; - std::string m_optionsFiller; + std::string m_optionsFillerName; + IntegerSettingOptionsFiller m_optionsFiller; + void *m_optionsFillerData; DynamicIntegerSettingOptions m_dynamicOptions; }; @@ -293,6 +316,7 @@ class CSettingNumber : public CSetting public: CSettingNumber(const std::string &id, CSettingsManager *settingsManager = NULL); CSettingNumber(const std::string &id, const CSettingNumber &setting); + CSettingNumber(const std::string &id, int label, float value, CSettingsManager *settingsManager = NULL); CSettingNumber(const std::string &id, int label, float value, float minimum, float step, float maximum, CSettingsManager *settingsManager = NULL); virtual ~CSettingNumber() { } @@ -314,8 +338,11 @@ public: void SetDefault(double value); double GetMinimum() const { return m_min; } + void SetMinimum(double minimum) { m_min = minimum; } double GetStep() const { return m_step; } + void SetStep(double step) { m_step = step; } double GetMaximum() const { return m_max; } + void SetMaximum(double maximum) { m_max = maximum; } private: virtual void copy(const CSettingNumber &setting); @@ -358,9 +385,20 @@ public: virtual void SetDefault(const std::string &value); virtual bool AllowEmpty() const { return m_allowEmpty; } + void SetAllowEmpty(bool allowEmpty) { m_allowEmpty = allowEmpty; } SettingOptionsType GetOptionsType() const; - const std::string& GetOptionsFiller() const { return m_optionsFiller; } + const std::string& GetOptionsFillerName() const { return m_optionsFillerName; } + void SetOptionsFillerName(const std::string &optionsFillerName, void *data = NULL) + { + m_optionsFillerName = optionsFillerName; + m_optionsFillerData = data; + } + void SetOptionsFiller(StringSettingOptionsFiller optionsFiller, void *data = NULL) + { + m_optionsFiller = optionsFiller; + m_optionsFillerData = data; + } DynamicStringSettingOptions UpdateDynamicOptions(); protected: @@ -369,7 +407,9 @@ protected: std::string m_value; std::string m_default; bool m_allowEmpty; - std::string m_optionsFiller; + std::string m_optionsFillerName; + StringSettingOptionsFiller m_optionsFiller; + void *m_optionsFillerData; DynamicStringSettingOptions m_dynamicOptions; }; @@ -386,6 +426,7 @@ class CSettingAction : public CSetting { public: CSettingAction(const std::string &id, CSettingsManager *settingsManager = NULL); + CSettingAction(const std::string &id, int label, CSettingsManager *settingsManager = NULL); CSettingAction(const std::string &id, const CSettingAction &setting); virtual ~CSettingAction() { } diff --git a/xbmc/settings/lib/SettingConditions.cpp b/xbmc/settings/lib/SettingConditions.cpp index 3cd1e0ba93..fd8c823e49 100644 --- a/xbmc/settings/lib/SettingConditions.cpp +++ b/xbmc/settings/lib/SettingConditions.cpp @@ -51,7 +51,7 @@ bool CSettingConditionItem::Check() const if (m_settingsManager == NULL) return false; - return m_settingsManager->GetConditions().Check(m_name, m_value, m_setting) == !m_negated; + return m_settingsManager->GetConditions().Check(m_name, m_value, m_settingsManager->GetSetting(m_setting)) == !m_negated; } bool CSettingConditionCombination::Check() const @@ -112,7 +112,10 @@ void CSettingConditionsManager::AddCondition(const std::string &condition) if (condition.empty()) return; - m_defines.insert(condition); + std::string tmpCondition = condition; + StringUtils::ToLower(tmpCondition); + + m_defines.insert(tmpCondition); } void CSettingConditionsManager::AddCondition(const std::string &identifier, SettingConditionCheck condition) @@ -120,10 +123,13 @@ void CSettingConditionsManager::AddCondition(const std::string &identifier, Sett if (identifier.empty() || condition == NULL) return; - m_conditions.insert(SettingConditionPair(identifier, condition)); + std::string tmpIdentifier = identifier; + StringUtils::ToLower(tmpIdentifier); + + m_conditions.insert(SettingConditionPair(tmpIdentifier, condition)); } -bool CSettingConditionsManager::Check(const std::string &condition, const std::string &value /* = "" */, const std::string &settingId /* = "" */) const +bool CSettingConditionsManager::Check(const std::string &condition, const std::string &value /* = "" */, const CSetting *setting /* = NULL */) const { if (condition.empty()) return false; @@ -144,7 +150,7 @@ bool CSettingConditionsManager::Check(const std::string &condition, const std::s if (conditionIt == m_conditions.end()) return false; - return conditionIt->second(tmpCondition, value, settingId); + return conditionIt->second(tmpCondition, value, setting); } CSettingConditionsManager::CSettingConditionsManager() diff --git a/xbmc/settings/lib/SettingConditions.h b/xbmc/settings/lib/SettingConditions.h index d83a633fd9..8b93f9af11 100644 --- a/xbmc/settings/lib/SettingConditions.h +++ b/xbmc/settings/lib/SettingConditions.h @@ -27,8 +27,9 @@ #include "utils/BooleanLogic.h" class CSettingsManager; +class CSetting; -typedef bool (*SettingConditionCheck)(const std::string &condition, const std::string &value, const std::string &settingId); +typedef bool (*SettingConditionCheck)(const std::string &condition, const std::string &value, const CSetting *setting); class ISettingCondition { @@ -94,7 +95,7 @@ public: void AddCondition(const std::string &condition); void AddCondition(const std::string &identifier, SettingConditionCheck condition); - bool Check(const std::string &condition, const std::string &value = "", const std::string &settingId = "") const; + bool Check(const std::string &condition, const std::string &value = "", const CSetting *setting = NULL) const; private: CSettingConditionsManager(const CSettingConditionsManager&); diff --git a/xbmc/settings/lib/SettingDefinitions.h b/xbmc/settings/lib/SettingDefinitions.h index 1722451c92..d497f04f30 100644 --- a/xbmc/settings/lib/SettingDefinitions.h +++ b/xbmc/settings/lib/SettingDefinitions.h @@ -19,6 +19,9 @@ * */ +#include <string> +#include <vector> + #define SETTING_XML_ROOT "settings" #define SETTING_XML_ELM_SECTION "section" @@ -61,3 +64,14 @@ #define SETTING_XML_ATTR_SETTING "setting" #define SETTING_XML_ATTR_BEFORE "before" #define SETTING_XML_ATTR_AFTER "after" + +typedef std::pair<int, int> StaticIntegerSettingOption; +typedef std::vector<StaticIntegerSettingOption> StaticIntegerSettingOptions; +typedef std::pair<std::string, int> DynamicIntegerSettingOption; +typedef std::vector<DynamicIntegerSettingOption> DynamicIntegerSettingOptions; +typedef std::pair<std::string, std::string> DynamicStringSettingOption; +typedef std::vector<DynamicStringSettingOption> DynamicStringSettingOptions; + +class CSetting; +typedef void (*IntegerSettingOptionsFiller)(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); +typedef void (*StringSettingOptionsFiller)(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, void *data); diff --git a/xbmc/settings/lib/SettingDependency.cpp b/xbmc/settings/lib/SettingDependency.cpp index 363acc26cf..e274e7f947 100644 --- a/xbmc/settings/lib/SettingDependency.cpp +++ b/xbmc/settings/lib/SettingDependency.cpp @@ -28,6 +28,37 @@ #include "utils/StringUtils.h" #include "utils/XBMCTinyXML.h" +CSettingDependencyCondition::CSettingDependencyCondition(CSettingsManager *settingsManager /* = NULL */) + : CSettingConditionItem(settingsManager), + m_target(SettingDependencyTargetNone), + m_operator(SettingDependencyOperatorEquals) +{ } + +CSettingDependencyCondition::CSettingDependencyCondition(const std::string &setting, const std::string &value, + SettingDependencyOperator op, bool negated /* = false */, + CSettingsManager *settingsManager /* = NULL */) + : CSettingConditionItem(settingsManager), + m_target(SettingDependencyTargetSetting), + m_operator(op) +{ + m_setting = m_name = setting; + m_value = value; + m_negated = negated; +} + +CSettingDependencyCondition::CSettingDependencyCondition(const std::string &strProperty, const std::string &value, + const std::string &setting /* = "" */, bool negated /* = false */, + CSettingsManager *settingsManager /* = NULL */) + : CSettingConditionItem(settingsManager), + m_target(SettingDependencyTargetProperty), + m_operator(SettingDependencyOperatorEquals) +{ + m_name = strProperty; + m_value = value; + m_setting = setting; + m_negated = negated; +} + bool CSettingDependencyCondition::Deserialize(const TiXmlNode *node) { if (!CSettingConditionItem::Deserialize(node)) @@ -106,7 +137,17 @@ bool CSettingDependencyCondition::Check() const case SettingDependencyTargetProperty: { - result = m_settingsManager->GetConditions().Check(m_name, m_value, m_setting); + const CSetting *setting = NULL; + if (!m_setting.empty()) + { + setting = m_settingsManager->GetSetting(m_setting); + if (setting == NULL) + { + CLog::Log(LOGWARNING, "CSettingDependencyCondition: unable to check condition on unknown setting \"%s\"", m_setting.c_str()); + return false; + } + } + result = m_settingsManager->GetConditions().Check(m_name, m_value, setting); break; } @@ -202,6 +243,33 @@ bool CSettingDependencyConditionCombination::Deserialize(const TiXmlNode *node) return true; } +CSettingDependencyConditionCombination* CSettingDependencyConditionCombination::Add(CSettingDependencyConditionPtr condition) +{ + if (condition != NULL) + { + m_values.push_back(condition); + + std::string settingId = condition->GetSetting(); + if (!settingId.empty()) + m_settings.insert(settingId); + } + + return this; +} + +CSettingDependencyConditionCombination* CSettingDependencyConditionCombination::Add(CSettingDependencyConditionCombinationPtr operation) +{ + if (operation != NULL) + { + m_operations.push_back(operation); + + const std::set<std::string>& settings = operation->GetSettings(); + m_settings.insert(settings.begin(), settings.end()); + } + + return this; +} + CSettingDependency::CSettingDependency(CSettingsManager *settingsManager /* = NULL */) : CSettingCondition(settingsManager), m_type(SettingDependencyTypeNone) @@ -209,6 +277,13 @@ CSettingDependency::CSettingDependency(CSettingsManager *settingsManager /* = NU m_operation = CBooleanLogicOperationPtr(new CSettingDependencyConditionCombination(m_settingsManager)); } +CSettingDependency::CSettingDependency(SettingDependencyType type, CSettingsManager *settingsManager /* = NULL */) + : CSettingCondition(settingsManager), + m_type(type) +{ + m_operation = CBooleanLogicOperationPtr(new CSettingDependencyConditionCombination(m_settingsManager)); +} + bool CSettingDependency::Deserialize(const TiXmlNode *node) { if (node == NULL) @@ -240,6 +315,26 @@ std::set<std::string> CSettingDependency::GetSettings() const return combination->GetSettings(); } +CSettingDependencyConditionCombinationPtr CSettingDependency::And() +{ + if (m_operation == NULL) + m_operation = CBooleanLogicOperationPtr(new CSettingDependencyConditionCombination(m_settingsManager)); + + m_operation->SetOperation(BooleanLogicOperationAnd); + + return boost::dynamic_pointer_cast<CSettingDependencyConditionCombination>(m_operation); +} + +CSettingDependencyConditionCombinationPtr CSettingDependency::Or() +{ + if (m_operation == NULL) + m_operation = CBooleanLogicOperationPtr(new CSettingDependencyConditionCombination(m_settingsManager)); + + m_operation->SetOperation(BooleanLogicOperationOr); + + return boost::dynamic_pointer_cast<CSettingDependencyConditionCombination>(m_operation); +} + bool CSettingDependency::setType(const std::string &type) { if (StringUtils::EqualsNoCase(type, "enable")) diff --git a/xbmc/settings/lib/SettingDependency.h b/xbmc/settings/lib/SettingDependency.h index 7cf3db184a..5f0d997b33 100644 --- a/xbmc/settings/lib/SettingDependency.h +++ b/xbmc/settings/lib/SettingDependency.h @@ -48,11 +48,13 @@ typedef enum { class CSettingDependencyCondition : public CSettingConditionItem { public: - CSettingDependencyCondition(CSettingsManager *settingsManager = NULL) - : CSettingConditionItem(settingsManager), - m_target(SettingDependencyTargetNone), - m_operator(SettingDependencyOperatorEquals) - { } + explicit CSettingDependencyCondition(CSettingsManager *settingsManager = NULL); + CSettingDependencyCondition(const std::string &setting, const std::string &value, + SettingDependencyOperator op, bool negated = false, + CSettingsManager *settingsManager = NULL); + CSettingDependencyCondition(const std::string &strProperty, const std::string &value, + const std::string &setting = "", bool negated = false, + CSettingsManager *settingsManager = NULL); virtual ~CSettingDependencyCondition() { } virtual bool Deserialize(const TiXmlNode *node); @@ -71,18 +73,31 @@ private: SettingDependencyOperator m_operator; }; +typedef boost::shared_ptr<CSettingDependencyCondition> CSettingDependencyConditionPtr; + +class CSettingDependencyConditionCombination; +typedef boost::shared_ptr<CSettingDependencyConditionCombination> CSettingDependencyConditionCombinationPtr; + class CSettingDependencyConditionCombination : public CSettingConditionCombination { public: - CSettingDependencyConditionCombination(CSettingsManager *settingsManager = NULL) + explicit CSettingDependencyConditionCombination(CSettingsManager *settingsManager = NULL) : CSettingConditionCombination(settingsManager) { } + CSettingDependencyConditionCombination(BooleanLogicOperation op, CSettingsManager *settingsManager = NULL) + : CSettingConditionCombination(settingsManager) + { + SetOperation(op); + } virtual ~CSettingDependencyConditionCombination() { } virtual bool Deserialize(const TiXmlNode *node); const std::set<std::string>& GetSettings() const { return m_settings; } + CSettingDependencyConditionCombination* Add(CSettingDependencyConditionPtr condition); + CSettingDependencyConditionCombination* Add(CSettingDependencyConditionCombinationPtr operation); + private: virtual CBooleanLogicOperation* newOperation() { return new CSettingDependencyConditionCombination(m_settingsManager); } virtual CBooleanLogicValue* newValue() { return new CSettingDependencyCondition(m_settingsManager); } @@ -93,7 +108,8 @@ private: class CSettingDependency : public CSettingCondition { public: - CSettingDependency(CSettingsManager *settingsManager = NULL); + explicit CSettingDependency(CSettingsManager *settingsManager = NULL); + CSettingDependency(SettingDependencyType type, CSettingsManager *settingsManager = NULL); virtual ~CSettingDependency() { } virtual bool Deserialize(const TiXmlNode *node); @@ -101,6 +117,9 @@ public: SettingDependencyType GetType() const { return m_type; } std::set<std::string> GetSettings() const; + CSettingDependencyConditionCombinationPtr And(); + CSettingDependencyConditionCombinationPtr Or(); + private: bool setType(const std::string &type); diff --git a/xbmc/settings/lib/SettingSection.cpp b/xbmc/settings/lib/SettingSection.cpp index 87d85bd745..9d0c45cb98 100644 --- a/xbmc/settings/lib/SettingSection.cpp +++ b/xbmc/settings/lib/SettingSection.cpp @@ -27,34 +27,34 @@ template<class T> void addISetting(const TiXmlNode *node, const T &item, std::vector<T> &items) { - if (node == NULL) - return; - - const TiXmlElement *element = node->ToElement(); - if (element == NULL) - return; - - // 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(SETTING_XML_ATTR_BEFORE); - if (positionId != NULL && strlen(positionId) > 0) - position = 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 (node != NULL) { - for (typename std::vector<T>::iterator it = items.begin(); it != items.end(); ++it) + const TiXmlElement *element = node->ToElement(); + if (element != NULL) { - if (!StringUtils::EqualsNoCase((*it)->GetId(), positionId)) - continue; + // 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(SETTING_XML_ATTR_BEFORE); + if (positionId != NULL && strlen(positionId) > 0) + position = 0; + else if ((positionId = element->Attribute(SETTING_XML_ATTR_AFTER)) != NULL && strlen(positionId) > 0) + position = 1; + + if (positionId != NULL && strlen(positionId) > 0 && position >= 0) + { + for (typename std::vector<T>::iterator it = items.begin(); it != items.end(); ++it) + { + if (!StringUtils::EqualsNoCase((*it)->GetId(), positionId)) + continue; - typename std::vector<T>::iterator positionIt = it; - if (position == 1) - ++positionIt; + typename std::vector<T>::iterator positionIt = it; + if (position == 1) + ++positionIt; - items.insert(positionIt, item); - return; + items.insert(positionIt, item); + return; + } + } } } @@ -140,6 +140,17 @@ SettingList CSettingGroup::GetSettings(SettingLevel level) const return settings; } +void CSettingGroup::AddSetting(CSetting *setting) +{ + addISetting(NULL, setting, m_settings); +} + +void CSettingGroup::AddSettings(const SettingList &settings) +{ + for (SettingList::const_iterator itSetting = settings.begin(); itSetting != settings.end(); ++itSetting) + addISetting(NULL, *itSetting, m_settings); +} + CSettingCategory::CSettingCategory(const std::string &id, CSettingsManager *settingsManager /* = NULL */) : ISetting(id, settingsManager), m_label(-1), m_help(-1), @@ -231,6 +242,17 @@ bool CSettingCategory::CanAccess() const return m_accessCondition.Check(); } +void CSettingCategory::AddGroup(CSettingGroup *group) +{ + addISetting(NULL, group, m_groups); +} + +void CSettingCategory::AddGroups(const SettingGroupList &groups) +{ + for (SettingGroupList::const_iterator itGroup = groups.begin(); itGroup != groups.end(); ++itGroup) + addISetting(NULL, *itGroup, m_groups); +} + CSettingSection::CSettingSection(const std::string &id, CSettingsManager *settingsManager /* = NULL */) : ISetting(id, settingsManager), m_label(-1), m_help(-1) @@ -311,3 +333,14 @@ SettingCategoryList CSettingSection::GetCategories(SettingLevel level) const return categories; } + +void CSettingSection::AddCategory(CSettingCategory *category) +{ + addISetting(NULL, category, m_categories); +} + +void CSettingSection::AddCategories(const SettingCategoryList &categories) +{ + for (SettingCategoryList::const_iterator itCategory = categories.begin(); itCategory != categories.end(); ++itCategory) + addISetting(NULL, *itCategory, m_categories); +} diff --git a/xbmc/settings/lib/SettingSection.h b/xbmc/settings/lib/SettingSection.h index 359e5b8066..fd43743bda 100644 --- a/xbmc/settings/lib/SettingSection.h +++ b/xbmc/settings/lib/SettingSection.h @@ -65,6 +65,9 @@ public: */ SettingList GetSettings(SettingLevel level) const; + void AddSetting(CSetting *setting); + void AddSettings(const SettingList &settings); + private: SettingList m_settings; }; @@ -140,6 +143,9 @@ public: */ bool CanAccess() const; + void AddGroup(CSettingGroup *group); + void AddGroups(const SettingGroupList &groups); + private: int m_label; int m_help; @@ -211,6 +217,9 @@ public: */ SettingCategoryList GetCategories(SettingLevel level) const; + void AddCategory(CSettingCategory *category); + void AddCategories(const SettingCategoryList &categories); + private: int m_label; int m_help; diff --git a/xbmc/settings/lib/SettingsManager.cpp b/xbmc/settings/lib/SettingsManager.cpp index 80dab436f9..1c383677e1 100644 --- a/xbmc/settings/lib/SettingsManager.cpp +++ b/xbmc/settings/lib/SettingsManager.cpp @@ -71,40 +71,7 @@ bool CSettingsManager::Initialize(const TiXmlElement *root) section = itSection->second; if (section->Deserialize(sectionNode, update)) - { - section->CheckRequirements(); - if (!update) - m_sections[section->GetId()] = section; - - // get all settings and add them to the settings map - for (SettingCategoryList::const_iterator categoryIt = section->GetCategories().begin(); categoryIt != section->GetCategories().end(); ++categoryIt) - { - (*categoryIt)->CheckRequirements(); - for (SettingGroupList::const_iterator groupIt = (*categoryIt)->GetGroups().begin(); groupIt != (*categoryIt)->GetGroups().end(); ++groupIt) - { - (*groupIt)->CheckRequirements(); - for (SettingList::const_iterator settingIt = (*groupIt)->GetSettings().begin(); settingIt != (*groupIt)->GetSettings().end(); ++settingIt) - { - (*settingIt)->CheckRequirements(); - - const std::string &settingId = (*settingIt)->GetId(); - SettingMap::iterator setting = m_settings.find(settingId); - if (setting == m_settings.end()) - { - Setting tmpSetting = { NULL }; - std::pair<SettingMap::iterator, bool> tmpIt = m_settings.insert(make_pair(settingId, tmpSetting)); - setting = tmpIt.first; - } - - if (setting->second.setting == NULL) - { - setting->second.setting = *settingIt; - (*settingIt)->m_callback = this; - } - } - } - } - } + AddSection(section); else { CLog::Log(LOGWARNING, "CSettingsManager: unable to read section \"%s\"", sectionId.c_str()); @@ -116,38 +83,6 @@ bool CSettingsManager::Initialize(const TiXmlElement *root) sectionNode = sectionNode->NextSibling(SETTING_XML_ELM_SECTION); } - for (SettingMap::iterator itSettingDep = m_settings.begin(); itSettingDep != m_settings.end(); ++itSettingDep) - { - if (itSettingDep->second.setting == NULL) - continue; - - const SettingDependencies& deps = itSettingDep->second.setting->GetDependencies(); - for (SettingDependencies::const_iterator depIt = deps.begin(); depIt != deps.end(); ++depIt) - { - std::set<std::string> settingIds = depIt->GetSettings(); - for (std::set<std::string>::const_iterator itSettingId = settingIds.begin(); itSettingId != settingIds.end(); ++itSettingId) - { - SettingMap::iterator setting = m_settings.find(*itSettingId); - if (setting == m_settings.end()) - continue; - - bool newDep = true; - SettingDependencies &settingDeps = setting->second.dependencies[itSettingDep->first]; - for (SettingDependencies::const_iterator itDeps = settingDeps.begin(); itDeps != settingDeps.end(); ++itDeps) - { - if (itDeps->GetType() == depIt->GetType()) - { - newDep = false; - break; - } - } - - if (newDep) - settingDeps.push_back(*depIt); - } - } - } - return true; } @@ -265,6 +200,77 @@ void CSettingsManager::SetInitialized() if (tmpIterator->second.setting == NULL) m_settings.erase(tmpIterator); } + + // figure out all the dependencies between settings + for (SettingMap::iterator itSettingDep = m_settings.begin(); itSettingDep != m_settings.end(); ++itSettingDep) + { + if (itSettingDep->second.setting == NULL) + continue; + + const SettingDependencies& deps = itSettingDep->second.setting->GetDependencies(); + for (SettingDependencies::const_iterator depIt = deps.begin(); depIt != deps.end(); ++depIt) + { + std::set<std::string> settingIds = depIt->GetSettings(); + for (std::set<std::string>::const_iterator itSettingId = settingIds.begin(); itSettingId != settingIds.end(); ++itSettingId) + { + SettingMap::iterator setting = m_settings.find(*itSettingId); + if (setting == m_settings.end()) + continue; + + bool newDep = true; + SettingDependencies &settingDeps = setting->second.dependencies[itSettingDep->first]; + for (SettingDependencies::const_iterator itDeps = settingDeps.begin(); itDeps != settingDeps.end(); ++itDeps) + { + if (itDeps->GetType() == depIt->GetType()) + { + newDep = false; + break; + } + } + + if (newDep) + settingDeps.push_back(*depIt); + } + } + } +} + +void CSettingsManager::AddSection(CSettingSection *section) +{ + if (section == NULL) + return; + + section->CheckRequirements(); + m_sections[section->GetId()] = section; + + // get all settings and add them to the settings map + for (SettingCategoryList::const_iterator categoryIt = section->GetCategories().begin(); categoryIt != section->GetCategories().end(); ++categoryIt) + { + (*categoryIt)->CheckRequirements(); + for (SettingGroupList::const_iterator groupIt = (*categoryIt)->GetGroups().begin(); groupIt != (*categoryIt)->GetGroups().end(); ++groupIt) + { + (*groupIt)->CheckRequirements(); + for (SettingList::const_iterator settingIt = (*groupIt)->GetSettings().begin(); settingIt != (*groupIt)->GetSettings().end(); ++settingIt) + { + (*settingIt)->CheckRequirements(); + + const std::string &settingId = (*settingIt)->GetId(); + SettingMap::iterator setting = m_settings.find(settingId); + if (setting == m_settings.end()) + { + Setting tmpSetting = { NULL }; + std::pair<SettingMap::iterator, bool> tmpIt = m_settings.insert(make_pair(settingId, tmpSetting)); + setting = tmpIt.first; + } + + if (setting->second.setting == NULL) + { + setting->second.setting = *settingIt; + (*settingIt)->SetCallback(this); + } + } + } + } } void CSettingsManager::RegisterCallback(ISettingCallback *callback, const std::set<std::string> &settingList) @@ -392,9 +398,9 @@ void* CSettingsManager::GetSettingOptionsFiller(const CSetting *setting) // get the option filler's identifier std::string filler; if (setting->GetType() == SettingTypeInteger) - filler = ((const CSettingInt*)setting)->GetOptionsFiller(); + filler = ((const CSettingInt*)setting)->GetOptionsFillerName(); else if (setting->GetType() == SettingTypeString) - filler = ((const CSettingString*)setting)->GetOptionsFiller(); + filler = ((const CSettingString*)setting)->GetOptionsFillerName(); if (filler.empty()) return NULL; diff --git a/xbmc/settings/lib/SettingsManager.h b/xbmc/settings/lib/SettingsManager.h index 30a997fcab..57abb6b440 100644 --- a/xbmc/settings/lib/SettingsManager.h +++ b/xbmc/settings/lib/SettingsManager.h @@ -29,7 +29,9 @@ #include "ISettingCreator.h" #include "ISettingsHandler.h" #include "ISubSettings.h" +#include "Setting.h" #include "SettingConditions.h" +#include "SettingDefinitions.h" #include "SettingDependency.h" #include "threads/SharedSection.h" @@ -39,9 +41,6 @@ class CSettingUpdate; class TiXmlElement; class TiXmlNode; -typedef void (*IntegerSettingOptionsFiller)(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t); -typedef void (*StringSettingOptionsFiller)(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t); - /*! \ingroup settings \brief Settings manager responsible for initializing, loading and handling @@ -130,6 +129,8 @@ public: */ void SetLoaded() { m_loaded = true; } + void AddSection(CSettingSection *section); + /*! \brief Registers the given ISettingCallback implementation to be triggered for the given list of settings. diff --git a/xbmc/settings/windows/GUIControlSettings.cpp b/xbmc/settings/windows/GUIControlSettings.cpp index 0fce4b8037..4e83ad18bc 100644 --- a/xbmc/settings/windows/GUIControlSettings.cpp +++ b/xbmc/settings/windows/GUIControlSettings.cpp @@ -28,9 +28,11 @@ #include "dialogs/GUIDialogFileBrowser.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogSelect.h" +#include "dialogs/GUIDialogSlider.h" #include "guilib/GUIEditControl.h" #include "guilib/GUIImage.h" #include "guilib/GUIRadioButtonControl.h" +#include "guilib/GUISettingsSliderControl.h" #include "guilib/GUISpinControlEx.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" @@ -38,6 +40,7 @@ #include "settings/SettingControl.h" #include "settings/SettingPath.h" #include "settings/Settings.h" +#include "settings/SettingUtils.h" #include "settings/MediaSourceSettings.h" #include "settings/lib/Setting.h" #include "storage/MediaManager.h" @@ -46,19 +49,22 @@ using namespace ADDON; CGUIControlBaseSetting::CGUIControlBaseSetting(int id, CSetting *pSetting) -{ - m_id = id; - m_pSetting = pSetting; - m_delayed = false; -} + : m_id(id), + m_pSetting(pSetting), + m_delayed(false), + m_valid(true) +{ } bool CGUIControlBaseSetting::IsEnabled() const { return m_pSetting != NULL && m_pSetting->IsEnabled(); } -void CGUIControlBaseSetting::Update() +void CGUIControlBaseSetting::Update(bool updateDisplayOnly /* = false */) { + if (updateDisplayOnly) + return; + CGUIControl *control = GetControl(); if (control == NULL) return; @@ -66,12 +72,16 @@ void CGUIControlBaseSetting::Update() control->SetEnabled(IsEnabled()); if (m_pSetting) control->SetVisible(m_pSetting->IsVisible()); + SetValid(true); } CGUIControlRadioButtonSetting::CGUIControlRadioButtonSetting(CGUIRadioButtonControl *pRadioButton, int id, CSetting *pSetting) : CGUIControlBaseSetting(id, pSetting) { m_pRadioButton = pRadioButton; + if (m_pRadioButton == NULL) + return; + m_pRadioButton->SetID(id); Update(); } @@ -81,10 +91,11 @@ CGUIControlRadioButtonSetting::~CGUIControlRadioButtonSetting() bool CGUIControlRadioButtonSetting::OnClick() { - return ((CSettingBool *)m_pSetting)->SetValue(!((CSettingBool *)m_pSetting)->GetValue()); + SetValid(((CSettingBool *)m_pSetting)->SetValue(!((CSettingBool *)m_pSetting)->GetValue())); + return IsValid(); } -void CGUIControlRadioButtonSetting::Update() +void CGUIControlRadioButtonSetting::Update(bool updateDisplayOnly /* = false */) { if (m_pRadioButton == NULL) return; @@ -98,6 +109,9 @@ CGUIControlSpinExSetting::CGUIControlSpinExSetting(CGUISpinControlEx *pSpin, int : CGUIControlBaseSetting(id, pSetting) { m_pSpin = pSpin; + if (m_pSpin == NULL) + return; + m_pSpin->SetID(id); FillControl(); @@ -114,25 +128,27 @@ bool CGUIControlSpinExSetting::OnClick() switch (m_pSetting->GetType()) { case SettingTypeInteger: - return ((CSettingInt *)m_pSetting)->SetValue(m_pSpin->GetValue()); + SetValid(((CSettingInt *)m_pSetting)->SetValue(m_pSpin->GetValue())); break; case SettingTypeNumber: - return ((CSettingNumber *)m_pSetting)->SetValue(m_pSpin->GetFloatValue()); + SetValid(((CSettingNumber *)m_pSetting)->SetValue(m_pSpin->GetFloatValue())); + break; case SettingTypeString: - return ((CSettingString *)m_pSetting)->SetValue(m_pSpin->GetStringValue()); + SetValid(((CSettingString *)m_pSetting)->SetValue(m_pSpin->GetStringValue())); + break; default: - break; + return false; } - return false; + return IsValid(); } -void CGUIControlSpinExSetting::Update() +void CGUIControlSpinExSetting::Update(bool updateDisplayOnly /* = false */) { - if (m_pSpin == NULL) + if (updateDisplayOnly || m_pSpin == NULL) return; CGUIControlBaseSetting::Update(); @@ -146,6 +162,9 @@ void CGUIControlSpinExSetting::Update() void CGUIControlSpinExSetting::FillControl() { + if (m_pSpin == NULL) + return; + m_pSpin->Clear(); const std::string &controlFormat = m_pSetting->GetControl()->GetFormat(); @@ -240,6 +259,9 @@ CGUIControlListSetting::CGUIControlListSetting(CGUIButtonControl *pButton, int i : CGUIControlBaseSetting(id, pSetting) { m_pButton = pButton; + if (m_pButton == NULL) + return; + m_pButton->SetID(id); Update(); } @@ -298,22 +320,24 @@ bool CGUIControlListSetting::OnClick() break; case SettingTypeList: - ret = CSettings::Get().SetList(m_pSetting->GetId(), values); + ret = CSettingUtils::SetList(static_cast<CSettingList*>(m_pSetting), values); break; default: - break; + return false; } if (ret) Update(); + else + SetValid(false); - return ret; + return IsValid(); } -void CGUIControlListSetting::Update() +void CGUIControlListSetting::Update(bool updateDisplayOnly /* = false */) { - if (m_pButton == NULL) + if (updateDisplayOnly || m_pButton == NULL) return; CGUIControlBaseSetting::Update(); @@ -383,7 +407,7 @@ bool CGUIControlListSetting::GetIntegerItems(const CSetting *setting, CFileItemL return false; pSettingInt = static_cast<const CSettingInt*>(settingList->GetDefinition()); - std::vector<CVariant> list = CSettings::Get().GetList(settingList->GetId()); + std::vector<CVariant> list = CSettingUtils::GetList(settingList); for (std::vector<CVariant>::const_iterator itValue = list.begin(); itValue != list.end(); ++itValue) { if (!itValue->isInteger()) @@ -450,7 +474,7 @@ bool CGUIControlListSetting::GetStringItems(const CSetting *setting, CFileItemLi return false; pSettingString = static_cast<const CSettingString*>(settingList->GetDefinition()); - std::vector<CVariant> list = CSettings::Get().GetList(settingList->GetId()); + std::vector<CVariant> list = CSettingUtils::GetList(settingList); for (std::vector<CVariant>::const_iterator itValue = list.begin(); itValue != list.end(); ++itValue) { if (!itValue->isString()) @@ -484,6 +508,9 @@ CGUIControlButtonSetting::CGUIControlButtonSetting(CGUIButtonControl *pButton, i : CGUIControlBaseSetting(id, pSetting) { m_pButton = pButton; + if (m_pButton == NULL) + return; + m_pButton->SetID(id); Update(); } @@ -495,61 +522,123 @@ bool CGUIControlButtonSetting::OnClick() { if (m_pButton == NULL) return false; - - const std::string &controlFormat = m_pSetting->GetControl()->GetFormat(); - if (controlFormat == "addon") + + const ISettingControl *control = m_pSetting->GetControl(); + const std::string &controlType = control->GetType(); + const std::string &controlFormat = control->GetFormat(); + if (controlType == "button") { - // prompt for the addon - CSettingAddon *setting = (CSettingAddon *)m_pSetting; - CStdString addonID = setting->GetValue(); - if (!CGUIWindowAddonBrowser::SelectAddonID(setting->GetAddonType(), addonID, setting->AllowEmpty()) == 1) - return false; + if (controlFormat == "addon") + { + // 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); + SetValid(setting->SetValue(addonID)); + } + else if (controlFormat == "path") + SetValid(GetPath((CSettingPath *)m_pSetting)); + else 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); + SetValid(true); + } } - if (controlFormat == "path") - return GetPath((CSettingPath *)m_pSetting); - if (controlFormat == "action") + else if (controlType == "slider") { - // 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; + float value, min, step, max; + if (m_pSetting->GetType() == SettingTypeInteger) + { + CSettingInt *settingInt = static_cast<CSettingInt*>(m_pSetting); + value = (float)settingInt->GetValue(); + min = (float)settingInt->GetMinimum(); + step = (float)settingInt->GetStep(); + max = (float)settingInt->GetMaximum(); + } + else if (m_pSetting->GetType() == SettingTypeNumber) + { + CSettingNumber *settingNumber = static_cast<CSettingNumber*>(m_pSetting); + value = (float)settingNumber->GetValue(); + min = (float)settingNumber->GetMinimum(); + step = (float)settingNumber->GetStep(); + max = (float)settingNumber->GetMaximum(); + } + else + return false; + + const CSettingControlSlider *sliderControl = static_cast<const CSettingControlSlider*>(control); + CGUIDialogSlider::ShowAndGetInput(g_localizeStrings.Get(sliderControl->GetHeading()), value, min, step, max, this, NULL); + SetValid(true); } - return false; + return IsValid(); } -void CGUIControlButtonSetting::Update() +void CGUIControlButtonSetting::Update(bool updateDisplayOnly /* = false */) { - if (m_pButton == NULL) + if (updateDisplayOnly || m_pButton == NULL) return; CGUIControlBaseSetting::Update(); + + std::string strText; + const ISettingControl *control = m_pSetting->GetControl(); + const std::string &controlType = control->GetType(); + const std::string &controlFormat = control->GetFormat(); - if (m_pSetting->GetType() == SettingTypeString && - !static_cast<const CSettingControlButton*>(m_pSetting->GetControl())->HideValue()) + if (controlType == "button") { - std::string strText = ((CSettingString *)m_pSetting)->GetValue(); - const std::string &controlFormat = m_pSetting->GetControl()->GetFormat(); - if (controlFormat == "addon") + if (m_pSetting->GetType() == SettingTypeString && + !static_cast<const CSettingControlButton*>(control)->HideValue()) { - ADDON::AddonPtr addon; - if (ADDON::CAddonMgr::Get().GetAddon(strText, addon)) - strText = addon->Name(); - if (strText.empty()) - strText = g_localizeStrings.Get(231); // None + std::string strValue = ((CSettingString *)m_pSetting)->GetValue(); + if (controlFormat == "addon") + { + ADDON::AddonPtr addon; + if (ADDON::CAddonMgr::Get().GetAddon(strValue, addon)) + strText = addon->Name(); + if (strText.empty()) + strText = g_localizeStrings.Get(231); // None + } + else if (controlFormat == "path") + { + CStdString shortPath; + if (CUtil::MakeShortenPath(strValue, shortPath, 30)) + strText = shortPath; + } } - else if (controlFormat == "path") + } + else if (controlType == "slider") + { + switch (m_pSetting->GetType()) { - CStdString shortPath; - if (CUtil::MakeShortenPath(strText, shortPath, 30)) - strText = shortPath; - } + case SettingTypeInteger: + { + const CSettingInt *settingInt = static_cast<CSettingInt*>(m_pSetting); + strText = CGUIControlSliderSetting::GetText(static_cast<const CSettingControlSlider*>(m_pSetting->GetControl()), + settingInt->GetValue(), settingInt->GetMinimum(), settingInt->GetStep(), settingInt->GetMaximum()); + break; + } - m_pButton->SetLabel2(strText); + case SettingTypeNumber: + { + const CSettingNumber *settingNumber = static_cast<CSettingNumber*>(m_pSetting); + strText = CGUIControlSliderSetting::GetText(static_cast<const CSettingControlSlider*>(m_pSetting->GetControl()), + settingNumber->GetValue(), settingNumber->GetMinimum(), settingNumber->GetStep(), settingNumber->GetMaximum()); + break; + } + + default: + break; + } } + + m_pButton->SetLabel2(strText); } bool CGUIControlButtonSetting::GetPath(CSettingPath *pathSetting) @@ -577,11 +666,48 @@ bool CGUIControlButtonSetting::GetPath(CSettingPath *pathSetting) return pathSetting->SetValue(path); } +void CGUIControlButtonSetting::OnSliderChange(void *data, CGUISliderControl *slider) +{ + if (slider == NULL) + return; + + std::string strText; + switch (m_pSetting->GetType()) + { + case SettingTypeInteger: + { + CSettingInt *settingInt = static_cast<CSettingInt*>(m_pSetting); + if (settingInt->SetValue(slider->GetIntValue())) + strText = CGUIControlSliderSetting::GetText(static_cast<const CSettingControlSlider*>(m_pSetting->GetControl()), + settingInt->GetValue(), settingInt->GetMinimum(), settingInt->GetStep(), settingInt->GetMaximum()); + break; + } + + case SettingTypeNumber: + { + CSettingNumber *settingNumber = static_cast<CSettingNumber*>(m_pSetting); + if (settingNumber->SetValue(static_cast<double>(slider->GetFloatValue()))) + strText = CGUIControlSliderSetting::GetText(static_cast<const CSettingControlSlider*>(m_pSetting->GetControl()), + settingNumber->GetValue(), settingNumber->GetMinimum(), settingNumber->GetStep(), settingNumber->GetMaximum()); + break; + } + + default: + break; + } + + if (!strText.empty()) + slider->SetTextValue(strText); +} + CGUIControlEditSetting::CGUIControlEditSetting(CGUIEditControl *pEdit, int id, CSetting *pSetting) : CGUIControlBaseSetting(id, pSetting) { const CSettingControlEdit* control = static_cast<const CSettingControlEdit*>(pSetting->GetControl()); m_pEdit = pEdit; + if (m_pEdit == NULL) + return; + m_pEdit->SetID(id); int heading = m_pSetting->GetLabel(); if (control->GetHeading() > 0) @@ -596,7 +722,7 @@ CGUIControlEditSetting::CGUIControlEditSetting(CGUIEditControl *pEdit, int id, C if (control->IsHidden()) inputType = CGUIEditControl::INPUT_TYPE_PASSWORD; } - else if (controlFormat == "integer") + else if (controlFormat == "integer" || controlFormat == "number") { if (control->VerifyNewValue()) inputType = CGUIEditControl::INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW; @@ -626,12 +752,13 @@ bool CGUIControlEditSetting::OnClick() return false; // update our string - return m_pSetting->FromString(m_pEdit->GetLabel2()); + SetValid(m_pSetting->FromString(m_pEdit->GetLabel2())); + return IsValid(); } -void CGUIControlEditSetting::Update() +void CGUIControlEditSetting::Update(bool updateDisplayOnly /* = false */) { - if (m_pEdit == NULL) + if (updateDisplayOnly || m_pEdit == NULL) return; CGUIControlBaseSetting::Update(); @@ -648,13 +775,360 @@ bool CGUIControlEditSetting::InputValidation(const std::string &input, void *dat if (editControl == NULL || editControl->GetSetting() == NULL) return true; - return editControl->GetSetting()->CheckValidity(input); + editControl->SetValid(editControl->GetSetting()->CheckValidity(input)); + return editControl->IsValid(); +} + +CGUIControlSliderSetting::CGUIControlSliderSetting(CGUISettingsSliderControl *pSlider, int id, CSetting *pSetting) + : CGUIControlBaseSetting(id, pSetting) +{ + m_pSlider = pSlider; + if (m_pSlider == NULL) + return; + + m_pSlider->SetID(id); + + switch (m_pSetting->GetType()) + { + case SettingTypeInteger: + { + CSettingInt *settingInt = static_cast<CSettingInt*>(m_pSetting); + if (m_pSetting->GetControl()->GetFormat() == "percentage") + m_pSlider->SetType(SLIDER_CONTROL_TYPE_PERCENTAGE); + else + { + m_pSlider->SetType(SLIDER_CONTROL_TYPE_INT); + m_pSlider->SetRange(settingInt->GetMinimum(), settingInt->GetMaximum()); + } + m_pSlider->SetIntInterval(settingInt->GetStep()); + break; + } + + case SettingTypeNumber: + { + CSettingNumber *settingNumber = static_cast<CSettingNumber*>(m_pSetting); + m_pSlider->SetType(SLIDER_CONTROL_TYPE_FLOAT); + m_pSlider->SetFloatRange((float)settingNumber->GetMinimum(), (float)settingNumber->GetMaximum()); + m_pSlider->SetFloatInterval((float)settingNumber->GetStep()); + break; + } + + default: + break; + } + + Update(); +} + +CGUIControlSliderSetting::~CGUIControlSliderSetting() +{ } + +bool CGUIControlSliderSetting::OnClick() +{ + if (m_pSlider == NULL) + return false; + + switch (m_pSetting->GetType()) + { + case SettingTypeInteger: + SetValid(static_cast<CSettingInt*>(m_pSetting)->SetValue(m_pSlider->GetIntValue())); + break; + + case SettingTypeNumber: + SetValid(static_cast<CSettingNumber*>(m_pSetting)->SetValue(m_pSlider->GetFloatValue())); + break; + + default: + return false; + } + + return IsValid(); +} + +void CGUIControlSliderSetting::Update(bool updateDisplayOnly /* = false */) +{ + if (m_pSlider == NULL) + return; + + CGUIControlBaseSetting::Update(); + + std::string strText; + switch (m_pSetting->GetType()) + { + case SettingTypeInteger: + { + const CSettingInt *settingInt = static_cast<CSettingInt*>(m_pSetting); + int value; + if (updateDisplayOnly) + value = m_pSlider->GetIntValue(); + else + { + value = static_cast<CSettingInt*>(m_pSetting)->GetValue(); + m_pSlider->SetIntValue(value); + } + + strText = CGUIControlSliderSetting::GetText(static_cast<const CSettingControlSlider*>(m_pSetting->GetControl()), + value, settingInt->GetMinimum(), settingInt->GetStep(), settingInt->GetMaximum()); + break; + } + + case SettingTypeNumber: + { + const CSettingNumber *settingNumber = static_cast<CSettingNumber*>(m_pSetting); + double value; + if (updateDisplayOnly) + value = (float)m_pSlider->GetFloatValue(); + else + { + value = static_cast<CSettingNumber*>(m_pSetting)->GetValue(); + m_pSlider->SetFloatValue((float)value); + } + + strText = CGUIControlSliderSetting::GetText(static_cast<const CSettingControlSlider*>(m_pSetting->GetControl()), + value, settingNumber->GetMinimum(), settingNumber->GetStep(), settingNumber->GetMaximum()); + break; + } + + default: + break; + } + + if (!strText.empty()) + m_pSlider->SetTextValue(strText); +} + +std::string CGUIControlSliderSetting::GetText(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum) +{ + if (control == NULL || + !(value.isInteger() || value.isDouble())) + return ""; + + SettingControlSliderFormatter formatter = control->GetFormatter(); + if (formatter != NULL) + return formatter(control, value, minimum, step, maximum); + + std::string formatString = control->GetFormatString(); + if (control->GetFormatLabel() > -1) + formatString = g_localizeStrings.Get(control->GetFormatLabel()); + + if (value.isDouble()) + return StringUtils::Format(formatString.c_str(), value.asDouble()); + + return StringUtils::Format(formatString.c_str(), static_cast<int>(value.asInteger())); +} + +CGUIControlRangeSetting::CGUIControlRangeSetting(CGUISettingsSliderControl *pSlider, int id, CSetting *pSetting) + : CGUIControlBaseSetting(id, pSetting) +{ + m_pSlider = pSlider; + if (m_pSlider == NULL) + return; + + m_pSlider->SetID(id); + m_pSlider->SetRangeSelection(true); + + if (m_pSetting->GetType() == SettingTypeList) + { + CSettingList *settingList = static_cast<CSettingList*>(m_pSetting); + const CSetting *listDefintion = settingList->GetDefinition(); + switch (listDefintion->GetType()) + { + case SettingTypeInteger: + { + const CSettingInt *listDefintionInt = static_cast<const CSettingInt*>(listDefintion); + if (m_pSetting->GetControl()->GetFormat() == "percentage") + m_pSlider->SetType(SLIDER_CONTROL_TYPE_PERCENTAGE); + else + { + m_pSlider->SetType(SLIDER_CONTROL_TYPE_INT); + m_pSlider->SetRange(listDefintionInt->GetMinimum(), listDefintionInt->GetMaximum()); + } + m_pSlider->SetIntInterval(listDefintionInt->GetStep()); + break; + } + + case SettingTypeNumber: + { + const CSettingNumber *listDefinitionNumber = static_cast<const CSettingNumber*>(listDefintion); + m_pSlider->SetType(SLIDER_CONTROL_TYPE_FLOAT); + m_pSlider->SetFloatRange((float)listDefinitionNumber->GetMinimum(), (float)listDefinitionNumber->GetMaximum()); + m_pSlider->SetFloatInterval((float)listDefinitionNumber->GetStep()); + break; + } + + default: + break; + } + } + + Update(); +} + +CGUIControlRangeSetting::~CGUIControlRangeSetting() +{ } + +bool CGUIControlRangeSetting::OnClick() +{ + if (m_pSlider == NULL || + m_pSetting->GetType() != SettingTypeList) + return false; + + CSettingList *settingList = static_cast<CSettingList*>(m_pSetting); + const SettingPtrList &settingListValues = settingList->GetValue(); + SettingPtrList settingListValuesCopy(settingListValues.begin(), settingListValues.end()); + if (settingListValues.size() != 2) + return false; + + std::vector<CVariant> values; + const CSetting *listDefintion = settingList->GetDefinition(); + switch (listDefintion->GetType()) + { + case SettingTypeInteger: + values.push_back(m_pSlider->GetIntValue(CGUISliderControl::RangeSelectorLower)); + values.push_back(m_pSlider->GetIntValue(CGUISliderControl::RangeSelectorUpper)); + break; + + case SettingTypeNumber: + values.push_back(m_pSlider->GetFloatValue(CGUISliderControl::RangeSelectorLower)); + values.push_back(m_pSlider->GetFloatValue(CGUISliderControl::RangeSelectorUpper)); + break; + + default: + return false; + } + + if (values.size() != 2) + return false; + + SetValid(CSettingUtils::SetList(settingList, values)); + return IsValid(); +} + +void CGUIControlRangeSetting::Update(bool updateDisplayOnly /* = false */) +{ + if (m_pSlider == NULL || + m_pSetting->GetType() != SettingTypeList) + return; + + CGUIControlBaseSetting::Update(); + + CSettingList *settingList = static_cast<CSettingList*>(m_pSetting); + const SettingPtrList &settingListValues = settingList->GetValue(); + if (settingListValues.size() != 2) + return; + + const CSetting *listDefintion = settingList->GetDefinition(); + const CSettingControlRange *controlRange = static_cast<const CSettingControlRange*>(m_pSetting->GetControl()); + const std::string &controlFormat = controlRange->GetFormat(); + + std::string strText; + std::string strTextLower, strTextUpper; + std::string formatString = g_localizeStrings.Get(controlRange->GetFormatLabel() > -1 ? controlRange->GetFormatLabel() : 21469); + std::string valueFormat = controlRange->GetValueFormat(); + if (controlRange->GetValueFormatLabel() > -1) + valueFormat = g_localizeStrings.Get(controlRange->GetValueFormatLabel()); + + switch (listDefintion->GetType()) + { + case SettingTypeInteger: + { + int valueLower, valueUpper; + if (updateDisplayOnly) + { + valueLower = m_pSlider->GetIntValue(CGUISliderControl::RangeSelectorLower); + valueUpper = m_pSlider->GetIntValue(CGUISliderControl::RangeSelectorUpper); + } + else + { + valueLower = static_cast<CSettingInt*>(settingListValues[0].get())->GetValue(); + valueUpper = static_cast<CSettingInt*>(settingListValues[1].get())->GetValue(); + m_pSlider->SetIntValue(valueLower, CGUISliderControl::RangeSelectorLower); + m_pSlider->SetIntValue(valueUpper, CGUISliderControl::RangeSelectorUpper); + } + + if (controlFormat == "date" || controlFormat == "time") + { + CDateTime dateLower = (time_t)valueLower; + CDateTime dateUpper = (time_t)valueUpper; + + if (controlFormat == "date") + { + if (valueFormat.empty()) + { + strTextLower = dateLower.GetAsLocalizedDate(); + strTextUpper = dateUpper.GetAsLocalizedDate(); + } + else + { + strTextLower = dateLower.GetAsLocalizedDate(valueFormat); + strTextUpper = dateUpper.GetAsLocalizedDate(valueFormat); + } + } + else + { + if (valueFormat.empty()) + valueFormat = "mm:ss"; + + strTextLower = dateLower.GetAsLocalizedTime(valueFormat); + strTextUpper = dateUpper.GetAsLocalizedTime(valueFormat); + } + } + else + { + strTextLower = StringUtils::Format(valueFormat.c_str(), valueLower); + strTextUpper = StringUtils::Format(valueFormat.c_str(), valueUpper); + } + + if (valueLower != valueUpper) + strText = StringUtils::Format(formatString.c_str(), strTextLower.c_str(), strTextUpper.c_str()); + else + strText = strTextLower; + break; + } + + case SettingTypeNumber: + { + double valueLower, valueUpper; + if (updateDisplayOnly) + { + valueLower = static_cast<double>(m_pSlider->GetFloatValue(CGUISliderControl::RangeSelectorLower)); + valueUpper = static_cast<double>(m_pSlider->GetFloatValue(CGUISliderControl::RangeSelectorUpper)); + } + else + { + valueLower = static_cast<CSettingNumber*>(settingListValues[0].get())->GetValue(); + valueUpper = static_cast<CSettingNumber*>(settingListValues[1].get())->GetValue(); + m_pSlider->SetFloatValue((float)valueLower, CGUISliderControl::RangeSelectorLower); + m_pSlider->SetFloatValue((float)valueUpper, CGUISliderControl::RangeSelectorUpper); + } + + strTextLower = StringUtils::Format(valueFormat.c_str(), valueLower); + if (valueLower != valueUpper) + { + strTextUpper = StringUtils::Format(valueFormat.c_str(), valueUpper); + strText = StringUtils::Format(formatString.c_str(), strTextLower.c_str(), strTextUpper.c_str()); + } + else + strText = strTextLower; + break; + } + + default: + strText.clear(); + break; + } + + if (!strText.empty()) + m_pSlider->SetTextValue(strText); } CGUIControlSeparatorSetting::CGUIControlSeparatorSetting(CGUIImage *pImage, int id) : CGUIControlBaseSetting(id, NULL) { m_pImage = pImage; + if (m_pImage == NULL) + return; + m_pImage->SetID(id); } diff --git a/xbmc/settings/windows/GUIControlSettings.h b/xbmc/settings/windows/GUIControlSettings.h index 80a715493d..28c93c43b4 100644 --- a/xbmc/settings/windows/GUIControlSettings.h +++ b/xbmc/settings/windows/GUIControlSettings.h @@ -20,6 +20,7 @@ */ #include "utils/StdString.h" +#include "guilib/ISliderCallback.h" class CGUIControl; class CGUIImage; @@ -27,8 +28,10 @@ class CGUISpinControlEx; class CGUIEditControl; class CGUIButtonControl; class CGUIRadioButtonControl; +class CGUISettingsSliderControl; class CSetting; +class CSettingControlSlider; class CSettingString; class CSettingPath; @@ -71,14 +74,22 @@ public: */ bool IsEnabled() const; + /*! + \brief Returns whether the setting's value is valid or not + */ + bool IsValid() const { return m_valid; } + + void SetValid(bool valid) { m_valid = valid; } + virtual CGUIControl* GetControl() { return NULL; } virtual bool OnClick() { return false; } - virtual void Update(); + virtual void Update(bool updateDisplayOnly = false); virtual void Clear() = 0; ///< Clears the attached control protected: int m_id; CSetting* m_pSetting; bool m_delayed; + bool m_valid; }; class CGUIControlRadioButtonSetting : public CGUIControlBaseSetting @@ -91,7 +102,7 @@ public: virtual CGUIControl* GetControl() { return (CGUIControl*)m_pRadioButton; } virtual bool OnClick(); - virtual void Update(); + virtual void Update(bool updateDisplayOnly = false); virtual void Clear() { m_pRadioButton = NULL; } private: CGUIRadioButtonControl *m_pRadioButton; @@ -105,7 +116,7 @@ public: virtual CGUIControl* GetControl() { return (CGUIControl*)m_pSpin; } virtual bool OnClick(); - virtual void Update(); + virtual void Update(bool updateDisplayOnly = false); virtual void Clear() { m_pSpin = NULL; } private: void FillControl(); @@ -121,7 +132,7 @@ public: virtual CGUIControl* GetControl() { return (CGUIControl*)m_pButton; } virtual bool OnClick(); - virtual void Update(); + virtual void Update(bool updateDisplayOnly = false); virtual void Clear() { m_pButton = NULL; } private: static bool GetItems(const CSetting *setting, CFileItemList &items); @@ -131,7 +142,7 @@ private: CGUIButtonControl *m_pButton; }; -class CGUIControlButtonSetting : public CGUIControlBaseSetting +class CGUIControlButtonSetting : public CGUIControlBaseSetting, protected ISliderCallback { public: CGUIControlButtonSetting(CGUIButtonControl* pButton, int id, CSetting *pSetting); @@ -139,10 +150,14 @@ public: virtual CGUIControl* GetControl() { return (CGUIControl*)m_pButton; } virtual bool OnClick(); - virtual void Update(); + virtual void Update(bool updateDisplayOnly = false); virtual void Clear() { m_pButton = NULL; } static bool GetPath(CSettingPath *pathSetting); +protected: + // implementations of ISliderCallback + virtual void OnSliderChange(void *data, CGUISliderControl *slider); + private: CGUIButtonControl *m_pButton; }; @@ -155,7 +170,7 @@ public: virtual CGUIControl* GetControl() { return (CGUIControl*)m_pEdit; } virtual bool OnClick(); - virtual void Update(); + virtual void Update(bool updateDisplayOnly = false); virtual void Clear() { m_pEdit = NULL; } private: static bool InputValidation(const std::string &input, void *data); @@ -163,6 +178,38 @@ private: CGUIEditControl *m_pEdit; }; +class CGUIControlSliderSetting : public CGUIControlBaseSetting +{ +public: + CGUIControlSliderSetting(CGUISettingsSliderControl* pSlider, int id, CSetting *pSetting); + virtual ~CGUIControlSliderSetting(); + + virtual CGUIControl* GetControl() { return (CGUIControl*)m_pSlider; } + virtual bool OnClick(); + virtual void Update(bool updateDisplayOnly = false); + virtual void Clear() { m_pSlider = NULL; } + + static std::string GetText(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum); + +private: + CGUISettingsSliderControl *m_pSlider; +}; + +class CGUIControlRangeSetting : public CGUIControlBaseSetting +{ +public: + CGUIControlRangeSetting(CGUISettingsSliderControl* pSlider, int id, CSetting *pSetting); + virtual ~CGUIControlRangeSetting(); + + virtual CGUIControl* GetControl() { return (CGUIControl*)m_pSlider; } + virtual bool OnClick(); + virtual void Update(bool updateDisplayOnly = false); + virtual void Clear() { m_pSlider = NULL; } + +private: + CGUISettingsSliderControl *m_pSlider; +}; + class CGUIControlSeparatorSetting : public CGUIControlBaseSetting { public: diff --git a/xbmc/settings/windows/GUIWindowSettingsCategory.cpp b/xbmc/settings/windows/GUIWindowSettingsCategory.cpp index 11237b2bf5..5f256a25fe 100644 --- a/xbmc/settings/windows/GUIWindowSettingsCategory.cpp +++ b/xbmc/settings/windows/GUIWindowSettingsCategory.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -19,33 +19,16 @@ */ #include "GUIWindowSettingsCategory.h" +#include "GUIPassword.h" #include "GUIUserMessages.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogTextViewer.h" -#include "dialogs/GUIDialogYesNo.h" -#include "guilib/GUIControlGroupList.h" -#include "guilib/GUIEditControl.h" -#include "guilib/GUIImage.h" -#include "guilib/GUIRadioButtonControl.h" -#include "guilib/GUISpinControlEx.h" -#include "guilib/GUIToggleButtonControl.h" -#include "guilib/GUIWindowManager.h" #include "guilib/Key.h" -#include "guilib/LocalizeStrings.h" #include "settings/DisplaySettings.h" #include "settings/Settings.h" -#include "utils/log.h" -#include "utils/StringUtils.h" +#include "settings/lib/SettingSection.h" #include "view/ViewStateSettings.h" -#include "GUIPassword.h" using namespace std; -#if defined(TARGET_WINDOWS) // disable 4355: 'this' used in base member initializer list -#pragma warning(push) -#pragma warning(disable: 4355) -#endif // defined(TARGET_WINDOWS) - #define SETTINGS_PICTURES WINDOW_SETTINGS_MYPICTURES - WINDOW_SETTINGS_START #define SETTINGS_PROGRAMS WINDOW_SETTINGS_MYPROGRAMS - WINDOW_SETTINGS_START #define SETTINGS_WEATHER WINDOW_SETTINGS_MYWEATHER - WINDOW_SETTINGS_START @@ -56,25 +39,8 @@ using namespace std; #define SETTINGS_APPEARANCE WINDOW_SETTINGS_APPEARANCE - WINDOW_SETTINGS_START #define SETTINGS_PVR WINDOW_SETTINGS_MYPVR - WINDOW_SETTINGS_START -#define SETTING_DELAY 1500 - -#define CONTROL_SETTINGS_LABEL 2 -#define CATEGORY_GROUP_ID 3 -#define SETTINGS_GROUP_ID 5 -#define CONTROL_DESCRIPTION 6 -#define CONTROL_DEFAULT_BUTTON 7 -#define CONTROL_DEFAULT_RADIOBUTTON 8 -#define CONTROL_DEFAULT_SPIN 9 -#define CONTROL_DEFAULT_CATEGORY_BUTTON 10 -#define CONTROL_DEFAULT_SEPARATOR 11 -#define CONTROL_DEFAULT_EDIT 12 -#define CONTROL_START_BUTTONS -100 -#define CONTROL_START_CONTROL -80 #define CONTRL_BTN_LEVELS 20 -#define RESET_SETTING_ID "settings.reset" -#define EMPTY_CATEGORY_ID "categories.empty" - typedef struct { int id; string name; @@ -92,24 +58,13 @@ static const SettingGroup s_settingGroupMap[] = { { SETTINGS_PICTURES, "pictu #define SettingGroupSize sizeof(s_settingGroupMap) / sizeof(SettingGroup) -CGUIWindowSettingsCategory::CGUIWindowSettingsCategory(void) - : CGUIWindow(WINDOW_SETTINGS_MYPICTURES, "SettingsCategory.xml"), +CGUIWindowSettingsCategory::CGUIWindowSettingsCategory() + : CGUIDialogSettingsManagerBase(WINDOW_SETTINGS_MYPICTURES, "SettingsCategory.xml"), m_settings(CSettings::Get()), - m_iSetting(0), m_iCategory(0), m_iSection(0), - m_resetSetting(NULL), - m_dummyCategory(NULL), - m_pOriginalSpin(NULL), - m_pOriginalRadioButton(NULL), - m_pOriginalCategoryButton(NULL), - m_pOriginalButton(NULL), - m_pOriginalEdit(NULL), - m_pOriginalImage(NULL), - m_delayedTimer(this), + m_iSection(0), m_returningFromSkinLoad(false) { - m_loadType = KEEP_IN_MEMORY; - - newOriginalEdit = false; + m_settingsManager = m_settings.GetSettingsManager(); // set the correct ID range... m_idRange.clear(); @@ -124,18 +79,8 @@ CGUIWindowSettingsCategory::CGUIWindowSettingsCategory(void) m_idRange.push_back(WINDOW_SETTINGS_MYPVR); } -CGUIWindowSettingsCategory::~CGUIWindowSettingsCategory(void) -{ - FreeControls(); - if (newOriginalEdit) - { - delete m_pOriginalEdit; - m_pOriginalEdit = NULL; - } - - delete m_resetSetting; - delete m_dummyCategory; -} +CGUIWindowSettingsCategory::~CGUIWindowSettingsCategory() +{ } bool CGUIWindowSettingsCategory::OnMessage(CGUIMessage &message) { @@ -143,159 +88,25 @@ bool CGUIWindowSettingsCategory::OnMessage(CGUIMessage &message) { case GUI_MSG_WINDOW_INIT: { - m_delayedSetting.reset(); - if (message.GetParam1() != WINDOW_INVALID && !m_returningFromSkinLoad) - { // coming to this window first time (ie not returning back from some other window) - // so we reset our section and control states - m_iCategory = 0; - ResetControlStates(); - } - - 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); - m_dummyCategory->SetHelp(10047); - - m_iSection = (int)message.GetParam2() - (int)CGUIWindow::GetID(); - CGUIWindow::OnMessage(message); + m_iSection = (int)message.GetParam2() - (int)CGUIDialogSettingsManagerBase::GetID(); + CGUIDialogSettingsManagerBase::OnMessage(message); m_returningFromSkinLoad = false; return true; } - - case GUI_MSG_WINDOW_DEINIT: - { - // cancel any delayed changes - if (m_delayedSetting != NULL) - { - m_delayedTimer.Stop(); - CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), GetID()); - OnMessage(message); - } - - CGUIWindow::OnMessage(message); - FreeControls(); - return true; - } case GUI_MSG_FOCUSED: { - CGUIWindow::OnMessage(message); if (!m_returningFromSkinLoad) - { - int focusedControl = GetFocusedControlID(); - - // cancel any delayed changes if the focused control has changed - if (m_delayedSetting != NULL && m_delayedSetting->GetID() != focusedControl) - { - m_delayedTimer.Stop(); - CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), m_delayedSetting->GetID(), 1); // param1 = 1 for "reset the control if it's invalid" - g_windowManager.SendThreadMessage(message, GetID()); - } - // update the value of the previous setting (in case it was invalid) - else if (m_iSetting >= CONTROL_START_CONTROL && m_iSetting < (int)(CONTROL_START_CONTROL + m_settingControls.size())) - { - CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), m_iSetting, 1); // param1 = 1 for "reset the control if it's invalid" - g_windowManager.SendThreadMessage(message, GetID()); - } - - CVariant description; - - // check if we have changed the category and need to create new setting controls - if (focusedControl >= CONTROL_START_BUTTONS && focusedControl < (int)(CONTROL_START_BUTTONS + m_categories.size())) - { - int categoryIndex = focusedControl - CONTROL_START_BUTTONS; - const CSettingCategory* category = m_categories.at(categoryIndex); - if (categoryIndex != m_iCategory) - { - if (!category->CanAccess()) - { - // unable to go to this category - focus the previous one - SET_CONTROL_FOCUS(CONTROL_START_BUTTONS + m_iCategory, 0); - return false; - } - - m_iCategory = categoryIndex; - CreateSettings(); - } - - description = category->GetHelp(); - } - else if (focusedControl >= CONTROL_START_CONTROL && focusedControl < (int)(CONTROL_START_CONTROL + m_settingControls.size())) - { - m_iSetting = focusedControl; - CSetting *setting = GetSettingControl(focusedControl)->GetSetting(); - if (setting != NULL) - description = setting->GetHelp(); - } - - // set the description of the currently focused category/setting - if (description.isInteger() || - (description.isString() && !description.empty())) - SetDescription(description); - } + CGUIDialogSettingsManagerBase::OnMessage(message); return true; } - case GUI_MSG_CLICKED: - { - BaseSettingControlPtr control = GetSettingControl(message.GetSenderId()); - if (control != NULL) - OnClick(control); - - break; - } - case GUI_MSG_LOAD_SKIN: { if (IsActive()) m_returningFromSkinLoad = true; break; } - - case GUI_MSG_UPDATE_ITEM: - { - if (m_delayedSetting != NULL) - { - // first get the delayed setting and reset its member variable - // to avoid handling the delayed setting twice in case the OnClick() - // performed later causes the window to be deinitialized (e.g. when - // changing the language) - BaseSettingControlPtr delayedSetting = m_delayedSetting; - m_delayedSetting.reset(); - - // if updating the setting fails and param1 has been specifically set - // we need to call OnSettingChanged() to restore a valid value in the - // setting control - if (!delayedSetting->OnClick() && message.GetParam1() != 0) - OnSettingChanged(delayedSetting->GetSetting()); - return true; - } - else if (message.GetControlId() >= CONTROL_START_CONTROL && message.GetControlId() < (int)(CONTROL_START_CONTROL + m_settingControls.size())) - { - BaseSettingControlPtr settingControl = GetSettingControl(message.GetControlId()); - if (settingControl.get() != NULL && settingControl->GetSetting() != NULL) - { - OnSettingChanged(settingControl->GetSetting()); - return true; - } - } - break; - } - - case GUI_MSG_UPDATE: - { - if (IsActive() && HasID(message.GetSenderId())) - { - int focusedControl = GetFocusedControlID(); - CreateSettings(); - SET_CONTROL_FOCUS(focusedControl, 0); - } - break; - } case GUI_MSG_NOTIFY_ALL: { @@ -311,27 +122,13 @@ bool CGUIWindowSettingsCategory::OnMessage(CGUIMessage &message) } } - return CGUIWindow::OnMessage(message); + return CGUIDialogSettingsManagerBase::OnMessage(message); } bool CGUIWindowSettingsCategory::OnAction(const CAction &action) { switch (action.GetID()) { - case ACTION_SETTINGS_RESET: - { - if (CGUIDialogYesNo::ShowAndGetInput(10041, 0, 10042, 0)) - { - for(vector<BaseSettingControlPtr>::iterator it = m_settingControls.begin(); it != m_settingControls.end(); ++it) - { - CSetting *setting = (*it)->GetSetting(); - if (setting != NULL) - setting->Reset(); - } - } - return true; - } - case ACTION_SETTINGS_LEVEL_CHANGE: { //Test if we can access the new level @@ -372,460 +169,38 @@ bool CGUIWindowSettingsCategory::OnAction(const CAction &action) break; } - return CGUIWindow::OnAction(action); + return CGUIDialogSettingsManagerBase::OnAction(action); } bool CGUIWindowSettingsCategory::OnBack(int actionID) { - m_settings.Save(); - m_lastControlID = 0; // don't save the control as we go to a different window each time - - return CGUIWindow::OnBack(actionID); -} - -void CGUIWindowSettingsCategory::DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions) -{ - // update alpha status of current button - bool bAlphaFaded = false; - CGUIControl *control = GetFirstFocusableControl(CONTROL_START_BUTTONS + m_iCategory); - if (control && !control->HasFocus()) - { - if (control->GetControlType() == CGUIControl::GUICONTROL_BUTTON) - { - control->SetFocus(true); - ((CGUIButtonControl *)control)->SetAlpha(0x80); - bAlphaFaded = true; - } - else if (control->GetControlType() == CGUIControl::GUICONTROL_TOGGLEBUTTON) - { - control->SetFocus(true); - ((CGUIButtonControl *)control)->SetSelected(true); - bAlphaFaded = true; - } - } - CGUIWindow::DoProcess(currentTime, dirtyregions); - if (control && bAlphaFaded) - { - control->SetFocus(false); - if (control->GetControlType() == CGUIControl::GUICONTROL_BUTTON) - ((CGUIButtonControl *)control)->SetAlpha(0xFF); - else - ((CGUIButtonControl *)control)->SetSelected(false); - } -} - -void CGUIWindowSettingsCategory::OnInitWindow() -{ - SetupControls(); - CGUIWindow::OnInitWindow(); + Save(); + return CGUIDialogSettingsManagerBase::OnBack(actionID); } void CGUIWindowSettingsCategory::OnWindowLoaded() { SET_CONTROL_LABEL(CONTRL_BTN_LEVELS, 10036 + (int)CViewStateSettings::Get().GetSettingLevel()); + CGUIDialogSettingsManagerBase::OnWindowLoaded(); } -void CGUIWindowSettingsCategory::SetupControls(bool createSettings /* = true */) -{ - // cleanup first, if necessary - FreeControls(); - - m_pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN); - m_pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON); - m_pOriginalCategoryButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_CATEGORY_BUTTON); - m_pOriginalButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON); - m_pOriginalImage = (CGUIImage *)GetControl(CONTROL_DEFAULT_SEPARATOR); - if (!m_pOriginalCategoryButton || !m_pOriginalSpin || !m_pOriginalRadioButton || !m_pOriginalButton) - return ; - m_pOriginalEdit = (CGUIEditControl *)GetControl(CONTROL_DEFAULT_EDIT); - if (!m_pOriginalEdit || m_pOriginalEdit->GetControlType() != CGUIControl::GUICONTROL_EDIT) - { - delete m_pOriginalEdit; - m_pOriginalEdit = new CGUIEditControl(*m_pOriginalButton); - newOriginalEdit = true; - } - - m_pOriginalSpin->SetVisible(false); - m_pOriginalRadioButton->SetVisible(false); - m_pOriginalButton->SetVisible(false); - m_pOriginalCategoryButton->SetVisible(false); - m_pOriginalEdit->SetVisible(false); - if (m_pOriginalImage) m_pOriginalImage->SetVisible(false); - - // setup our control groups... - CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CATEGORY_GROUP_ID); - if (!group) - return; - - CSettingSection *section = GetSection(m_iSection); - if (section == NULL) - return; - - // update the screen string - SET_CONTROL_LABEL(CONTROL_SETTINGS_LABEL, section->GetLabel()); - - SET_CONTROL_LABEL(CONTRL_BTN_LEVELS, 10036 + (int)CViewStateSettings::Get().GetSettingLevel()); - - // get the categories we need - m_categories = section->GetCategories(CViewStateSettings::Get().GetSettingLevel()); - if (m_categories.empty()) - m_categories.push_back(m_dummyCategory); - - // go through the categories and create the necessary buttons - int buttonIdOffset = 0; - for (SettingCategoryList::const_iterator category = m_categories.begin(); category != m_categories.end(); ++category) - { - CGUIButtonControl *pButton = NULL; - if (m_pOriginalCategoryButton->GetControlType() == CGUIControl::GUICONTROL_TOGGLEBUTTON) - pButton = new CGUIToggleButtonControl(*(CGUIToggleButtonControl *)m_pOriginalCategoryButton); - else - pButton = new CGUIButtonControl(*m_pOriginalCategoryButton); - pButton->SetLabel(g_localizeStrings.Get((*category)->GetLabel())); - pButton->SetID(CONTROL_START_BUTTONS + buttonIdOffset); - pButton->SetVisible(true); - pButton->AllocResources(); - - group->AddControl(pButton); - buttonIdOffset++; - } - - if (createSettings) - CreateSettings(); - - // set focus correctly - m_defaultControl = CONTROL_START_BUTTONS; -} - -void CGUIWindowSettingsCategory::FreeControls() -{ - // clear the category group - CGUIControlGroupList *control = (CGUIControlGroupList *)GetControl(CATEGORY_GROUP_ID); - if (control) - { - control->FreeResources(); - control->ClearAll(); - } - m_categories.clear(); - FreeSettingsControls(); -} - -void CGUIWindowSettingsCategory::FreeSettingsControls() -{ - // clear the settings group - CGUIControlGroupList *control = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID); - if (control) - { - control->FreeResources(); - control->ClearAll(); - } - - for (std::vector<BaseSettingControlPtr>::iterator control = m_settingControls.begin(); control != m_settingControls.end(); ++control) - (*control)->Clear(); - - m_settingControls.clear(); - m_settings.UnregisterCallback(this); -} - -void CGUIWindowSettingsCategory::OnTimeout() -{ - if (m_delayedSetting == NULL) - return; - - // we send a thread message so that it's processed the following frame (some settings won't - // like being changed during Render()) - CGUIMessage message(GUI_MSG_UPDATE_ITEM, GetID(), m_delayedSetting->GetID()); - g_windowManager.SendThreadMessage(message, GetID()); -} - -void CGUIWindowSettingsCategory::OnSettingChanged(const CSetting *setting) -{ - if (setting == NULL || setting->GetType() == SettingTypeNone || - setting->GetType() == SettingTypeAction) - return; - - BaseSettingControlPtr pControl = GetSettingControl(setting->GetId()); - if (pControl == NULL) - return; - - pControl->Update(); -} - -void CGUIWindowSettingsCategory::OnSettingPropertyChanged(const CSetting *setting, const char *propertyName) -{ - if (setting == NULL || propertyName == NULL) - return; - - BaseSettingControlPtr settingControl = GetSettingControl(setting->GetId()); - if (settingControl == NULL) - return; - - settingControl->Update(); -} - -void CGUIWindowSettingsCategory::CreateSettings() -{ - FreeSettingsControls(); - - if (m_categories.size() <= 0) - return; - - if (m_iCategory < 0 || m_iCategory >= (int)m_categories.size()) - m_iCategory = 0; - - CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID); - if (group == NULL) - return; - - const CSettingCategory* category = m_categories.at(m_iCategory); - if (category == NULL) - return; - - // set the description of the current category - SetDescription(category->GetHelp()); - - std::set<std::string> settingMap; - - const SettingGroupList& groups = category->GetGroups(CViewStateSettings::Get().GetSettingLevel()); - int iControlID = CONTROL_START_CONTROL; - bool first = true; - for (SettingGroupList::const_iterator groupIt = groups.begin(); groupIt != groups.end(); ++groupIt) - { - if (*groupIt == NULL) - continue; - - const SettingList& settings = (*groupIt)->GetSettings(CViewStateSettings::Get().GetSettingLevel()); - if (settings.size() <= 0) - continue; - - if (first) - first = false; - else - AddSeparator(group->GetWidth(), iControlID); - - for (SettingList::const_iterator settingIt = settings.begin(); settingIt != settings.end(); ++settingIt) - { - CSetting *pSetting = *settingIt; - settingMap.insert(pSetting->GetId()); - AddSetting(pSetting, group->GetWidth(), iControlID); - } - } - - if (!settingMap.empty()) - m_settings.RegisterCallback(this, settingMap); - - if (!settingMap.empty()) - { - // add "Reset" control - AddSeparator(group->GetWidth(), iControlID); - AddSetting(m_resetSetting, group->GetWidth(), iControlID); - } - - // update our settings (turns controls on/off as appropriate) - UpdateSettings(); -} - -void CGUIWindowSettingsCategory::UpdateSettings() -{ - for (vector<BaseSettingControlPtr>::iterator it = m_settingControls.begin(); it != m_settingControls.end(); ++it) - { - BaseSettingControlPtr pSettingControl = *it; - CSetting *pSetting = pSettingControl->GetSetting(); - CGUIControl *pControl = pSettingControl->GetControl(); - if (pSetting == NULL || pControl == NULL) - continue; - - pSettingControl->Update(); - } -} - -void CGUIWindowSettingsCategory::SetDescription(const CVariant &label) -{ - if (GetControl(CONTROL_DESCRIPTION) == NULL) - return; - - if (label.isString()) - SET_CONTROL_LABEL(CONTROL_DESCRIPTION, label.asString()); - else if (label.isInteger() && label.asInteger() >= 0) - SET_CONTROL_LABEL(CONTROL_DESCRIPTION, (int)label.asInteger()); - else - SET_CONTROL_LABEL(CONTROL_DESCRIPTION, ""); -} - -CGUIControl* CGUIWindowSettingsCategory::AddSetting(CSetting *pSetting, float width, int &iControlID) -{ - if (pSetting == NULL) - return NULL; - - BaseSettingControlPtr pSettingControl; - CGUIControl *pControl = NULL; - - // determine the label and any possible indentation in case of sub settings - string label = g_localizeStrings.Get(pSetting->GetLabel()); - int parentLevels = 0; - CSetting *parentSetting = m_settings.GetSetting(pSetting->GetParent()); - while (parentSetting != NULL) - { - parentLevels++; - parentSetting = m_settings.GetSetting(parentSetting->GetParent()); - } - - if (parentLevels > 0) - { - // add additional 2 spaces indentation for anything past one level - string indentation; - for (int index = 1; index < parentLevels; index++) - indentation.append(" "); - label = StringUtils::Format(g_localizeStrings.Get(168).c_str(), indentation.c_str(), label.c_str()); - } - - // create the proper controls - if (!pSetting->GetControl()) - return NULL; - - std::string controlType = pSetting->GetControl()->GetType(); - if (controlType == "toggle") - { - pControl = new CGUIRadioButtonControl(*m_pOriginalRadioButton); - 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)); - } - 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)); - } - 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)); - } - 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()) - pSettingControl->SetDelayed(); - - return AddSettingControl(pControl, pSettingControl, width, iControlID); -} - -CGUIControl* CGUIWindowSettingsCategory::AddSeparator(float width, int &iControlID) -{ - if (m_pOriginalImage == NULL) - return NULL; - - CGUIControl *pControl = new CGUIImage(*m_pOriginalImage); - if (pControl == NULL) - return NULL; - - return AddSettingControl(pControl, BaseSettingControlPtr(new CGUIControlSeparatorSetting((CGUIImage *)pControl, iControlID)), width, iControlID); -} - -CGUIControl* CGUIWindowSettingsCategory::AddSettingControl(CGUIControl *pControl, BaseSettingControlPtr pSettingControl, float width, int &iControlID) +int CGUIWindowSettingsCategory::GetSettingLevel() const { - if (pControl == NULL) - { - pSettingControl.reset(); - return NULL; - } - - pControl->SetID(iControlID++); - pControl->SetVisible(true); - pControl->SetWidth(width); - - CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(SETTINGS_GROUP_ID); - if (group != NULL) - { - pControl->AllocResources(); - group->AddControl(pControl); - } - m_settingControls.push_back(pSettingControl); - - return pControl; + return (int)CViewStateSettings::Get().GetSettingLevel(); } -void CGUIWindowSettingsCategory::OnClick(BaseSettingControlPtr pSettingControl) -{ - if (pSettingControl->GetSetting()->GetId() == RESET_SETTING_ID) - { - OnAction(CAction(ACTION_SETTINGS_RESET)); - return; - } - - // we need to first set the delayed setting and then execute OnClick() - // because OnClick() triggers OnSettingChanged() and there we need to - // know if the changed setting is delayed or not - if (pSettingControl->IsDelayed()) - { - m_delayedSetting = pSettingControl; - if (m_delayedTimer.IsRunning()) - m_delayedTimer.Restart(); - else - m_delayedTimer.Start(SETTING_DELAY); - - return; - } - - // if changing the setting fails - // we need to restore the proper state - if (!pSettingControl->OnClick()) - pSettingControl->Update(); -} - -CSettingSection* CGUIWindowSettingsCategory::GetSection(int windowID) const +CSettingSection* CGUIWindowSettingsCategory::GetSection() { for (size_t index = 0; index < SettingGroupSize; index++) { - if (s_settingGroupMap[index].id == windowID) + if (s_settingGroupMap[index].id == m_iSection) return m_settings.GetSection(s_settingGroupMap[index].name); } - - return NULL; -} -BaseSettingControlPtr CGUIWindowSettingsCategory::GetSettingControl(const std::string &strSetting) -{ - for (vector<BaseSettingControlPtr>::iterator control = m_settingControls.begin(); control != m_settingControls.end(); ++control) - { - if ((*control)->GetSetting() != NULL && (*control)->GetSetting()->GetId() == strSetting) - return *control; - } - - return BaseSettingControlPtr(); + return NULL; } -BaseSettingControlPtr CGUIWindowSettingsCategory::GetSettingControl(int controlId) +void CGUIWindowSettingsCategory::Save() { - if (controlId < CONTROL_START_CONTROL || controlId >= (int)(CONTROL_START_CONTROL + m_settingControls.size())) - return BaseSettingControlPtr(); - - return m_settingControls[controlId - CONTROL_START_CONTROL]; + m_settings.Save(); } diff --git a/xbmc/settings/windows/GUIWindowSettingsCategory.h b/xbmc/settings/windows/GUIWindowSettingsCategory.h index ea72725532..60106ff1cf 100644 --- a/xbmc/settings/windows/GUIWindowSettingsCategory.h +++ b/xbmc/settings/windows/GUIWindowSettingsCategory.h @@ -1,7 +1,6 @@ #pragma once - /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -20,88 +19,35 @@ * */ -#include <vector> - -#include "GUIControlSettings.h" -#include "guilib/GUIWindow.h" -#include "settings/lib/SettingDependency.h" -#include "settings/lib/SettingSection.h" -#include "settings/Settings.h" -#include "settings/lib/SettingsManager.h" -#include "threads/Timer.h" +#include "settings/dialogs/GUIDialogSettingsManagerBase.h" -typedef boost::shared_ptr<CGUIControlBaseSetting> BaseSettingControlPtr; +class CSettings; -class CGUIWindowSettingsCategory - : public CGUIWindow, - protected ITimerCallback, - protected ISettingCallback +class CGUIWindowSettingsCategory : public CGUIDialogSettingsManagerBase { public: - CGUIWindowSettingsCategory(void); - virtual ~CGUIWindowSettingsCategory(void); + CGUIWindowSettingsCategory(); + virtual ~CGUIWindowSettingsCategory(); + + // specialization of CGUIControl virtual bool OnMessage(CGUIMessage &message); virtual bool OnAction(const CAction &action); virtual bool OnBack(int actionID); - virtual void DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions); - virtual int GetID() const { return CGUIWindow::GetID() + m_iSection; }; + virtual int GetID() const { return CGUIDialogSettingsManagerBase::GetID() + m_iSection; }; + + // specialization of CGUIWindow + virtual bool IsDialog() const { return false; } protected: - virtual void OnInitWindow(); + // specialization of CGUIWindow virtual void OnWindowLoaded(); - - virtual void SetupControls(bool createSettings = true); - virtual void FreeControls(); - void FreeSettingsControls(); - - virtual void OnTimeout(); - virtual void OnSettingChanged(const CSetting *setting); - virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName); - - void CreateSettings(); - void UpdateSettings(); - void SetDescription(const CVariant &label); - CGUIControl* AddSetting(CSetting *pSetting, float width, int &iControlID); - CGUIControl* AddSeparator(float width, int &iControlID); - CGUIControl* AddSettingControl(CGUIControl *pControl, BaseSettingControlPtr pSettingControl, float width, int &iControlID); - - /*! - \brief A setting control has been interacted with by the user - - This method is called when the user manually interacts (clicks, - edits) with a setting control. It contains handling for both - delayed and undelayed settings and either starts the delay timer - or triggers the setting change which, on success, results in a - callback to OnSettingChanged(). - \param pSettingControl Setting control that has been interacted with - */ - virtual void OnClick(BaseSettingControlPtr pSettingControl); - - CSettingSection* GetSection(int windowID) const; - BaseSettingControlPtr GetSettingControl(const std::string &setting); - BaseSettingControlPtr GetSettingControl(int controlId); + // implementation of CGUIDialogSettingsBase + virtual int GetSettingLevel() const; + virtual CSettingSection* GetSection(); + virtual void Save(); CSettings& m_settings; - SettingCategoryList m_categories; - std::vector<BaseSettingControlPtr> m_settingControls; - - int m_iSetting; - int m_iCategory; int m_iSection; - CSettingAction *m_resetSetting; - CSettingCategory *m_dummyCategory; - - CGUISpinControlEx *m_pOriginalSpin; - CGUIRadioButtonControl *m_pOriginalRadioButton; - CGUIButtonControl *m_pOriginalCategoryButton; - CGUIButtonControl *m_pOriginalButton; - CGUIEditControl *m_pOriginalEdit; - CGUIImage *m_pOriginalImage; - bool newOriginalEdit; - - BaseSettingControlPtr m_delayedSetting; ///< Current delayed setting \sa CBaseSettingControl::SetDelayed() - CTimer m_delayedTimer; ///< Delayed setting timer - bool m_returningFromSkinLoad; // true if we are returning from loading the skin }; diff --git a/xbmc/utils/CharsetConverter.cpp b/xbmc/utils/CharsetConverter.cpp index 66b3304df4..23bf0822f0 100644 --- a/xbmc/utils/CharsetConverter.cpp +++ b/xbmc/utils/CharsetConverter.cpp @@ -881,7 +881,7 @@ bool CCharsetConverter::utf8logicalToVisualBiDi(const std::string& utf8StringSrc return CInnerConverter::stdConvert(Utf32ToUtf8, utf32flipped, utf8StringDst, failOnBadString); } -void CCharsetConverter::SettingOptionsCharsetsFiller(const CSetting* setting, std::vector< std::pair<std::string, std::string> >& list, std::string& current) +void CCharsetConverter::SettingOptionsCharsetsFiller(const CSetting* setting, std::vector< std::pair<std::string, std::string> >& list, std::string& current, void *data) { std::vector<std::string> vecCharsets = g_charsetConverter.getCharsetLabels(); sort(vecCharsets.begin(), vecCharsets.end(), sortstringbyname()); diff --git a/xbmc/utils/CharsetConverter.h b/xbmc/utils/CharsetConverter.h index 89004e1ed5..b3453c101f 100644 --- a/xbmc/utils/CharsetConverter.h +++ b/xbmc/utils/CharsetConverter.h @@ -164,7 +164,7 @@ public: static bool toW(const std::string& stringSrc, std::wstring& wStringDst, const std::string& enc); static bool fromW(const std::wstring& wStringSrc, std::string& stringDst, const std::string& enc); - static void SettingOptionsCharsetsFiller(const CSetting* setting, std::vector< std::pair<std::string, std::string> >& list, std::string& current); + static void SettingOptionsCharsetsFiller(const CSetting* setting, std::vector< std::pair<std::string, std::string> >& list, std::string& current, void *data); private: static void resetUserCharset(void); static void resetSubtitleCharset(void); diff --git a/xbmc/video/PlayerController.cpp b/xbmc/video/PlayerController.cpp index 9b3c11b763..f2184de47d 100644 --- a/xbmc/video/PlayerController.cpp +++ b/xbmc/video/PlayerController.cpp @@ -423,7 +423,7 @@ void CPlayerController::OnSliderChange(void *data, CGUISliderControl *slider) slider->SetTextValue(strValue); } else if (m_sliderAction == ACTION_VOLAMP_UP || m_sliderAction == ACTION_VOLAMP_DOWN) - slider->SetTextValue(CGUIDialogAudioSubtitleSettings::FormatDecibel(slider->GetFloatValue(), 1.0f)); + slider->SetTextValue(CGUIDialogAudioSubtitleSettings::FormatDecibel(slider->GetFloatValue())); else slider->SetTextValue(CGUIDialogAudioSubtitleSettings::FormatDelay(slider->GetFloatValue(), 0.025f)); diff --git a/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp b/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp index 8dfd760a39..b1f54982f3 100644 --- a/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -18,250 +18,137 @@ * */ -#include "system.h" #include "GUIDialogAudioSubtitleSettings.h" -#include "dialogs/GUIDialogFileBrowser.h" -#include "GUIPassword.h" -#include "utils/URIUtils.h" #include "Application.h" -#include "video/VideoDatabase.h" -#include "dialogs/GUIDialogYesNo.h" -#include "filesystem/Directory.h" -#include "filesystem/File.h" -#include "URL.h" #include "FileItem.h" +#include "GUIPassword.h" +#include "URL.h" #include "addons/Skin.h" +#include "cores/IPlayer.h" +#include "cores/AudioEngine/Utils/AEUtil.h" +#include "dialogs/GUIDialogFileBrowser.h" +#include "dialogs/GUIDialogYesNo.h" +#include "filesystem/File.h" +#include "guilib/LocalizeStrings.h" #include "profiles/ProfilesManager.h" +#include "pvr/PVRManager.h" #include "settings/AdvancedSettings.h" #include "settings/MediaSettings.h" #include "settings/MediaSourceSettings.h" #include "settings/Settings.h" -#include "guilib/LocalizeStrings.h" -#include "pvr/PVRManager.h" -#include "cores/AudioEngine/Utils/AEUtil.h" -#include "cores/IPlayer.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingsManager.h" #include "utils/LangCodeExpander.h" +#include "utils/log.h" #include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "video/VideoDatabase.h" + +#define SETTING_AUDIO_VOLUME "audio.volume" +#define SETTING_AUDIO_VOLUME_AMPLIFICATION "audio.volumeamplification" +#define SETTING_AUDIO_DELAY "audio.delay" +#define SETTING_AUDIO_STREAM "audio.stream" +#define SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS "audio.outputtoallspeakers" +#define SETTING_AUDIO_PASSTHROUGH "audio.digitalanalog" + +#define SETTING_SUBTITLE_ENABLE "subtitles.enable" +#define SETTING_SUBTITLE_DELAY "subtitles.delay" +#define SETTING_SUBTITLE_STREAM "subtitles.stream" +#define SETTING_SUBTITLE_BROWSER "subtitles.browser" + +#define SETTING_AUDIO_MAKE_DEFAULT "audio.makedefault" using namespace std; -using namespace XFILE; using namespace PVR; -CGUIDialogAudioSubtitleSettings::CGUIDialogAudioSubtitleSettings(void) - : CGUIDialogSettings(WINDOW_DIALOG_AUDIO_OSD_SETTINGS, "VideoOSDSettings.xml") -{ -} +CGUIDialogAudioSubtitleSettings::CGUIDialogAudioSubtitleSettings() + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_AUDIO_OSD_SETTINGS, "VideoOSDSettings.xml"), + m_passthrough(false) +{ } -CGUIDialogAudioSubtitleSettings::~CGUIDialogAudioSubtitleSettings(void) -{ -} +CGUIDialogAudioSubtitleSettings::~CGUIDialogAudioSubtitleSettings() +{ } -#define AUDIO_SETTINGS_VOLUME 1 -#define AUDIO_SETTINGS_VOLUME_AMPLIFICATION 2 -#define AUDIO_SETTINGS_DELAY 3 -#define AUDIO_SETTINGS_STREAM 4 -#define AUDIO_SETTINGS_OUTPUT_TO_ALL_SPEAKERS 5 -#define AUDIO_SETTINGS_DIGITAL_ANALOG 6 - -// separator 7 -#define SUBTITLE_SETTINGS_ENABLE 8 -#define SUBTITLE_SETTINGS_DELAY 9 -#define SUBTITLE_SETTINGS_STREAM 10 -#define SUBTITLE_SETTINGS_BROWSER 11 -#define AUDIO_SETTINGS_MAKE_DEFAULT 12 - -void CGUIDialogAudioSubtitleSettings::CreateSettings() +void CGUIDialogAudioSubtitleSettings::FrameMove() { - m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml"); + // update the volume setting if necessary + float newVolume = g_application.GetVolume(false); + if (newVolume != m_volume) + m_settingsManager->SetNumber(SETTING_AUDIO_VOLUME, newVolume); if (g_application.m_pPlayer->HasPlayer()) { - g_application.m_pPlayer->GetAudioCapabilities(m_audioCaps); - g_application.m_pPlayer->GetSubtitleCapabilities(m_subCaps); - } - - // clear out any old settings - m_settings.clear(); - // create our settings - m_volume = g_application.GetVolume(false); - AddSlider(AUDIO_SETTINGS_VOLUME, 13376, &m_volume, VOLUME_MINIMUM, VOLUME_MAXIMUM / 100.0f, VOLUME_MAXIMUM, PercentAsDecibel, false); - if (SupportsAudioFeature(IPC_AUD_AMP)) - AddSlider(AUDIO_SETTINGS_VOLUME_AMPLIFICATION, 660, &CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification, VOLUME_DRC_MINIMUM * 0.01f, (VOLUME_DRC_MAXIMUM - VOLUME_DRC_MINIMUM) / 6000.0f, VOLUME_DRC_MAXIMUM * 0.01f, FormatDecibel, false); - if (g_application.m_pPlayer->IsPassthrough()) - { - EnableSettings(AUDIO_SETTINGS_VOLUME,false); - EnableSettings(AUDIO_SETTINGS_VOLUME_AMPLIFICATION,false); + const CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); + + // these settings can change on the fly + m_settingsManager->SetNumber(SETTING_AUDIO_DELAY, videoSettings.m_AudioDelay); + m_settingsManager->SetInt(SETTING_AUDIO_STREAM, g_application.m_pPlayer->GetAudioStream()); + m_settingsManager->SetBool(SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS, videoSettings.m_OutputToAllSpeakers); + m_settingsManager->SetBool(SETTING_AUDIO_PASSTHROUGH, CSettings::Get().GetBool("audiooutput.passthrough")); + + m_settingsManager->SetBool(SETTING_SUBTITLE_ENABLE, videoSettings.m_SubtitleOn); + m_settingsManager->SetNumber(SETTING_SUBTITLE_DELAY, videoSettings.m_SubtitleDelay); + m_settingsManager->SetInt(SETTING_SUBTITLE_STREAM, g_application.m_pPlayer->GetSubtitle()); } - if (SupportsAudioFeature(IPC_AUD_OFFSET)) - AddSlider(AUDIO_SETTINGS_DELAY, 297, &CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, .025f, g_advancedSettings.m_videoAudioDelayRange, FormatDelay); - if (SupportsAudioFeature(IPC_AUD_SELECT_STREAM)) - AddAudioStreams(AUDIO_SETTINGS_STREAM); - // TODO: remove this setting - if (SupportsAudioFeature(IPC_AUD_OUTPUT_STEREO)) - AddBool(AUDIO_SETTINGS_OUTPUT_TO_ALL_SPEAKERS, 252, &CMediaSettings::Get().GetCurrentVideoSettings().m_OutputToAllSpeakers, true); - - m_outputmode = CSettings::Get().GetBool("audiooutput.passthrough"); - if (SupportsAudioFeature(IPC_AUD_SELECT_OUTPUT)) - AddBool(AUDIO_SETTINGS_DIGITAL_ANALOG, 348, &m_outputmode); - - AddSeparator(7); - m_subtitleVisible = g_application.m_pPlayer->GetSubtitleVisible(); - AddBool(SUBTITLE_SETTINGS_ENABLE, 13397, &m_subtitleVisible); - if (SupportsSubtitleFeature(IPC_SUBS_OFFSET)) - AddSlider(SUBTITLE_SETTINGS_DELAY, 22006, &CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange, FormatDelay); - if (SupportsSubtitleFeature(IPC_SUBS_SELECT)) - AddSubtitleStreams(SUBTITLE_SETTINGS_STREAM); - if (SupportsSubtitleFeature(IPC_SUBS_EXTERNAL)) - AddButton(SUBTITLE_SETTINGS_BROWSER,13250); - AddButton(AUDIO_SETTINGS_MAKE_DEFAULT, 12376); + CGUIDialogSettingsManualBase::FrameMove(); } -void CGUIDialogAudioSubtitleSettings::AddAudioStreams(unsigned int id) +std::string CGUIDialogAudioSubtitleSettings::FormatDelay(float value, float interval) { - SettingInfo setting; - setting.id = id; - setting.name = g_localizeStrings.Get(460); - setting.type = SettingInfo::SPIN; - setting.min = 0; - setting.data = &m_audioStream; - - // get the number of audio strams for the current movie - setting.max = (float)g_application.m_pPlayer->GetAudioStreamCount() - 1; - m_audioStream = g_application.m_pPlayer->GetAudioStream(); - - if( m_audioStream < 0 ) m_audioStream = 0; - - // check if we have a single, stereo stream, and if so, allow us to split into - // left, right or both - if (!setting.max) - { - CStdString strAudioInfo; - g_application.m_pPlayer->GetAudioInfo(strAudioInfo); - /* TODO:STRING_CLEANUP */ - int iNumChannels = 0; - size_t pos = strAudioInfo.find("chns:"); - if (pos != std::string::npos) - iNumChannels = atoi(strAudioInfo.substr(pos + 5).c_str()); - CStdString strAudioCodec; - if (strAudioInfo.size() > 7) - strAudioCodec = strAudioInfo.substr(7, strAudioInfo.find(") VBR") - 5); - bool bDTS = strstr(strAudioCodec.c_str(), "DTS") != 0; - bool bAC3 = strstr(strAudioCodec.c_str(), "AC3") != 0; - if (iNumChannels == 2 && !(bDTS || bAC3)) - { // ok, enable these options -/* if (CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream == -1) - { // default to stereo stream - CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream = 0; - }*/ - setting.max = 2; - for (int i = 0; i <= setting.max; i++) - setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(13320 + i))); - m_audioStream = -CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream - 1; - m_settings.push_back(setting); - return; - } - } + if (fabs(value) < 0.5f * interval) + return StringUtils::Format(g_localizeStrings.Get(22003).c_str(), 0.0); + if (value < 0) + return StringUtils::Format(g_localizeStrings.Get(22004).c_str(), fabs(value)); - // cycle through each audio stream and add it to our list control - for (int i = 0; i <= setting.max; ++i) - { - CStdString strItem; - CStdString strLanguage; - - SPlayerAudioStreamInfo info; - g_application.m_pPlayer->GetAudioStreamInfo(i, info); - - if (!g_LangCodeExpander.Lookup(strLanguage, info.language)) - strLanguage = g_localizeStrings.Get(13205); // Unknown - - if (info.name.length() == 0) - strItem = strLanguage; - else - strItem = StringUtils::Format("%s - %s", strLanguage.c_str(), info.name.c_str()); - - strItem += StringUtils::Format(" (%i/%i)", i + 1, (int)setting.max + 1); - setting.entry.push_back(make_pair(setting.entry.size(), strItem)); - } - - if( setting.max < 0 ) - { - setting.max = 0; - setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(231))); - } - - m_settings.push_back(setting); + return StringUtils::Format(g_localizeStrings.Get(22005).c_str(), value); } -void CGUIDialogAudioSubtitleSettings::AddSubtitleStreams(unsigned int id) +std::string CGUIDialogAudioSubtitleSettings::FormatDecibel(float value) { - SettingInfo setting; - - setting.id = id; - setting.name = g_localizeStrings.Get(462); - setting.type = SettingInfo::SPIN; - setting.min = 0; - setting.data = &m_subtitleStream; - m_subtitleStream = CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream; - - if(m_subtitleStream < 0) m_subtitleStream = 0; - - // get the number of audio strams for the current movie - setting.max = (float)g_application.m_pPlayer->GetSubtitleCount() - 1; - - // cycle through each subtitle and add it to our entry list - for (int i = 0; i <= setting.max; ++i) - { - SPlayerSubtitleStreamInfo info; - g_application.m_pPlayer->GetSubtitleStreamInfo(i, info); - - CStdString strItem; - CStdString strLanguage; - - if (!g_LangCodeExpander.Lookup(strLanguage, info.language)) - strLanguage = g_localizeStrings.Get(13205); // Unknown - - if (info.name.length() == 0) - strItem = strLanguage; - else - strItem = StringUtils::Format("%s - %s", strLanguage.c_str(), info.name.c_str()); - - strItem += StringUtils::Format(" (%i/%i)", i + 1, (int)setting.max + 1); - - setting.entry.push_back(make_pair(setting.entry.size(), strItem)); - } + return StringUtils::Format(g_localizeStrings.Get(14054).c_str(), value); +} - if (setting.max < 0) - { // no subtitle streams - just add a "None" entry - m_subtitleStream = 0; - setting.max = 0; - setting.entry.push_back(make_pair(setting.entry.size(), g_localizeStrings.Get(231))); - } - m_settings.push_back(setting); +std::string CGUIDialogAudioSubtitleSettings::FormatPercentAsDecibel(float value) +{ + return StringUtils::Format(g_localizeStrings.Get(14054).c_str(), CAEUtil::PercentToGain(value)); } -void CGUIDialogAudioSubtitleSettings::OnSettingChanged(SettingInfo &setting) +void CGUIDialogAudioSubtitleSettings::OnSettingChanged(const CSetting *setting) { - // check and update anything that needs it - if (setting.id == AUDIO_SETTINGS_VOLUME) - g_application.SetVolume(m_volume, false); //false - value is not in percent - else if (setting.id == AUDIO_SETTINGS_VOLUME_AMPLIFICATION) + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_AUDIO_VOLUME) { - g_application.m_pPlayer->SetDynamicRangeCompression((long)(CMediaSettings::Get().GetCurrentVideoSettings().m_VolumeAmplification * 100)); + m_volume = static_cast<const CSettingNumber*>(setting)->GetValue(); + g_application.SetVolume(m_volume, false); // false - value is not in percent } - else if (setting.id == AUDIO_SETTINGS_DELAY) + else if (settingId == SETTING_AUDIO_VOLUME_AMPLIFICATION) { - g_application.m_pPlayer->SetAVDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_AudioDelay); + videoSettings.m_VolumeAmplification = static_cast<const CSettingNumber*>(setting)->GetValue(); + g_application.m_pPlayer->SetDynamicRangeCompression((long)(videoSettings.m_VolumeAmplification * 100)); } - else if (setting.id == AUDIO_SETTINGS_STREAM) + else if (settingId == SETTING_AUDIO_DELAY) { + videoSettings.m_AudioDelay = static_cast<const CSettingNumber*>(setting)->GetValue(); + g_application.m_pPlayer->SetAVDelay(videoSettings.m_AudioDelay); + } + else if (settingId == SETTING_AUDIO_STREAM) + { + m_audioStream = static_cast<const CSettingInt*>(setting)->GetValue(); + // first check if it's a stereo track that we can change between stereo, left and right if (g_application.m_pPlayer->GetAudioStreamCount() == 1) { - if (setting.max == 2) + if (m_audioStreamStereoMode) { // we're in the case we want - call the code to switch channels etc. // update the screen setting... - CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream = -1 - m_audioStream; + videoSettings.m_AudioStream = -1 - m_audioStream; // call monkeyh1's code here... //bool bAudioOnAllSpeakers = (CSettings::Get().GetInt("audiooutput.mode") == AUDIO_IEC958) && CMediaSettings::Get().GetCurrentVideoSettings().m_OutputToAllSpeakers; return; @@ -270,48 +157,57 @@ void CGUIDialogAudioSubtitleSettings::OnSettingChanged(SettingInfo &setting) // only change the audio stream if a different one has been asked for if (g_application.m_pPlayer->GetAudioStream() != m_audioStream) { - CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream = m_audioStream; + videoSettings.m_AudioStream = m_audioStream; g_application.m_pPlayer->SetAudioStream(m_audioStream); // Set the audio stream to the one selected - EnableSettings(AUDIO_SETTINGS_VOLUME, !g_application.m_pPlayer->IsPassthrough()); } } - else if (setting.id == AUDIO_SETTINGS_OUTPUT_TO_ALL_SPEAKERS) + else if (settingId == SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS) { + videoSettings.m_OutputToAllSpeakers = static_cast<const CSettingBool*>(setting)->GetValue(); g_application.Restart(); } - else if (setting.id == AUDIO_SETTINGS_DIGITAL_ANALOG) + else if (settingId == SETTING_AUDIO_PASSTHROUGH) { - CSettings::Get().SetBool("audiooutput.passthrough", m_outputmode); - - EnableSettings(AUDIO_SETTINGS_OUTPUT_TO_ALL_SPEAKERS, true); - EnableSettings(AUDIO_SETTINGS_VOLUME, !g_application.m_pPlayer->IsPassthrough()); + m_passthrough = static_cast<const CSettingBool*>(setting)->GetValue(); + CSettings::Get().SetBool("audiooutput.passthrough", m_passthrough); } - else if (setting.id == SUBTITLE_SETTINGS_ENABLE) + else if (settingId == SETTING_SUBTITLE_ENABLE) { - CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn = m_subtitleVisible; - g_application.m_pPlayer->SetSubtitleVisible(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn); + m_subtitleVisible = videoSettings.m_SubtitleOn = static_cast<const CSettingBool*>(setting)->GetValue(); + g_application.m_pPlayer->SetSubtitleVisible(videoSettings.m_SubtitleOn); } - else if (setting.id == SUBTITLE_SETTINGS_DELAY) + else if (settingId == SETTING_SUBTITLE_DELAY) { - g_application.m_pPlayer->SetSubTitleDelay(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleDelay); + videoSettings.m_SubtitleDelay = static_cast<const CSettingNumber*>(setting)->GetValue(); + g_application.m_pPlayer->SetSubTitleDelay(videoSettings.m_SubtitleDelay); } - else if (setting.id == SUBTITLE_SETTINGS_STREAM && setting.max > 0) + else if (settingId == SETTING_SUBTITLE_STREAM) { - CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream = m_subtitleStream; + m_subtitleStream = videoSettings.m_SubtitleStream = static_cast<const CSettingInt*>(setting)->GetValue(); g_application.m_pPlayer->SetSubtitle(m_subtitleStream); } - else if (setting.id == SUBTITLE_SETTINGS_BROWSER) + + if (g_PVRManager.IsPlayingRadio() || g_PVRManager.IsPlayingTV()) + g_PVRManager.TriggerSaveChannelSettings(); +} + +void CGUIDialogAudioSubtitleSettings::OnSettingAction(const CSetting *setting) +{ + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingAction(setting); + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_SUBTITLE_BROWSER) { CStdString strPath; if (URIUtils::IsInRAR(g_application.CurrentFileItem().GetPath()) || URIUtils::IsInZIP(g_application.CurrentFileItem().GetPath())) - { - CURL url(g_application.CurrentFileItem().GetPath()); - strPath = url.GetHostName(); - } + strPath = CURL(g_application.CurrentFileItem().GetPath()).GetHostName(); else strPath = g_application.CurrentFileItem().GetPath(); - CStdString strMask = ".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.aqt|.jss|.ass|.idx|.rar|.zip"; + std::string strMask = ".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.aqt|.jss|.ass|.idx|.rar|.zip"; if (g_application.GetCurrentPlayer() == EPC_DVDPLAYER) strMask = ".srt|.rar|.zip|.ifo|.smi|.sub|.idx|.ass|.ssa|.txt"; VECSOURCES shares(*CMediaSourceSettings::Get().GetSources("video")); @@ -326,14 +222,16 @@ void CGUIDialogAudioSubtitleSettings::OnSettingChanged(SettingInfo &setting) strPath = share.strPath; URIUtils::AddSlashAtEnd(strPath); } - if (CGUIDialogFileBrowser::ShowAndGetFile(shares,strMask,g_localizeStrings.Get(293),strPath,false,true)) // "subtitles" + if (CGUIDialogFileBrowser::ShowAndGetFile(shares, strMask, g_localizeStrings.Get(293), strPath, false, true)) // "subtitles" { if (URIUtils::HasExtension(strPath, ".sub")) - if (CFile::Exists(URIUtils::ReplaceExtension(strPath, ".idx"))) + { + if (XFILE::CFile::Exists(URIUtils::ReplaceExtension(strPath, ".idx"))) strPath = URIUtils::ReplaceExtension(strPath, ".idx"); + } int id = g_application.m_pPlayer->AddSubtitle(strPath); - if(id >= 0) + if (id >= 0) { m_subtitleStream = id; g_application.m_pPlayer->SetSubtitle(m_subtitleStream); @@ -343,82 +241,316 @@ void CGUIDialogAudioSubtitleSettings::OnSettingChanged(SettingInfo &setting) Close(); } } - else if (setting.id == AUDIO_SETTINGS_MAKE_DEFAULT) + else if (settingId == SETTING_AUDIO_MAKE_DEFAULT) + Save(); +} + +void CGUIDialogAudioSubtitleSettings::Save() +{ + if (!g_passwordManager.CheckSettingLevelLock(SettingLevelExpert) && + CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) + return; + + // prompt user if they are sure + if (!CGUIDialogYesNo::ShowAndGetInput(12376, 750, 0, 12377)) + return; + + // reset the settings + CVideoDatabase db; + if (!db.Open()) + return; + + db.EraseVideoSettings(); + db.Close(); + + CMediaSettings::Get().GetDefaultVideoSettings() = CMediaSettings::Get().GetCurrentVideoSettings(); + CMediaSettings::Get().GetDefaultVideoSettings().m_SubtitleStream = -1; + CMediaSettings::Get().GetDefaultVideoSettings().m_AudioStream = -1; + CSettings::Get().Save(); +} + +void CGUIDialogAudioSubtitleSettings::InitializeSettings() +{ + CGUIDialogSettingsManualBase::InitializeSettings(); + + CSettingCategory *category = AddCategory("audiosubtitlesettings", -1); + if (category == NULL) { - if (!g_passwordManager.CheckSettingLevelLock(SettingLevelExpert) && - CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) - return; + CLog::Log(LOGERROR, "CGUIDialogAudioSubtitleSettings: unable to setup settings"); + return; + } - // prompt user if they are sure - if (CGUIDialogYesNo::ShowAndGetInput(12376, 750, 0, 12377)) - { // reset the settings - CVideoDatabase db; - db.Open(); - db.EraseVideoSettings(); - db.Close(); - CMediaSettings::Get().GetDefaultVideoSettings() = CMediaSettings::Get().GetCurrentVideoSettings(); - CMediaSettings::Get().GetDefaultVideoSettings().m_SubtitleStream = -1; - CMediaSettings::Get().GetDefaultVideoSettings().m_AudioStream = -1; - CSettings::Get().Save(); - } + // get all necessary setting groups + CSettingGroup *groupAudio = AddGroup(category); + if (groupAudio == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogAudioSubtitleSettings: unable to setup settings"); + return; + } + CSettingGroup *groupSubtitles = AddGroup(category); + if (groupSubtitles == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogAudioSubtitleSettings: unable to setup settings"); + return; + } + CSettingGroup *groupSaveAsDefault = AddGroup(category); + if (groupSubtitles == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogAudioSubtitleSettings: unable to setup settings"); + return; } - if (g_PVRManager.IsPlayingRadio() || g_PVRManager.IsPlayingTV()) - g_PVRManager.TriggerSaveChannelSettings(); + bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); + + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); + + if (g_application.m_pPlayer->HasPlayer()) + { + g_application.m_pPlayer->GetAudioCapabilities(m_audioCaps); + g_application.m_pPlayer->GetSubtitleCapabilities(m_subCaps); + } + + CSettingDependency dependencyAudioOutputPassthroughDisabled(SettingDependencyTypeEnable, m_settingsManager); + dependencyAudioOutputPassthroughDisabled.And() + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_AUDIO_PASSTHROUGH, "false", SettingDependencyOperatorEquals, false, m_settingsManager))); + SettingDependencies depsAudioOutputPassthroughDisabled; + depsAudioOutputPassthroughDisabled.push_back(dependencyAudioOutputPassthroughDisabled); + + // audio settings + // audio volume setting + m_volume = g_application.GetVolume(false); + CSettingNumber *settingAudioVolume = AddSlider(groupAudio, SETTING_AUDIO_VOLUME, 13376, 0, m_volume, 14054, VOLUME_MINIMUM, VOLUME_MAXIMUM / 100.0f, VOLUME_MAXIMUM); + settingAudioVolume->SetDependencies(depsAudioOutputPassthroughDisabled); + static_cast<CSettingControlSlider*>(settingAudioVolume->GetControl())->SetFormatter(SettingFormatterPercentAsDecibel); + + // audio volume amplification setting + if (SupportsAudioFeature(IPC_AUD_AMP)) + { + CSettingNumber *settingAudioVolumeAmplification = AddSlider(groupAudio, SETTING_AUDIO_VOLUME_AMPLIFICATION, 660, 0, videoSettings.m_VolumeAmplification, 14054, VOLUME_DRC_MINIMUM * 0.01f, (VOLUME_DRC_MAXIMUM - VOLUME_DRC_MINIMUM) / 6000.0f, VOLUME_DRC_MAXIMUM * 0.01f); + settingAudioVolumeAmplification->SetDependencies(depsAudioOutputPassthroughDisabled); + } + + // audio delay setting + if (SupportsAudioFeature(IPC_AUD_OFFSET)) + { + CSettingNumber *settingAudioDelay = AddSlider(groupAudio, SETTING_AUDIO_DELAY, 297, 0, videoSettings.m_AudioDelay, 0, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, -1, usePopup); + static_cast<CSettingControlSlider*>(settingAudioDelay->GetControl())->SetFormatter(SettingFormatterDelay); + } + + // audio stream setting + if (SupportsAudioFeature(IPC_AUD_SELECT_STREAM)) + AddAudioStreams(groupAudio, SETTING_AUDIO_STREAM); + + // audio output to all speakers setting + // TODO: remove this setting + if (SupportsAudioFeature(IPC_AUD_OUTPUT_STEREO)) + AddToggle(groupAudio, SETTING_AUDIO_OUTPUT_TO_ALL_SPEAKERS, 252, 0, videoSettings.m_OutputToAllSpeakers); + + // audio digital/analog setting + if (SupportsAudioFeature(IPC_AUD_SELECT_OUTPUT)) + { + m_passthrough = CSettings::Get().GetBool("audiooutput.passthrough"); + AddToggle(groupAudio, SETTING_AUDIO_PASSTHROUGH, 348, 0, m_passthrough); + } + + // subitlte settings + m_subtitleVisible = g_application.m_pPlayer->GetSubtitleVisible(); + // subtitle enabled setting + AddToggle(groupSubtitles, SETTING_SUBTITLE_ENABLE, 13397, 0, m_subtitleVisible); + + // subtitle delay setting + if (SupportsSubtitleFeature(IPC_SUBS_OFFSET)) + { + CSettingNumber *settingSubtitleDelay = AddSlider(groupSubtitles, SETTING_SUBTITLE_DELAY, 22006, 0, videoSettings.m_SubtitleDelay, 0, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange, -1, usePopup); + static_cast<CSettingControlSlider*>(settingSubtitleDelay->GetControl())->SetFormatter(SettingFormatterDelay); + } + + // subtitle stream setting + if (SupportsSubtitleFeature(IPC_SUBS_SELECT)) + AddSubtitleStreams(groupSubtitles, SETTING_SUBTITLE_STREAM); + + // subtitle browser setting + if (SupportsSubtitleFeature(IPC_SUBS_EXTERNAL)) + AddButton(groupSubtitles, SETTING_SUBTITLE_BROWSER, 13250, 0); + + // subtitle stream setting + AddButton(groupSaveAsDefault, SETTING_AUDIO_MAKE_DEFAULT, 12376, 0); } -void CGUIDialogAudioSubtitleSettings::FrameMove() +bool CGUIDialogAudioSubtitleSettings::SupportsAudioFeature(int feature) { - m_volume = g_application.GetVolume(false); - UpdateSetting(AUDIO_SETTINGS_VOLUME); - if (g_application.m_pPlayer->HasPlayer()) + for (Features::iterator itr = m_audioCaps.begin(); itr != m_audioCaps.end(); ++itr) { - // these settings can change on the fly - UpdateSetting(AUDIO_SETTINGS_DELAY); - UpdateSetting(SUBTITLE_SETTINGS_ENABLE); - UpdateSetting(SUBTITLE_SETTINGS_DELAY); + if (*itr == feature || *itr == IPC_AUD_ALL) + return true; } - CGUIDialogSettings::FrameMove(); + + return false; } -CStdString CGUIDialogAudioSubtitleSettings::PercentAsDecibel(float value, float interval) +bool CGUIDialogAudioSubtitleSettings::SupportsSubtitleFeature(int feature) { - return StringUtils::Format("%2.1f dB", CAEUtil::PercentToGain(value));; + for (Features::iterator itr = m_subCaps.begin(); itr != m_subCaps.end(); ++itr) + { + if (*itr == feature || *itr == IPC_SUBS_ALL) + return true; + } + + return false; } -CStdString CGUIDialogAudioSubtitleSettings::FormatDecibel(float value, float interval) +void CGUIDialogAudioSubtitleSettings::AddAudioStreams(CSettingGroup *group, const std::string &settingId) { - return StringUtils::Format("%2.1f dB", value);; + m_audioStreamStereoMode = false; + if (group == NULL || settingId.empty()) + return; + + m_audioStream = g_application.m_pPlayer->GetAudioStream(); + if (m_audioStream < 0) + m_audioStream = 0; + + // check if we have a single, stereo stream, and if so, allow us to split into + // left, right or both + if (g_application.m_pPlayer->GetAudioStreamCount() == 1) + { + CStdString strAudioInfo; + g_application.m_pPlayer->GetAudioInfo(strAudioInfo); + + /* TODO:STRING_CLEANUP */ + int iNumChannels = 0; + size_t pos = strAudioInfo.find("chns:"); + if (pos != std::string::npos) + iNumChannels = static_cast<int>(strtol(strAudioInfo.substr(pos + 5).c_str(), NULL, 0)); + + std::string strAudioCodec; + if (strAudioInfo.size() > 7) + strAudioCodec = strAudioInfo.substr(7, strAudioInfo.find(") VBR") - 5); + + bool bDTS = strAudioCodec.find("DTS") != std::string::npos; + bool bAC3 = strAudioCodec.find("AC3") != std::string::npos; + + if (iNumChannels == 2 && !(bDTS || bAC3)) + { // ok, enable these options +/* if (CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream == -1) + { // default to stereo stream + CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream = 0; + }*/ + StaticIntegerSettingOptions options; + for (int i = 0; i < 3; ++i) + options.push_back(make_pair(i, 13320 + i)); + + m_audioStream = -CMediaSettings::Get().GetCurrentVideoSettings().m_AudioStream - 1; + m_audioStreamStereoMode = true; + AddSpinner(group, settingId, 460, 0, m_audioStream, options); + return; + } + } + + AddSpinner(group, settingId, 460, 0, m_audioStream, AudioStreamsOptionFiller); } -CStdString CGUIDialogAudioSubtitleSettings::FormatDelay(float value, float interval) +void CGUIDialogAudioSubtitleSettings::AddSubtitleStreams(CSettingGroup *group, const std::string &settingId) { - CStdString text; - if (fabs(value) < 0.5f*interval) - text = StringUtils::Format(g_localizeStrings.Get(22003).c_str(), 0.0); - else if (value < 0) - text = StringUtils::Format(g_localizeStrings.Get(22004).c_str(), fabs(value)); - else - text = StringUtils::Format(g_localizeStrings.Get(22005).c_str(), value); - return text; + if (group == NULL || settingId.empty()) + return; + + m_subtitleStream = CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream; + if (m_subtitleStream < 0) + m_subtitleStream = 0; + + AddSpinner(group, settingId, 462, 0, m_subtitleStream, SubtitleStreamsOptionFiller); } -bool CGUIDialogAudioSubtitleSettings::SupportsAudioFeature(int feature) +void CGUIDialogAudioSubtitleSettings::AudioStreamsOptionFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { - for (Features::iterator itr = m_audioCaps.begin(); itr != m_audioCaps.end(); itr++) + int audioStreamCount = g_application.m_pPlayer->GetAudioStreamCount(); + + // cycle through each audio stream and add it to our list control + for (int i = 0; i < audioStreamCount; ++i) { - if(*itr == feature || *itr == IPC_AUD_ALL) - return true; + std::string strItem; + CStdString strLanguage; + + SPlayerAudioStreamInfo info; + g_application.m_pPlayer->GetAudioStreamInfo(i, info); + + if (!g_LangCodeExpander.Lookup(strLanguage, info.language)) + strLanguage = g_localizeStrings.Get(13205); // Unknown + + if (info.name.length() == 0) + strItem = strLanguage; + else + strItem = StringUtils::Format("%s - %s", strLanguage.c_str(), info.name.c_str()); + + strItem += StringUtils::Format(" (%i/%i)", i + 1, audioStreamCount); + list.push_back(make_pair(strItem, i)); + } + + if (list.empty()) + { + list.push_back(make_pair(g_localizeStrings.Get(231), -1)); + current = -1; } - return false; } -bool CGUIDialogAudioSubtitleSettings::SupportsSubtitleFeature(int feature) +void CGUIDialogAudioSubtitleSettings::SubtitleStreamsOptionFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { - for (Features::iterator itr = m_subCaps.begin(); itr != m_subCaps.end(); itr++) + int subtitleStreamCount = g_application.m_pPlayer->GetSubtitleCount(); + + // cycle through each subtitle and add it to our entry list + for (int i = 0; i < subtitleStreamCount; ++i) { - if(*itr == feature || *itr == IPC_SUBS_ALL) - return true; + SPlayerSubtitleStreamInfo info; + g_application.m_pPlayer->GetSubtitleStreamInfo(i, info); + + CStdString strItem; + CStdString strLanguage; + + if (!g_LangCodeExpander.Lookup(strLanguage, info.language)) + strLanguage = g_localizeStrings.Get(13205); // Unknown + + if (info.name.length() == 0) + strItem = strLanguage; + else + strItem = StringUtils::Format("%s - %s", strLanguage.c_str(), info.name.c_str()); + + strItem += StringUtils::Format(" (%i/%i)", i + 1, subtitleStreamCount); + + list.push_back(make_pair(strItem, i)); } - return false; + + // no subtitle streams - just add a "None" entry + if (list.empty()) + { + list.push_back(make_pair(g_localizeStrings.Get(231), -1)); + current = -1; + } +} + +std::string CGUIDialogAudioSubtitleSettings::SettingFormatterDelay(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum) +{ + if (!value.isDouble()) + return ""; + + float fValue = value.asFloat(); + float fStep = step.asFloat(); + + if (fabs(fValue) < 0.5f * fStep) + return StringUtils::Format(g_localizeStrings.Get(22003).c_str(), 0.0); + if (fValue < 0) + return StringUtils::Format(g_localizeStrings.Get(22004).c_str(), fabs(fValue)); + + return StringUtils::Format(g_localizeStrings.Get(22005).c_str(), fValue); +} + +std::string CGUIDialogAudioSubtitleSettings::SettingFormatterPercentAsDecibel(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum) +{ + if (control == NULL || !value.isDouble()) + return ""; + + std::string formatString = control->GetFormatString(); + if (control->GetFormatLabel() > -1) + formatString = g_localizeStrings.Get(control->GetFormatLabel()); + + return StringUtils::Format(formatString.c_str(), CAEUtil::PercentToGain(value.asFloat())); } diff --git a/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h b/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h index f8c578e584..9d6279b61f 100644 --- a/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h +++ b/xbmc/video/dialogs/GUIDialogAudioSubtitleSettings.h @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -20,35 +20,53 @@ * */ -#include "settings/dialogs/GUIDialogSettings.h" -typedef std::vector<int> Features; +#include "settings/dialogs/GUIDialogSettingsManualBase.h" -class CGUIDialogAudioSubtitleSettings : - public CGUIDialogSettings +class CGUIDialogAudioSubtitleSettings : public CGUIDialogSettingsManualBase { public: - CGUIDialogAudioSubtitleSettings(void); - virtual ~CGUIDialogAudioSubtitleSettings(void); + CGUIDialogAudioSubtitleSettings(); + virtual ~CGUIDialogAudioSubtitleSettings(); + + // specialization of CGUIWindow virtual void FrameMove(); - static CStdString PercentAsDecibel(float value, float minimum); - static CStdString FormatDelay(float value, float minimum); - static CStdString FormatDecibel(float value, float minimum); + static std::string FormatDelay(float value, float interval); + static std::string FormatDecibel(float value); + static std::string FormatPercentAsDecibel(float value); protected: - virtual void CreateSettings(); - virtual void OnSettingChanged(SettingInfo &setting); + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save(); + + // specialization of CGUIDialogSettingsManualBase + virtual void InitializeSettings(); - void AddAudioStreams(unsigned int id); - void AddSubtitleStreams(unsigned int id); bool SupportsAudioFeature(int feature); bool SupportsSubtitleFeature(int feature); + void AddAudioStreams(CSettingGroup *group, const std::string &settingId); + void AddSubtitleStreams(CSettingGroup *group, const std::string &settingId); + + static void AudioStreamsOptionFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + static void SubtitleStreamsOptionFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); + + static std::string SettingFormatterDelay(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum); + static std::string SettingFormatterPercentAsDecibel(const CSettingControlSlider *control, const CVariant &value, const CVariant &minimum, const CVariant &step, const CVariant &maximum); + float m_volume; int m_audioStream; + bool m_audioStreamStereoMode; + bool m_passthrough; int m_subtitleStream; - bool m_outputmode; bool m_subtitleVisible; + + typedef std::vector<int> Features; Features m_audioCaps; Features m_subCaps; }; diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp index 5218a83e2c..e19422925c 100644 --- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -20,261 +20,343 @@ #include "system.h" #include "GUIDialogVideoSettings.h" -#include "guilib/GUIWindowManager.h" #include "GUIPassword.h" -#include "utils/MathUtils.h" -#include "utils/StringUtils.h" +#include "addons/Skin.h" #ifdef HAS_VIDEO_PLAYBACK #include "cores/VideoRenderers/RenderManager.h" #include "cores/VideoRenderers/RenderFlags.h" #endif -#include "video/VideoDatabase.h" #include "dialogs/GUIDialogYesNo.h" +#include "guilib/GUIWindowManager.h" #include "profiles/ProfilesManager.h" -#include "settings/Settings.h" -#include "settings/MediaSettings.h" -#include "addons/Skin.h" #include "pvr/PVRManager.h" +#include "settings/MediaSettings.h" +#include "settings/Settings.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingsManager.h" +#include "utils/log.h" +#include "video/VideoDatabase.h" + +#define SETTING_VIDEO_CROP "video.crop" +#define SETTING_VIDEO_VIEW_MODE "video.viewmode" +#define SETTING_VIDEO_ZOOM "video.zoom" +#define SETTING_VIDEO_PIXEL_RATIO "video.pixelratio" +#define SETTING_VIDEO_BRIGHTNESS "video.brightness" +#define SETTING_VIDEO_CONTRAST "video.contrast" +#define SETTING_VIDEO_GAMMA "video.gamma" +#define SETTING_VIDEO_NONLIN_STRETCH "video.nonlinearstretch" +#define SETTING_VIDEO_POSTPROCESS "video.postprocess" +#define SETTING_VIDEO_VERTICAL_SHIFT "video.verticalshift" + +#define SETTING_VIDEO_VDPAU_NOISE "vdpau.noise" +#define SETTING_VIDEO_VDPAU_SHARPNESS "vdpau.sharpness" + +#define SETTING_VIDEO_DEINTERLACEMODE "video.deinterlacemode" +#define SETTING_VIDEO_INTERLACEMETHOD "video.interlacemethod" +#define SETTING_VIDEO_SCALINGMETHOD "video.scalingmethod" + +#define SETTING_VIDEO_STEREOSCOPICMODE "video.stereoscopicmode" +#define SETTING_VIDEO_STEREOSCOPICINVERT "video.stereoscopicinvert" + +#define SETTING_VIDEO_MAKE_DEFAULT "video.save" +#define SETTING_VIDEO_CALIBRATION "video.calibration" using namespace std; using namespace PVR; -CGUIDialogVideoSettings::CGUIDialogVideoSettings(void) - : CGUIDialogSettings(WINDOW_DIALOG_VIDEO_OSD_SETTINGS, "VideoOSDSettings.xml") -{ -} +CGUIDialogVideoSettings::CGUIDialogVideoSettings() + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_VIDEO_OSD_SETTINGS, "VideoOSDSettings.xml"), + m_viewModeChanged(false) +{ } -CGUIDialogVideoSettings::~CGUIDialogVideoSettings(void) -{ -} +CGUIDialogVideoSettings::~CGUIDialogVideoSettings() +{ } -#define VIDEO_SETTINGS_CROP 1 -#define VIDEO_SETTINGS_VIEW_MODE 2 -#define VIDEO_SETTINGS_ZOOM 3 -#define VIDEO_SETTINGS_PIXEL_RATIO 4 -#define VIDEO_SETTINGS_BRIGHTNESS 5 -#define VIDEO_SETTINGS_CONTRAST 6 -#define VIDEO_SETTINGS_GAMMA 7 -#define VIDEO_SETTINGS_INTERLACEMETHOD 8 -// separator 9 -#define VIDEO_SETTINGS_MAKE_DEFAULT 10 - -#define VIDEO_SETTINGS_CALIBRATION 11 -#define VIDEO_SETTINGS_SOFTEN 13 -#define VIDEO_SETTINGS_SCALINGMETHOD 18 - -#define VIDEO_SETTING_VDPAU_NOISE 19 -#define VIDEO_SETTING_VDPAU_SHARPNESS 20 - -#define VIDEO_SETTINGS_NONLIN_STRETCH 21 -#define VIDEO_SETTINGS_POSTPROCESS 22 -#define VIDEO_SETTINGS_VERTICAL_SHIFT 23 -#define VIDEO_SETTINGS_DEINTERLACEMODE 24 - -#define VIDEO_SETTINGS_STEREOSCOPICMODE 25 -#define VIDEO_SETTINGS_STEREOSCOPICINVERT 26 - -void CGUIDialogVideoSettings::CreateSettings() +void CGUIDialogVideoSettings::OnSettingChanged(const CSetting *setting) { - m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml"); - // clear out any old settings - m_settings.clear(); - // create our settings - { - vector<pair<int, int> > entries; - - if (g_renderManager.Supports(VS_DEINTERLACEMODE_OFF)) - entries.push_back(make_pair(VS_DEINTERLACEMODE_OFF , 16039)); + if (setting == NULL) + return; - if (g_renderManager.Supports(VS_DEINTERLACEMODE_AUTO)) - entries.push_back(make_pair(VS_DEINTERLACEMODE_AUTO , 16040)); + CGUIDialogSettingsManualBase::OnSettingChanged(setting); - if (g_renderManager.Supports(VS_DEINTERLACEMODE_FORCE)) - entries.push_back(make_pair(VS_DEINTERLACEMODE_FORCE , 16041)); + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); - if (entries.size()) - AddSpin(VIDEO_SETTINGS_DEINTERLACEMODE, 16037, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode, entries); - } + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_VIDEO_DEINTERLACEMODE) + videoSettings.m_DeinterlaceMode = static_cast<EDEINTERLACEMODE>(static_cast<const CSettingInt*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_INTERLACEMETHOD) + videoSettings.m_InterlaceMethod = static_cast<EINTERLACEMETHOD>(static_cast<const CSettingInt*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_SCALINGMETHOD) + videoSettings.m_ScalingMethod = static_cast<ESCALINGMETHOD>(static_cast<const CSettingInt*>(setting)->GetValue()); +#ifdef HAS_VIDEO_PLAYBACK + else if (settingId == SETTING_VIDEO_CROP) + videoSettings.m_Crop = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_VIDEO_VIEW_MODE) { - vector<pair<int, int> > entries; - entries.push_back(make_pair(VS_INTERLACEMETHOD_AUTO , 16019)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_BLEND , 20131)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED, 20130)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_WEAVE , 20129)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_BOB_INVERTED , 16022)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_BOB , 16021)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DEINTERLACE , 16020)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DEINTERLACE_HALF , 16036)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_SW_BLEND , 16324)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_INVERSE_TELECINE , 16314)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL , 16311)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL , 16310)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_BOB , 16325)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF, 16318)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF , 16317)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , 16314)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BOB , 16320)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BEST , 16321)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_AUTO_ION , 16325)); - - /* remove unsupported methods */ - for(vector<pair<int, int> >::iterator it = entries.begin(); it != entries.end();) - { - if(g_renderManager.Supports((EINTERLACEMETHOD)it->first)) - it++; - else - it = entries.erase(it); - } + videoSettings.m_ViewMode = static_cast<const CSettingInt*>(setting)->GetValue(); - if (entries.size() > 1) - { - AddSpin(VIDEO_SETTINGS_INTERLACEMETHOD, 16038, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod, entries); - if (CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode == VS_DEINTERLACEMODE_OFF) - EnableSettings(VIDEO_SETTINGS_INTERLACEMETHOD, false); - } + g_renderManager.SetViewMode(videoSettings.m_ViewMode); + + m_viewModeChanged = true; + m_settingsManager->SetNumber(SETTING_VIDEO_ZOOM, videoSettings.m_CustomZoomAmount); + m_settingsManager->SetNumber(SETTING_VIDEO_PIXEL_RATIO, videoSettings.m_CustomPixelRatio); + m_settingsManager->SetNumber(SETTING_VIDEO_VERTICAL_SHIFT, videoSettings.m_CustomVerticalShift); + m_settingsManager->SetBool(SETTING_VIDEO_NONLIN_STRETCH, videoSettings.m_CustomNonLinStretch); + m_viewModeChanged = false; } + else if (settingId == SETTING_VIDEO_ZOOM || + settingId == SETTING_VIDEO_VERTICAL_SHIFT || + settingId == SETTING_VIDEO_PIXEL_RATIO || + settingId == SETTING_VIDEO_NONLIN_STRETCH) { - vector<pair<int, int> > entries; - entries.push_back(make_pair(VS_SCALINGMETHOD_NEAREST , 16301)); - entries.push_back(make_pair(VS_SCALINGMETHOD_LINEAR , 16302)); - entries.push_back(make_pair(VS_SCALINGMETHOD_CUBIC , 16303)); - entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS2 , 16304)); - entries.push_back(make_pair(VS_SCALINGMETHOD_SPLINE36_FAST , 16323)); - entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS3_FAST , 16315)); - entries.push_back(make_pair(VS_SCALINGMETHOD_SPLINE36 , 16322)); - entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS3 , 16305)); - entries.push_back(make_pair(VS_SCALINGMETHOD_SINC8 , 16306)); -// entries.push_back(make_pair(VS_SCALINGMETHOD_NEDI , ?????)); - entries.push_back(make_pair(VS_SCALINGMETHOD_BICUBIC_SOFTWARE , 16307)); - entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS_SOFTWARE , 16308)); - entries.push_back(make_pair(VS_SCALINGMETHOD_SINC_SOFTWARE , 16309)); - entries.push_back(make_pair(VS_SCALINGMETHOD_VDPAU_HARDWARE , 13120)); - entries.push_back(make_pair(VS_SCALINGMETHOD_DXVA_HARDWARE , 16319)); - entries.push_back(make_pair(VS_SCALINGMETHOD_AUTO , 16316)); - - /* remove unsupported methods */ - for(vector<pair<int, int> >::iterator it = entries.begin(); it != entries.end();) + if (settingId == SETTING_VIDEO_ZOOM) + videoSettings.m_CustomZoomAmount = static_cast<float>(static_cast<const CSettingNumber*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_VERTICAL_SHIFT) + videoSettings.m_CustomVerticalShift = static_cast<float>(static_cast<const CSettingNumber*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_PIXEL_RATIO) + videoSettings.m_CustomPixelRatio = static_cast<float>(static_cast<const CSettingNumber*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_NONLIN_STRETCH) + videoSettings.m_CustomNonLinStretch = static_cast<const CSettingBool*>(setting)->GetValue(); + + if (!m_viewModeChanged) { - if(g_renderManager.Supports((ESCALINGMETHOD)it->first)) - it++; + // try changing the view mode to custom. If it already is set to custom + // manually call the render manager + if (m_settingsManager->GetInt(SETTING_VIDEO_VIEW_MODE) != ViewModeCustom) + m_settingsManager->SetInt(SETTING_VIDEO_VIEW_MODE, ViewModeCustom); else - it = entries.erase(it); + g_renderManager.SetViewMode(videoSettings.m_ViewMode); } - - AddSpin(VIDEO_SETTINGS_SCALINGMETHOD, 16300, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod, entries); } - if (g_renderManager.Supports(RENDERFEATURE_CROP)) - AddBool(VIDEO_SETTINGS_CROP, 644, &CMediaSettings::Get().GetCurrentVideoSettings().m_Crop); - if (g_renderManager.Supports(RENDERFEATURE_STRETCH) || g_renderManager.Supports(RENDERFEATURE_PIXEL_RATIO)) + else if (settingId == SETTING_VIDEO_POSTPROCESS) + videoSettings.m_PostProcess = static_cast<const CSettingBool*>(setting)->GetValue(); + else if (settingId == SETTING_VIDEO_BRIGHTNESS) + videoSettings.m_Brightness = static_cast<float>(static_cast<const CSettingInt*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_CONTRAST) + videoSettings.m_Contrast = static_cast<float>(static_cast<const CSettingInt*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_GAMMA) + videoSettings.m_Gamma = static_cast<float>(static_cast<const CSettingInt*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_VDPAU_NOISE) + videoSettings.m_NoiseReduction = static_cast<float>(static_cast<const CSettingNumber*>(setting)->GetValue()); + else if (settingId == SETTING_VIDEO_VDPAU_SHARPNESS) + videoSettings.m_Sharpness = static_cast<float>(static_cast<const CSettingNumber*>(setting)->GetValue()); +#endif + else if (settingId == SETTING_VIDEO_STEREOSCOPICMODE) + videoSettings.m_StereoMode = static_cast<const CSettingInt*>(setting)->GetValue(); + else if (settingId == SETTING_VIDEO_STEREOSCOPICINVERT) + videoSettings.m_StereoInvert = static_cast<const CSettingBool*>(setting)->GetValue(); + + if (g_PVRManager.IsPlayingRadio() || g_PVRManager.IsPlayingTV()) + g_PVRManager.TriggerSaveChannelSettings(); +} + +void CGUIDialogVideoSettings::OnSettingAction(const CSetting *setting) +{ + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + const std::string &settingId = setting->GetId(); + if (settingId == SETTING_VIDEO_CALIBRATION) { - const int entries[] = {630, 631, 632, 633, 634, 635, 636 }; - AddSpin(VIDEO_SETTINGS_VIEW_MODE, 629, &CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode, 7, entries); + // launch calibration window + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && + g_passwordManager.CheckSettingLevelLock(CSettings::Get().GetSetting("videoscreen.guicalibration")->GetLevel())) + return; + g_windowManager.ActivateWindow(WINDOW_SCREEN_CALIBRATION); } - if (g_renderManager.Supports(RENDERFEATURE_ZOOM)) - AddSlider(VIDEO_SETTINGS_ZOOM, 216, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount, 0.5f, 0.01f, 2.0f, FormatFloat); - if (g_renderManager.Supports(RENDERFEATURE_VERTICAL_SHIFT)) - AddSlider(VIDEO_SETTINGS_VERTICAL_SHIFT, 225, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift, -2.0f, 0.01f, 2.0f, FormatFloat); - if (g_renderManager.Supports(RENDERFEATURE_PIXEL_RATIO)) - AddSlider(VIDEO_SETTINGS_PIXEL_RATIO, 217, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio, 0.5f, 0.01f, 2.0f, FormatFloat); - if (g_renderManager.Supports(RENDERFEATURE_POSTPROCESS)) - AddBool(VIDEO_SETTINGS_POSTPROCESS, 16400, &CMediaSettings::Get().GetCurrentVideoSettings().m_PostProcess); + // TODO + else if (settingId == SETTING_VIDEO_MAKE_DEFAULT) + Save(); +} -#ifdef HAS_VIDEO_PLAYBACK - if (g_renderManager.Supports(RENDERFEATURE_BRIGHTNESS)) - AddSlider(VIDEO_SETTINGS_BRIGHTNESS, 464, &CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness, 0, 1, 100, FormatInteger); - if (g_renderManager.Supports(RENDERFEATURE_CONTRAST)) - AddSlider(VIDEO_SETTINGS_CONTRAST, 465, &CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast, 0, 1, 100, FormatInteger); - if (g_renderManager.Supports(RENDERFEATURE_GAMMA)) - AddSlider(VIDEO_SETTINGS_GAMMA, 466, &CMediaSettings::Get().GetCurrentVideoSettings().m_Gamma, 0, 1, 100, FormatInteger); - if (g_renderManager.Supports(RENDERFEATURE_NOISE)) - AddSlider(VIDEO_SETTING_VDPAU_NOISE, 16312, &CMediaSettings::Get().GetCurrentVideoSettings().m_NoiseReduction, 0.0f, 0.01f, 1.0f, FormatFloat); - if (g_renderManager.Supports(RENDERFEATURE_SHARPNESS)) - AddSlider(VIDEO_SETTING_VDPAU_SHARPNESS, 16313, &CMediaSettings::Get().GetCurrentVideoSettings().m_Sharpness, -1.0f, 0.02f, 1.0f, FormatFloat); - if (g_renderManager.Supports(RENDERFEATURE_NONLINSTRETCH)) - AddBool(VIDEO_SETTINGS_NONLIN_STRETCH, 659, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomNonLinStretch); -#endif +void CGUIDialogVideoSettings::Save() +{ + if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && + !g_passwordManager.CheckSettingLevelLock(::SettingLevelExpert)) + return; - vector<pair<int, int> > stereomode; - stereomode.push_back(make_pair(RENDER_STEREO_MODE_OFF , 16316)); - stereomode.push_back(make_pair(RENDER_STEREO_MODE_SPLIT_HORIZONTAL, 36503)); - stereomode.push_back(make_pair(RENDER_STEREO_MODE_SPLIT_VERTICAL , 36504)); - AddSpin(VIDEO_SETTINGS_STEREOSCOPICMODE , 36535, &CMediaSettings::Get().GetCurrentVideoSettings().m_StereoMode, stereomode); - AddBool(VIDEO_SETTINGS_STEREOSCOPICINVERT, 36536, &CMediaSettings::Get().GetCurrentVideoSettings().m_StereoInvert); + // prompt user if they are sure + if (CGUIDialogYesNo::ShowAndGetInput(12376, 750, 0, 12377)) + { // reset the settings + CVideoDatabase db; + if (!db.Open()) + return; + db.EraseVideoSettings(); + db.Close(); - AddSeparator(8); - AddButton(VIDEO_SETTINGS_MAKE_DEFAULT, 12376); - AddButton(VIDEO_SETTINGS_CALIBRATION, 214); + CMediaSettings::Get().GetDefaultVideoSettings() = CMediaSettings::Get().GetCurrentVideoSettings(); + CMediaSettings::Get().GetDefaultVideoSettings().m_SubtitleStream = -1; + CMediaSettings::Get().GetDefaultVideoSettings().m_AudioStream = -1; + CSettings::Get().Save(); + } } -void CGUIDialogVideoSettings::OnSettingChanged(SettingInfo &setting) +void CGUIDialogVideoSettings::InitializeSettings() { - // check and update anything that needs it -#ifdef HAS_VIDEO_PLAYBACK - if (setting.id == VIDEO_SETTINGS_CROP) + CGUIDialogSettingsManualBase::InitializeSettings(); + + CSettingCategory *category = AddCategory("audiosubtitlesettings", -1); + if (category == NULL) { - // AutoCrop changes will get picked up automatically by dvdplayer + CLog::Log(LOGERROR, "CGUIDialogVideoSettings: unable to setup settings"); + return; } - else if (setting.id == VIDEO_SETTINGS_VIEW_MODE) + + // get all necessary setting groups + CSettingGroup *groupVideo = AddGroup(category); + if (groupVideo == NULL) { - g_renderManager.SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode); - UpdateSetting(VIDEO_SETTINGS_ZOOM); - UpdateSetting(VIDEO_SETTINGS_PIXEL_RATIO); - UpdateSetting(VIDEO_SETTINGS_NONLIN_STRETCH); - UpdateSetting(VIDEO_SETTINGS_VERTICAL_SHIFT); + CLog::Log(LOGERROR, "CGUIDialogVideoSettings: unable to setup settings"); + return; } - else if (setting.id == VIDEO_SETTINGS_ZOOM || setting.id == VIDEO_SETTINGS_PIXEL_RATIO - || setting.id == VIDEO_SETTINGS_NONLIN_STRETCH - || setting.id == VIDEO_SETTINGS_VERTICAL_SHIFT) + CSettingGroup *groupVideoPlayback = AddGroup(category); + if (groupVideoPlayback == NULL) { - CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom; - g_renderManager.SetViewMode(ViewModeCustom); - UpdateSetting(VIDEO_SETTINGS_VIEW_MODE); + CLog::Log(LOGERROR, "CGUIDialogVideoSettings: unable to setup settings"); + return; } - else -#endif - if (setting.id == VIDEO_SETTINGS_CALIBRATION) + CSettingGroup *groupStereoscopic = AddGroup(category); + if (groupStereoscopic == NULL) { - // launch calibration window - if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && - g_passwordManager.CheckSettingLevelLock(CSettings::Get().GetSetting("videoscreen.guicalibration")->GetLevel())) - return; - g_windowManager.ActivateWindow(WINDOW_SCREEN_CALIBRATION); + CLog::Log(LOGERROR, "CGUIDialogVideoSettings: unable to setup settings"); + return; } - else if (setting.id == VIDEO_SETTINGS_MAKE_DEFAULT) + CSettingGroup *groupSaveAsDefault = AddGroup(category); + if (groupSaveAsDefault == NULL) { - if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && - !g_passwordManager.CheckSettingLevelLock(::SettingLevelExpert)) - return; + CLog::Log(LOGERROR, "CGUIDialogVideoSettings: unable to setup settings"); + return; + } - // prompt user if they are sure - if (CGUIDialogYesNo::ShowAndGetInput(12376, 750, 0, 12377)) - { // reset the settings - CVideoDatabase db; - db.Open(); - db.EraseVideoSettings(); - db.Close(); - CMediaSettings::Get().GetDefaultVideoSettings() = CMediaSettings::Get().GetCurrentVideoSettings(); - CMediaSettings::Get().GetDefaultVideoSettings().m_SubtitleStream = -1; - CMediaSettings::Get().GetDefaultVideoSettings().m_AudioStream = -1; - CSettings::Get().Save(); - } + bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); + + CVideoSettings &videoSettings = CMediaSettings::Get().GetCurrentVideoSettings(); + + StaticIntegerSettingOptions entries; + if (g_renderManager.Supports(VS_DEINTERLACEMODE_OFF)) + entries.push_back(make_pair(16039, VS_DEINTERLACEMODE_OFF)); + if (g_renderManager.Supports(VS_DEINTERLACEMODE_AUTO)) + entries.push_back(make_pair(16040, VS_DEINTERLACEMODE_AUTO)); + if (g_renderManager.Supports(VS_DEINTERLACEMODE_FORCE)) + entries.push_back(make_pair(16041, VS_DEINTERLACEMODE_FORCE)); + if (!entries.empty()) + AddSpinner(groupVideo, SETTING_VIDEO_DEINTERLACEMODE, 16037, 0, static_cast<int>(videoSettings.m_DeinterlaceMode), entries); + + entries.clear(); + entries.push_back(make_pair(16019, VS_INTERLACEMETHOD_AUTO)); + entries.push_back(make_pair(20131, VS_INTERLACEMETHOD_RENDER_BLEND)); + entries.push_back(make_pair(20130, VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED)); + entries.push_back(make_pair(20129, VS_INTERLACEMETHOD_RENDER_WEAVE)); + entries.push_back(make_pair(16022, VS_INTERLACEMETHOD_RENDER_BOB_INVERTED)); + entries.push_back(make_pair(16021, VS_INTERLACEMETHOD_RENDER_BOB)); + entries.push_back(make_pair(16020, VS_INTERLACEMETHOD_DEINTERLACE)); + entries.push_back(make_pair(16036, VS_INTERLACEMETHOD_DEINTERLACE_HALF)); + entries.push_back(make_pair(16324, VS_INTERLACEMETHOD_SW_BLEND)); + entries.push_back(make_pair(16314, VS_INTERLACEMETHOD_INVERSE_TELECINE)); + entries.push_back(make_pair(16311, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL)); + entries.push_back(make_pair(16310, VS_INTERLACEMETHOD_VDPAU_TEMPORAL)); + entries.push_back(make_pair(16325, VS_INTERLACEMETHOD_VDPAU_BOB)); + entries.push_back(make_pair(16318, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF)); + entries.push_back(make_pair(16317, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF)); + entries.push_back(make_pair(16314, VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE)); + entries.push_back(make_pair(16320, VS_INTERLACEMETHOD_DXVA_BOB)); + entries.push_back(make_pair(16321, VS_INTERLACEMETHOD_DXVA_BEST)); + entries.push_back(make_pair(16325, VS_INTERLACEMETHOD_AUTO_ION)); + + /* remove unsupported methods */ + for (StaticIntegerSettingOptions::iterator it = entries.begin(); it != entries.end(); ) + { + if (g_renderManager.Supports((EINTERLACEMETHOD)it->second)) + it++; + else + it = entries.erase(it); } - else if (setting.id == VIDEO_SETTINGS_DEINTERLACEMODE) + + if (!entries.empty()) { - EnableSettings(VIDEO_SETTINGS_INTERLACEMETHOD, CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode != VS_DEINTERLACEMODE_OFF); + CSettingInt *settingInterlaceMethod = AddSpinner(groupVideo, SETTING_VIDEO_INTERLACEMETHOD, 16038, 0, static_cast<int>(videoSettings.m_InterlaceMethod), entries); + + CSettingDependency dependencyDeinterlaceModeOff(SettingDependencyTypeEnable, m_settingsManager); + dependencyDeinterlaceModeOff.And() + ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_DEINTERLACEMODE, "0", SettingDependencyOperatorEquals, true, m_settingsManager))); + SettingDependencies depsDeinterlaceModeOff; + depsDeinterlaceModeOff.push_back(dependencyDeinterlaceModeOff); + settingInterlaceMethod->SetDependencies(depsDeinterlaceModeOff); } - if (g_PVRManager.IsPlayingRadio() || g_PVRManager.IsPlayingTV()) - g_PVRManager.TriggerSaveChannelSettings(); -} + entries.clear(); + entries.push_back(make_pair(16301, VS_SCALINGMETHOD_NEAREST)); + entries.push_back(make_pair(16302, VS_SCALINGMETHOD_LINEAR)); + entries.push_back(make_pair(16303, VS_SCALINGMETHOD_CUBIC )); + entries.push_back(make_pair(16304, VS_SCALINGMETHOD_LANCZOS2)); + entries.push_back(make_pair(16323, VS_SCALINGMETHOD_SPLINE36_FAST)); + entries.push_back(make_pair(16315, VS_SCALINGMETHOD_LANCZOS3_FAST)); + entries.push_back(make_pair(16322, VS_SCALINGMETHOD_SPLINE36)); + entries.push_back(make_pair(16305, VS_SCALINGMETHOD_LANCZOS3)); + entries.push_back(make_pair(16306, VS_SCALINGMETHOD_SINC8)); +// entries.push_back(make_pair(?????, VS_SCALINGMETHOD_NEDI)); + entries.push_back(make_pair(16307, VS_SCALINGMETHOD_BICUBIC_SOFTWARE)); + entries.push_back(make_pair(16308, VS_SCALINGMETHOD_LANCZOS_SOFTWARE)); + entries.push_back(make_pair(16309, VS_SCALINGMETHOD_SINC_SOFTWARE)); + entries.push_back(make_pair(13120, VS_SCALINGMETHOD_VDPAU_HARDWARE)); + entries.push_back(make_pair(16319, VS_SCALINGMETHOD_DXVA_HARDWARE)); + entries.push_back(make_pair(16316, VS_SCALINGMETHOD_AUTO)); -CStdString CGUIDialogVideoSettings::FormatInteger(float value, float minimum) -{ - return StringUtils::Format("%i", MathUtils::round_int(value)); -} + /* remove unsupported methods */ + for(StaticIntegerSettingOptions::iterator it = entries.begin(); it != entries.end(); ) + { + if (g_renderManager.Supports((ESCALINGMETHOD)it->second)) + it++; + else + it = entries.erase(it); + } -CStdString CGUIDialogVideoSettings::FormatFloat(float value, float minimum) -{ - return StringUtils::Format("%2.2f", value); -} + AddSpinner(groupVideo, SETTING_VIDEO_SCALINGMETHOD, 16300, 0, static_cast<int>(videoSettings.m_ScalingMethod), entries); +#ifdef HAS_VIDEO_PLAYBACK + if (g_renderManager.Supports(RENDERFEATURE_CROP)) + AddToggle(groupVideo, SETTING_VIDEO_CROP, 644, 0, videoSettings.m_Crop); + + if (g_renderManager.Supports(RENDERFEATURE_STRETCH) || g_renderManager.Supports(RENDERFEATURE_PIXEL_RATIO)) + { + entries.clear(); + for (int i = 0; i < 7; ++i) + entries.push_back(make_pair(630 + i, i)); + AddSpinner(groupVideo, SETTING_VIDEO_VIEW_MODE, 629, 0, videoSettings.m_ViewMode, entries); + } + if (g_renderManager.Supports(RENDERFEATURE_ZOOM)) + AddSlider(groupVideo, SETTING_VIDEO_ZOOM, 216, 0, videoSettings.m_CustomZoomAmount, "%2.2f", 0.5f, 0.01f, 2.0f, -1, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_VERTICAL_SHIFT)) + AddSlider(groupVideo, SETTING_VIDEO_VERTICAL_SHIFT, 225, 0, videoSettings.m_CustomVerticalShift, "%2.2f", -2.0f, 0.01f, 2.0f, -1, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_PIXEL_RATIO)) + AddSlider(groupVideo, SETTING_VIDEO_PIXEL_RATIO, 217, 0, videoSettings.m_CustomPixelRatio, "%2.2f", 0.5f, 0.01f, 2.0f, -1, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_POSTPROCESS)) + AddToggle(groupVideo, SETTING_VIDEO_POSTPROCESS, 16400, 0, videoSettings.m_PostProcess); + if (g_renderManager.Supports(RENDERFEATURE_BRIGHTNESS)) + AddPercentageSlider(groupVideoPlayback, SETTING_VIDEO_BRIGHTNESS, 464, 0, static_cast<int>(videoSettings.m_Brightness), 14047, 1, 464, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_CONTRAST)) + AddPercentageSlider(groupVideoPlayback, SETTING_VIDEO_CONTRAST, 465, 0, static_cast<int>(videoSettings.m_Contrast), 14047, 1, 464, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_GAMMA)) + AddPercentageSlider(groupVideoPlayback, SETTING_VIDEO_GAMMA, 466, 0, static_cast<int>(videoSettings.m_Gamma), 14047, 1, 464, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_NOISE)) + AddSlider(groupVideoPlayback, SETTING_VIDEO_VDPAU_NOISE, 16312, 0, videoSettings.m_NoiseReduction, "%2.2f", 0.0f, 0.01f, 1.0f, -1, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_SHARPNESS)) + AddSlider(groupVideoPlayback, SETTING_VIDEO_VDPAU_SHARPNESS, 16313, 0, videoSettings.m_Sharpness, "%2.2f", -1.0f, 0.02f, 1.0f, -1, usePopup); + if (g_renderManager.Supports(RENDERFEATURE_NONLINSTRETCH)) + AddToggle(groupVideoPlayback, SETTING_VIDEO_NONLIN_STRETCH, 659, 0, videoSettings.m_CustomNonLinStretch); +#endif + + // stereoscopic settings + entries.clear(); + entries.push_back(make_pair(16316, RENDER_STEREO_MODE_OFF)); + entries.push_back(make_pair(36503, RENDER_STEREO_MODE_SPLIT_HORIZONTAL)); + entries.push_back(make_pair(36504, RENDER_STEREO_MODE_SPLIT_VERTICAL)); + AddSpinner(groupStereoscopic, SETTING_VIDEO_STEREOSCOPICMODE , 36535, 0, videoSettings.m_StereoMode, entries); + AddToggle(groupStereoscopic, SETTING_VIDEO_STEREOSCOPICINVERT, 36536, 0, videoSettings.m_StereoInvert); + + // general settings + AddButton(groupSaveAsDefault, SETTING_VIDEO_MAKE_DEFAULT, 12376, 0); + AddButton(groupSaveAsDefault, SETTING_VIDEO_CALIBRATION, 214, 0); +} diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.h b/xbmc/video/dialogs/GUIDialogVideoSettings.h index 2617ff9147..cb629da7ff 100644 --- a/xbmc/video/dialogs/GUIDialogVideoSettings.h +++ b/xbmc/video/dialogs/GUIDialogVideoSettings.h @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2005-2014 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -20,20 +20,26 @@ * */ -#include "settings/dialogs/GUIDialogSettings.h" +#include "settings/dialogs/GUIDialogSettingsManualBase.h" -class CGUIDialogVideoSettings : - public CGUIDialogSettings +class CGUIDialogVideoSettings : public CGUIDialogSettingsManualBase { public: - CGUIDialogVideoSettings(void); - virtual ~CGUIDialogVideoSettings(void); - - static CStdString FormatInteger(float value, float minimum); - static CStdString FormatFloat(float value, float minimum); + CGUIDialogVideoSettings(); + virtual ~CGUIDialogVideoSettings(); protected: - virtual void CreateSettings(); - virtual void OnSettingChanged(SettingInfo &setting); -}; + // implementations of ISettingCallback + virtual void OnSettingChanged(const CSetting *setting); + virtual void OnSettingAction(const CSetting *setting); + + // specialization of CGUIDialogSettingsBase + virtual bool AllowResettingSettings() const { return false; } + virtual void Save(); + // specialization of CGUIDialogSettingsManualBase + virtual void InitializeSettings(); + +private: + bool m_viewModeChanged; +}; diff --git a/xbmc/win32/Win32DelayedDllLoad.cpp b/xbmc/win32/Win32DelayedDllLoad.cpp index def089efd4..61bdbb27eb 100644 --- a/xbmc/win32/Win32DelayedDllLoad.cpp +++ b/xbmc/win32/Win32DelayedDllLoad.cpp @@ -48,12 +48,6 @@ FARPROC WINAPI delayHookNotifyFunc (unsigned dliNotify, PDelayLoadInfo pdli) HMODULE hMod = LoadLibraryEx(strDll.c_str(), 0, LOAD_WITH_ALTERED_SEARCH_PATH); return (FARPROC)hMod; } - if (stricmp(pdli->szDll, "libsamplerate-0.dll") == 0) - { - std::string strDll = CSpecialProtocol::TranslatePath("special://xbmcbin/system/libsamplerate-0.dll"); - HMODULE hMod = LoadLibraryEx(strDll.c_str(), 0, LOAD_WITH_ALTERED_SEARCH_PATH); - return (FARPROC)hMod; - } if (stricmp(pdli->szDll, "dnssd.dll") == 0) { std::string strDll = CSpecialProtocol::TranslatePath("special://xbmcbin/system/dnssd.dll"); |