Merge commit 'origin/bug_351_softwaremanager_save_config_before_backup' into experimental
authorMladen Horvat <acid-burn@opendreambox.org>
Wed, 9 Dec 2009 06:43:56 +0000 (07:43 +0100)
committerMladen Horvat <acid-burn@opendreambox.org>
Wed, 9 Dec 2009 06:43:56 +0000 (07:43 +0100)
140 files changed:
RecordTimer.py
configure.ac
data/menu.xml
data/skin_default.xml
data/skin_default/icons/dish.png
lib/dvb/decoder.cpp
lib/dvb/decoder.h
lib/dvb/dvb.cpp
lib/dvb/pvrparse.cpp
lib/dvb/tstools.cpp
lib/python/Components/ChoiceList.py [changed mode: 0644->0755]
lib/python/Components/ConfigList.py [changed mode: 0644->0755]
lib/python/Components/EpgList.py [changed mode: 0644->0755]
lib/python/Components/FileList.py
lib/python/Components/Harddisk.py
lib/python/Components/MediaPlayer.py [changed mode: 0644->0755]
lib/python/Components/NimManager.py
lib/python/Components/ParentalControl.py [changed mode: 0644->0755]
lib/python/Components/SelectionList.py [changed mode: 0644->0755]
lib/python/Components/ServiceList.py [changed mode: 0644->0755]
lib/python/Components/SystemInfo.py
lib/python/Components/TimerList.py [changed mode: 0644->0755]
lib/python/Components/UsageConfig.py
lib/python/Components/config.py
lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/CutListEditor/plugin.py
lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am
lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py [changed mode: 0644->0755]
lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/plugin.py [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am
lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml [changed mode: 0644->0755]
lib/python/Plugins/Plugin.py
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml
lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg [deleted file]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am
lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg [deleted file]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml
lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am
lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg [deleted file]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg [deleted file]
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg [deleted file]
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am
lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg [deleted file]
lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am
lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py
lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
lib/python/Screens/EpgSelection.py
lib/python/Screens/EventView.py
lib/python/Screens/InfoBar.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Screens/LanguageSelection.py [changed mode: 0644->0755]
lib/python/Screens/LocationBox.py
lib/python/Screens/Makefile.am
lib/python/Screens/Menu.py
lib/python/Screens/MessageBox.py
lib/python/Screens/MovieSelection.py
lib/python/Screens/NetworkSetup.py
lib/python/Screens/PluginBrowser.py
lib/python/Screens/RdsDisplay.py [changed mode: 0644->0755]
lib/python/Screens/RecordPaths.py [new file with mode: 0644]
lib/python/Screens/Satconfig.py
lib/python/Screens/ScanSetup.py
lib/python/Screens/Scart.py
lib/python/Screens/SleepTimerEdit.py
lib/python/Screens/TaskView.py
lib/python/Screens/TimerEdit.py
lib/python/Screens/TimerEntry.py
lib/python/Screens/VirtualKeyBoard.py
lib/python/Screens/Wizard.py
lib/python/Tools/Directories.py
lib/service/servicedvb.cpp
lib/service/servicedvb.h
lib/service/servicemp3.cpp
lib/service/servicemp3.h
lib/service/servicexine.cpp
mytest.py
skin.py [changed mode: 0644->0755]

index 4907f64e75a80d05635a91b5b71c28c9ede2ac56..f670417a5eddca05f8322c01b3b60c88bb372141 100644 (file)
@@ -2,6 +2,7 @@ from enigma import eEPGCache, getBestPlayableServiceReference, \
        eServiceReference, iRecordableService, quitMainloop
 
 from Components.config import config
+from Components.UsageConfig import defaultMoviePath
 from Components.TimerSanityCheck import TimerSanityCheck
 
 from Screens.MessageBox import MessageBox
@@ -141,11 +142,13 @@ class RecordTimerEntry(timer.TimerEntry, object):
                if config.recording.ascii_filenames.value:
                        filename = ASCIItranslit.legacyEncode(filename)
 
-               if self.dirname and not Directories.fileExists(self.dirname, 'w'):
-                       self.dirnameHadToFallback = True
-                       self.Filename = Directories.getRecordingFilename(filename, None)
+               if not self.dirname or not Directories.fileExists(self.dirname, 'w'):
+                       if self.dirname:
+                               self.dirnameHadToFallback = True
+                       dirname = defaultMoviePath()
                else:
-                       self.Filename = Directories.getRecordingFilename(filename, self.dirname)
+                       dirname = self.dirname
+               self.Filename = Directories.getRecordingFilename(filename, dirname)
                self.log(0, "Filename calculated as: '%s'" % self.Filename)
                #begin_date + " - " + service_name + description)
 
index 5e403debdedc682c4dac664b90cda50ef0ede108..1bda10ea758a0e3b2b0d31f8bd628c4745f282d7 100755 (executable)
@@ -176,6 +176,7 @@ lib/python/Plugins/SystemPlugins/VideoTune/meta/Makefile
 lib/python/Plugins/SystemPlugins/Videomode/Makefile
 lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile
 lib/python/Plugins/SystemPlugins/WirelessLan/Makefile
+lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile
 lib/python/Tools/Makefile
 lib/service/Makefile
 lib/components/Makefile
index c7fb8897eb03d0a55fde27560fbad6a383b31e7a..59195f150dc1cf3da3c875f8b7213951bc313aea 100644 (file)
@@ -70,7 +70,7 @@
                                        <item level="1" text="Device Setup..." entryID="device_setup"><screen module="NetworkSetup" screen="NetworkAdapterSelection"/></item>
                                        <item level="1" text="Nameserver Setup..." entryID="dns_setup"><screen module="NetworkSetup" screen="NameserverSetup"/></item>
                                </menu>-->
-                               <item level="2" text="Timeshift path..." entryId="timeshift_path"><screen module="LocationBox" screen="TimeshiftLocationBox" /></item>
+                               <item level="2" text="Recording paths..." entryId="RecordPaths"><screen module="RecordPaths" screen="RecordPathsSettings" /></item>
                        </menu>
                        <item weight="10" level="1" text="Common Interface" entryID="ci_setup" requires="CommonInterface"><screen module="Ci" screen="CiSelection" /></item>
                        <item weight="15" level="0" text="Parental control" entryID="parental_setup"><screen module="ParentalControlSetup" screen="ParentalControlSetup" /></item>
@@ -104,6 +104,7 @@ self.session.openWithCallback(msgClosed, FactoryReset)
                        <item text="Standby" entryID="standby"><screen module="Standby" screen="Standby"/></item>
                        <item text="Restart" entryID="restart"><screen module="Standby" screen="TryQuitMainloop">2</screen></item>
                        <item level="2" text="Restart GUI" entryID="restart_enigma"><screen module="Standby" screen="TryQuitMainloop">3</screen></item>
-                       <item text="Deep Standby" entryID="deep_standby"><screen module="Standby" screen="TryQuitMainloop">1</screen></item>
+                       <item text="Deep Standby" requires="DeepstandbySupport" entryID="deep_standby"><screen module="Standby" screen="TryQuitMainloop">1</screen></item>
+                       <item text="Shutdown" requires="!DeepstandbySupport" entryID="deep_standby"><screen module="Standby" screen="TryQuitMainloop">1</screen></item>
                </menu>
 </menu>
index 16504abf6d4e4a81fe455f7f4df4d258fab505c7..71f579cb2f551be595b40126997b17532ab0449c 100755 (executable)
@@ -43,7 +43,9 @@
                <widget source="Adaptertext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
                <widget source="Adapter" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
                <widget source="introduction2" render="Label" position="10,380" size="540,21" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>
-               <widget name="VKeyIcon" pixmap="skin_default/buttons/key_text.png" position="10,380" zPosition="10" size="35,25" transparent="1" alphatest="on" />
+               <widget source="VKeyIcon" render="Pixmap" pixmap="skin_default/buttons/key_text.png" position="10,380" zPosition="10" size="35,25" transparent="1" alphatest="on" >
+                       <convert type="ConditionalShowHide" />
+               </widget>
                <widget name="HelpWindow" pixmap="skin_default/vkey_icon.png" position="160,315" zPosition="1" size="1,1" transparent="1" alphatest="on" />
        </screen>
 
@@ -248,7 +250,7 @@ self.instance.move(ePoint((720-wsizex)/2, (576-wsizey)/(count &gt; 7 and 2 or 3)
                        <widget name="arrowup2" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="on"/>
        </screen>
        <!-- Dish -->
-       <screen name="Dish" flags="wfNoBorder" position="300,100" size="130,160" title="Dish" zPosition="-1" backgroundColor="transparent">
+       <screen name="Dish" flags="wfNoBorder" position="300,100" size="130,160" title="Dish" zPosition="100" backgroundColor="transparent">
                <widget name="Dishpixmap" pixmap="skin_default/icons/dish.png" position="0,0" size="130,160" alphatest="off" />
        </screen>
        <!-- EPG Selection - Single -->
index f3c6548d61f78f3a475f8aa35f75efd7bbc17acf..6148e07c853e70116b2517054dea6b863e9df96a 100644 (file)
Binary files a/data/skin_default/icons/dish.png and b/data/skin_default/icons/dish.png differ
index 710cc421ec59a6a476249c8bd6917df35639e7fc..ef8dadc387bdcb59b306ab573d83ebe69e836b31 100644 (file)
@@ -1045,9 +1045,9 @@ int eTSMPEGDecoder::setState()
 int eTSMPEGDecoder::m_pcm_delay=-1,
        eTSMPEGDecoder::m_ac3_delay=-1;
 
-RESULT eTSMPEGDecoder::setPCMDelay(int delay)
+RESULT eTSMPEGDecoder::setHwPCMDelay(int delay)
 {
-       if (m_decoder == 0 && delay != m_pcm_delay )
+       if (delay != m_pcm_delay )
        {
                FILE *fp = fopen("/proc/stb/audio/audio_delay_pcm", "w");
                if (fp)
@@ -1061,9 +1061,9 @@ RESULT eTSMPEGDecoder::setPCMDelay(int delay)
        return -1;
 }
 
-RESULT eTSMPEGDecoder::setAC3Delay(int delay)
+RESULT eTSMPEGDecoder::setHwAC3Delay(int delay)
 {
-       if ( m_decoder == 0 && delay != m_ac3_delay )
+       if ( delay != m_ac3_delay )
        {
                FILE *fp = fopen("/proc/stb/audio/audio_delay_bitstream", "w");
                if (fp)
@@ -1077,6 +1077,17 @@ RESULT eTSMPEGDecoder::setAC3Delay(int delay)
        return -1;
 }
 
+
+RESULT eTSMPEGDecoder::setPCMDelay(int delay)
+{
+       return m_decoder == 0 ? setHwPCMDelay(delay) : -1;
+}
+
+RESULT eTSMPEGDecoder::setAC3Delay(int delay)
+{
+       return m_decoder == 0 ? setHwAC3Delay(delay) : -1;
+}
+
 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder)
        : m_demux(demux), 
                m_vpid(-1), m_vtype(-1), m_apid(-1), m_atype(-1), m_pcrpid(-1), m_textpid(-1),
index b53638b59ab0ffb757063f3f7533cdf621c5d974..3a0fbac1e58f27c303a7d28202884a6c9de7bc53 100644 (file)
@@ -193,6 +193,8 @@ public:
        int getVideoProgressive();
        int getVideoFrameRate();
        int getVideoAspect();
+       static RESULT setHwPCMDelay(int delay);
+       static RESULT setHwAC3Delay(int delay);
 };
 
 #endif
index 894287e84f18845b6e06d39a467033a1d62688fa..a8dfb193e9f30a9a2a989e62f0efe5ab274a3cad 100644 (file)
@@ -1462,12 +1462,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                        continue;
                }
                
-               size_t iframe_len;
-                       /* try to align to iframe */
-               int direction = pts < 0 ? -1 : 1;
-               m_tstools.findFrame(offset, iframe_len, direction);
-
-               eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx (skipped additional %d frames due to iframe re-align)", relative, pts, offset, direction);
+               eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx", relative, pts, offset);
                current_offset = align(offset, blocksize); /* in case tstools return non-aligned offset */
        }
 
index 1393bf77847a6ec384bba54b0bf31cd4fc8cd25a..5cdecbd610095ec2172b811454f0b71ec1013ed6 100644 (file)
@@ -244,6 +244,7 @@ off_t eMPEGStreamInformation::getAccessPoint(pts_t ts, int marg)
        off_t last = 0;
        off_t last2 = 0;
        pts_t lastc = 0;
+       ts += 1; // Add rounding error margin
        for (std::map<off_t, pts_t>::const_iterator i(m_access_points.begin()); i != m_access_points.end(); ++i)
        {
                pts_t delta = getDelta(i->first);
index a9eef4067e703bdd3db650f6e16fd8fb078226c5..2e5c5665d9e7a01bb15508078dbc2c5264e55ca6 100644 (file)
@@ -652,18 +652,23 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram
 
 int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int frame_types)
 {
-       int nr_frames = 0;
+       int nr_frames, direction;
 //     eDebug("trying to move %d frames at %llx", distance, offset);
        
        frame_types = frametypeI; /* TODO: intelligent "allow IP frames when not crossing an I-Frame */
 
-       int direction = distance > 0 ? 0 : -1;
-       distance = abs(distance);
-       
        off_t new_offset = offset;
        size_t new_len = len;
        int first = 1;
 
+       if (distance > 0) {
+               direction = 0;
+                nr_frames = 0;
+        } else {
+               direction = -1;
+                nr_frames = -1;
+               distance = -distance+1;
+        }      
        while (distance > 0)
        {
                int dir = direction;
@@ -677,12 +682,18 @@ int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int
                
 //             eDebug("we moved %d, %d to go frames (now at %llx)", dir, distance, new_offset);
 
-               if (distance >= 0 || first)
+               if (distance >= 0 || direction == 0)
                {
                        first = 0;
                        offset = new_offset;
                        len = new_len;
                        nr_frames += abs(dir);
+               } 
+               else if (first) {
+                       first = 0;
+                       offset = new_offset;
+                       len = new_len;
+                       nr_frames += abs(dir) + distance; // never jump forward during rewind
                }
        }
 
old mode 100644 (file)
new mode 100755 (executable)
index fe505c2..4700e9e
@@ -1,5 +1,5 @@
 from MenuList import MenuList
-from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
+from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename
 from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont
 from Tools.LoadPixmap import LoadPixmap
 
@@ -10,7 +10,7 @@ def ChoiceEntryComponent(key, text):
        else:
                res.append((eListboxPythonMultiContent.TYPE_TEXT, 45, 00, 800, 25, 0, RT_HALIGN_LEFT, text[0]))
        
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/key_" + key + ".png"))
+               png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/key_" + key + ".png"))
                if png is not None:
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 0, 35, 25, png))
        
old mode 100644 (file)
new mode 100755 (executable)
index 00949e2..418a1b6
@@ -1,7 +1,7 @@
 from HTMLComponent import HTMLComponent
 from GUIComponent import GUIComponent
-from config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS, ConfigElement
-from Components.ActionMap import NumberActionMap
+from config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS, ConfigElement, ConfigText, ConfigPassword
+from Components.ActionMap import NumberActionMap, ActionMap
 from enigma import eListbox, eListboxPythonConfigContent, eRCInput, eTimer
 from Screens.MessageBox import MessageBox
 
@@ -66,6 +66,7 @@ class ConfigList(HTMLComponent, GUIComponent, object):
                self.current = self.getCurrent()
                if self.current:
                        self.current[1].onSelect(self.session)
+
                for x in self.onSelectionChanged:
                        x()
 
@@ -127,13 +128,52 @@ class ConfigListScreen:
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1) # to prevent left/right overriding the listbox
+
+               self["VirtualKB"] = ActionMap(["VirtualKeyboardActions"],
+               {
+                       "showVirtualKeyboard": self.KeyText,
+               }, -2)
+               self["VirtualKB"].setEnabled(False)
                
                self["config"] = ConfigList(list, session = session)
+               
                if on_change is not None:
                        self.__changed = on_change
                else:
                        self.__changed = lambda: None
-
+               
+               if not self.handleInputHelpers in self["config"].onSelectionChanged:
+                       self["config"].onSelectionChanged.append(self.handleInputHelpers)
+
+       def handleInputHelpers(self):
+               if self["config"].getCurrent() is not None:
+                       if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword):
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(True)
+                                       self["VKeyIcon"].boolean = True
+                               if self.has_key("HelpWindow"):
+                                       if self["config"].getCurrent()[1].help_window.instance is not None:
+                                               helpwindowpos = self["HelpWindow"].getPosition()
+                                               from enigma import ePoint
+                                               self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                       else:
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(False)
+                                       self["VKeyIcon"].boolean = False
+               else:
+                       if self.has_key("VKeyIcon"):
+                               self["VirtualKB"].setEnabled(False)
+                               self["VKeyIcon"].boolean = False
+
+       def KeyText(self):
+               from Screens.VirtualKeyBoard import VirtualKeyBoard
+               self.session.openWithCallback(self.VirtualKeyBoardCallback, VirtualKeyBoard, title = self["config"].getCurrent()[0], text = self["config"].getCurrent()[1].getValue())
+
+       def VirtualKeyBoardCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       self["config"].getCurrent()[1].setValue(callback)
+                       self["config"].invalidate(self["config"].getCurrent())
+                       
        def keyOK(self):
                self["config"].handleKey(KEY_OK)
 
old mode 100644 (file)
new mode 100755 (executable)
index 59f9262..41cd1b2
@@ -8,7 +8,7 @@ from Tools.LoadPixmap import LoadPixmap
 
 from time import localtime, time
 from ServiceReference import ServiceReference
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 
 EPG_TYPE_SINGLE = 0
 EPG_TYPE_MULTI = 1
@@ -53,11 +53,11 @@ class EPGList(HTMLComponent, GUIComponent):
                        assert(type == EPG_TYPE_SIMILAR)
                        self.l.setBuildFunc(self.buildSimilarEntry)
                self.epgcache = eEPGCache.getInstance()
-               self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png'))
-               self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png'))
-               self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png'))
-               self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png'))
-               self.clock_prepost_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_prepost.png'))
+               self.clock_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock.png'))
+               self.clock_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_add.png'))
+               self.clock_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_pre.png'))
+               self.clock_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_post.png'))
+               self.clock_prepost_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_prepost.png'))
 
        def getEventFromId(self, service, eventid):
                event = None
index 38b08547c0a97d1e7c9238c361cf21361fc34be5..222512eab861180ef3d26810040442ac4af63b7c 100755 (executable)
@@ -3,7 +3,7 @@ from os import path as os_path, listdir
 from MenuList import MenuList
 from Components.Harddisk import harddiskmanager
 
-from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
+from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename, fileExists
 
 from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \
        eServiceReference, eServiceCenter, gFont
