1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2011 Christian Weiske <cweiske@cweiske.de>
7 from Screens.Screen import Screen
8 from Screens.HelpMenu import HelpableScreen
9 from Screens.MessageBox import MessageBox
10 from Components.Label import Label
11 from Components.ScrollLabel import ScrollLabel
12 from Components.ActionMap import ActionMap
13 from Components.Sources.StaticText import StaticText
14 from twisted.web import client
15 from twisted.web.client import _makeGetterFactory, HTTPClientFactory
16 from enigma import gFont
19 from Components.config import config
21 class CurlyTx(Screen,HelpableScreen):
23 <screen name="CurlyTx" position="center,center" size="560,400" title="CurlyTx" >
24 <ePixmap position="0,0" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
25 <ePixmap position="140,0" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
26 <ePixmap position="280,0" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
27 <ePixmap position="420,0" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
28 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
29 <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
30 <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
31 <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
32 <widget name="text" position="5,45" size="550,350" font="Console;20" />
38 httpGetterFactory = None
39 showingHeaders = False
41 def __init__(self, session, args = None):
42 #self.skin = CurlyTx.skin
43 Screen.__init__(self, session)
44 HelpableScreen.__init__(self)
45 #self.skinName = [ "CurlyTx", "Setup" ]
47 self["text"] = ScrollLabel("foo")
49 self["key_red"] = StaticText(_("Settings"))
50 self["key_green"] = StaticText(_("Reload"))
51 self["key_yellow"] = StaticText(_("Prev"))
52 self["key_blue"] = StaticText(_("Next"))
55 self["actions"] = ActionMap(
56 ["WizardActions", "ColorActions", "InputActions", "InfobarEPGActions"], {
60 "down": self.pageDown,
62 "red": self.showSettings,
64 "yellow": self.prevPage,
65 "blue": self.nextPage,
67 "showEventInfo": self.showHeader
72 self.loadUrl(config.plugins.CurlyTx.defaultPage.value)
73 self.onLayoutFinish.append(self.setTextFont)
76 self.helpList.append((
77 self["actions"], "WizardActions",
78 [("up", _("Scroll page contents up"))]))
79 self.helpList.append((
80 self["actions"], "WizardActions",
81 [("down", _("Scroll page contents down"))]))
82 self.helpList.append((
83 self["actions"], "InfobarEPGActions",
84 [("showEventInfo", _("Show HTTP response headers"))]))
85 self.helpList.append((
86 self["actions"], "ColorActions",
87 [("red", _("Show program settings"))]))
88 self.helpList.append((
89 self["actions"], "ColorActions",
90 [("green", _("Reload current page URL"))]))
91 self.helpList.append((
92 self["actions"], "ColorActions",
93 [("yellow", _("Switch to next configured page URL"))]))
94 self.helpList.append((
95 self["actions"], "ColorActions",
96 [("blue", _("Switch to previous configured page URL"))]))
97 self.helpList.append((
98 self["actions"], "WizardActions",
99 [("ok", _("Close window"))]))
100 self.helpList.append((
101 self["actions"], "WizardActions",
102 [("back", _("Close window"))]))
103 self.helpList.append((
104 self["actions"], "HelpActions",
105 [("displayHelp", _("Show this help screen"))]))
107 def loadButtons(self):
108 pageCount = len(config.plugins.CurlyTx.pages)
110 self["key_green"].setText("")
111 self["key_yellow"].setText("")
112 self["key_blue"].setText("")
114 self["key_green"].setText(_("Reload"))
115 self["key_yellow"].setText("")
116 self["key_blue"].setText("")
118 self["key_green"].setText(_("Reload"))
119 self["key_yellow"].setText(_("Prev"))
120 self["key_blue"].setText(_("Next"))
123 self["text"].pageUp()
126 self["text"].pageDown()
129 if self.currentPage == None:
132 pageId = self.currentPage - 1
134 pageId = len(config.plugins.CurlyTx.pages) - 1
138 if self.currentPage == None:
141 pageId = self.currentPage + 1
142 if pageId > len(config.plugins.CurlyTx.pages) - 1:
147 if self.currentPage == None:
150 self.loadUrl(self.currentPage)
152 def loadUrl(self, pageId):
157 cfg = config.plugins.CurlyTx
158 pageCount = len(cfg.pages)
160 if pageId > (pageCount - 1):
161 if len(cfg.pages) == 0:
164 self["text"].setText(_("Invalid page") + " " + pageId);
167 url = cfg.pages[pageId].uri.value
168 title = cfg.pages[pageId].title.value
171 title = "{0} [{1}/{2}]".format(title, pageId + 1, pageCount)
173 self.currentPage = pageId
174 self.currentUrl = url
175 self.currentFontSize = cfg.pages[pageId].fontSize.value
179 self["text"].setText(_("Loading ...") + "\n" + url);
181 self.getPageWebClient(url).addCallback(self.urlLoaded).addErrback(self.urlFailed, url)
183 def setTextFont(self):
184 if self["text"].long_text is not None:
185 self["text"].long_text.setFont(gFont("Console", self.currentFontSize))
187 def urlLoaded(self, html):
188 self["text"].setText(html)
190 def urlFailed(self, error, url):
191 self["text"].setText(
192 _("Error fetching URL:") + "\n " + error.getErrorMessage()
196 def loadNoPage(self):
197 self["text"].setText(_("Go and add a page in the settings"));
199 def showHeader(self):
200 if self.showingHeaders:
201 self["text"].setText(self.pageContent)
202 self.pageContent = None
203 self.showingHeaders = False
205 headers = _("HTTP response headers for") + "\n" + self.currentUrl + "\n\n"
206 for (k, v) in self.httpGetterFactory.response_headers.items():
207 headers += k + ": " + ("\n" + k + ": ").join(v) + "\n"
208 self.pageContent = self["text"].getText()
209 self["text"].setText(headers)
210 self.showingHeaders = True
212 def showSettings(self):
213 from CurlyTxSettings import CurlyTxSettings
214 self.session.openWithCallback(self.onSettingsChanged, CurlyTxSettings)
216 def onSettingsChanged(self):
218 if len(config.plugins.CurlyTx.pages) == 0:
219 self.currentPage = None
220 self.loadUrl(self.currentPage)
221 elif self.currentPage == None:
223 self.loadUrl(self.currentPage)
226 def getPageWebClient(self, url, contextFactory=None, *args, **kwargs):
228 Download a web page as a string.
230 COPY OF twisted.web.client.getPage to store the factory
232 Download a page. Return a deferred, which will callback with a
233 page (as a string) or errback with a description of the error.
235 See L{HTTPClientFactory} to see what extra arguments can be passed.
237 self.httpGetterFactory = _makeGetterFactory(
240 contextFactory=contextFactory,
242 return self.httpGetterFactory.deferred