SF.net SVN: fclient:[850] trunk/fclient/fclient/impl/ViewBrowser.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <jU...@us...> - 2008-08-02 00:01:50
|
Revision: 850
http://fclient.svn.sourceforge.net/fclient/?rev=850&view=rev
Author: jUrner
Date: 2008-08-02 00:01:59 +0000 (Sat, 02 Aug 2008)
Log Message:
-----------
custom progressbars on tabWidget ++ fixed a nasty segfault
Modified Paths:
--------------
trunk/fclient/fclient/impl/ViewBrowser.py
Modified: trunk/fclient/fclient/impl/ViewBrowser.py
===================================================================
--- trunk/fclient/fclient/impl/ViewBrowser.py 2008-08-01 23:58:41 UTC (rev 849)
+++ trunk/fclient/fclient/impl/ViewBrowser.py 2008-08-02 00:01:59 UTC (rev 850)
@@ -96,9 +96,6 @@
self._lastProgress = 0
return QtWebKit.QWebView.load(self, url)
- def setLastStatusMessage(self, qString):
- self._lastStatusMessage = qString
-
def setUrl(self, url):
return self.load(url)
@@ -178,40 +175,21 @@
self.progress = None
self.labelFeedbackWrap = None
if self.statusBar is not None:
- self.labelStatus = QtGui.QLabel(QtCore.QString(), self.statusBar)
- self.statusBar.addWidget(self.labelStatus)
-
- self.progress = QtGui.QProgressBar(self.statusBar)
- self.progress.setRange(0, Browser.MaxProgress)
- self.progress.setValue(0)
- self.statusBar.addWidget(self.progress)
-
label = QtGui.QLabel(self.statusBar)
label.setFrameStyle(QtGui.QLabel.Sunken | QtGui.QLabel.Box)
self.labelFeedbackWrap = pathlabelwrap.PathLabelWrap(
label,
path_module=config.CompactPathFcpKeyModule,
)
- self.statusBar.addWidget(self.labelFeedbackWrap.label, 1)
-
-
+ self.statusBar.addWidget(self.labelFeedbackWrap.label, 10)
+
def setVisible(self, flag):
if self.menuBar is not None:
for menu in self.menus:
menu.children()[0].setEnabled(flag)
if self.statusBar is not None:
- self.progress.setVisible(flag)
- self.labelStatus.setVisible(flag)
self.labelFeedbackWrap.label.setVisible(flag)
- def setProgress(self, n):
- if self.progress is not None:
- self.progress.setValue(n)
-
- def setStatusMessage(self, qString):
- if self.labelStatus is not None:
- self.labelStatus.setText(qString)
-
def setFeedback(self, qString):
if self.labelFeedbackWrap is not None:
self.labelFeedbackWrap.setPath(unicode(qString))
@@ -237,12 +215,17 @@
('BackIsClose', 'Bool', False, config.SettingScopeUser), #TODO: not implemented
('HomePage', 'String', QtCore.QString(), config.SettingScopeUser),
('AutoLoadImages', 'Bool', True, config.SettingScopeUser), #TODO: not yet implemented
- ('MaxTabText', 'UInt', 20, config.SettingScopeUser), #NOTE: make shure Max >= Min and Max and Min > 0
- ('MinTabText', 'UInt', 7, config.SettingScopeUser),
+ ('MaxTabText', 'UInt', 15, config.SettingScopeUser), #NOTE: make shure Max >= Min and Max and Min > 0
+ ('MinTabText', 'UInt', 15, config.SettingScopeUser),
+
+ ('TabProgressBarColor', 'QColor', QtGui.QColor('blue'), config.SettingScopeUser),
+ ('TabProgressBarAlpha', 'UInt', 55, config.SettingScopeUser),
)
def setValues(self, **kws):
config.SettingsBase.setValues(self, **kws)
+ if not self.parent().isCreated:
+ return
autoLoadImages = kws.get('AutoLoadImages', None)
if autoLoadImages is not None:
@@ -254,7 +237,11 @@
settings = browser.settings()
settings.setAttribute(settings.AutoLoadImages, autoLoadImages)
-
+ if kws.get('TabProgressBarColor', None) is not None or kws.get('TabProgressBarAlpha', None) is not None:
+ tabWidget = browserWidget.controlById(browserWidget.IdTabBrowsers)
+ tabWidget.tabBar().repaint()
+
+
#backIsClose = kws.get('BackIsClose', None)
#if backIsClose is not None:
# self.parent()._adjustBackIsClose()
@@ -388,9 +375,7 @@
shortcut=QtGui.QKeySequence(QtGui.QKeySequence.FindPrevious),
trigger=parent.onFindPrevious,
)
-
-
-
+
def intertwineBrowserActions(self, browser=None):
"""intertwines Browser actions with BrowserWidget actions
@note: call everytime the current browser changes
@@ -426,11 +411,20 @@
class LastBrowserState(object):
"""records the last known state browser"""
- __slots__ = ('icon', 'progress', 'statusMessage', 'title', 'url')
+ StateNone = 0x0
+ StateLoading = 0x1
+ StateComplete = 0x2
+ StateError = 0x4
+ StateHideProgressBar = 0x100
- def __init__(self, icon=None, progress=0, statusMessage=None, title=None, url=None):
+
+ __slots__ = ('clearProgressBarTimers', 'icon', 'progress', 'state', 'statusMessage', 'title', 'url')
+
+ def __init__(self, icon=None, progress=0, statusMessage=None, state=StateNone, title=None, url=None):
+ self.clearProgressBarTimers = [] # timers scheduled for hiding progressBar
self.progress = 0
self.icon = tCore.QIcon() if icon is None else icon
+ self.state = state
self.statusMessage = QtCore.QString() if statusMessage is None else statusMessage
self.title = QtCore.QString() if title is None else title
#NOTE: opening a browser in a new tab may take a while to load.
@@ -440,6 +434,53 @@
# to reimplement contextMenuEvent() :-(
self.url = QtCore.QUrl() if url is None else url
+
+class BrowserTabBar(QtGui.QTabBar):
+ """customized tabBar to show progress indicstor on tabs"""
+
+ class ClearProgressbarTimer(QtCore.QTimer):
+
+ def __init__(self, parent, lastBrowserState):
+ QtCore.QTimer.__init__(self, parent)
+ self.lastBrowserState = lastBrowserState
+ self.setSingleShot(True)
+ self.start(500)
+ self.connect(self, QtCore.SIGNAL('timeout()'), self.onTimeout)
+
+ def onTimeout(self):
+ self.lastBrowserState.clearProgressBarTimers.remove(self)
+ if not self.lastBrowserState.clearProgressBarTimers:
+ if not self.lastBrowserState.state & self.lastBrowserState.StateHideProgressBar:
+ self.lastBrowserState.state |= self.lastBrowserState.StateHideProgressBar
+ self.parent().repaint()
+
+ def __init__(self, parent, fcSettings):
+ QtGui.QTabBar.__init__(self, parent)
+ self.fcSettings = fcSettings
+
+ def paintEvent(self, event):
+ # let QTabBar do the dirty work and draw over with a big brush
+ QtGui.QTabBar.paintEvent(self, event)
+
+ application = QtGui.QApplication.instance()
+ painter = QtGui.QPainter(self)
+ for i in xrange(self.count()):
+ browser = self.parent().widget(i)
+ lastBrowserState = browser.userData()
+ if lastBrowserState.state & lastBrowserState.StateHideProgressBar:
+ continue
+ if lastBrowserState.state & (lastBrowserState.StateComplete | lastBrowserState.StateError):
+ timer = self.ClearProgressbarTimer(self, lastBrowserState)
+ lastBrowserState.clearProgressBarTimers.append(timer)
+ color = QtGui.QColor(self.fcSettings.value('TabProgressBarColor'))
+ color.setAlpha(self.fcSettings.value('TabProgressBarAlpha'))
+ brush = QtGui.QBrush(color)
+ rc = self.tabRect(i)
+ rc.adjust(4, 4, -4, -4)
+ w = int(rc.width() * (float(lastBrowserState.progress) / 100))
+ painter.setClipRect(rc.left(), rc.top(), w, rc.height())
+ painter.fillRect(rc, brush)
+
#**********************************************************************************
#
#**********************************************************************************
@@ -471,7 +512,7 @@
self.setupUi(self)
config.ObjectRegistry.register(self)
- self._isCreated = False
+ self.isCreated = False
self._initialConfigDataArrived = False
self.fcSettings = BrowserWidgetSettings(self).restore()
@@ -485,7 +526,8 @@
# setup tab bar
tabWidget = self.controlById(self.IdTabBrowsers)
- tabWidget.clear()
+ tabWidget.clear() # clear, setTabBar() seems to take over alreeady present tabs (qt-designer!)
+ tabWidget.setTabBar(BrowserTabBar(tabWidget, self.fcSettings))
tabWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.connect(tabWidget, QtCore.SIGNAL('currentChanged(int)'), self.onTabCurrentChanged)
self.connect(tabWidget, QtCore.SIGNAL('customContextMenuRequested(const QPoint &)'), self.onTabContextMenuEvent)
@@ -612,7 +654,9 @@
def currentBrowser(self):
"""returns the current browser or None"""
tabWidget = self.controlById(self.IdTabBrowsers)
- return tabWidget.currentWidget()
+ widget = tabWidget.currentWidget()
+ if isinstance(widget, Browser):
+ return widget
def load(self, url, force=False, browser=None):
"""loads an url in the current browser. if there is no current browser, a new browser is created
@@ -634,7 +678,7 @@
connectionWidget = config.ObjectRegistry.get(config.IdViewConnectionWidget, None)
if connectionWidget is None:
raise ValueError('No connection widget found')
-
+
# load url
url.setScheme('http')
url.setHost(connectionWidget.fcSettings.value('FproxyConnectionHost'))
@@ -642,6 +686,7 @@
tabWidget.setTabText(tabWidget.indexOf(browser), self._adjustTabText(self.trUtf8('Loading')))
addressBar.setText(url.toString())
lastBrowserState = browser.userData()
+ lastBrowserState.state = lastBrowserState.StateLoading
lastBrowserState.url = url
browser.load(url)
return True
@@ -697,8 +742,6 @@
self.connect(page, QtCore.SIGNAL('linkHovered(const QString &, const QString &, const QString &)'), self.onPageLinkHovered)
tabWidget.addTab(browser, self._adjustTabText(title))
- if tabWidget.currentWidget() == browser:
- self.fcGlobalFeedback.setStatusMessage(lastBrowserState.statusMessage)
return browser
#TODO: rework. we need more then one menu
@@ -738,12 +781,12 @@
def showEvent(self, event):
self.fcGlobalFeedback.setVisible(True)
- if not self._isCreated:
- self._isCreated = True
+ if not self.isCreated:
+ self.isCreated = True
# fire up a new broser to make a start
self.newBrowser(title=self.trUtf8('Waiting for fproxy'))
self.fcActions['ActionGoToHomePage'].trigger()
-
+
def viewClose(self):
pass
@@ -812,41 +855,20 @@
lastBrowserState.progress = Browser.MaxProgress
if ok:
+ lastBrowserState.state = lastBrowserState.StateComplete
lastBrowserState.statusMessage = self.trUtf8('Complete')
title = self.trUtf8('Complete') if lastBrowserState.title.isEmpty() else lastBrowserState.title
tabWidget.setTabText(tabWidget.indexOf(browser), self._adjustTabText(title))
- if browser == self.currentBrowser():
- self.fcGlobalFeedback.setStatusMessage(lastBrowserState.statusMessage)
else:
# something went wrong. most likely fProxy can not be reached
+ lastBrowserState.state = lastBrowserState.StateError
lastBrowserState.statusMessage = self.trUtf8('Error')
tabWidget.setTabText(tabWidget.indexOf(browser), self._adjustTabText(self.trUtf8('Error')))
- if browser == self.currentBrowser():
- self.fcGlobalFeedback.setStatusMessage(lastBrowserState.statusMessage)
-
- settings = browser.settings()
- settings.setAttribute(settings.JavascriptEnabled, True)
- try:
- p = (
- '<h3>%s</h3>' % self.trUtf8('Error: request failed'),
- self.trUtf8('Possible reasons:'),
- '<ul>',
- '<li>',
- self.trUtf8('fProxy can not be reached. check if fproxy is running and check your node config if fproxy host and port are set'),
- '</li>',
- '<li>',
- self.trUtf8('maybe your os can not deal with ipv6 addresses. make shure fProxy is reachable via an ipv4 address'),
- '</li>',
- '<li>',
- self.trUtf8('there is no problem. try it again..'),
- '</li>',
- '</ul>'
- )
- p = ''.join([unicode(i) for i in p])
- browser.page().mainFrame().evaluateJavaScript('document.write("<div>%s</div>");' % p)
- finally:
- settings.setAttribute(settings.JavascriptEnabled, False)
-
+ #TODO: or maybe NOTE: we can not give any feedback to the user here, like
+ # injecting some html via JavaScript. Browser crashes when navigating to another
+ # page. looks like we should not interrupt the java code. maybe there is a way by intercepting
+ # the network request..
+
def onBrowserIconChanged(self, qIcon):
browser = self.sender()
qIcon = QtCore.QIcon(qIcon) # copy it - qt nukes it on return
@@ -859,11 +881,10 @@
def onBrowserLoadProgress(self, n):
browser = self.sender()
lastBrowserState = browser.userData()
+ lastBrowserState.state = lastBrowserState.StateLoading
lastBrowserState.progress = n
- if self.sender() == self.currentBrowser():
- self.fcGlobalFeedback.setProgress(n)
-
+
def onBrowserLinkClicked(self, qUrl):
browser = self.sender()
qUrl = QtCore.QUrl(qUrl)
@@ -884,10 +905,7 @@
lastBrowserState.statusMessage = self.trUtf8('Loading')
tabWidget.setTabText(tabWidget.indexOf(browser), self._adjustTabText(self.trUtf8('Loading')))
- if browser == self.currentBrowser():
- self.fcGlobalFeedback.setProgress(0)
- self.fcGlobalFeedback.setStatusMessage(lastBrowserState.statusMessage)
-
+
def onBrowserStatusBarMessage(self, qString):
browser = self.sender()
qString = QtCore.QString(qString) # copy it - qt nukes it on return
@@ -895,9 +913,7 @@
lastBrowserState = browser.userData()
if not qString.isEmpty():
lastBrowserState.statusMessage = qString
- if browser == self.currentBrowser():
- self.fcGlobalFeedback.setStatusMessage(lastBrowserState.statusMessage)
-
+
def onBrowserTitleChanged(self, qString):
browser = self.sender()
qString = QtCore.QString(qString) # copy it - qt nukes it on return
@@ -1029,7 +1045,6 @@
def onTabCurrentChanged(self, i):
tabWidget = self.controlById(self.IdTabBrowsers)
browser = tabWidget.widget(i)
-
self.fcActions.intertwineBrowserActions(browser)
if browser is not None:
lastBrowserState = browser.userData()
@@ -1037,9 +1052,7 @@
# update status info
addressBar.setText(lastBrowserState.url.toString())
- self.fcGlobalFeedback.setStatusMessage(lastBrowserState.statusMessage)
- self.fcGlobalFeedback.setProgress(lastBrowserState.progress)
-
+
#TODO: enable/disable, but no view gives non feedback on max/min zoom
def onZoomIn(self, action):
browser = self.currentBrowser()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|