@@ -23,7 +23,6 @@ EXTENSIONS = {
                "ts": "movie",
                "avi": "movie",
                "divx": "movie",
-               "m4v": "movie",
                "mpg": "movie",
                "mpeg": "movie",
                "mkv": "movie",
@@ -35,12 +34,12 @@ def FileEntryComponent(name, absolute = None, isDir = False):
        res = [ (absolute, isDir) ]
        res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
        if isDir:
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png"))
+               png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png"))
        else:
                extension = name.split('.')
                extension = extension[-1].lower()
                if EXTENSIONS.has_key(extension):
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png"))
+                       png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png"))
                else:
                        png = None
        if png is not None:
@@ -160,8 +159,11 @@ class FileList(MenuList):
                        directories.sort()
                        files.sort()
                else:
-                       if os_path.exists(directory):
-                               files = listdir(directory)
+                       if fileExists(directory):
+                               try:
+                                       files = listdir(directory)
+                               except:
+                                       files = []
                                files.sort()
                                tmpfiles = files[:]
                                for x in tmpfiles:
@@ -256,12 +258,12 @@ def MultiFileSelectEntryComponent(name, absolute = None, isDir = False, selected
        res = [ (absolute, isDir, selected, name) ]
        res.append((eListboxPythonMultiContent.TYPE_TEXT, 55, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
        if isDir:
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png"))
+               png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png"))
        else:
                extension = name.split('.')
                extension = extension[-1].lower()
                if EXTENSIONS.has_key(extension):
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png"))
+                       png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png"))
                else:
                        png = None
        if png is not None:
@@ -269,10 +271,10 @@ def MultiFileSelectEntryComponent(name, absolute = None, isDir = False, selected
 
        if not name.startswith('<'):
                if selected is False:
-                       icon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_off.png"))
+                       icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_off.png"))
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon))
                else:
-                       icon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png"))
+                       icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png"))
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon))
        
        return res
@@ -374,8 +376,11 @@ class MultiFileSelectList(FileList):
                        directories.sort()
                        files.sort()
                else:
-                       if os_path.exists(directory):
-                               files = listdir(directory)
+                       if fileExists(directory):
+                               try:
+                                       files = listdir(directory)
+                               except:
+                                       files = []
                                files.sort()
                                tmpfiles = files[:]
                                for x in tmpfiles:
index 2efdb68f6a1c759180870b460783e2edde5e35e9..03f574f3dbb207e60e6f1c6a7e5ad6796461c0bc 100755 (executable)
@@ -290,7 +290,10 @@ class Harddisk:
        # any access has been made to the disc. If there has been no access over a specifed time,
        # we set the hdd into standby.
        def readStats(self):
-               l = readFile("/sys/block/%s/stat" % self.device)
+               try:
+                       l = open("/sys/block/%s/stat" % self.device).read()
+               except IOError:
+                       return -1,-1
                (nr_read, _, _, _, nr_write) = l.split()[:5]
                return int(nr_read), int(nr_write)
 
@@ -319,7 +322,7 @@ class Harddisk:
                l = sum(stats)
                print "sum", l, "prev_sum", self.last_stat
 
-               if l != self.last_stat: # access
+               if l != self.last_stat and l >= 0: # access
                        print "hdd was accessed since previous check!"
                        self.last_stat = l
                        self.last_access = t
old mode 100644 (file)
new mode 100755 (executable)
index 12f2727..5583b22
@@ -1,6 +1,6 @@
 from MenuList import MenuList
 
-from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
+from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename
 from os import path
 
 from enigma import eListboxPythonMultiContent, RT_VALIGN_CENTER, gFont, eServiceCenter
@@ -14,11 +14,11 @@ STATE_REWIND = 3
 STATE_FORWARD = 4
 STATE_NONE = 5
 
-PlayIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_play.png"))
-PauseIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_pause.png"))
-StopIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_stop.png"))
-RewindIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_rewind.png"))
-ForwardIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_forward.png"))
+PlayIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_play.png"))
+PauseIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_pause.png"))
+StopIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_stop.png"))
+RewindIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_rewind.png"))
+ForwardIcon = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_forward.png"))
 
 def PlaylistEntryComponent(serviceref, state):
        res = [ serviceref ]
index 05204a74c3b51795db5e125cba992375e891c126..78e17bb7233505e5e5c77f1674cdbbe56b25ae05 100644 (file)
@@ -947,7 +947,7 @@ def InitNimManager(nimmgr):
 
        lnb_choices = {
                "universal_lnb": _("Universal LNB"),
-#              "unicable": _("Unicable"),
+               "unicable": _("Unicable"),
                "c_band": _("C-Band"),
                "user_defined": _("User defined")}
 
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index 08af7d0..1c5423f
@@ -1,9 +1,9 @@
 from MenuList import MenuList
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT
 from Tools.LoadPixmap import LoadPixmap
 
-selectionpng = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/selectioncross.png"))
+selectionpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/selectioncross.png"))
 
 def SelectionEntryComponent(description, value, index, selected):
        res = [
old mode 100644 (file)
new mode 100755 (executable)
index b0283c1..6095812
@@ -5,7 +5,7 @@ from skin import parseColor, parseFont
 from enigma import eListboxServiceContent, eListbox, eServiceCenter, eServiceReference, gFont, eRect
 from Tools.LoadPixmap import LoadPixmap
 
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 
 class ServiceList(HTMLComponent, GUIComponent):
        MODE_NORMAL = 0
@@ -15,27 +15,27 @@ class ServiceList(HTMLComponent, GUIComponent):
                GUIComponent.__init__(self)
                self.l = eListboxServiceContent()
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/folder.png"))
+               pic = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png"))
                if pic:
                        self.l.setPixmap(self.l.picFolder, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/marker.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png"))
                if pic:
                        self.l.setPixmap(self.l.picMarker, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_s-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picDVB_S, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_c-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picDVB_C, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_t-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picDVB_T, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_service_group-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picServiceGroup, pic)
 
index d2b405a287734b81539589445d20eaea7fbbe587..f9c4065fa951e2f5d2d595b52bc0775b2b896843 100644 (file)
@@ -1,5 +1,6 @@
 from enigma import eDVBResourceManager
 from Tools.Directories import fileExists
+from Tools.HardwareInfo import HardwareInfo
 
 SystemInfo = { }
 
@@ -27,3 +28,4 @@ def countFrontpanelLEDs():
 SystemInfo["NumFrontpanelLEDs"] = countFrontpanelLEDs()
 SystemInfo["FrontpanelDisplay"] = fileExists("/dev/dbox/oled0") or fileExists("/dev/dbox/lcd0")
 SystemInfo["FrontpanelDisplayGrayscale"] = fileExists("/dev/dbox/oled0")
+SystemInfo["DeepstandbySupport"] = HardwareInfo().get_device_name() != "dm800"
old mode 100644 (file)
new mode 100755 (executable)
index 44a7eb4..2a7405d
@@ -7,7 +7,7 @@ from enigma import eListboxPythonMultiContent, eListbox, gFont, \
        RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_VALIGN_CENTER
 from Tools.LoadPixmap import LoadPixmap
 from timer import TimerEntry
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 
 class TimerList(HTMLComponent, GUIComponent, object):
 #
@@ -65,7 +65,7 @@ class TimerList(HTMLComponent, GUIComponent, object):
                res.append((eListboxPythonMultiContent.TYPE_TEXT, width-150, 50, 150, 20, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, state))
 
                if timer.disabled:
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/redx.png"))
+                       png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/redx.png"))
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 490, 5, 40, 40, png))
                return res
 
index 6fcab8bccd615373a99a94fd4a603897678fc0fb..680b5944cdef63700b8214bfaa7dc7e1a07d0394 100644 (file)
@@ -1,5 +1,6 @@
 from Components.Harddisk import harddiskmanager
 from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet, ConfigLocations
+from Tools.Directories import resolveFilename, SCOPE_HDD
 from enigma import Misc_Options, setTunerTypePriorityOrder;
 from SystemInfo import SystemInfo
 import os
@@ -30,8 +31,11 @@ def InitUsageConfig():
                ("standard", _("standard")), ("swap", _("swap PiP and main picture")),
                ("swapstop", _("move PiP to main picture")), ("stop", _("stop PiP")) ])
 
+       config.usage.default_path = ConfigText(default = resolveFilename(SCOPE_HDD))
+       config.usage.timer_path = ConfigText(default = "<default>")
+       config.usage.instantrec_path = ConfigText(default = "<default>")
+       config.usage.timeshift_path = ConfigText(default = "/media/hdd/")
        config.usage.allowed_timeshift_paths = ConfigLocations(default = ["/media/hdd/"])
-       config.usage.timeshift_path = ConfigText(default = "/media/hdd")
 
        config.usage.on_movie_start = ConfigSelection(default = "ask", choices = [
                ("ask", _("Ask user")), ("resume", _("Resume from last position")), ("beginning", _("Start from the beginning")) ])
@@ -65,19 +69,19 @@ def InitUsageConfig():
        
        def TunerTypePriorityOrderChanged(configElement):
                setTunerTypePriorityOrder(int(configElement.value))
-       config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged)
+       config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged, immediate_feedback=False)
 
        def setHDDStandby(configElement):
                for hdd in harddiskmanager.HDDList():
                        hdd[1].setIdleTime(int(configElement.value))
-       config.usage.hdd_standby.addNotifier(setHDDStandby)
+       config.usage.hdd_standby.addNotifier(setHDDStandby, immediate_feedback=False)
 
        def set12VOutput(configElement):
                if configElement.value == "on":
                        Misc_Options.getInstance().set_12V_output(1)
                elif configElement.value == "off":
                        Misc_Options.getInstance().set_12V_output(0)
-       config.usage.output_12V.addNotifier(set12VOutput)
+       config.usage.output_12V.addNotifier(set12VOutput, immediate_feedback=False)
 
        SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output()
 
@@ -128,3 +132,23 @@ def updateChoices(sel, choices):
                                        defval = str(x)
                                        break
                sel.setChoices(map(str, choices), defval)
+
+def preferredPath(path):
+       if config.usage.setup_level.index < 2 or path == "<default>":
+               return None  # config.usage.default_path.value, but delay lookup until usage
+       elif path == "<current>":
+               return config.movielist.last_videodir.value
+       elif path == "<timer>":
+               return config.movielist.last_timer_videodir.value
+       else:
+               return path
+
+def preferredTimerPath():
+       return preferredPath(config.usage.timer_path.value)
+
+def preferredInstantRecordPath():
+       return preferredPath(config.usage.instantrec_path.value)
+
+def defaultMoviePath():
+       return config.usage.default_path.value
+
index 1f8709b38cbe28741b7100781199997fca8b4663..a6007b105f62ebb9f5e73bc1291546e95a69d200 100755 (executable)
@@ -1,6 +1,6 @@
 from enigma import getPrevAsciiCode
 from Tools.NumericalTextInput import NumericalTextInput
-from Tools.Directories import resolveFilename, SCOPE_CONFIG
+from Tools.Directories import resolveFilename, SCOPE_CONFIG, fileExists
 from Components.Harddisk import harddiskmanager
 from copy import copy as copy_copy
 from os import path as os_path
@@ -1283,7 +1283,6 @@ class ConfigLocations(ConfigElement):
                self.default = default
                self.locations = []
                self.mountpoints = []
-               harddiskmanager.on_partition_list_change.append(self.mountpointsChanged)
                self.value = default[:]
 
        def setValue(self, value):
@@ -1320,7 +1319,7 @@ class ConfigLocations(ConfigElement):
                locations = [[x, None, False, False] for x in tmp]
                self.refreshMountpoints()
                for x in locations:
-                       if os_path.exists(x[0]):
+                       if fileExists(x[0]):
                                x[1] = self.getMountpoint(x[0])
                                x[2] = True
                self.locations = locations
@@ -1339,20 +1338,11 @@ class ConfigLocations(ConfigElement):
                        return False
                return self.tostring([x[0] for x in locations]) != sv
 
-       def mountpointsChanged(self, action, dev):
-               print "Mounts changed: ", action, dev
-               mp = dev.mountpoint+"/"
-               if action == "add":
-                       self.addedMount(mp)
-               elif action == "remove":
-                       self.removedMount(mp)
-               self.refreshMountpoints()
-
        def addedMount(self, mp):
                for x in self.locations:
                        if x[1] == mp:
                                x[2] = True
-                       elif x[1] == None and os_path.exists(x[0]):
+                       elif x[1] == None and fileExists(x[0]):
                                x[1] = self.getMountpoint(x[0])
                                x[2] = True
 
@@ -1362,7 +1352,7 @@ class ConfigLocations(ConfigElement):
                                x[2] = False
 
        def refreshMountpoints(self):
