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. |