CuraSplashScreen.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # Copyright (c) 2017 Ultimaker B.V.
  2. # Uranium is released under the terms of the AGPLv3 or higher.
  3. from threading import Thread, Event
  4. from PyQt5.QtCore import Qt
  5. from PyQt5.QtGui import QPixmap, QColor, QFont, QPen, QPainter
  6. from PyQt5.QtWidgets import QSplashScreen
  7. from UM.Resources import Resources
  8. from UM.Application import Application
  9. class CuraSplashScreen(QSplashScreen):
  10. def __init__(self):
  11. super().__init__()
  12. self._scale = 0.7
  13. splash_image = QPixmap(Resources.getPath(Resources.Images, "cura.png"))
  14. self.setPixmap(splash_image)
  15. self._current_message = ""
  16. self._loading_image_rotation_angle = 0
  17. self._to_stop = False
  18. self._loading_tick_thread = LoadingTickThread(self)
  19. def show(self):
  20. super().show()
  21. self._loading_tick_thread.start()
  22. def updateLoadingImage(self):
  23. if self._to_stop:
  24. return
  25. self._loading_image_rotation_angle -= 10
  26. self.repaint()
  27. def drawContents(self, painter):
  28. if self._to_stop:
  29. return
  30. painter.save()
  31. painter.setPen(QColor(255, 255, 255, 255))
  32. painter.setRenderHint(QPainter.Antialiasing)
  33. painter.setRenderHint(QPainter.Antialiasing, True)
  34. version = Application.getInstance().getVersion().split("-")
  35. buildtype = Application.getInstance().getBuildType()
  36. if buildtype:
  37. version[0] += " (%s)" % buildtype
  38. # draw version text
  39. font = QFont() # Using system-default font here
  40. font.setPointSize(28)
  41. painter.setFont(font)
  42. painter.drawText(220, 66, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0])
  43. if len(version) > 1:
  44. font.setPointSize(12)
  45. painter.setFont(font)
  46. painter.setPen(QColor(200, 200, 200, 255))
  47. painter.drawText(252, 105, 330 * self._scale, 255 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[1])
  48. painter.setPen(QColor(255, 255, 255, 255))
  49. # draw the loading image
  50. pen = QPen()
  51. pen.setWidth(6 * self._scale)
  52. pen.setColor(QColor(32, 166, 219, 255))
  53. painter.setPen(pen)
  54. painter.drawArc(60, 150, 32 * self._scale, 32 * self._scale, self._loading_image_rotation_angle * 16, 300 * 16)
  55. # draw message text
  56. if self._current_message:
  57. font = QFont() # Using system-default font here
  58. font.setPointSize(10)
  59. pen = QPen()
  60. pen.setColor(QColor(255, 255, 255, 255))
  61. painter.setPen(pen)
  62. painter.setFont(font)
  63. painter.drawText(100, 128, 170, 64,
  64. Qt.AlignLeft | Qt.AlignVCenter | Qt.TextWordWrap,
  65. self._current_message)
  66. painter.restore()
  67. super().drawContents(painter)
  68. def showMessage(self, message, *args, **kwargs):
  69. if self._to_stop:
  70. return
  71. self._current_message = message
  72. self.messageChanged.emit(message)
  73. def close(self):
  74. # set stop flags
  75. self._to_stop = True
  76. self._loading_tick_thread.setToStop()
  77. super().close()
  78. class LoadingTickThread(Thread):
  79. def __init__(self, splash):
  80. super().__init__(daemon = True)
  81. self._splash = splash
  82. self._to_stop = False
  83. self._time_interval = 0.05
  84. self._event = Event()
  85. def setToStop(self):
  86. self._to_stop = True
  87. self._event.set()
  88. def run(self):
  89. while not self._to_stop:
  90. self._event.wait(self._time_interval)
  91. if self._event.is_set():
  92. break
  93. self._splash.updateLoadingImage()