Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add host placeholder to window and tab title formats #1570

Merged
merged 3 commits into from Jun 13, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions README.asciidoc
Expand Up @@ -206,6 +206,7 @@ Contributors, sorted by the number of commits in descending order:
* Jan Verbeek
* Fritz V155 Reichwald
* Franz Fellner
* Daryl Finlay
* zwarag
* xd1le
* oniondreams
Expand Down
2 changes: 2 additions & 0 deletions doc/help/settings.asciidoc
Expand Up @@ -637,6 +637,7 @@ The format to use for the window title. The following placeholders are defined:
* `{title_sep}`: The string ` - ` if a title is set, empty otherwise.
* `{id}`: The internal window ID of this window.
* `{scroll_pos}`: The page scroll position.
* `{host}`: The host of the current web page.

Default: +pass:[{perc}{title}{title_sep}qutebrowser]+

Expand Down Expand Up @@ -1153,6 +1154,7 @@ The format to use for the tab title. The following placeholders are defined:
* `{index}`: The index of this tab.
* `{id}`: The internal tab ID of this tab.
* `{scroll_pos}`: The page scroll position.
* `{host}`: The host of the current web page.

Default: +pass:[{index}: {title}]+

Expand Down
10 changes: 6 additions & 4 deletions qutebrowser/config/configdata.py
Expand Up @@ -330,7 +330,7 @@ def data(readonly=False):
('window-title-format',
SettingValue(typ.FormatString(fields=['perc', 'perc_raw', 'title',
'title_sep', 'id',
'scroll_pos']),
'scroll_pos', 'host']),
'{perc}{title}{title_sep}qutebrowser'),
"The format to use for the window title. The following "
"placeholders are defined:\n\n"
Expand All @@ -340,7 +340,8 @@ def data(readonly=False):
"* `{title_sep}`: The string ` - ` if a title is set, empty "
"otherwise.\n"
"* `{id}`: The internal window ID of this window.\n"
"* `{scroll_pos}`: The page scroll position."),
"* `{scroll_pos}`: The page scroll position.\n"
"* `{host}`: The host of the current web page."),

('hide-mouse-cursor',
SettingValue(typ.Bool(), 'false'),
Expand Down Expand Up @@ -627,7 +628,7 @@ def data(readonly=False):
('title-format',
SettingValue(typ.FormatString(
fields=['perc', 'perc_raw', 'title', 'title_sep', 'index',
'id', 'scroll_pos']), '{index}: {title}'),
'id', 'scroll_pos', 'host']), '{index}: {title}'),
"The format to use for the tab title. The following placeholders "
"are defined:\n\n"
"* `{perc}`: The percentage as a string like `[10%]`.\n"
Expand All @@ -637,7 +638,8 @@ def data(readonly=False):
"otherwise.\n"
"* `{index}`: The index of this tab.\n"
"* `{id}`: The internal tab ID of this tab.\n"
"* `{scroll_pos}`: The page scroll position."),
"* `{scroll_pos}`: The page scroll position.\n"
"* `{host}`: The host of the current web page."),

