summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortoonn <toonn@toonn.io>2020-11-18 18:53:14 +0100
committertoonn <toonn@toonn.io>2020-11-18 18:53:14 +0100
commitdaac0c0981e6b1fc69ed7fe2ef0cc6a26fbd5129 (patch)
tree9c94cd740e315a1ba597d6f44b16afe5e0912931
parenta53f056cb2d9586ed97c7757a1e49d30d873c27d (diff)
parentce1c27e1af12506f79f0120a617d30c99fffc18c (diff)
Merge branch 'zyklotomic-master'
-rw-r--r--doc/ranger.114
-rw-r--r--doc/ranger.pod10
-rw-r--r--ranger/container/settings.py3
-rw-r--r--ranger/gui/widgets/view_multipane.py102
4 files changed, 126 insertions, 3 deletions
diff --git a/doc/ranger.1 b/doc/ranger.1
index 50d6bb0f..f675da91 100644
--- a/doc/ranger.1
+++ b/doc/ranger.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35)
+.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -133,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "RANGER 1"
-.TH RANGER 1 "ranger-1.9.3" "2020-02-22" "ranger manual"
+.TH RANGER 1 "ranger-1.9.3" "2020-11-18" "ranger manual"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -974,6 +974,16 @@ Draw borders around or between the columns? Possible values are:
\& separators draw only vertical lines between columns
\& both both of the above
.Ve
+.IP "draw_borders_multipane [string]" 4
+.IX Item "draw_borders_multipane [string]"
+Draw borders around or between the panes. This setting overrides
+\&\fIdraw_borders\fR specifically for the multipane viewmode in case you want
+different border styles in both viewmodes. There's one additional legal value
+on top of those for \fIdraw_borders\fR:
+.Sp
+.Vb 1
+\& active\-pane draw an outline around the active pane only
+.Ve
.IP "draw_progress_bar_in_status_bar [bool]" 4
.IX Item "draw_progress_bar_in_status_bar [bool]"
Draw a progress bar in the status bar which displays the average state of all
diff --git a/doc/ranger.pod b/doc/ranger.pod
index 3f41467d..693c6619 100644
--- a/doc/ranger.pod
+++ b/doc/ranger.pod
@@ -1026,6 +1026,16 @@ Draw borders around or between the columns? Possible values are:
separators draw only vertical lines between columns
both both of the above
+=item draw_borders_multipane [string]
+
+Draw borders around or between the panes. This setting overrides
+I<draw_borders> specifically for the multipane viewmode in case you want
+different border styles in both viewmodes. There's one additional legal value
+on top of those for I<draw_borders>:
+
+ active-pane draw an outline around the active pane only
+
+
=item draw_progress_bar_in_status_bar [bool]
Draw a progress bar in the status bar which displays the average state of all
diff --git a/ranger/container/settings.py b/ranger/container/settings.py
index 677ea3b8..e7d6775d 100644
--- a/ranger/container/settings.py
+++ b/ranger/container/settings.py
@@ -40,6 +40,7 @@ ALLOWED_SETTINGS = {
"display_free_space_in_status_bar": bool,
'display_tags_in_all_columns': bool,
'draw_borders': str,
+ 'draw_borders_multipane': str,
'draw_progress_bar_in_status_bar': bool,
'flushinput': bool,
'freeze_files': bool,
@@ -105,6 +106,8 @@ ALLOWED_VALUES = {
'cd_tab_case': ['sensitive', 'insensitive', 'smart'],
'confirm_on_delete': ['multiple', 'always', 'never'],
'draw_borders': ['none', 'both', 'outline', 'separators'],
+ 'draw_borders_multipane': [None, 'none', 'both', 'outline',
+ 'separators', 'active-pane'],
'line_numbers': ['false', 'absolute', 'relative'],
'nested_ranger_warning': ['true', 'false', 'error'],
'one_indexed': [False, True],
diff --git a/ranger/gui/widgets/view_multipane.py b/ranger/gui/widgets/view_multipane.py
index 9661d31e..cef8d9a8 100644
--- a/ranger/gui/widgets/view_multipane.py
+++ b/ranger/gui/widgets/view_multipane.py
@@ -3,6 +3,7 @@
from __future__ import (absolute_import, division, print_function)
+import curses
from ranger.gui.widgets.view_base import ViewBase
from ranger.gui.widgets.browsercolumn import BrowserColumn
@@ -16,6 +17,17 @@ class ViewMultipane(ViewBase): # pylint: disable=too-many-ancestors
self.fm.signal_bind('tab.change', self._tabchange_handler)
self.rebuild()
+ self.old_draw_borders = self._draw_borders_setting()
+
+ def _draw_borders_setting(self):
+ # If draw_borders_multipane has not been set, it defaults to `None`
+ # and we fallback to using draw_borders. Important to note:
+ # `None` is different from the string "none" referring to no borders
+ if self.settings.draw_borders_multipane is not None:
+ return self.settings.draw_borders_multipane
+ else:
+ return self.settings.draw_borders
+
def _layoutchange_handler(self):
if self.fm.ui.browser == self:
self.rebuild()
@@ -43,13 +55,101 @@ class ViewMultipane(ViewBase): # pylint: disable=too-many-ancestors
self.add_child(column)
self.resize(self.y, self.x, self.hei, self.wid)
+ def draw(self):
+ if self.need_clear:
+ self.win.erase()
+ self.need_redraw = True
+ self.need_clear = False
+
+ ViewBase.draw(self)
+
+ if self._draw_borders_setting():
+ draw_borders = self._draw_borders_setting()
+ if draw_borders in ['both', 'true']: # 'true' for backwards compat.
+ border_types = ['separators', 'outline']
+ else:
+ border_types = [draw_borders]
+ self._draw_borders(border_types)
+ if self.draw_bookmarks:
+ self._draw_bookmarks()
+ elif self.draw_hints:
+ self._draw_hints()
+ elif self.draw_info:
+ self._draw_info(self.draw_info)
+
+ def _draw_border_rectangle(self, left_start, right_end):
+ win = self.win
+ win.hline(0, left_start, curses.ACS_HLINE, right_end - left_start)
+ win.hline(self.hei - 1, left_start, curses.ACS_HLINE, right_end - left_start)
+ win.vline(1, left_start, curses.ACS_VLINE, self.hei - 2)
+ win.vline(1, right_end, curses.ACS_VLINE, self.hei - 2)
+ # Draw the four corners
+ self.addch(0, left_start, curses.ACS_ULCORNER)
+ self.addch(self.hei - 1, left_start, curses.ACS_LLCORNER)
+ self.addch(0, right_end, curses.ACS_URCORNER)
+ self.addch(self.hei - 1, right_end, curses.ACS_LRCORNER)
+
+ def _draw_borders(self, border_types):
+ # Referenced from ranger.gui.widgets.view_miller
+ win = self.win
+ self.color('in_browser', 'border')
+
+ left_start = 0
+ right_end = self.wid - 1
+
+ # Draw the outline borders
+ if 'active-pane' not in border_types:
+ if 'outline' in border_types:
+ try:
+ self._draw_border_rectangle(left_start, right_end)
+ except curses.error:
+ pass
+
+ # Draw the column separators
+ if 'separators' in border_types:
+ for child in self.columns[:-1]:
+ x = child.x + child.wid
+ y = self.hei - 1
+ try:
+ win.vline(1, x, curses.ACS_VLINE, y - 1)
+ if 'outline' in border_types:
+ self.addch(0, x, curses.ACS_TTEE, 0)
+ self.addch(y, x, curses.ACS_BTEE, 0)
+ else:
+ self.addch(0, x, curses.ACS_VLINE, 0)
+ self.addch(y, x, curses.ACS_VLINE, 0)
+ except curses.error:
+ pass
+ else:
+ bordered_column = self.main_column
+ left_start = max(bordered_column.x, 0)
+ right_end = min(left_start + bordered_column.wid, self.wid - 1)
+ try:
+ self._draw_border_rectangle(left_start, right_end)
+ except curses.error:
+ pass
+
def resize(self, y, x, hei=None, wid=None):
ViewBase.resize(self, y, x, hei, wid)
+
+ border_type = self._draw_borders_setting()
+ if border_type in ['outline', 'both', 'true', 'active-pane']:
+ # 'true' for backwards compat., no height pad needed for 'separators'
+ pad = 1
+ else:
+ pad = 0
column_width = int((wid - len(self.columns) + 1) / len(self.columns))
left = 0
top = 0
for column in self.columns:
- column.resize(top, left, hei, max(1, column_width))
+ column.resize(top + pad, left, hei - pad * 2, max(1, column_width))
left += column_width + 1
column.need_redraw = True
self.need_redraw = True
+
+ def poke(self):
+ ViewBase.poke(self)
+
+ if self.old_draw_borders != self._draw_borders_setting():
+ self.resize(self.y, self.x, self.hei, self.wid)
+ self.old_draw_borders = self._draw_borders_setting()