Пример #1
0
    def _createImageContextMenu(self, menu, hitTest):
        '''
        @param: menu QMenu
        @param: hitTest WebHitTestResult
        '''
        menu.addSeparator()
        if hitTest.imageUrl() != self.url():
            act = Action(_('Show i&mage'), menu)
            act.setData(hitTest.imageUrl())
            act.triggered.connect(self._openActionUrl)
            act.ctrlTriggered.connect(lambda: self.userDefinedOpenUrlInNewTab())
            menu.addAction(act)
        menu.addAction(_('Copy image'), self._copyImageToClipboard)
        act = menu.addAction(QIcon.fromTheme('edit-copy'), _('Copy image ad&dress'),
                self._copyLinkToClipboard)
        act.setData(hitTest.imageUrl())
        menu.addSeparator()
        menu.addAction(QIcon.fromTheme('document-save'), _('&Save image as...'),
                self._downloadImageToDisk)
        act = menu.addAction(QIcon.fromTheme('mail-message-new'), _('Send image...'),
                self._sendTextByMail)
        act.setData(hitTest.imageUrl().toEncoded())
        menu.addSeparator()

        if self.selectedText():
            menu.addAction(self.pageAction(QWebEnginePage.Copy))
Пример #2
0
 def setThemeIcon(self, icon):
     '''
     @param: icon QString
     '''
     # QIcon ic
     ic = QIcon.fromTheme(icon)
     if not ic.isNull():
         self._themeIcon = icon
         self.setIcon(QIcon.fromTheme(self._themeIcon))
Пример #3
0
 def _updateSiteIcon(self):
     if self._completer.isVisible():
         self._siteIcon.setIcon(
             QIcon.fromTheme('edit-find',
                             QIcon(':/icons/menu/search-icon.svg')))
     else:
         icon = IconProvider.emptyWebIcon()
         secured = self.property('secured')
         if secured:
             icon = QIcon.fromTheme('document-encrypted', icon)
         self._siteIcon.setIcon(icon.pixmap(16))
Пример #4
0
    def _createSelectedTextContextMenu(self, menu, hitTest):
        '''
        @param: menu QMenu
        @param: hitTest WebHitTestResult
        '''
        selectedText = self.page().selectedText()

        menu.addSeparator()
        if self.pageAction(QWebEnginePage.Copy) not in menu.actions():
            menu.addAction(self.pageAction(QWebEnginePage.Copy))
        menu.addAction(QIcon.fromTheme('mail-message-new'), _('Send text...'),
                self._sendTextByMail).setData(selectedText)
        menu.addSeparator()

        # 379: Remove newlines
        selectedString = selectedText.strip()
        if '.' not in selectedString:
            # Try to add .com
            selectedString += '.com'
        guessedUrl = QUrl.fromUserInput(selectedString)
        if self.isUrlValid(guessedUrl):
            act = Action(QIcon.fromTheme('document-open-remote'), _('Go to &web address'), menu)
            act.setData(guessedUrl)

            act.triggered.connect(self._openActionUrl)
            act.ctrlTriggered.connect(lambda: self.userDefinedOpenUrlInNewTab())
            menu.addAction(act)

        menu.addSeparator()
        selectedText = selectedText[:20]
        # KDE is displaying newlines in menu actions ... weird
        selectedText = selectedText.replace('\n', ' ').replace('\t', ' ')

        engine = gVar.app.searchEnginesManager().defaultEngine()
        act = Action(engine.icon, _('Search "%s .." with %s') % (selectedText, engine.name), menu)
        act.triggered.connect(self._searchSelectedText)
        act.ctrlTriggered.connect(self._searchSelectedTextInBackgroundTab)
        menu.addAction(act)

        # Search with ...
        swMenu = Menu(_('Search with...'), menu)
        swMenu.setCloseOnMiddleClick(True)
        searchManager = gVar.app.searchEnginesManager()
        for en in searchManager.allEngines():
            act = Action(en.icon, en.name, swMenu)
            act.setData(en)

            act.triggered.connect(self._searchSelectedText)
            act.ctrlTriggered.connect(self._searchSelectedTextInBackgroundTab)
            swMenu.addAction(act)

        menu.addMenu(swMenu)
Пример #5
0
    def _createContextMenu(self, pos):
        '''
        @param: pos QPoint
        '''
        menu = QMenu()
        actNewTab = menu.addAction(IconProvider.newTabIcon(),
                                   _('Open in new tab'))
        actNewWindow = menu.addAction(IconProvider.newWindowIcon(),
                                      _('Open in new window'))
        actNewPrivateWindow = menu.addAction(
            IconProvider.privateBrowsingIcon(),
            _('Open in new private window'))

        menu.addSeparator()
        actDelete = menu.addAction(QIcon.fromTheme('edit-delete'), _('Delete'))

        actNewTab.triggered.connect(lambda x: self._openUrlInNewTab())
        actNewWindow.triggered.connect(lambda x: self._openUrlInNewWindow())
        actNewPrivateWindow.triggered.connect(
            lambda x: self._openUrlInNewPrivateWindow())
        actDelete.triggered.connect(self.ui.historyTree.removeSelectedItems)

        if self.ui.historyTree.selectedUrl().isEmpty():
            actNewTab.setDisabled(True)
            actNewWindow.setDisabled(True)
            actNewPrivateWindow.setDisabled(True)

        menu.exec_(pos)
Пример #6
0
    def __init__(self, fileName, downloadItem, parent=None):
        '''
        @param: fileName QString
        @param: downloadItem QWebEngineDownloadItem
        @param: parent QWidget
        '''
        super().__init__(parent)
        self._ui = uic.loadUi('mc/downloads/DownloadOptionsDialog.ui', self)
        self._downloadItem = downloadItem
        self._signalEmited = False

        self._ui.fileName.setText('<b>%s</b>' % fileName)
        self._ui.fromServer.setText(self._downloadItem.url().host())

        fileIcon = IconProvider.standardIcon(QStyle.SP_FileIcon)

        db = QMimeDatabase()
        # QMimeType
        mime = db.mimeTypeForName(downloadItem.mimeType())
        if mime.isValid() and not mime.isDefault():
            self._ui.mimeName.setText(mime.comment())
            self._ui.iconLabel.setPixmap(QIcon.fromTheme(mime.iconName(), fileIcon).pixmap(22))
        else:
            self._ui.mimeFrame.hide()
            self.iconLabel.setPixmap(fileIcon.pixmap(22))

        self.setWindowTitle(_('Opening %s') % fileName)

        self._ui.buttonBox.setFocus()

        self._ui.copyDownloadLink.clicked.connect(self._copyDownloadLink)
        self._ui.finished.connect(self._emitDialogFinished)
Пример #7
0
    def _createContextMenu(self, pos):
        menu = QMenu()
        actNewTab = menu.addAction(IconProvider.newTabIcon(),
                                   _("Open in new tab"))
        actNewWindow = menu.addAction(IconProvider.newWindowIcon(),
                                      _("Open in new window"))
        actNewPrivateWindow = menu.addAction(
            IconProvider.privateBrowsingIcon(),
            _("Open in new private window"))

        menu.addSeparator()
        actCopyUrl = menu.addAction(_("Copy url"), self._copyUrl)
        actCopyTitle = menu.addAction(_("Copy title"), self._copyTitle)

        menu.addSeparator()
        actDelete = menu.addAction(QIcon.fromTheme("edit-delete"), _("Delete"))

        actNewTab.triggered.connect(self._openUrlInNewTab)
        actNewWindow.triggered.connect(self._openUrlInNewWindow)
        actNewPrivateWindow.triggered.connect(self._openUrlInNewPrivateWindow)
        actDelete.triggered.connect(self._ui.historyTree.removeSelectedItems)

        if self._ui.historyTree.selectedUrl().isEmpty():
            actNewTab.setDisabled(True)
            actNewWindow.setDisabled(True)
            actNewPrivateWindow.setDisabled(True)
            actCopyTitle.setDisabled(True)
            actCopyUrl.setDisabled(True)

        menu.exec_(pos)
Пример #8
0
    def _downloadFinished(self, success):
        '''
        @param: success bool
        '''
        self._activeDownloadsCount = 0
        downloadingAllFilesFinished = True
        for idx in range(self._ui.list.count()):
            downItem = self._ui.list.itemWidget(self._ui.list.item(idx))
            if not isinstance(downItem, DownloadItem):
                continue
            if downItem.isDownloading():
                self._activeDownloadsCount += 1
            if downItem.isCancelled() or not downItem.isDownloading():
                continue
            downloadingAllFilesFinished = False

        self.downloadsCountChanged.emit()

        if downloadingAllFilesFinished:
            if success and gVar.app.activeWindow() != self:
                icon = QIcon.fromTheme('download',
                                       QIcon(':/icons/other/download.svg'))
                gVar.app.desktopNotifications().showNotification(
                    icon.pixmap(48), _('App: Download Finished'),
                    _('All files have been successfully downloaded.'))
                if not self._closeOnFinish:
                    self.raise_()
                    self.activateWindow()
            self._ui.speedLabel.clear()
            self.setWindowTitle(_('Download Manager'))
            if const.OS_WIN:
                self.taskbarButton().progress().hide()
            if self._closeOnFinish:
                self.close()
Пример #9
0
    def _contextMenuRequested(self, pos):
        '''
        @param: pos QPoint
        '''
        # BookmarksToolbarButton
        button = self._buttonAt(pos)
        if button:
            self._clickedBookmark = button.bookmark()
        else:
            self._clickedBookmark = None

        menu = QMenu()
        actNewTab = menu.addAction(IconProvider.newTabIcon(),
                                   _('Open in new tab'))
        actNewWindow = menu.addAction(IconProvider.newWindowIcon(),
                                      _('Open in new window'))
        actNewPrivateWindow = menu.addAction(
            IconProvider.privateBrowsingIcon(),
            _('Open in new private window'))
        menu.addSeparator()
        actEdit = menu.addAction(_('Edit'))
        actDelete = menu.addAction(QIcon.fromTheme('edit-delete'), _('Delete'))
        menu.addSeparator()
        self._actShowOnlyIcons = menu.addAction(_('Show Only Icons'))
        self._actShowOnlyIcons.setCheckable(True)
        self._actShowOnlyIcons.setChecked(
            self._bookmarks.showOnlyIconsInToolbar())
        self._actShowOnlyIcons.toggled.connect(self._showOnlyIconsChanged)
        self._actShowOnlyText = menu.addAction(_('Show Only Text'))
        self._actShowOnlyText.setCheckable(True)
        self._actShowOnlyText.setChecked(
            self._bookmarks.showOnlyTextInToolbar())
        self._actShowOnlyText.toggled.connect(self._showOnlyTextChanged)

        actNewTab.triggered.connect(self._openBookmarkInNewTab)
        actNewWindow.triggered.connect(self._openBookmarkInNewWindow)
        actNewPrivateWindow.triggered.connect(
            self._openBookmarkInNewPrivateWindow)
        actEdit.triggered.connect(self._editBookmark)
        actDelete.triggered.connect(self._deleteBookmark)

        canBeModify = self._clickedBookmark and self._bookmarks.canBeModified(
            self._clickedBookmark)
        actEdit.setEnabled(canBeModify)
        actDelete.setEnabled(canBeModify)
        canOpen = self._clickedBookmark and self._clickedBookmark.isUrl()
        actNewTab.setEnabled(canOpen)
        actNewWindow.setEnabled(canOpen)
        actNewPrivateWindow.setEnabled(canOpen)

        menu.exec_(self.mapToGlobal(pos))

        if button:
            # Clear mouse over state after closing menu
            button.update()

        self._clickedBookmark = None
        self._actShowOnlyIcons = None
        self._actShowOnlyText = None
Пример #10
0
    def _imagesCustomContextMenuRequested(self, point):
        '''
        @param: point QPoint
        '''
        item = self._ui.treeImages.itemAt(point)
        if not item:
            return

        menu = QMenu()
        action = menu.addAction(QIcon.fromTheme('edit-copy'), _('Copy Image Location'),
                self._copyActionData)
        action.setData(item.text(1))
        menu.addSeparator()
        menu.addAction(QIcon.fromTheme('document-save'), _('Save Image to Disk'),
                self._saveImage)

        menu.exec_(self._ui.treeImages.viewport().mapToGlobal(point))
Пример #11
0
    def _init(self):
        self.setTitle('Hi&story')

        icon = IconProvider.standardIcon(QStyle.SP_ArrowBack)
        act = self.addAction(icon, '&Back', self._goBack)
        act.setShortcut(
            gVar.appTools.actionShortcut(QKeySequence.Back,
                                         Qt.ALT + Qt.Key_Left,
                                         QKeySequence.Forward,
                                         Qt.ALT + Qt.Key_Right))

        icon = IconProvider.standardIcon(QStyle.SP_ArrowForward)
        act = self.addAction(icon, '&Forward', self._goForward)
        act.setShortcut(
            gVar.appTools.actionShortcut(QKeySequence.Forward,
                                         Qt.ALT + Qt.Key_Right,
                                         QKeySequence.Back,
                                         Qt.ALT + Qt.Key_Left))

        act = self.addAction(QIcon.fromTheme('go-home'), '&Home', self._goHome)
        act.setShortcut(QKeySequence(Qt.ALT + Qt.Key_Home))

        icon = QIcon.fromTheme('deep-history',
                               QIcon(':/icons/menu/history.svg'))
        act = self.addAction(icon, 'Show &All History')
        act.triggered.connect(self._showHistoryManager)
        act.setShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_H))

        self.addSeparator()

        self.aboutToShow.connect(self._aboutToHide)
        self.aboutToHide.connect(self._aboutToShow)

        self._menuMostVisited = Menu('Most Visited', self)
        self._menuMostVisited.aboutToShow.connect(self._aboutToShowMostVisited)

        self._menuClosedTabs = Menu('Closed Tabs')
        self._menuClosedTabs.aboutToShow.connect(self._aboutToShowClosedTabs)

        self._menuClosedWindows = Menu('Closed Windows')
        self._menuClosedWindows.aboutToShow.connect(
            self._aboutToShowClosedWindows)

        self.addMenu(self._menuMostVisited)
        self.addMenu(self._menuClosedTabs)
        self.addMenu(self._menuClosedWindows)
Пример #12
0
    def _updateIcon(self):
        if self._themeIcon:
            icon = QIcon.fromTheme(self._themeIcon)
            if not icon.isNull():
                self.setPixmap(icon.pixmap(self.size()))
                return

        if self._fallbackIcon:
            self.setPixmap(self._fallbackIcon.pixmap(self.size()))
Пример #13
0
 def data(self):
     '''
     @return: Data
     '''
     if self._s_data is None:
         self._s_data = data = self.Data()
         data.animationInterval = 70
         data.animationPixmap = QIcon(':/icons/other/loading.png').pixmap(
             288, 16)
         data.framesCount = data.animationPixmap.width(
         ) / data.animationPixmap.height()
         data.audioPlayingPixmap = QIcon.fromTheme(
             'audio-volume-high',
             QIcon(':/icons/other/audioplaying.svg')).pixmap(16)
         data.audioMutedPixmap = QIcon.fromTheme(
             'audio-volume-muted',
             QIcon(':/icons/other/audiomuted.svg')).pixmap(16)
     return self._s_data
Пример #14
0
    def _createMediaContextMenu(self, menu, hitTest):
        '''
        @param: menu QMenu
        @param: hitTest WebHitTestResult
        '''
        paused = hitTest.mediaPaused()
        muted = hitTest.mediaMuted()

        menu.addSeparator()
        act = menu.addAction(paused and _('&Paly') or _('&Pause'), self._toggleMediaPause)
        act.setIcon(QIcon.fromTheme(paused and 'media-playback-start' or 'media-playback-pause'))
        act = menu.addAction(muted and _('Un&mute') or _('&Mute'), self._toggleMediaMute)
        act.setIcon(QIcon.fromTheme(muted and 'audio-volume-muted' or 'audio-volume-high'))
        menu.addSeparator()
        act = menu.addAction(QIcon.fromTheme('edit-copy'), _('&Copy Media Address'), self._copyLinkToClipboard)
        act.setData(hitTest.mediaUrl())
        act = menu.addAction(QIcon.fromTheme('mail-message-new'), _('&Send Media Address'), self._sendTextByMail)
        act.setData(hitTest.mediaUrl().toEncoded())
        menu.addAction(QIcon.fromTheme('document-save'), _('Save Media To &Disk'), self._downloadMediaToDisk)
Пример #15
0
    def __init__(self, parent=None):
        super().__init__(parent)
        self._manager = gVar.app.downloadManager()  # DownloadManager
        self.setIcon(QIcon.fromTheme('edit-download', QIcon(':/icons/menu/download.svg')))
        self.setTitle('Downloads')
        self.setToolTip('Open Download Manager')

        self.clicked.connect(self._clicked)
        self._manager.downloadsCountChanged.connect(self._updateState)
        self._updateState()
Пример #16
0
    def _textEdited(self, text):
        self._oldTextLength = self._currentTextLength
        self._currentTextLength = len(text)

        if text:
            self._completer.complete(text)
            icon = QIcon.fromTheme('edit-find',
                                   QIcon(':/icons/menu/search-icon.svg'))
            self._siteIcon.setIcon(icon)
        else:
            self._completer.closePopup()

        self._setGoIconVisible(True)
Пример #17
0
    def path_input(name: str,
                   directory: bool,
                   preamble: Optional[str] = None) -> QLineEdit:
        line_edit = QLineEdit()
        button = QPushButton()

        if directory:
            button.setIcon(
                QIcon.fromTheme(
                    "folder-open",
                    QApplication.style().standardIcon(QStyle.SP_DirIcon)))
        else:
            button.setIcon(
                QIcon.fromTheme(
                    "document-open",
                    QApplication.style().standardIcon(QStyle.SP_FileIcon)))

        def press_callback() -> None:
            if directory:
                if preamble:
                    QMessageBox.information(None, "How to use", preamble)
                path = QFileDialog.getExistingDirectory(
                    caption=f"Select your {name} directory")
            else:
                path, filter = QFileDialog.getOpenFileName(
                    caption=f"Select your {name} file")

            if path:
                line_edit.setText(path)

        button.pressed.connect(press_callback)

        row = grid_layout.rowCount()
        grid_layout.addWidget(QLabel(name), row, 0)
        grid_layout.addWidget(line_edit, row, 1)
        grid_layout.addWidget(button, row, 2)

        return line_edit
Пример #18
0
    def _customContextMenuRequested(self, pos):
        '''
        @param: pos QPoint
        '''
        menu = QMenu()
        menu.addAction(QIcon.fromTheme('document-open'), _('Open File'),
                       self.__openFile)

        menu.addAction(_('Open Folder'), self._openFolder)
        menu.addSeparator()
        menu.addAction(QIcon.fromTheme('edit-copy'), _('Copy Download Link'),
                       self._copyDownloadLink)
        menu.addSeparator()
        menu.addAction(QIcon.fromTheme('process-stop'),
                       _('Cancel downloading'),
                       self._stop).setEnabled(self._downloading)
        menu.addAction(QIcon.fromTheme('list-remove'), _('Remove From List'),
                       self._clear).setEnabled(not self._downloading)

        if self._downloading or self._ui.downloadInfo.text().startswith(_('Cancelled')) or \
                self._ui.downloadInfo.text().startswith(_('Error')):
            menu.actions()[0].setEnabled(False)
        menu.exec_(self.mapToGlobal(pos))
Пример #19
0
    def _createLinkContextMenu(self, menu, hitTest):
        '''
        @param: menu QMenu
        @param: hitTest WebHitTestResult
        '''
        menu.addSeparator()
        act = Action(IconProvider.newTabIcon(), _('Open link in new &tab'), menu)
        act.setData(hitTest.linkUrl())
        act.triggered.connect(lambda: self.userDefinedOpenUrlInNewTab())
        act.ctrlTriggered.connect(lambda: self.userDefineOpenUrlInBgTab())
        menu.addAction(act)
        act = menu.addAction(IconProvider.newWindowIcon(), _('Open link in new &window'),
                self._openUrlInNewWindow)
        act.setData(hitTest.linkUrl())
        act = menu.addAction(IconProvider.privateBrowsingIcon(), _('Open link in &private window'),
                gVar.app.startPrivateBrowsing)
        act.setData(hitTest.linkUrl())
        menu.addSeparator()

        bData = [hitTest.linkUrl(), hitTest.linkTitle()]  # QVariantList
        act = menu.addAction(QIcon.fromTheme('bookmark-new'), _('B&ookmark link'),
            self._bookmarkLink)
        act.setData(bData)

        menu.addAction(QIcon.fromTheme('document-save'), _('&Save link as...'),
                self._downloadLinkToDisk)
        act = menu.addAction(QIcon.fromTheme('mail-message-new'), _('Send link...'),
                self._sendTextByMail)
        act.setData(hitTest.linkUrl().toEncoded())
        act = menu.addAction(QIcon.fromTheme('edit-copy'), _('&Copy link address'),
                self._copyLinkToClipboard)
        act.setData(hitTest.linkUrl())
        menu.addSeparator()

        if self.selectedText():
            menu.addAction(self.pageAction(QWebEnginePage.Copy))
Пример #20
0
def icon_data_for_filename(fname, size=64):
    ''' Return the file type icon (as bytes) for the given filename '''
    raw = b''
    if fname:
        if not hasattr(icon_data_for_filename, 'md'):
            icon_data_for_filename.md = QMimeDatabase()
        for mt in icon_data_for_filename.md.mimeTypesForFileName(fname):
            icname = mt.iconName()
            if icname:
                ic = QIcon.fromTheme(icname)
                if not ic.isNull():
                    raw = icon_to_data(ic)
                    if raw:
                        break
    return raw
Пример #21
0
def icon_data_for_filename(fname, size=64):
    ''' Return the file type icon (as bytes) for the given filename '''
    raw = b''
    if fname:
        if not hasattr(icon_data_for_filename, 'md'):
            icon_data_for_filename.md = QMimeDatabase()
        for mt in icon_data_for_filename.md.mimeTypesForFileName(fname):
            icname = mt.iconName()
            if icname:
                ic = QIcon.fromTheme(icname)
                if not ic.isNull():
                    raw = icon_to_data(ic)
                    if raw:
                        break
    return raw
Пример #22
0
    def _createPageContextMenu(self, menu):
        '''
        @param: menu QMenu
        '''
        action = menu.addAction(_('&Back'), self.back)
        action.setIcon(IconProvider.standardIcon(QStyle.SP_ArrowBack))
        action.setEnabled(self.history().canGoBack())

        action = menu.addAction(_('&Forward'), self.forward)
        action.setIcon(IconProvider.standardIcon(QStyle.SP_ArrowForward))
        action.setEnabled(self.history().canGoForward())

        # Special menu for Speed Dial page
        if self.url().toString() == 'app:speeddial':
            menu.addSeparator()
            menu.addAction(QIcon.fromTheme('list-add'), _('&Add New Page'),
                    self._addSpeedDial)
            menu.addAction(IconProvider.settingsIcon(), _('&Configure Speed Dial'),
                    self._configureSpeedDial)
            menu.addSeparator()
            menu.addAction(QIcon.fromTheme('view-refresh'), _('Reload All Dials'),
                    self._reloadAllSpeedDials)
            return

        reloadAct, pageReloadAct = self._addPageActionToMenu(menu, QWebEnginePage.Reload)
        reloadAct.setVisible(pageReloadAct.isEnabled())

        def reloadCb():
            reloadAct.setVisible(pageReloadAct.isEnabled())
        pageReloadAct.changed.connect(reloadCb)
        menu.clearActions.append([pageReloadAct.changed, reloadCb])

        stopAct, pageStopAct = self._addPageActionToMenu(menu, QWebEnginePage.Stop)
        stopAct.setVisible(pageStopAct.isEnabled())

        def stopCb():
            stopAct.setVisible(pageStopAct.isEnabled())
        pageStopAct.changed.connect(stopCb)
        menu.clearActions.append([pageStopAct.changed, stopCb])

        menu.addSeparator()
        menu.addAction(QIcon.fromTheme('bookmark-new'), _('Book&mark page'), self._bookmarkLink)
        menu.addAction(QIcon.fromTheme('document-save'), _('&Save page as...'), self._savePageAs)
        act = menu.addAction(QIcon.fromTheme('edit-copy'), _('&Copy page link...'), self._copyLinkToClipboard)
        act.setData(self.url())
        menu.addAction(QIcon.fromTheme('mail-message-new'), _('Send page link...'), self.sendPageByEmail)
        menu.addSeparator()
        menu.addAction(QIcon.fromTheme('edit-select-all'), _('Select &all'), self.editSelectAll)
        menu.addSeparator()
Пример #23
0
    def _aboutToShowClosedTabsMenu(self):
        self._menuClosedTabs.clear()

        closedTabs = self.closedTabsManager().closedTabs()
        for idx, tab in enumerate(closedTabs):
            title = gVar.appTools.truncatedText(tab.tabState.title, 40)
            self._menuClosedTabs.addAction(tab.tabState.icon, title,
                                           self.restoreClosedTab).setData(idx)

        if self._menuClosedTabs.isEmpty():
            self._menuClosedTabs.addAction('Empty').setEnabled(False)
        else:
            self._menuClosedTabs.addSeparator()
            self._menuClosedTabs.addAction('Restore All Closed Tabs',
                                           self.restoreAllClosedTabs)
            self._menuClosedTabs.addAction(QIcon.fromTheme('edit-clear'),
                                           'Clear list',
                                           self.clearClosedTabsList)
Пример #24
0
    def _init(self):
        self.setTitle('&Bookmarks')

        act = self.addAction('Bookmark &This Page', self._bookmarkPage)
        act.setShortcut(QKeySequence('Ctrl+D'))
        self.addAction('Bookmark &All Tabs', self._bookmarkAllTabs)
        act = self.addAction(QIcon.fromTheme('bookmarks-organize'),
                             'Organize &Bookmarks')
        # NOTE: if use self.addAction(icon, label, self._showBookmarksManager)
        # will cause connection random invalid, so here connect triggered
        # separately.
        act.triggered.connect(self._showBookmarksManager)
        act.setShortcut(QKeySequence('Ctrl+Shift+O'))
        self.addSeparator()

        self.aboutToShow.connect(self._aboutToShow)
        self.aboutToShow.connect(self._menuAboutToShow)
        self.menuMiddleClicked.connect(self._menuMiddleClicked)
Пример #25
0
    def __init__(self, item, downloadItem, path, fileName, openFile, manager):
        '''
        @param: item QListWidgetItem
        @param: downloadItem QWebEngineDownloadItem
        @param: path QString
        @param: fileName QString
        @param: openFile bool
        @param: manager DownloadManager
        '''
        super().__init__()
        self._ui = uic.loadUi('mc/downloads/DownloadItem.ui', self)
        self._item = item  # QListWidgetItem
        self._download = downloadItem  # QWebEngineDownloadItem
        self._path = path
        self._fileName = fileName
        self._downTimer = QTime()
        self._remTime = QTime()
        self._downUrl = downloadItem.url()
        self._openFile = openFile

        self._downloading = False
        self._downloadStopped = False
        self._currSpeed = 0.0
        self._received = downloadItem.receivedBytes()
        self._total = downloadItem.totalBytes()

        if self.DEBUG:
            print(
                'DEBUG: %s::__init__ %s %s %s %s' %
                (self.__class__.__name__, item, downloadItem, path, fileName))

        self.setMaximumWidth(525)

        self._ui.button.setPixmap(
            QIcon.fromTheme('process-stop').pixmap(20, 20))
        self._ui.fileName.setText(self._fileName)
        self._ui.downloadInfo.setText(_('Remaining time unavailable'))

        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(
            self._customContextMenuRequested)
        self._ui.button.clicked.connect(self._stop)
        manager.resized.connect(self._parentResized)
Пример #26
0
    def _createContextMenu(self, pos):
        '''
        @param: pos QPoint
        '''
        menu = QMenu()
        actNewTab = menu.addAction(IconProvider.newTabIcon(), _('Open in new tab'))
        actNewWindow = menu.addAction(IconProvider.newWindowIcon(), _('Open in new window'))
        actNewPrivateWindow = menu.addAction(IconProvider.privateBrowsingIcon(), _('Open in new private window'))

        menu.addSeparator()
        actNewBookmark = menu.addAction(_('New Bookmark'), self._addBookmark)
        actNewFolder = menu.addAction(_('New Folder'), self._addFolder)
        actNewSeparator = menu.addAction(_('New Separator'), self._addSeparator)
        menu.addSeparator()
        actDelete = menu.addAction(QIcon.fromTheme('edit-delete'), _('Delete'))

        actNewTab.triggered.connect(self._openBookmarkInNewTab)
        actNewWindow.triggered.connect(self._openBookmarkInNewWindow)
        actNewPrivateWindow.triggered.connect(self._openBookmarkInNewPrivateWindow)
        actDelete.triggered.connect(self._deleteBookmarks)

        canBeDelete = False
        # QList<BookmarkItem>
        items = self._ui.tree.selectedBookmarks()
        for item in items:
            if self._bookmarks.canBeModified(item):
                canBeDelete = True
                break

        if not canBeDelete:
            actDelete.setDisabled(True)

        if not self._selectedBookmark or not self._selectedBookmark.isUlr():
            actNewTab.setDisabled(True)
            actNewWindow.setDisabled(True)
            actNewPrivateWindow.setDisabled(True)

        if not self._selectedBookmark:
            actNewBookmark.setDisabled(True)
            actNewFolder.setDisabled(True)
            actNewSeparator.setDisabled(True)

        menu.exec_(pos)
Пример #27
0
    def _initializeActions(self):
        for type_, text, shortcut, useCtx, theme in [
            (QWebEnginePage.Undo, _('&Undo'), 'Ctrl+Z', True, 'edit-undo'),
            (QWebEnginePage.Redo, _('&Redo'), 'Ctrl+Shift+Z', True, 'edit-redo'),
            (QWebEnginePage.Cut, _('&Cut'), 'Ctrl+X', True, 'edit-cut'),
            (QWebEnginePage.Copy, _('&Copy'), 'Ctrl+C', True, 'edit-copy'),
            (QWebEnginePage.Paste, _('&Paste'), 'Ctrl+V', True, 'edit-paste'),
            (QWebEnginePage.SelectAll, _('Select All'), 'Ctrl+A', True, 'edit-select-all'),

            (QWebEnginePage.Reload, _('&Reload'), '', False, 'view-refresh'),
            (QWebEnginePage.Stop, _('S&top'), '', False, 'process-stop'),
        ]:
            act = self.pageAction(type_)
            act.setText(text)
            if shortcut:
                act.setShortcut(QKeySequence(shortcut))
            if useCtx:
                act.setShortcutContext(Qt.WidgetWithChildrenShortcut)
            if not useCtx:
                self.addAction(act)
            act.setIcon(QIcon.fromTheme(theme))
Пример #28
0
    def _parseTheme(self, path, name):
        '''
        @param: path QString
        @param: name QString
        @return self._Theme
        '''
        info = self._Theme()
        info.isValid = False

        if not QFile(path + 'main.css').exists() or not QFile(
                path + 'metadata.desktop').exists():
            info.isValid = False
            return info

        metadata = DesktopFile('metadata.desktop')
        info.name = metadata.name()
        info.description = metadata.comment()
        info.author = metadata.value('X-App-Author')

        # QString
        iconName = metadata.icon()
        if iconName:
            if QFileInfo.exists(path + iconName):
                info.icon = QIcon(path + iconName)
            else:
                info.icon = QIcon.fromTheme(iconName)

        licensePath = metadata.value('X-App-License')
        if licensePath and QFileInfo.exists(path + licensePath):
            info.license = gVar.appTools.readAllFileContents(path +
                                                             licensePath)

        if not info.name or name in self._themeHash:
            return info

        info.isValid = True
        self._themeHash[name] = info
        return info
Пример #29
0
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = None  # Ui::DownloadManager
        self._timer = QBasicTimer()

        self._lastDownloadPath = ''
        self._downloadPath = ''
        self._useNativeDialog = False
        self._isClosing = False
        self._closeOnFinish = False
        self._activeDownloadsCount = 0

        self._useExternalManager = False
        self._externalExecutable = ''
        self._externalArguments = ''

        self._lastDownloadOption = self.NoOption  # DownloadOption

        self._taskbarButton = None  # QPointer<QWinTaskbarButton>

        self._ui = uic.loadUi('mc/downloads/DownloadManager.ui', self)
        self.setWindowFlags(self.windowFlags() ^ Qt.WindowMaximizeButtonHint)
        if const.OS_WIN:
            if QtWin.isCompositionEnabled():  # TODO: ?
                QtWin.extendFrameIntoClientArea(self, -1, -1, -1, -1)
        self._ui.clearButton.setIcon(QIcon.fromTheme('edit-clear'))
        gVar.appTools.centerWidgetOnScreen(self)

        self._ui.clearButton.clicked.connect(self._clearList)

        clearShortcut = QShortcut(QKeySequence('CTRL+L'), self)
        clearShortcut.activated.connect(self._clearList)

        self.loadSettings()

        gVar.appTools.setWmClass('Download Manager', self)
Пример #30
0
    def initialize(self, library_path, db, listener, actions, show_gui=True):
        opts = self.opts
        self.preferences_action, self.quit_action = actions
        self.library_path = library_path
        self.content_server = None
        self._spare_pool = None
        self.must_restart_before_config = False
        self.listener = Listener(listener)
        self.check_messages_timer = QTimer()
        self.check_messages_timer.timeout.connect(
            self.another_instance_wants_to_talk)
        self.check_messages_timer.start(1000)

        for ac in self.iactions.values():
            try:
                ac.do_genesis()
            except Exception:
                # Ignore errors in third party plugins
                import traceback
                traceback.print_exc()
                if getattr(ac, 'plugin_path', None) is None:
                    raise
        self.donate_action = QAction(QIcon(I('donate.png')),
                                     _('&Donate to support calibre'), self)
        for st in self.istores.values():
            st.do_genesis()
        MainWindowMixin.init_main_window_mixin(self, db)

        # Jobs Button {{{
        self.job_manager = JobManager()
        self.jobs_dialog = JobsDialog(self, self.job_manager)
        self.jobs_button = JobsButton(horizontal=True, parent=self)
        self.jobs_button.initialize(self.jobs_dialog, self.job_manager)
        # }}}

        LayoutMixin.init_layout_mixin(self)
        DeviceMixin.init_device_mixin(self)

        self.progress_indicator = ProgressIndicator(self)
        self.progress_indicator.pos = (0, 20)
        self.verbose = opts.verbose
        self.get_metadata = GetMetadata()
        self.upload_memory = {}
        self.metadata_dialogs = []
        self.default_thumbnail = None
        self.tb_wrapper = textwrap.TextWrapper(width=40)
        self.viewers = collections.deque()
        self.system_tray_icon = None
        if config['systray_icon']:
            self.system_tray_icon = factory(
                app_id='com.calibre-ebook.gui').create_system_tray_icon(
                    parent=self, title='calibre')
        if self.system_tray_icon is not None:
            self.system_tray_icon.setIcon(
                QIcon(I('lt.png', allow_user_override=False)))
            if not (iswindows or isosx):
                self.system_tray_icon.setIcon(
                    QIcon.fromTheme('calibre-gui',
                                    self.system_tray_icon.icon()))
            self.system_tray_icon.setToolTip(self.jobs_button.tray_tooltip())
            self.system_tray_icon.setVisible(True)
            self.jobs_button.tray_tooltip_updated.connect(
                self.system_tray_icon.setToolTip)
        elif config['systray_icon']:
            prints(
                'Failed to create system tray icon, your desktop environment probably does not support the StatusNotifier spec'
            )
        self.system_tray_menu = QMenu(self)
        self.toggle_to_tray_action = self.system_tray_menu.addAction(
            QIcon(I('page.png')), '')
        self.toggle_to_tray_action.triggered.connect(
            self.system_tray_icon_activated)
        self.system_tray_menu.addAction(self.donate_action)
        self.donate_button.clicked.connect(self.donate_action.trigger)
        self.donate_button.setToolTip(self.donate_action.text().replace(
            '&', ''))
        self.donate_button.setIcon(self.donate_action.icon())
        self.donate_button.setStatusTip(self.donate_button.toolTip())
        self.eject_action = self.system_tray_menu.addAction(
            QIcon(I('eject.png')), _('&Eject connected device'))
        self.eject_action.setEnabled(False)
        self.addAction(self.quit_action)
        self.system_tray_menu.addAction(self.quit_action)
        self.keyboard.register_shortcut('quit calibre',
                                        _('Quit calibre'),
                                        default_keys=('Ctrl+Q', ),
                                        action=self.quit_action)
        if self.system_tray_icon is not None:
            self.system_tray_icon.setContextMenu(self.system_tray_menu)
            self.system_tray_icon.activated.connect(
                self.system_tray_icon_activated)
        self.quit_action.triggered[bool].connect(self.quit)
        self.donate_action.triggered[bool].connect(self.donate)
        self.minimize_action = QAction(_('Minimize the calibre window'), self)
        self.addAction(self.minimize_action)
        self.keyboard.register_shortcut('minimize calibre',
                                        self.minimize_action.text(),
                                        default_keys=(),
                                        action=self.minimize_action)
        self.minimize_action.triggered.connect(self.showMinimized)

        self.esc_action = QAction(self)
        self.addAction(self.esc_action)
        self.keyboard.register_shortcut('clear current search',
                                        _('Clear the current search'),
                                        default_keys=('Esc', ),
                                        action=self.esc_action)
        self.esc_action.triggered.connect(self.esc)

        self.shift_esc_action = QAction(self)
        self.addAction(self.shift_esc_action)
        self.keyboard.register_shortcut('focus book list',
                                        _('Focus the book list'),
                                        default_keys=('Shift+Esc', ),
                                        action=self.shift_esc_action)
        self.shift_esc_action.triggered.connect(self.shift_esc)

        self.ctrl_esc_action = QAction(self)
        self.addAction(self.ctrl_esc_action)
        self.keyboard.register_shortcut('clear virtual library',
                                        _('Clear the virtual library'),
                                        default_keys=('Ctrl+Esc', ),
                                        action=self.ctrl_esc_action)
        self.ctrl_esc_action.triggered.connect(self.ctrl_esc)

        self.alt_esc_action = QAction(self)
        self.addAction(self.alt_esc_action)
        self.keyboard.register_shortcut('clear additional restriction',
                                        _('Clear the additional restriction'),
                                        default_keys=('Alt+Esc', ),
                                        action=self.alt_esc_action)
        self.alt_esc_action.triggered.connect(
            self.clear_additional_restriction)

        # ###################### Start spare job server ########################
        QTimer.singleShot(1000, self.create_spare_pool)

        # ###################### Location Manager ########################
        self.location_manager.location_selected.connect(self.location_selected)
        self.location_manager.unmount_device.connect(
            self.device_manager.umount_device)
        self.location_manager.configure_device.connect(
            self.configure_connected_device)
        self.location_manager.update_device_metadata.connect(
            self.update_metadata_on_device)
        self.eject_action.triggered.connect(self.device_manager.umount_device)

        # ################### Update notification ###################
        UpdateMixin.init_update_mixin(self, opts)

        # ###################### Search boxes ########################
        SearchRestrictionMixin.init_search_restriction_mixin(self)
        SavedSearchBoxMixin.init_saved_seach_box_mixin(self)

        # ###################### Library view ########################
        LibraryViewMixin.init_library_view_mixin(self, db)
        SearchBoxMixin.init_search_box_mixin(self)  # Requires current_db

        if show_gui:
            self.show()

        if self.system_tray_icon is not None and self.system_tray_icon.isVisible(
        ) and opts.start_in_tray:
            self.hide_windows()
        self.library_view.model().count_changed_signal.connect(
            self.iactions['Choose Library'].count_changed)
        if not gprefs.get('quick_start_guide_added', False):
            try:
                add_quick_start_guide(self.library_view)
            except:
                import traceback
                traceback.print_exc()
        for view in ('library', 'memory', 'card_a', 'card_b'):
            v = getattr(self, '%s_view' % view)
            v.selectionModel().selectionChanged.connect(self.update_status_bar)
            v.model().count_changed_signal.connect(self.update_status_bar)

        self.library_view.model().count_changed()
        self.bars_manager.database_changed(self.library_view.model().db)
        self.library_view.model().database_changed.connect(
            self.bars_manager.database_changed, type=Qt.QueuedConnection)

        # ########################## Tags Browser ##############################
        TagBrowserMixin.init_tag_browser_mixin(self, db)

        # ######################## Search Restriction ##########################
        if db.prefs['virtual_lib_on_startup']:
            self.apply_virtual_library(db.prefs['virtual_lib_on_startup'])
        self.rebuild_vl_tabs()

        # ########################## Cover Flow ################################

        CoverFlowMixin.init_cover_flow_mixin(self)

        self._calculated_available_height = min(max_available_height() - 15,
                                                self.height())
        self.resize(self.width(), self._calculated_available_height)

        self.build_context_menus()

        for ac in self.iactions.values():
            try:
                ac.gui_layout_complete()
            except:
                import traceback
                traceback.print_exc()
                if ac.plugin_path is None:
                    raise

        if config['autolaunch_server']:
            self.start_content_server()

        self.read_settings()
        self.finalize_layout()
        if self.bars_manager.showing_donate:
            self.donate_button.start_animation()
        self.set_window_title()

        for ac in self.iactions.values():
            try:
                ac.initialization_complete()
            except:
                import traceback
                traceback.print_exc()
                if ac.plugin_path is None:
                    raise
        self.set_current_library_information(current_library_name(),
                                             db.library_id, db.field_metadata)

        register_keyboard_shortcuts()
        self.keyboard.finalize()
        self.auto_adder = AutoAdder(gprefs['auto_add_path'], self)

        self.save_layout_state()

        # Collect cycles now
        gc.collect()

        QApplication.instance().shutdown_signal_received.connect(self.quit)
        if show_gui and self.gui_debug is not None:
            QTimer.singleShot(10, self.show_gui_debug_msg)

        self.iactions['Connect Share'].check_smartdevice_menus()
        QTimer.singleShot(1, self.start_smartdevice)
        QTimer.singleShot(100, self.update_toggle_to_tray_action)
