コード例 #1
0
ファイル: videothumbnailviewer.py プロジェクト: kzwkt/dff
  def g_display(self):
    QWidget.__init__(self)
    self.hlayout = QHBoxLayout()
    self.scrollArea = QScrollArea()
    self.scrollWidget = QWidget()
    self.hhlayout = QHBoxLayout()
    self.scrollWidget.setLayout(self.hhlayout)
    self.setLayout(self.hlayout)
    self.thumbnailer = Thumbnailer()
    self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"), self.updateThumbnail)

    pixmap = self.thumbnailer.generate(self.node, iconSize = 256, frames = 10)
    if pixmap:
	self.updateThumbnail(self.node, pixmap)
コード例 #2
0
ファイル: videothumbnailviewer.py プロジェクト: kzwkt/dff
class ThumbnailVideoView(QWidget, Script):
  def __init__(self):
    Script.__init__(self, "thumbnailvideo")
    self.icon = None
    self.vfs = vfs.vfs()

  def start(self, args):
    try :
      self.preview = args["preview"].value()
    except IndexError:
      self.preview = False
    try:
      self.node = args["file"].value()
    except KeyError:
      pass

  def g_display(self):
    QWidget.__init__(self)
    self.hlayout = QHBoxLayout()
    self.scrollArea = QScrollArea()
    self.scrollWidget = QWidget()
    self.hhlayout = QHBoxLayout()
    self.scrollWidget.setLayout(self.hhlayout)
    self.setLayout(self.hlayout)
    self.thumbnailer = Thumbnailer()
    self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"), self.updateThumbnail)

    pixmap = self.thumbnailer.generate(self.node, iconSize = 256, frames = 10)
    if pixmap:
	self.updateThumbnail(self.node, pixmap)


  def updateThumbnail(self, node, pixmap):
     if pixmap:
       label = QLabel()
       label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
       label.setWordWrap(True)
       label.setPixmap(pixmap)
     else:
       label = QLabel("Can't render, video is corrupted.")
       label.setAlignment(Qt.AlignCenter)
     self.hhlayout.addWidget(label)
     self.scrollArea.setWidget(self.scrollWidget)
     self.hlayout.addWidget(self.scrollArea)
     self.thumbnailer.unregister()

  def updateWidget(self):
     pass
コード例 #3
0
 def __init__(self, selection):
     QAbstractItemModel.__init__(self)
     self.__list = []
     self.__rows = []
     self.__current_row = 0
     self.__row_selected = 0
     self.__thumb = True
     self.__visible_rows = 0
     self.__visible_cols = 0
     self.selection = selection
     self.setDefaultAttributes()
     self.connectSignals()
     self.thumbnailer = Thumbnailer()
     self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"),
                  self.thumbnailUpdate)
     self.headerorder = {0: 0}
コード例 #4
0
ファイル: node_list.py プロジェクト: arxsys/dff-api
 def __init__(self, selection):
   QAbstractItemModel.__init__(self)
   self.__list = []
   self.__rows = []
   self.__current_row = 0
   self.__row_selected = 0
   self.__thumb = True
   self.__visible_rows = 0
   self.__visible_cols = 0
   self.selection = selection
   self.setDefaultAttributes()
   self.connectSignals()
   self.thumbnailer = Thumbnailer()
   self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"), self.thumbnailUpdate)
   self.headerorder = {0:0}
