import logging import locale import os import sys from PyQt4 import QtCore, QtGui import l10n import paths import settingsmixin import widgets from bmconfigparser import BMConfigParser from foldertree import AddressBookCompleter from tr import _translate class Window(settingsmixin.SMainWindow): """The main PyBitmessage's window""" def __init__(self, parent=None): super(Window, self).__init__(parent) widgets.load('main.ui', self) self.logger = logging.getLogger('default') self.qmytranslator = self.qsystranslator = None self.blackwhitelist.rerenderBlackWhiteList() addressBookCompleter = AddressBookCompleter() addressBookCompleter.setCompletionMode( QtGui.QCompleter.PopupCompletion) addressBookCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) addressBookCompleterModel = QtGui.QStringListModel() addressBookCompleter.setModel(addressBookCompleterModel) self.lineEditTo.setCompleter(addressBookCompleter) self.lineEditTo.cursorPositionChanged.connect( addressBookCompleter.onCursorPositionChanged) # Put the colored icon on the status bar self.statusbar.insertPermanentWidget(0, self.pushButtonStatusIcon) # Hide all menu action containers for toolbar in ( self.inboxContextMenuToolbar, self.addressContextMenuToolbarYourIdentities, self.addressContextMenuToolbar, self.addressBookContextMenuToolbar, self.subscriptionsContextMenuToolbar, self.sentContextMenuToolbar ): toolbar.setVisible(False) # splitters for splitter in ( self.inboxHorizontalSplitter, self.sendHorizontalSplitter, self.subscriptionsHorizontalSplitter, self.chansHorizontalSplitter ): splitter.setStretchFactor(0, 0) splitter.setStretchFactor(1, 1) splitter.setCollapsible(0, False) splitter.setCollapsible(1, False) for splitter in ( self.inboxMessagecontrolSplitter, self.subscriptionsMessagecontrolSplitter, self.chansMessagecontrolSplitter ): splitter.setStretchFactor(0, 0) splitter.setStretchFactor(1, 1) splitter.setStretchFactor(2, 2) splitter.setCollapsible(0, False) splitter.setCollapsible(1, False) splitter.setCollapsible(2, False) splitter.handle(1).setEnabled(False) self.sendMessagecontrolSplitter.handle(1).setEnabled(False) def updateNetworkSwitchMenuLabel(self, dontconnect=None): """ Set the label for "Go online"/"Go offline" menu action depending on 'dontconnect' setting """ if dontconnect is None: dontconnect = BMConfigParser().safeGetBoolean( 'bitmessagesettings', 'dontconnect') self.actionNetworkSwitch.setText( _translate("MainWindow", "Go online", None) if dontconnect else _translate("MainWindow", "Go offline", None) ) def retranslateUi(self): """Update widgets' texts which is not taken from ui-file""" self.updateHumanFriendlyTTLDescription(int( self.horizontalSliderTTL.tickPosition() ** 3.199 + 3600)) self.networkstatus.retranslateUi() # FIXME: this is not best place for this func def change_translation(self, newlocale=None): """Change translation language for the application""" if newlocale is None: newlocale = l10n.getTranslationLanguage() try: if not self.qmytranslator.isEmpty(): QtGui.QApplication.removeTranslator(self.qmytranslator) except: pass try: if not self.qsystranslator.isEmpty(): QtGui.QApplication.removeTranslator(self.qsystranslator) except: pass self.qmytranslator = QtCore.QTranslator() translationpath = os.path.join( paths.codePath(), 'translations', 'bitmessage_' + newlocale) self.qmytranslator.load(translationpath) QtGui.QApplication.installTranslator(self.qmytranslator) self.qsystranslator = QtCore.QTranslator() if paths.frozen: translationpath = os.path.join( paths.codePath(), 'translations', 'qt_' + newlocale) else: translationpath = os.path.join( str(QtCore.QLibraryInfo.location( QtCore.QLibraryInfo.TranslationsPath)), 'qt_' + newlocale) self.qsystranslator.load(translationpath) QtGui.QApplication.installTranslator(self.qsystranslator) lang = locale.normalize(l10n.getTranslationLanguage()) langs = [ lang.split(".")[0] + "." + l10n.encoding, lang.split(".")[0] + "." + 'UTF-8', lang ] if 'win32' in sys.platform or 'win64' in sys.platform: langs = [l10n.getWindowsLocale(lang)] for lang in langs: try: l10n.setlocale(locale.LC_ALL, lang) if 'win32' not in sys.platform and 'win64' not in sys.platform: l10n.encoding = locale.nl_langinfo(locale.CODESET) else: l10n.encoding = locale.getlocale()[1] self.logger.info("Successfully set locale to %s", lang) break except: self.logger.error("Failed to set locale to %s", lang, exc_info=True)