def __init__(self, downloads, parent=None):
        QVBoxLayout.__init__(self)
        self.setContentsMargins(0, 0, 0, 0)
        self.setSpacing(5)

        self.downloads = downloads
        self.parent = parent

        self.tree_view = QTreeView(parent)
        #
        self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tree_view.customContextMenuRequested.connect(self.context_menu)
        #
        #listview look
        self.tree_view.setWordWrap(True)  #search textElideMode
        self.tree_view.setRootIsDecorated(False)
        self.tree_view.setIndentation(0)
        self.tree_view.setAlternatingRowColors(True)
        #
        self.items = []
        self.rows_buffer = {}  #{id_item: row_obj, }
        #self.items = [[True, "1", "11", "t5est", "t3est"], [True, "1", "11", "t5est", "t3est"], [True, "1", "11", "t5est", "t3est"]]
        bool_cols = [
            1,
        ]
        headers = [
            "hidden_id_item", "",
            _("Status"),
            _("File Name"),
            _("Host"),
            _("Size"),
            _("Status Message")
        ]
        #
        self.__model = SimpleListModel(headers, self.items, bool_cols)
        self.tree_view.setModel(self.__model)
        self.addWidget(self.tree_view)
        #
        self.tree_view.setColumnHidden(0, True)
        self.tree_view.setColumnWidth(1, 27)
        self.tree_view.header().setResizeMode(1, QHeaderView.Fixed)

        hbox = QHBoxLayout()
        hbox.setContentsMargins(0, 0, 0, 0)
        hbox.setSpacing(10)

        self.cb = QComboBox()
        #self.cb.setFixedWidth(100)
        self.cb.setEditable(True)
        self.cb.setFixedHeight(35)
        self.cb.setMinimumWidth(1)
        cb_view = self.cb.view()
        cb_view.setAlternatingRowColors(True)
        #
        self.paths_list = conf.get_save_dl_paths()
        if not self.paths_list:
            self.cb.addItem(cons.DLFOLDER_PATH)
        else:
            [self.cb.addItem(path) for path in reversed(self.paths_list)]
        #
        hbox.addWidget(self.cb)

        btn_examine = QPushButton('...')
        btn_examine.clicked.connect(self.on_examine)
        btn_examine.setFixedHeight(35)
        btn_examine.setMaximumWidth(80)
        hbox.addWidget(btn_examine)

        hbox.addSpacing(40)  #index, size

        btn_download = QPushButton()
        btn_download.setIcon(media.get_icon(media.DOWN, media.MEDIUM))
        btn_download.setIconSize(QSize(24, 24))
        btn_download.clicked.connect(self.on_download_selected)
        btn_download.setFixedHeight(35)
        btn_download.setMaximumWidth(40)
        hbox.addWidget(btn_download)

        btn_add = QPushButton()
        btn_add.setIcon(media.get_icon(media.ADD, media.MEDIUM))
        btn_add.setIconSize(QSize(24, 24))
        btn_add.clicked.connect(self.on_add_links)
        btn_add.setFixedHeight(35)
        btn_add.setMaximumWidth(40)
        hbox.addWidget(btn_add)

        self.menu = QMenu(parent)
        import_action = self.menu.addAction(_("Import Container"),
                                            self.on_import_container)
        self.menu.addSeparator()
        recheck_action = self.menu.addAction(_("Re-check"), self.on_recheck)
        clear_action = self.menu.addAction(_("Clear list"), self.on_clear_list)
        #
        btn_menu = QPushButton()
        btn_menu.setMenu(self.menu)
        btn_menu.setFixedHeight(35)
        btn_menu.setMaximumWidth(22)
        btn_menu.setFlat(True)
        hbox.addWidget(btn_menu)

        self.addLayout(hbox)

        #update list
        parent.idle_timeout(1000, self.update)
    def __init__(self, list_gui, parent=None):
        gtk.VBox.__init__(self)

        self.__parent = parent
        self.list_gui = list_gui

        self.update_flag = False
        self.active_tab_flag = True

        #Estructura:
        #-------------------vbox1_start---------------
        #-------------------hbox4[halign1-left + halign4-right]-----------------------
        #-------------------vbox1_end----------------

        #detallado:
        #-------------------vbox1_start---------------
        #-------------------hbox4_start---------------
        #-------------------halign1_start-------------
        #-------------------hbox1-----------------------(save to field + examine button, left aligned)
        #-------------------halign1_end--------------
        #-------------------halign4_start------------(add links button, etc, right aligned)
        #-------------------halign2_start-------------
        #-------------------hbox2-----------------------
        #-------------------halign2_end--------------
        #-------------------halign4_end--------------
        #-------------------hbox4_end----------------
        #-------------------vbox1_end----------------

        #containers-separators.
        #self.vbox no puede ser cambiado en gtk.Dialog. Crear variable vbox y luego meterla en self.vbox.
        vbox1 = gtk.VBox(
            False, 5
        )  #gtk.VBox(homogeneous=False, spacing=0) homogeneous: mismo espacio cada hijo, spacing: espacio horizontal entre hijos.

        #vbox1_start
        #Check links field.
        #-------------------------------------------

        scroll = gtk.ScrolledWindow()
        scroll.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

        self.store = gtk.ListStore(
            str, bool, str, str, str, str,
            str)  #modelo de columnas. (4 columnas de strings y 1 booleana)

        #arma el cuadro con los items
        self.treeView = gtk.TreeView(self.store)
        self.treeView.set_rules_hint(True)  #turna el color de los items, creo.
        scroll.add(self.treeView)

        #Columns item names.
        col_list = [
            "hidden_id_item",
            _("Add"),
            _("Status"),
            _("File Name"),
            _("Host"),
            _("Size"),
            _("Status Message")
        ]  #podria usar un frozenset, no se si lo soporta cython.
        self.create_columns(col_list)

        vbox1.pack_start(scroll)

        #Context Menu (pop-up)
        dl_selected_item = (gtk.MenuItem(), _("Download Selected"),
                            self.on_accept)
        recheck_item = (gtk.MenuItem(), _("Re-check"), self.on_recheck)
        clear_item = (gtk.MenuItem(), _("Clear list"), self.on_clear_list)

        menu_items = (dl_selected_item, None, recheck_item, clear_item)
        self.ctx_menu = Menu(menu_items)  #items selected
        self.treeView.connect("button-press-event", self.on_context_menu)

        #Select file field.
        #-------------------------------------------
        #containers-separators.
        hbox1 = gtk.HBox(False, 10)  #file field and button examine.
        #gtk.HBox(homogeneous=False, spacing=0) homogeneous: mismo espacio cada hijo, spacing: espacio horizontal entre hijos.
        hbox2 = gtk.HBox(False, 10)  #buttons cancel and accept.

        #hbox1
        #label_save_to = gtk.Label("Save to:")
        #hbox1.add(label_save_to)
        self.paths_liststore = gtk.ListStore(str)
        cb_entry = gtk.ComboBoxEntry(self.paths_liststore)
        self.entry = cb_entry.child
        self.entry.add_events(gtk.gdk.KEY_RELEASE_MASK)
        self.entry.set_width_chars(35)  #entry width

        self.paths_list = conf.get_save_dl_paths()
        self.load_save_paths()

        if not self.paths_list:
            default_path = cons.DLFOLDER_PATH
        else:
            default_path = self.paths_list[-1]

        #.decode(sys.getfilesystemencoding())
        self.entry.set_text(
            default_path.decode("utf-8")
        )  #default entry path. Cuando cree el ejecutable, se puede crear una ruta al directorio asi: sys.path.append(path)
        hbox1.add(cb_entry)

        button = gtk.Button(_("..."))
        button.set_size_request(80, 35)
        button.connect("clicked", self.save_folder)
        hbox1.add(button)

        halign1 = gtk.Alignment(
            0, 0, 0, 0
        )  #horizontal container. left liagment. #vertical container (estara vacio). gtk.Alignment(xalign=0.0, yalign=0.0, xscale=0.0, yscale=0.0)
        #xalign: espacio libre a la izquierda del hijo. 0.0 = sin espacio arriba. 1.0 = todo el espacio arriba.
        #yalign: espacio libre vertical arriba del hijo. 0.0 = sin espacio arriba. 1.0 = todo el espacio arriba.
        halign1.add(hbox1)

        down_arrow_image = media.get_image(media.DOWN, media.MEDIUM)
        download_selected_button = gtk.Button()
        download_selected_button.add(down_arrow_image)
        #self.button2.set_size_request(180, 35)
        download_selected_button.connect("clicked", self.on_accept)

        add_image = media.get_image(media.ADD, media.MEDIUM)
        add_button = gtk.Button()
        add_button.add(add_image)
        #button.set_size_request(80, 35)
        add_button.connect("clicked", self.on_add_links)

        icon_down = media.get_image(media.ARROW_DOWN, media.SMALL)
        #icon_down = gtk.image_new_from_file(os.path.join(cons.APP_PATH, "media", "arrow_down9.png"))
        #drop_down_image = gtk.image_new_from_stock(gtk.STOCK_GO_DOWN, gtk.ICON_SIZE_BUTTON)
        drop_down_button = PopupMenuButton(image=icon_down)  #gtk.Button()
        drop_down_button.set_size_request(20, 35)

        import_item = (gtk.MenuItem(), _("Import Container"),
                       self.on_import_container)
        recheck_item = (gtk.MenuItem(), _("Re-check"), self.on_recheck)
        clear_item = (gtk.MenuItem(), _("Clear list"), self.on_clear_list)

        menu_items = (import_item, None, recheck_item, clear_item)
        menu = Menu(menu_items)  #items selected
        drop_down_button.set_menu(menu)

        #button5 = gtk.Button(_("Re-check"))
        #button5.set_size_request(80, 35)
        #button5.connect("clicked", self.on_recheck)

        halign4 = gtk.Alignment(1, 0, 0,
                                0)  #horizontal container. right liagment.
        hbox2.add(download_selected_button)
        hbox2.add(add_button)
        hbox2.add(drop_down_button)
        halign4.add(hbox2)

        hbox4 = gtk.HBox(False, 0)  #two aligment widgets
        hbox4.add(halign1)
        hbox4.add(halign4)

        vbox1.pack_start(
            hbox4, False,
            False)  #pack_start(child, expand=True, fill=True, padding=0)

        #-------------------------------------------
        #vbox1_end

        #entry.get_text()
        #checking thread stuff.
        self.cancelled = False  #si se cancelo el checkeo, terminar thread.
        #self.th = threading.Thread(group=None, target=self.checking_links, name=None).start() #ckeck links.

        self.pack_start(vbox1)
 def __init__(self, list_gui, parent=None):
     gtk.VBox.__init__(self)
     
     self.__parent = parent
     self.list_gui = list_gui
     
     self.update_flag = False
     self.active_tab_flag = True
     
     #Estructura:
     #-------------------vbox1_start---------------
     #-------------------hbox4[halign1-left + halign4-right]-----------------------
     #-------------------vbox1_end----------------
     
     #detallado:
     #-------------------vbox1_start---------------
     #-------------------hbox4_start---------------
     #-------------------halign1_start-------------
     #-------------------hbox1-----------------------(save to field + examine button, left aligned)
     #-------------------halign1_end--------------
     #-------------------halign4_start------------(add links button, etc, right aligned)
     #-------------------halign2_start-------------
     #-------------------hbox2-----------------------
     #-------------------halign2_end--------------
     #-------------------halign4_end--------------
     #-------------------hbox4_end----------------
     #-------------------vbox1_end----------------
     
     #containers-separators.
     #self.vbox no puede ser cambiado en gtk.Dialog. Crear variable vbox y luego meterla en self.vbox.
     vbox1 = gtk.VBox(False, 5) #gtk.VBox(homogeneous=False, spacing=0) homogeneous: mismo espacio cada hijo, spacing: espacio horizontal entre hijos.
     
     #vbox1_start
     #Check links field.
     #-------------------------------------------
     
     scroll = gtk.ScrolledWindow()
     scroll.set_shadow_type(gtk.SHADOW_ETCHED_IN)
     scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
     
     self.store = gtk.ListStore(str, bool, str, str, str, str, str)#modelo de columnas. (4 columnas de strings y 1 booleana)
     
     #arma el cuadro con los items
     self.treeView = gtk.TreeView(self.store)
     self.treeView.set_rules_hint(True) #turna el color de los items, creo.
     scroll.add(self.treeView)
     
     #Columns item names.
     col_list = ["hidden_id_item", _("Add"), _("Status"), _("File Name"), _("Host"), _("Size"), _("Status Message")] #podria usar un frozenset, no se si lo soporta cython.
     self.create_columns(col_list)
     
     vbox1.pack_start(scroll)
     
     #Context Menu (pop-up)
     dl_selected_item = (gtk.MenuItem(), _("Download Selected"), self.on_accept)
     recheck_item = (gtk.MenuItem(), _("Re-check"), self.on_recheck)
     clear_item = (gtk.MenuItem(), _("Clear list"), self.on_clear_list)
     
     menu_items = (dl_selected_item, None, recheck_item, clear_item)
     self.ctx_menu = Menu(menu_items) #items selected
     self.treeView.connect("button-press-event", self.on_context_menu)
     
     #Select file field.
     #-------------------------------------------
     #containers-separators.
     hbox1 = gtk.HBox(False, 10) #file field and button examine.
     #gtk.HBox(homogeneous=False, spacing=0) homogeneous: mismo espacio cada hijo, spacing: espacio horizontal entre hijos.
     hbox2 = gtk.HBox(False, 10) #buttons cancel and accept.
     
     #hbox1
     #label_save_to = gtk.Label("Save to:")
     #hbox1.add(label_save_to)
     self.paths_liststore = gtk.ListStore(str)
     cb_entry = gtk.ComboBoxEntry(self.paths_liststore)
     self.entry = cb_entry.child
     self.entry.add_events(gtk.gdk.KEY_RELEASE_MASK)
     self.entry.set_width_chars(35) #entry width
     
     self.paths_list = conf.get_save_dl_paths()
     self.load_save_paths()
     
     if not self.paths_list:
         default_path = cons.DLFOLDER_PATH
     else:
         default_path = self.paths_list[-1]
     
     #.decode(sys.getfilesystemencoding())
     self.entry.set_text(default_path.decode("utf-8")) #default entry path. Cuando cree el ejecutable, se puede crear una ruta al directorio asi: sys.path.append(path)
     hbox1.add(cb_entry)
     
     button = gtk.Button(_("..."))
     button.set_size_request(80, 35)
     button.connect("clicked", self.save_folder)
     hbox1.add(button)
     
     halign1 = gtk.Alignment(0, 0, 0, 0) #horizontal container. left liagment. #vertical container (estara vacio). gtk.Alignment(xalign=0.0, yalign=0.0, xscale=0.0, yscale=0.0)
     #xalign: espacio libre a la izquierda del hijo. 0.0 = sin espacio arriba. 1.0 = todo el espacio arriba.
     #yalign: espacio libre vertical arriba del hijo. 0.0 = sin espacio arriba. 1.0 = todo el espacio arriba.
     halign1.add(hbox1)
     
     down_arrow_image = media.get_image(media.DOWN, media.MEDIUM)
     download_selected_button = gtk.Button()
     download_selected_button.add(down_arrow_image)
     #self.button2.set_size_request(180, 35)
     download_selected_button.connect("clicked", self.on_accept)
     
     add_image = media.get_image(media.ADD, media.MEDIUM)
     add_button = gtk.Button()
     add_button.add(add_image)
     #button.set_size_request(80, 35)
     add_button.connect("clicked", self.on_add_links)
     
     
     icon_down = media.get_image(media.ARROW_DOWN, media.SMALL)
     #icon_down = gtk.image_new_from_file(os.path.join(cons.APP_PATH, "media", "arrow_down9.png"))
     #drop_down_image = gtk.image_new_from_stock(gtk.STOCK_GO_DOWN, gtk.ICON_SIZE_BUTTON)
     drop_down_button = PopupMenuButton(image=icon_down) #gtk.Button()
     drop_down_button.set_size_request(20, 35)
     
     import_item = (gtk.MenuItem(), _("Import Container"), self.on_import_container)
     recheck_item = (gtk.MenuItem(), _("Re-check"), self.on_recheck)
     clear_item = (gtk.MenuItem(), _("Clear list"), self.on_clear_list)
     
     menu_items = (import_item, None, recheck_item, clear_item)
     menu = Menu(menu_items) #items selected
     drop_down_button.set_menu(menu)
     
     #button5 = gtk.Button(_("Re-check"))
     #button5.set_size_request(80, 35)
     #button5.connect("clicked", self.on_recheck)
     
     halign4 = gtk.Alignment(1, 0, 0, 0) #horizontal container. right liagment.
     hbox2.add(download_selected_button)
     hbox2.add(add_button)
     hbox2.add(drop_down_button)
     halign4.add(hbox2)
     
     hbox4 = gtk.HBox(False, 0) #two aligment widgets
     hbox4.add(halign1)
     hbox4.add(halign4)
     
     vbox1.pack_start(hbox4, False, False) #pack_start(child, expand=True, fill=True, padding=0)
     
     #-------------------------------------------
     #vbox1_end
     
     #entry.get_text()
     #checking thread stuff.
     self.cancelled = False #si se cancelo el checkeo, terminar thread.
     #self.th = threading.Thread(group=None, target=self.checking_links, name=None).start() #ckeck links.
     
     self.pack_start(vbox1)
    def __init__(self, parent):
        QVBoxLayout.__init__(self)
        self.setContentsMargins(0, 0, 0, 0)
        self.setSpacing(5)

        self.weak_parent = weakref.ref(parent)
        
        self.tree_view = QTreeView(parent)
        #
        self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tree_view.customContextMenuRequested.connect(self.context_menu)
        #
        #listview look
        self.tree_view.setWordWrap(True) #search textElideMode
        self.tree_view.setRootIsDecorated(False)
        self.tree_view.setIndentation(0)
        self.tree_view.setAlternatingRowColors(True)
        #
        self.icons_dict = self.get_icons()
        self.items = []
        self.rows_buffer = {} #{id_item: row_obj, }
        #self.items = [[True, "1", "11", "t5est", "t3est"], [True, "1", "11", "t5est", "t3est"], [True, "1", "11", "t5est", "t3est"]]
        bool_cols = [1, ]
        image_cols = [2, ]
        headers = ["hidden_id_item", "", "", _("File Name"), _("Host"), _("Size"), _("Status Message")]
        #
        self.__model = SimpleListModel(headers, self.items, bool_cols, image_cols)
        self.tree_view.setModel(self.__model)
        self.addWidget(self.tree_view)
        #
        self.tree_view.setColumnHidden(0, True)
        self.tree_view.setColumnWidth(1, 27)
        self.tree_view.setColumnWidth(2, 27)
        self.tree_view.header().setResizeMode(1, QHeaderView.Fixed)
        
        hbox = QHBoxLayout()
        hbox.setContentsMargins(0, 0, 0, 0)
        hbox.setSpacing(10)
        
        self.cb = QComboBox()
        #self.cb.setFixedWidth(100)
        self.cb.setEditable(True)
        self.cb.setFixedHeight(35)
        self.cb.setMinimumWidth(1)
        cb_view = self.cb.view()
        cb_view.setAlternatingRowColors(True)
        #
        self.paths_list = conf.get_save_dl_paths()
        if not self.paths_list:
            self.cb.addItem(cons.DLFOLDER_PATH)
        else:
            [self.cb.addItem(path) for path in reversed(self.paths_list)]
        #
        hbox.addWidget(self.cb)
        
        btn_examine = QPushButton('...')
        btn_examine.clicked.connect(self.on_examine)
        btn_examine.setFixedHeight(35)
        btn_examine.setMaximumWidth(80)
        hbox.addWidget(btn_examine)
        
        hbox.addSpacing(40) #index, size
        
        btn_download = QPushButton()
        btn_download.setIcon(media.get_icon(media.DOWN, media.MEDIUM))
        btn_download.setIconSize(QSize(24, 24))
        btn_download.clicked.connect(self.on_download_selected)
        btn_download.setFixedHeight(35)
        btn_download.setMaximumWidth(40)
        hbox.addWidget(btn_download)
        
        btn_add = QPushButton()
        btn_add.setIcon(media.get_icon(media.ADD, media.MEDIUM))
        btn_add.setIconSize(QSize(24, 24))
        btn_add.clicked.connect(self.on_add_links)
        btn_add.setFixedHeight(35)
        btn_add.setMaximumWidth(40)
        hbox.addWidget(btn_add)
        
        self.menu = QMenu(parent)
        import_action = self.menu.addAction(_("Import Container"), self.on_import_container)
        self.menu.addSeparator()
        recheck_action = self.menu.addAction(_("Re-check"), self.on_recheck)
        clear_action = self.menu.addAction(_("Clear list"), self.on_clear_list)
        #
        btn_menu = QPushButton()
        btn_menu.setMenu(self.menu)
        btn_menu.setFixedHeight(35)
        btn_menu.setMaximumWidth(22)
        btn_menu.setFlat(True)
        hbox.addWidget(btn_menu)
        
        
        self.addLayout(hbox)

        #custom signals
        signals.add_downloads_to_check.connect(self.add_downloads_to_check)
        
        #update list
        parent.idle_timeout(1000, self.update_)