-               self.mountpoints = [p.mountpoint + "/" for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
+               self.mountpoints = [p.mountpoint for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
                self.mountpoints.sort(key = lambda x: -len(x))
 
        def checkChangedMountpoints(self):
old mode 100644 (file)
new mode 100755 (executable)
index 23edc8e..1431caf
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-cutlisteditor</packagename>
                     <shortdescription>CutListEditor allows you to edit your movies.</shortdescription>
                     <description>CutListEditor allows you to edit your movies.\nSeek to the start of the stuff you want to cut away. Press OK, select 'start cut'.\nThen seek to the end, press OK, select 'end cut'. That's it.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/cutlisteditor.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cutlisteditor.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Mit dem Schnitteditor können Sie Ihre Aufnahmen schneiden.</shortdescription>
                     <description>Mit dem Schnitteditor können Sie Ihre Aufnahmen schneiden.\nSpulen Sie zum Anfang des zu schneidenden Teils der Aufnahme. Drücken Sie dann OK und wählen Sie: 'start cut'.\nDann spulen Sie zum Ende, drücken OK und wählen 'end cut'. Das ist alles.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/cutlisteditor.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cutlisteditor.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-cutlisteditor" />
index 7566346216991c79134fb8fe1fb39a106bba8ccd..efe9f761e3d9e2a769e359161499f2d78608fcaa 100644 (file)
@@ -7,6 +7,7 @@ from Components.ActionMap import HelpableActionMap
 from Components.MultiContent import MultiContentEntryText
 from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 from Components.VideoWindow import VideoWindow
+from Components.Label import Label
 from Screens.InfoBarGenerics import InfoBarSeek, InfoBarCueSheetSupport
 from Components.GUIComponent import GUIComponent
 from enigma import eListboxPythonMultiContent, eListbox, gFont, iPlayableService, RT_HALIGN_RIGHT
@@ -119,12 +120,13 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                <widget source="session.CurrentService" render="Label" position="135,405" size="450,50" font="Regular;22" halign="center" valign="center">
                        <convert type="ServiceName">Name</convert>
                </widget>
-               <widget source="session.CurrentService" render="Label" position="50,450" zPosition="1" size="620,25" font="Regular;20" halign="center" valign="center">
+               <widget source="session.CurrentService" render="Label" position="320,450" zPosition="1" size="420,25" font="Regular;20" halign="left" valign="center">
                        <convert type="ServicePosition">Position,Detailed</convert>
                </widget>
-               <eLabel position="62,98" size="179,274" backgroundColor="#505555" />
-               <eLabel position="64,100" size="175,270" backgroundColor="#000000" />
-               <widget source="cutlist" position="64,100" zPosition="1" size="175,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" >
+               <widget name="SeekState" position="210,450" zPosition="1" size="100,25" halign="right" font="Regular;20" valign="center" />
+               <eLabel position="48,98" size="204,274" backgroundColor="#505555" />
+               <eLabel position="50,100" size="200,270" backgroundColor="#000000" />
+               <widget source="cutlist" position="50,100" zPosition="1" size="200,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" >
                        <convert type="TemplatedMultiContent">
                                {"template": [
                                                MultiContentEntryText(size=(125, 20), text = 1, backcolor = MultiContentTemplateColor(3)),
@@ -161,6 +163,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                self["Timeline"] = ServicePositionGauge(self.session.nav)
                self["cutlist"] = List(self.getCutlist())
                self["cutlist"].onSelectionChanged.append(self.selectionChanged)
+               self["SeekState"] = Label()
+               self.onPlayStateChanged.append(self.updateStateLabel)
+               self.updateStateLabel(self.seekstate)
 
                self["Video"] = VideoWindow(decoder = 0)
 
@@ -184,13 +189,17 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                        })
 
                # to track new entries we save the last version of the cutlist
-               self.last_cuts = [ ]
+               self.last_cuts = self.getCutlist()
                self.cut_start = None
+               self.inhibit_seek = False
                self.onClose.append(self.__onClose)
 
        def __onClose(self):
                self.session.nav.playService(self.old_service)
 
+       def updateStateLabel(self, state):
+               self["SeekState"].setText(state[3].strip())
+
        def showTutorial(self):
                if not self.tutorial_seen:
                        self.tutorial_seen = True
@@ -238,44 +247,46 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                return r
 
        def selectionChanged(self):
-               where = self["cutlist"].getCurrent()
-               if where is None:
-                       print "no selection"
-                       return
-               pts = where[0][0]
-               seek = self.getSeek()
-               if seek is None:
-                       print "no seek"
-                       return
-               seek.seekTo(pts)
+               if not self.inhibit_seek:
+                       where = self["cutlist"].getCurrent()
+                       if where is None:
+                               print "no selection"
+                               return
+                       pts = where[0][0]
+                       seek = self.getSeek()
+                       if seek is None:
+                               print "no seek"
+                               return
+                       seek.seekTo(pts)
 
        def refillList(self):
                print "cue sheet changed, refilling"
                self.downloadCuesheet()
 
-               # get the first changed entry, and select it
+               # get the first changed entry, counted from the end, and select it
                new_list = self.getCutlist()
                self["cutlist"].list = new_list
 
-               for i in range(min(len(new_list), len(self.last_cuts))):
-                       if new_list[i] != self.last_cuts[i]:
-                               self["cutlist"].setIndex(i)
+               l1 = len(new_list)
+               l2 = len(self.last_cuts)
+               for i in range(min(l1, l2)):
+                       if new_list[l1-i-1] != self.last_cuts[l2-i-1]:
+                               self["cutlist"].setIndex(l1-i-1)
                                break
                self.last_cuts = new_list
 
        def getStateForPosition(self, pos):
-               state = 0 # in
-
-               # when first point is "in", the beginning is "out"
-               if len(self.cut_list) and self.cut_list[0][1] == 0:
-                       state = 1
-
+               state = -1
                for (where, what) in self.cut_list:
-                       if where < pos:
-                               if what == 0: # in
-                                       state = 0
-                               elif what == 1: # out
+                       if what in [0, 1]:
+                               if where < pos:
+                                       state = what
+                               elif where == pos:
                                        state = 1
+                               elif state == -1:
+                                       state = 1 - what
+               if state == -1:
+                       state = 0
                return state
 
        def showMenu(self):
@@ -329,11 +340,11 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                        in_after = None
 
                        for (where, what) in self.cut_list:
-                               if what == 1 and where < self.context_position: # out
+                               if what == 1 and where <= self.context_position: # out
                                        out_before = (where, what)
                                elif what == 0 and where < self.context_position: # in, before out
                                        out_before = None
-                               elif what == 0 and where > self.context_position and in_after is None:
+                               elif what == 0 and where >= self.context_position and in_after is None:
                                        in_after = (where, what)
 
                        if out_before is not None:
@@ -341,12 +352,16 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
 
                        if in_after is not None:
                                self.cut_list.remove(in_after)
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_MARK:
                        self.__addMark()
                elif result == CutListContextMenu.RET_DELETEMARK:
                        self.cut_list.remove(self.context_nearest_mark)
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_REMOVEBEFORE:
                        # remove in/out marks before current position
                        for (where, what) in self.cut_list[:]:
@@ -354,7 +369,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                                        self.cut_list.remove((where, what))
                        # add 'in' point
                        bisect.insort(self.cut_list, (self.context_position, 0))
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_REMOVEAFTER:
                        # remove in/out marks after current position
                        for (where, what) in self.cut_list[:]:
@@ -362,7 +379,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                                        self.cut_list.remove((where, what))
                        # add 'out' point
                        bisect.insort(self.cut_list, (self.context_position, 1))
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_GRABFRAME:
                        self.grabFrame()
 
index 1899cb71d01ad7f894f918fcc41cbbbd9d3cd621..0b3be7d6d0a9cee4060b3a867d2d851621437354 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_dvdburn.xml
+
+EXTRA_DIST = dvdburn_de.jpg dvdburn_en.jpg
diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg
new file mode 100755 (executable)
index 0000000..4472971
Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg differ
diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg
new file mode 100755 (executable)
index 0000000..509816d
Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 7971539..647d1cf
@@ -9,6 +9,7 @@
                     <packagename>enigma2-plugin-extensions-dvdburn</packagename>
                     <shortdescription>With DVDBurn you can burn your recordings to a dvd.</shortdescription>
                     <description>With DVDBurn you can burn your recordings to a dvd.\nArchive all your favorite movies to recordable dvds with menus if wanted.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdburn_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -16,6 +17,7 @@
                     <packagename>enigma2-plugin-extensions-dvdburn</packagename>
                     <shortdescription>Mit DVDBurn brennen Sie ihre Aufnahmen auf DVD.</shortdescription>
                     <description>Mit DVDBurn brennen Sie ihre Aufnahmen auf DVD.\nArchivieren Sie Ihre Liblingsfilme auf DVD mit Menus wenn Sie es wünschen.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdburn_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-dvdburn" />
old mode 100644 (file)
new mode 100755 (executable)
index 2658138..1353f7d
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-dvdplayer</packagename>
                     <shortdescription>DVDPlayer plays your DVDs on your Dreambox.</shortdescription>
                     <description>DVDPlayer plays your DVDs on your Dreambox.\nWith the DVDPlayer you can play your DVDs on your Dreambox from a DVD or even from an iso file or video_ts folder on your harddisc or network.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/dvdplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdplayer.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Spielen Sie Ihre DVDs mit dem DVDPlayer auf Ihrer Dreambox ab.</shortdescription>
                     <description>Spielen Sie Ihre DVDs mit dem DVDPlayer auf Ihrer Dreambox ab.\nMit dem DVDPlayer können Sie Ihre DVDs auf Ihrer Dreambox abspielen. Dabei ist es egal ob Sie von DVD, iso-Datei oder sogar direkt von einer video_ts Ordnerstruktur von Ihrer Festplatte oder dem Netzwerk abspielen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/dvdplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdplayer.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-dvdplayer" />
index 94f2ee38ad0ed7cff675b9f2b8d8f5631ba40f41..0372c49719edaf6d223af83fc119e32525535095 100644 (file)
@@ -696,7 +696,7 @@ RESULT eServiceDVD::setTrickmode(int /*trick*/)
 
 RESULT eServiceDVD::isCurrentlySeekable()
 {
-       return m_state == stRunning;
+       return m_state == stRunning ? 3 : 0;
 }
 
 RESULT eServiceDVD::keyPressed(int key)
old mode 100644 (file)
new mode 100755 (executable)
index b22c4b8..1d621f4
@@ -16,7 +16,7 @@ from Screens.TimerEntry import TimerEntry
 from Screens.EpgSelection import EPGSelection
 from Screens.TimerEdit import TimerSanityConflict
 from Screens.MessageBox import MessageBox
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
 from ServiceReference import ServiceReference
 from Tools.LoadPixmap import LoadPixmap
@@ -41,11 +41,11 @@ class EPGList(HTMLComponent, GUIComponent):
                if overjump_empty:
                        self.l.setSelectableFunc(self.isSelectable)
                self.epgcache = eEPGCache.getInstance()
-               self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png'))
-               self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png'))
-               self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png'))
-               self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png'))
-               self.clock_prepost_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_prepost.png'))
+               self.clock_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock.png'))
+               self.clock_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_add.png'))
+               self.clock_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_pre.png'))
+               self.clock_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_post.png'))
+               self.clock_prepost_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_prepost.png'))
                self.time_base = None
                self.time_epoch = time_epoch
                self.list = None
old mode 100644 (file)
new mode 100755 (executable)
index 8dfdbbf..b68d095
Binary files a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg and b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 95b6665..6953f27
Binary files a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg and b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 7b0b134..a10840d
@@ -9,7 +9,7 @@
                     <packagename>eenigma2-plugin-extensions-graphmultiepg</packagename>
                     <shortdescription>GraphMultiEPG shows a graphical timeline EPG.</shortdescription>
                     <description>GraphMultiEPG shows a graphical timeline EPG.\nShows a nice overview of all running und upcoming tv shows.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/graphmultiepg_en.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_graphmultiepg_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -18,7 +18,7 @@
                     <shortdescription>Zeigt ein grafisches Zeitlinien-EPG.</shortdescription>
                     <description>Zeigt ein grafisches Zeitlinien-EPG.\nZeigt eine grafische Ãœbersicht aller laufenden und kommenden Sendungen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/graphmultiepg_de.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_graphmultiepg_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-graphmultiepg" />
old mode 100644 (file)
new mode 100755 (executable)
index 4396161..41a67c2
Binary files a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg and b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index e1d3575..6bfbbc5
Binary files a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg and b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 825793f..2f9f22b
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-mediaplayer</packagename>
                     <shortdescription>Mediaplayer plays your favorite music and videos.</shortdescription>
                     <description>Mediaplayer plays your favorite music and videos.\nPlay all your favorite music and video files, organize them in playlists, view cover and album information.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/mediaplayer_en.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediaplayer_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Mediaplayer spielt Ihre Musik und Videos.</shortdescription>
                     <description>Mediaplayer spielt Ihre Musik und Videos.\nSie können all Ihre Musik- und Videodateien abspielen, in Playlisten organisieren, Cover und Albuminformationen abrufen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/mediaplayer_de.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediaplayer_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-mediaplayer" />
old mode 100644 (file)
new mode 100755 (executable)
index 98bc060..0fc78fb
@@ -19,7 +19,7 @@ from Components.Playlist import PlaylistIOInternal, PlaylistIOM3U, PlaylistIOPLS
 from Components.AVSwitch import AVSwitch
 from Components.Harddisk import harddiskmanager
 from Components.config import config
-from Tools.Directories import fileExists, pathExists, resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_SKIN_IMAGE
+from Tools.Directories import fileExists, pathExists, resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_CURRENT_SKIN
 from settings import MediaPlayerSettings
 import random
 
@@ -50,7 +50,7 @@ class MediaPixmap(Pixmap):
                                        noCoverFile = value
                                        break
                if noCoverFile is None:
-                       noCoverFile = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png")
+                       noCoverFile = resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/no_coverArt.png")
                self.noCoverPixmap = LoadPixmap(noCoverFile)
                return Pixmap.applySkin(self, desktop, screen)
 
@@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
 
                # 'None' is magic to start at the list of mountpoints
                defaultDir = config.mediaplayer.defaultDir.getValue()
-               self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
+               self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
                self["filelist"] = self.filelist
 
                self.playlist = MyPlayList()
index e2aa0e3b5a65328f3de2c91ab398f190c369e5c1..d80b8c27f9f572107bfbfc37adc060a6bf7c6bf2 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_mediascanner.xml
+
+EXTRA_DIST = mediascanner_de.jpg mediascanner_en.jpg
diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg
new file mode 100755 (executable)
index 0000000..e6a191c
Binary files /dev/null and b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg differ
diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg
new file mode 100755 (executable)
index 0000000..b9561c2
Binary files /dev/null and b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index d899fdb..eced924
@@ -9,6 +9,7 @@
                     <packagename>enigma2-plugin-extensions-mediascanner</packagename>
                     <shortdescription>MediaScanner scans devices for playable media files.</shortdescription>
                     <description>MediaScanner scans devices for playable media files and displays a menu with possible actions like viewing pictures or playing movies.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediascanner_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,6 +18,7 @@
                     <shortdescription>MediaScanner durchsucht Geräte nach Mediendateien.</shortdescription>
                     <description>MediaScanner durchsucht Geräte nach Mediendateien  und bietet Ihnen die dazu passenden Aktionen an wie z.B. Bilder betrachten oder Videos abspielen.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediascanner_en.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-mediascanner" />
old mode 100644 (file)
new mode 100755 (executable)
index 40e59b6..faff978
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-pictureplayer</packagename>
                     <shortdescription>PicturePlayer displays your photos on the TV.</shortdescription>
                     <description>The PicturePlayer displays your photos on the TV.\nYou can view them as thumbnails or slideshow.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/pictureplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_pictureplayer.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Der Bildbetrachter zeigt Ihre Bilder auf dem Fernseher an.</shortdescription>
                     <description>Der Bildbetrachter zeigt Ihre Bilder auf dem Fernseher an.\nSie können sich Ihre Bilder als Thumbnails, einzeln oder als Slideshow anzeigen lassen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/pictureplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_pictureplayer.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-pictureplayer" />
index d7fc6898831e55c4411c3558ac964d87b1ad0669..7cf0c18b506a302b0bc069ffc672a9b28a27a0b7 100755 (executable)
@@ -52,6 +52,14 @@ class PluginDescriptor:
        # reason (True: Networkconfig read finished, False: Networkconfig reload initiated )
        WHERE_NETWORKCONFIG_READ = 12
 
+       WHERE_AUDIOMENU = 13
+
+       # fnc 'SoftwareSupported' or  'AdvancedSoftwareSupported' must take a parameter and return None
+       # if the plugin should not be displayed inside Softwaremanger or return a function which is called with session
+       # and 'None' as parameter to call the plugin from the Softwaremanager menus. "menuEntryName" and "menuEntryDescription"
+       # should be provided to name and describe the new menu entry.
+       WHERE_SOFTWAREMANAGER = 14
+
        def __init__(self, name = "Plugin", where = [ ], description = "", icon = None, fnc = None, wakeupfnc = None, internal = False):
                self.name = name
                self.internal = internal
index 94be47471d7ec7750fdf09b68cd63a18ea46feb4..d9d96bcf3ba448d5f92a5f596b634655f66dabe1 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_cleanupwizard.xml
+
+EXTRA_DIST = cleanupwizard_de.jpg cleanupwizard_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg
new file mode 100755 (executable)
index 0000000..2f086fb
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg
new file mode 100755 (executable)
index 0000000..d014cb5
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg differ
index 10ccc73c3e297f8cce2f75f1c25ceca8d264d648..99add3d30b7fe0b47cc1fd1be3ba1d9615f0685b 100755 (executable)
@@ -10,6 +10,7 @@
                     <description>The CleanupWizard informs you when your internal free memory of your dreambox has droppen under 2MB.
                    You can use this wizard to remove some extensions.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cleanupwizard_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -19,6 +20,7 @@
                     <description>Der CleanupWizard informiert Sie, wenn der interne freie Speicher Ihrer Dreambox unter 2MB fällt.
                    Sie können dann einige Erweiterungen deinstallieren um wieder Platz zu schaffen.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cleanupwizard_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-cleanupwizard" />
old mode 100644 (file)
new mode 100755 (executable)
index 120ac82..75771f9
Binary files a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg and b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index bb2bf59..9abc598
@@ -13,7 +13,7 @@
                     in your Dreambox and assign to each of them dedicated providers/services or caids.\n
                     So it is then possible to watch a scrambled service while recording another one.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/ciassignment.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_ciassignment.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -24,7 +24,7 @@
                     So ist es möglich mit einem CI einen Sender aufzunehmen\n
                     und mit einem anderen einen Sender zu schauen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/ciassignment.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_ciassignment.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-commoninterfaceassignment" />
index b619c8c604e3f91b35ba28ec1e54ec654ec2be68..aed728db029fafae4141c8f8f32f418a24d96d26 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_crashlogautosubmit.xml
+
+EXTRA_DIST = crashlogautosubmit_de.jpg crashlogautosubmit_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg
new file mode 100755 (executable)
index 0000000..0489416
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg
new file mode 100755 (executable)
index 0000000..5e5c728
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 261eb49..a118ed7
@@ -10,6 +10,7 @@
                     <description>With the CrashlogAutoSubmit extension it is possible to automatically send crashlogs
                    found on your Harddrive to Dream Multimedia
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_crashlogautosubmit_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,8 +18,9 @@
                     <packagename>enigma2-plugin-systemplugins-crashlogautosubmit</packagename>
                     <shortdescription>Automatisches versenden von Crashlogs an Dream Multimedia</shortdescription>
                     <description>Mit dem CrashlogAutoSubmit Plugin ist es möglich auf Ihrer Festplatte
-                   gefundene Crashlogs automatisch  an Dream Multimedia zu versenden.
+                   gefundene Crashlogs automatisch an Dream Multimedia zu versenden.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_crashlogautosubmit_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-crashlogautosubmit" />
old mode 100644 (file)
new mode 100755 (executable)
index a0fd3b1..f4d0a1e
Binary files a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg and b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index bf0ce25..41d41ed
@@ -10,7 +10,7 @@
                     <shortdescription>Scans default lamedbs sorted by satellite with a connected dish positioner.</shortdescription>
                     <description>With the DefaultServicesScanner extension you can scan default lamedbs sorted by satellite with a connected dish positioner.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/defaultservicescanner.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_defaultservicescanner.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -19,7 +19,7 @@
                     <shortdescription>Standard Sendersuche nach Satellit mit einem Rotor.</shortdescription>
                     <description>Mit der DefaultServicesScanner Erweiterung können Sie eine standard Sendersuche nach Satellit mit einem angeschlossenen Rotor durchführen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/defaultservicescanner.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_defaultservicescanner.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-defaultservicesscanner" />
index 8405ed7ace124d44b65f540b12d188b453575fb6..9b0a2ede06ede1da7919192b29158bd466241628 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_diseqctester.xml
 
-EXTRA_DIST = diseqctester.jpg
+EXTRA_DIST = diseqctester_de.jpg diseqctester_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg
deleted file mode 100644 (file)
index c872334..0000000
Binary files a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg
new file mode 100755 (executable)
index 0000000..5a6e153
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg
new file mode 100755 (executable)
index 0000000..43dad76
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 5415db0..33808b3
@@ -10,7 +10,7 @@
                     <shortdescription>Test your Diseqc equipment.</shortdescription>
                     <description>With the DiseqcTester extension you can test your satellite equipment for Diseqc compatibility and errors.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/diseqctester.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_diseqctester_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -19,7 +19,7 @@
                     <shortdescription>Testet Ihr Diseqc Equipment.</shortdescription>
                     <description>Mit der DiseqcTester Erweiterung können Sie Ihr Satelliten-Equipment nach Diseqc-Kompatibilität und Fehlern Ã¼berprüfen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/diseqctester.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_diseqctester_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-diseqctester" />
index 686bded02a431b461cf573111158a6673ba910a3..0633e7cf608ab7fc1e26d94b6d2d8b94e2b55b8c 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_nfiflash.xml
 
-EXTRA_DIST = nfiflash.jpg
+EXTRA_DIST = nfiflash_de.jpg nfiflash_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg
deleted file mode 100644 (file)
index 0a5fa46..0000000
Binary files a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg
new file mode 100755 (executable)
index 0000000..fec93f4
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg
new file mode 100755 (executable)
index 0000000..32a9967
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 2de88f0..c81f4ca
@@ -12,7 +12,7 @@
                     <description>With the NFIFlash extension it is possible to prepare a USB stick with an Dreambox image.\n
                     It is then possible to flash your Dreambox with the image on that stick.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/nfiflash.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_nfiflash_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -22,7 +22,7 @@
                     <description>Mit der NFIFlash Erweiterung können Sie ein Dreambox Image auf einen USB-Stick laden.\
                     Mit diesem USB-Stick ist es dann möglich Ihre Dreambox zu flashen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/nfiflash.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_nfiflash_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-nfiflash" />
old mode 100644 (file)
new mode 100755 (executable)
index 40914e1..28b3330
@@ -1,20 +1,28 @@
+from Plugins.Plugin import PluginDescriptor
+from Tools.HardwareInfo import HardwareInfo
+from Tools.Directories import fileExists
+from downloader import NFIDownload, filescan
+
+def NFIFlasherMain(session, tmp = None, **kwargs):
+       session.open(NFIDownload, "/home/root" )
+
+def NFICallFnc(tmp = None):
+       return NFIFlasherMain
+
 def Plugins(**kwargs):
-       from Plugins.Plugin import PluginDescriptor
-       from Tools.HardwareInfo import HardwareInfo
        # currently only available for DM8000
        if HardwareInfo().get_device_name() != "dm8000":
                return [PluginDescriptor()]
-       from Tools.Directories import fileExists
        if fileExists("/usr/share/bootlogo-flasher.mvi"):
                import flasher
                # started from usb stick # don't try to be intelligent and trick this - it's not possible to rewrite the flash memory with a system currently booted from it
                return [PluginDescriptor(where = PluginDescriptor.WHERE_WIZARD, fnc = (9,flasher.NFIFlash))]
        else:
                # started on real enigma2
-               import downloader
-               return [PluginDescriptor(name="NFI Image Flashing",
-                       description = _("Download .NFI-Files for USB-Flasher"),
+               return [PluginDescriptor(name=_("NFI Image Flashing"),
+                       description=_("Download .NFI-Files for USB-Flasher"),
                        icon = "flash.png",
-                       where = [PluginDescriptor.WHERE_PLUGINMENU],
-                       fnc = downloader.main), PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = downloader.filescan)
-                       ]
+                       where = PluginDescriptor.WHERE_SOFTWAREMANAGER,
+                       fnc={"SoftwareSupported": NFICallFnc, "menuEntryName": lambda x: _("NFI Image Flashing"),
+                            "menuEntryDescription": lambda x: _("Download .NFI-Files for USB-Flasher")}),
+                       PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)]
index 4d361157ed2bac125a858fb914bd38b347c0e1cd..b158cde1e4a51269fd1e84668ffcb8497e6fd03c 100755 (executable)
@@ -4,15 +4,11 @@ from Screens.Rc import Rc
 from Screens.MessageBox import MessageBox
 
 from Components.Pixmap import Pixmap, MovingPixmap, MultiPixmap
+from Components.Sources.Boolean import Boolean
 from Components.config import config, ConfigBoolean, configfile, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, getConfigListEntry, ConfigSelection, ConfigPassword
 from Components.Network import iNetwork
 
-#from Components.Label import Label
-#from Components.MenuList import MenuList
-#from Components.PluginComponent import plugins
-#from Plugins.Plugin import PluginDescriptor
 from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
-#import time, os, re
 
 
 config.misc.firstrun = ConfigBoolean(default = True)
@@ -39,7 +35,7 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl
 class NetworkWizard(WizardLanguage, Rc):
        skin = """
                <screen position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
-                       <widget name="text" position="153,40" size="340,330" font="Regular;22" />
+                       <widget name="text" position="153,40" size="340,300" font="Regular;22" />
                        <widget source="list" render="Listbox" position="53,340" size="440,180" scrollbarMode="showOnDemand" >
                                <convert type="StringList" />
                        </widget>
@@ -52,6 +48,10 @@ class NetworkWizard(WizardLanguage, Rc):
                        <widget name="arrowdown2" pixmap="skin_default/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
                        <widget name="arrowup" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
                        <widget name="arrowup2" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+                       <widget source="VKeyIcon" render="Pixmap" pixmap="skin_default/buttons/key_text.png" position="40,260" zPosition="0" size="35,25" transparent="1" alphatest="on" >
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget name="HelpWindow" pixmap="skin_default/buttons/key_text.png" position="125,170" zPosition="1" size="1,1" transparent="1" alphatest="on" />      
                </screen>"""
        def __init__(self, session):
                self.xmlfile = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml")
@@ -59,7 +59,10 @@ class NetworkWizard(WizardLanguage, Rc):
                Rc.__init__(self)
                self.session = session
                self["wizard"] = Pixmap()
-               
+               self["HelpWindow"] = Pixmap()
+               self["HelpWindow"].hide()
+               self["VKeyIcon"] = Boolean(False)
+
                self.InterfaceState = None
                self.isInterfaceUp = None
                self.WlanPluginInstalled = None
index 98dbe80be01a790000f6a5ddd29f62c127188375..e8f738c65361c513d909157090a9a071774f4263 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_networkwizard.xml
+
+EXTRA_DIST = networkwizard_en.jpg networkwizard_de.jpg
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg
new file mode 100755 (executable)
index 0000000..3999a41
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg
new file mode 100755 (executable)
index 0000000..0a0434a
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg differ
index 660bbcd2825f49ebfdb77dfe069ec5fcdd953759..4d3adcbde63204ec6c179c296ea33124e0f98961 100755 (executable)
@@ -9,6 +9,7 @@
                     <shortdescription>Step by step network configuration</shortdescription>
                     <description>With the NetworkWizard you can easy configure your network step by step.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_networkwizard_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -18,6 +19,7 @@
                     <description>Mit dem NetzwerkWizard können Sie Ihr Netzwerk konfigurieren. Sie werden Schritt
                        für Schritt durch die Konfiguration geleitet.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_networkwizard_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-networkwizard" />
old mode 100644 (file)
new mode 100755 (executable)
index d20b2e6..2cb47c0
@@ -10,7 +10,7 @@
                     <shortdescription>PositionerSetup helps you installing a motorized dish.</shortdescription>
                     <description>With the PositionerSetup extension it is easy to install and configure a motorized dish.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/positionersetup.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_positionersetup.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -20,7 +20,7 @@
                     <description>Die PositionerSetup Erweiterung unterstützt Sie beim einrichten
                     und konfigurieren einer motorgesteuerten Satellitenantenne.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/positionersetup.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_positionersetup.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-positionersetup" />
old mode 100644 (file)
new mode 100755 (executable)
index 6307213..7f8d8d2
Binary files a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg and b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 8fa36e5..4c0c7af
@@ -11,7 +11,7 @@
                     <shortdescription>SatelliteEquipmentControl allows you to fine-tune DiSEqC-settings.</shortdescription>
                     <description>With the SatelliteEquipmentControl extension it is possible to fine-tune DiSEqC-settings.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satcontrol.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satcontrol.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -20,7 +20,7 @@
                     <shortdescription>Fein-Einstellungen für DiSEqC</shortdescription>
                     <description>Die SatelliteEquipmentControl-Erweiterung unterstützt Sie beim Feintuning der DiSEqC Einstellungen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satcontrol.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satcontrol.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-satelliteequipmentcontrol" />
old mode 100644 (file)
new mode 100755 (executable)
index b9596a6..703650e
Binary files a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg and b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index aaab7e4..e9453de
@@ -8,10 +8,10 @@
                     <name>Satfinder</name>
                     <packagename>enigma2-plugin-systemplugins-satfinder</packagename>
                     <shortdescription>Satfinder helps you to align your dish.</shortdescription>
-                    <description>The Satfinder extension helps you to align your dish.\
+                    <description>The Satfinder extension helps you to align your dish.\n
                     It shows you informations about signal rate and errors.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satfinder.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satfinder.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -21,7 +21,7 @@
                     <description>Die Satfinder-Erweiterung unterstützt Sie beim Ausrichten ihrer Satellitenanlage.\n
                     Es zeigt Ihnen Daten wie Signalstärke und Fehlerrate an.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satfinder.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satfinder.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-satfinder" />
old mode 100644 (file)
new mode 100755 (executable)
index c0bba0c..44f0981
Binary files a/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg and b/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg differ
index 689d97ef7c569706a35ddf7847136367eea8c6cc..d29fb002174cdca7e1e21aa62f5cd408b95a1d56 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_skinselector.xml
 
