/tortoisehg/hgqt/about.py

https://bitbucket.org/tortoisehg/hgtk/ · Python · 194 lines · 149 code · 29 blank · 16 comment · 15 complexity · 434fcf6dfe96997b2048572299a60ea5 MD5 · raw file

  1. # about.py - About dialog for TortoiseHg
  2. #
  3. # Copyright 2007 TK Soh <teekaysoh@gmail.com>
  4. # Copyright 2007 Steve Borho <steve@borho.org>
  5. # Copyright 2010 Yuki KODAMA <endflow.net@gmail.com>
  6. # Copyright 2010 Johan Samyn <johan.samyn@gmail.com>
  7. #
  8. # This software may be used and distributed according to the terms of the
  9. # GNU General Public License version 2, incorporated herein by reference.
  10. """
  11. TortoiseHg About dialog - PyQt4 version
  12. """
  13. import os, sys, urllib2
  14. from tortoisehg.hgqt.i18n import _
  15. from tortoisehg.hgqt import qtlib
  16. from tortoisehg.util import version, hglib, shlib, paths
  17. from PyQt4.QtCore import *
  18. from PyQt4.QtGui import *
  19. class AboutDialog(QDialog):
  20. """Dialog for showing info about TortoiseHg"""
  21. def __init__(self, parent=None):
  22. super(AboutDialog, self).__init__(parent)
  23. self.updateInfo = {}
  24. self.uthread = None
  25. self.setWindowIcon(qtlib.geticon('thg_logo'))
  26. self.setWindowTitle(_('About'))
  27. self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
  28. self.vbox = QVBoxLayout()
  29. self.vbox.setSpacing(8)
  30. self.logo_lbl = QLabel()
  31. self.logo_lbl.setMinimumSize(QSize(92, 50))
  32. self.logo_lbl.setScaledContents(False)
  33. self.logo_lbl.setAlignment(Qt.AlignCenter)
  34. thglogofile = paths.get_tortoise_icon('thg_logo_92x50.png')
  35. self.logo_lbl.setPixmap(QPixmap(thglogofile))
  36. self.vbox.addWidget(self.logo_lbl)
  37. self.name_version_libs_lbl = QLabel()
  38. self.name_version_libs_lbl.setText(' ')
  39. self.name_version_libs_lbl.setAlignment(Qt.AlignCenter)
  40. self.name_version_libs_lbl.setTextInteractionFlags(
  41. Qt.TextSelectableByMouse)
  42. self.vbox.addWidget(self.name_version_libs_lbl)
  43. self.getVersionInfo()
  44. self.copyright_lbl = QLabel()
  45. self.copyright_lbl.setAlignment(Qt.AlignCenter)
  46. self.copyright_lbl.setText('\n'
  47. + _('Copyright 2008-2010 Steve Borho and others'))
  48. self.vbox.addWidget(self.copyright_lbl)
  49. self.courtesy_lbl = QLabel()
  50. self.courtesy_lbl.setAlignment(Qt.AlignCenter)
  51. self.courtesy_lbl.setText(
  52. _('Several icons are courtesy of the TortoiseSVN project' + '\n'))
  53. self.vbox.addWidget(self.courtesy_lbl)
  54. self.download_url_lbl = QLabel()
  55. self.download_url_lbl.setAlignment(Qt.AlignCenter)
  56. self.download_url_lbl.setMouseTracking(True)
  57. self.download_url_lbl.setAlignment(Qt.AlignCenter)
  58. self.download_url_lbl.setTextInteractionFlags(Qt.LinksAccessibleByMouse)
  59. self.download_url_lbl.setOpenExternalLinks(True)
  60. self.download_url_lbl.setText('<a href=%s>%s</a>' %
  61. ('http://tortoisehg.org', _('You can visit our site here')))
  62. self.vbox.addWidget(self.download_url_lbl)
  63. # Let's have some space between the url and the buttons.
  64. self.blancline_lbl = QLabel()
  65. self.vbox.addWidget(self.blancline_lbl)
  66. self.hbox = QHBoxLayout()
  67. self.license_btn = QPushButton()
  68. self.license_btn.setText(_('&License'))
  69. self.license_btn.setAutoDefault(False)
  70. self.license_btn.clicked.connect(self.showLicense)
  71. self.hspacer = QSpacerItem(40, 20,
  72. QSizePolicy.Expanding, QSizePolicy.Minimum)
  73. self.close_btn = QPushButton()
  74. self.close_btn.setText(_('&Close'))
  75. self.close_btn.setDefault(True)
  76. self.close_btn.clicked.connect(self.close)
  77. self.hbox.addWidget(self.license_btn)
  78. self.hbox.addItem(self.hspacer)
  79. self.hbox.addWidget(self.close_btn)
  80. self.vbox.addLayout(self.hbox)
  81. self.setLayout(self.vbox)
  82. self.layout().setSizeConstraint(QLayout.SetFixedSize)
  83. self._readsettings()
  84. # Spawn it later, so that the dialog gets visible quickly.
  85. QTimer.singleShot(0, self.getUpdateInfo)
  86. def getVersionInfo(self):
  87. def make_version(tuple):
  88. vers = ".".join([str(x) for x in tuple])
  89. return vers
  90. thgv = (_('version %s') % version.version())
  91. libv = (_('with Mercurial-%s, Python-%s, PyQt-%s, Qt-%s') % \
  92. (hglib.hgversion, make_version(sys.version_info[0:3]),
  93. PYQT_VERSION_STR, QT_VERSION_STR))
  94. thgv = hglib.fromunicode(thgv)
  95. libv = hglib.fromunicode(libv)
  96. par = ('<p style=\" margin-top:0px; margin-bottom:6px;\">'
  97. '<span style=\"font-size:%spt; font-weight:600;\">'
  98. '%s</span></p>')
  99. name = (par % (14, 'TortoiseHg'))
  100. thgv = (par % (10, thgv))
  101. thgv = hglib.fromunicode(thgv)
  102. nvl = _(''.join([name, thgv, libv]))
  103. self.name_version_libs_lbl.setText(nvl)
  104. @pyqtSlot()
  105. def getUpdateInfo(self):
  106. self.uthread = AboutUpdateThread()
  107. self.uthread.finished.connect(self.uFinished)
  108. self.uthread.start()
  109. def uFinished(self):
  110. self.uthread.wait()
  111. urldata = self.uthread.urldata
  112. self.uthread = None
  113. if urldata:
  114. self.download_url_lbl.setText(urldata)
  115. def showLicense(self):
  116. from tortoisehg.hgqt import license
  117. ld = license.LicenseDialog(self)
  118. ld.show()
  119. def closeEvent(self, event):
  120. if self.uthread:
  121. self.uthread.wait()
  122. self._writesettings()
  123. super(AboutDialog, self).closeEvent(event)
  124. def _readsettings(self):
  125. s = QSettings()
  126. self.restoreGeometry(s.value('about/geom').toByteArray())
  127. def _writesettings(self):
  128. s = QSettings()
  129. s.setValue('about/geom', self.saveGeometry())
  130. class AboutUpdateThread(QThread):
  131. 'Background thread for getting update info'
  132. def __init__(self):
  133. super(AboutUpdateThread, self).__init__()
  134. urldata = ''
  135. def run(self):
  136. verurl = 'http://tortoisehg.bitbucket.org/curversion.txt'
  137. newver = (0,0,0)
  138. try:
  139. f = urllib2.urlopen(verurl).read().splitlines()
  140. newver = tuple([int(p) for p in f[0].split('.')])
  141. upgradeurl = f[1] # generic download URL
  142. platform = sys.platform
  143. if platform == 'win32':
  144. from win32process import IsWow64Process as IsX64
  145. platform = IsX64() and 'x64' or 'x86'
  146. # linux2 for Linux, darwin for OSX
  147. for line in f[2:]:
  148. p, url = line.split(':')
  149. if platform == p:
  150. upgradeurl = url.strip()
  151. break
  152. except:
  153. pass
  154. try:
  155. thgv = version.version()
  156. if '+' in thgv:
  157. thgv = thgv[:thgv.index('+')]
  158. curver = tuple([int(p) for p in thgv.split('.')])
  159. except Exception, e:
  160. curver = (0,0,0)
  161. if newver > curver:
  162. url_lbl = _('A new version of TortoiseHg is ready for download!')
  163. self.urldata = ('<a href=%s>%s</a>' % (upgradeurl, url_lbl))
  164. def run(ui, *pats, **opts):
  165. return AboutDialog()