slideshow.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. # $Id$
  2. """This is a slideshow widget developed for Catapult the openMSX launcher"""
  3. from PyQt4 import QtCore, QtGui
  4. class Slideshow(QtGui.QWidget):
  5. def __init__(self, parent=None):
  6. QtGui.QWidget.__init__(self, parent)
  7. self.__imageLabel = QtGui.QLabel()
  8. self.scrollArea = QtGui.QScrollArea(self)
  9. #following self.variables are defined here to satisfy pylint
  10. #there values are altered by the reset() anyway
  11. self.files = []
  12. self.autoHide = False
  13. self.__slideSpeed = 3000
  14. self.__slideStarted = False
  15. self.__slidePauzed = False
  16. self.currentSlide = 0
  17. self.curImagWidth = 40
  18. self.curImagHeight = 40
  19. self.maxImagWidth = 40
  20. self.maxImagHeight = 40
  21. self.minWidth = 40
  22. self.minHeight = 40
  23. self.reset()
  24. self.timer = QtCore.QTimer(self)
  25. self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.slideTimeOut)
  26. self.__imageLabel.setBackgroundRole(QtGui.QPalette.Base)
  27. self.__imageLabel.setSizePolicy(QtGui.QSizePolicy.Ignored,
  28. QtGui.QSizePolicy.Ignored)
  29. self.__imageLabel.setScaledContents(True)
  30. self.scrollArea.setWidget(self.__imageLabel)
  31. self.scrollArea.setAlignment(QtCore.Qt.AlignCenter)
  32. self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
  33. self.keepAspect = True
  34. #following self.__autozoom is defined here to satisfy pylint
  35. self.__autozoom = True
  36. self.setAutozoom(True)
  37. def reset(self):
  38. self.files = []
  39. self.autoHide = False
  40. self.__slideSpeed = 3000
  41. self.__slideStarted = False
  42. self.__slidePauzed = False
  43. self.currentSlide = 0
  44. self.curImagWidth = self.minWidth
  45. self.curImagHeight = self.minHeight
  46. self.maxImagWidth = self.minWidth
  47. self.maxImagHeight = self.minHeight
  48. self.__imageLabel.setText("No images")
  49. self.scrollArea.setWidgetResizable(False)
  50. self.__imageLabel.adjustSize()
  51. self.scrollArea.resize(QtCore.QSize(40, 40))
  52. self.updateGeometry()
  53. def setMinimumSize(self, size):
  54. self.setMinimumWidth(size.width())
  55. self.setMinimumHeight(size.height())
  56. def setMinimumWidth(self, width):
  57. self.minWidth = width
  58. if width > self.scrollArea.size().width():
  59. self.scrollArea.setMinimumWidth(width)
  60. QtGui.QWidget.setMinimumWidth(self, width)
  61. self.updateGeometry()
  62. def setMinimumHeight(self, height):
  63. self.minHeight = height
  64. if height > self.scrollArea.size().height():
  65. self.scrollArea.setMinimumHeight(height)
  66. QtGui.QWidget.setMinimumHeight(self, height)
  67. self.updateGeometry()
  68. def slidePauzed(self):
  69. return self.__slidePauzed
  70. def setSlideStopped(self, value):
  71. if value == False and self.__slideStarted :
  72. self.__slideStarted = False
  73. self.timer.stop()
  74. if value == True and not self.__slideStarted :
  75. self.__slideStarted = True
  76. self.timer.start(self.__slideSpeed)
  77. self.__slidePauzed = value
  78. def setSlideSpeed(self, value):
  79. self.__slideSpeed = value
  80. if self.__slideStarted:
  81. self.timer.stop()
  82. self.timer.start(self.__slideSpeed)
  83. def keepaspect(self):
  84. return self.keepAspect
  85. def setKeepaspect(self, value):
  86. print "def setKeepaspect(self, value):"
  87. print value
  88. if self.keepAspect == value:
  89. return
  90. self.keepAspect = value
  91. self.__adereToAspectAutozoom()
  92. def autozoom(self):
  93. return self.__autozoom
  94. def setAutozoom(self, value):
  95. print "def setAutozoom(self, value):"
  96. print value
  97. if self.__autozoom == value:
  98. return
  99. self.__autozoom = value
  100. self.__adereToAspectAutozoom()
  101. def __adereToAspectAutozoom(self):
  102. if self.__autozoom and not self.keepAspect:
  103. self.scrollArea.setWidgetResizable(True)
  104. else:
  105. self.scrollArea.setWidgetResizable(False)
  106. self.resizeImageLabel(self.scrollArea.contentsRect().size())
  107. def minimumSize(self):
  108. return QtCore.QSize(40, 40)
  109. def setGeometry(self, value):
  110. QtGui.QWidget.setGeometry(value)
  111. def maximumSize(self):
  112. print "maximumSize called"
  113. return QtCore.QSize(self.maxImagWidth, self.maxImagHeight)
  114. def sizeHint(self):
  115. return QtCore.QSize(self.maxImagWidth, self.maxImagHeight)
  116. def addFile(self, fileName):
  117. print fileName
  118. self.files.append(fileName)
  119. self.loadFile(fileName)
  120. if not self.__slideStarted and not self.__slidePauzed:
  121. self.__slideStarted = True
  122. self.timer.start(self.__slideSpeed)
  123. def slideTimeOut(self):
  124. self.nextSlide()
  125. def nextSlide(self):
  126. if len(self.files) > 1:
  127. self.currentSlide = self.currentSlide + 1
  128. if self.currentSlide >= len(self.files):
  129. self.currentSlide = 0
  130. self.loadFile(self.files[self.currentSlide])
  131. def loadFile(self, fileName):
  132. #if not fileName.isEmpty():
  133. image = QtGui.QImage(fileName)
  134. if image.isNull():
  135. QtGui.QMessageBox.information(self, self.tr("Image Viewer"),
  136. self.tr("Cannot load %1.").arg(fileName))
  137. return
  138. self.__imageLabel.setPixmap(QtGui.QPixmap.fromImage(image))
  139. self.curImagWidth = image.width()
  140. if self.maxImagWidth < image.width():
  141. self.maxImagWidth = image.width()
  142. self.curImagHeight = image.height()
  143. if self.maxImagHeight < image.height():
  144. self.maxImagHeight = image.height()
  145. self.resizeImageLabel(self.scrollArea.contentsRect().size())
  146. #self.updateGeometry()
  147. def resizeEvent(self, event):
  148. self.scrollArea.resize(event.size())
  149. self.resizeImageLabel(self.scrollArea.contentsRect().size())
  150. def resizeImageLabel(self, event):
  151. if not self.__autozoom:
  152. self.__imageLabel.adjustSize()
  153. if self.__autozoom and self.keepAspect:
  154. ch = event.height()
  155. cw = event.width()
  156. ah = cw * self.curImagHeight / self.curImagWidth
  157. aw = ch * self.curImagWidth / self.curImagHeight
  158. if aw > cw :
  159. self.__imageLabel.resize(QtCore.QSize(cw, ah))
  160. else:
  161. self.__imageLabel.resize(QtCore.QSize(aw, ch))
  162. def findImagesForMedia(self, mediafile):
  163. info = QtCore.QFileInfo(mediafile)
  164. path = info.path()
  165. filename = info.completeBaseName()
  166. print filename
  167. # We strip off the 2 last suffixes ourself.
  168. # Using baseName() might strip off too much.
  169. # Each suffix might be max 4 chars, this will take
  170. # care of all '.crt.gz','.dsk.gz' etc
  171. if filename.lastIndexOf(".") >= (filename.length() - 4):
  172. filename = filename.left( filename.lastIndexOf(".") )
  173. if filename.lastIndexOf(".") >= (filename.length() - 4):
  174. filename = filename.left( filename.lastIndexOf(".") )
  175. filename = filename + "*"
  176. directory = QtCore.QDir(path)
  177. files = QtCore.QStringList()
  178. files = directory.entryList(QtCore.QStringList(filename),
  179. QtCore.QDir.Files | QtCore.QDir.NoSymLinks)
  180. for i in range(files.count()):
  181. imgfile = directory.absoluteFilePath(files[i])
  182. ext = QtCore.QFileInfo(imgfile).suffix().toLower()
  183. if ext == "jpg" or ext == "png" or ext == "jpeg" or ext == "gif":
  184. self.addFile(imgfile)
  185. def addImagesInDirectory(self, dir):
  186. directory = QtCore.QDir(dir)
  187. files = QtCore.QStringList()
  188. files = directory.entryList(QtCore.QDir.Files)
  189. for i in range(files.count()):
  190. imgfile = directory.absoluteFilePath(files[i])
  191. ext = QtCore.QFileInfo(imgfile).suffix().toLower()
  192. if ext == "jpg" or ext == "png" or ext == "jpeg" or ext == "gif":
  193. self.addFile(imgfile)
  194. def scaleImage(self, factor):
  195. self.scaleFactor *= factor
  196. self.__imageLabel.resize(self.scaleFactor * self.__imageLabel.pixmap().size())
  197. self.__adjustScrollBar(self.scrollArea.horizontalScrollBar(), factor)
  198. self.__adjustScrollBar(self.scrollArea.verticalScrollBar(), factor)
  199. def __adjustScrollBar(self, scrollBar, factor):
  200. scrollBar.setValue(int(factor * scrollBar.value()
  201. + ((factor - 1) * scrollBar.pageStep()/2)))