-EXTRA_DIST = skinselector.jpg
+EXTRA_DIST = skinselector_de.jpg skinselector_en.jpg
old mode 100644 (file)
new mode 100755 (executable)
index 4ce7f1b..717f732
@@ -11,7 +11,7 @@
                     <description>The SkinSelector shows a menu with selectable skins.\n
                     It's now easy to change the look and feel of your Dreambox.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/skinselector.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_skinselector_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -21,7 +21,7 @@
                     <description>Die SkinSelector Erweiterung zeigt Ihnen ein Menu mit auswählbaren Skins.\n
                     Sie können nun einfach das Aussehen der grafischen Oberfläche Ihrer Dreambox verändern.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/skinselector.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_skinselector_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-skinselector" />
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg
deleted file mode 100644 (file)
index 74395ea..0000000
Binary files a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg
new file mode 100755 (executable)
index 0000000..3b40708
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg
new file mode 100755 (executable)
index 0000000..b9f0bd3
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg differ
index 341938c5e454d6c8cfc56bf8354afce2b25bdc8f..05a87d5a45bee3ca60f3eec4aaa6721f37fa14fe 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_softwaremanager.xml
 
-EXTRA_DIST = softmanager.jpg
+EXTRA_DIST = softwaremanager_en.jpg softwaremanager_de.jpg
old mode 100644 (file)
new mode 100755 (executable)
index fa84670..cd425c3
@@ -11,7 +11,7 @@
                     <description>The SoftwareManager manages your Dreambox software.\n
                     It's easy to update your receiver's software, install or remove extensions or even backup and restore your system settings.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/softmanager.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_softwaremanager_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -22,7 +22,7 @@
                     Sie können nun einfach Ihre Dreambox-Software aktualisieren, neue Erweiterungen installieren oder entfernen,
                     oder ihre Einstellungen sichern und wiederherstellen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/softmanager.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_softwaremanager_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-softwaremanager" />
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg
deleted file mode 100644 (file)
index a9d5a62..0000000
Binary files a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg
new file mode 100755 (executable)
index 0000000..54e6419
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg
new file mode 100755 (executable)
index 0000000..0832f0a
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg differ
index 3a1f835fecae9a3c9cbf8885860fa82850eee59a..c70201b3c028e6d87d4968cc9664a4b1728f8491 100755 (executable)
@@ -23,7 +23,7 @@ from Components.About import about
 from Components.DreamInfoHandler import DreamInfoHandler
 from Components.Language import language
 from Components.AVSwitch import AVSwitch
-from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE, SCOPE_METADIR
+from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_PLUGIN, SCOPE_CURRENT_SKIN, SCOPE_METADIR
 from Tools.LoadPixmap import LoadPixmap
 from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad
 from cPickle import dump, load
@@ -108,21 +108,47 @@ class UpdatePluginMenu(Screen):
                self.oktext = _("\nPress OK on your remote control to continue.")
                self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
                if self.menu == 0:
-                       self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext) )
-                       #self.list.append(("install-plugins", _("Install extensions"), _("\nInstall new Extensions or Plugins to your dreambox" ) + self.oktext) )
-                       self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext))
-                       self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext))
-                       self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext))
-                       self.list.append(("ipkg-install", _("Install local extension"),  _("\nScan for local packages and install them." ) + self.oktext))
+                       self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext, None))
+                       #self.list.append(("install-plugins", _("Install extensions"), _("\nInstall new Extensions or Plugins to your dreambox" ) + self.oktext, None))
+                       self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext, None))
+                       self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext, None))
+                       self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext, None))
+                       self.list.append(("ipkg-install", _("Install local extension"),  _("\nScan for local packages and install them." ) + self.oktext, None))
+                       for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
+                               if p.__call__.has_key("SoftwareSupported"):
+                                       callFnc = p.__call__["SoftwareSupported"](None)
+                                       if callFnc is not None:
+                                               if p.__call__.has_key("menuEntryName"):
+                                                       menuEntryName = p.__call__["menuEntryName"](None)
+                                               else:
+                                                       menuEntryName = _('Extended Software')
+                                               if p.__call__.has_key("menuEntryDescription"):
+                                                       menuEntryDescription = p.__call__["menuEntryDescription"](None)
+                                               else:
+                                                       menuEntryDescription = _('Extended Software Plugin')
+                                               self.list.append(('default-plugin', menuEntryName, menuEntryDescription + self.oktext, callFnc))
                        if config.usage.setup_level.index >= 2: # expert+
-                               self.list.append(("advanced", _("Advanced Options"), _("\nAdvanced options and settings." ) + self.oktext))
+                               self.list.append(("advanced", _("Advanced Options"), _("\nAdvanced options and settings." ) + self.oktext, None))
                elif self.menu == 1:
-                       self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext))
-                       self.list.append(("backuplocation", _("Choose backup location"),  _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext ))
-                       self.list.append(("backupfiles", _("Choose backup files"),  _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext))
+                       self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext, None))
+                       self.list.append(("backuplocation", _("Choose backup location"),  _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext, None))
+                       self.list.append(("backupfiles", _("Choose backup files"),  _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext, None))
                        if config.usage.setup_level.index >= 2: # expert+
-                               self.list.append(("ipkg-manager", _("Packet management"),  _("\nView, install and remove available or installed packages." ) + self.oktext))
-                       self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext))
+                               self.list.append(("ipkg-manager", _("Packet management"),  _("\nView, install and remove available or installed packages." ) + self.oktext, None))
+                       self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext, None))
+                       for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
+                               if p.__call__.has_key("AdvancedSoftwareSupported"):
+                                       callFnc = p.__call__["AdvancedSoftwareSupported"](None)
+                                       if callFnc is not None:
+                                               if p.__call__.has_key("menuEntryName"):
+                                                       menuEntryName = p.__call__["menuEntryName"](None)
+                                               else:
+                                                       menuEntryName = _('Advanced Software')
+                                               if p.__call__.has_key("menuEntryDescription"):
+                                                       menuEntryDescription = p.__call__["menuEntryDescription"](None)
+                                               else:
+                                                       menuEntryDescription = _('Advanced Software Plugin')
+                                               self.list.append(('advanced-plugin', menuEntryName, menuEntryDescription + self.oktext, callFnc))
 
                self["menu"] = List(self.list)
                self["key_red"] = StaticText(_("Close"))
@@ -150,33 +176,36 @@ class UpdatePluginMenu(Screen):
        def go(self):
                current = self["menu"].getCurrent()
                if current:
-                       current = current[0]
+                       currentEntry = current[0]
                        if self.menu == 0:
-                               if (current == "software-update"):
+                               if (currentEntry == "software-update"):
                                        self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your Dreambox?")+"\n"+_("\nAfter pressing OK, please wait!"))
-                               elif (current == "software-restore"):
+                               elif (currentEntry == "software-restore"):
                                        self.session.open(ImageWizard)
-                               elif (current == "install-plugins"):
+                               elif (currentEntry == "install-plugins"):
                                        self.session.open(PluginManager, self.skin_path)
-                               elif (current == "system-backup"):
+                               elif (currentEntry == "system-backup"):
                                        self.session.openWithCallback(self.backupDone,BackupScreen, runBackup = True)
-                               elif (current == "system-restore"):
+                               elif (currentEntry == "system-restore"):
                                        if os_path.exists(self.fullbackupfilename):
                                                self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore your Enigma2 backup?\nEnigma2 will restart after the restore"))
                                        else:
                                                self.session.open(MessageBox, _("Sorry no backups found!"), MessageBox.TYPE_INFO, timeout = 10)
-                               elif (current == "ipkg-install"):
+                               elif (currentEntry == "ipkg-install"):
                                        try:
                                                from Plugins.Extensions.MediaScanner.plugin import main
                                                main(self.session)
                                        except:
                                                self.session.open(MessageBox, _("Sorry MediaScanner is not installed!"), MessageBox.TYPE_INFO, timeout = 10)
-                               elif (current == "advanced"):
+                               elif (currentEntry == "default-plugin"):
+                                       self.extended = current[3]
+                                       self.extended(self.session, None)
+                               elif (currentEntry == "advanced"):
                                        self.session.open(UpdatePluginMenu, 1)
                        elif self.menu == 1:
-                               if (current == "ipkg-manager"):
+                               if (currentEntry == "ipkg-manager"):
                                        self.session.open(PacketManager, self.skin_path)
-                               elif (current == "backuplocation"):
+                               elif (currentEntry == "backuplocation"):
                                        parts = [ (r.description, r.mountpoint, self.session) for r in harddiskmanager.getMountedPartitions(onlyhotplug = False)]
                                        for x in parts:
                                                if not access(x[1], F_OK|R_OK|W_OK) or x[1] == '/':
@@ -186,12 +215,15 @@ class UpdatePluginMenu(Screen):
                                                        parts.remove(x)
                                        if len(parts):
                                                self.session.openWithCallback(self.backuplocation_choosen, ChoiceBox, title = _("Please select medium to use as backup location"), list = parts)
-                               elif (current == "backupfiles"):
+                               elif (currentEntry == "backupfiles"):
                                        self.session.openWithCallback(self.backupfiles_choosen,BackupSelection)
-                               elif (current == "advancedrestore"):
+                               elif (currentEntry == "advancedrestore"):
                                        self.session.open(RestoreMenu, self.skin_path)
-                               elif (current == "ipkg-source"):
+                               elif (currentEntry == "ipkg-source"):
                                        self.session.open(IPKGMenu, self.skin_path)
+                               elif (currentEntry == "advanced-plugin"):
+                                       self.extended = current[3]
+                                       self.extended(self.session, None)
 
        def backupfiles_choosen(self, ret):
                self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
@@ -478,13 +510,13 @@ class PacketManager(Screen):
        def setStatus(self,status = None):
                if status:
                        self.statuslist = []
-                       divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+                       divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
                        if status == 'update':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
                                self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng ))
                                self['list'].setList(self.statuslist)   
                        elif status == 'error':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
                                self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng ))
                                self['list'].setList(self.statuslist)                           
 
@@ -600,15 +632,15 @@ class PacketManager(Screen):
                self.buildPacketList()
 
        def buildEntryComponent(self, name, version, description, state):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
                if state == 'installed':
-                       installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png"))
+                       installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
                        return((name, version, description, state, installedpng, divpng))       
                elif state == 'upgradeable':
-                       upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgradeable.png"))
+                       upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png"))
                        return((name, version, description, state, upgradeablepng, divpng))     
                else:
-                       installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png"))
+                       installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
                        return((name, version, description, state, installablepng, divpng))
 
        def buildPacketList(self):
@@ -779,19 +811,19 @@ class PluginManager(Screen, DreamInfoHandler):
                        self["key_green"].setText("")
                        self["key_blue"].setText("")
                        self["key_yellow"].setText("")
-                       divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+                       divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
                        if status == 'update':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
                                self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'', '', statuspng, divpng, None, '' ))
                                self["list"].style = "default"
                                self['list'].setList(self.statuslist)
                        elif status == 'sync':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
                                self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' ))
                                self["list"].style = "default"
                                self['list'].setList(self.statuslist)
                        elif status == 'error':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
                                self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' ))
                                self["list"].style = "default"
                                self['list'].setList(self.statuslist)
@@ -978,18 +1010,18 @@ class PluginManager(Screen, DreamInfoHandler):
                        self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
 
        def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
                if state == 'installed':
-                       installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png"))
+                       installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
                        return((name, details, description, packagename, state, installedpng, divpng, selected))
                elif state == 'installable':
-                       installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png"))
+                       installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
                        return((name, details, description, packagename, state, installablepng, divpng, selected))
                elif state == 'remove':
-                       removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
+                       removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
                        return((name, details, description, packagename, state, removepng, divpng, selected))
                elif state == 'install':
-                       installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png"))
+                       installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
                        return((name, details, description, packagename, state, installpng, divpng, selected))
 
        def buildPacketList(self, categorytag = None):
@@ -1051,7 +1083,7 @@ class PluginManager(Screen, DreamInfoHandler):
                self.selectionChanged()
 
        def buildCategoryComponent(self, tag = None):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
                if tag is not None:
                        if tag == 'System':
                                return(( _("System"), _("View list of available system extensions" ), tag, divpng ))
@@ -1210,10 +1242,10 @@ class PluginManagerInfo(Screen):
                        self['list'].updateList(self.list)
 
        def buildEntryComponent(self, action,info):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
-               upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
-               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png"))
-               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
+               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
                if action == 'install':
                        return(( _('Installing'), info, installpng, divpng))
                elif action == 'remove':
@@ -1282,11 +1314,11 @@ class PluginManagerHelp(Screen):
                self['list'].updateList(self.list)
 
        def buildEntryComponent(self, state):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
-               installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png"))
-               installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png"))
-               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
-               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png"))
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+               installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
 
                if state == 'installed':
                        return(( _('This plugin is installed.'), _('You can remove this plugin.'), installedpng, divpng))
@@ -1432,7 +1464,7 @@ class PluginDetails(Screen, DreamInfoHandler):
                if not noScreenshot:
                        filename = self.thumbnail
                else:
-                       filename = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/noprev.png")
+                       filename = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/noprev.png")
 
                sc = AVSwitch().getFramebufferScale()
                self.picload.setPara((self["screenshot"].instance.size().width(), self["screenshot"].instance.size().height(), sc[0], sc[1], False, 1, "#00000000"))
index 9e248084826e0764ec843f828ed6e218efbd4933..2e80f30673ce9fccf429158af140174c144da54f 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_videoenhancement.xml
 
-EXTRA_DIST = videoenhancement.jpg
+EXTRA_DIST = videoenhancement_en.jpg videoenhancement_de.jpg
index 33b222ef0e9865faf616f2f91af17260ab33ac0b..208c7e0c0971126b8ecea459c4f9683ac4169be6 100755 (executable)
@@ -1,5 +1,8 @@
 <default>
          <prerequisites>
+                    <hardware type="dm8000" />
+                    <hardware type="dm800" />
+                    <hardware type="dm500hd" />
                     <tag type="Display" />
                     <tag type="System" />
          </prerequisites>
                     <packagename>enigma2-plugin-systemplugins-videoenhancement</packagename>
                     <shortdescription>VideoEnhancement provides advanced video enhancement settings.</shortdescription>
                     <description>The VideoEnhancement extension provides advanced video enhancement settings.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/videoenhancement.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videoenhancement_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
-                    <name>VideoEnhancement</name>
+                    <name>Erweiterte A/V Einstellungen</name>
                     <packagename>enigma2-plugin-systemplugins-videoenhancement</packagename>
-                    <shortdescription>Videomode bietet erweiterte Video Konfigurationsoptionen.</shortdescription>
-                    <description>Die Videomode-Erweiterung bietet erweiterte Video Konfigurationsoptionen.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/videoenhancement.jpg" />
+                    <shortdescription>Erweiterte A/V Einstellungen für Ihre Dreambox.</shortdescription>
+                    <description>Erweiterte A/V Einstellungen für Ihre Dreambox.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videoenhancement_de.jpg" />
           </info>
 
          <files type="package"> <!-- without version, without .ipk -->
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg
deleted file mode 100755 (executable)
index 0e0ef6f..0000000
Binary files a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg
new file mode 100755 (executable)
index 0000000..ecf0161
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg
new file mode 100755 (executable)
index 0000000..a97a7a3
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 75abb90..c460943
@@ -9,7 +9,7 @@
                     <packagename>enigma2-plugin-systemplugins-videotune</packagename>
                     <shortdescription>VideoTune helps fine-tuning your tv display.</shortdescription>
                     <description>The VideoTune helps fine-tuning your tv display.\nYou can control brightness and contrast of your tv.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videotune.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia - DE</author>
@@ -18,7 +18,7 @@
                     <shortdescription>VideoTune hilft beim fein-einstellen des Fernsehers.</shortdescription>
                     <description>VideoTune hilf beim fein-einstellen des Fernsehers.\nSie können Kontrast und Helligkeit fein-einstellen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videotune.jpg" />
           </info>
          <files type="package"> <!-- ohne versionsnummer, ohne .ipkg -->
                <file type="package" name="enigma2-plugin-systemplugins-videotune" />
index 6c012e841c7e6f64f410de5ea10667df0d41bb22..ef474435f9dbe360487c04f9136d662432f2873e 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_videomode.xml
 
-EXTRA_DIST = videomode.jpg
+EXTRA_DIST = videomode_en.jpg videomode_de.jpg
old mode 100644 (file)
new mode 100755 (executable)
index 3891e0b..fbb6e3f
@@ -9,7 +9,7 @@
                     <packagename>enigma2-plugin-systemplugins-videomode</packagename>
                     <shortdescription>Videomode provides advanced video modes.</shortdescription>
                     <description>The Videomode extension provides advanced video modes.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/videomode.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videomode_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <packagename>enigma2-plugin-systemplugins-videomode</packagename>
                     <shortdescription>Videomode bietet erweiterte Video Einstellungen.</shortdescription>
                     <description>Die Videomode-Erweiterung bietet erweiterte Video-Einstellungen.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/videomode.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videomode_de.jpg" />
           </info>
 
          <files type="package"> <!-- without version, without .ipk -->
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg
deleted file mode 100644 (file)
index adb5646..0000000
Binary files a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg
new file mode 100755 (executable)
index 0000000..00b7ac7
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg
new file mode 100755 (executable)
index 0000000..1f4288b
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg differ
index 365372c23776a2ec909f178788af59cdad30bf70..2f36237987af5bd6dba7bad76f07fb0ac9191715 100755 (executable)
@@ -1,6 +1,6 @@
 installdir = $(pkglibdir)/python/Plugins/SystemPlugins/WirelessLan
 
-#SUBDIRS = meta
+SUBDIRS = meta
 
 install_PYTHON =       \
        __init__.py \
index ba1e13d4ace9df1c3ef1687141c601a78bfa9ac2..1c1471cee25fd9fc7623abcb6c1a303a6b4d10ed 100755 (executable)
@@ -1,7 +1,7 @@
-from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER
-from Components.MultiContent import MultiContentEntryText
-from Components.GUIComponent import GUIComponent
-from Components.HTMLComponent import HTMLComponent
+#from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER
+#from Components.MultiContent import MultiContentEntryText
+#from Components.GUIComponent import GUIComponent
+#from Components.HTMLComponent import HTMLComponent
 from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
 from Components.Console import Console
 
@@ -35,13 +35,12 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl
 class Wlan:
        def __init__(self, iface):
                a = ''; b = ''
-               
                for i in range(0, 255):
-                   a = a + chr(i)
-                   if i < 32 or i > 127:
-                       b = b + ' '
-                   else:
-                       b = b + chr(i)
+                       a = a + chr(i)
+                       if i < 32 or i > 127:
+                               b = b + ' '
+                       else:
+                               b = b + chr(i)
                
                self.iface = iface
                self.wlaniface = {}
@@ -245,91 +244,6 @@ class Wlan:
                return status
 
 
