'åå§åBTç§å­æ¥è¯¢å¯¹è¯æ¡.
source_url - åŠææ¯BTç§å­çè¯, å°±æ¯ç§å­çç»å¯¹è·¯åŸ.
åŠææ¯ç£éŸçè¯, å°±æ¯ä»¥magent:åŒå€Žçç£éŸéŸæ¥.'

def __init__(self, parent, app, title, source_url, save_path):

    super().__init__(title, app.window, Gtk.DialogFlags.MODAL, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK))
    self.app = app
    self.source_url = source_url
    self.save_path = save_path
    self.set_default_response(Gtk.ResponseType.OK)
    self.set_default_size(520, 480)
    self.set_border_width(10)
    box = self.get_content_area()
    select_all_button = Gtk.ToggleButton.new_with_label(_('Select    All'))
    select_all_button.props.halign = Gtk.Align.START
    select_all_button.props.margin_bottom = 5
    select_all_button.connect('toggled', self.on_select_all_toggled)
    box.pack_start(select_all_button, False, False, 0)
    scrolled_win = Gtk.ScrolledWindow()
    box.pack_start(scrolled_win, True, True, 0)
    self.liststore = Gtk.ListStore(bool, str, GObject.TYPE_INT64, str)
    self.treeview = Gtk.TreeView(model=self.liststore)
    self.treeview.set_tooltip_column(NAME_COL)
    scrolled_win.add(self.treeview)
    check_cell = Gtk.CellRendererToggle()
    check_cell.connect('toggled', self.on_check_cell_toggled)
    check_col = Gtk.TreeViewColumn('', check_cell, active=CHECK_COL)
    self.treeview.append_column(check_col)
    name_cell = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END, ellipsize_set=True)
    name_col = Gtk.TreeViewColumn(_('Name'), name_cell, text=NAME_COL)
    name_col.set_expand(True)
    self.treeview.append_column(name_col)
    size_cell = Gtk.CellRendererText()
    size_col = Gtk.TreeViewColumn(_('Size'), size_cell, text=HUMANSIZE_COL)
    self.treeview.append_column(size_col)
    box.show_all()
    self.request_data()
