예제 #1
0
 def __init__(self, level, text, replace, parent=None):
     super().__init__(text, parent)
     self.replace = replace
     self.setAttribute(Qt.WA_StyledBackground, True)
     qss = """
         padding-top: 2px;
         padding-bottom: 2px;
     """
     if level == usertypes.MessageLevel.error:
         qss += """
             background-color: {{ conf.colors.messages.error.bg }};
             color: {{ conf.colors.messages.error.fg }};
             font: {{ conf.fonts.messages.error }};
             border-bottom: 1px solid {{ conf.colors.messages.error.border }};
         """
     elif level == usertypes.MessageLevel.warning:
         qss += """
             background-color: {{ conf.colors.messages.warning.bg }};
             color: {{ conf.colors.messages.warning.fg }};
             font: {{ conf.fonts.messages.warning }};
             border-bottom:
                 1px solid {{ conf.colors.messages.warning.border }};
         """
     elif level == usertypes.MessageLevel.info:
         qss += """
             background-color: {{ conf.colors.messages.info.bg }};
             color: {{ conf.colors.messages.info.fg }};
             font: {{ conf.fonts.messages.info }};
             border-bottom: 1px solid {{ conf.colors.messages.info.border }}
         """
     else:  # pragma: no cover
         raise ValueError("Invalid level {!r}".format(level))
     # We don't bother with set_register_stylesheet here as it's short-lived
     # anyways.
     stylesheet.set_register(self, qss, update=False)
예제 #2
0
    def __init__(self, *, win_id, tab_id, tab, private, parent=None):
        super().__init__(parent)
        if utils.is_mac:
            # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-42948
            # See https://github.com/qutebrowser/qutebrowser/issues/462
            self.setStyle(QStyleFactory.create('Fusion'))
        # FIXME:qtwebengine this is only used to set the zoom factor from
        # the QWebPage - we should get rid of it somehow (signals?)
        self.tab = tab
        self._tabdata = tab.data
        self.win_id = win_id
        self.scroll_pos = (-1, -1)
        self._old_scroll_pos = (-1, -1)
        self._tab_id = tab_id

        page = webpage.BrowserPage(win_id=self.win_id,
                                   tab_id=self._tab_id,
                                   tabdata=tab.data,
                                   private=private,
                                   parent=self)
        page.setVisibilityState(
            QWebPage.VisibilityStateVisible if self.isVisible(
            ) else QWebPage.VisibilityStateHidden)

        self.setPage(page)

        stylesheet.set_register(self)
예제 #3
0
 def __init__(self, parent=None):
     super().__init__(parent)
     if not hasattr(sys, 'ps1'):
         sys.ps1 = '>>> '
     if not hasattr(sys, 'ps2'):
         sys.ps2 = '... '
     namespace = {
         '__name__': '__console__',
         '__doc__': None,
         'q_app': QApplication.instance(),
         # We use parent as self here because the user "feels" the whole
         # console, not just the line edit.
         'self': parent,
         'objreg': objreg,
     }
     self._more = False
     self._buffer = []  # type: typing.MutableSequence[str]
     self._lineedit = ConsoleLineEdit(namespace, self)
     self._lineedit.execute.connect(self.push)
     self._output = ConsoleTextEdit()
     self.write(self._curprompt())
     self._vbox = QVBoxLayout()
     self._vbox.setSpacing(0)
     self._vbox.addWidget(self._output)
     self._vbox.addWidget(self._lineedit)
     stylesheet.set_register(self)
     self.setLayout(self._vbox)
     self._lineedit.setFocus()
     self._interpreter = code.InteractiveInterpreter(namespace)
예제 #4
0
def test_set_register_stylesheet(delete, stylesheet_param, update, qtbot,
                                 config_stub, caplog):
    config_stub.val.colors.hints.fg = 'magenta'
    qss = "{{ conf.colors.hints.fg }}"

    with caplog.at_level(9):  # VDEBUG
        if stylesheet_param:
            obj = StyleObj()
            stylesheet.set_register(obj, qss, update=update)
        else:
            obj = StyleObj(qss)
            stylesheet.set_register(obj, update=update)

    assert caplog.messages[-1] == 'stylesheet for StyleObj: magenta'

    assert obj.rendered_stylesheet == 'magenta'

    if delete:
        with qtbot.waitSignal(obj.destroyed):
            obj.deleteLater()

    config_stub.val.colors.hints.fg = 'yellow'

    expected = 'magenta' if delete or not update else 'yellow'
    assert obj.rendered_stylesheet == expected
예제 #5
0
 def __init__(self, parent=None):
     super().__init__(parent)
     stylesheet.set_register(self)
     self.enabled = False
     self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
     self.setTextVisible(False)
     self.hide()
예제 #6
0
    def __init__(self,
                 *,
                 cmd: 'command.Command',
                 win_id: int,
                 parent: QWidget = None) -> None:
        super().__init__(parent)
        self.pattern = None  # type: typing.Optional[str]
        self._win_id = win_id
        self._cmd = cmd
        self._active = False

        config.instance.changed.connect(self._on_config_changed)

        self._delegate = completiondelegate.CompletionItemDelegate(self)
        self.setItemDelegate(self._delegate)
        self.setStyle(QStyleFactory.create('Fusion'))
        stylesheet.set_register(self)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        self.setHeaderHidden(True)
        self.setAlternatingRowColors(True)
        self.setIndentation(0)
        self.setItemsExpandable(False)
        self.setExpandsOnDoubleClick(False)
        self.setAnimated(False)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        # WORKAROUND
        # This is a workaround for weird race conditions with invalid
        # item indexes leading to segfaults in Qt.
        #
        # Some background: http://bugs.quassel-irc.org/issues/663
        # The proposed fix there was later reverted because it didn't help.
        self.setUniformRowHeights(True)
        self.hide()
예제 #7
0
 def __init__(self, win_id, parent=None):
     super().__init__(parent)
     self._win_id = win_id
     self.setStyle(TabBarStyle())
     self.vertical = False
     self._auto_hide_timer = QTimer()
     self._auto_hide_timer.setSingleShot(True)
     self._auto_hide_timer.timeout.connect(self.maybe_hide)
     self._on_show_switching_delay_changed()
     self.setAutoFillBackground(True)
     # FIXME:mypy Is it a mypy bug that we need to specify bool here?
     # Otherwise, we get "Cannot determine type of "drag_in_progress" in
     # TabWidget._toggle_visibility below.
     self.drag_in_progress: bool = False
     stylesheet.set_register(self)
     self.ensurePolished()
     config.instance.changed.connect(self._on_config_changed)
     self._set_icon_size()
     QTimer.singleShot(0, self.maybe_hide)
     self._minimum_tab_size_hint_helper = functools.lru_cache(maxsize=2**9)(
         self._minimum_tab_size_hint_helper_uncached
     )
     debugcachestats.register(name=f'tab width cache (win_id={win_id})')(
         self._minimum_tab_size_hint_helper
     )
     self._minimum_tab_height = functools.lru_cache(maxsize=1)(
         self._minimum_tab_height_uncached
     )
예제 #8
0
 def __init__(self, parent=None):
     super().__init__(parent)
     self._urltype = None
     self.setObjectName(self.__class__.__name__)
     stylesheet.set_register(self)
     self._hover_url = None
     self._normal_url = None
     self._normal_url_type = UrlType.normal
예제 #9
0
 def __init__(self, win_id, parent=None):
     super().__init__(parent)
     self.setTextFormat(Qt.RichText)
     self._win_id = win_id
     self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)
     self.hide()
     self._show_timer = usertypes.Timer(self, 'keyhint_show')
     self._show_timer.timeout.connect(self.show)
     self._show_timer.setSingleShot(True)
     stylesheet.set_register(self)
예제 #10
0
 def on_caret_selection_toggled(self, selection):
     """Update the statusbar when entering/leaving caret selection mode."""
     log.statusbar.debug("Setting caret selection {}".format(selection))
     if selection:
         self._set_mode_text("caret selection")
         self._color_flags.caret = ColorFlags.CaretMode.selection
     else:
         self._set_mode_text("caret")
         self._color_flags.caret = ColorFlags.CaretMode.on
     stylesheet.set_register(self, update=False)
