def __init__(self, parent=None):
        super(Search, self).__init__(parent)

        self.Model = SearchModel()
        self.Searcher = SearchThread(self)
        self.Downloader = DownloadThread(self)

        self.setupUi()
class Search(QtGui.QWidget):
    bookInfoDownloaded = QtCore.pyqtSignal(dict)
    
    def __init__(self, parent=None):
        super(Search, self).__init__(parent)

        self.Model = SearchModel()
        self.Searcher = SearchThread(self)
        self.Downloader = DownloadThread(self)

        self.setupUi()

    def setupUi(self):
        self.Type = QtGui.QComboBox()
        self.Type.addItem(self.tr(u"Keyword"),"keyword")
        self.Type.addItem(self.tr(u"Title"),"title")
        self.Type.addItem(self.tr(u"Writer"),"writer")

        self.Query = QtGui.QLineEdit()
        self.Query.setPlaceholderText(self.tr(u"search idefix..."))
        self.Query.textChanged.connect(self.setButtonStatus)
        self.Query.returnPressed.connect(self.searchBook)

        self.Button = QtGui.QPushButton()
        self.Button.setFixedSize(25,25)
        self.Button.setAutoDefault(False)
        self.Button.setIcon(QtGui.QIcon(":icons/search.ico"))
        self.Button.setEnabled(False)
        self.Button.clicked.connect(self.searchBook)
        
        self.List = QtGui.QListView()
        self.List.setModel(self.Model)
        self.List.doubleClicked.connect(self.downloadBookInfo)

        self.Progress = QtGui.QProgressBar()
        self.Progress.setTextVisible(False)

        self.Status = QtGui.QLabel()

        Layout = QtGui.QGridLayout()
        Layout.addWidget(self.Type,0,0)
        Layout.addWidget(self.Query,0,1)
        Layout.addWidget(self.Button,0,2)
        Layout.addWidget(self.List,1,0,1,3)
        Layout.addWidget(self.Progress,2,0,1,3)
        Layout.addWidget(self.Status,3,0,1,3)

        self.setLayout(Layout)

    def searchBook(self):
        if self.Button.isEnabled():
            self.Button.setDisabled(True)
            self.Status.setText(self.tr("Searching..."))
            self.Searcher.setup(self.Type.itemData(self.Type.currentIndex()),
                                self.Query.text())
            self.Searcher.progressUpdated.connect(self.setProgressBar)
            self.Searcher.searchCompleted.connect(self.addSearchedBooks)
            self.Searcher.start()

    def setButtonStatus(self, Text=""):
        self.Button.setEnabled(bool(Text))

    def setProgressBar(self, minimum, maximum, value):
        self.Progress.setMinimum(minimum)
        self.Progress.setMaximum(maximum)
        self.Progress.setValue(value)

    def addSearchedBooks(self, bookList):
        self.Searcher.wait()
        self.Model.clear()
        self.Status.setText(self.tr("%d books found.") % len(bookList))
        self.Model.addDataFromList(bookList)
        self.Button.setDisabled(False)

    def downloadBookInfo(self, index):
        if not self.Downloader.isRunning():
            url = self.Model.data(index, QtCore.Qt.UserRole)
            self.Downloader.setup(url)
            self.Downloader.downloadCompleted.connect(self.bookInfoDownloaded.emit)
            self.Downloader.start()