('title-alignment',
SettingValue(typ.TextAlignment(), 'left'),
Expand Down
30 changes: 3 additions & 27 deletions qutebrowser/mainwindow/tabbedbrowser.py
Expand Up @@ -161,27 +161,9 @@ def update_window_title(self):
# (e.g. last tab removed)
log.webview.debug("Not updating window title because index is -1")
return
tabtitle = self.page_title(idx)
widget = self.widget(idx)

fields = {}
if widget.load_status == webview.LoadStatus.loading:
fields['perc'] = '[{}%] '.format(widget.progress)
else:
fields['perc'] = ''
fields['perc_raw'] = widget.progress
fields['title'] = tabtitle
fields['title_sep'] = ' - ' if tabtitle else ''
fields = self.get_tab_fields(idx)
fields['id'] = self._win_id
y = widget.scroll_pos[1]
if y <= 0:
scroll_pos = 'top'
elif y >= 100:
scroll_pos = 'bot'
else:
scroll_pos = '{:2}%'.format(y)

fields['scroll_pos'] = scroll_pos
fmt = config.get('ui', 'window-title-format')
self.window().setWindowTitle(fmt.format(**fields))

Expand Down Expand Up @@ -231,14 +213,8 @@ def current_url(self):
Return:
The current URL as QUrl.
"""
widget = self.currentWidget()
if widget is None:
url = QUrl()
else:
url = widget.cur_url
# It's possible for url to be invalid, but the caller will handle that.
qtutils.ensure_valid(url)
return url
idx = self.currentIndex()
return super().tab_url(idx)

def shutdown(self):
"""Try to shut down all tabs cleanly."""
Expand Down
48 changes: 38 additions & 10 deletions qutebrowser/mainwindow/tabwidget.py
Expand Up @@ -22,7 +22,7 @@
import collections
import functools

from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QSize, QRect, QTimer
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QSize, QRect, QTimer, QUrl
from PyQt5.QtWidgets import (QTabWidget, QTabBar, QSizePolicy, QCommonStyle,
QStyle, QStylePainter, QStyleOptionTab)
from PyQt5.QtGui import QIcon, QPalette, QColor
Expand Down Expand Up @@ -99,19 +99,34 @@ def page_title(self, idx):

def update_tab_title(self, idx):
"""Update the tab text for the given tab."""
fields = self.get_tab_fields(idx)
fields['title'] = fields['title'].replace('&', '&&')
fields['index'] = idx + 1

fmt = config.get('tabs', 'title-format')
self.tabBar().setTabText(idx, fmt.format(**fields))

def get_tab_fields(self, idx):
"""Get the tab field data."""
widget = self.widget(idx)
page_title = self.page_title(idx).replace('&', '&&')
page_title = self.page_title(idx)

fields = {}
fields['id'] = widget.tab_id
fields['title'] = page_title
fields['title_sep'] = ' - ' if page_title else ''
fields['perc_raw'] = widget.progress

if widget.load_status == webview.LoadStatus.loading:
fields['perc'] = '[{}%] '.format(widget.progress)
else:
fields['perc'] = ''
fields['perc_raw'] = widget.progress
fields['title'] = page_title
fields['index'] = idx + 1
fields['id'] = widget.tab_id
fields['title_sep'] = ' - ' if page_title else ''

try:
fields['host'] = self.tab_url(idx).host()
except qtutils.QtValueError:
fields['host'] = ''

y = widget.scroll_pos[1]
if y <= 0:
scroll_pos = 'top'
Expand All @@ -121,9 +136,7 @@ def update_tab_title(self, idx):
scroll_pos = '{:2}%'.format(y)

fields['scroll_pos'] = scroll_pos

fmt = config.get('tabs', 'title-format')
self.tabBar().setTabText(idx, fmt.format(**fields))
return fields

@config.change_filter('tabs', 'title-format')
def update_tab_titles(self):
Expand Down Expand Up @@ -205,6 +218,21 @@ def emit_tab_index_changed(self, index):
self.tabBar().on_change()
self.tab_index_changed.emit(index, self.count())

def tab_url(self, idx):
"""Get the URL of the tab at the given index.

Return:
The tab URL as QUrl.
"""
widget = self.widget(idx)
if widget is None:
url = QUrl()
else:
url = widget.cur_url
# It's possible for url to be invalid, but the caller will handle that.
qtutils.ensure_valid(url)
return url


class TabBar(QTabBar):

Expand Down
7 changes: 5 additions & 2 deletions tests/helpers/stubs.py
Expand Up @@ -134,10 +134,12 @@ def __init__(self, style=None, all_widgets=None, active_window=None):

class FakeUrl:

"""QUrl stub which provides .path()."""
"""QUrl stub which provides .path(), isValid() and host()."""

def __init__(self, path=None):
def __init__(self, path=None, valid=True, host=None):
self.path = mock.Mock(return_value=path)
self.isValid = mock.Mock(returl_value=valid)
self.host = mock.Mock(returl_value=host)


class FakeNetworkReply:
Expand Down Expand Up @@ -222,6 +224,7 @@ def __init__(self):
self.scroll_pos = (-1, -1)
self.load_status = webview.LoadStatus.none
self.tab_id = 0
self.cur_url = FakeUrl()


class FakeSignal:
Expand Down