예제 #11
0
    def __init__(self, win_id, parent=None):
        super().__init__(parent)
        self._layout = QVBoxLayout(self)
        self._layout.setContentsMargins(10, 10, 10, 10)
        self._win_id = win_id
        self._prompt: Optional[_BasePrompt] = None

        self.setObjectName('PromptContainer')
        self.setAttribute(Qt.WA_StyledBackground, True)
        stylesheet.set_register(self)

        message.global_bridge.prompt_done.connect(self._on_prompt_done)
        prompt_queue.show_prompts.connect(self._on_show_prompts)
        message.global_bridge.mode_left.connect(self._on_global_mode_left)
예제 #12
0
 def __init__(self, win_id, parent=None):
     super().__init__(parent)
     self._win_id = win_id
     self.setStyle(TabBarStyle())
     self._set_font()
     config.instance.changed.connect(self._on_config_changed)
     self.vertical = False
     self._auto_hide_timer = QTimer()
     self._auto_hide_timer.setSingleShot(True)
     self._auto_hide_timer.timeout.connect(self.maybe_hide)
     self._on_show_switching_delay_changed()
     self.setAutoFillBackground(True)
     self.drag_in_progress = False
     stylesheet.set_register(self)
     QTimer.singleShot(0, self.maybe_hide)
예제 #13
0
    def __init__(self, *, win_id, private, parent=None):
        super().__init__(parent)
        self.setObjectName(self.__class__.__name__)
        self.setAttribute(Qt.WA_StyledBackground)
        stylesheet.set_register(self)

        self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)

        self._win_id = win_id
        self._color_flags = ColorFlags()
        self._color_flags.private = private

        self._hbox = QHBoxLayout(self)
        self._set_hbox_padding()
        self._hbox.setSpacing(5)

        self._stack = QStackedLayout()
        self._hbox.addLayout(self._stack)
        self._stack.setContentsMargins(0, 0, 0, 0)

        self.cmd = command.Command(private=private, win_id=win_id)
        self._stack.addWidget(self.cmd)
        objreg.register('status-command',
                        self.cmd,
                        scope='window',
                        window=win_id)

        self.txt = textbase.TextBase()
        self._stack.addWidget(self.txt)

        self.cmd.show_cmd.connect(self._show_cmd_widget)
        self.cmd.hide_cmd.connect(self._hide_cmd_widget)
        self._hide_cmd_widget()

        self.url = url.UrlText()
        self.percentage = percentage.Percentage()
        self.backforward = backforward.Backforward()
        self.tabindex = tabindex.TabIndex()
        self.keystring = keystring.KeyString()
        self.prog = progress.Progress(self)
        self.clock = clock.Clock()
        self._text_widgets = []
        self._draw_widgets()

        config.instance.changed.connect(self._on_config_changed)
        QTimer.singleShot(0, self.maybe_hide)
예제 #14
0
 def __init__(
     self,
     level: usertypes.MessageLevel,
     text: str,
     replace: Optional[str],
     text_format: Qt.TextFormat,
     parent: QWidget = None,
 ) -> None:
     super().__init__(text, parent)
     self.replace = replace
     self.level = level
     self.setAttribute(Qt.WA_StyledBackground, True)
     self.setWordWrap(True)
     self.setTextFormat(text_format)
     qss = """
         padding-top: 2px;
         padding-bottom: 2px;
     """
     if level == usertypes.MessageLevel.error:
         qss += """
             background-color: {{ conf.colors.messages.error.bg }};
             color: {{ conf.colors.messages.error.fg }};
             font: {{ conf.fonts.messages.error }};
             border-bottom: 1px solid {{ conf.colors.messages.error.border }};
         """
     elif level == usertypes.MessageLevel.warning:
         qss += """
             background-color: {{ conf.colors.messages.warning.bg }};
             color: {{ conf.colors.messages.warning.fg }};
             font: {{ conf.fonts.messages.warning }};
             border-bottom:
                 1px solid {{ conf.colors.messages.warning.border }};
         """
     elif level == usertypes.MessageLevel.info:
         qss += """
             background-color: {{ conf.colors.messages.info.bg }};
             color: {{ conf.colors.messages.info.fg }};
             font: {{ conf.fonts.messages.info }};
             border-bottom: 1px solid {{ conf.colors.messages.info.border }}
         """
     else:  # pragma: no cover
         raise ValueError("Invalid level {!r}".format(level))
     stylesheet.set_register(self, qss, update=False)
