def __init__(self, cursor, path, daemon=False):
        QtGui.QWidget.__init__(self)

        self.ui = Ui_ThumbsBrowser()
        self.ui.setupUi(self)

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.cursor = cursor
        self.backup_path = path

        #self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="120x120.ithmb"))
        #		self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="158x158.ithmb"))

        # check if files exist
        #		if (not os.path.isfile(self.filename)):
        #			raise Exception("Thumbnails file not found: \"%s\""%self.filename)

        if (daemon == False):
            self.populateUI()
            QtCore.QObject.connect(self.ui.thumbsFilesList,
                                   QtCore.SIGNAL("currentIndexChanged(int)"),
                                   self.changeThumbsFile)
            QtCore.QObject.connect(self.ui.buttonLeft,
                                   QtCore.SIGNAL("clicked()"), self.pageLeft)
            QtCore.QObject.connect(self.ui.buttonRight,
                                   QtCore.SIGNAL("clicked()"), self.pageRight)
	def __init__(self, cursor, path, daemon = False):
		QtGui.QWidget.__init__(self)
		
		self.ui = Ui_ThumbsBrowser()
		self.ui.setupUi(self)
		
		self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
		
		self.cursor = cursor
		self.backup_path = path
		
		#self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="120x120.ithmb"))
#		self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="158x158.ithmb"))

		# check if files exist
#		if (not os.path.isfile(self.filename)):
#			raise Exception("Thumbnails file not found: \"%s\""%self.filename)
		
		if (daemon == False):
			self.populateUI()
			QtCore.QObject.connect(self.ui.thumbsFilesList, QtCore.SIGNAL("currentIndexChanged(int)"), self.changeThumbsFile)
			QtCore.QObject.connect(self.ui.buttonLeft, QtCore.SIGNAL("clicked()"), self.pageLeft)			
			QtCore.QObject.connect(self.ui.buttonRight, QtCore.SIGNAL("clicked()"), self.pageRight)			
