SF.net SVN: fclient:[914] trunk/fclient/fclient/impl/ViewBrowser.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <jU...@us...> - 2008-08-16 08:01:03
|
Revision: 914 http://fclient.svn.sourceforge.net/fclient/?rev=914&view=rev Author: jUrner Date: 2008-08-16 08:01:13 +0000 (Sat, 16 Aug 2008) Log Message: ----------- no longer needed Removed Paths: ------------- trunk/fclient/fclient/impl/ViewBrowser.py Deleted: trunk/fclient/fclient/impl/ViewBrowser.py =================================================================== --- trunk/fclient/fclient/impl/ViewBrowser.py 2008-08-16 08:00:12 UTC (rev 913) +++ trunk/fclient/fclient/impl/ViewBrowser.py 2008-08-16 08:01:13 UTC (rev 914) @@ -1,1381 +0,0 @@ -#****************************************************************************************** -#TODO: -# x. someday. maybe. reimpl to browse via fcp -# x. page history is cleared if we get an error on loading a page. reimpl page history? -# x. back-is-close like behaviour -# x. backand forward buttons suck somehow. sometimes fwd is enabled even if no fwd is available. reimpl page history? -# x. save page to disk -# x. download. idea is to add dls to global download widget and mark them (some color code) as new content. -# alt would be to to do it firefox like in a separate widget. maybe an option to adjust if browser dls should be -# persistent or not -# x. tool buttons do not adjust their size to icon size. maybe it is some global setting via qt-config -# x. fProxy is a bit tight-lipped when it comes to feedback. no idea -# x. give feedback on tabs about load / finisched / error. maybe some color code. wait for new QTabWidget features (qt4.5) -# x. close button on tabs. wait for new QTabWidget features (qt4.5) -# x. page actions: CopyImageToClipboard? -# x. when mouse pointer is over an opend image a magnifier cursor appears. no idea how this is handled -# x. open new tab on tab bar double click. IIRC looks like no way before qt4.5. tabBars are not stretched to fit in qt4.4 -# x. global feedback on statusbar flickers. reason: first label is holds arbitrary length text -# x. fproxy. "force browser to dl" should we dl it in downloads or store emidiately? no idea -# x. visiting plugins via fproxy does not work -# x. real toolbars -# x. remove host/port from urls? -# x. browser settings - QWebSettings -# x. shortcuts -# x. user staring gui for first time. maybe we should not connext untill the user connects explicitely -# x. looks like on error loading page reload does not work -# x. when loading a page, until fproxy reacts reload is enabled instead of stop. hitting reloading will trigger an error -# page, but reloads the current page as expected. no idea how to handle error page poping up. -# x. icons on find bar push button text tio the side. no idea so far -# x. on find action, give feedback when no matching text was found on page -# x. some shortcuts for actions are still missing -# x. rework to support dynamic retranslation -# x. tooltips for tabs showing truncated title -# x. reduce tab width when many tabs are open to allow for more tabs being visible -# x. tab context menu: "Close all tabs" is a bit of a trap. maybe remove or place it on the very bottom once we have -# more menu entries -# x. dropping. accept keys +1. what else to accept? -# x. option to upload content from browser? "upload current page" / image ..whatevs -# x. print contents -# x. a note on "save link". if it points to a html page, no media is saved, just the html -# x. close icon for ActionCloseSideBar -# x. peformance of QWebView sucks when it comes to rendering images -# x. on some pages images are not be loaded (no network error?!) while ff loads them without any problems -# -#******************************************************************************************* -#TODO: code -# -# x. isolate browser better. state data should be provided by browser -# x. when done, assign timers for tabProgressbars to browser as userData -# x. separate browser and sideBar controllers -# -#****************************************************************************************** -""" - -@newfield signal: signal, signals -""" -from __future__ import absolute_import -if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below - import os; __path__ = [os.path.dirname(__file__)] - -import os -from PyQt4 import QtCore, QtGui, QtWebKit - -from . import config - -from .lib import fcp2 -from .lib.qt4ex.lib import tools as qtools -from .lib.compactpath.qt4 import pathlabelwrap - -from . import DlgPropsBrowserObject -from . import SideBarLoadDetails - -from .tpls.Ui_ViewBrowserWidgetTpl import Ui_ViewBrowserWidget -#***************************************************************************************** -# -#***************************************************************************************** -class BrowserSideBar: - """template for sidebars""" - - def __init__(self, parent=None, closeAction=None): - """ - @param parent: parent widget - @param closeAction: (QAction) that should be triggered to close the sideBar - """ - def setCurrent(self, browserWidget, flag): - """ - @param browserWidget: browser widget the sideBar is attatched to - @param flag: (bool) True if the sideBar is the current sidebar now, False otherwise - """ - -#***************************************************************************************** -# -#***************************************************************************************** -# to browse via fcp... -from PyQt4 import QtNetwork -class NetworkAccessManager(QtNetwork.QNetworkAccessManager): - - def __init__(self, parent): - QtNetwork.QNetworkAccessManager.__init__(self, parent) - - def createRequest(self, operation, request, outgoingData): - reply = QtNetwork.QNetworkAccessManager.createRequest(self, operation, request, outgoingData) - self.emit(QtCore.SIGNAL('networkRequestCreated(QNetworkReply*)'), reply) - #print 'createRequest', reply.url() - #self.connect(reply, QtCore.SIGNAL('downloadProgress(qint64, qint64)'), self.foo) - return reply - - def foo(self, *args): - print args - - -class Page(QtWebKit.QWebPage): - def __init__(self, parent): - QtWebKit.QWebPage.__init__(self, parent) - - self.setNetworkAccessManager(NetworkAccessManager(self)) - #def acceptNavigationRequest(self, frame, request, typeRequest): - # return True - -#***************************************************************************************** -# -#***************************************************************************************** -class NetworkReplyData(QtCore.QObject): - def __init__(self, parent, url): - QtCore.QObject.__init__(self, parent) - self.url = url - self.bytesReceived = 0 - self.bytesTotal = 0 - self.finished = False - self.errorCode = None - - -class Browser(QtWebKit.QWebView): - """ browser customized for freenet - """ - - MaxProgress = 100 - - def __init__(self, parent=None, userData=None): - QtWebKit.QWebView.__init__(self, parent) - - page = Page(self) - self.setPage(page) - - #NOTE: we store last progress made to set busy cursor accordingly - self._lastProgress = 0 - self._userData = userData - self._networkGetReplies = [[], []] # (QNetworkReplies, urls) - self._networkReplySignals = ( - ('downloadProgress(qint64, qint64)', self.onNetworkReplyDownloadProgress), - ('error(QNetworkReply::NetworkError)', self.onNetworkReplyError), - ('finished()', self.onNetworkReplyFinished), - ) - - # connect actions - self.connect(self, QtCore.SIGNAL('loadStarted()'), self.onLoadStarted) - self.connect(self, QtCore.SIGNAL('loadProgress(int)'), self.onLoadProgress) - self.connect(self, QtCore.SIGNAL('loadFinished(bool)'), self.onLoadFinished) - self.connect(self.pageAction(QtWebKit.QWebPage.Stop), QtCore.SIGNAL('triggered()'), self.onActionStopTriggered) - - ################################ - ## methods - ################################ - #TODO: impl in BrowserWidget - def lastProgress(self): - """returns the last progress made by the browser - @return: (int) last progress - """ - return self._lastProgress - - def networkGetReplies(self): - return self._networkGetReplies[1] - - def networkGetReply(self, indexReply): - return self._networkGetReplies[1][indexReply] - - def setUserData(self, userData): - self._userData = userData - - def userData(self): - return self._userData - - ################################ - ## overwritten methods - ################################ - #def createWindow(self, typeWindow): - # pass - - def load(self, url): - self._lastProgress = 0 - return QtWebKit.QWebView.load(self, url) - - def setUrl(self, url): - return self.load(url) - - def setContents(self, *args): - """sets the contents of the browser without changing its url""" - self._lastProgress = 0 - return QtWebKit.QWebView.setContents(self, *args) - - def setHtml(self, *args): - """sets the contents of the browser without changing its url""" - self._lastProgress = 0 - return QtWebKit.QWebView.setHtm(self, *args) - - def setPage(self, page): - """""" - self._lastProgress = 0 - self.connect( - page.networkAccessManager(), - QtCore.SIGNAL('networkRequestCreated(QNetworkReply*)'), - self.onNetworkRequestCreated - ) - - self.emit(QtCore.SIGNAL('pageSet(QWebPage*)'), page) - return QtWebKit.QWebView.setPage(self, page) - - def mouseMoveEvent(self, event): - QtWebKit.QWebView.mouseMoveEvent(self, event) - if self._lastProgress < self.MaxProgress: - self.setCursor(QtCore.Qt.BusyCursor) - - ############################### - ## event handlers - ############################### - def onActionStopTriggered(self): - # check wich cursor to set cos we may have busy cursor set - pt = self.mapFromGlobal(self.cursor().pos()) #TODO: self.mapFromGlobal(self.viewPort().cursor().pos()) ?? - frame = self.page().currentFrame() - hitTest = frame.hitTestContent(pt) - #if not hitTest.isNull(): #TODO: looks like hitTest.isNull() alwas returns True - if hitTest.linkUrl().isValid(): - self.setCursor(QtCore.Qt.PointingHandCursor) - else: - self.setCursor(QtCore.Qt.ArrowCursor) - - def onLoadStarted(self): - self._lastProgress = 0 - self._networkGetReplies = [[], []] - - def onLoadProgress(self, n): - self._lastProgress = n - - def onLoadFinished(self, ok): - if ok: - self._lastProgress = self.MaxProgress - self.onActionStopTriggered() - - def onPageDownloadRequested(self, networkRequest): - self.emit(QtCore.SIGNAL('downloadRequested(const QNetworkRequest &)'), networkRequest) - - def onNetworkRequestCreated(self, reply): - if reply.operation() == NetworkAccessManager.GetOperation: - self._networkGetReplies[0].append(reply) - url = QtCore.QUrl(reply.url()) # copy url, qt nules it on return - networkReplyData = NetworkReplyData(self, url) - self._networkGetReplies[1].append(networkReplyData) - for signal, handler in self._networkReplySignals: - self.connect(reply, QtCore.SIGNAL(signal), handler) - self.emit(QtCore.SIGNAL('networkGetRequestCreated(int, QObject*)'), self._networkGetReplies[0].index(reply), networkReplyData) - - def onNetworkReplyDownloadProgress(self, bytesReceived, bytesTotal): - reply = self.sender() - i = self._networkGetReplies[0].index(reply) - networkReplyData = self._networkGetReplies[1][i] - networkReplyData.bytesReceived = bytesReceived - networkReplyData.bytesTotal = bytesTotal - self.emit(QtCore.SIGNAL('networkReplyProgress(int, QObject*)'), i, networkReplyData) - - def onNetworkReplyError(self, errorCode): - reply = self.sender() - i = self._networkGetReplies[0].index(reply) - networkReplyData = self._networkGetReplies[1][i] - networkReplyData.finished = True - networkReplyData.errorCode = errorCode - self.emit(QtCore.SIGNAL('networkReplyError(int, QObject*)'), i, networkReplyData) - #for signal, handler in self._networkReplySignals: - # self.disconnect(reply, QtCore.SIGNAL(signal), handler) - - def onNetworkReplyFinished(self): - reply = self.sender() - i = self._networkGetReplies[0].index(reply) - networkReplyData = self._networkGetReplies[1][i] - networkReplyData.finished = True - for signal, handler in self._networkReplySignals: - self.disconnect(reply, QtCore.SIGNAL(signal), handler) - self.emit(QtCore.SIGNAL('networkReplyFinished(int, QObject*)'), i, networkReplyData) - -#********************************************************************************** -# -#********************************************************************************** -class BrowserWidgetGlobalFeedback(config.GlobalFeedbackBase): - """wrapper for global statusbar widgets, menus""" - - def __init__(self, parent, idGlobalFeedback): - config.GlobalFeedbackBase.__init__(self, parent, idGlobalFeedback) - - # menus - self.menus = [] - if self.menuBar is not None and hasattr(parent, 'fcViewObject'): - menu = QtGui.QMenu(parent.fcViewObject.displayName, self.menuBar) - parent.populateMenu(menu) - self.menus.append(menu) - self.menuBar.addViewMenu(menu) - - # status bar widgets - self.labelStatus = None - self.progress = None - self.labelFeedbackWrap = None - if self.statusBar is not None: - 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, 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.labelFeedbackWrap.label.setVisible(flag) - - def setFeedback(self, qString): - if self.labelFeedbackWrap is not None: - self.labelFeedbackWrap.setPath(unicode(qString)) - - -class BrowserWidgetViewObject(config.ViewObject): - - def __init__(self, parent): - config.ViewObject. __init__(self, parent) - - self.name=parent.objectName() - self.displayName=self.trUtf8('Browser') - self.icon=QtGui.QIcon() - - -class BrowserWidgetSettings(config.SettingsBase): - _key_ = config.IdViewBrowserWidget - _settings_ = ( - ('OpenLinksInNewTab', 'Bool', False), - ('OpenAddressBarInNewTab', 'Bool', False), - ('OpenBookmarksInNewTab', 'Bool', False), - ('OpenHomePageOnNewTabCreated', 'Bool', False), - ('BackIsClose', 'Bool', False), #TODO: not implemented - ('HomePage', 'String', QtCore.QString()), - ('AutoLoadImages', 'Bool', True), #TODO: not yet implemented - ('MaxTabText', 'UInt', 15), #NOTE: make shure Max >= Min and Max and Min > 0 - ('MinTabText', 'UInt', 15), - - ('TabProgressBarColor', 'QColor', QtGui.QColor('blue')), - ('TabProgressBarAlpha', 'UInt', 55), - - ('SplitterPos', 'ByteArray', QtCore.QByteArray()), - ('LastSideBarAction', 'String', QtCore.QString('')), - - ) - - 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: - browserWidget = self.parent() - tabWidget = browserWidget.controlById(browserWidget.IdTabBrowsers) - for i in xrange(tabWidget.count()): - browser = tabWidget.widget(i) - if hasattr(browser, 'settings'): # QTabWidget may return a Null QWidget - 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() - - - -class BrowserWidgetActions(config.ActionsBase): - - def __init__(self, parent): - config.ActionsBase.__init__(self, parent) - - iconSize = config.fcSettings.value('IconSize') - iconTheme = config.fcSettings.value('IconTheme') - - #TODO: shortcut - self.action( - name='ActionCloseCurrentTab', - text=self.trUtf8('Close ¤t tab'), - trigger=parent.onCloseCurrentTab, - ) - #TODO: shortcut - self.action( # context menu only - name='ActionCloseBrowserUnderMouse', - text=self.trUtf8('&Close tab'), - trigger=None, - ) - self.action( - name='ActionCloseAllTabs', - text=self.trUtf8('Close &all tabs'), - trigger=parent.onCloseAllTabs, - ) - #TODO: shortcut - self.action( - name='ActionCreateNewTab', - text=self.trUtf8('Create &new tab'), - trigger=parent.onCreateNewTab, - ) - #TODO: shortcut - self.action( - name='ActionDuplicateTab', - text=self.trUtf8('&Duplicate tab'), - trigger=parent.onDuplicateTab, - ) - - #TODO: shortcut - self.action( - name='ActionGoToFProxy', - text=self.trUtf8('Go to f&Proxy homepage'), - trigger=parent.onGoToFProxy, - ) - self.action( - name='ActionGoToHomePage', - text=self.trUtf8('Go to &homepage'), - shortcut=QtGui.QKeySequence(self.trUtf8('Alt+Home')), - trigger=parent.onGoToHomePage, - ) - #TODO: shortcut - self.action( - name='ActionObjectProperties', - text=self.trUtf8('Properties..'), - trigger=None, - ) - self.action( - name='ActionZoomIn', - text=self.trUtf8('Zoom in'), - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.ZoomIn), - trigger=parent.onZoomIn, - ) - self.action( - name='ActionZoomOut', - text=self.trUtf8('Zoom out'), - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.ZoomOut), - trigger=parent.onZoomOut, - ) - - # default browser actions - self.action( - name='ActionBack', - text=self.trUtf8('Back'), - trigger=None, - isEnabled=False, - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.Back), - icon=config.fcResources.getIcon('back', iconSize, iconTheme=iconTheme), - userData=(None, None), - ) - self.action( - name='ActionForward', - text=self.trUtf8('Forward'), - trigger=None, - isEnabled=False, - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.Forward), - icon=config.fcResources.getIcon('forward', iconSize, iconTheme=iconTheme), - userData=(None, None), - ) - self.action( - name='ActionReload', - text=self.trUtf8('Reload'), - #EXPERIMENTAL: we handle it, cos page.url() is empty if fproxy did not respond. - # for some reason QWebView has "Reload" enabled in this case. we keep track of - # the last known url and reload it manually. hope we don't get into trouble with - # this. NOTE: we may have to do this for other actions aswell - trigger=parent.onBrowserReloadTriggered, - isEnabled=False, - #TODO: how to assign QKeySequence.Refresh and* F5 ? - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.Refresh), - icon=config.fcResources.getIcon('reload_page', iconSize, iconTheme=iconTheme), - userData=(None, None), - ) - self.action( - name='ActionStop', - text=self.trUtf8('Stop'), - trigger=None, - isEnabled=False, - shortcut=QtGui.QKeySequence(self.trUtf8('Esc')), - icon=config.fcResources.getIcon('stop', iconSize, iconTheme=iconTheme), - userData=(None, None), - ) - self.action( - name='ActionBackIsClose', - text=self.trUtf8('Back is close'), - icon=config.fcResources.getIcon('button_cancel', iconSize, iconTheme=iconTheme), - trigger=None, - ) - - # find actions - self.action( - name='ActionFind', - text=self.trUtf8('Find'), - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.Find), - trigger=parent.onFind, - ) - self.action( - name='ActionFindNext', - text=self.trUtf8('Find next'), - isEnabled=False, - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.FindNext), - trigger=parent.onFindNext, - ) - self.action( - name='ActionFindPrevious', - text=self.trUtf8('Find previous'), - isEnabled=False, - shortcut=QtGui.QKeySequence(QtGui.QKeySequence.FindPrevious), - trigger=parent.onFindPrevious, - ) - self.action( - name='ActionSavePage', - text=self.trUtf8('Save page..'), - isEnabled=True, - ##shortcut=QtGui.QKeySequence(QtGui.QKeySequence.FindPrevious), - trigger=parent.onSavePage, - ) - - # sideBars - group = self.group( - name='GroupSideBars', - isExclusive=True, - trigger=parent.onShowSidebar, - ) - self.action( - name='ActionShowSideBarLoadDetails', - group=group, - text=self.trUtf8('Load details'), - isEnabled=True, - isCheckable=True, - ) - - self.action( - name='ActionCloseCurrentSideBar', - text=self.trUtf8('Close sidebar'), - isEnabled=True, - trigger=parent.onCloseCurrentSideBar, - ) - - - def intertwineBrowserActions(self, browser=None): - """intertwines Browser actions with BrowserWidget actions - @note: call everytime the current browser changes - """ - actions = ( - ('ActionBack', QtWebKit.QWebPage.Back), - ('ActionForward', QtWebKit.QWebPage.Forward), - ('ActionReload', QtWebKit.QWebPage.Reload), - ('ActionStop', QtWebKit.QWebPage.Stop), - ) - for actionName, pageAction in actions: - myPageAction = self[actionName] - newPageAction = None if browser is None else browser.pageAction(pageAction) - oldPageAction, cb = myPageAction.userData() - - if oldPageAction is not None: - myPageAction.disconnect(oldPageAction, QtCore.SIGNAL('changed()'), cb) - oldPageAction.disconnect(myPageAction, QtCore.SIGNAL('triggered()'), oldPageAction.trigger) - - if newPageAction is None: - myPageAction.setUserData((None, None)) - myPageAction.setEnabled(False) - else: - def onActionChanged(browser=browser, myPageAction=myPageAction, browserPageAction=newPageAction): - myPageAction.setEnabled(browserPageAction.isEnabled()) - - myPageAction.setEnabled(newPageAction.isEnabled()) - myPageAction.setUserData((newPageAction, onActionChanged)) - myPageAction.connect(newPageAction, QtCore.SIGNAL('changed()'), onActionChanged) - newPageAction.connect(myPageAction, QtCore.SIGNAL('triggered()'), newPageAction.trigger) - - -class LastBrowserState(object): - """records the last known state browser""" - - StateNone = 0x0 - StateLoading = 0x1 - StateComplete = 0x2 - StateError = 0x4 - StateHideProgressBar = 0x100 - - - __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. - # self.url() will return '' untill the page is found, so we handle - # it ourself and keep track of the last known url in self._lastUrl - # to give feedback to the user on the navbar. downside is we have - # 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""" - - #EXPERIMENTAL: to show progressBar at 100% use a timer to clear it after - # a short delay. current implementation may pile up timers, not doing any - # harm to the progressBar though. we'd have to remove all obsolete timers - # (user hitting links like crazy), but no idea if we may run into strange race - # conditions - # - #NOTE: excessive link hitting will trigger a Qt unhandled sooner or later: - # >>> QAbstractSocket::connectToHost() called when already connecting/connected - # ...looks like we're not alone when it comes to race conditions :-) - 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) - -#********************************************************************************** -# -#********************************************************************************** -#TODO: strip host:port on address bar? -#TODO: rename home page to start page -class ViewBrowserWidget(QtGui.QWidget, Ui_ViewBrowserWidget): - - IdTabBrowsers = 'tabBrowsers' - IdFrameTools = 'frameTools' - IdFrameAddressBar = 'frameAddressBar' - IdEdAddressBar = 'edAddressBar' - - IdTabSideBar = 'tabSideBar' - IdSplitter = 'splitter' - - IdBtBack = 'btBack' - IdBtForward = 'btForward' - IdBtReload = 'btReload' - IdBtStop = 'btStop' - - IdFrameFind = 'frameFind' - IdEdFind = 'edFind' - IdBtFindPrevious = 'btFindPrevious' - IdBtFindNext= 'btFindNext' - IdCkFindCaseSensitive = 'ckFindCaseSensitive' - - ForcedMinBrowserTabText = 5 # forced minimum number of chars on browser tabBar - - def __init__(self, parent, idGlobalFeedback=config.IdMainWindow): - QtGui.QWidget.__init__(self, parent) - - self.menuSideBars = QtGui.QMenu(self.trUtf8('Side bars')) #TODO: retranslate - - self.setupUi(self) - config.ObjectRegistry.register(self) - - self.isCreated = False - self._initialConfigDataArrived = False - - self.fcSettings = BrowserWidgetSettings(self).restore() - self.fcActions = BrowserWidgetActions(self) - self.fcViewObject = BrowserWidgetViewObject(self) - self.fcGlobalFeedback = BrowserWidgetGlobalFeedback(self, idGlobalFeedback) - - # setup - iconSize = config.fcSettings.value('IconSize') - iconTheme = config.fcSettings.value('IconTheme') - - # setup tab bar - tabWidget = self.controlById(self.IdTabBrowsers) - 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) - - # setup sideBar - tabWidget = self.controlById(self.IdTabSideBar) - tabWidget.clear() # clear, setTabBar() seems to take over alreeady present tabs (qt-designer!) - tabWidget.setVisible(False) - tabWidget.tabBar().setVisible(False) - - # add sideBars - for action in self.fcActions['GroupSideBars'].actions(): - self.menuSideBars.addAction(action) - self.sideBarLoadDetails = SideBarLoadDetails.SideBarLoadDetails(tabWidget, closeAction=self.fcActions['ActionCloseCurrentSideBar']) - tabWidget.addTab(self.sideBarLoadDetails, self.trUtf8('Load details')) - - # setup splitter - splitter = self.controlById(self.IdSplitter) - splitter.restoreState(self.fcSettings.value('SplitterPos')) - self.connect(splitter, QtCore.SIGNAL('splitterMoved(int, int)'), self.onSplitterMoved) - - # setup addressBar - addressbar = self.controlById(self.IdEdAddressBar) - self.connect(addressbar, QtCore.SIGNAL('returnPressed()'), self.onNavBarReturnPressed) - - # setup tool buttons - self.controlById(self.IdBtBack).setDefaultAction(self.fcActions['ActionBack']) - self.controlById(self.IdBtForward).setDefaultAction(self.fcActions['ActionForward']) - self.controlById(self.IdBtReload).setDefaultAction(self.fcActions['ActionReload']) - self.controlById(self.IdBtStop).setDefaultAction(self.fcActions['ActionStop']) - - # setupp search bar - bt = self.controlById(self.IdBtFindPrevious) - self.connect(bt, QtCore.SIGNAL('clicked()'), self.fcActions['ActionFindPrevious'].trigger) - bt.setIcon(config.fcResources.getIcon('arrow_up',iconSize, iconTheme=iconTheme)) - bt = self.controlById(self.IdBtFindNext) - bt.setIcon(config.fcResources.getIcon('arrow_down', iconSize, iconTheme=iconTheme)) - self.connect(bt, QtCore.SIGNAL('clicked()'), self.fcActions['ActionFindNext'].trigger) - ed = self.controlById(self.IdEdFind) - self.connect(ed, QtCore.SIGNAL('returnPressed()'), self.fcActions['ActionFindNext'].trigger) - self.connect(ed, QtCore.SIGNAL('textChanged(const QString &)'), self.onEdFindTextChanged) - frameFind = self.controlById(self.IdFrameFind) - frameFind.setVisible(False) - - # finally - #TODO: hopefuly the user will not play around with this setting - actionName = self.fcSettings.value('LastSideBarAction') - action = self.fcActions.get(actionName, None) - if action is not None: - action.trigger() - - ######################################### - ## private methods - ######################################### - def _adjustCurrentBrowserDependendStuff(self): - self.fcActions.intertwineBrowserActions(self.currentBrowser()) - if self.sideBarLoadDetails.isVisible(): - self.sideBarLoadDetails.setBrowser(self.currentBrowser()) - - #NOTE: to reduce flicker set min size to max size - def _adjustTabText(self, qString): - maxTabText = self.fcSettings.value('MaxTabText') - minTabText = self.fcSettings.value('MinTabText') - ellipsis = self.trUtf8('..') - - if minTabText < self.ForcedMinBrowserTabText: - minTabText = self.ForcedMinBrowserTabText - self.fcSettings.setValues(MinTabText=minTabText) - if maxTabText < self.ForcedMinBrowserTabText: - maxTabText = self.ForcedMinBrowserTabText - self.fcSettings.setValues(MaxTabText=maxTabText) - if minTabText > maxTabText: - minTabText = maxTabText - self.fcSettings.setValues(MinTabText=maxTabText) - - if qString.count() < minTabText: - qString = qString.append('\x20' * (minTabText - qString.count())) - else: - if maxTabText < self.ForcedMinBrowserTabText: - maxTabText = sminTabText - qString = qtools.truncateString(maxTabText, qString, ellipsis) - return qString - - def _downloadImageToDisk(self, hitTestResult): - px = hitTestResult.pixmap() - if px.isNull(): - return False - - key = config.qStringToFcpKey(hitTestResult.imageUrl().toString()) - if key is None: - return False - - # thow a dialog box at the user to select a filename - # ..qt seems to place the filename part as suggestion into the filename box. so try it - caption = config.FcAppName + self.trUtf8(' - Save Image To..') - directory = unicode(config.fcSettings.value('DownloadDir')) - fileName = unicode(config.guessFileNameFromKey(key, default=QtCore.QString(''))) - - if directory and fileName: - directory = os.path.join(directory, fileName) - elif not directory: - directory = fileName - filePath = QtGui.QFileDialog.getSaveFileName(self, caption, directory) - - if filePath: - filePath= unicode(filePath) - if os.path.exists(filePath): - try: - os.remove(filePath) - except Exception, details: - QtGui.QMessageBox.critical( - self, - caption, - self.trUtf8('Could not remove file'), #NOTE: no details please, may contain arbitrary lenght filepath - ) - return False - px.save(filePath) - return True - - def _downloadKeyToDisk(self, qUrl): - """ - @return: (bool) False if the key in the url is invalid, True otherwise - """ - fcpKey = config.qStringToFcpKey(QtCore.QString(qUrl.encodedPath())) - if fcpKey is None: - QtGui.QMessageBox.critical( - self, - config.FcAppName + self.trUtf8(' - Browser error'), - self.trUtf8('Can not download key (key is invalid)') - ) - return False - downloadsWidget = config.ObjectRegistry.get(config.IdViewDownloadsWidget, None) - if downloadsWidget is None: - raise ValueError('no downloads widget found') - downloadsWidget.execDlgDownloadKey(fcpKey=fcpKey) - return True - - ######################################### - ## methods - ######################################### - def controlById(self, idControl): - return getattr(self, idControl) - - def currentBrowser(self): - """returns the current browser or None""" - tabWidget = self.controlById(self.IdTabBrowsers) - 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 - @param force: (bool) if True, a new browser is opend if there is no browser available - @param browser: browser to load the url in or None to use the current browser - @return: (bool) - """ - browser = self.currentBrowser() if browser is None else browser - tabWidget = self.controlById(self.IdTabBrowsers) - addressBar = self.controlById(self.IdEdAddressBar) - url = QtCore.QUrl(url) - - # check if we have a browser at hand - if force and browser is None: - browser = self.newBrowser() - if browser is None: - return False - - 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')) - url.setPort(connectionWidget.fcSettings.value('FproxyConnectionPort')) - 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 - - def newBrowser(self, title=''): - """opens a browser in a new tab""" - tabWidget = self.controlById(self.IdTabBrowsers) - browser = Browser(self) - page = browser.page() - settings = browser.settings() - title = QtCore.QString(title) - - # attatch browser state information - lastBrowserState = LastBrowserState( - icon=browser.icon(), - statusMessage=self.trUtf8('Waiting'), - ) - browser.setUserData(lastBrowserState) - - # customize browser - browser.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - settings.setAttribute(settings.DeveloperExtrasEnabled, False) - settings.setAttribute(settings.JavaEnabled, False) - settings.setAttribute(settings.JavascriptEnabled, False) - settings.setAttribute(settings.JavascriptCanOpenWindows, False) - settings.setAttribute(settings.JavascriptCanAccessClipboard, False) - settings.setAttribute(settings.PluginsEnabled, False) - settings.setAttribute(settings.AutoLoadImages, self.fcSettings.value('AutoLoadImages')) - - # connect browser signals - self.connect(browser, QtCore.SIGNAL('loadStarted()'), self.onBrowserLoadStarted) - self.connect(browser, QtCore.SIGNAL('loadProgress(int)'), self.onBrowserLoadProgress) - self.connect(browser, QtCore.SIGNAL('loadFinished(bool)'), self.onBrowserLoadFinished) - self.connect(browser, QtCore.SIGNAL('iconChanged()'), self.onBrowserIconChanged) - self.connect(browser, QtCore.SIGNAL('statusBarMessage(const QString &)'), self.onBrowserStatusBarMessage) - self.connect(browser, QtCore.SIGNAL('titleChanged(const QString &)'), self.onBrowserTitleChanged) - self.connect(browser, QtCore.SIGNAL('urlChanged(const QUrl &)'), self.onBrowserUrlChanged) - self.connect(browser, QtCore.SIGNAL('customContextMenuRequested(const QPoint &)'), self.onBrowserCustomContextMenuRequested) - self.connect(browser, QtCore.SIGNAL('linkClicked(const QUrl &)'), self.onBrowserLinkClicked) - - # adjust browser actions - act = browser.pageAction(page.OpenLinkInNewWindow) - act.setText(self.trUtf8('Open page in new tab')) - act = browser.pageAction(page.OpenImageInNewWindow) - act.setText(self.trUtf8('Open image in new tab')) - act = browser.pageAction(page.OpenFrameInNewWindow) - act.setText(self.trUtf8('Open frame in new tab')) - - - # customize page - page.setLinkDelegationPolicy(page.DelegateAllLinks) - - # connect page signals - self.connect(page, QtCore.SIGNAL('linkHovered(const QString &, const QString &, const QString &)'), self.onPageLinkHovered) - - tabWidget.addTab(browser, self._adjustTabText(title)) - self._adjustCurrentBrowserDependendStuff() - return browser - - #TODO: rework. we need more then one menu - def populateMenu(self, menu): - menu.addAction(self.fcActions['ActionBack']) - menu.addAction(self.fcActions['ActionForward']) - menu.addAction(self.fcActions['ActionReload']) - menu.addAction(self.fcActions['ActionStop']) - menu.addAction(self.fcActions['ActionGoToFProxy']) - menu.addAction(self.fcActions['ActionGoToHomePage']) - menu.addAction(self.fcActions['ActionCloseCurrentTab']) - menu.addAction(self.fcActions['ActionCloseAllTabs']) - menu.addAction(self.fcActions['ActionCreateNewTab']) - menu.addAction(self.fcActions['ActionZoomIn']) - menu.addAction(self.fcActions['ActionZoomOut']) - menu.addAction(self.fcActions['ActionFind']) - menu.addAction(self.fcActions['ActionFindNext']) - menu.addAction(self.fcActions['ActionFindPrevious']) - - menu.addMenu(self.menuSideBars) - return menu - - ######################################### - ## overwritten methods - ######################################### - #TODO: retranslate adjusted browser actions for all browsers - #TODO: retranslate all tab texts we inserted. mabe a flag tabHasCustomText - def retranslateUi(self, me): - Ui_ViewBrowserWidget.retranslateUi(self, me) - - ######################################### - ## overwritten events - ######################################### - def closeEvent(self): - self.viewClose() - - def hideEvent(self, event): - self.fcGlobalFeedback.setVisible(False) - - def showEvent(self, event): - self.fcGlobalFeedback.setVisible(True) - if not self.isCreated: - self.isCreated = True - # fire up a new broser to make a start - #TODO: find a better time to fire up the browser. how do we know when the gui is up and running? - QtGui.QApplication.instance().processEvents() - self.newBrowser(title=self.trUtf8('Waiting for fproxy')) - QtGui.QApplication.instance().processEvents() - self.fcActions['ActionGoToHomePage'].trigger() - - def viewClose(self): - pass - - ######################################### - ## event handlers - ######################################### - #TODO: actions need some comb over - def onBrowserCustomContextMenuRequested(self, pt): - browser = self.sender() - frame = browser.page().currentFrame() - page = browser.page() - hitTestResult = frame.hitTestContent(pt) - pt = browser.mapToGlobal(pt) - - #if not hitTest.isNull(): #TODO: looks like hitTest.isNull() alwas returns True - - menu = QtGui.QMenu() - - menu.addAction(browser.pageAction(page.OpenLink)) - menu.addAction(browser.pageAction(page.OpenLinkInNewWindow)) - menu.addAction(browser.pageAction(page.CopyLinkToClipboard)) - menu.addAction(browser.pageAction(page.DownloadLinkToDisk)) - - menu.addSeparator() - menu.addAction(browser.pageAction(page.OpenImageInNewWindow)) - menu.addAction(browser.pageAction(page.CopyImageToClipboard)) - menu.addAction(browser.pageAction(page.DownloadImageToDisk)) - - menu.addSeparator() - menu.addAction(browser.pageAction(page.OpenFrameInNewWindow)) - - menu.addSeparator() - menu.addAction(browser.pageAction(page.Copy)) - menu.addAction(self.fcActions['ActionObjectProperties']) - - #TODO: QwebView assumes we can download queries - we can't - browser.pageAction(page.DownloadLinkToDisk).setEnabled(config.fcpClient.isConnected()) - if browser.pageAction(page.DownloadLinkToDisk).isEnabled(): - result = config.qStringToFcpKey(hitTestResult.linkUrl().toString()) - if result is None: - browser.pageAction(page.DownloadLinkToDisk).setEnabled(False) - - action = menu.exec_(pt) - - if action == browser.pageAction(page.OpenLinkInNewWindow): - browser = self.newBrowser(title=self.trUtf8('Loading')) - self.load(hitTestResult.linkUrl(), browser=browser) - elif action == browser.pageAction(page.OpenImageInNewWindow): - browser = self.newBrowser(title=self.trUtf8('Loading')) - self.load(hitTestResult.imageUrl(), browser=browser) - elif action == browser.pageAction(page.OpenFrameInNewWindow): - browser = self.newBrowser(title=self.trUtf8('Loading')) - self.load(hitTestResult.frame().url(), browser=browser) - elif action == browser.pageAction(page.DownloadImageToDisk): - self._downloadImageToDisk(hitTestResult) - elif action == browser.pageAction(page.DownloadLinkToDisk): - self._downloadKeyToDisk(hitTestResult.linkUrl()) - elif action == self.fcActions['ActionObjectProperties']: - dlg = DlgPropsBrowserObject.DlgPropsBrowserObject(self, hitTestResult=hitTestResult) - if dlg.exec_() == dlg.Accepted: - pass - - #TODO: nav buttons seem to get confused on error - def onBrowserLoadFinished(self, ok): - browser = self.sender() - lastBrowserState = browser.userData() - tabWidget = self.controlById(self.IdTabBrowsers) - - 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)) - 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'))) - #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 - - lastBrowserState = browser.userData() - if not qIcon.isNull(): - lastBrowserState = qIcon - self.tabWidget.setTabIcon(i, lastBrowserState.icon) - - def onBrowserLoadProgress(self, n): - browser = self.sender() - lastBrowserState = browser.userData() - lastBrowserState.state = lastBrowserState.StateLoading - - lastBrowserState.progress = n - - def onBrowserLinkClicked(self, qUrl): - browser = self.sender() - qUrl = QtCore.QUrl(qUrl) - query = unicode(qUrl.encodedQuery()) - - if query.lower() == 'forcedownload': - if not self._downloadKeyToDisk(qUrl): - self.fcGlobalFeedback.setFeedback(self.trUtf8('Invalid key!')) - else: # assume fproxy is doing the right thing - if self.fcSettings.value('OpenLinksInNewTab'): - browser = self.newBrowser(title=self.trUtf8('Loading')) - self.load(qUrl, browser=browser) - - def onBrowserLoadStarted(self): - browser = self.sender() - lastBrowserState = browser.userData() - tabWidget = self.controlById(self.IdTabBrowsers) - - lastBrowserState.statusMessage = self.trUtf8('Loading') - tabWidget.setTabText(tabWidget.indexOf(browser), self._adjustTabText(self.trUtf8('Loading'))) - - def onBrowserReloadTriggered(self, action): - browser = self.currentBrowser() - if browser is not None: - if browser.url().toString().isEmpty(): - url = browser.userData().url - self.load(url, browser=browser) - - - def onBrowserStatusBarMessage(self, qString): - browser = self.sender() - qString = QtCore.QString(qString) # copy it - qt nukes it on return - - lastBrowserState = browser.userData() - if not qString.isEmpty(): - lastBrowserState.statusMessage = qString - - def onBrowserTitleChanged(self, qString): - browser = self.sender() - qString = QtCore.QString(qString) # copy it - qt nukes it on return - maxTabText = self.fcSettings.value('MaxTabText') - tabWidget = self.controlById(self.IdTabBrowsers) - lastBrowserState = browser.userData() - if not qString.isEmpty(): - lastBrowserState.title = qString - tabWidget.setTabText(tabWidget.indexOf(browser), self._adjustTabText( lastBrowserState.title)) - - def onBrowserUrlChanged(self, qUrl): - browser = self.sender() - qUrl = QtCore.QUrl(qUrl) # copy it - qt nukes it on return - - lastBrowserState = browser.userData() - if qUrl.isValid(): - lastBrowserState.url = qUrl - addressbar = self.controlById(self.IdEdAddressBar) - addressbar.setText(lastBrowserState.url.toString()) - - def onCloseAllTabs(self, action): - # have to do it by hand to reset [BackIsClose] - tabWidget = self.controlById(self.IdTabBrowsers) - tabWidget.clear() - self._adjustCurrentBrowserDependendStuff() - - def onCloseCurrentTab(self, action): - tabWidget = self.controlById(self.IdTabBrowsers) - i = tabWidget.currentIndex() - if i > -1: - tabWidget.removeTab(i) - self._adjustCurrentBrowserDependendStuff() - - def onCloseCurrentSideBar(self, action): - tabWidget = self.controlById(self.IdTabSideBar) - sideBar = tabWidget.currentWidget() - sideBar.setCurrent(self, False) - tabWidget.setVisible(False) - checkedAction = self.fcActions['GroupSideBars'].checkedAction() - if checkedAction is not None: - checkedAction.setChecked(False) - self.fcSettings.setValues(LastSideBarAction=QtCore.QString('')) - - def onDuplicateTab(self, action): - tabWidget = self.controlById(self.IdTabBrowsers) - browser = self.currentBrowser() - print browser - lastBrowserState = browser.userData() - self.fcActions['ActionCreateNewTab'].trigger() - browser = tabWidget.widget(tabWidget.count() -1) - self.load(lastBrowserState.url, browser=browser) - - def onEdFindTextChanged(self, text): - self.fcActions['ActionFindNext'].setEnabled(bool(text)) - self.fcActions['ActionFindPrevious'].setEnabled(bool(text)) - - def onFind(self, action): - frameFind = self.controlById(self.IdFrameFind) - ed = self.controlById(self.IdEdFind) - #ed.setText('fooBar') - - frameFind.setVisible(not frameFind.isVisible()) - #self.fcActions['ActionFindNext'].setEnabled() - #self.fcActions['ActionFindPrevious'].setEnabled() - if frameFind.isVisible(): - ed.setFocus(QtCore.Qt.OtherFocusReason) - ed.selectAll() - - #TODO: give feedback when no matching text was found - def onFindNext(self): - browser = self.currentBrowser() - if browser is not None: - page = browser.page() - ed = self.controlById(self.IdEdFind) - ck = self.controlById(self.IdCkFindCaseSensitive) - flags = page.FindWrapsAroundDocument - if ck.checkState() == QtCore.Qt.Checked: - flags |= page.FindCaseSensitively - if not browser.findText(ed.text(), flags): - pass - - def onFindPrevious(self): - browser = self.currentBrowser() - if browser is not None: - page = browser.page() - ed = self.controlById(self.IdEdFind) - ck = self.controlById(self.IdCkFindCaseSensitive) - flags = page.FindWrapsAroundDocument | page.FindBackward - if ck.checkState() == QtCore.Qt.Checked: - flags |= page.FindCaseSensitively - browser.findText(ed.text(), flags) - - #TODO: open in new tab option? - def onGoToFProxy(self, action): - url = QtCore.QUrl() - self.load(url, force=True) - - #TODO: open in new tab option? - def onGoToHomePage(self, action): - home = self.fcSettings.value('HomePage') - qUrl = QtCore.QUrl(home) - self.load(qUrl, force=True) - - def onNavBarReturnPressed(self): - text = self.controlById(self.IdEdAddressBar).text() - if text.isEmpty(): - return - qUrl = QtCore.QUrl(text) - browser = self.currentBrowser() - if browser is None or self.fcSettings.value('OpenAddressBarInNewTab'): - browser = self.newBrowser(title=self.trUtf8('Loading')) - self.load(qUrl, browser=browser) - - #TODO: we get no load progress feedback here? - #TODO: more choices for page to load - #TODO: we load fproxy in new page. this is because we enforce fproxy host/port on urls - # ...no way to distinguish in onDuplicateTab() between an empty page and fproxy page - # ...cos it relies on lastBrowserState.url - def onCreateNewTab(self, action): - browser = self.newBrowser(title=self.trUtf8('Empty')) - if self.fcSettings.value('OpenHomePageOnNewTabCreated'): - homePage = self.fcSettings.value('HomePage') - self.load(QtCore.QUrl(homePage), browser=browser) - else: - self.load(QtCore.QUrl(), browser=browser) - - def onPageLinkHovered(self, link, title, textContent): - self.fcGlobalFeedback.setFeedback(QtCore.QString(link)) - - def onPageActionBackChanged(self): - act = self.sender() - browser = self.currentBrowser() - if browser is not None and act is browser.pageAction(browser.page().Back): - self._adjustBackIsClose() - - def onSavePage(self, action): - # we have to cheat a bit here and reload the page to make shure the page has - # all QNetWorkReplies present - browser = self.currentBrowser() - - def onShowSidebar(self, action): - tabWidget = self.controlById(self.IdTabSideBar) - if action == self.fcActions['ActionShowSideBarLoadDetails']: - index = tabWidget.indexOf(self.sideBarLoadDetails) - self.sideBarLoadDetails.setCurrent(self, True) - else: - raise ValueError('No such sideBar') - self.fcSettings.setValues(LastSideBarAction=action.objectName()) - tabWidget.setCurrentIndex(index) - tabWidget.setVisible(True) - - def onSplitterMoved(self, pos, index): - splitter = self.controlById(self.IdSplitter) - self.fcSettings.setValues(SplitterPos=splitter.saveState()) - - def onTabContextMenuEvent(self, pt): - menu = QtGui.QMenu() - browser = self.currentBrowser() - tabWidget = self.controlById(self.IdTabBrowsers) - pt = tabWidget.mapToGlobal(pt) - pt2 = tabWidget.tabBar().mapFromGlobal(pt) - index = tabWidget.tabBar().tabAt(pt2) - - # setup actions - self.fcActions['ActionCloseBrowserUnderMouse'].setEnabled(index >-1) - self.fcActions['ActionDuplicateTab'].setEnabled(index >-1) - - # setup menu - menu.addAction(self.fcActions['ActionCloseBrowserUnderMouse']) - menu.addAction(self.fcActions['ActionCreateNewTab']) - menu.addAction(self.fcActions['ActionDuplicateTab']) - menu.addAction(self.fcActions['ActionCloseAllTabs']) - act = menu.exec_(pt) - if act == self.fcActions['ActionCloseBrowserUnderMouse']: - tabWidget.removeTab(i) - self._adjustCurrentBrowserDependendStuff() - - def onTabCurrentChanged(self, i): - tabWidget = self.controlById(self.IdTabBrowsers) - browser = tabWidget.widget(i) - self._adjustCurrentBrowserDependendStuff() - if browser is not None: - lastBrowserState = browser.userData() - addressBar = self.controlById(self.IdEdAddressBar) - - # update status info - addressBar.setText(lastBrowserState.url.toString()) - - #TODO: enable/disable, but no view gives non feedback on max/min zoom - def onZoomIn(self, action): - browser = self.currentBrowser() - if browser is not None: - oldMultiplier = browser.textSizeMultiplier() - browser.setTextSizeMultiplier(browser.textSizeMultiplier() + 0.2) - if browser.textSizeMultiplier() <= oldMultiplier: - menu.addAction(self.fcActions['ActionZoomIn']).setEnabled(False) - - def onZoomOut(self, action): - browser = self.currentBrowser() - if browser is not None: - oldMultiplier = browser.textSizeMultiplier() - browser.setTextSizeMultiplier(browser.textSizeMultiplier() - 0.2) - if browser.textSizeMultiplier() >= oldMultiplier: - menu.addAction(self.fcActions['ActionZoomOut']).setEnabled(False) - -#********************************************************************************** -# -#********************************************************************************** -if __name__ == '__main__': - import sys - from .ViewLogger import ViewLoggerWidget - from .MainWindow import MainWindow - from .View import ViewWidget - from .ViewConnection import ViewConnectionWidget - from .ViewDownloads import ViewDownloadsWidget - - app = QtGui.QApplication(sys.argv) - - mainWindow = MainWindow() - viewWidget = ViewWidget(mainWindow) - mainWindow.setCentralWidget(viewWidget) - - browserWidget = ViewBrowserWidget(mainWindow) - viewWidget.addTopViews( - ViewConnectionWidget(mainWindow), - browserWidget, - ViewDownloadsWidget(mainWindow), - ) - viewWidget.addBottomViews( - ViewLoggerWidget(mainWindow), - ) - - mainWindow.show() - res = app.exec_() - sys.exit(res) - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |