/usr/share/pyshared/quodlibet/qltk/maskedbox.py is in exfalso 3.0.2-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | # -*- coding: utf-8 -*-
# Copyright 2013 Christoph Reiter
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation
from gi.repository import Gtk, Pango
from quodlibet import util
from quodlibet import qltk
from quodlibet.qltk.views import RCMHintedTreeView
class ConfirmMaskedRemoval(qltk.Message):
def __init__(self, parent):
title = _("Are you sure you want to remove all songs?")
description = _("The selected songs will be removed from the library.")
super(ConfirmMaskedRemoval, self).__init__(
Gtk.MessageType.WARNING, parent, title, description,
Gtk.ButtonsType.NONE)
self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_DELETE, Gtk.ResponseType.YES)
class MaskedBox(Gtk.HBox):
def __init__(self, library):
super(MaskedBox, self).__init__(spacing=6)
self.model = model = Gtk.ListStore(object)
view = RCMHintedTreeView(model)
view.set_fixed_height_mode(True)
view.set_headers_visible(False)
self.view = view
menu = Gtk.Menu()
unhide_item = qltk.MenuItem(_("Unhide"), Gtk.STOCK_ADD)
unhide_item.connect_object('activate', self.__unhide, view, library)
menu.append(unhide_item)
remove_item = Gtk.ImageMenuItem(Gtk.STOCK_REMOVE, use_stock=True)
remove_item.connect_object('activate', self.__remove, view, library)
menu.append(remove_item)
menu.show_all()
view.connect('popup-menu', self.__popup, menu)
sw = Gtk.ScrolledWindow()
sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
sw.set_shadow_type(Gtk.ShadowType.IN)
sw.add(view)
sw.set_size_request(-1, max(sw.size_request().height, 80))
def cdf(column, cell, model, iter, data):
row = model[iter]
cell.set_property('text', util.fsdecode(row[0]))
def cdf_count(column, cell, model, iter, data):
mount = model[iter][0]
song_count = len(library.get_masked(mount))
cell.set_property('text',
_("%(song_count)d songs") % {"song_count": song_count})
column = Gtk.TreeViewColumn(None)
column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
render = Gtk.CellRendererText()
render.set_property('ellipsize', Pango.EllipsizeMode.END)
column.pack_start(render, True)
column.set_cell_data_func(render, cdf)
render = Gtk.CellRendererText()
render.props.sensitive = False
column.pack_start(render, False)
column.set_cell_data_func(render, cdf_count)
view.append_column(column)
unhide = qltk.Button(_("Unhide"), Gtk.STOCK_ADD)
unhide.connect_object("clicked", self.__unhide, view, library)
remove = Gtk.Button(stock=Gtk.STOCK_REMOVE)
selection = view.get_selection()
selection.set_mode(Gtk.SelectionMode.MULTIPLE)
selection.connect("changed", self.__select_changed, remove, unhide)
selection.emit("changed")
remove.connect_object("clicked", self.__remove, view, library)
vbox = Gtk.VBox(spacing=6)
vbox.pack_start(unhide, False, True, 0)
vbox.pack_start(remove, False, True, 0)
self.pack_start(sw, True, True, 0)
self.pack_start(vbox, False, True, 0)
self.show_all()
for path in library.masked_mount_points:
model.append(row=[path])
if not len(model):
self.set_sensitive(False)
def __popup(self, view, menu):
return view.popup_menu(menu, 0, Gtk.get_current_event_time())
def __unhide(self, view, library):
selection = view.get_selection()
model, paths = selection.get_selected_rows()
for path in paths:
library.unmask(model[path][0])
view.remove_selection()
def __select_changed(self, selection, *buttons):
active = bool(selection.count_selected_rows())
for button in buttons:
button.set_sensitive(active)
def __remove(self, view, library):
dialog = ConfirmMaskedRemoval(self)
response = dialog.run()
if response == Gtk.ResponseType.YES:
selection = view.get_selection()
model, paths = selection.get_selected_rows()
for path in paths:
library.remove_masked(model[path][0])
view.remove_selection()
|