-
-class WlanList(HTMLComponent, GUIComponent):
-       def __init__(self, session, iface):
-               
-               GUIComponent.__init__(self)
-               self.w = Wlan(iface)
-               self.iface = iface
-               
-               self.length = 0
-               self.aplist = None
-               self.list = None
-               self.oldlist = None
-               self.l = None
-               self.l = eListboxPythonMultiContent()
-               
-               self.l.setFont(0, gFont("Regular", 32))
-               self.l.setFont(1, gFont("Regular", 18))
-               self.l.setFont(2, gFont("Regular", 16))
-               self.l.setBuildFunc(self.buildWlanListEntry)            
-                               
-               self.reload()
-       
-       def buildWlanListEntry(self, essid, bssid, encrypted, iface, maxrate, signal):                                                                                                 
-               
-               res = [ (essid, encrypted, iface) ]
-               
-               if essid == "":
-                       essid = bssid
-               
-               e = encrypted and _("Yes") or _("No")
-               res.append( MultiContentEntryText(pos=(0, 0), size=(470, 35), font=0, flags=RT_HALIGN_LEFT, text=essid) )
-               res.append( MultiContentEntryText(pos=(425, 0), size=(60, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Signal: ")))
-               res.append( MultiContentEntryText(pos=(480, 0), size=(70, 35), font=0, flags=RT_HALIGN_RIGHT, text="%s" %signal))
-               res.append( MultiContentEntryText(pos=(0, 40), size=(180, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Max. Bitrate: %s") %maxrate ))
-               res.append( MultiContentEntryText(pos=(190, 40), size=(180, 20), font=1, flags=RT_HALIGN_CENTER, text=_("Encrypted: %s") %e ))
-               res.append( MultiContentEntryText(pos=(345, 40), size=(190, 20), font=1, flags=RT_HALIGN_RIGHT, text=_("Interface: %s") %iface ))
-               return res
-               
-                       
-       def reload(self):
-               aps = self.w.getNetworkList()
-
-               self.list = []
-               self.aplist = []
-               if aps is not None:
-                       print "[Wlan.py] got Accespoints!"
-                       for ap in aps:
-                               a = aps[ap]
-                               if a['active']:
-                                       if a['essid'] != '':
-                                       #       a['essid'] = a['bssid']
-                                               self.list.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) )
-                                       #self.aplist.append( a['essid'])
-               if self.oldlist is not None:
-                       for entry in self.oldlist:
-                               if entry not in self.list:
-                                       self.list.append(entry)
-               
-               if len(self.list):
-                       for entry in self.list:
-                               self.aplist.append( entry[0])
-               self.length = len(self.list)
-               self.oldlist = self.list
-               self.l.setList([])
-               self.l.setList(self.list)
-                       
-       GUI_WIDGET = eListbox
-
-
-       def getCurrent(self):
-               return self.l.getCurrentSelection()
-       
-       
-       def postWidgetCreate(self, instance):
-               instance.setContent(self.l)
-               instance.setItemHeight(60)
-       
-       
-       def getLength(self):
-               return self.length
-       
-       def getList(self):
-               return self.aplist
-
-
 class wpaSupplicant:
        def __init__(self):
                pass
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am
new file mode 100755 (executable)
index 0000000..6bc4aab
--- /dev/null
@@ -0,0 +1,5 @@
+installdir = $(datadir)/meta/
+
+dist_install_DATA = plugin_wirelesslan.xml
+
+EXTRA_DIST = wirelesslan_de.jpg wirelesslan_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml
new file mode 100755 (executable)
index 0000000..1f882b3
--- /dev/null
@@ -0,0 +1,27 @@
+<default>
+         <prerequisites>
+                    <tag type="Network" />
+                    <tag type="System" />
+         </prerequisites>
+          <info language="en">
+                    <author>Dream Multimedia</author>
+                    <name>WirelessLan</name>
+                    <packagename>enigma2-plugin-systemplugins-wirelesslan</packagename>
+                    <shortdescription>Configure your WLAN network interface</shortdescription>
+                    <description>The WirelessLan extensions helps you configuring your WLAN network interface.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_wirelesslan_en.jpg" />
+          </info>
+          <info language="de">
+                    <author>Dream Multimedia</author>
+                    <name>WirelessLan</name>
+                    <packagename>enigma2-plugin-systemplugins-wirelesslan</packagename>
+                    <shortdescription>Konfigurieren Sie Ihr WLAN Netzwerk.</shortdescription>
+                    <description>Die WirelessLan Erweiterung hilft Ihnen beim konfigurieren Ihres WLAN Netzwerkes..</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_wirelesslan_de.jpg" />
+          </info>
+
+         <files type="package"> <!-- without version, without .ipk -->
+               <file type="package" name="enigma2-plugin-systemplugins-wirelesslan" />
+       </files>
+
+</default>
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg
new file mode 100755 (executable)
index 0000000..3869541
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg
new file mode 100755 (executable)
index 0000000..fe4fa97
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg differ
index b7a64b9a44400f5b2e7311a75925d939b63d503b..a78857a674632ac0869d76e8ed71ee0763374072 100755 (executable)
@@ -4,6 +4,7 @@ from Components.ActionMap import ActionMap, NumberActionMap
 from Components.Pixmap import Pixmap,MultiPixmap
 from Components.Label import Label
 from Components.Sources.StaticText import StaticText
+from Components.Sources.List import List
 from Components.MenuList import MenuList
 from Components.config import config, getConfigListEntry, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
 from Components.ConfigList import ConfigListScreen
@@ -11,8 +12,9 @@ from Components.Network import Network, iNetwork
 from Components.Console import Console
 from Plugins.Plugin import PluginDescriptor
 from os import system, path as os_path, listdir
-from Wlan import Wlan, WlanList, wpaSupplicant
-from Wlan import Status, iStatus
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.LoadPixmap import LoadPixmap
+from Wlan import Wlan, wpaSupplicant, iStatus
 
 plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan"
 
@@ -39,37 +41,35 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl
 
 class WlanStatus(Screen):
        skin = """
-       <screen position="center,center" size="560,400" title="Wireless Network State" >
-               <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
-               <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-
-               <widget source="LabelBSSID" render="Label" position="10,60" size="250,25" valign="left" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="LabelESSID" render="Label" position="10,100" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="LabelQuality" render="Label" position="10,140" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="LabelSignal" render="Label" position="10,180" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="LabelBitrate" render="Label" position="10,220" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="LabelEnc" render="Label" position="10,260" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               
-               <widget source="BSSID" render="Label" position="320,60" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="ESSID" render="Label" position="320,100" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="quality" render="Label" position="320,140" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="signal" render="Label" position="320,180" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="bitrate" render="Label" position="320,220" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-               <widget source="enc" render="Label" position="320,260" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-
-               <ePixmap pixmap="skin_default/div-h.png" position="0,350" zPosition="1" size="560,2" />         
-               <widget source="IFtext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
-               <widget source="IF" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
-               <widget source="Statustext" render="Label" position="10,375" size="115,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1"/>
-               <widget name="statuspic" pixmaps="skin_default/buttons/button_green.png,skin_default/buttons/button_green_off.png" position="130,380" zPosition="10" size="15,16" transparent="1" alphatest="on"/>
-       </screen>
-       """
+               <screen name="WlanStatus" position="center,center" size="560,400" title="Wireless Network State" >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+       
+                       <widget source="LabelBSSID" render="Label" position="10,60" size="250,25" valign="left" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="LabelESSID" render="Label" position="10,100" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="LabelQuality" render="Label" position="10,140" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="LabelSignal" render="Label" position="10,180" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="LabelBitrate" render="Label" position="10,220" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="LabelEnc" render="Label" position="10,260" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       
+                       <widget source="BSSID" render="Label" position="320,60" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="ESSID" render="Label" position="320,100" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="quality" render="Label" position="320,140" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="signal" render="Label" position="320,180" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="bitrate" render="Label" position="320,220" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+                       <widget source="enc" render="Label" position="320,260" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+       
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,350" zPosition="1" size="560,2" />         
+                       <widget source="IFtext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
+                       <widget source="IF" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
+                       <widget source="Statustext" render="Label" position="10,375" size="115,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1"/>
+                       <widget name="statuspic" pixmaps="skin_default/buttons/button_green.png,skin_default/buttons/button_green_off.png" position="130,380" zPosition="10" size="15,16" transparent="1" alphatest="on"/>
+               </screen>"""
        
        def __init__(self, session, iface):
                Screen.__init__(self, session)
                self.session = session
                self.iface = iface
-               self.skin = WlanStatus.skin
                                    
                self["LabelBSSID"] = StaticText(_('Accesspoint:'))
                self["LabelESSID"] = StaticText(_('SSID:'))
@@ -114,7 +114,6 @@ class WlanStatus(Screen):
                self.setTitle(_("Wireless Network State"))
                
        def resetList(self):
-               print "self.iface im resetlist",self.iface
                iStatus.getDataForInterface(self.iface,self.getInfoCB)
                
        def getInfoCB(self,data,status):
@@ -134,7 +133,6 @@ class WlanStatus(Screen):
                self.close()    
 
        def updateStatusbar(self):
-               print "self.iface im updateStatusbar",self.iface
                self["BSSID"].setText(_("Please wait..."))
                self["ESSID"].setText(_("Please wait..."))
                self["quality"].setText(_("Please wait..."))
@@ -155,37 +153,55 @@ class WlanStatus(Screen):
 
 class WlanScan(Screen):
        skin = """
-       <screen position="center,center" size="560,400" title="Choose a Wireless Network" >
-               <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
-               <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
-               <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
-               <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-               <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-               <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
-               <widget name="list" position="5,50" size="550,280" scrollbarMode="showOnDemand" />
-               <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />         
-               <widget source="info" render="Label" position="0,350" size="560,50" font="Regular;24" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
-       </screen>
-       """
+               <screen name="WlanScan" position="center,center" size="560,400" title="Choose a Wireless Network" >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="list" render="Listbox" position="5,40" size="550,300" scrollbarMode="showOnDemand">
+                               <convert type="TemplatedMultiContent">
+                                       {"template": [
+                                                       MultiContentEntryText(pos = (0, 0), size = (550, 30), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the essid
+                                                       MultiContentEntryText(pos = (0, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 5), # index 5 is the interface
+                                                       MultiContentEntryText(pos = (175, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 4), # index 0 is the encryption
+                                                       MultiContentEntryText(pos = (350, 0), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 0 is the signal
+                                                       MultiContentEntryText(pos = (350, 30), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 3), # index 0 is the maxrate
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (550, 2), png = 6), # index 6 is the div pixmap
+                                               ],
+                                       "fonts": [gFont("Regular", 28),gFont("Regular", 18)],
+                                       "itemHeight": 54
+                                       }
+                               </convert>
+                       </widget>
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />         
+                       <widget source="info" render="Label" position="0,350" size="560,50" font="Regular;24" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+               </screen>"""
 
        def __init__(self, session, iface):
                Screen.__init__(self, session)
                self.session = session
                self.iface = iface
-               self.skin = WlanScan.skin
                self.skin_path = plugin_path
                self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up")
+               self.APList = None
+               self.newAPList = None
+               self.WlanList = None
+               self.cleanList = None
+               self.oldlist = None
+               self.listLenght = None
+               self.rescanTimer = eTimer()
+               self.rescanTimer.callback.append(self.rescanTimerFired)
                
                self["info"] = StaticText()
                
-               self.list = []  
-               self["list"] = WlanList(self.session, self.iface)
+               self.list = []
+               self["list"] = List(self.list)
                
-               self.setInfo()
-
                self["key_red"] = StaticText(_("Close"))
                self["key_green"] = StaticText(_("Connect"))
-               self["key_yellow"] = StaticText(_("Refresh"))
+               self["key_yellow"] = StaticText()
                        
                self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"],
                {
@@ -195,63 +211,163 @@ class WlanScan(Screen):
                
                self["shortcuts"] = ActionMap(["ShortcutActions"],
                {
-                       "red": self.cancel,
+                       "red": self.cancel,
                        "green": self.select,
-                       "yellow": self.rescan,
                })
                self.onLayoutFinish.append(self.layoutFinished)
+               self.getAccessPoints(refresh = False)
                
        def layoutFinished(self):
                self.setTitle(_("Choose a wireless network"))
        
        def select(self):
                cur = self["list"].getCurrent()
-               #print "CURRENT",cur
                if cur is not None:
+                       self.rescanTimer.stop()
+                       del self.rescanTimer
                        if cur[1] is not None:
-                               essid = cur[0]
-                               if essid == '':
-                                       essid = cur[1]
-                               encrypted = cur[2]
-                               self.close(essid,self["list"].getList())
+                               essid = cur[1]
+                               self.close(essid,self.getWlanList())
                        else:
                                self.close(None,None)
                else:
+                       self.rescanTimer.stop()
+                       del self.rescanTimer
                        self.close(None,None)
        
        def WlanSetupClosed(self, *ret):
                if ret[0] == 2:
+                       self.rescanTimer.stop()
+                       del self.rescanTimer
                        self.close(None)
        
-       def rescan(self):
-               self["list"].reload()
-               self.setInfo()
-       
        def cancel(self):
                if self.oldInterfaceState is False:
+                       iNetwork.setAdapterAttribute(self.iface, "up", False)
                        iNetwork.deactivateInterface(self.iface,self.deactivateInterfaceCB)
                else:
+                       self.rescanTimer.stop()
+                       del self.rescanTimer
                        self.close(None)
 
        def deactivateInterfaceCB(self,data):
                if data is not None:
                        if data is True:
-                               iNetwork.getInterfaces(self.cancelCB)
-       
-       def cancelCB(self,data):                        
-               if data is not None:
-                       if data is True:
+                               self.rescanTimer.stop()
+                               del self.rescanTimer
                                self.close(None)
 
-       def setInfo(self):
-               length = self["list"].getLength()
+       def rescanTimerFired(self):
+               self.rescanTimer.stop()
+               self.updateAPList()
+
+       def buildEntryComponent(self, essid, bssid, encrypted, iface, maxrate, signal):
+               print "buildEntryComponent",essid
+               print "buildEntryComponent",bssid
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+               encryption = encrypted and _("Yes") or _("No")
+               if bssid == 'hidden...':
+                       return((essid, bssid, None, None, None, None, divpng))
+               else:                                   
+                       return((essid, bssid, _("Signal: ") + str(signal), _("Max. Bitrate: ") + str(maxrate), _("Encrypted: ") + encryption, _("Interface: ") + str(iface), divpng))
+
+       def updateAPList(self):
+               self.oldlist = []
+               self.oldlist = self.cleanList
+               self.newAPList = []
+               newList = []
+               tmpList = []
+               newListIndex = None
+               currentListEntry = None
+               currentListIndex = None
+               newList = self.getAccessPoints(refresh = True)
                
+               for oldentry in self.oldlist:
+                       if oldentry not in newList:
+                               newList.append(oldentry)
+
+               for newentry in newList:
+                       if newentry[1] == "hidden...":
+                               continue
+                       tmpList.append(newentry)
+
+               if len(tmpList):
+                       if "hidden..." not in tmpList:
+                               tmpList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) )
+       
+                       for entry in tmpList:
+                               self.newAPList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ))
+       
+                       currentListEntry = self["list"].getCurrent()
+                       idx = 0
+                       for entry in self.newAPList:
+                               if entry == currentListEntry:
+                                       newListIndex = idx
+                               idx +=1
+                       self['list'].setList(self.newAPList)
+                       self["list"].setIndex(newListIndex)
+                       self["list"].updateList(self.newAPList)
+                       self.listLenght = len(self.newAPList)
+                       self.buildWlanList()
+                       self.setInfo()
+
+       def getAccessPoints(self, refresh = False):
+               self.APList = []
+               self.cleanList = []
+               self.w = Wlan(self.iface)
+               aps = self.w.getNetworkList()
+               if aps is not None:
+                       print "[NetworkWizard.py] got Accespoints!"
+                       tmpList = []
+                       compList = []
+                       for ap in aps:
+                               a = aps[ap]
+                               if a['active']:
+                                       tmpList.append( (a['essid'], a['bssid']) )
+                                       compList.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) )
+
+                       for entry in tmpList:
+                               if entry[0] == "":
+                                       for compentry in compList:
+                                               if compentry[1] == entry[1]:
+                                                       compList.remove(compentry)
+                       for entry in compList:
+                               self.cleanList.append( ( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ) )
+               
+               if "hidden..." not in self.cleanList:
+                       self.cleanList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) )
+
+               for entry in self.cleanList:
+                       self.APList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ))
+               
+               if refresh is False:
+                       self['list'].setList(self.APList)
+               self.listLenght = len(self.APList)
+               self.setInfo()
+               self.rescanTimer.start(5000)
+               return self.cleanList
+
+       def setInfo(self):
+               length = self.getLength()
                if length == 0:
                        self["info"].setText(_("No wireless networks found! Please refresh."))
                elif length == 1:
                        self["info"].setText(_("1 wireless network found!"))
                else:
-                       self["info"].setText(str(length)+_(" wireless networks found!"))        
+                       self["info"].setText(str(length)+_(" wireless networks found!"))
+
+       def buildWlanList(self):
+               self.WlanList = []
+               currList = []
+               currList = self['list'].list
+               for entry in currList:
+                       self.WlanList.append( (entry[1], entry[0]) )            
+
+       def getLength(self):
+               return self.listLenght          
+
+       def getWlanList(self):
+               return self.WlanList
 
 
 def WlanStatusScreenMain(session, iface):
@@ -259,13 +375,11 @@ def WlanStatusScreenMain(session, iface):
 
 
 def callFunction(iface):
-       
        w = Wlan(iface)
        i = w.getWirelessInterfaces()
        if i:
                if iface in i:
                        return WlanStatusScreenMain
-       
        return None
 
 
index 3dde7e2286f89427285b12aef6a414431b6c0e92..f8edba11fe06c9e6b737f5afcd08f5e0b1393095 100644 (file)
@@ -6,6 +6,7 @@ from Components.Label import Label
 from Components.EpgList import EPGList, EPG_TYPE_SINGLE, EPG_TYPE_SIMILAR, EPG_TYPE_MULTI
 from Components.ActionMap import ActionMap
 from Components.TimerSanityCheck import TimerSanityCheck
+from Components.UsageConfig import preferredTimerPath
 from Components.Sources.ServiceEvent import ServiceEvent
 from Components.Sources.Event import Event
 from Screens.TimerEdit import TimerSanityConflict
@@ -235,7 +236,7 @@ class EPGSelection(Screen):
                                self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
                                break
                else:
-                       newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event))
+                       newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(event))
                        self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
 
        def finishedAdd(self, answer):
index c1ffb5851d3e3e34c064076aabdddc90b47480ef..cced3ceba1fa60f1535a289aabdb4c319f51372a 100644 (file)
@@ -6,6 +6,7 @@ from Components.Button import Button
 from Components.Label import Label
 from Components.ScrollLabel import ScrollLabel
 from Components.TimerList import TimerList
+from Components.UsageConfig import preferredTimerPath
 from enigma import eEPGCache, eTimer, eServiceReference
 from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
 from TimerEntry import TimerEntry
@@ -85,7 +86,7 @@ class EventViewBase:
                                self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
                                break
                else:
-                       newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, *parseEvent(self.event))
+                       newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(self.event))
                        self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
 
        def finishedAdd(self, answer):
index 59cc21d3e956834cdab50ae797e4afc0813b24de..a15c7ac1b89b5597b0b314d6cf6f5fc55935d5e7 100644 (file)
@@ -212,7 +212,6 @@ class MoviePlayer(InfoBarBase, InfoBarShowHide, \
                                        return
 
                if answer in ("quit", "quitanddeleteconfirmed"):
-                       config.movielist.last_videodir.cancel()
                        self.close()
                elif answer == "movielist":
                        ref = self.session.nav.getCurrentlyPlayingServiceReference()
index 2cbfeb733819faceecff80e23feecbe0982297a9..5d240138bc9a60f5290c6ac2f5d99723dbd3e623 100644 (file)
@@ -10,6 +10,7 @@ from Components.ServiceEventTracker import ServiceEventTracker
 from Components.Sources.Boolean import Boolean
 from Components.config import config, ConfigBoolean, ConfigClock
 from Components.SystemInfo import SystemInfo
+from Components.UsageConfig import preferredInstantRecordPath, defaultMoviePath
 from EpgSelection import EPGSelection
 from Plugins.Plugin import PluginDescriptor
 
@@ -28,7 +29,7 @@ from Screens.TimeDateInput import TimeDateInput
 from ServiceReference import ServiceReference
 
 from Tools import Notifications
-from Tools.Directories import SCOPE_HDD, resolveFilename, fileExists
+from Tools.Directories import fileExists
 
 from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \
        iPlayableService, eServiceReference, eEPGCache
@@ -690,8 +691,7 @@ class InfoBarSeek:
                                iPlayableService.evEOF: self.__evEOF,
                                iPlayableService.evSOF: self.__evSOF,
                        })
-
-               self.minSpeedBackward = useSeekBackHack and 16 or 0
+               self.fast_winding_hint_message_showed = False
 
                class InfoBarSeekActionMap(HelpableActionMap):
                        def __init__(self, screen, *args, **kwargs):
@@ -739,24 +739,19 @@ class InfoBarSeek:
                self.__seekableStatusChanged()
 
        def makeStateForward(self, n):
-               minspeed = config.seek.stepwise_minspeed.value
-               repeat = int(config.seek.stepwise_repeat.value)
-               if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
-                       return (0, n * repeat, repeat, ">> %dx" % n)
-               else:
+#              minspeed = config.seek.stepwise_minspeed.value
+#              repeat = int(config.seek.stepwise_repeat.value)
+#              if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
+#                      return (0, n * repeat, repeat, ">> %dx" % n)
+#              else:
                        return (0, n, 0, ">> %dx" % n)
 
        def makeStateBackward(self, n):
-               minspeed = config.seek.stepwise_minspeed.value
-               repeat = int(config.seek.stepwise_repeat.value)
-               if self.minSpeedBackward and n < self.minSpeedBackward:
-                       r = (self.minSpeedBackward - 1)/ n + 1
-                       if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
-                               r = max(r, repeat)
-                       return (0, -n * r, r, "<< %dx" % n)
-               elif minspeed != "Never" and n >= int(minspeed) and repeat > 1:
-                       return (0, -n * repeat, repeat, "<< %dx" % n)
-               else:
+#              minspeed = config.seek.stepwise_minspeed.value
+#              repeat = int(config.seek.stepwise_repeat.value)
+#              if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
+#                      return (0, -n * repeat, repeat, "<< %dx" % n)
+#              else:
                        return (0, -n, 0, "<< %dx" % n)
 
        def makeStateSlowMotion(self, n):
@@ -823,6 +818,7 @@ class InfoBarSeek:
 #                      print "seekable"
 
        def __serviceStarted(self):
+               self.fast_winding_hint_message_showed = False
                self.seekstate = self.SEEK_STATE_PLAY
                self.__seekableStatusChanged()
 
@@ -876,7 +872,7 @@ class InfoBarSeek:
                        if config.seek.on_pause.value == "play":
                                self.unPauseService()
                        elif config.seek.on_pause.value == "step":