コード例 #5
0
class NodeListModel(QAbstractItemModel):
    def __init__(self, selection):
        QAbstractItemModel.__init__(self)
        self.__list = []
        self.__rows = []
        self.__current_row = 0
        self.__row_selected = 0
        self.__thumb = True
        self.__visible_rows = 0
        self.__visible_cols = 0
        self.selection = selection
        self.setDefaultAttributes()
        self.connectSignals()
        self.thumbnailer = Thumbnailer()
        self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"),
                     self.thumbnailUpdate)
        self.headerorder = {0: 0}

    def thumbnailUpdate(self, node, pixmap):
        currentRow = self.currentRow()
        visibleRow = self.visibleRows()
        nodeList = self.list()
        currentList = nodeList[currentRow:currentRow + visibleRow]
        index = 0
        for cnode in currentList:
            if str(long(node.this)) == str(long(cnode.this)):
                modelIndex = self.index(index, 0)
                self.emit(SIGNAL("dataChanged"), modelIndex, modelIndex)
            index += 1

    def connectSignals(self):
        self.connect(self, SIGNAL("appendList"), self.appendList)
        self.connect(self, SIGNAL("changeList"), self.changeList)

    def setData(self, index, value, role):
        """
    \reimp

    Set the data which value is `value` at index `index` with role `role`.

    \return `True` if no error occured, `False` otherwise.
    """
        if not index.isValid():
            return QVariant()
        column = index.column()
        if role == Qt.CheckStateRole:
            if column == HNAME:
                node = self.VFS.getNodeFromPointer(index.internalId())
                if value == Qt.Unchecked:
                    if (long(node.this), 1) in self.checkedNodes:
                        self.checkedNodes.remove((long(node.this), 1))
                else:
                    self.checkedNodes.add((long(node.this), 1))
        QAbstractItemModel.setData(self, index, value, role)
        return True

    def changeList(self, nodelist):
        """ Reset current list and set an existing node list to the model"""
        if nodelist != None:
            self.__list = []
            self.row_selected = 0
            self.__current_row = 0
            try:
                self.__list = nodelist
            except:
                print "Error while setting new node List"
            # Sort list and refresh it
            self.sort(self.headerorder.keys()[0],
                      self.headerorder[self.headerorder.keys()[0]])
            self.emit(SIGNAL("maximum"), len(self.__list))
            self.select(self.__current_row)

    def appendList(self, node):
        """
    Append a new node to the existing model's list and emit an appended signal with the new size.
    """
        if node != None:
            try:
                self.__list.append(node)
                self.emit(SIGNAL("nodeAppended"))
                self.emit(SIGNAL("maximum"), len(self.__list))
                self.refresh(self.__current_row)
            except:
                print "Error while appending node"
                return

    def defaultAttributes(self):
        return self.__default_attributes

    def clearList(self):
        self.__list = []
        self.__current_row = 0
        self.refresh(self.__current_row)

    def columnCount(self, index):
        attrs = self.availableAttributes()
        return len(attrs)

    def data(self, index, role):
        attributes = self.availableAttributes()
        if not index.isValid():
            return QVariant()
        if index.row() > len(self.__list) or index.row() < 0:
            return QVariant()
        try:
            node = self.__rows[index.row()]
        except:
            return QVariant()
        if role == Qt.DisplayRole:
            attrpath = str(unicode(attributes[index.column()]).encode('utf-8'))
            if attrpath == "name":
                return QVariant(QString.fromUtf8(node.name()))
            elif attrpath == "size":
                return QVariant(node.size())
            elif attrpath == "extension":
                return QVariant(QString.fromUtf8(node.extension()))
            elif attrpath == "path":
                if isinstance(node, VLink):
                    return QVariant(QString.fromUtf8(node.linkPath()))
                else:
                    return QVariant(QString.fromUtf8(node.path()))
            elif attrpath == "absolute":
                if isinstance(node, VLink):
                    return QVariant(QString.fromUtf8(node.linkAbsolute()))
                else:
                    return QVariant(QString.fromUtf8(node.absolute()))
            elif attrpath == "module":
                if node.fsobj():
                    return QVariant(QString.fromUtf8(node.fsobj().name))
                return QVariant()
            elif attrpath == "has children":
                if isinstance(node, VLink):
                    return QVariant(node.linkHasChildren())
                else:
                    return QVariant(node.hasChildren())
            elif attrpath == "child count":
                if isinstance(node, VLink):
                    return QVariant(node.linkChildCount())
                else:
                    return QVariant(node.childCount())
            elif attrpath == "is deleted":
                return QVariant(node.isDeleted())

            else:
                try:
                    val = node.attributesByName(attrpath, ABSOLUTE_ATTR_NAME)
                except Exception as e:
                    print "NodeListModel data can't get attribute " + attrpath + " by name " + str(
                        e)
                    return QVariant()
                if len(val) == 1:
                    if val[0].type() == typeId.VTime:
                        vtime = val[0].value()
                        if vtime:
                            return QVariant(str(vtime.get_time()))
                    elif val[0].type() == typeId.String:
                        return QVariant(QString.fromUtf8(val[0].value()))
                    else:
                        return QVariant(val[0].value())

        if role == Qt.ToolTipRole:
            return QVariant(QString.fromUtf8(node.name()))

        # Display icons
        if (role == Qt.DecorationRole) and (attributes[index.column()]
                                            == "name"):
            pixmap = None
            if self.__thumb:
                if self.thumbnailer.isThumbnailable(node):
                    pixmap = self.thumbnailer.generate(node)
                    if not pixmap:
                        pixmap = QPixmap(":file_temporary.png")
            if not pixmap:
                pixmap = self.getIconPixmap(node)
                if not pixmap:
                    pixmap = QPixmap(node.icon())

                if isinstance(node, VLink):
                    pixmap = pixmap.scaled(QSize(128, 128), Qt.KeepAspectRatio)
                    painter = QPainter(pixmap)
                    linkPixmap = QPixmap(":vlink")
                    painter.drawPixmap(0, 0, linkPixmap)
                    painter.end()

                elif node.hasChildren():
                    try:
                        pfsobj = node.children()[0].fsobj().this
                    except AttributeError:
                        pfsobj = None
                    try:
                        nfsobj = node.fsobj().this
                    except AttributeError:
                        nfsobj = None
                    if pfsobj != nfsobj:
                        pixmap = pixmap.scaled(QSize(128, 128),
                                               Qt.KeepAspectRatio)
                        painter = QPainter(pixmap)
                        rootPixmap = QPixmap(":root")
                        painter.drawPixmap(0, 0, rootPixmap)
                        painter.end()

            return QVariant(QIcon(pixmap))

        if role == Qt.BackgroundRole:
            if index.row() == self.activeSelection():
                palette = QPalette().color(QPalette.Highlight)
                return QVariant(QColor(palette))
        if role == Qt.ForegroundRole:
            if index.row() == self.activeSelection():
                palette = QPalette().color(QPalette.HighlightedText)
                return QVariant(QColor(palette))
            if node.isDeleted():
                return QVariant(QColor(Qt.red))

        if (role == Qt.CheckStateRole) and (attributes[index.column()]
                                            == "name"):
            if long(node.this) in self.selection.get():
                return Qt.Checked
            else:
                return Qt.Unchecked
        return QVariant()

    def setThumb(self, state):
        self.__thumb = state

    def getIconPixmap(self, node):
        ext = self.getExtension(node)
        if ext != None:
            if ext in IMAGES:
                return QPixmap(":image.png")
            elif ext in AUDIO:
                return QPixmap(":sound.png")
            elif ext == "pdf":
                return QPixmap(":pdf.png")
            elif ext in DOCUMENT:
                return QPixmap(":document.png")
            elif ext in VIDEO:
                return QPixmap(":video.png")
            elif ext in ARCHIVES:
                return QPixmap(":zip")
            elif ext in SPREADSHEET:
                return QPixmap(":spreadsheet.png")
            else:
                return None

    def getExtension(self, node):
        name = node.name()
        sext = name.split(".")
        if len(sext) > 1:
            return sext[len(sext) - 1]
        else:
            return None

    def getNode(self, row):
        try:
            node = self.__list[row]
            if node:
                return node
            else:
                return None
        except IndexError:
            return None

    def index(self, row, column, parent=QModelIndex()):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()
        if not parent.isValid():
            index = self.createIndex(row, column, self.__rows[row])
            return index
        return QModelIndex()

    def parent(self, index):
        return QModelIndex()

    def refresh(self, start):
        llist = len(self.__list)
        if start < 0:
            rstart = 0
        elif (start >= llist):
            # End of list
            rstart = llist - (self.__visible_rows)
            if rstart < 0:
                rstart = 0
        # elif ((llist - start) <= self.__visible_rows + 1):
        #   rstart = self.__current_row
        #   if rstart < 0:
        #     rstart = 0
        else:
            rstart = start

        # End of List range
        if (rstart + self.__visible_rows) > len(self.__list):
            end = len(self.__list)
        else:
            end = rstart + self.__visible_rows + 1
        self.resetDisplay()
        try:
            tmplist = self.__list[rstart:end]
        except IndexError:
            return
        try:
            for nodeId in range(0, len(tmplist)):
                if tmplist[nodeId] != None:
                    self.__rows.append(tmplist[nodeId])
            self.emit(SIGNAL("layoutAboutToBeChanged()"))
            self.emit(SIGNAL("layoutChanged()"))

            if self.__current_row >= 0:
                self.__current_row = rstart
            else:
                self.__current_row = 0
            self.emit(SIGNAL("current"), self.__current_row)
        except IndexError:
            print "Error while refreshing model"
            pass

    def resetDisplay(self):
        if len(self.__rows) > 0:
            self.__rows = []
            self.emit(SIGNAL("layoutAboutToBeChanged()"))
            self.emit(SIGNAL("layoutChanged()"))

    def rowCount(self, parent=None):
        return len(self.__rows)

    def currentRow(self):
        return self.__current_row

    def size(self):
        return len(self.__list)

    def setVisibleRows(self, rows):
        self.__visible_rows = rows
        self.emit(SIGNAL("maximum"), len(self.__list))
        if self.__visible_rows > self.size():
            self.emit(SIGNAL("hideScroll"))
        self.refresh(self.__current_row)

    def visibleRows(self):
        return self.__visible_rows

    def seek(self, position, where=0):
        if where == 0:
            self.refresh(position)
        elif where == 1:
            pos = self.__current_row + position
            self.refresh(pos)
        else:
            self.refresh(self.__current_row)

    def select(self, row):
        """
    Set absolute selected row id in model's list
    """
        absrow = self.__current_row + row
        try:
            node = self.__list[absrow]
            self.__row_selected = absrow
            self.refresh(self.__current_row)
            self.emit(SIGNAL("nodeListClicked"), Qt.NoButton)
            return True
        except:
            return False

    def activeSelection(self):
        """
    Return relative selected row id
    """
        return self.__row_selected - self.__current_row

    def currentNode(self):
        try:
            node = self.__list[self.__row_selected]
            if node != None:
                return node
            else:
                return None
        except:
            return None

    def nodeSelected(self):
        nodes = []
        nodes.append(self.__list[self.__row_selected])
        return nodes

    def setDefaultAttributes(self):
        self.__default_attributes = [
            "name", "size", "tags", "path", "extension", "absolute", "module",
            "has children", "child count", "is deleted"
        ]
        self.setSelectedAttributes(["name", "size", "tags", "path"])

    def setSelectedAttributes(self, attributes):
        self.__selected_attributes = attributes
        self.refresh(self.__current_row)

    def selectedAttributes(self):
        return self.__selected_attributes

    def availableAttributes(self):
        attrs = self.selectedAttributes()[:]
        return attrs

    def setHeaderData(self, section, orientation, value, role):
        self.emit(SIGNAL("layoutAboutToBeChanged()"))
        QAbstractItemModel.setHeaderData(self, section, orientation, value,
                                         role)
        self.emit(SIGNAL("layoutChanged()"))

    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if role != Qt.DisplayRole:
            return QVariant()
        if orientation == Qt.Horizontal:
            attrs = self.availableAttributes()
            return QVariant(attrs[section])

    def sort(self, column, order):
        """
    Sort model's list and check.
    """
        self.headerorder.clear()
        self.headerorder[column] = order
        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
        if order == Qt.DescendingOrder:
            Reverse = True
        else:
            Reverse = False
        attrs = self.availableAttributes()
        try:
            attrpath = str(unicode(attrs[column]).encode('utf-8'))
        except IndexError:
            QApplication.restoreOverrideCursor()
            self.headerorder.clear()
            self.headerorder = {0: 0}
            self.refresh(0)
            self.select(0)
            return

        if isinstance(self.__list, VecNode):
            tmplist = []
            for i in range(0, len(self.__list)):
                tmplist.append(self.__list[i])
            self.__list = tmplist
        if attrpath in self.__default_attributes:
            if attrpath == "name":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.name(),
                                     reverse=Reverse)
            elif attrpath == "size":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.size(),
                                     reverse=Reverse)
            elif attrpath == "extension":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.extension(),
                                     reverse=Reverse)
            elif attrpath == "path":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.path(),
                                     reverse=Reverse)
            elif attrpath == "absolute":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.absolute(),
                                     reverse=Reverse)
            elif attrpath == "module":
                self.__list = sorted(self.__list,
                                     cmp=self.cmp_fsobj,
                                     key=lambda Node: Node.fsobj(),
                                     reverse=Reverse)
            elif attrpath == "has children":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.hasChildren(),
                                     reverse=Reverse)
            elif attrpath == "child count":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.childCount(),
                                     reverse=Reverse)
            elif attrpath == "is deleted":
                self.__list = sorted(self.__list,
                                     key=lambda Node: Node.isDeleted(),
                                     reverse=Reverse)
            elif attrpath == "tags":
                self.__list = sorted(self.__list,
                                     key=lambda Node: len(Node.tags()),
                                     reverse=Reverse)
        else:
            self.__list = sorted(self.__list,
                                 cmp=self.cmp_none,
                                 key=lambda Node: self.attributesByName(
                                     Node, attrpath, ABSOLUTE_ATTR_NAME),
                                 reverse=Reverse)
        QApplication.restoreOverrideCursor()
        self.refresh(0)
        self.select(0)
        return

    def cmp_fsobj(self, x, y):
        try:
            return cmp(x.name, y.name)
        except AttributeError:
            if x == y == None:
                return 0
            elif x == None:
                return -1
            elif y is None:
                return 1

    def cmp_none(self, x, y):
        try:
            return cmp(x, y)
        except TypeError:
            if x == y == None:
                return 0
            elif x == None:
                return -1
            elif y is None:
                return 1

    def attributesByName(self, node, attrpath, ABSOLUTE_ATTR_NAME):
        val = node.attributesByName(attrpath, ABSOLUTE_ATTR_NAME)
        if len(val) == 1:
            if val[0].type() == typeId.VTime:
                vtime = val[0].value()
                if vtime:
                    return vtime.get_time()
            else:
                return val[0].value()

    def list(self):
        return self.__list

    def allListChecked(self):
        checked = self.selection.get()
        for node in self.__list:
            if not long(node.this) in checked:
                return False
        return True

    def selectAll(self):
        for node in self.__list:
            self.selection.add(node)

    def unselectAll(self):
        for node in self.__list:
            self.selection.rm(node)
