summary refs log blame commit diff stats
path: root/ranger.py
blob: 9703b243c9875c4b10c419bc77bc6159d9a84d15 (plain) (tree)
) def has_preview(self): if self.target is None: return False if self.target.is_file: if not self.target.has_preview(): return False if self.target.is_directory: if self.level > 0 and not self.settings.preview_directories: return False return True def poke(self): Widget.poke(self) self.target = self.fm.thistab.at_level(self.level) def draw(self): """Call either _draw_file() or _draw_directory()""" if self.target != self.old_dir: self.need_redraw = True self.old_dir = self.target if self.target: # don't garbage collect this directory please self.target.use() if self.target and self.target.is_directory \ and (self.level <= 0 or self.settings.preview_directories): if self.target.pointed_obj != self.old_thisfile: self.need_redraw = True self.old_thisfile = self.target.pointed_obj if self.target.load_content_if_outdated() \ or self.target.sort_if_outdated() \ or self.last_redraw_time < self.target.last_update_time: self.need_redraw = True if self.need_redraw: self.win.erase() if self.target is None: pass elif self.target.is_file: Pager.open(self) self._draw_file() elif self.target.is_directory: self._draw_directory() Widget.draw(self) self.need_redraw = False self.last_redraw_time = time() def _draw_file(self): """Draw a preview of the file, if the settings allow it""" self.win.move(0, 0) if not self.target.accessible: self.addnstr("not accessible", self.wid) Pager.close(self) return if self.target is None or not self.target.has_preview(): Pager.close(self) return f = self.target.get_preview_source(self.wid, self.hei) if f is None: Pager.close(self) else: self.set_source(f) Pager.draw(self) def _draw_directory(self): """Draw the contents of a directory""" if self.level > 0 and not self.settings.preview_directories: return base_color = ['in_browser'] self.win.move(0, 0) if not self.target.content_loaded: self.color(tuple(base_color)) self.addnstr("...", self.wid) self.color_reset() return if self.main_column: base_color.append('main_column') if not self.target.accessible: self.color(tuple(base_color + ['error'])) self.addnstr("not accessible", self.wid) self.color_reset() return if self.target.empty(): self.color(tuple(base_color + ['empty'])) self.addnstr("empty", self.wid) self.color_reset() return self._set_scroll_begin() copied = [f.path for f in self.fm.copy_buffer] ellipsis = self.ellipsis[self.settings.unicode_ellipsis] selected_i = self.target.pointer for line in range(self.hei): i = line + self.scroll_begin if line > self.hei: break try: drawn = self.target.files[i] except IndexError: break tagged = self.fm.tags and drawn.realpath in self.fm.tags if tagged: tagged_marker = self.fm.tags.marker(drawn.realpath) else: tagged_marker = " " key = (self.wid, selected_i == i, drawn.marked, self.main_column, drawn.path in copied, tagged_marker, drawn.infostring) if key in drawn.display_data: self.execute_curses_batch(line, drawn.display_data[key]) self.color_reset() continue display_data = [] drawn.display_data[key] = display_data if self.display_infostring and drawn.infostring \ and self.settings.display_size_in_main_column: infostring = str(drawn.infostring) + " " else: infostring = "" this_color = base_color + list(drawn.mimetype_tuple) text = drawn.basename space = self.wid - len(infostring) if self.main_column: space -= 2 elif self.settings.display_tags_in_all_columns: space -= 1 if i == selected_i: this_color.append('selected') if drawn.marked: this_color.append('marked') if self.main_column or self.settings.display_tags_in_all_columns: text = " " + text if tagged: this_color.append('tagged') if drawn.is_directory: this_color.append('directory') else: this_color.append('file') if drawn.stat: mode = drawn.stat.st_mode if mode & stat.S_IXUSR: this_color.append('executable') if stat.S_ISFIFO(mode): this_color.append('fifo') if stat.S_ISSOCK(mode): this_color.append('socket') if drawn.is_device: this_color.append('device') if drawn.path in copied: this_color.append('cut' if self.fm.do_cut else 'copied') if drawn.is_link: this_color.append('link') this_color.append(drawn.exists and 'good' or 'bad') attr = self.settings.colorscheme.get_attr(*this_color) if (self.main_column or self.settings.display_tags_in_all_columns) \ and tagged and self.wid > 2: this_color.append('tag_marker') tag_attr = self.settings.colorscheme.get_attr(*this_color) display_data.append([tagged_marker, tag_attr]) else: text = " " + text wtext = WideString(text) if len(wtext) > space: wtext = wtext[:max(0, space - 1)] + ellipsis text = str(wtext) display_data.append([text, attr]) padding = self.wid - len(wtext) if tagged and (self.main_column or \ self.settings.display_tags_in_all_columns): padding -= 1 if infostring: if len(text) + 1 + len(infostring) > self.wid: pass else: padding -= len(infostring) padding = max(0, padding) infostring = (" " * padding) + infostring display_data.append([infostring, attr]) else: display_data.append([" " * max(0, padding), attr]) self.execute_curses_batch(line, display_data) self.color_reset() def _get_scroll_begin(self): """Determines scroll_begin (the position of the first displayed file)""" offset = self.settings.scroll_offset dirsize = len(self.target) winsize = self.hei halfwinsize = winsize // 2 index = self.target.pointer or 0 original = self.target.scroll_begin projected = index - original upper_limit = winsize - 1 - offset lower_limit = offset if original < 0: return 0 if dirsize < winsize: return 0 if halfwinsize < offset: return min( dirsize - winsize, max( 0, index - halfwinsize )) if original > dirsize - winsize: self.target.scroll_begin = dirsize - winsize return self._get_scroll_begin() if projected < upper_limit and projected > lower_limit: return original if projected > upper_limit: return min( dirsize - winsize, original + (projected - upper_limit)) if projected < upper_limit: return max( 0, original - (lower_limit - projected)) return original def _set_scroll_begin(self): """Updates the scroll_begin value""" self.scroll_begin = self._get_scroll_begin() self.target.scroll_begin = self.scroll_begin def scroll(self, n): """scroll down by n lines""" self.need_redraw = True self.target.move(down=n) self.target.scroll_begin += 3 * n def __str__(self): return self.__class__.__name__ + ' at level ' + str(self.level)