class ThumbsBrowser(QtGui.QWidget):

    frame_width = 160  #120
    frame_height = 158  #120
    frame_padding = 28

    start = 0
    number = 30

    def __init__(self, cursor, path, daemon=False):
        QtGui.QWidget.__init__(self)

        self.ui = Ui_ThumbsBrowser()
        self.ui.setupUi(self)

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.cursor = cursor
        self.backup_path = path

        #self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="120x120.ithmb"))
        #		self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="158x158.ithmb"))

        # check if files exist
        #		if (not os.path.isfile(self.filename)):
        #			raise Exception("Thumbnails file not found: \"%s\""%self.filename)

        if (daemon == False):
            self.populateUI()
            QtCore.QObject.connect(self.ui.thumbsFilesList,
                                   QtCore.SIGNAL("currentIndexChanged(int)"),
                                   self.changeThumbsFile)
            QtCore.QObject.connect(self.ui.buttonLeft,
                                   QtCore.SIGNAL("clicked()"), self.pageLeft)
            QtCore.QObject.connect(self.ui.buttonRight,
                                   QtCore.SIGNAL("clicked()"), self.pageRight)

    def dump(self, src, length=8, limit=10000):
        FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.'
                          for x in range(256)])
        N = 0
        result = ''
        while src:
            s, src = src[:length], src[length:]
            hexa = ' '.join(["%02X" % ord(x) for x in s])
            s = s.translate(FILTER)
            result += "%04X   %-*s   %s\n" % (N, length * 3, hexa, s)
            N += length
            if (len(result) > limit):
                src = ""
                result += "(analysis limit reached after %i bytes)" % limit
        return result

    def changeThumbsFile(self):

        index = self.ui.thumbsFilesList.currentIndex()

        print index
        print len(self.availableThumbFiles)

        if (len(self.availableThumbFiles) > index):

            element = self.availableThumbFiles[index]
            self.frame_width = element[1]
            self.frame_height = element[2]
            self.frame_padding = element[3]
            self.filename = element[4]

            self.drawThumbs(self.start, self.number)

    def pageLeft(self):

        if (self.start == 0):
            return

        self.start = self.start - self.number

        if (self.start < 0):
            self.start = 0

        self.drawThumbs(self.start, self.number)

    def pageRight(self):

        self.start = self.start + self.number

        self.drawThumbs(self.start, self.number)

    def populateUI(self):

        thumbFiles = [["120x120.ithmb", 120, 120, 28],
                      ["158x158.ithmb", 160, 158, 28]]

        self.availableThumbFiles = []

        for file in thumbFiles:
            fileName = file[0]
            width = file[1]
            height = file[2]
            padding = file[3]

            searchFile = os.path.join(
                self.backup_path,
                plugins_utils.realFileName(self.cursor, filename=fileName))
            if (os.path.isfile(searchFile)):
                file.append(searchFile)
                self.availableThumbFiles.append(file)

        index = 0
        for file in self.availableThumbFiles:
            self.ui.thumbsFilesList.insertItem(index, file[0])
            index = index + 1

        if (len(self.availableThumbFiles) > 0):

            element = self.availableThumbFiles[0]
            self.frame_width = element[1]
            self.frame_height = element[2]
            self.frame_padding = element[3]
            self.filename = element[4]

            self.drawThumbs(self.start, self.number)

    def drawThumbs(self, start, number):

        self.ui.thumbsTable.clear()
        self.ui.thumbsTable.setRowCount(number)
        self.ui.thumbsTable.setColumnCount(2)

        # table header
        newItem = QtGui.QTableWidgetItem("Image")
        self.ui.thumbsTable.setHorizontalHeaderItem(0, newItem)
        newItem = QtGui.QTableWidgetItem("Padding data")
        self.ui.thumbsTable.setHorizontalHeaderItem(1, newItem)

        # read file
        f = open(self.filename, 'rb')
        wholefile = f.read()
        f.close()

        # calculate frames size and number
        framelen_image = self.frame_width * self.frame_height * 2
        framelen = framelen_image + self.frame_padding
        numframes = len(wholefile) / framelen

        # print table rows, one for each frame
        for i in range(start, start + number):

            if (len(wholefile) < framelen * (i + 1)):
                break

            # read frame data from whole file
            string = wholefile[framelen * i:framelen * (i + 1) -
                               self.frame_padding]
            padding = wholefile[framelen * (i + 1) -
                                self.frame_padding:framelen * (i + 1) - 1]

            #convert BGR15 to RGB32
            rgb32string = ""

            for pixelIndex in range(self.frame_width * self.frame_height):

                bgrPixelChars = string[pixelIndex * 2:pixelIndex * 2 + 2]
                bgrPixel = struct.unpack('H', bgrPixelChars)[0]

                fill = 0xFF
                b = (bgrPixel >> 10) & 0x1F
                g = (bgrPixel >> 5) & 0x1F
                r = bgrPixel & 0x1F

                rgb32string += "%c%c%c%c" % (r << 3, g << 3, b << 3, fill)

            # build image with RGB32 string
            qimg = QtGui.QImage(rgb32string, self.frame_width,
                                self.frame_height, QtGui.QImage.Format_RGB32)
            qpix = QtGui.QPixmap.fromImage(qimg).copy()
            qicon = QtGui.QIcon(qpix)

            # build the cells in the table row
            newItem = QtGui.QTableWidgetItem()
            newItem.setIcon(qicon)
            self.ui.thumbsTable.setItem(i - start, 0, newItem)

            thumbDescr = "Thumbnail index: %i\nPosition in file: 0x%x" % (
                i, framelen * i)
            thumbDescr += "\n\nPadding data:\n" + self.dump(padding)

            newItem = QtGui.QTableWidgetItem(thumbDescr)
            self.ui.thumbsTable.setItem(i - start, 1, newItem)

            self.ui.thumbsTable.setRowHeight(i - start, self.frame_height + 5)

        self.ui.thumbsTable.setIconSize(QtCore.QSize(200, 200))
        self.ui.thumbsTable.resizeColumnsToContents()
        self.ui.thumbsTable.horizontalHeader().setStretchLastSection(True)

        self.ui.descriptionLabel.setText(
            "Thumbs %i-%i of 0-%i" %
            (start, start + number - 1, numframes - 1))
class ThumbsBrowser(QtGui.QWidget):

	frame_width = 160#120
	frame_height = 158#120
	frame_padding = 28

	start = 0
	number = 30

	def __init__(self, cursor, path, daemon = False):
		QtGui.QWidget.__init__(self)
		
		self.ui = Ui_ThumbsBrowser()
		self.ui.setupUi(self)
		
		self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
		
		self.cursor = cursor
		self.backup_path = path
		
		#self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="120x120.ithmb"))
#		self.filename = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename="158x158.ithmb"))

		# check if files exist
