[deleted]
Sep 15, 2014 - 03:37
Here is my MultiBrowser class project. It has 3 panes, any bumpable to full screen, 1 with video, refresh on demand or every 4 min.
The base MultiBrowser class:
- is designed for iPad and landscape only
- has the first web view dedicated to video, and so not participating in refreshes
- provides for a sub class to position the first web view off screen while video loads (e.g. x = -500)
The sample MyMultiBrowser sub class:
- shows a simple (8 line) sub class
- changes the URL of the second web view
- changes the threshold when its javascript runs to be appropriate to that site
- adds javascript to customise the web view by scrolling past the site headers
A full sub class (such as my News, which has 140 lines) would implement custom delegates to do things such as:
- re-size the video to fit the web view
- start the video playing
- crop sites to just relevant portions
- detect and flag changes such as forum posts and replies
- delete cookies and data on exit
.... (for more classes in this family see... Classes )

MultiBrowser.py
import ui, io, os
from PIL import Image as ImageP
class MultiBrowser (ui.View):
def __init__(self):
self.__make_self()
self.__make_wv1()
self.__make_wv2()
self.__make_wv3()
self.__make_bRA()
self.__make_bB()
self.__make_bF2()
self.__make_bF3()
self.did_load()
self.layout()
self.__bRAA(object)
self.present('panel')
def did_load(self):
pass
def layout(self):
self.wv_1.frame = (self.wv_1.x, 10, 498, 284)
self.wv_2.frame = (520, 10, 495, 651)
self.wv_3.frame = (10, 309, 495, 352)
self.__bRA.frame = (981, 668, 32, 32)
self.__bB.frame = (930, 668, 32, 32)
self.__bF2.frame = (520, 668, 32, 32)
self.__bF3.frame = (10, 668, 32, 32)
if self.__bF3.hidden == True:
self.__bF2.x = 10
self.wv_2.frame = (10, 10, 1005, 651)
if self.__bF2.hidden == True:
self.wv_3.frame = (10, 10, 1005, 651)
def __make_self(self):
self.MultiBrowser_version = '3.0'
self.MultiBrowser_source_code = 'Original by @tony.'
self.MultiBrowser_permissions = 'Permission to use/subclass/redistribute, but NOT to modify code.'
self.name = 'MultiBrowser'
self.url_1 = 'http://youtu.be/4BbjSXZnjBo'
self.url_2 = 'http://omz-forums.appspot.com/pythonista'
self.url_3 = 'http://omz-forums.appspot.com/pythonista'
self.__sJsW = "var metas = document.getElementsByTagName('meta');var i; for (i=0; i<metas.length; i++) {if (metas[i].name == 'viewport'){metas[i].content = 'width=device-width';}}"
self.threshold_1 = 0
self.threshold_2 = 0
self.threshold_3 = 0
self.javascript_1 = ''
self.javascript_2 = self.__sJsW + ''
self.javascript_3 = self.__sJsW + ''
self.count_1 = 0
self.count_2 = 0
self.count_3 = 0
self.__ipR = None
def __make_wv1(self):
self.wv_1 = ui.WebView()
self.wv_1.delegate = self.delegate_1()
self.wv_1.x = 10
self.add_subview(self.wv_1)
def __make_wv2(self):
self.wv_2 = ui.WebView()
self.wv_2.delegate = self.delegate_2()
self.add_subview(self.wv_2)
def __make_wv3(self):
self.wv_3 = ui.WebView()
self.wv_3.delegate = self.delegate_3()
self.add_subview(self.wv_3)
def __make_bRA(self):
self.__bRA = ui.Button()
self.__bRA.image = ui.Image.named('ionicons-ios7-reload-32')
self.__bRA.action = self.__bRAA
self.add_subview(self.__bRA)
def __make_bB(self):
self.__bB = ui.Button()
self.__bB.image = ui.Image.named('ionicons-ios7-arrow-left-32')
self.__bB.action = self.__bBA
self.__bB.hidden = True
self.add_subview(self.__bB)
def __make_bF2(self):
self.__bF2 = ui.Button()
self.__bF2.image = ui.Image.named('ionicons-arrow-expand-32')
self.__bF2.action = self.__bF2A
self.add_subview(self.__bF2)
def __make_bF3(self):
self.__bF3 = ui.Button()
self.__bF3.image = ui.Image.named('ionicons-arrow-expand-32')
self.__bF3.action = self.__bF3A
self.add_subview(self.__bF3)
class delegate_1 (object):
def webview_did_finish_load(self, webview):
self = webview.superview
if self.count_1 == self.threshold_1:
webview.evaluate_javascript(self.javascript_1)
self.count_1 += 1
class delegate_2 (object):
def webview_did_finish_load(self, webview):
self = webview.superview
if self.count_2 == self.threshold_2:
webview.evaluate_javascript(self.javascript_2)
self.count_2 += 1
class delegate_3 (object):
def webview_did_finish_load(self, webview):
self = webview.superview
if self.count_3 == self.threshold_3:
webview.evaluate_javascript(self.javascript_3)
self.count_3 += 1
def __bR1A(self, sender):
if self.count_1 == 0:
self.wv_1.load_url(self.url_1)
def __bR2A(self, sender):
self.count_2 = 0
self.wv_2.load_url(self.url_2)
def __bR3A(self, sender):
self.count_3 = 0
self.wv_3.load_url(self.url_3)
def __bRAA(self, sender):
ui.cancel_delays()
self.__iQ = 5
self.__ipR = ImageP.open('ionicons-ios7-reload-32')
self.__bRA.image = ui.Image.named('ionicons-load-d-32')
self.__bF2.enabled = False
self.__bF3.enabled = False
self.__bR1A(object)
self.__bR2A(object)
self.__bR3A(object)
ui.delay(self.__AutoRefresh,3)
def __bBA(self, sender):
self.wv_2.go_back()
self.wv_3.go_back()
def __bF2A(self, sender):
self.wv_2.bring_to_front()
if self.wv_2.width < 1000:
ui.cancel_delays()
if getattr(self, 'bD3', None) is not None: self.bD3.hidden = True
self.__bB.hidden = False
self.__bF2.image = ui.Image.named('ionicons-arrow-shrink-32')
self.__bF3.hidden = True
self.__bF2.x = 10
self.wv_2.width = 1005
self.wv_2.height = 651
else:
if getattr(self, 'bD3', None) is not None: self.bD3.hidden = False
self.__bB.hidden = True
self.__bF2.image = ui.Image.named('ionicons-arrow-expand-32')
self.__bF2.x = 520
self.__bF3.hidden = False
self.wv_2.width = 495
self.wv_2.height = 651
self.__bRAA(object)
self.wv_2.evaluate_javascript(self.javascript_2)
def __bF3A(self, sender):
self.wv_3.bring_to_front()
if self.wv_3.width < 1000:
ui.cancel_delays()
if getattr(self, 'bD3', None) is not None: self.bD3.hidden = True
self.__bB.hidden = False
self.__bF3.image = ui.Image.named('ionicons-arrow-shrink-32')
self.__bF2.hidden = True
self.wv_3.width = 1005
self.wv_3.height = 651
else:
if getattr(self, 'bD3', None) is not None: self.bD3.hidden = False
self.__bB.hidden = True
self.__bF3.image = ui.Image.named('ionicons-arrow-expand-32')
self.__bF2.hidden = False
self.wv_3.width = 495
self.wv_3.height = 352
self.__bRAA(object)
self.wv_3.evaluate_javascript(self.javascript_3)
def __AutoRefresh(self):
if self.__iQ == 5:
self.__iQ = 1
self.__bF2.enabled = True
self.__bF3.enabled = True
with io.BytesIO() as bIO:
self.__ipR.save(bIO, self.__ipR.format)
self.__bRA.image = ui.Image.from_data(bIO.getvalue())
ui.delay(self.__AutoRefresh, 57)
else:
with io.BytesIO() as bIO:
l_ipR = self.__ipR.rotate(-90 * self.__iQ)
l_ipR.save(bIO, self.__ipR.format)
if self.__iQ == 4:
self.__bRAA(object)
else:
self.__bRA.image = ui.Image.from_data(bIO.getvalue())
self.__iQ += 1
ui.delay(self.__AutoRefresh, 60)
@ui.in_background
def will_close(self):
ui.cancel_delays()
self.wv_1.stop()
self.wv_2.stop()
self.wv_3.stop()
class MyMultiBrowser (MultiBrowser):
def did_load(self):
self.__make_self()
def __make_self(self):
self.name = 'My Multi'
self.url_2 = 'http://www.engadget.com'
self.threshold_2 = 2
self.javascript_2 += "window.scrollTo(0,document.getElementById('header-social-icons').offsetTop + 20);"
if __name__ == "__main__":
MyMultiBrowser()