예제 #15
0
 def __init__(self, model, parent=None):
     super().__init__(parent)
     if not utils.is_mac:
         self.setStyle(QStyleFactory.create('Fusion'))
     stylesheet.set_register(self)
     self.setResizeMode(QListView.Adjust)
     self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
     self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed)
     self.setFocusPolicy(Qt.NoFocus)
     self.setFlow(QListView.LeftToRight)
     self.setSpacing(1)
     self._menu = None
     model.rowsInserted.connect(functools.partial(update_geometry, self))
     model.rowsRemoved.connect(functools.partial(update_geometry, self))
     model.dataChanged.connect(functools.partial(update_geometry, self))
     self.setModel(model)
     self.setWrapping(True)
     self.setContextMenuPolicy(Qt.CustomContextMenu)
     self.customContextMenuRequested.connect(self.show_context_menu)
     self.clicked.connect(self.on_clicked)
예제 #16
0
 def __init__(self, win_id, parent=None):
     super().__init__(parent)
     self._win_id = win_id
     self.setStyle(TabBarStyle())
     self.vertical = False
     self._auto_hide_timer = QTimer()
     self._auto_hide_timer.setSingleShot(True)
     self._auto_hide_timer.timeout.connect(self.maybe_hide)
     self._on_show_switching_delay_changed()
     self.setAutoFillBackground(True)
     self.drag_in_progress = False
     stylesheet.set_register(self)
     self.ensurePolished()
     config.instance.changed.connect(self._on_config_changed)
     self._set_icon_size()
     QTimer.singleShot(0, self.maybe_hide)
     self._minimum_tab_size_hint_helper = functools.lru_cache(maxsize=2**9)(
         self._minimum_tab_size_hint_helper_uncached)
     debugcachestats.register(name=f'tab width cache (win_id={win_id})')(
         self._minimum_tab_size_hint_helper)
     self._minimum_tab_height = functools.lru_cache(maxsize=1)(
         self._minimum_tab_height_uncached)
예제 #17
0
    def __init__(self, *, win_id, tab_id, tab, private, parent=None):
        super().__init__(parent)
        # FIXME:qtwebengine this is only used to set the zoom factor from
        # the QWebPage - we should get rid of it somehow (signals?)
        self.tab = tab
        self._tabdata = tab.data
        self.win_id = win_id
        self.scroll_pos = (-1, -1)
        self._old_scroll_pos = (-1, -1)
        self._tab_id = tab_id

        page = webpage.BrowserPage(win_id=self.win_id,
                                   tab_id=self._tab_id,
                                   tabdata=tab.data,
                                   private=private,
                                   parent=self)
        page.setVisibilityState(
            QWebPage.VisibilityStateVisible if self.isVisible(
            ) else QWebPage.VisibilityStateHidden)

        self.setPage(page)

        stylesheet.set_register(self)
예제 #18
0
파일: bar.py 프로젝트: ebell451/qutebrowser
    def set_mode_active(self, mode, val):
        """Setter for self.{insert,command,caret}_active.

        Re-set the stylesheet after setting the value, so everything gets
        updated by Qt properly.
        """
        if mode == usertypes.KeyMode.insert:
            log.statusbar.debug("Setting insert flag to {}".format(val))
            self._color_flags.insert = val
        if mode == usertypes.KeyMode.passthrough:
            log.statusbar.debug("Setting passthrough flag to {}".format(val))
            self._color_flags.passthrough = val
        if mode == usertypes.KeyMode.command:
            log.statusbar.debug("Setting command flag to {}".format(val))
            self._color_flags.command = val
        elif mode in [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]:
            log.statusbar.debug("Setting prompt flag to {}".format(val))
            self._color_flags.prompt = val
        elif mode == usertypes.KeyMode.caret:
            if not val:
                # Turning on is handled in on_current_caret_selection_toggled
                log.statusbar.debug("Setting caret mode off")
                self._color_flags.caret = ColorFlags.CaretMode.off
        stylesheet.set_register(self, update=False)