#		if (not os.path.isfile(self.filename)):
#			raise Exception("Thumbnails file not found: \"%s\""%self.filename)
		
		if (daemon == False):
			self.populateUI()
			QtCore.QObject.connect(self.ui.thumbsFilesList, QtCore.SIGNAL("currentIndexChanged(int)"), self.changeThumbsFile)
			QtCore.QObject.connect(self.ui.buttonLeft, QtCore.SIGNAL("clicked()"), self.pageLeft)			
			QtCore.QObject.connect(self.ui.buttonRight, QtCore.SIGNAL("clicked()"), self.pageRight)			

	def dump(self, src, length=8, limit=10000):
		FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)])
		N=0; result=''
		while src:
			s,src = src[:length],src[length:]
			hexa = ' '.join(["%02X"%ord(x) for x in s])
			s = s.translate(FILTER)
			result += "%04X   %-*s   %s\n" % (N, length*3, hexa, s)
			N+=length
			if (len(result) > limit):
				src = "";
				result += "(analysis limit reached after %i bytes)"%limit
		return result
	

	def changeThumbsFile(self):
		
		index = self.ui.thumbsFilesList.currentIndex()
		
		print(index)
		print(len(self.availableThumbFiles))
		
		if (len(self.availableThumbFiles) > index):
		
			element = self.availableThumbFiles[index]
			self.frame_width = element[1]
			self.frame_height = element[2]
			self.frame_padding = element[3]
			self.filename = element[4]
	
			self.drawThumbs(self.start, self.number)

	def pageLeft(self):
		
		if (self.start == 0):
			return
	
		self.start = self.start - self.number
		
		if (self.start < 0):
			self.start = 0
		
		self.drawThumbs(self.start, self.number)

	def pageRight(self):
	
		self.start = self.start + self.number

		self.drawThumbs(self.start, self.number)

	def populateUI(self):
	
		thumbFiles = [
			["120x120.ithmb", 120, 120, 28],
			["158x158.ithmb", 160, 158, 28]
		]
		
		self.availableThumbFiles = []
		
		for file in thumbFiles:
			fileName = file[0]
			width = file[1]
			height = file[2]
			padding = file[3]
			
			searchFile = os.path.join(self.backup_path, plugins_utils.realFileName(self.cursor, filename=fileName))
			if (os.path.isfile(searchFile)):
				file.append(searchFile)
				self.availableThumbFiles.append(file)
		
		index = 0
		for file in self.availableThumbFiles:
			self.ui.thumbsFilesList.insertItem(index, file[0])
			index = index + 1
		
		if (len(self.availableThumbFiles) > 0):
		
			element = self.availableThumbFiles[0]
			self.frame_width = element[1]
			self.frame_height = element[2]
			self.frame_padding = element[3]
			self.filename = element[4]
	
			self.drawThumbs(self.start, self.number)
	
	def drawThumbs(self, start, number):

		self.ui.thumbsTable.clear()
		self.ui.thumbsTable.setRowCount(number)
		self.ui.thumbsTable.setColumnCount(2)
		
		# table header
		newItem = QtGui.QTableWidgetItem("Image")
		self.ui.thumbsTable.setHorizontalHeaderItem(0, newItem)
		newItem = QtGui.QTableWidgetItem("Padding data")
		self.ui.thumbsTable.setHorizontalHeaderItem(1, newItem)
		
		# read file
		f = open(self.filename, 'rb')
		wholefile = f.read()
		f.close()

		# calculate frames size and number
		framelen_image = self.frame_width * self.frame_height *2
		framelen = framelen_image + self.frame_padding
		numframes = len(wholefile) / framelen
		
		# print table rows, one for each frame
		for i in range(start, start + number):
		
			if (len(wholefile) < framelen*(i+1)):
				break
		
			# read frame data from whole file
			string = wholefile[framelen*i : framelen*(i+1) - self.frame_padding]		
			padding = wholefile[framelen*(i+1) - self.frame_padding : framelen*(i+1)-1]
			
			#convert BGR15 to RGB32
			rgb32string = ""
			
			for pixelIndex in range(self.frame_width * self.frame_height):
				
				bgrPixelChars = string[pixelIndex*2:pixelIndex*2+2]				
				bgrPixel = struct.unpack('H', bgrPixelChars)[0]
				
				fill = 0xFF
				b = (bgrPixel >> 10) & 0x1F
				g = (bgrPixel >> 5) & 0x1F
				r = bgrPixel & 0x1F
				
				rgb32string += "%c%c%c%c"%(r<<3, g<<3, b<<3, fill)
			
			# build image with RGB32 string
			qimg = QtGui.QImage(rgb32string, self.frame_width, self.frame_height, QtGui.QImage.Format_RGB32)
			qpix = QtGui.QPixmap.fromImage(qimg).copy()
			qicon = QtGui.QIcon(qpix)
			
			# build the cells in the table row			
			newItem = QtGui.QTableWidgetItem()
			newItem.setIcon(qicon)
			self.ui.thumbsTable.setItem(i-start, 0, newItem)
			
			thumbDescr = "Thumbnail index: %i\nPosition in file: 0x%x"%(i, framelen*i)
			thumbDescr += "\n\nPadding data:\n" + self.dump(padding)

			newItem = QtGui.QTableWidgetItem(thumbDescr)
			self.ui.thumbsTable.setItem(i-start, 1, newItem)
			
			self.ui.thumbsTable.setRowHeight(i-start, self.frame_height + 5)
			
		self.ui.thumbsTable.setIconSize(QtCore.QSize(200,200))
		self.ui.thumbsTable.resizeColumnsToContents()		
		self.ui.thumbsTable.horizontalHeader().setStretchLastSection(True)
		
		self.ui.descriptionLabel.setText("Thumbs %i-%i of 0-%i"%(start, start + number - 1, numframes-1))