Пример #31
0
    def initialize(self, library_path, db, listener, actions, show_gui=True):
        opts = self.opts
        self.preferences_action, self.quit_action = actions
        self.library_path = library_path
        self.content_server = None
        self._spare_pool = None
        self.must_restart_before_config = False
        self.listener = Listener(listener)
        self.check_messages_timer = QTimer()
        self.check_messages_timer.timeout.connect(self.another_instance_wants_to_talk)
        self.check_messages_timer.start(1000)

        for ac in self.iactions.values():
            try:
                ac.do_genesis()
            except Exception:
                # Ignore errors in third party plugins
                import traceback
                traceback.print_exc()
                if getattr(ac, 'plugin_path', None) is None:
                    raise
        self.donate_action = QAction(QIcon(I('donate.png')),
                _('&Donate to support calibre'), self)
        for st in self.istores.values():
            st.do_genesis()
        MainWindowMixin.init_main_window_mixin(self, db)

        # Jobs Button {{{
        self.job_manager = JobManager()
        self.jobs_dialog = JobsDialog(self, self.job_manager)
        self.jobs_button = JobsButton(horizontal=True, parent=self)
        self.jobs_button.initialize(self.jobs_dialog, self.job_manager)
        # }}}

        LayoutMixin.init_layout_mixin(self)
        DeviceMixin.init_device_mixin(self)

        self.progress_indicator = ProgressIndicator(self)
        self.progress_indicator.pos = (0, 20)
        self.verbose = opts.verbose
        self.get_metadata = GetMetadata()
        self.upload_memory = {}
        self.metadata_dialogs = []
        self.default_thumbnail = None
        self.tb_wrapper = textwrap.TextWrapper(width=40)
        self.viewers = collections.deque()
        self.system_tray_icon = None
        if config['systray_icon']:
            self.system_tray_icon = factory(app_id='com.calibre-ebook.gui').create_system_tray_icon(parent=self, title='calibre')
        if self.system_tray_icon is not None:
            self.system_tray_icon.setIcon(QIcon(I('lt.png')))
            if not (iswindows or isosx):
                self.system_tray_icon.setIcon(QIcon.fromTheme('calibre-gui', QIcon(I('lt.png'))))
            self.system_tray_icon.setToolTip(self.jobs_button.tray_tooltip())
            self.system_tray_icon.setVisible(True)
            self.jobs_button.tray_tooltip_updated.connect(self.system_tray_icon.setToolTip)
        elif config['systray_icon']:
            prints('Failed to create system tray icon, your desktop environment probably does not support the StatusNotifier spec')
        self.system_tray_menu = QMenu(self)
        self.toggle_to_tray_action = self.system_tray_menu.addAction(QIcon(I('page.png')), '')
        self.toggle_to_tray_action.triggered.connect(self.system_tray_icon_activated)
        self.system_tray_menu.addAction(self.donate_action)
        self.donate_button.clicked.connect(self.donate_action.trigger)
        self.donate_button.setToolTip(self.donate_action.text().replace('&', ''))
        self.donate_button.setIcon(self.donate_action.icon())
        self.donate_button.setStatusTip(self.donate_button.toolTip())
        self.eject_action = self.system_tray_menu.addAction(
                QIcon(I('eject.png')), _('&Eject connected device'))
        self.eject_action.setEnabled(False)
        self.addAction(self.quit_action)
        self.system_tray_menu.addAction(self.quit_action)
        self.keyboard.register_shortcut('quit calibre', _('Quit calibre'),
                default_keys=('Ctrl+Q',), action=self.quit_action)
        if self.system_tray_icon is not None:
            self.system_tray_icon.setContextMenu(self.system_tray_menu)
            self.system_tray_icon.activated.connect(self.system_tray_icon_activated)
        self.quit_action.triggered[bool].connect(self.quit)
        self.donate_action.triggered[bool].connect(self.donate)
        self.minimize_action = QAction(_('Minimize the calibre window'), self)
        self.addAction(self.minimize_action)
        self.keyboard.register_shortcut('minimize calibre', self.minimize_action.text(),
                default_keys=(), action=self.minimize_action)
        self.minimize_action.triggered.connect(self.showMinimized)

        self.esc_action = QAction(self)
        self.addAction(self.esc_action)
        self.keyboard.register_shortcut('clear current search',
                _('Clear the current search'), default_keys=('Esc',),
                action=self.esc_action)
        self.esc_action.triggered.connect(self.esc)

        self.shift_esc_action = QAction(self)
        self.addAction(self.shift_esc_action)
        self.keyboard.register_shortcut('focus book list',
                _('Focus the book list'), default_keys=('Shift+Esc',),
                action=self.shift_esc_action)
        self.shift_esc_action.triggered.connect(self.shift_esc)

        self.ctrl_esc_action = QAction(self)
        self.addAction(self.ctrl_esc_action)
        self.keyboard.register_shortcut('clear virtual library',
                _('Clear the virtual library'), default_keys=('Ctrl+Esc',),
                action=self.ctrl_esc_action)
        self.ctrl_esc_action.triggered.connect(self.ctrl_esc)

        self.alt_esc_action = QAction(self)
        self.addAction(self.alt_esc_action)
        self.keyboard.register_shortcut('clear additional restriction',
                _('Clear the additional restriction'), default_keys=('Alt+Esc',),
                action=self.alt_esc_action)
        self.alt_esc_action.triggered.connect(self.clear_additional_restriction)

        # ###################### Start spare job server ########################
        QTimer.singleShot(1000, self.create_spare_pool)

        # ###################### Location Manager ########################
        self.location_manager.location_selected.connect(self.location_selected)
        self.location_manager.unmount_device.connect(self.device_manager.umount_device)
        self.location_manager.configure_device.connect(self.configure_connected_device)
        self.location_manager.update_device_metadata.connect(self.update_metadata_on_device)
        self.eject_action.triggered.connect(self.device_manager.umount_device)

        # ################### Update notification ###################
        UpdateMixin.init_update_mixin(self, opts)

        # ###################### Search boxes ########################
        SearchRestrictionMixin.init_search_restriction_mixin(self)
        SavedSearchBoxMixin.init_saved_seach_box_mixin(self)

        # ###################### Library view ########################
        LibraryViewMixin.init_library_view_mixin(self, db)
        SearchBoxMixin.init_search_box_mixin(self)  # Requires current_db

        if show_gui:
            self.show()

        if self.system_tray_icon is not None and self.system_tray_icon.isVisible() and opts.start_in_tray:
            self.hide_windows()
        self.library_view.model().count_changed_signal.connect(
                self.iactions['Choose Library'].count_changed)
        if not gprefs.get('quick_start_guide_added', False):
            try:
                add_quick_start_guide(self.library_view)
            except:
                import traceback
                traceback.print_exc()
        for view in ('library', 'memory', 'card_a', 'card_b'):
            v = getattr(self, '%s_view' % view)
            v.selectionModel().selectionChanged.connect(self.update_status_bar)
            v.model().count_changed_signal.connect(self.update_status_bar)

        self.library_view.model().count_changed()
        self.bars_manager.database_changed(self.library_view.model().db)
        self.library_view.model().database_changed.connect(self.bars_manager.database_changed,
                type=Qt.QueuedConnection)

        # ########################## Tags Browser ##############################
        TagBrowserMixin.init_tag_browser_mixin(self, db)

        # ######################## Search Restriction ##########################
        if db.prefs['virtual_lib_on_startup']:
            self.apply_virtual_library(db.prefs['virtual_lib_on_startup'])
        self.rebuild_vl_tabs()

        # ########################## Cover Flow ################################

        CoverFlowMixin.init_cover_flow_mixin(self)

        self._calculated_available_height = min(max_available_height()-15,
                self.height())
        self.resize(self.width(), self._calculated_available_height)

        self.build_context_menus()

        for ac in self.iactions.values():
            try:
                ac.gui_layout_complete()
            except:
                import traceback
                traceback.print_exc()
                if ac.plugin_path is None:
                    raise

        if config['autolaunch_server']:
            self.start_content_server()

        self.keyboard_interrupt.connect(self.quit, type=Qt.QueuedConnection)

        self.read_settings()
        self.finalize_layout()
        if self.bars_manager.showing_donate:
            self.donate_button.start_animation()
        self.set_window_title()

        for ac in self.iactions.values():
            try:
                ac.initialization_complete()
            except:
                import traceback
                traceback.print_exc()
                if ac.plugin_path is None:
                    raise
        self.set_current_library_information(current_library_name(), db.library_id,
                                             db.field_metadata)

        register_keyboard_shortcuts()
        self.keyboard.finalize()
        self.auto_adder = AutoAdder(gprefs['auto_add_path'], self)

        self.save_layout_state()

        # Collect cycles now
        gc.collect()

        if show_gui and self.gui_debug is not None:
            QTimer.singleShot(10, self.show_gui_debug_msg)

        self.iactions['Connect Share'].check_smartdevice_menus()
        QTimer.singleShot(1, self.start_smartdevice)
        QTimer.singleShot(100, self.update_toggle_to_tray_action)