-                               self.doSeekRelative(0)
+                               self.doSeekRelative(1)
                        elif config.seek.on_pause.value == "last":
                                self.setSeekState(self.lastseekstate)
                                self.lastseekstate = self.SEEK_STATE_PLAY
@@ -913,6 +909,12 @@ class InfoBarSeek:
                        self.showAfterSeek()
 
        def seekFwd(self):
+               seek = self.getSeek()
+               if seek and not (seek.isCurrentlySeekable() & 2):
+                       if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+                               self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+                               self.fast_winding_hint_message_showed = True
+                       return
                if self.seekstate == self.SEEK_STATE_PLAY:
                        self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value)))
                elif self.seekstate == self.SEEK_STATE_PAUSE:
@@ -942,6 +944,12 @@ class InfoBarSeek:
                        self.setSeekState(self.makeStateSlowMotion(speed))
 
        def seekBack(self):
+               seek = self.getSeek()
+               if seek and not (seek.isCurrentlySeekable() & 2):
+                       if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+                               self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+                               self.fast_winding_hint_message_showed = True
+                       return
                seekstate = self.seekstate
                if seekstate == self.SEEK_STATE_PLAY:
                        self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
@@ -949,7 +957,7 @@ class InfoBarSeek:
                        self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
                        self.doSeekRelative(-6)
                elif seekstate == self.SEEK_STATE_PAUSE:
-                       self.doSeekRelative(-3)
+                       self.doSeekRelative(-1)
                elif self.isStateForward(seekstate):
                        speed = seekstate[1]
                        if seekstate[2]:
@@ -1484,7 +1492,7 @@ class InfoBarInstantRecord:
                if isinstance(serviceref, eServiceReference):
                        serviceref = ServiceReference(serviceref)
 
-               recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = config.movielist.last_videodir.value)
+               recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = preferredInstantRecordPath())
                recording.dontSave = True
                
                if event is None or limitEvent == False:
@@ -1585,9 +1593,9 @@ class InfoBarInstantRecord:
                        self.session.nav.RecordTimer.timeChanged(entry)
 
        def instantRecord(self):
-               dir = config.movielist.last_videodir.value
-               if not fileExists(dir, 'w'):
-                       dir = resolveFilename(SCOPE_HDD)
+               dir = preferredInstantRecordPath()
+               if not dir or not fileExists(dir, 'w'):
+                       dir = defaultMoviePath()
                try:
                        stat = os_stat(dir)
                except:
@@ -1669,17 +1677,46 @@ class InfoBarAudioSelection:
                                else:
                                        break
 
+                       availableKeys = []
+                       usedKeys = []
+
                        if SystemInfo["CanDownmixAC3"]:
-                               tlist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix),
-                                       ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"),
-                                       ("--", "")] + tlist
-                               keys = [ "red", "green", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
-                               selection += 3
-                       else:
-                               tlist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist
-                               keys = [ "red", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
+                               flist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix),
+                                       ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")]
+                               usedKeys.extend(["red", "green"])
+                               availableKeys.extend(["yellow", "blue"])
                                selection += 2
-                       self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = tlist, selection = selection, keys = keys, skin_name = "AudioTrackSelection")
+                       else:
+                               flist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")]
+                               usedKeys.extend(["red"])
+                               availableKeys.extend(["green", "yellow", "blue"])
+                               selection += 1
+
+                       if hasattr(self, "runPlugin"):
+                               class PluginCaller:
+                                       def __init__(self, fnc, *args):
+                                               self.fnc = fnc
+                                               self.args = args
+                                       def __call__(self, *args, **kwargs):
+                                               self.fnc(*self.args)
+
+                               Plugins = [ (p.name, PluginCaller(self.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ]
+
+                               for p in Plugins:
+                                       selection += 1
+                                       flist.append((p[0], "CALLFUNC", p[1]))
+                                       if availableKeys:
+                                               usedKeys.append(availableKeys[0])
+                                               del availableKeys[0]
+                                       else:
+                                               usedKeys.append("")
+
+                       flist.append(("--", ""))
+                       usedKeys.append("")
+                       selection += 1
+
+                       keys = usedKeys + [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ] + [""] * n
+                       self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = flist + tlist, selection = selection, keys = keys, skin_name = "AudioTrackSelection")
                else:
                        del self.audioTracks
 
old mode 100644 (file)
new mode 100755 (executable)
index 082daa5..fce10ac
@@ -13,14 +13,14 @@ def _cached(x):
 
 from Screens.Rc import Rc
 
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 
 from Tools.LoadPixmap import LoadPixmap
 
 def LanguageEntryComponent(file, name, index):
-       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "countries/" + file + ".png"))
+       png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "countries/" + file + ".png"))
        if png == None:
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "countries/missing.png"))
+               png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "countries/missing.png"))
        res = (index, name, png)
        return res
 
index 61d7105dfbbbc787e86e319fb41ca1827f29b473..29d94f553fef38bd347ad1db29b57edc0ff14f36 100644 (file)
@@ -289,6 +289,11 @@ class LocationBox(Screen, NumericalTextInput, HelpableScreen):
                        else:
                                self["filelist"].refresh()
                                self.removeBookmark(name, True)
+                               val = self.realBookmarks and self.realBookmarks.value
+                               if val and name in val:
+                                       val.remove(name)
+                                       self.realBookmarks.value = val
+                                       self.realBookmarks.save()
 
        def up(self):
                self[self.currList].up()
index 44994b86d0a5aab8c8d50b7364254459e02fb1ec..585983c2752f0ffc694bf975ee54ab9a4f401211 100755 (executable)
@@ -14,5 +14,5 @@ install_PYTHON = \
        SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
        SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \
        SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py \
-       TextBox.py FactoryReset.py
+       TextBox.py FactoryReset.py RecordPaths.py
 
index 5f2032f16d2f0fe3608fcf0f82299fb9e83467d5..bb0709e5955a9be8fd72e8445fad9cb4fc85e0b6 100644 (file)
@@ -97,8 +97,12 @@ class Menu(Screen):
 
        def addMenu(self, destList, node):
                requires = node.get("requires")
-               if requires and not SystemInfo.get(requires, False):
-                       return
+               if requires:
+                       if requires[0] == '!':
+                               if SystemInfo.get(requires[1:], False):
+                                       return
+                       elif not SystemInfo.get(requires, False):
+                               return
                MenuTitle = _(node.get("text", "??").encode("UTF-8"))
                entryID = node.get("entryID", "undefined")
                weight = node.get("weight", 50)
@@ -120,8 +124,12 @@ class Menu(Screen):
 
        def addItem(self, destList, node):
                requires = node.get("requires")
-               if requires and not SystemInfo.get(requires, False):
-                       return
+               if requires:
+                       if requires[0] == '!':
+                               if SystemInfo.get(requires[1:], False):
+                                       return
+                       elif not SystemInfo.get(requires, False):
+                               return
                item_text = node.get("text", "").encode("UTF-8")
                entryID = node.get("entryID", "undefined")
                weight = node.get("weight", 50)
index 86bf07d3b69bff1fc2b18799d521d548e2b35419..f3538b7b730090e71cd6e1fdc4041ec39ec33eee 100644 (file)
@@ -12,9 +12,11 @@ class MessageBox(Screen):
        TYPE_WARNING = 2
        TYPE_ERROR = 3
 
-       def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False, default = True, enable_input = True):
+       def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False, default = True, enable_input = True, msgBoxID = None):
                self.type = type
                Screen.__init__(self, session)
+               
+               self.msgBoxID = msgBoxID
 
                self["text"] = Label(text)
                self["Text"] = StaticText(text)
index 174a4f072050e6d5961d31ea785a856d9f7aa11d..15f6b465c62fa0a21a819db6c624a7785cf1532a 100644 (file)
@@ -7,8 +7,9 @@ from Components.DiskInfo import DiskInfo
 from Components.Pixmap import Pixmap
 from Components.Label import Label
 from Components.PluginComponent import plugins
-from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations
+from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations, ConfigSet
 from Components.Sources.ServiceEvent import ServiceEvent
+from Components.UsageConfig import defaultMoviePath
 
 from Plugins.Plugin import PluginDescriptor
 
@@ -31,6 +32,7 @@ config.movielist.last_timer_videodir = ConfigText(default=resolveFilename(SCOPE_
 config.movielist.videodirs = ConfigLocations(default=[resolveFilename(SCOPE_HDD)])
 config.movielist.first_tags = ConfigText(default="")
 config.movielist.second_tags = ConfigText(default="")
+config.movielist.last_selected_tags = ConfigSet([], default=[])
 
 
 def setPreferredTagEditor(te):
@@ -168,7 +170,10 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                HelpableScreen.__init__(self)
 
                self.tags = [ ]
-               self.selected_tags = None
+               if selectedmovie:
+                       self.selected_tags = config.movielist.last_selected_tags.value
+               else:
+                       self.selected_tags = None
                self.selected_tags_ele = None
 
                self.movemode = False
@@ -183,8 +188,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                self["DescriptionBorder"] = Pixmap()
                self["DescriptionBorder"].hide()
 
-               if not pathExists(config.movielist.last_videodir.value):
-                       config.movielist.last_videodir.value = resolveFilename(SCOPE_HDD)
+               if not fileExists(config.movielist.last_videodir.value):
+                       config.movielist.last_videodir.value = defaultMoviePath()
                        config.movielist.last_videodir.save()
                self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + config.movielist.last_videodir.value)
 
@@ -292,6 +297,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                self.close(None)
 
        def saveconfig(self):
+               config.movielist.last_selected_tags.value = self.selected_tags
                config.movielist.moviesort.save()
                config.movielist.listtype.save()
                config.movielist.description.save()
@@ -339,8 +345,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
                self["list"].setSortType(type)
 
        def reloadList(self, sel = None, home = False):
-               if not pathExists(config.movielist.last_videodir.value):
-                       path = resolveFilename(SCOPE_HDD)
+               if not fileExists(config.movielist.last_videodir.value):
+                       path = defaultMoviePath()
                        config.movielist.last_videodir.value = path
                        config.movielist.last_videodir.save()
                        self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + path)
@@ -370,7 +376,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
 
        def gotFilename(self, res):
                if res is not None and res is not config.movielist.last_videodir.value:
-                       if pathExists(res):
+                       if fileExists(res):
                                config.movielist.last_videodir.value = res
                                config.movielist.last_videodir.save()
                                self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res)
@@ -392,7 +398,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
        def showTagsN(self, tagele):
                if not self.tags:
                        self.showTagWarning()
-               elif not tagele or self.selected_tags_ele == tagele or not tagele.value in self.tags:
+               elif not tagele or tagele.value in self.selected_tags or not tagele.value in self.tags:
                        self.showTagsMenu(tagele)
                else:
                        self.selected_tags_ele = tagele
index ec2bafe54de9dfc065db3bcac2594586ee0a2b40..92416a33a299fbc5cbdcb5f80b466929974b146b 100755 (executable)
@@ -6,6 +6,7 @@ from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.HelpMenu import HelpableScreen
 from Components.Network import iNetwork
 from Components.Sources.StaticText import StaticText
+from Components.Sources.Boolean import Boolean
 from Components.Label import Label,MultiColorLabel
 from Components.Pixmap import Pixmap,MultiPixmap
 from Components.MenuList import MenuList
@@ -14,7 +15,7 @@ from Components.ConfigList import ConfigListScreen
 from Components.PluginComponent import plugins
 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
 from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap
-from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_SKIN
 from Tools.LoadPixmap import LoadPixmap
 from Plugins.Plugin import PluginDescriptor
 from enigma import eTimer, ePoint, eSize, RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont
@@ -36,14 +37,14 @@ def InterfaceEntryComponent(index,name,default,active ):
        num_configured_if = len(iNetwork.getConfiguredAdapters())
        if num_configured_if >= 2:
                if default is True:
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue.png"))
+                       png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue.png"))
                if default is False:
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue_off.png"))
+                       png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue_off.png"))
                res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 5), size=(25, 25), png = png))
        if active is True:
-               png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png"))
+               png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png"))
        if active is False:
-               png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_error.png"))
+               png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_error.png"))
        res.append(MultiContentEntryPixmapAlphaTest(pos=(40, 1), size=(25, 25), png = png2))
        return res
 
@@ -319,11 +320,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
                        "blue": (self.KeyBlue, _("open nameserver configuration")),
                        })
 
-               self["VirtualKB"] = HelpableActionMap(self, "VirtualKeyboardActions",
-                       {
-                       "showVirtualKeyboard": (self.KeyText, [_("open virtual keyboard input help"),_("* Only available when entering hidden SSID or network key")] ),
-                       })
-
                self["actions"] = NumberActionMap(["SetupActions"],
                {
                        "ok": self.ok,
@@ -355,9 +351,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
                self["key_red"] = StaticText(_("Cancel"))
                self["key_blue"] = StaticText(_("Edit DNS"))
 
-               self["VKeyIcon"] = Pixmap()
+               self["VKeyIcon"] = Boolean(False)
                self["HelpWindow"] = Pixmap()
-
+               self["HelpWindow"].hide()
+               
        def layoutFinished(self):
                self["DNS1"].setText(self.primaryDNS.getText())
                self["DNS2"].setText(self.secondaryDNS.getText())
@@ -386,9 +383,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
                        self["Gateway"].setText("")
                        self["Gatewaytext"].setText("")
                self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface))
-               self["VKeyIcon"].hide()
-               self["VirtualKB"].setEnabled(False)
-               self["HelpWindow"].hide()
 
        def createConfig(self):
                self.InterfaceEntry = None
@@ -518,30 +512,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
 
                self["config"].list = self.list
                self["config"].l.setList(self.list)
-               if not self.selectionChanged in self["config"].onSelectionChanged:
-                       self["config"].onSelectionChanged.append(self.selectionChanged)
 
        def KeyBlue(self):
                self.session.openWithCallback(self.NameserverSetupClosed, NameserverSetup)
 
-       def KeyText(self):
-               if self.iface == "wlan0" or self.iface == "ath0" :
-                       if self["config"].getCurrent() == self.hiddenSSID:
-                               if config.plugins.wlan.essid.value == 'hidden...':
-                                       self.session.openWithCallback(self.VirtualKeyBoardSSIDCallback, VirtualKeyBoard, title = (_("Enter WLAN network name/SSID:")), text = config.plugins.wlan.essid.value)
-                       if self["config"].getCurrent() == self.encryptionKey:
-                               self.session.openWithCallback(self.VirtualKeyBoardKeyCallback, VirtualKeyBoard, title = (_("Enter WLAN passphrase/key:")), text = config.plugins.wlan.encryption.psk.value)
-
-       def VirtualKeyBoardSSIDCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       config.plugins.wlan.hiddenessid.setValue(callback)
-                       self["config"].invalidate(self.hiddenSSID)
-
-       def VirtualKeyBoardKeyCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       config.plugins.wlan.encryption.psk.setValue(callback)
-                       self["config"].invalidate(self.encryptionKey)
-
        def newConfig(self):
                if self["config"].getCurrent() == self.InterfaceEntry:
                        self.createSetup()
@@ -565,24 +539,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
                ConfigListScreen.keyRight(self)
                self.newConfig()
 
-       def selectionChanged(self):
-               current = self["config"].getCurrent()
-               if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...':
-                       helpwindowpos = self["HelpWindow"].getPosition()
-                       if current[1].help_window.instance is not None:
-                               current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
-                               self["VKeyIcon"].show()
-                               self["VirtualKB"].setEnabled(True)
-               elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value:
-                       helpwindowpos = self["HelpWindow"].getPosition()
-                       if current[1].help_window.instance is not None:
-                               current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
-                               self["VKeyIcon"].show()
-                               self["VirtualKB"].setEnabled(True)
-               else:
-                       self["VKeyIcon"].hide()
-                       self["VirtualKB"].setEnabled(False)
-
        def ok(self):
                current = self["config"].getCurrent()
                if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...':
index 3a7df9fb9cb49a2120e61eee042b1d0360120f5b..61bb7d0ac8e99a9aa0e221204dde06bfa2c10c50 100755 (executable)
@@ -1,5 +1,5 @@
 from Screen import Screen
-
+from Components.Language import language
 from enigma import eConsoleAppContainer
 
 from Components.ActionMap import ActionMap
@@ -14,6 +14,10 @@ from Tools.LoadPixmap import LoadPixmap
 
 from time import time
 