예제 #19
0
    def __init__(self,
                 *,
                 private: bool,
                 geometry: Optional[QByteArray] = None,
                 parent: Optional[QWidget] = None) -> None:
        """Create a new main window.

        Args:
            geometry: The geometry to load, as a bytes-object (or None).
            private: Whether the window is in private browsing mode.
            parent: The parent the window should get.
        """
        super().__init__(parent)
        # Late import to avoid a circular dependency
        # - browsertab -> hints -> webelem -> mainwindow -> bar -> browsertab
        from qutebrowser.mainwindow import tabbedbrowser
        from qutebrowser.mainwindow.statusbar import bar

        self.setAttribute(Qt.WA_DeleteOnClose)
        if config.val.window.transparent:
            self.setAttribute(Qt.WA_TranslucentBackground)
            self.palette().setColor(QPalette.Window, Qt.transparent)

        self._overlays: MutableSequence[_OverlayInfoType] = []
        self.win_id = next(win_id_gen)
        self.registry = objreg.ObjectRegistry()
        objreg.window_registry[self.win_id] = self
        objreg.register('main-window',
                        self,
                        scope='window',
                        window=self.win_id)
        tab_registry = objreg.ObjectRegistry()
        objreg.register('tab-registry',
                        tab_registry,
                        scope='window',
                        window=self.win_id)

        self.setWindowTitle('qutebrowser')
        self._vbox = QVBoxLayout(self)
        self._vbox.setContentsMargins(0, 0, 0, 0)
        self._vbox.setSpacing(0)

        self._init_downloadmanager()
        self._downloadview = downloadview.DownloadView(
            model=self._download_model)

        self.is_private = config.val.content.private_browsing or private

        self.tabbed_browser: tabbedbrowser.TabbedBrowser = tabbedbrowser.TabbedBrowser(
            win_id=self.win_id, private=self.is_private, parent=self)
        objreg.register('tabbed-browser',
                        self.tabbed_browser,
                        scope='window',
                        window=self.win_id)
        self._init_command_dispatcher()

        # We need to set an explicit parent for StatusBar because it does some
        # show/hide magic immediately which would mean it'd show up as a
        # window.
        self.status = bar.StatusBar(win_id=self.win_id,
                                    private=self.is_private,
                                    parent=self)

        self._add_widgets()
        self._downloadview.show()

        self._init_completion()

        log.init.debug("Initializing modes...")
        modeman.init(win_id=self.win_id, parent=self)

        self._commandrunner = runners.CommandRunner(self.win_id,
                                                    partial_match=True)

        self._keyhint = keyhintwidget.KeyHintView(self.win_id, self)
        self._add_overlay(self._keyhint, self._keyhint.update_geometry)

        self._prompt_container = prompt.PromptContainer(self.win_id, self)
        self._add_overlay(self._prompt_container,
                          self._prompt_container.update_geometry,
                          centered=True,
                          padding=10)
        objreg.register('prompt-container',
                        self._prompt_container,
                        scope='window',
                        window=self.win_id,
                        command_only=True)
        self._prompt_container.hide()

        self._messageview = messageview.MessageView(parent=self)
        self._add_overlay(self._messageview, self._messageview.update_geometry)

        self._init_geometry(geometry)
        self._connect_signals()

        # When we're here the statusbar might not even really exist yet, so
        # resizing will fail. Therefore, we use singleShot QTimers to make sure
        # we defer this until everything else is initialized.
        QTimer.singleShot(0, self._connect_overlay_signals)
        config.instance.changed.connect(self._on_config_changed)

        objects.qapp.new_window.emit(self)
        self._set_decoration(config.val.window.hide_decoration)

        self.state_before_fullscreen = self.windowState()
        stylesheet.set_register(self)