Пример #32
0
    def _init(self):
        # Standard actions - needed on Mac to be placed correctly in
        # "application" menu
        action = QAction(QIcon.fromTheme('help-about'), '&About App', self)
        action.setMenuRole(QAction.AboutRole)
        action.triggered.connect(self._showAboutDialog)
        self._actions['Standard/About'] = action

        action = QAction(IconProvider.settingsIcon(), 'Pr&eferences', self)
        action.setMenuRole(QAction.PreferencesRole)
        action.setShortcut(QKeySequence(QKeySequence.Preferences))
        action.triggered.connect(self._showPreferences)
        self._actions['Standard/Preferences'] = action

        action = QAction(QIcon.fromTheme('application-exit'), 'Quit', self)
        action.setMenuRole(QAction.QuitRole)
        # Shortcut set from browserWindow
        action.triggered.connect(self._quitApplication)
        self._actions['Standard/Quit'] = action

        # File menu
        self._menuFile = QMenu('&File', self)
        self._menuFile.aboutToShow.connect(self._aboutToShowFileMenu)

        self._ADD_ACTION('File/NewTab', self._menuFile, IconProvider.newTabIcon(),
            'New Tab', self._newTab, 'Ctrl+T')
        self._ADD_ACTION('File/NewWindow', self._menuFile, IconProvider.newWindowIcon(),
            '&New Window', self._newWindow, 'Ctrl+N')
        self._ADD_ACTION('File/NewPrivateWindow', self._menuFile, IconProvider.privateBrowsingIcon(),
            'New &Private Window', self._newPrivateWindow, 'Ctrl+Shift+P')
        self._ADD_ACTION('File/OpenLocation', self._menuFile, QIcon.fromTheme('document-open-remote'),
            'Open Location', self._openLocation, 'Ctrl+L')
        self._ADD_ACTION('File/OpenFile', self._menuFile, QIcon.fromTheme('document-open'),
            'Open &File...', self._openFile, 'Ctrl+O')
        self._ADD_ACTION('File/CloseWindow', self._menuFile, QIcon.fromTheme('window-close'),
            'Close Window', self._closeWindow, 'Ctrl+Shift+W')
        self._menuFile.addSeparator()

        sessionManager = gVar.app.sessionManager()
        if sessionManager:
            sessionsSubmenu = QMenu('Sessions', self)
            sessionsSubmenu.aboutToShow.connect(sessionManager._aboutToShowSessionsMenu)
            self._menuFile.addMenu(sessionsSubmenu)
            action = QAction('Session Manager', self)
            action.triggered.connect(sessionManager.openSessionManagerDialog)
            self._actions['File/SessionManager'] = action
            self._menuFile.addAction(action)
            self._menuFile.addSeparator()

        self._ADD_ACTION('File/SavePageAs', self._menuFile, QIcon.fromTheme('document-save'),
            '&Save Page As...', self._savePageAs, 'Ctrl+S')
        self._ADD_ACTION('File/SendLink', self._menuFile, QIcon.fromTheme('mail-message-new'),
            'Send Link...', self._sendLink, '')
        self._ADD_ACTION('File/Print', self._menuFile, QIcon.fromTheme('document-print'),
            '&Print...', self._printPage, 'Ctrl+P')
        self._menuFile.addSeparator()
        self._menuFile.addAction(self._actions['Standard/Quit'])

        # Edit Menu
        self._menuEdit = QMenu('&Edit', self)
        self._menuEdit.aboutToShow.connect(self._aboutToShowEditMenu)

        action = self._ADD_ACTION('Edit/Undo', self._menuEdit, QIcon.fromTheme('edit-undo'),
            '&Undo', self._editUndo, 'Ctrl+Z')
        action.setShortcutContext(Qt.WidgetShortcut)
        action = self._ADD_ACTION('Edit/Redo', self._menuEdit, QIcon.fromTheme('edit-redo'),
            '&Redo', self._editRedo, 'Ctrl+Shift+Z')
        action.setShortcutContext(Qt.WidgetShortcut)
        self._menuEdit.addSeparator()
        action = self._ADD_ACTION('Edit/Cut', self._menuEdit, QIcon.fromTheme('edit-cut'),
            '&Cut', self._editCut, 'Ctrl+X')
        action.setShortcutContext(Qt.WidgetShortcut)
        action = self._ADD_ACTION('Edit/Copy', self._menuEdit, QIcon.fromTheme('edit-copy'),
            'C&opy', self._editCopy, 'Ctrl+C')
        action.setShortcutContext(Qt.WidgetShortcut)
        action = self._ADD_ACTION('Edit/Paste', self._menuEdit, QIcon.fromTheme('edit-paste'),
            '&Paste', self._editPaste, 'Ctrl+V')
        action.setShortcutContext(Qt.WidgetShortcut)
        self._menuEdit.addSeparator()
        action = self._ADD_ACTION('Edit/SelectAll', self._menuEdit, QIcon.fromTheme('edit-select-all'),
            'Select &All', self._editSelectAll, 'Ctrl+A')
        action.setShortcutContext(Qt.WidgetShortcut)
        action = self._ADD_ACTION('Edit/Find', self._menuEdit, QIcon.fromTheme('edit-find'),
            '&Find', self._editFind, 'Ctrl+F')
        action.setShortcutContext(Qt.WidgetShortcut)

        self._menuFile.addSeparator()

        # View menu
        self._menuView = QMenu('&View', self)
        self._menuView.aboutToShow.connect(self._aboutToShowViewMenu)

        toolbarsMenu = QMenu('Toolbars', self._menuView)
        toolbarsMenu.aboutToShow.connect(self._aboutToShowtoolbarsMenu)
        sidebarMenu = QMenu('Sidebar', self._menuView)
        sidebarMenu.aboutToShow.connect(self._aboutToShowSidebarsMenu)
        encodingMenu = QMenu('Character &Encoding', self._menuView)
        encodingMenu.aboutToShow.connect(self._aboutToShowEncodingMenu)

        # Create menus to make shortcuts available event before first showing
        # the menu
        self._window.createToolbarsMenu(toolbarsMenu)
        self._window.createSidebarsMenu(sidebarMenu)

        self._menuView.addMenu(toolbarsMenu)
        self._menuView.addMenu(sidebarMenu)
        self._ADD_CHECKABLE_ACTION('View/ShowStatusBar', self._menuView, QIcon(),
            'Sta&tus Bar', self._showStatusBar, '')
        self._menuView.addSeparator()
        self._ADD_ACTION('View/Stop', self._menuView, QIcon.fromTheme('process-stop'),
            '&Stop', self._stop, 'Esc')
        self._ADD_ACTION('View/Reload', self._menuView, QIcon.fromTheme('view-refresh'),
            '&Reload', self._reload, 'F5')
        self._menuView.addSeparator()
        self._ADD_ACTION('View/ZoomIn', self._menuView, QIcon.fromTheme('zoom-in'),
            'Zoom &In', self._zoomIn, 'Ctrl++')
        self._ADD_ACTION('View/ZoomOut', self._menuView, QIcon.fromTheme('zoom-out'),
            'Zoom &Out', self._zoomOut, 'Ctrl+-')
        self._ADD_ACTION('View/ZoomReset', self._menuView, QIcon.fromTheme('zoom-original'),
            'Reset', self._zoomReset, 'Ctrl+0')
        self._menuView.addSeparator()
        self._menuView.addMenu(encodingMenu)
        self._menuView.addSeparator()
        action = self._ADD_ACTION('View/PageSource', self._menuView, QIcon.fromTheme('text-html'),
            '&Page Source', self._showPageSource, 'Ctrl+U')
        action.setShortcutContext(Qt.WidgetShortcut)
        self._ADD_CHECKABLE_ACTION('View/FullScreen', self._menuView, QIcon.fromTheme('view-fullscreen'),
            '&FullScreen', self._showFullScreen, 'F11')

        # Tool menu
        self._menuTools = QMenu('&Tools', self)
        self._menuTools.aboutToShow.connect(self._aboutToShowToolsMenu)

        self._ADD_ACTION('Tools/WebSearch', self._menuTools, QIcon.fromTheme('edit-find'),
            '&Web Search', self._webSearch, 'Ctrl+K')
        action = self._ADD_ACTION('Tools/SiteInfo', self._menuTools, QIcon.fromTheme('dialog-information'),
            'Site &Info', self._showSiteInfo, 'Ctrl+I')
        action.setShortcutContext(Qt.WidgetShortcut)
        self._menuTools.addSeparator()
        self._ADD_ACTION('Tools/DownloadManager', self._menuTools, QIcon.fromTheme('download'),
            '&Download Manager', self._showDownloadManager, 'Ctrl+Y')
        self._ADD_ACTION('Tools/CookiesManager', self._menuTools, QIcon(),
            '&Cookies Manager', self._showCookieManager, '')
        self._ADD_ACTION('Tools/WebInspector', self._menuTools, QIcon(),
            'Web In&spector', self._toggleWebInspector, 'Ctrl+Shift+I')
        self._ADD_ACTION('Tools/ClearRecentHistory', self._menuTools, QIcon.fromTheme('edit-clear'),
            'Clear Recent &History', self._showClearRecentHistoryDialog, 'Ctrl+Shift+Del')

        if not WebInspector.isEnabled():
            self._actions['Tools/WebInspector'].setVisible(False)

        self._submenuExtensions = QMenu('&Extensions', self)
        self._submenuExtensions.menuAction().setVisible(False)
        self._menuTools.addMenu(self._submenuExtensions)
        self._menuTools.addSeparator()

        # Help menu
        self._menuHelp = QMenu('&Help', self)

        # ifndef Q_OS_MACOS
        self._ADD_ACTION('Help/AboutQt', self._menuHelp, QIcon(),
            'About &Qt', self._aboutQt, '')
        self._menuHelp.addAction(self._actions['Standard/About'])
        self._menuHelp.addSeparator()
        # endif

        self._ADD_ACTION('Help/InfoAboutApp', self._menuHelp, QIcon.fromTheme('help-contents'),
            'Information about application', self._showInfoAboutApp, '')
        self._ADD_ACTION('Help/ConfigInfo', self._menuHelp, QIcon(),
            'Configuration Information', self._showConfigInfo, '')
        self._ADD_ACTION('Help/ReportIssue', self._menuHelp, QIcon(),
            'Report &Issue', self._reportIssue, '')

        self._actions['Help/InfoAboutApp'].setShortcut(QKeySequence(QKeySequence.HelpContents))

        # History menu
        self._menuHistory = HistoryMenu()
        self._menuHistory.setMainWindow(self._window)

        # Bookmarks menu
        self._menuBookmarks = BookmarksMenu()
        self._menuBookmarks.setMainWindow(self._window)

        # Other actions
        action = QAction(QIcon.fromTheme('user-trash'),
            'Restore &Closed Tab', self)
        action.setShortcut(QKeySequence('Ctrl+Shift+T'))
        action.triggered.connect(self._restoreClosedTab)
        self._actions['Other/RestoreClosedTab'] = action

        # # ifdef Q_OS_MACOS
        # self._actions['View/FullScreen'].setShortcut(QKeySequence('Ctrl+Meta+F'))
        # # Add standard actions to File Menu (as it won't be ever cleared) and
        # # Mac menubar should move them to "Application" menu
        # self._menuFile.addAction(self._actions['Standard/About'])
        # self._menuFile.addAction(self._actions['Standard/Preferences'])

        # # Prevent ConfigInfo action to be detected as "Preferences..." action in
        # # Mac
        # self._actions['Help/ConfigInfo'].setMenuRole(QAction.NoRole)

        # # Create Dock Menu
        # dockMenu = QMenu(0)
        # dockMenu.addAction(self._actions['File/NewTab'])
        # dockMenu.addAction(self._actions['File/NewWindow'])
        # dockMenu.addAction(self._actions['File/NewPrivateWindow'])
        # qt_mac_set_dock_menu(dockMenu)
        # # endif

        if const.OS_UNIX and not const.OS_MACOS:
            self._menuEdit.addAction(self._actions['Standard/Preferences'])
        elif not const.OS_MACOS:
            self._menuTools.addAction(self._actions['Standard/Preferences'])

        self._addActionsToWindow()