+def languageChanged():
+       plugins.clearPluginList()
+       plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+
 class PluginBrowser(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
@@ -226,3 +230,4 @@ class PluginDownloadBrowser(Screen):
                self.list = list
                self["list"].l.setList(list)
 
+language.addCallback(languageChanged)
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 36d4590..0b99584
@@ -4,7 +4,7 @@ from Components.ActionMap import NumberActionMap
 from Components.ServiceEventTracker import ServiceEventTracker
 from Components.Pixmap import Pixmap
 from Components.Label import Label
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 from Tools.LoadPixmap import LoadPixmap
 
 class RdsInfoDisplay(Screen):
@@ -122,10 +122,10 @@ class RassInteractive(Screen):
                        9 : self["subpages_9"] }
 
                self.subpage_png = {
-                       1 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page1.png")),
-                       2 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page2.png")),
-                       3 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page3.png")),
-                       4 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page4.png")) }
+                       1 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page1.png")),
+                       2 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page2.png")),
+                       3 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page3.png")),
+                       4 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page4.png")) }
 
                self.current_page=0;
                self.current_subpage=0;
diff --git a/lib/python/Screens/RecordPaths.py b/lib/python/Screens/RecordPaths.py
new file mode 100644 (file)
index 0000000..c833266
--- /dev/null
@@ -0,0 +1,194 @@
+from Screens.Screen import Screen
+from Screens.LocationBox import MovieLocationBox, TimeshiftLocationBox
+from Screens.MessageBox import MessageBox
+from Components.Label import Label
+from Components.config import config, ConfigSelection, getConfigListEntry, configfile
+from Components.ConfigList import ConfigListScreen
+from Components.ActionMap import ActionMap
+from Tools.Directories import fileExists
+
+
+class RecordPathsSettings(Screen,ConfigListScreen):
+       skin = """
+               <screen name="RecordPathsSettings" position="160,150" size="450,200" title="Recording paths">
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="10,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="300,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="10,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="300,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget name="config" position="10,44" size="430,146" />
+               </screen>"""
+
+       def __init__(self, session):
+               from Components.Sources.StaticText import StaticText
+               Screen.__init__(self, session)
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("Save"))
+
+               ConfigListScreen.__init__(self, [])
+               self.initConfigList()
+
+               self["setupActions"] = ActionMap(["SetupActions", "ColorActions"],
+               {
+                   "green": self.save,
+                   "red": self.cancel,
+                   "cancel": self.cancel,
+                   "ok": self.ok,
+               }, -2)
+
+       def checkReadWriteDir(self, configele):
+               print "checkReadWrite: ", configele.value
+               if configele.value in [x[0] for x in self.styles] or fileExists(configele.value, "w"):
+                       configele.last_value = configele.value
+                       return True
+               else:
+                       dir = configele.value
+                       configele.value = configele.last_value
+                       self.session.open(
+                               MessageBox,
+                               _("The directory %s is not writable.\nMake sure you select a writable directory instead.")%dir,
+                               type = MessageBox.TYPE_ERROR
+                               )
+                       return False
+
+       def initConfigList(self):
+               self.styles = [ ("<default>", _("<Default movie location>")), ("<current>", _("<Current movielist location>")), ("<timer>", _("<Last timer location>")) ]
+               styles_keys = [x[0] for x in self.styles]
+               tmp = config.movielist.videodirs.value
+               default = config.usage.default_path.value
+               if default not in tmp:
+                       tmp = tmp[:]
+                       tmp.append(default)
+               print "DefaultPath: ", default, tmp
+               self.default_dirname = ConfigSelection(default = default, choices = tmp)
+               tmp = config.movielist.videodirs.value
+               default = config.usage.timer_path.value
+               if default not in tmp and default not in styles_keys:
+                       tmp = tmp[:]
+                       tmp.append(default)
+               print "TimerPath: ", default, tmp
+               self.timer_dirname = ConfigSelection(default = default, choices = self.styles+tmp)
+               tmp = config.movielist.videodirs.value
+               default = config.usage.instantrec_path.value
+               if default not in tmp and default not in styles_keys:
+                       tmp = tmp[:]
+                       tmp.append(default)
+               print "InstantrecPath: ", default, tmp
+               self.instantrec_dirname = ConfigSelection(default = default, choices = self.styles+tmp)
+               default = config.usage.timeshift_path.value
+               tmp = config.usage.allowed_timeshift_paths.value
+               if default not in tmp:
+                       tmp = tmp[:]
+                       tmp.append(default)
+               print "TimeshiftPath: ", default, tmp
+               self.timeshift_dirname = ConfigSelection(default = default, choices = tmp)
+               self.default_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+               self.timer_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+               self.instantrec_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+               self.timeshift_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+
+               self.list = []
+               if config.usage.setup_level.index >= 2:
+                       self.default_entry = getConfigListEntry(_("Default movie location"), self.default_dirname)
+                       self.list.append(self.default_entry)
+                       self.timer_entry = getConfigListEntry(_("Timer record location"), self.timer_dirname)
+                       self.list.append(self.timer_entry)
+                       self.instantrec_entry = getConfigListEntry(_("Instant record location"), self.instantrec_dirname)
+                       self.list.append(self.instantrec_entry)
+               else:
+                       self.default_entry = getConfigListEntry(_("Movie location"), self.default_dirname)
+                       self.list.append(self.default_entry)
+               self.timeshift_entry = getConfigListEntry(_("Timeshift location"), self.timeshift_dirname)
+               self.list.append(self.timeshift_entry)
+               self["config"].setList(self.list)
+
+       def ok(self):
+               currentry = self["config"].getCurrent()
+               self.lastvideodirs = config.movielist.videodirs.value
+               self.lasttimeshiftdirs = config.usage.allowed_timeshift_paths.value
+               if config.usage.setup_level.index >= 2:
+                       txt = _("Default movie location")
+               else:
+                       txt = _("Movie location")
+               if currentry == self.default_entry:
+                       self.entrydirname = self.default_dirname
+                       self.session.openWithCallback(
+                               self.dirnameSelected,
+                               MovieLocationBox,
+                               txt,
+                               self.default_dirname.value
+                       )
+               elif currentry == self.timer_entry:
+                       self.entrydirname = self.timer_dirname
+                       self.session.openWithCallback(
+                               self.dirnameSelected,
+                               MovieLocationBox,
+                               _("Initial location in new timers"),
+                               self.timer_dirname.value
+                       )
+               elif currentry == self.instantrec_entry:
+                       self.entrydirname = self.instantrec_dirname
+                       self.session.openWithCallback(
+                               self.dirnameSelected,
+                               MovieLocationBox,
+                               _("Location for instant recordings"),
+                               self.instantrec_dirname.value
+                       )
+               elif currentry == self.timeshift_entry:
+                       self.entrydirname = self.timeshift_dirname
+                       config.usage.timeshift_path.value = self.timeshift_dirname.value
+                       self.session.openWithCallback(
+                               self.dirnameSelected,
+                               TimeshiftLocationBox
+                       )
+
+       def dirnameSelected(self, res):
+               if res is not None:
+                       self.entrydirname.value = res
+                       if config.movielist.videodirs.value != self.lastvideodirs:
+                               styles_keys = [x[0] for x in self.styles]
+                               tmp = config.movielist.videodirs.value
+                               default = self.default_dirname.value
+                               if default not in tmp:
+                                       tmp = tmp[:]
+                                       tmp.append(default)
+                               self.default_dirname.setChoices(tmp, default=default)
+                               tmp = config.movielist.videodirs.value
+                               default = self.timer_dirname.value
+                               if default not in tmp and default not in styles_keys:
+                                       tmp = tmp[:]
+                                       tmp.append(default)
+                               self.timer_dirname.setChoices(self.styles+tmp, default=default)
+                               tmp = config.movielist.videodirs.value
+                               default = self.instantrec_dirname.value
+                               if default not in tmp and default not in styles_keys:
+                                       tmp = tmp[:]
+                                       tmp.append(default)
+                               self.instantrec_dirname.setChoices(self.styles+tmp, default=default)
+                               self.entrydirname.value = res
+                       if config.usage.allowed_timeshift_paths.value != self.lasttimeshiftdirs:
+                               tmp = config.usage.allowed_timeshift_paths.value
+                               default = self.instantrec_dirname.value
+                               if default not in tmp:
+                                       tmp = tmp[:]
+                                       tmp.append(default)
+                               self.timeshift_dirname.setChoices(tmp, default=default)
+                               self.entrydirname.value = res
+                       if self.entrydirname.last_value != res:
+                               self.checkReadWriteDir(self.entrydirname)
+
+       def save(self):
+               currentry = self["config"].getCurrent()
+               if self.checkReadWriteDir(currentry[1]):
+                       config.usage.default_path.value = self.default_dirname.value
+                       config.usage.timer_path.value = self.timer_dirname.value
+                       config.usage.instantrec_path.value = self.instantrec_dirname.value 
+                       config.usage.timeshift_path.value = self.timeshift_dirname.value
+                       config.usage.default_path.save()
+                       config.usage.timer_path.save()
+                       config.usage.instantrec_path.save()
+                       config.usage.timeshift_path.save()
+                       self.close()
+
+       def cancel(self):
+               self.close()
+
index 8b5089a312b4e10bb2878488a60ff46d600fd038..e24e4636e0cf9285d2f252d64f9d886b16b8677e 100644 (file)
@@ -8,6 +8,7 @@ from Components.NimManager import nimmanager
 from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, updateConfigElement
 from Components.Sources.List import List
 from Screens.MessageBox import MessageBox
+from Screens.ChoiceBox import ChoiceBox
 
 from time import mktime, localtime
 from datetime import datetime
@@ -342,10 +343,10 @@ class NimSetup(Screen, ConfigListScreen):
                new_configured_sats = nimmanager.getConfiguredSats()
                self.unconfed_sats = old_configured_sats - new_configured_sats
                self.satpos_to_remove = None
-               self.deleteConfirmed(False)
+               self.deleteConfirmed((None, "no"))
 
        def deleteConfirmed(self, confirmed):
-               if confirmed:
+               if confirmed[1] == "yes" or confirmed[1] == "yestoall":
                        eDVBDB.getInstance().removeServices(-1, -1, -1, self.satpos_to_remove)
 
                if self.satpos_to_remove is not None:
@@ -365,11 +366,15 @@ class NimSetup(Screen, ConfigListScreen):
                                else:
                                        h = _("E")
                                sat_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10)
-                       self.session.openWithCallback(self.deleteConfirmed, MessageBox, _("Delete no more configured satellite\n%s?") %(sat_name))
+                               
+                       if confirmed[1] == "yes" or confirmed[1] == "no":
+                               self.session.openWithCallback(self.deleteConfirmed, ChoiceBox, _("Delete no more configured satellite\n%s?") %(sat_name), [(_("Yes"), "yes"), (_("No"), "no"), (_("Yes to all"), "yestoall"), (_("No to all"), "notoall")])
+                       if confirmed[1] == "yestoall" or confirmed[1] == "notoall":
+                               self.deleteConfirmed(confirmed)
                        break
                if not self.satpos_to_remove:
                        self.close()
-
+               
        def __init__(self, session, slotid):
                Screen.__init__(self, session)
                self.list = [ ]
index bea087244b81dcc001667d418cd25f7e7d708c2b..fa787a7043500f63583d329b159e90039557fb04 100644 (file)
@@ -524,6 +524,8 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport):
                        for n in nimmanager.nim_slots:
                                if n.config_mode == "nothing":
                                        continue
+                               if n.config_mode == "advanced" and len(nimmanager.getSatListForNim(n.slot)) < 1:
+                                       continue
                                if n.config_mode in ("loopthrough", "satposdepends"):
                                        root_id = nimmanager.sec.getRoot(n.slot_id, int(n.config.connectedTo.value))
                                        if n.type == nimmanager.nim_slots[root_id].type: # check if connected from a DVB-S to DVB-S2 Nim or vice versa
index dc511448d1fcd0cb123a01db14b20b25f50f28ba..00e78593a6abc592d6a0b8b998e9a8502bc560cd 100644 (file)
@@ -1,10 +1,13 @@
 from Screen import Screen
 from MessageBox import MessageBox
 from Components.AVSwitch import AVSwitch
+from Tools import Notifications
 
 class Scart(Screen):
        def __init__(self, session, start_visible=True):
                Screen.__init__(self, session)
+               self.msgBox = None
+               self.notificationVisible = None
 
                self.avswitch = AVSwitch()
 
@@ -22,7 +25,11 @@ class Scart(Screen):
                if not self.msgVisible:
                        self.msgVisible = True
                        self.avswitch.setInput("SCART")
-                       self.msgBox = self.session.openWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
+                       if not self.session.in_exec:
+                               self.notificationVisible = True
+                               Notifications.AddNotificationWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR, msgBoxID = "scart_msgbox")
+                       else:
+                               self.msgBox = self.session.openWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
 
        def MsgBoxClosed(self, *val):
                self.msgBox = None
@@ -35,3 +42,13 @@ class Scart(Screen):
                                return
                        self.avswitch.setInput("ENCODER")
                        self.msgVisible = False
+               if self.notificationVisible:
+                       self.avswitch.setInput("ENCODER")
+                       self.notificationVisible = False
+                       for notification in Notifications.current_notifications:
+                               try:
+                                       if notification[1].msgBoxID == "scart_msgbox":
+                                               notification[1].close()
+                               except:
+                                       print "other notification is open. try another one."
+                       
\ No newline at end of file
index ff061d8800fe9e9f6d666594e52ab7141277aa0b..e5e7af4e3e522fc2102c8fa250394011c069390b 100644 (file)
@@ -5,6 +5,7 @@ from Components.Input import Input
 from Components.Label import Label
 from Components.Pixmap import Pixmap
 from Components.config import config, ConfigInteger
+from Components.SystemInfo import SystemInfo
 from enigma import eEPGCache
 from SleepTimer import SleepTimer
 from time import time
@@ -77,7 +78,11 @@ class SleepTimerEdit(Screen):
                        self["red_text"].setText(_("Action:") + " " + _("Disable timer"))
                
                if config.SleepTimer.action.value == "shutdown":
-                       self["green_text"].setText(_("Sleep timer action:") + " " + _("Deep Standby"))
+                       if SystemInfo["DeepstandbySupport"]:
+                               shutdownString = _("Deep Standby")
+                       else:
+                               shutdownString = _("Shutdown")
+                       self["green_text"].setText(_("Sleep timer action:") + " " + shutdownString)
                elif config.SleepTimer.action.value == "standby":
                        self["green_text"].setText(_("Sleep timer action:") + " " + _("Standby"))
                
index 1453c05f338de2a28e142bbde4f7d80afd7738fb..eb926ca3acf9615501bd214b178cfbf1c8eefa48 100644 (file)
@@ -1,6 +1,7 @@
 from Screen import Screen
 from Components.ConfigList import ConfigListScreen
 from Components.config import config, ConfigSubsection, ConfigSelection, getConfigListEntry
+from Components.SystemInfo import SystemInfo
 from InfoBarGenerics import InfoBarNotifications
 import Screens.Standby
 from Tools import Notifications
@@ -44,7 +45,11 @@ class JobView(InfoBarNotifications, Screen, ConfigListScreen):
 
                self.afterevents = [ "nothing", "standby", "deepstandby", "close" ]
                self.settings = ConfigSubsection()
-               self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby"))], default = self.afterevents[afterEvent])
+               if SystemInfo["DeepstandbySupport"]:
+                       shutdownString = _("go to deep standby")
+               else:
+                       shutdownString = _("shut down")
+               self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", shutdownString)], default = self.afterevents[afterEvent])
                self.setupList()
                self.state_changed()
 
index caaf8c95eb7279dd54a2aa4c4ff56fafecf76c72..54354987003c47fbc59626ba30c88467b2f5029d 100644 (file)
@@ -4,6 +4,7 @@ from Components.config import config
 from Components.MenuList import MenuList
 from Components.TimerList import TimerList
 from Components.TimerSanityCheck import TimerSanityCheck
+from Components.UsageConfig import preferredTimerPath
 from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
 from Screen import Screen
 from Screens.ChoiceBox import ChoiceBox
@@ -243,7 +244,7 @@ class TimerEditList(Screen):
                else:
                        data = parseEvent(event, description = False)
 
-               self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = config.movielist.last_timer_videodir.value, *data))
+               self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *data))
                
        def addTimer(self, timer):
                self.session.openWithCallback(self.finishedAdd, TimerEntry, timer)
index edd19685755acbefe5f53312b3e9af17f97956a9..42a3195c04be15dbb54f0b363fe7cb30d3244db5 100644 (file)
@@ -8,11 +8,12 @@ from Components.MenuList import MenuList
 from Components.Button import Button
 from Components.Label import Label
 from Components.Pixmap import Pixmap
+from Components.UsageConfig import defaultMoviePath
+from Components.SystemInfo import SystemInfo
 from Screens.MovieSelection import getPreferredTagEditor
 from Screens.LocationBox import MovieLocationBox
 from Screens.ChoiceBox import ChoiceBox
 from RecordTimer import AFTEREVENT
-from Tools.Directories import resolveFilename, SCOPE_HDD
 from enigma import eEPGCache
 from time import localtime, mktime, time, strftime
 from datetime import datetime
@@ -93,7 +94,11 @@ class TimerEntry(Screen, ConfigListScreen):
                                day[weekday] = 1
 
                        self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay])
-                       self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby")), ("auto", _("auto"))], default = afterevent)
+                       if SystemInfo["DeepstandbySupport"]:
+                               shutdownString = _("go to deep standby")
+                       else:
+                               shutdownString = _("shut down")
+                       self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", shutdownString), ("auto", _("auto"))], default = afterevent)
                        self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
                        self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
                        self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
@@ -106,7 +111,7 @@ class TimerEntry(Screen, ConfigListScreen):
                        self.timerentry_starttime = ConfigClock(default = self.timer.begin)
                        self.timerentry_endtime = ConfigClock(default = self.timer.end)
 
-                       default = self.timer.dirname or resolveFilename(SCOPE_HDD)
+                       default = self.timer.dirname or defaultMoviePath()
                        tmp = config.movielist.videodirs.value
                        if default not in tmp:
                                tmp.append(default)
@@ -273,9 +278,10 @@ class TimerEntry(Screen, ConfigListScreen):
                self.timer.service_ref = self.timerentry_service_ref
                self.timer.tags = self.timerentry_tags
 
-               self.timer.dirname = self.timerentry_dirname.value
-               config.movielist.last_timer_videodir.value = self.timer.dirname
-               config.movielist.last_timer_videodir.save()
+               if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
+                       self.timer.dirname = self.timerentry_dirname.value
+                       config.movielist.last_timer_videodir.value = self.timer.dirname
+                       config.movielist.last_timer_videodir.save()
 
                if self.timerentry_type.value == "once":
                        self.timer.begin, self.timer.end = self.getBeginEnd()
index 19500ed7ef79668d9a067ac919ffd929ca5ab49e..7846e4b85dc5aeb0165472e8005bdc9acb9dd85d 100755 (executable)
@@ -7,26 +7,25 @@ from Components.MenuList import MenuList
 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
 from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_CENTER, RT_VALIGN_CENTER
 from Screen import Screen
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 from Tools.LoadPixmap import LoadPixmap
 
 class VirtualKeyBoardList(MenuList):
        def __init__(self, list, enableWrapAround=False):
                MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
-               self.l.setFont(0, gFont("Regular", 22))
+               self.l.setFont(0, gFont("Regular", 28))
                self.l.setItemHeight(45)
 
 def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False):
-       key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_backspace.png"))
-       key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_bg.png"))
-       key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_clr.png"))
-       key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_esc.png"))
-       key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_ok.png"))
-       key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_sel.png"))
-       key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift.png"))
-       key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift_sel.png"))
-       key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_space.png"))
-       
+       key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png"))
+       key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png"))
+       key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png"))
+       key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png"))
+       key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png"))
+       key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png"))
+       key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png"))
+       key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png"))
+       key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png"))
        res = [ (keys) ]
        
        x = 0
@@ -36,33 +35,45 @@ def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False):
        else:
                shiftkey_png = key_shift
        for key in keys:
+               width = None
                if key == "EXIT":
-                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_esc))
+                       width = key_esc.size().width()
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_esc))
                elif key == "BACKSPACE":
-                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_backspace))
+                       width = key_backspace.size().width()
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_backspace))
                elif key == "CLEAR":
-                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_clr))
+                       width = key_clr.size().width()
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_clr))
                elif key == "SHIFT":
-                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=shiftkey_png))
+                       width = shiftkey_png.size().width()
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=shiftkey_png))
                elif key == "SPACE":
-                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_space))
+                       width = key_space.size().width()
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_space))
                elif key == "OK":
-                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_ok))
+                       width = key_ok.size().width()
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_ok))
                #elif key == "<-":
                #       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_left))
                #elif key == "->":
                #       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_right))
                
                else:
+                       width = key_bg.size().width()
                        res.extend((
-                               MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_bg),
-                               MultiContentEntryText(pos=(x, 0), size=(45, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)
+                               MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_bg),
+                               MultiContentEntryText(pos=(x, 0), size=(width, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)
                        ))
                
                if selectedKey == count:
-                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_sel))
-               
-               x += 45
+                       width = key_sel.size().width()
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_sel))
+
+               if width is not None:
+                       x += width
+               else:
+                       x += 45
                count += 1
        
        return res
index 74219eb1c2b8b187ded4fc0b02b22f8791783123..1bff0284d24647a19dc82c203c0af093e42580d5 100755 (executable)
@@ -1,16 +1,15 @@
 from Screen import Screen
-
 from Screens.HelpMenu import HelpableScreen
 from Screens.MessageBox import MessageBox
-from Components.config import config, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS
+from Components.config import config, ConfigText, ConfigPassword, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS
 
 from Components.Label import Label
+from Components.Sources.StaticText import StaticText
 from Components.Slider import Slider
 from Components.ActionMap import NumberActionMap
 from Components.MenuList import MenuList
 from Components.ConfigList import ConfigList
 from Components.Sources.List import List
-
 from enigma import eTimer
 
 from xml.sax import make_parser
@@ -19,8 +18,8 @@ from xml.sax.handler import ContentHandler
 class WizardSummary(Screen):
        skin = """
        <screen position="0,0" size="132,64">
-               <widget name="text" position="6,4" size="120,42" font="Regular;14" transparent="1" />
-               <widget source="parent.list" render="Label" position="6,25" size="120,21" font="Regular;16">
+               <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" />
+               <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12">
                        <convert type="StringListSelection" />
                </widget>
        </screen>"""
@@ -36,7 +35,7 @@ class WizardSummary(Screen):
                #self.skinName.append("Wizard")
                #print "*************+++++++++++++++++****************++++++++++******************* WizardSummary", self.skinName
                        #
-               self["text"] = Label("")
+               self["text"] = StaticText("")
                self.onShow.append(self.setCallback)
                
        def setCallback(self):
@@ -214,12 +213,13 @@ class Wizard(Screen):
                self.onShown.append(self.updateValues)
 
                self.configInstance = None
+               self.currentConfigIndex = None
                
                self.lcdCallbacks = []
                
                self.disableKeys = False
                
-               self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions", "InputAsciiActions"],
+               self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions", "InputAsciiActions", "KeyboardInputActions"],
                {
                        "gotAsciiCode": self.keyGotAscii,
                        "ok": self.ok,
@@ -245,6 +245,13 @@ class Wizard(Screen):
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1)
+
+               self["VirtualKB"] = NumberActionMap(["VirtualKeyboardActions"],
+               {
+                       "showVirtualKeyboard": self.KeyText,
+               }, -2)
+               
+               self["VirtualKB"].setEnabled(False)
                
        def red(self):
                print "red"
@@ -405,6 +412,7 @@ class Wizard(Screen):
                self.resetCounter()
                if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None  or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
                        self["config"].instance.moveSelection(self["config"].instance.moveUp)
+                       self.handleInputHelpers()
                elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
                        self["list"].selectPrevious()
                        if self.wizard[self.currStep].has_key("onselect"):
@@ -418,6 +426,7 @@ class Wizard(Screen):
                self.resetCounter()
                if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None  or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
                        self["config"].instance.moveSelection(self["config"].instance.moveDown)
+                       self.handleInputHelpers()
                elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
                        #self["list"].instance.moveSelection(self["list"].instance.moveDown)
                        self["list"].selectNext()
@@ -598,6 +607,9 @@ class Wizard(Screen):
                                                print "clearConfigList", self.configInstance["config"], self["config"]
                                else:
                                        self["config"].l.setList([])
+                                       self.handleInputHelpers()
+                                       
+                                       
                        else:
                                if self.has_key("config"):
                                        self["config"].hide()
@@ -614,6 +626,45 @@ class Wizard(Screen):
                                        self.finished(gotoStep = self.wizard[self.currStep]["timeoutstep"])
                self.updateText()
 