コード例 #6
0
ファイル: node_list.py プロジェクト: arxsys/dff-api
class NodeListModel(QAbstractItemModel):
  def __init__(self, selection):
    QAbstractItemModel.__init__(self)
    self.__list = []
    self.__rows = []
    self.__current_row = 0
    self.__row_selected = 0
    self.__thumb = True
    self.__visible_rows = 0
    self.__visible_cols = 0
    self.selection = selection
    self.setDefaultAttributes()
    self.connectSignals()
    self.thumbnailer = Thumbnailer()
    self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"), self.thumbnailUpdate)
    self.headerorder = {0:0}

  def thumbnailUpdate(self, node, pixmap):
     currentRow = self.currentRow()
     visibleRow = self.visibleRows()
     nodeList = self.list()
     currentList = nodeList[currentRow:currentRow + visibleRow]
     index = 0
     for cnode in currentList:
         if str(long(node.this)) == str(long(cnode.this)):
	   modelIndex = self.index(index, 0)
           self.emit(SIGNAL("dataChanged"), modelIndex, modelIndex)
         index += 1

  def connectSignals(self):
    self.connect(self, SIGNAL("appendList"), self.appendList)
    self.connect(self, SIGNAL("changeList"), self.changeList)

  def setData(self, index, value, role):
    """
    \reimp

    Set the data which value is `value` at index `index` with role `role`.

    \return `True` if no error occured, `False` otherwise.
    """
    if not index.isValid():
      return QVariant()
    column = index.column()
    if role == Qt.CheckStateRole:
      if column == HNAME:
        node = self.VFS.getNodeFromPointer(index.internalId())
        if value == Qt.Unchecked:
          if (long(node.this), 1) in self.checkedNodes:
            self.checkedNodes.remove((long(node.this), 1))
        else:
          self.checkedNodes.add((long(node.this) , 1))
    QAbstractItemModel.setData(self, index, value, role)
    return True

  def changeList(self, nodelist):
    """ Reset current list and set an existing node list to the model"""
    if nodelist != None:
      self.__list = []
      self.row_selected = 0
      self.__current_row = 0
      try:
          self.__list = nodelist
      except:
        print "Error while setting new node List"
      # Sort list and refresh it 
      self.sort(self.headerorder.keys()[0], self.headerorder[self.headerorder.keys()[0]])
      self.emit(SIGNAL("maximum"), len(self.__list))
      self.select(self.__current_row)
        
  def appendList(self, node):
    """
    Append a new node to the existing model's list and emit an appended signal with the new size.
    """
    if node != None:
      try:
        self.__list.append(node)
        self.emit(SIGNAL("nodeAppended"))
        self.emit(SIGNAL("maximum"), len(self.__list))
        self.refresh(self.__current_row)
      except:
        print "Error while appending node"
        return

  def defaultAttributes(self):
    return self.__default_attributes

  def clearList(self):
    self.__list = []
    self.__current_row = 0
    self.refresh(self.__current_row)

  def columnCount(self, index):
    attrs = self.availableAttributes()
    return len(attrs)

  def data(self, index, role):
    attributes = self.availableAttributes()
    if not index.isValid():
      return QVariant()
    if index.row() > len(self.__list) or index.row() < 0:
      return QVariant()
    try:
      node = self.__rows[index.row()]
    except:
      return QVariant()
    if role == Qt.DisplayRole :
      attrpath = str(unicode(attributes[index.column()]).encode('utf-8'))
      if attrpath == "name":
          return QVariant(QString.fromUtf8(node.name()))
      elif attrpath == "size":
          return QVariant(node.size())
      elif attrpath == "extension":
          return QVariant(QString.fromUtf8(node.extension()))
      elif attrpath == "path":
          if isinstance(node, VLink):
            return QVariant(QString.fromUtf8(node.linkPath()))
          else:
            return QVariant(QString.fromUtf8(node.path()))
      elif attrpath == "absolute":
          if isinstance(node, VLink):
            return QVariant(QString.fromUtf8(node.linkAbsolute()))
          else:
           return QVariant(QString.fromUtf8(node.absolute()))
      elif attrpath == "module":
	  if node.fsobj():
            return QVariant(QString.fromUtf8(node.fsobj().name))
          return QVariant()
      elif attrpath == "has children":
          if isinstance(node, VLink):
            return QVariant(node.linkHasChildren())
          else:
            return QVariant(node.hasChildren())
      elif attrpath == "child count":
          if isinstance(node, VLink):
            return QVariant(node.linkChildCount())
          else:
            return QVariant(node.childCount())
      elif attrpath == "is deleted":
          return QVariant(node.isDeleted())
	
      else:
	try :
          val = node.attributesByName(attrpath, ABSOLUTE_ATTR_NAME)
	except Exception as e:
	   print "NodeListModel data can't get attribute " + attrpath + " by name " + str(e)
	   return QVariant()
        if len(val) == 1:
          if val[0].type() == typeId.VTime:
            vtime = val[0].value()
            if vtime:
              return QVariant(str(vtime.get_time()))
          elif val[0].type() == typeId.String:
            return QVariant(QString.fromUtf8(val[0].value()))
          else:
            return QVariant(val[0].value())

    if role == Qt.ToolTipRole :
      return QVariant(QString.fromUtf8(node.name()))

    # Display icons
    if (role == Qt.DecorationRole) and (attributes[index.column()] == "name"):
      pixmap = None
      if self.__thumb:
	if self.thumbnailer.isThumbnailable(node):
	  pixmap = self.thumbnailer.generate(node)
          if not pixmap:
	    pixmap = QPixmap(":file_temporary.png")
      if not pixmap:
        pixmap = self.getIconPixmap(node)
        if not pixmap:
          pixmap = QPixmap(node.icon())
        
        if isinstance(node, VLink):
          pixmap = pixmap.scaled(QSize(128, 128), Qt.KeepAspectRatio)
          painter = QPainter(pixmap)
          linkPixmap = QPixmap(":vlink") 
          painter.drawPixmap(0, 0, linkPixmap)
          painter.end()

	elif node.hasChildren():
          try:
            pfsobj = node.children()[0].fsobj().this
          except AttributeError:
  	    pfsobj = None
          try:
            nfsobj = node.fsobj().this
          except AttributeError:
	    nfsobj = None
          if pfsobj != nfsobj:
            pixmap = pixmap.scaled(QSize(128, 128), Qt.KeepAspectRatio)
            painter = QPainter(pixmap)
            rootPixmap = QPixmap(":root")
            painter.drawPixmap(0, 0, rootPixmap)
            painter.end()

      return QVariant(QIcon(pixmap))
	
    if role == Qt.BackgroundRole:
      if index.row() == self.activeSelection():
        palette = QPalette().color(QPalette.Highlight)
        return QVariant(QColor(palette))
    if role == Qt.ForegroundRole:
      if index.row() == self.activeSelection():
        palette = QPalette().color(QPalette.HighlightedText)
        return QVariant(QColor(palette))
      if node.isDeleted():
        return  QVariant(QColor(Qt.red))

    if (role == Qt.CheckStateRole) and (attributes[index.column()] == "name"):
      if long(node.this) in self.selection.get():
        return Qt.Checked
      else:
        return Qt.Unchecked
    return QVariant()

  def setThumb(self, state):
    self.__thumb = state

  def getIconPixmap(self, node):
    ext = self.getExtension(node)
    if ext != None:
      if ext in IMAGES:
        return QPixmap(":image.png")
      elif ext in AUDIO:
        return QPixmap(":sound.png")
      elif ext == "pdf":
        return QPixmap(":pdf.png")
      elif ext in DOCUMENT:
        return QPixmap(":document.png")
      elif ext in VIDEO:
        return QPixmap(":video.png")
      elif ext in ARCHIVES:
        return QPixmap(":zip")
      elif ext in SPREADSHEET:
        return QPixmap(":spreadsheet.png")
      else:
        return None

  def getExtension(self, node):
    name = node.name()
    sext = name.split(".")
    if len(sext) > 1:
      return sext[len(sext) - 1]
    else:
      return None

  def getNode(self, row):
    try:
      node = self.__list[row]
      if node:
        return node
      else:
        return None
    except IndexError:
      return None

  def index(self, row, column, parent = QModelIndex()):
    if not self.hasIndex(row, column, parent):
     return QModelIndex()
    if not parent.isValid():
      index = self.createIndex(row, column, self.__rows[row])
      return index
    return QModelIndex()

  def parent(self, index):
    return QModelIndex()

  def refresh(self, start):
    llist = len(self.__list)
    if start < 0:
      rstart = 0
    elif (start >= llist):
      # End of list
      rstart = llist - (self.__visible_rows)
      if rstart < 0:
        rstart = 0
    # elif ((llist - start) <= self.__visible_rows + 1):
    #   rstart = self.__current_row
    #   if rstart < 0:
    #     rstart = 0
    else:
      rstart = start

    # End of List range
    if (rstart + self.__visible_rows) > len(self.__list):
      end = len(self.__list)
    else:
      end = rstart + self.__visible_rows + 1
    self.resetDisplay()
    try:
      tmplist = self.__list[rstart:end]
    except IndexError:
      return
    try:
      for nodeId in range(0, len(tmplist)):
        if tmplist[nodeId] != None:
          self.__rows.append(tmplist[nodeId])
      self.emit(SIGNAL("layoutAboutToBeChanged()"))
      self.emit(SIGNAL("layoutChanged()"))

      if self.__current_row >= 0:
        self.__current_row = rstart
      else:
        self.__current_row = 0
      self.emit(SIGNAL("current"), self.__current_row)
    except IndexError:
      print "Error while refreshing model"
      pass

  def resetDisplay(self):
    if len(self.__rows) > 0:
      self.__rows = []
      self.emit(SIGNAL("layoutAboutToBeChanged()"))
      self.emit(SIGNAL("layoutChanged()"))

  def rowCount(self, parent = None):
    return len(self.__rows)

  def currentRow(self):
    return self.__current_row

  def size(self):
    return len(self.__list)

  def setVisibleRows(self, rows):
    self.__visible_rows = rows
    self.emit(SIGNAL("maximum"), len(self.__list))
    if self.__visible_rows > self.size():
      self.emit(SIGNAL("hideScroll"))
    self.refresh(self.__current_row)


  def visibleRows(self):
    return self.__visible_rows

  def seek(self, position, where = 0):
    if where == 0:
      self.refresh(position)
    elif where == 1:
      pos = self.__current_row + position
      self.refresh(pos)
    else:
      self.refresh(self.__current_row)

  def select(self, row):
    """
    Set absolute selected row id in model's list
    """
    absrow = self.__current_row + row
    try:
      node = self.__list[absrow]
      self.__row_selected = absrow
      self.refresh(self.__current_row)
      self.emit(SIGNAL("nodeListClicked"), Qt.NoButton)
      return True
    except:
      return False

  def activeSelection(self):
    """
    Return relative selected row id
    """
    return self.__row_selected - self.__current_row

  def currentNode(self):
    try:
      node = self.__list[self.__row_selected]
      if node != None:
        return node
      else:
        return None
    except:
      return None

  def nodeSelected(self):
    nodes = []
    nodes.append(self.__list[self.__row_selected])
    return nodes

  def setDefaultAttributes(self):
    self.__default_attributes = ["name", "size","tags", "path", "extension", "absolute", "module", "has children", "child count", "is deleted"]
    self.setSelectedAttributes(["name", "size", "tags", "path"])

  def setSelectedAttributes(self, attributes):
    self.__selected_attributes = attributes
    self.refresh(self.__current_row)

  def selectedAttributes(self):
    return self.__selected_attributes

  def availableAttributes(self):
    attrs = self.selectedAttributes()[:]
    return attrs

  def setHeaderData(self, section, orientation, value, role):
    self.emit(SIGNAL("layoutAboutToBeChanged()"))
    QAbstractItemModel.setHeaderData(self, section, orientation, value, role)
    self.emit(SIGNAL("layoutChanged()"))

  def headerData(self, section, orientation, role=Qt.DisplayRole):
    if role != Qt.DisplayRole:
      return QVariant()
    if orientation == Qt.Horizontal:
      attrs = self.availableAttributes()
      return QVariant(attrs[section])

  def sort(self, column, order):
    """
    Sort model's list and check.
    """
    self.headerorder.clear()
    self.headerorder[column] = order
    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
    if order == Qt.DescendingOrder:
      Reverse = True
    else:
      Reverse = False
    attrs = self.availableAttributes()
    try:
      attrpath = str(unicode(attrs[column]).encode('utf-8'))
    except IndexError:
      QApplication.restoreOverrideCursor()
      self.headerorder.clear()
      self.headerorder = {0:0}
      self.refresh(0)
      self.select(0)
      return

    if isinstance(self.__list, VecNode):
      tmplist = []
      for i in range(0, len(self.__list)):
        tmplist.append(self.__list[i])
      self.__list = tmplist
    if attrpath in self.__default_attributes:
      if attrpath == "name":
        self.__list = sorted(self.__list,
                           key=lambda Node: Node.name(), 
                           reverse=Reverse)
      elif attrpath == "size":
        self.__list = sorted(self.__list, 
                           key=lambda Node: Node.size(),
                           reverse=Reverse)
      elif attrpath == "extension":
        self.__list = sorted(self.__list, 
                           key=lambda Node: Node.extension(),
                           reverse=Reverse)
      elif attrpath == "path":
        self.__list = sorted(self.__list, 
                           key=lambda Node: Node.path(),
                           reverse=Reverse)
      elif attrpath == "absolute":
 	self.__list = sorted(self.__list,
			     key=lambda Node: Node.absolute(),
			     reverse=Reverse)
      elif attrpath == "module":
	self.__list = sorted(self.__list, cmp=self.cmp_fsobj, 
			    key=lambda Node: Node.fsobj(),
			    reverse=Reverse)
      elif attrpath == "has children":
	self.__list = sorted(self.__list, key=lambda Node: Node.hasChildren(), reverse=Reverse)
      elif attrpath == "child count":
	self.__list = sorted(self.__list, key=lambda Node: Node.childCount(), reverse=Reverse)
      elif attrpath == "is deleted": 
	self.__list = sorted(self.__list, key=lambda Node: Node.isDeleted(), reverse=Reverse)
      elif attrpath == "tags":
        self.__list = sorted(self.__list,
                             key=lambda Node: len(Node.tags()),
                             reverse=Reverse)
    else:
        self.__list = sorted(self.__list,
                             cmp=self.cmp_none, key=lambda Node: self.attributesByName(Node, attrpath, ABSOLUTE_ATTR_NAME),
                             reverse=Reverse)
    QApplication.restoreOverrideCursor()
    self.refresh(0)
    self.select(0)
    return

  def cmp_fsobj(self, x, y):
     try:
	return cmp(x.name, y.name)
     except AttributeError:
        if x == y == None:
	  return 0
        elif x == None:
	  return -1
	elif y is None:
	  return 1

  def cmp_none(self,x, y):
     try:
	return cmp(x, y)
     except TypeError: 
	if x == y == None:
	  return 0
        elif x == None:
	  return -1
	elif y is None:
	  return 1

  def attributesByName(self, node, attrpath, ABSOLUTE_ATTR_NAME):
      val = node.attributesByName(attrpath, ABSOLUTE_ATTR_NAME)
      if len(val) == 1:
        if val[0].type() == typeId.VTime:
            vtime = val[0].value()
            if vtime:
              return vtime.get_time()
        else:
            return val[0].value()

  def list(self):
    return self.__list

  def allListChecked(self):
    checked = self.selection.get()
    for node in self.__list:
      if not long(node.this) in checked:
        return False
    return True

  def selectAll(self):
    for node in self.__list:
      self.selection.add(node)

  def unselectAll(self):
    for node in self.__list:
      self.selection.rm(node)