diff options
-rw-r--r-- | ranger/gui/widgets/browsercolumn.py | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/ranger/gui/widgets/browsercolumn.py b/ranger/gui/widgets/browsercolumn.py index 3d68f017..0a3dc928 100644 --- a/ranger/gui/widgets/browsercolumn.py +++ b/ranger/gui/widgets/browsercolumn.py @@ -212,7 +212,7 @@ class BrowserColumn(Pager): # pylint: disable=too-many-instance-attributes def _format_line_number(self, linum_format, i, selected_i): line_number = i - if self.settings.line_numbers == 'relative': + if self.settings.line_numbers.lower() == 'relative': line_number = abs(selected_i - i) if not self.settings.relative_current_zero and line_number == 0: if self.settings.one_indexed: @@ -273,12 +273,29 @@ class BrowserColumn(Pager): # pylint: disable=too-many-instance-attributes copied = [f.path for f in self.fm.copy_buffer] + selected_i = self._get_index_of_selected_file() + # Set the size of the linum text field to the number of digits in the # visible files in directory. - linum_text_len = len(str(self.scroll_begin + self.hei)) + def nr_of_digits(number): + return len(str(number)) + + scroll_end = self.scroll_begin + min(self.hei, len(self.target)) - 1 + distance_to_top = selected_i - self.scroll_begin + distance_to_bottom = scroll_end - selected_i + one_indexed_offset = 1 if self.settings.one_indexed else 0 + + if self.settings.line_numbers.lower() == "relative": + linum_text_len = nr_of_digits(max(distance_to_top, + distance_to_bottom)) + if not self.settings.relative_current_zero: + linum_text_len = max(nr_of_digits(selected_i + + one_indexed_offset), + linum_text_len) + else: + linum_text_len = nr_of_digits(scroll_end + one_indexed_offset) linum_format = "{0:>" + str(linum_text_len) + "}" - selected_i = self._get_index_of_selected_file() for line in range(self.hei): i = line + self.scroll_begin @@ -307,12 +324,15 @@ class BrowserColumn(Pager): # pylint: disable=too-many-instance-attributes drawn.path in copied, tagged_marker, drawn.infostring, drawn.vcsstatus, drawn.vcsremotestatus, self.target.has_vcschild, self.fm.do_cut, current_linemode.name, metakey, active_pane, - self.settings.line_numbers) + self.settings.line_numbers.lower(), linum_text_len) # Check if current line has not already computed and cached if key in drawn.display_data: # Recompute line numbers because they can't be reliably cached. - if self.main_column and self.settings.line_numbers != 'false': + if ( + self.main_column + and self.settings.line_numbers.lower() != 'false' + ): line_number_text = self._format_line_number(linum_format, i, selected_i) @@ -337,7 +357,7 @@ class BrowserColumn(Pager): # pylint: disable=too-many-instance-attributes space = self.wid # line number field - if self.settings.line_numbers != 'false': + if self.settings.line_numbers.lower() != 'false': if self.main_column and space - linum_text_len > 2: line_number_text = self._format_line_number(linum_format, i, @@ -371,15 +391,16 @@ class BrowserColumn(Pager): # pylint: disable=too-many-instance-attributes try: infostringdata = current_linemode.infostring(drawn, metadata) if infostringdata: - infostring.append([" " + infostringdata + " ", + infostring.append([" " + infostringdata, ["infostring"]]) except NotImplementedError: infostring = self._draw_infostring_display(drawn, space) if infostring: infostringlen = self._total_len(infostring) if space - infostringlen > 2: - predisplay_right = infostring + predisplay_right - space -= infostringlen + sep = [" ", []] if predisplay_right else [] + predisplay_right = infostring + sep + predisplay_right + space -= infostringlen + len(sep) textstring = self._draw_text_display(text, space) textstringlen = self._total_len(textstring) @@ -445,7 +466,7 @@ class BrowserColumn(Pager): # pylint: disable=too-many-instance-attributes infostring_display = [] if self.display_infostring and drawn.infostring \ and self.settings.display_size_in_main_column: - infostring = str(drawn.infostring) + " " + infostring = str(drawn.infostring) if len(infostring) <= space: infostring_display.append([infostring, ['infostring']]) return infostring_display |