+       def handleInputHelpers(self):
+               if self["config"].getCurrent() is not None:
+                       if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword):
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(True)
+                                       self["VKeyIcon"].boolean = True
+                               if self.has_key("HelpWindow"):
+                                       if self["config"].getCurrent()[1].help_window.instance is not None:
+                                               helpwindowpos = self["HelpWindow"].getPosition()
+                                               from enigma import ePoint
+                                               self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                       else:
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(False)
+                                       self["VKeyIcon"].boolean = False
+               else:
+                       if self.has_key("VKeyIcon"):
+                               self["VirtualKB"].setEnabled(False)
+                               self["VKeyIcon"].boolean = False
+
+       def KeyText(self):
+               from Screens.VirtualKeyBoard import VirtualKeyBoard
+               self.currentConfigIndex = self["config"].getCurrentIndex()
+               self.session.openWithCallback(self.VirtualKeyBoardCallback, VirtualKeyBoard, title = self["config"].getCurrent()[0], text = self["config"].getCurrent()[1].getValue())
+
+       def VirtualKeyBoardCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword):
+                               if self.has_key("HelpWindow"):
+                                       if self["config"].getCurrent()[1].help_window.instance is not None:
+                                               helpwindowpos = self["HelpWindow"].getPosition()
+                                               from enigma import ePoint
+                                               self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                       self["config"].instance.moveSelectionTo(self.currentConfigIndex)
+                       self["config"].setCurrentIndex(self.currentConfigIndex)
+                       self["config"].getCurrent()[1].setValue(callback)
+                       self["config"].invalidate(self["config"].getCurrent())
+
+
 class WizardManager:
        def __init__(self):
                self.wizards = []
index 681bc049345678290c1fbd1f4efdb84bbacd21a2..8ed2c8a46017951c8702db09bd1047d3a6094c99 100755 (executable)
@@ -33,6 +33,7 @@ SCOPE_DEFAULTDIR = 13
 SCOPE_DEFAULTPARTITION = 14
 SCOPE_DEFAULTPARTITIONMOUNTDIR = 15
 SCOPE_METADIR = 16
+SCOPE_CURRENT_PLUGIN = 17
 
 PATH_CREATE = 0
 PATH_DONTCREATE = 1
@@ -85,7 +86,27 @@ def resolveFilename(scope, base = "", path_prefix = None):
                tmp = defaultPaths[SCOPE_SKIN]
                pos = config.skin.primary_skin.value.rfind('/')
                if pos != -1:
-                       path = tmp[0]+config.skin.primary_skin.value[:pos+1]
+                       #if basefile is not available use default skin path as fallback
+                       tmpfile = tmp[0]+config.skin.primary_skin.value[:pos+1] + base
+                       if fileExists(tmpfile):
+                               path = tmp[0]+config.skin.primary_skin.value[:pos+1]
+                       else:
+                               path = tmp[0]
+               else:
+                       path = tmp[0]
+
+       elif scope == SCOPE_CURRENT_PLUGIN:
+               tmp = defaultPaths[SCOPE_PLUGINS]
+               from Components.config import config
+               skintmp = defaultPaths[SCOPE_SKIN]
+               pos = config.skin.primary_skin.value.rfind('/')
+               if pos != -1:
+                       #if basefile is not available inside current skin path, use the original provided file as fallback
+                       skintmpfile = skintmp[0]+config.skin.primary_skin.value[:pos+1] + base
+                       if fileExists(skintmpfile):
+                               path = skintmp[0]+config.skin.primary_skin.value[:pos+1]
+                       else:
+                               path = tmp[0]
                else:
                        path = tmp[0]
        else:
index 1a28fbdd17907d2dda1a43403d85abef3df4db58..16d09bc6ee246c0202659d55920798ad9758e08b 100644 (file)
@@ -917,7 +917,7 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv
        m_is_pvr = !m_reference.path.empty();
        
        m_timeshift_enabled = m_timeshift_active = 0, m_timeshift_changed = 0;
-       m_skipmode = 0;
+       m_skipmode = m_fastforward = m_slowmotion = 0;
        
        CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
        CONNECT(m_service_handler_timeshift.serviceEvent, eDVBServicePlay::serviceEventTimeshift);
@@ -1185,7 +1185,10 @@ RESULT eDVBServicePlay::setSlowMotion(int ratio)
        eDebug("eDVBServicePlay::setSlowMotion(%d)", ratio);
        setFastForward_internal(0);
        if (m_decoder)
+       {
+               m_slowmotion = ratio;
                return m_decoder->setSlowMotion(ratio);
+       }
        else
                return -1;
 }
@@ -1197,10 +1200,11 @@ RESULT eDVBServicePlay::setFastForward(int ratio)
        return setFastForward_internal(ratio);
 }
 
-RESULT eDVBServicePlay::setFastForward_internal(int ratio)
+RESULT eDVBServicePlay::setFastForward_internal(int ratio, bool final_seek)
 {
-       int skipmode, ffratio;
-       
+       int skipmode, ffratio, ret = 0;
+       pts_t pos=0;
+
        if (ratio > 8)
        {
                skipmode = ratio;
@@ -1225,19 +1229,28 @@ RESULT eDVBServicePlay::setFastForward_internal(int ratio)
                if (m_cue)
                        m_cue->setSkipmode(skipmode * 90000); /* convert to 90000 per second */
        }
-       
+
        m_skipmode = skipmode;
-       
+
+       if (final_seek)
+               eDebug("trickplay stopped .. ret %d, pos %lld", getPlayPosition(pos), pos);
+
+       m_fastforward = ffratio;
+
        if (!m_decoder)
                return -1;
-               
+
        if (ffratio == 0)
                ; /* return m_decoder->play(); is done in caller*/
        else if (ffratio != 1)
-               return m_decoder->setFastForward(ffratio);
+               ret = m_decoder->setFastForward(ffratio);
        else
-               return m_decoder->setTrickmode();
-       return 0;
+               ret = m_decoder->setTrickmode();
+
+       if (pos)
+               eDebug("final seek after trickplay ret %d", seekTo(pos));
+
+       return ret;
 }
 
 RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
@@ -1266,9 +1279,10 @@ RESULT eDVBServicePlay::getLength(pts_t &len)
 RESULT eDVBServicePlay::pause()
 {
        eDebug("eDVBServicePlay::pause");
-       setFastForward_internal(0);
+       setFastForward_internal(0, m_slowmotion || m_fastforward > 1);
        if (m_decoder)
        {
+               m_slowmotion = 0;
                m_is_paused = 1;
                return m_decoder->pause();
        } else
@@ -1278,9 +1292,10 @@ RESULT eDVBServicePlay::pause()
 RESULT eDVBServicePlay::unpause()
 {
        eDebug("eDVBServicePlay::unpause");
-       setFastForward_internal(0);
+       setFastForward_internal(0, m_slowmotion || m_fastforward > 1);
        if (m_decoder)
        {
+               m_slowmotion = 0;
                m_is_paused = 0;
                return m_decoder->play();
        } else
@@ -1370,7 +1385,7 @@ RESULT eDVBServicePlay::setTrickmode(int trick)
 
 RESULT eDVBServicePlay::isCurrentlySeekable()
 {
-       return m_is_pvr || m_timeshift_active;
+       return m_is_pvr || m_timeshift_active ? 3 : 0; // fast forward/backward possible and seeking possible
 }
 
 RESULT eDVBServicePlay::frontendInfo(ePtr<iFrontendInformation> &ptr)
@@ -1728,6 +1743,7 @@ int eDVBServicePlay::selectAudioStream(int i)
 {
        eDVBServicePMTHandler::program program;
        eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
+       pts_t position = -1;
 
        if (h.getProgramInfo(program))
                return -1;
@@ -1750,6 +1766,9 @@ int eDVBServicePlay::selectAudioStream(int i)
                apidtype = program.audioStreams[stream].type;
        }
 
+       if (i != -1 && apid != m_current_audio_pid && (m_is_pvr || m_timeshift_active))
+               eDebug("getPlayPosition ret %d, pos %lld in selectAudioStream", getPlayPosition(position), position);
+
        m_current_audio_pid = apid;
 
        if (m_is_primary && m_decoder->setAudioPID(apid, apidtype))
@@ -1758,6 +1777,9 @@ int eDVBServicePlay::selectAudioStream(int i)
                return -4;
        }
 
+       if (position != -1)
+               eDebug("seekTo ret %d", seekTo(position));
+
        int rdsPid = apid;
 
                /* if we are not in PVR mode, timeshift is not active and we are not in pip mode, check if we need to enable the rds reader */
@@ -2229,7 +2251,7 @@ void eDVBServicePlay::switchToLive()
        m_new_subtitle_page_connection = 0;
        m_rds_decoder_event_connection = 0;
        m_video_event_connection = 0;
-       m_is_paused = m_skipmode = 0; /* not supported in live mode */
+       m_is_paused = m_skipmode = m_fastforward = m_slowmotion = 0; /* not supported in live mode */
 
                /* free the timeshift service handler, we need the resources */
        m_service_handler_timeshift.free();
@@ -2398,17 +2420,8 @@ void eDVBServicePlay::updateDecoder()
                        }
                }
 
-               std::string config_delay;
-               int config_delay_int = 0;
-               if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
-                       config_delay_int = atoi(config_delay.c_str());
-               m_decoder->setAC3Delay(ac3_delay == -1 ? config_delay_int : ac3_delay + config_delay_int);
-
-               if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
-                       config_delay_int = atoi(config_delay.c_str());
-               else
-                       config_delay_int = 0;
-               m_decoder->setPCMDelay(pcm_delay == -1 ? config_delay_int : pcm_delay + config_delay_int);
+               setAC3Delay(ac3_delay == -1 ? 0 : ac3_delay);
+               setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay);
 
                m_decoder->setVideoPID(vpid, vpidtype);
                selectAudioStream();
@@ -2932,16 +2945,28 @@ void eDVBServicePlay::setAC3Delay(int delay)
 {
        if (m_dvb_service)
                m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay ? delay : -1);
-       if (m_decoder)
-               m_decoder->setAC3Delay(delay);
+       if (m_decoder) {
+               std::string config_delay;
+               int config_delay_int = 0;
+               if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
+                       config_delay_int = atoi(config_delay.c_str());
+               m_decoder->setAC3Delay(delay + config_delay_int);
+       }
 }
 
 void eDVBServicePlay::setPCMDelay(int delay)
 {
        if (m_dvb_service)
                m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay ? delay : -1);
-       if (m_decoder)
-               m_decoder->setPCMDelay(delay);
+       if (m_decoder) {
+               std::string config_delay;
+               int config_delay_int = 0;
+               if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
+                       config_delay_int = atoi(config_delay.c_str());
+               else
+                       config_delay_int = 0;
+               m_decoder->setPCMDelay(delay + config_delay_int);
+       }
 }
 
 void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
index b4d0f1967550e0a8c950491b0fb760400aa768e0..e3c7fd58933fa13e0510f46bbb0129a1ed2333c9 100644 (file)
@@ -220,7 +220,7 @@ private:
 
        int m_current_audio_stream;
        int selectAudioStream(int n = -1);
-       RESULT setFastForward_internal(int ratio);
+       RESULT setFastForward_internal(int ratio, bool final_seek=false);
        
                /* timeshift */
        ePtr<iDVBTSRecorder> m_record;
@@ -233,6 +233,8 @@ private:
        void updateDecoder();
        
        int m_skipmode;
+       int m_fastforward;
+       int m_slowmotion;
        
                /* cuesheet */
        
index 34d09363b4be1d1be31b7568cec27a71b88467fb..c0ae42fdc41d02029ae6e4a04b4cc5fa6ce69ca9 100644 (file)
@@ -2,20 +2,23 @@
 
        /* note: this requires gstreamer 0.10.x and a big list of plugins. */
        /* it's currently hardcoded to use a big-endian alsasink as sink. */
+#include <lib/base/ebase.h>
 #include <lib/base/eerror.h>
+#include <lib/base/init_num.h>
+#include <lib/base/init.h>
+#include <lib/base/nconfig.h>
 #include <lib/base/object.h>
-#include <lib/base/ebase.h>
-#include <string>
+#include <lib/dvb/decoder.h>
+#include <lib/components/file_eraser.h>
+#include <lib/gui/esubtitle.h>
 #include <lib/service/servicemp3.h>
 #include <lib/service/service.h>
-#include <lib/components/file_eraser.h>
-#include <lib/base/init_num.h>
-#include <lib/base/init.h>
+
+#include <string>
+
 #include <gst/gst.h>
 #include <gst/pbutils/missing-plugins.h>
 #include <sys/stat.h>
-/* for subtitles */
-#include <lib/gui/esubtitle.h>
 
 // eServiceFactoryMP3
 
@@ -43,6 +46,7 @@ eServiceFactoryMP3::eServiceFactoryMP3()
                extensions.push_back("mp4");
                extensions.push_back("mov");
                extensions.push_back("m4a");
+               extensions.push_back("m2ts");
                sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions);
        }
 
@@ -187,6 +191,8 @@ int eStaticServiceMP3Info::getLength(const eServiceReference &ref)
 }
 
 // eServiceMP3
+int eServiceMP3::ac3_delay,
+    eServiceMP3::pcm_delay;
 
 eServiceMP3::eServiceMP3(eServiceReference ref)
        :m_ref(ref), m_pump(eApp, 1)
@@ -635,7 +641,31 @@ RESULT eServiceMP3::setTrickmode(int trick)
 
 RESULT eServiceMP3::isCurrentlySeekable()
 {
-       return 1;
+       int ret = 3; // seeking and fast/slow winding possible
+       GstElement *sink;
+
+       if (!m_gst_playbin)
+               return 0;
+       if (m_state != stRunning)
+               return 0;
+
+       g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+       // disable fast winding yet when a dvbvideosink or dvbaudiosink is used
+       // for this we must do some changes on different places.. (gstreamer.. our sinks.. enigma2)
+       if (sink) {
+               ret &= ~2; // only seeking possible
+               gst_object_unref(sink);
+       }
+       else {
+               g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+               if (sink) {
+                       ret &= ~2; // only seeking possible
+                       gst_object_unref(sink);
+               }
+       }
+
+       return ret;
 }
 
 RESULT eServiceMP3::info(ePtr<iServiceInformation>&i)
@@ -659,7 +689,6 @@ RESULT eServiceMP3::getName(std::string &name)
        return 0;
 }
 
-
 int eServiceMP3::getInfo(int w)
 {
        const gchar *tag = 0;
@@ -955,6 +984,12 @@ RESULT eServiceMP3::subtitle(ePtr<iSubtitleOutput> &ptr)
        return 0;
 }
 
+RESULT eServiceMP3::audioDelay(ePtr<iAudioDelay> &ptr)
+{
+       ptr = this;
+       return 0;
+}
+
 int eServiceMP3::getNumberOfTracks()
 {
        return m_audioStreams.size();
@@ -1093,6 +1128,8 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
                                                g_object_set (G_OBJECT (sink), "emit-signals", TRUE, NULL);
                                                gst_object_unref(sink);
                                        }
+                                       setAC3Delay(ac3_delay);
+                                       setPCMDelay(pcm_delay);
                                }       break;
                                case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
                                {
@@ -1579,6 +1616,96 @@ int eServiceMP3::setBufferSize(int size)
        return 0;
 }
 
+int eServiceMP3::getAC3Delay()
+{
+       return ac3_delay;
+}
+
+int eServiceMP3::getPCMDelay()
+{
+       return pcm_delay;
+}
+
+void eServiceMP3::setAC3Delay(int delay)
+{
+       ac3_delay = delay;
+       if (!m_gst_playbin || m_state != stRunning)
+               return;
+       else
+       {
+               GstElement *sink;
+               int config_delay_int = delay;
+               g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+               if (sink)
+               {
+                       std::string config_delay;
+                       if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
+                               config_delay_int += atoi(config_delay.c_str());
+                       gst_object_unref(sink);
+               }
+               else
+               {
+                       eDebug("dont apply ac3 delay when no video is running!");
+                       config_delay_int = 0;
+               }
+
+               g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+
+               if (sink)
+               {
+                       gchar *name = gst_element_get_name(sink);
+                       if (strstr(name, "dvbaudiosink"))
+                               eTSMPEGDecoder::setHwAC3Delay(config_delay_int);
+                       g_free(name);
+                       gst_object_unref(sink);
+               }
+       }
+}
+
+void eServiceMP3::setPCMDelay(int delay)
+{
+       pcm_delay = delay;
+       if (!m_gst_playbin || m_state != stRunning)
+               return;
+       else
+       {
+               GstElement *sink;
+               int config_delay_int = delay;
+               g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+               if (sink)
+               {
+                       std::string config_delay;
+                       if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
+                               config_delay_int += atoi(config_delay.c_str());
+                       gst_object_unref(sink);
+               }
+               else
+               {
+                       eDebug("dont apply pcm delay when no video is running!");
+                       config_delay_int = 0;
+               }
+
+               g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+
+               if (sink)
+               {
+                       gchar *name = gst_element_get_name(sink);
+                       if (strstr(name, "dvbaudiosink"))
+                               eTSMPEGDecoder::setHwPCMDelay(config_delay_int);
+                       else
+                       {
+                               // this is realy untested..and not used yet
+                               gint64 offset = config_delay_int;
+                               offset *= 1000000; // milli to nano
+                               g_object_set (G_OBJECT (m_gst_playbin), "ts-offset", offset, NULL);
+                       }
+                       g_free(name);
+                       gst_object_unref(sink);
+               }
+       }
+}
 
 #else
 #warning gstreamer not available, not building media player
index 15ed0b077b0448e6ec41e5e574c6fa5ded862a13..985179f65642143902bb0a9a5ef7df6bef8fd762 100644 (file)
@@ -49,8 +49,9 @@ typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFL
 typedef enum { stPlainText, stSSA, stSRT } subtype_t;
 typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t;
 
-class eServiceMP3: public iPlayableService, public iPauseableService, 
-       public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public iStreamedService, public Object
+class eServiceMP3: public iPlayableService, public iPauseableService,
+       public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, 
+       public iSubtitleOutput, public iStreamedService, public iAudioDelay, public Object
 {
        DECLARE_REF(eServiceMP3);
 public:
@@ -70,13 +71,14 @@ public:
        RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
        RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
        RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
+       RESULT audioDelay(ePtr<iAudioDelay> &ptr);
 
                // not implemented (yet)
        RESULT frontendInfo(ePtr<iFrontendInformation> &ptr) { ptr = 0; return -1; }
        RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
        RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
        RESULT cueSheet(ePtr<iCueSheet> &ptr) { ptr = 0; return -1; }
-       RESULT audioDelay(ePtr<iAudioDelay> &ptr) { ptr = 0; return -1; }
+
        RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr) { ptr = 0; return -1; }
        RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
        RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
@@ -122,6 +124,12 @@ public:
        PyObject *getBufferCharge();
        int setBufferSize(int size);
 
+               // iAudioDelay
+       int getAC3Delay();
+       int getPCMDelay();
+       void setAC3Delay(int);
+       void setPCMDelay(int);
+
        struct audioStream
        {
                GstPad* pad;
@@ -166,6 +174,8 @@ public:
                }
        };
 private:
+       static int pcm_delay;
+       static int ac3_delay;
        int m_currentAudioStream;
        int m_currentSubtitleStream;
        int selectAudioStream(int i);
index 44e6a6e0ec6d96364435eb2844532955768351b6..6b9adfb9d1caa98eefcd6881fb25ad88581dd8c8 100644 (file)
@@ -315,7 +315,7 @@ RESULT eServiceXine::setTrickmode(int trick)
 
 RESULT eServiceXine::isCurrentlySeekable()
 {
-       return 1;
+       return 3;
 }
 
 RESULT eServiceXine::info(ePtr<iServiceInformation>&i)
index e42c10033a6937a52810195ca26cf53a8b8973e4..c748538acaa441727457e2c5643f78f21c607510 100755 (executable)
--- a/mytest.py
+++ b/mytest.py
@@ -41,14 +41,14 @@ profile("LOAD:skin")
 from skin import readSkin
 
 profile("LOAD:Tools")
-from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_SKIN
 from Components.config import config, configfile, ConfigText, ConfigYesNo, ConfigInteger, NoSave
 InitFallbackFiles()
 
 profile("ReloadProfiles")
 eDVBDB.getInstance().reloadBouquets()
 
-config.misc.radiopic = ConfigText(default = resolveFilename(SCOPE_SKIN_IMAGE)+"radio.mvi")
+config.misc.radiopic = ConfigText(default = resolveFilename(SCOPE_CURRENT_SKIN, "radio.mvi"))
 config.misc.isNextRecordTimerAfterEventActionAuto = ConfigYesNo(default=False)
 config.misc.useTransponderTime = ConfigYesNo(default=True)
 config.misc.startCounter = ConfigInteger(default=0) # number of e2 starts...
diff --git a/skin.py b/skin.py
old mode 100644 (file)
new mode 100755 (executable)
index 5b8ce65..064fd21
--- a/skin.py
+++ b/skin.py
@@ -148,6 +148,8 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1)
                        guiObject.setFont(parseFont(value, scale))
                elif attrib == 'zPosition':
                        guiObject.setZPosition(int(value))
+               elif attrib == 'itemHeight':
+                       guiObject.setItemHeight(int(value))
                elif attrib in ("pixmap", "backgroundPixmap", "selectionPixmap"):
                        ptr = loadPixmap(value, desktop) # this should already have been filename-resolved.
                        if attrib == "pixmap":