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