3 from Screens.Screen import Screen
4 from Screens.HelpMenu import HelpableScreen
5 from Screens.MessageBox import MessageBox
6 from Components.Label import Label
7 from Components.ScrollLabel import ScrollLabel
8 from Components.ActionMap import ActionMap
9 from Components.Sources.StaticText import StaticText
10 from twisted.web import client
11 from twisted.web.client import _makeGetterFactory, HTTPClientFactory
12 from enigma import gFont
15 from Components.config import config
17 class CurlyTx(Screen,HelpableScreen):
19 <screen name="CurlyTx" position="center,center" size="560,400" title="CurlyTx" >
20 <ePixmap position="0,0" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
21 <ePixmap position="140,0" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
22 <ePixmap position="280,0" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
23 <ePixmap position="420,0" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
24 <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" />
25 <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" />
26 <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" />
27 <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" />
28 <widget name="text" position="5,45" size="550,350" font="Console;20" />
34 httpGetterFactory = None
35 showingHeaders = False
37 def __init__(self, session, args = None):
38 #self.skin = CurlyTx.skin
39 Screen.__init__(self, session)
40 HelpableScreen.__init__(self)
41 #self.skinName = [ "CurlyTx", "Setup" ]
43 self["text"] = ScrollLabel("foo")
45 self["key_red"] = StaticText(_("Settings"))
46 self["key_green"] = StaticText(_("Reload"))
47 self["key_yellow"] = StaticText(_("Prev"))
48 self["key_blue"] = StaticText(_("Next"))
51 self["actions"] = ActionMap(
52 ["WizardActions", "ColorActions", "InputActions", "InfobarEPGActions"], {
56 "down": self.pageDown,
58 "red": self.showSettings,
60 "yellow": self.prevPage,
61 "blue": self.nextPage,
63 "showEventInfo": self.showHeader
68 self.loadUrl(config.plugins.CurlyTx.defaultPage.value)
69 self.onLayoutFinish.append(self.setTextFont)
72 self.helpList.append((
73 self["actions"], "WizardActions",
74 [("up", _("Scroll page contents up"))]))
75 self.helpList.append((
76 self["actions"], "WizardActions",
77 [("down", _("Scroll page contents down"))]))
78 self.helpList.append((
79 self["actions"], "InfobarEPGActions",
80 [("showEventInfo", _("Show HTTP response headers"))]))
81 self.helpList.append((
82 self["actions"], "ColorActions",
83 [("red", _("Show program settings"))]))
84 self.helpList.append((
85 self["actions"], "ColorActions",
86 [("green", _("Reload current page URL"))]))
87 self.helpList.append((
88 self["actions"], "ColorActions",
89 [("yellow", _("Switch to next configured page URL"))]))
90 self.helpList.append((
91 self["actions"], "ColorActions",
92 [("blue", _("Switch to previous configured page URL"))]))
93 self.helpList.append((
94 self["actions"], "WizardActions",
95 [("ok", _("Close window"))]))
96 self.helpList.append((
97 self["actions"], "WizardActions",
98 [("back", _("Close window"))]))
99 self.helpList.append((
100 self["actions"], "HelpActions",
101 [("displayHelp", _("Show this help screen"))]))
103 def loadButtons(self):
104 pageCount = len(config.plugins.CurlyTx.pages)
106 self["key_green"].setText("")
107 self["key_yellow"].setText("")
108 self["key_blue"].setText("")
110 self["key_green"].setText(_("Reload"))
111 self["key_yellow"].setText("")
112 self["key_blue"].setText("")
114 self["key_green"].setText(_("Reload"))
115 self["key_yellow"].setText(_("Prev"))
116 self["key_blue"].setText(_("Next"))
119 self["text"].pageUp()
122 self["text"].pageDown()
125 if self.currentPage == None:
128 pageId = self.currentPage - 1
130 pageId = len(config.plugins.CurlyTx.pages) - 1
134 if self.currentPage == None:
137 pageId = self.currentPage + 1
138 if pageId > len(config.plugins.CurlyTx.pages) - 1:
143 if self.currentPage == None:
146 self.loadUrl(self.currentPage)
148 def loadUrl(self, pageId):
153 cfg = config.plugins.CurlyTx
154 pageCount = len(cfg.pages)
156 if pageId > (pageCount - 1):
157 if len(cfg.pages) == 0:
160 self["text"].setText(_("Invalid page") + " " + pageId);
163 url = cfg.pages[pageId].uri.value
164 title = cfg.pages[pageId].title.value
167 title = "{0} [{1}/{2}]".format(title, pageId + 1, pageCount)
169 self.currentPage = pageId
170 self.currentUrl = url
171 self.currentFontSize = cfg.pages[pageId].fontSize.value
175 self["text"].setText(_("Loading ...") + "\n" + url);
177 self.getPageWebClient(url).addCallback(self.urlLoaded).addErrback(self.urlFailed, url)
179 def setTextFont(self):
180 if self["text"].long_text is not None:
181 self["text"].long_text.setFont(gFont("Console", self.currentFontSize))
183 def urlLoaded(self, html):
184 self["text"].setText(html)
186 def urlFailed(self, error, url):
187 self["text"].setText(
188 _("Error fetching URL:") + "\n " + error.getErrorMessage()
192 def loadNoPage(self):
193 self["text"].setText(_("Go and add a page in the settings"));
195 def showHeader(self):
196 if self.showingHeaders:
197 self["text"].setText(self.pageContent)
198 self.pageContent = None
199 self.showingHeaders = False
201 headers = _("HTTP response headers for") + "\n" + self.currentUrl + "\n\n"
202 for (k, v) in self.httpGetterFactory.response_headers.items():
203 headers += k + ": " + ("\n" + k + ": ").join(v) + "\n"
204 self.pageContent = self["text"].getText()
205 self["text"].setText(headers)
206 self.showingHeaders = True
208 def showSettings(self):
209 from CurlyTxSettings import CurlyTxSettings
210 self.session.openWithCallback(self.onSettingsChanged, CurlyTxSettings)
212 def onSettingsChanged(self):
214 if len(config.plugins.CurlyTx.pages) == 0:
215 self.currentPage = None
216 self.loadUrl(self.currentPage)
217 elif self.currentPage == None:
219 self.loadUrl(self.currentPage)
222 def getPageWebClient(self, url, contextFactory=None, *args, **kwargs):
224 Download a web page as a string.
226 COPY OF twisted.web.client.getPage to store the factory
228 Download a page. Return a deferred, which will callback with a
229 page (as a string) or errback with a description of the error.
231 See L{HTTPClientFactory} to see what extra arguments can be passed.
233 self.httpGetterFactory = _makeGetterFactory(
236 contextFactory=contextFactory,
238 return self.httpGetterFactory.deferred