def make_highlighted_text(text, positions, emph='color:magenta', wrapper=None): positions = sorted(set(positions) - {-1}) if positions: parts = [] pos = 0 for p in positions: ch = text[p] parts.append(escape(text[pos:p])) parts.append('<span style="%s">%s</span>' % (emph, escape(ch))) pos = p + len(ch) parts.append(escape(text[pos:])) text = ''.join(parts) if wrapper: text = '<span style="%s">%s</span>' % (wrapper, text) ans = QStaticText(text) to = ans.textOption() to.setWrapMode(to.NoWrap) ans.setTextOption(to) ans.setTextFormat(Qt.RichText) return ans
def make_highlighted_text(text, positions, emph='color:magenta', wrapper=None): positions = sorted(set(positions) - {-1}) if positions: parts = [] pos = 0 for p in positions: ch = text[p] parts.append(escape(text[pos:p])) parts.append('<span style="%s">%s</span>' % (emph, escape(ch))) pos = p + len(ch) parts.append(escape(text[pos:])) text = ''.join(parts) if wrapper: text = '<span style="%s">%s</span>' % (wrapper, text) ans = QStaticText(text) to = ans.textOption() to.setWrapMode(to.NoWrap) ans.setTextOption(to) ans.setTextFormat(Qt.RichText) return ans
def make_text(self, text, positions): text = QStaticText(make_highlighted_text(self.EMPH, text, positions)) text.setTextOption(self.text_option) text.setTextFormat(Qt.RichText) return text
def make_text(self, text, positions): text = QStaticText( make_highlighted_text(emphasis_style(), text, positions)) text.setTextOption(self.text_option) text.setTextFormat(Qt.TextFormat.RichText) return text
class Message(QWidget): def __init__(self, parent, sb_background): QWidget.__init__(self, parent) self.is_permanent = False self.is_address = False self.is_secure = False self.static_text = None self.current_key = None self.setFocusPolicy(Qt.NoFocus) self.sb_background = QColor( color(sb_background, self.palette().color(QPalette.Window))) def set_message(self, text, color_, bold=False, is_permanent=False): from vise.view import certificate_error_domains key = (text, color_.name(), bold, is_permanent) if key == self.current_key: return self.current_key = key self.is_permanent = is_permanent prefix = text.partition(':')[0] self.is_address = self.is_permanent and prefix.lower() in { 'http', 'https', 'vise', 'file' } self.is_secure = prefix.lower() in {'https', 'vise', 'file'} color_ = color_ or self.palette().color(self.palette().WindowText) if self.is_address: qurl = QUrl(text) if self.is_secure and qurl.host() in certificate_error_domains: self.is_secure = False if qurl.scheme() in {'vise', 'file'}: host = qurl.path() rest = '' sep = ':' else: host = qurl.host() rest = qurl.toDisplayString(QUrl.PrettyDecoded | QUrl.RemoveScheme | QUrl.RemoveAuthority) sep = '://' self.static_text = QStaticText( '<span style="white-space:nowrap; color: {fg}">' '<span style="color:{emph}; font-weight:bold">{scheme}</span><span style="color:{dull}">{sep}</span>' '<span style="color:{fg}">{host}</span>' '<span style="color:{dull}">{rest}</span>'.format( fg=color_.name(), emph='green' if self.is_secure else 'red', scheme=escape(qurl.scheme()), host=escape(host), dull=color('status bar dull foreground', 'gray'), sep=sep, rest=escape(rest))) else: self.static_text = QStaticText( '<span style="color:{}; font-weight: {}; white-space:nowrap">{}</span>' .format(color_.name(), ('bold' if bold else 'normal'), escape(text))) to = QTextOption(Qt.AlignLeft | Qt.AlignTop) to.setWrapMode(to.NoWrap) self.static_text.setTextOption(to) self.static_text.prepare(font=self.font()) self.update() def paintEvent(self, ev): if not self.static_text or not self.static_text.text(): return p = QPainter(self) p.setRenderHint(p.TextAntialiasing) # If text is too long too fit, fade it out at the end self.static_text.setTextWidth(self.rect().width()) sz = self.static_text.size() r = self.rect() p.drawStaticText(0, (r.height() - sz.height()) // 2, self.static_text) if sz.width() > r.width(): g = QLinearGradient(self.rect().topLeft(), self.rect().topRight()) c = QColor(self.sb_background) c.setAlpha(0) g.setColorAt(0, c) g.setColorAt(0.8, c) g.setColorAt(1.0, self.sb_background) p.fillRect(self.rect(), QBrush(g)) p.end()
class Message(QWidget): def __init__(self, parent, sb_background): QWidget.__init__(self, parent) self.is_permanent = False self.is_address = False self.is_secure = False self.static_text = None self.current_key = None self.setFocusPolicy(Qt.NoFocus) self.sb_background = QColor(color(sb_background, self.palette().color(QPalette.Window))) def set_message(self, text, color_, bold=False, is_permanent=False): from vise.view import certificate_error_domains key = (text, color_.name(), bold, is_permanent) if key == self.current_key: return self.current_key = key self.is_permanent = is_permanent prefix = text.partition(':')[0] self.is_address = self.is_permanent and prefix.lower() in {'http', 'https', 'vise'} self.is_secure = prefix.lower() in {'https', 'vise'} color_ = color_ or self.palette().color(self.palette().WindowText) if self.is_address: qurl = QUrl(text) if self.is_secure and qurl.host() in certificate_error_domains: self.is_secure = False if qurl.scheme() == 'vise': host = qurl.path() rest = '' sep = ':' else: host = qurl.host() rest = qurl.toDisplayString(QUrl.PrettyDecoded | QUrl.RemoveScheme | QUrl.RemoveAuthority) sep = '://' self.static_text = QStaticText( '<span style="white-space:nowrap; color: {fg}">' '<span style="color:{emph}; font-weight:bold">{scheme}</span><span style="color:{dull}">{sep}</span>' '<span style="color:{fg}">{host}</span>' '<span style="color:{dull}">{rest}</span>'.format( fg=color_.name(), emph='green' if self.is_secure else 'red', scheme=escape(qurl.scheme()), host=escape(host), dull=color('status bar dull foreground', 'gray'), sep=sep, rest=escape(rest) )) else: self.static_text = QStaticText('<span style="color:{}; font-weight: {}; white-space:nowrap">{}</span>'.format( color_.name(), ('bold' if bold else 'normal'), escape(text))) to = QTextOption(Qt.AlignLeft | Qt.AlignTop) to.setWrapMode(to.NoWrap) self.static_text.setTextOption(to) self.static_text.prepare(font=self.font()) self.update() def paintEvent(self, ev): if not self.static_text or not self.static_text.text(): return p = QPainter(self) p.setRenderHint(p.TextAntialiasing) # If text is too long too fit, fade it out at the end self.static_text.setTextWidth(self.rect().width()) sz = self.static_text.size() r = self.rect() p.drawStaticText(0, (r.height() - sz.height()) // 2, self.static_text) if sz.width() > r.width(): g = QLinearGradient(self.rect().topLeft(), self.rect().topRight()) c = QColor(self.sb_background) c.setAlpha(0) g.setColorAt(0, c) g.setColorAt(0.8, c) g.setColorAt(1.0, self.sb_background) p.fillRect(self.rect(), QBrush(g)) p.end()