about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-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()