def register_translation(domain, localedir=None): """Register a translation domain Args: domain (str): the gettext domain localedir (pathlike): A directory used for translations, if it doesn't exist the system one will be used. Returns: GlibTranslations """ global _debug_text, _translations, _initialized assert _initialized if localedir is not None and os.path.isdir(localedir): print_d("Using local localedir: %r" % unexpand(localedir)) gettext.bindtextdomain(domain, localedir) localedir = gettext.bindtextdomain(domain) try: t = gettext.translation(domain, localedir, class_=GlibTranslations) except IOError: print_d("No translation found in %r" % unexpand(localedir)) t = GlibTranslations() else: print_d("Translations loaded: %r" % unexpand(t.path)) t.set_debug_text(_debug_text) _translations[domain] = t return t
def register_translation(domain, localedir=None): """Register a translation domain Args: domain (str): the gettext domain localedir (pathlike): A directory used for translations, if None the system one will be used. Returns: GlibTranslations """ global _debug_text, _translations, _initialized assert _initialized if localedir is None: iterdirs = iter_locale_dirs else: iterdirs = lambda: iter([localedir]) for dir_ in iterdirs(): try: t = gettext.translation(domain, dir_, class_=GlibTranslations) except OSError: continue else: print_d("Translations loaded: %r" % unexpand(t.path)) break else: print_d("No translation found for the domain %r" % domain) t = GlibTranslations() t.set_debug_text(_debug_text) _translations[domain] = t return t
class Tunexpand(TestCase): d = expanduser("~") u = unexpand(d) def test_base(self): path = unexpand(self.d) if is_win: self.failUnlessEqual(path, "%USERPROFILE%") else: self.failUnlessEqual(path, "~") def test_only_profile_case(self): assert isinstance(unexpand(expanduser(fsnative(u"~"))), fsnative) def test_base_trailing(self): path = unexpand(self.d + os.path.sep) self.failUnlessEqual(path, self.u + os.path.sep) def test_noprefix(self): path = unexpand(self.d + "foobar" + os.path.sep) self.failUnlessEqual(path, self.d + "foobar" + os.path.sep) def test_subfile(self): path = unexpand(os.path.join(self.d, "la", "la")) self.failUnlessEqual(path, os.path.join(self.u, "la", "la"))
def scan(self, paths, exclude=[], cofuncid=None): def need_yield(last_yield=[0]): current = time.time() if abs(current - last_yield[0]) > 0.015: last_yield[0] = current return True return False def need_added(last_added=[0]): current = time.time() if abs(current - last_added[0]) > 1.0: last_added[0] = current return True return False # first scan each path for new files paths_to_load = [] for scan_path in paths: print_d("Scanning %r." % scan_path) desc = _("Scanning %s") % (fsn2text(unexpand(scan_path))) with Task(_("Library"), desc) as task: if cofuncid: task.copool(cofuncid) for real_path in iter_paths(scan_path, exclude=exclude): if need_yield(): task.pulse() yield # skip unknown file extensions if not formats.filter(real_path): continue # already loaded if self.contains_filename(real_path): continue paths_to_load.append(real_path) yield # then (try to) load all new files with Task(_("Library"), _("Loading files")) as task: if cofuncid: task.copool(cofuncid) added = [] for real_path in task.gen(paths_to_load): item = self.add_filename(real_path, False) if item is not None: added.append(item) if len(added) > 100 or need_added(): self.add(added) added = [] yield if added and need_yield(): yield if added: self.add(added) added = [] yield True
def cdf(column, cell, model, iter, data): row = model[iter] filename = fsn2text(unexpand(row[0])) function = row[1] line = row[2] cell.set_property( "markup", "<b>%s</b> line %d\n\t%s" % (util.escape(function), line, util.escape(filename)))
def test_get_scan_dirs(self): some_path = os.path.join(get_home_dir(), "foo") if os.name != "nt": some_path = unexpand(some_path) config.set('settings', 'scan', some_path) assert expanduser(some_path) in get_scan_dirs() assert all([isinstance(p, fsnative) for p in get_scan_dirs()])
def test_get_exclude_dirs(self): some_path = os.path.join(get_home_dir(), "foo") if os.name != "nt": some_path = unexpand(some_path) config.set('library', 'exclude', some_path) assert expanduser(some_path) in get_exclude_dirs() assert all([isinstance(p, fsnative) for p in get_exclude_dirs()])
def cdf(column, cell, model, iter, data): row = model[iter] filename = fsn2text(unexpand(row[0])) function = row[1] line = row[2] cell.set_property( "markup", "<b>%s</b> line %d\n\t%s" % ( util.escape(function), line, util.escape(filename)))
def _gettext_init(): """Call before using gettext helpers""" # set by tests if "QUODLIBET_NO_TRANS" in os.environ: return try: locale.setlocale(locale.LC_ALL, '') except locale.Error: pass if os.name == "nt": import ctypes k32 = ctypes.windll.kernel32 langs = filter(None, map(locale.windows_locale.get, [k32.GetUserDefaultUILanguage(), k32.GetSystemDefaultUILanguage()])) os.environ.setdefault('LANG', ":".join(langs)) # Use the locale dir in ../build/share/locale if there is one localedir = os.path.dirname(quodlibet.const.BASEDIR) localedir = os.path.join(localedir, "build", "share", "locale") if not os.path.isdir(localedir) and os.name == "nt": # py2exe case localedir = os.path.join( quodlibet.const.BASEDIR, "..", "..", "share", "locale") if os.path.isdir(localedir): print_d("Using local localedir: %r" % unexpand(localedir)) else: localedir = gettext.bindtextdomain("quodlibet") try: t = gettext.translation("quodlibet", localedir, class_=GlibTranslations) except IOError: print_d("No translation found in %r" % unexpand(localedir)) t = GlibTranslations() else: print_d("Translations loaded: %r" % unexpand(t.path)) debug_text = os.environ.get("QUODLIBET_TEST_TRANS") t.install(unicode=True, debug_text=debug_text)
def _gettext_init(): """Call before using gettext helpers""" # set by tests if "QUODLIBET_NO_TRANS" in environ: return set_i18n_envvars() fixup_i18n_envvars() print_d("LANGUAGE: %r" % environ.get("LANGUAGE")) print_d("LANG: %r" % environ.get("LANG")) try: locale.setlocale(locale.LC_ALL, '') except locale.Error: pass # Use the locale dir in ../build/share/locale if there is one base_dir = get_base_dir() localedir = os.path.dirname(base_dir) localedir = os.path.join(localedir, "build", "share", "locale") if not os.path.isdir(localedir) and os.name == "nt": # py2exe case localedir = os.path.join( base_dir, "..", "..", "share", "locale") if os.path.isdir(localedir): print_d("Using local localedir: %r" % unexpand(localedir)) else: localedir = gettext.bindtextdomain("quodlibet") try: t = gettext.translation("quodlibet", localedir, class_=GlibTranslations) except IOError: print_d("No translation found in %r" % unexpand(localedir)) t = GlibTranslations() else: print_d("Translations loaded: %r" % unexpand(t.path)) debug_text = environ.get("QUODLIBET_TEST_TRANS") t.install(unicode=True, debug_text=debug_text)
def label_path(path): l = Gtk.Label(label="<a href='%s'>%s</a>" % ( fsn2uri(path), escape(fsn2text(unexpand(path)))), use_markup=True, ellipsize=Pango.EllipsizeMode.MIDDLE, xalign=0, selectable=True) l.connect("activate-link", show_uri) return l
def _gettext_init(): try: locale.setlocale(locale.LC_ALL, '') except locale.Error: pass if os.name == "nt": import ctypes k32 = ctypes.windll.kernel32 langs = filter( None, map(locale.windows_locale.get, [ k32.GetUserDefaultUILanguage(), k32.GetSystemDefaultUILanguage() ])) os.environ.setdefault('LANG', ":".join(langs)) # Use the locale dir in ../build/share/locale if there is one localedir = os.path.dirname(quodlibet.const.BASEDIR) localedir = os.path.join(localedir, "build", "share", "locale") if not os.path.isdir(localedir) and os.name == "nt": # py2exe case localedir = os.path.join(quodlibet.const.BASEDIR, "..", "..", "share", "locale") unexpand = quodlibet.util.path.unexpand if os.path.isdir(localedir): print_d("Using local localedir: %r" % unexpand(localedir)) else: localedir = gettext.bindtextdomain("quodlibet") try: t = gettext.translation("quodlibet", localedir, class_=GlibTranslations) except IOError: print_d("No translation found in %r" % unexpand(localedir)) t = GlibTranslations() else: print_d("Translations loaded: %r" % unexpand(t.path)) t.install(unicode=True)
def scan(self, paths, exclude=[], cofuncid=None): added = [] exclude = [expanduser(path) for path in exclude if path] def need_yield(last_yield=[0]): current = time.time() if abs(current - last_yield[0]) > 0.015: last_yield[0] = current return True return False def need_added(last_added=[0]): current = time.time() if abs(current - last_added[0]) > 1.0: last_added[0] = current return True return False for fullpath in paths: print_d("Scanning %r." % fullpath, self) desc = _("Scanning %s") % (unexpand(fsdecode(fullpath))) with Task(_("Library"), desc) as task: if cofuncid: task.copool(cofuncid) fullpath = expanduser(fullpath) if filter(fullpath.startswith, exclude): continue for path, dnames, fnames in os.walk(fullpath): for filename in fnames: fullfilename = os.path.join(path, filename) if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: fullfilename = os.path.realpath(fullfilename) # skip unknown file extensions if not formats.filter(fullfilename): continue if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: item = self.add_filename(fullfilename, False) if item is not None: added.append(item) if len(added) > 100 or need_added(): self.add(added) added = [] task.pulse() yield if added and need_yield(): yield if added: self.add(added) added = [] task.pulse() yield True
def __init__(self, paths): super().__init__(label=_("Files:")) self.set_resize_toplevel(True) paths = [fsn2text(unexpand(p)) for p in paths] lab = Gtk.Label(label="\n".join(paths)) lab.set_alignment(0.0, 0.0) lab.set_selectable(True) win = Gtk.ScrolledWindow() win.add_with_viewport(Align(lab, border=6)) win.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) win.set_shadow_type(Gtk.ShadowType.ETCHED_OUT) win.set_size_request(-1, 100) self.add(win) win.show_all()
def __init__(self, paths): super(FileListExpander, self).__init__(label=_("Files:")) self.set_resize_toplevel(True) paths = [fsdecode(unexpand(p)) for p in paths] lab = Gtk.Label(label="\n".join(paths)) lab.set_alignment(0.0, 0.0) lab.set_selectable(True) win = Gtk.ScrolledWindow() win.add_with_viewport(Alignment(lab, border=6)) win.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) win.set_shadow_type(Gtk.ShadowType.ETCHED_OUT) win.set_size_request(-1, 100) self.add(win) win.show_all()
def watching_producer(): # TODO: integrate this better with scanning. for fullpath in paths: desc = _("Adding watches for %s") % (fsn2text(unexpand(fullpath))) with Task(_("Library"), desc) as task: normalised = Path(normalize_path(fullpath, True)).expanduser() if any(Path(exclude) in normalised.parents for exclude in exclude_dirs): continue unpulsed = 0 self.monitor_dir(normalised) for path, dirs, files in os.walk(normalised): normalised = Path(normalize_path(path, True)) for d in dirs: self.monitor_dir(normalised / d) unpulsed += len(dirs) if unpulsed > 50: task.pulse() unpulsed = 0 yield
def _file(self, song, box): def ftime(t): if t == 0: return _("Unknown") else: timestr = time.strftime("%c", time.localtime(t)) encoding = util.get_locale_encoding() return timestr.decode(encoding) fn = fsdecode(unexpand(song["~filename"])) length = util.format_time_long(song.get("~#length", 0)) size = util.format_size( song.get("~#filesize") or filesize(song["~filename"])) mtime = ftime(util.path.mtime(song["~filename"])) format_ = song("~format") codec = song("~codec") encoding = song.comma("~encoding") bitrate = song("~bitrate") t = Gtk.Table(n_rows=4, n_columns=2) t.set_col_spacings(6) t.set_homogeneous(False) table = [(_("length"), length), (_("format"), format_), (_("codec"), codec), (_("encoding"), encoding), (_("bitrate"), bitrate), (_("file size"), size), (_("modified"), mtime)] fnlab = Label(fn) fnlab.set_ellipsize(Pango.EllipsizeMode.MIDDLE) t.attach(fnlab, 0, 2, 0, 1, xoptions=Gtk.AttachOptions.FILL) for i, (l, r) in enumerate(table): l = "<b>%s</b>" % util.capitalize(util.escape(l) + ":") lab = Label() lab.set_markup(l) t.attach(lab, 0, 1, i + 1, i + 2, xoptions=Gtk.AttachOptions.FILL) t.attach(Label(r), 1, 2, i + 1, i + 2) box.pack_start(Frame(_("File"), t), False, False, 0)
def _file(self, song, box): def ftime(t): if t == 0: return _("Unknown") else: timestr = time.strftime("%c", time.localtime(t)) encoding = util.get_locale_encoding() return timestr.decode(encoding) fn = fsn2text(unexpand(song["~filename"])) length = util.format_time_preferred(song.get("~#length", 0)) size = util.format_size( song.get("~#filesize") or filesize(song["~filename"])) mtime = ftime(util.path.mtime(song["~filename"])) format_ = song("~format") codec = song("~codec") encoding = song.comma("~encoding") bitrate = song("~bitrate") t = Gtk.Table(n_rows=4, n_columns=2) t.set_col_spacings(6) t.set_homogeneous(False) table = [(_("length"), length), (_("format"), format_), (_("codec"), codec), (_("encoding"), encoding), (_("bitrate"), bitrate), (_("file size"), size), (_("modified"), mtime)] fnlab = Label(fn) fnlab.set_ellipsize(Pango.EllipsizeMode.MIDDLE) t.attach(fnlab, 0, 2, 0, 1, xoptions=Gtk.AttachOptions.FILL) for i, (l, r) in enumerate(table): l = "<b>%s</b>" % util.capitalize(util.escape(l) + ":") lab = Label() lab.set_markup(l) t.attach(lab, 0, 1, i + 1, i + 2, xoptions=Gtk.AttachOptions.FILL) t.attach(Label(r), 1, 2, i + 1, i + 2) box.pack_start(Frame(_("File"), t), False, False, 0)
def _file(self, song, box): def ftime(t): if t == 0: return _("Unknown") else: timestr = time.strftime("%c", time.localtime(t)) if not PY3: timestr = timestr.decode(util.get_locale_encoding()) return timestr fn = fsn2text(unexpand(song["~filename"])) length = util.format_time_preferred(song.get("~#length", 0)) size = util.format_size( song.get("~#filesize") or filesize(song["~filename"])) mtime = ftime(util.path.mtime(song["~filename"])) format_ = song("~format") codec = song("~codec") encoding = song.comma("~encoding") bitrate = song("~bitrate") table = [(_("path"), fn), (_("length"), length), (_("format"), format_), (_("codec"), codec), (_("encoding"), encoding), (_("bitrate"), bitrate), (_("file size"), size), (_("modified"), mtime)] t = Table(len(table)) for i, (tag_, text) in enumerate(table): tag_ = util.capitalize(util.escape(tag_) + ":") lab = Label(text) lab.set_ellipsize(Pango.EllipsizeMode.MIDDLE) t.attach(Label(tag_), 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) t.attach(lab, 1, 2, i, i + 1) box.pack_start(Frame(_("File"), t), False, False, 0)
def scan(self, paths, exclude=[], cofuncid=None): added = [] exclude = [expanduser(path) for path in exclude if path] for fullpath in paths: print_d("Scanning %r." % fullpath, self) desc = _("Scanning %s") % (unexpand(fsdecode(fullpath))) with Task(_("Library"), desc) as task: if cofuncid: task.copool(cofuncid) fullpath = expanduser(fullpath) if filter(fullpath.startswith, exclude): continue for path, dnames, fnames in os.walk(util.fsnative(fullpath)): for filename in fnames: fullfilename = os.path.join(path, filename) if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: fullfilename = os.path.realpath(fullfilename) # skip unknown file extensions if not formats.filter(fullfilename): continue if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: item = self.add_filename(fullfilename, False) if item is not None: added.append(item) if len(added) > 20: self.add(added) added = [] task.pulse() yield True if added: self.add(added) added = [] task.pulse() yield True
def _file(self, song, box): def ftime(t): if t == 0: return _("Unknown") else: timestr = time.strftime("%c", time.localtime(t)) return timestr.decode(const.ENCODING) fn = fsdecode(unexpand(song["~filename"])) length = util.format_time_long(song.get("~#length", 0)) size = util.format_size( song.get("~#filesize") or filesize(song["~filename"])) mtime = ftime(util.path.mtime(song["~filename"])) bitrate = song.get("~#bitrate", 0) if bitrate != 0: bitrate = _("%d kbps") % int(bitrate) else: bitrate = False t = Gtk.Table(n_rows=4, n_columns=2) t.set_col_spacings(6) t.set_homogeneous(False) table = [(_("length"), length), (_("file size"), size), (_("modified"), mtime)] if bitrate: table.insert(1, (_("bitrate"), bitrate)) fnlab = Label(fn) fnlab.set_ellipsize(Pango.EllipsizeMode.MIDDLE) t.attach(fnlab, 0, 2, 0, 1, xoptions=Gtk.AttachOptions.FILL) for i, (l, r) in enumerate(table): l = "<b>%s</b>" % util.capitalize(util.escape(l) + ":") lab = Label() lab.set_markup(l) t.attach(lab, 0, 1, i + 1, i + 2, xoptions=Gtk.AttachOptions.FILL) t.attach(Label(r), 1, 2, i + 1, i + 2) box.pack_start(Frame(_("File"), t), False, False, 0)
def _file(self, song, box): def ftime(t): if t == 0: return _("Unknown") else: return text_type(time.strftime("%c", time.localtime(t))) fn = fsn2text(unexpand(song["~filename"])) length = util.format_time_preferred(song.get("~#length", 0)) size = util.format_size( song.get("~#filesize") or filesize(song["~filename"])) mtime = ftime(util.path.mtime(song["~filename"])) format_ = song("~format") codec = song("~codec") encoding = song.comma("~encoding") bitrate = song("~bitrate") table = [(_("path"), fn), (_("length"), length), (_("format"), format_), (_("codec"), codec), (_("encoding"), encoding), (_("bitrate"), bitrate), (_("file size"), size), (_("modified"), mtime)] t = Table(len(table)) for i, (tag_, text) in enumerate(table): tag_ = util.capitalize(util.escape(tag_) + ":") lab = Label(text) lab.set_ellipsize(Pango.EllipsizeMode.MIDDLE) t.attach(Label(tag_), 0, 1, i, i + 1, xoptions=Gtk.AttachOptions.FILL) t.attach(lab, 1, 2, i, i + 1) box.pack_start(Frame(_("File"), t), False, False, 0)
def cdf(column, cell, model, iter, data): row = model[iter] cell.set_property('text', unexpand(row[0]))
def test_subfile(self): path = unexpand(os.path.join(self.d, "la", "la")) self.failUnlessEqual(path, os.path.join(self.u, "la", "la"))
def test_noprefix(self): path = unexpand(self.d + "foobar" + os.path.sep) self.failUnlessEqual(path, self.d + "foobar" + os.path.sep)
def test_base_trailing(self): path = unexpand(self.d + os.path.sep) self.failUnlessEqual(path, self.u + os.path.sep)
def first_draw(*args): filename = unexpand(dump) offset = label.get_text().decode("utf-8").find(filename) label.select_region(offset, offset + len(filename)) self.disconnect(self.__draw_id)
def test_only_profile_case(self): assert isinstance(unexpand(expanduser(fsnative(u"~"))), fsnative)
def test_case_insensitive_win(self): if is_win: assert unexpand(self.d.lower()) == "%USERPROFILE%" assert unexpand(self.d.upper()) == "%USERPROFILE%"
def test_base(self): path = unexpand(self.d) if is_win: self.failUnlessEqual(path, "%USERPROFILE%") else: self.failUnlessEqual(path, "~")
def first_draw(*args): filename = unexpand(self.dump_path) offset = gdecode(label.get_text()).find(filename) label.select_region(offset, offset + len(filename)) self.disconnect(self.__draw_id)
def _apply_value(self, model, iter_, cell, value): cell.set_property('text', fsn2text(unexpand(value)))
def __init__(self, Kind, value, traceback, dump, minidump): # This is all implemented a bit different than the rest of Quod # Libet's windows since I want it to be as stupid as possible, to # minimize the chances of something going wrong with the thing # that handles things going wrong, i.e. it only uses GTK+ code, # no QLTK wrappers. Gtk.Window.__init__(self) self.set_default_size(400, 400) self.set_border_width(12) self.set_title(_("Error Occurred")) desc = _("An exception has occured in Quod Libet. A dump file has " "been saved to <b >%(dump-path)s</b> that will help us debug the " "crash. " "Please file a new issue at %(new-issue-url)s" "and attach this file or include its contents. This " "file may contain some identifying information about you or your " "system, such as a list of recent files played. If this is " "unacceptable, send <b>%(mini-dump-path)s</b> instead with a " "description of what " "you were doing.") % { "dump-path": unexpand(dump), "mini-dump-path": unexpand(minidump), "new-issue-url": "https://github.com/quodlibet/quodlibet/issues/new", } suggestion = _("Quod Libet may now be unstable. Closing it and " "restarting is recommended. Your library will be saved.") label = Gtk.Label(label=desc + "\n\n" + suggestion) label.set_selectable(True) label.set_use_markup(True) label.set_line_wrap(True) box = Gtk.VBox(spacing=6) buttons = Gtk.HButtonBox() view = Gtk.TreeView() sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(view) model = Gtk.ListStore(str, str, int) self.__fill_list(view, model, value, traceback) view.set_model(model) cancel = Gtk.Button(stock=Gtk.STOCK_CANCEL) close = Gtk.Button(stock=Gtk.STOCK_QUIT) buttons.pack_start(close, True, True, 0) buttons.pack_start(cancel, True, True, 0) box.pack_start(label, False, True, 0) box.pack_start(sw, True, True, 0) box.pack_start(buttons, False, True, 0) self.add(box) self.connect('destroy', self.__destroy) connect_obj(cancel, 'clicked', Gtk.Window.destroy, self) close.connect('clicked', lambda *x: Gtk.main_quit()) self.get_child().show_all() def first_draw(*args): filename = unexpand(dump) offset = label.get_text().decode("utf-8").find(filename) label.select_region(offset, offset + len(filename)) self.disconnect(self.__draw_id) self.__draw_id = self.connect("draw", first_draw)
def cdf(column, cell, model, iter_, data): path = model.get_value(iter_) cell.set_property('text', fsn2text(unexpand(path)))
def _cdf(self, column, cell, model, iter_, user_data): values = model.get_value(iter_).list(self.header_name) value = values[0] if values else fsnative(u"") if not self._needs_update(value): return cell.set_property('text', fsdecode(unexpand(value)))
def test_get_exclude_dirs(self): some_path = os.path.join(unexpand(get_home_dir()), "foo") config.set('library', 'exclude', some_path) assert expanduser(some_path) in get_exclude_dirs() assert all([isinstance(p, fsnative) for p in get_exclude_dirs()])
def __init__(self, type_, value, traceback): # This is all implemented a bit different than the rest of Quod # Libet's windows since I want it to be as stupid as possible, to # minimize the chances of something going wrong with the thing # that handles things going wrong, i.e. it only uses GTK+ code, # no QLTK wrappers. self._time = time.localtime() Gtk.Window.__init__(self) self.set_default_size(400, 400) self.set_border_width(12) self.set_title(_("Error Occurred")) desc = _( "An exception has occured in Quod Libet. A dump file has " "been saved to <b >%(dump-path)s</b> that will help us debug the " "crash. " "Please file a new issue at %(new-issue-url)s" "and attach this file or include its contents. This " "file may contain some identifying information about you or your " "system, such as a list of recent files played. If this is " "unacceptable, send <b>%(mini-dump-path)s</b> instead with a " "description of what " "you were doing.") % { "dump-path": unexpand(self.dump_path), "mini-dump-path": unexpand(self.minidump_path), "new-issue-url": "https://github.com/quodlibet/quodlibet/issues/new", } suggestion = _( "Quod Libet may now be unstable. Closing it and " "restarting is recommended. Your library will be saved.") label = Gtk.Label(label=desc + "\n\n" + suggestion) label.set_selectable(True) label.set_use_markup(True) label.set_line_wrap(True) box = Gtk.VBox(spacing=6) buttons = Gtk.HButtonBox() viewbox = Gtk.VBox(spacing=4) buf = Gtk.TextBuffer() buf.set_text(text_type(value)) viewbox.add(Gtk.TextView(buffer=buf, editable=False)) view = Gtk.TreeView() viewbox.add(view) view.set_headers_visible(False) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) sw.set_shadow_type(Gtk.ShadowType.IN) sw.add(viewbox) model = Gtk.ListStore(object, object, object) self.__fill_list(view, model, value, traceback) view.set_model(model) cancel = qltk.Button(_("_Cancel")) close = qltk.Button(_("_Quit"), Icons.APPLICATION_EXIT) buttons.pack_start(close, True, True, 0) buttons.pack_start(cancel, True, True, 0) box.pack_start(label, False, True, 0) box.pack_start(sw, True, True, 0) box.pack_start(buttons, False, True, 0) self.add(box) self.connect('destroy', self.__destroy) connect_obj(cancel, 'clicked', Gtk.Window.destroy, self) close.connect('clicked', lambda *x: Gtk.main_quit()) self.get_child().show_all() def first_draw(*args): filename = unexpand(self.dump_path) offset = gdecode(label.get_text()).find(filename) label.select_region(offset, offset + len(filename)) self.disconnect(self.__draw_id) self.__draw_id = self.connect("draw", first_draw)
def _cdf(self, column, cell, model, iter_, user_data): value = model.get_value(iter_).comma(self.header_name) if not self._needs_update(value): return cell.set_property('text', unexpand(fsdecode(value)))
def test_get_scan_dirs(self): some_path = os.path.join(unexpand(get_home_dir()), "foo") config.set('settings', 'scan', some_path) assert expanduser(some_path) in get_scan_dirs() assert all([isinstance(p, fsnative) for p in get_scan_dirs()])
def cdf(column, cell, model, iter, data): cell.set_property("markup", "<b>%s</b> line %d\n\t%s" % ( util.escape(model[iter][1]), model[iter][2], util.escape(unexpand(model[iter][0]))))