def restoreWindowGeom(self, offset=0): """Restore window geometry from history options. Arguments: offset -- number of pixels to offset window, down and to right """ rect = QRect(globalref.histOptions['WindowXPos'], globalref.histOptions['WindowYPos'], globalref.histOptions['WindowXSize'], globalref.histOptions['WindowYSize']) if rect.x() == -1000 and rect.y() == -1000: # let OS position window the first time self.resize(rect.size()) else: if offset: rect.adjust(offset, offset, offset, offset) availRect = QApplication.primaryScreen().availableVirtualGeometry() topMargin = globalref.histOptions['WindowTopMargin'] otherMargin = globalref.histOptions['WindowOtherMargin'] # remove frame space from available rect availRect.adjust(otherMargin, topMargin, -otherMargin, -otherMargin) finalRect = rect.intersected(availRect) if finalRect.isEmpty(): rect.moveTo(0, 0) finalRect = rect.intersected(availRect) if finalRect.isValid(): self.setGeometry(finalRect) crumbWidth = int(self.breadcrumbSplitter.width() / 100 * globalref.histOptions['CrumbSplitPercent']) self.breadcrumbSplitter.setSizes( [crumbWidth, self.breadcrumbSplitter.width() - crumbWidth]) treeWidth = int(self.treeSplitter.width() / 100 * globalref.histOptions['TreeSplitPercent']) self.treeSplitter.setSizes( [treeWidth, self.treeSplitter.width() - treeWidth]) outHeight = int(self.outputSplitter.height() / 100.0 * globalref.histOptions['OutputSplitPercent']) self.outputSplitter.setSizes( [outHeight, self.outputSplitter.height() - outHeight]) editHeight = int(self.editorSplitter.height() / 100.0 * globalref.histOptions['EditorSplitPercent']) self.editorSplitter.setSizes( [editHeight, self.editorSplitter.height() - editHeight]) titleHeight = int(self.titleSplitter.height() / 100.0 * globalref.histOptions['TitleSplitPercent']) self.titleSplitter.setSizes( [titleHeight, self.titleSplitter.height() - titleHeight]) self.rightTabs.setCurrentIndex( globalref.histOptions['ActiveRightView'])
def paintEvent(self, ev): """ paint the thrusters setpoints widget""" painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) # draw black margin painter.setBrush(self.black) rect = QRect(self.ex_min_x, self.ex_min_y, self.exterior_width, self.exterior_height) painter.drawRoundedRect(rect, 10.0, 10.0) # draw transparent background painter.setBrush(self.white) rectTransp = QRect(self.in_min_x, self.in_min_y, self.interior_width, self.interior_height) painter.drawRoundedRect(rectTransp.intersected(rect), 5.0, 5.0) if self.n_setpoints != 0: setpoint_width = self.interior_width / self.n_setpoints # draw setpoints setpoints = self._setpoints i = 0 for item in setpoints: if item >= 0: max_y = self.in_min_y + (self.interior_height) / 2 min_y = max_y - ((self.interior_height / 2) * item) painter.setBrush(self.green) text_y_position = min_y - 5 if item > 0.8: text_y_position += 25 else: min_y = self.in_min_y + self.interior_height / 2 max_y = min_y + ((self.interior_height / 2) * item) painter.setBrush(self.red) text_y_position = min_y + abs(max_y - min_y) - 5 if item > -0.75: text_y_position += 25 rectCharge = QRect(self.in_min_x + (setpoint_width * i), min_y, setpoint_width, abs(max_y - min_y)) painter.drawRoundedRect(rectCharge, 5.0, 5.0) painter.setPen(QPen(QBrush(Qt.black), 1, Qt.SolidLine)) painter.drawText( self.in_min_x + (setpoint_width * i) + setpoint_width / 2 - 10, text_y_position, str(int(item * 100)) + '%') i += 1 # draw origin line painter.setBrush(self.black) rect_origin_line = QRect(self.in_min_x, (self.in_min_y + self.interior_height) / 2, self.interior_width, 2) painter.drawRect(rect_origin_line) painter.end()
def paintTab(self, painter: QPainter, index: int): if not self.isValidIndex(index): return painter.save() tab = self._tabs[index] rect = self._tabRect(index) selected = index == self._currentIndex enabled = self._enabled and tab.enabled if selected: painter.fillRect(rect, FancyToolButtonSelectedColor) tabText = tab.text tabTextRect = QRect(rect) drawIcon = rect.height() > 36 tabIconRect = QRect(rect) tabTextRect.translate(0, -2 if drawIcon else 1) boldFont = QFont(painter.font()) boldFont.setPointSizeF(SIDEBAR_FONT_SIZE) boldFont.setBold(True) painter.setFont(boldFont) #painter.setPen(QColor(255, 255, 255, 160) if selected else QColor(0, 0, 0, 110)) textFlags = Qt.AlignCenter | (Qt.AlignBottom if drawIcon else Qt.AlignVCenter) | Qt.TextWordWrap fader = tab.fader if fader > 0 and not selected and enabled: painter.save() painter.setOpacity(fader) painter.fillRect(rect, FancyToolButtonHoverColor) painter.restore() if not enabled: painter.setOpacity(0.7) if drawIcon: textHeight = (painter.fontMetrics().boundingRect( QRect(0, 0, self.width(), self.height()), Qt.TextWordWrap, tabText).height()) tabIconRect.adjust(0, 4, 0, -textHeight - 4) iconMode = (QIcon.Active if selected else QIcon.Normal) if enabled else QIcon.Disabled iconRect = QRect(0, 0, MODEBAR_ICON_SIZE, MODEBAR_ICON_SIZE) iconRect.moveCenter(tabIconRect.center()) iconRect = iconRect.intersected(tabIconRect) drawIconWithShadow(tab.icon, iconRect, painter, iconMode) if enabled: penColor = FancyTabWidgetEnabledSelectedTextColor if selected else FancyTabWidgetEnabledUnselectedTextColor else: penColor = FancyTabWidgetDisabledSelectedTextColor if selected else FancyTabWidgetDisabledUnselectedTextColor painter.setPen(penColor) painter.translate(0, -1) painter.drawText(tabTextRect, textFlags, tabText) painter.restore()
def restoreWindowGeom(self, offset=0): """Restore window geometry from history options. Arguments: offset -- number of pixels to offset window, down and to right """ rect = QRect(globalref.histOptions['WindowXPos'], globalref.histOptions['WindowYPos'], globalref.histOptions['WindowXSize'], globalref.histOptions['WindowYSize']) if rect.x() == -1000 and rect.y() == -1000: # let OS position window the first time self.resize(rect.size()) else: if offset: rect.adjust(offset, offset, offset, offset) desktop = QApplication.desktop() if desktop.isVirtualDesktop(): # availRect = desktop.screen().rect() # buggy in windows? availRect = ( QGuiApplication.screens()[0].availableVirtualGeometry()) else: availRect = desktop.availableGeometry(desktop.primaryScreen()) rect = rect.intersected(availRect) self.setGeometry(rect) crumbWidth = int(self.breadcrumbSplitter.width() / 100 * globalref.histOptions['CrumbSplitPercent']) self.breadcrumbSplitter.setSizes( [crumbWidth, self.breadcrumbSplitter.width() - crumbWidth]) treeWidth = int(self.treeSplitter.width() / 100 * globalref.histOptions['TreeSplitPercent']) self.treeSplitter.setSizes( [treeWidth, self.treeSplitter.width() - treeWidth]) outHeight = int(self.outputSplitter.height() / 100.0 * globalref.histOptions['OutputSplitPercent']) self.outputSplitter.setSizes( [outHeight, self.outputSplitter.height() - outHeight]) editHeight = int(self.editorSplitter.height() / 100.0 * globalref.histOptions['EditorSplitPercent']) self.editorSplitter.setSizes( [editHeight, self.editorSplitter.height() - editHeight]) titleHeight = int(self.titleSplitter.height() / 100.0 * globalref.histOptions['TitleSplitPercent']) self.titleSplitter.setSizes( [titleHeight, self.titleSplitter.height() - titleHeight]) self.rightTabs.setCurrentIndex( globalref.histOptions['ActiveRightView'])
def paintEvent(self, ev): """ paint the battery widget""" painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) # draw positive terminal painter.setBrush(self.black) rect_p_terminal = QRect(self.width() - 7, self.height() / 2, self.width() / 30, self.height() / 8) painter.drawRect(rect_p_terminal) # draw battery painter.setBrush(self.black) rect = QRect(self.ex_top_left_x, self.ex_top_left_y, self.exterior_width, self.exterior_height) painter.drawRoundedRect(rect, 10.0, 10.0) # draw transparent background painter.setBrush(self.white) rect_transp = QRect(self.in_top_left_x, self.in_top_left_y, self.interior_width, self.interior_height) painter.drawRoundedRect(rect_transp.intersected(rect), 5.0, 5.0) # draw charge charge = self._charge # charge on pixels 0 to 100 if charge > 100: charge = 100 if charge < 0: charge = 0 rect_charge = QRect(self.in_top_left_x, self.in_top_left_y, self.total_width * charge / 100, self.interior_height) if charge > 45: color = self.green elif charge < 20: color = self.red else: color = self.yellow painter.setBrush(color) painter.drawRoundedRect(rect_charge, 5.0, 5.0) painter.setPen(QPen(QBrush(Qt.black), 1, Qt.SolidLine)) painter.drawText(self.width() / 2 - (self.width() / 8), self.height() / 2 + 10, str(int(charge)) + '%') painter.end()
def createTabPane(self, paneClassName, title=None, nOverrideDockDirection=-1, bLoadLayoutPersonalization=False): pane = None isToolAlreadyCreated = False from candy_editor.qt.controls.EditorCommon.IEditor import getIEditor classDesc = getIEditor().getClassFactory().findClass(paneClassName) if classDesc is None or classDesc.systemClassID( ) != ESystemClassID.ESYSTEM_CLASS_VIEWPANE: qWarning( "CTabPaneManager::createTabPane return None %s pane class not found." % paneClassName) return None viewPaneClass = classDesc if viewPaneClass.singlePane(): for i in range(0, len(self.panes)): pane = self.panes[i] if pane.class_ == paneClassName and pane.viewCreated: isToolAlreadyCreated = True break if not isToolAlreadyCreated: # print ( "CTabPaneManager.createTabPane create QTabPane for", paneClassName ) pane = QTabPane() pane.setParent(self.parent) pane.class_ = paneClassName self.panes.append(pane) dockDir = EDockingDirection.DOCK_FLOAT contentWidget = None if not isToolAlreadyCreated: contentWidget = self.createPaneContents(pane) if contentWidget != None: if title == None: title = contentWidget.getPaneTitle() dockDir = contentWidget.getDockingDirection() elif title == None: title = viewPaneClass.getPaneTitle() pane.title = title pane.setObjectName(self.createObjectName(title)) pane.setWindowTitle(title) pane.category = viewPaneClass.category() if contentWidget: contentWidget.initialize() if bLoadLayoutPersonalization: contentWidget.loadLayoutPersonalization() else: contentWidget = pane.pane if contentWidget != None: dockDir = contentWidget.getDockingDirection() bDockDirection = False from qt.controls.QToolWindowManager import QToolWindowAreaReference, QToolWindowAreaTarget toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.Floating) if nOverrideDockDirection != -1: dockDir = nOverrideDockDirection if dockDir == EDockingDirection.DOCK_DEFAULT: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.Floating) elif dockDir == EDockingDirection.DOCK_TOP: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.HSplitTop) bDockDirection = True elif dockDir == EDockingDirection.DOCK_BOTTOM: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.HSplitBottom) bDockDirection = True elif dockDir == EDockingDirection.DOCK_LEFT: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.VSplitLeft) bDockDirection = True elif dockDir == EDockingDirection.DOCK_RIGHT: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.VSplitRight) bDockDirection = True elif dockDir == EDockingDirection.DOCK_FLOAT: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.Floating) if bDockDirection: referencePane = self.findTabPaneByTitle( "Perspective") # FIXME: No Perspective Pane if referencePane != None: toolArea = self.getToolManager().areaOf(referencePane) if toolArea != None: toolAreaTarget = QToolWindowAreaTarget.createByArea( toolArea, toolAreaTarget.reference) else: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.Floating) paneRect = QRect(0, 0, 800, 600) if contentWidget != None: paneRect = contentWidget.getPaneRect() if pane.title in self.panesHistory: paneHistory = self.panesHistory[pane.title] paneRect = paneHistory.rect maxRc = qApp.desktop().screenGeometry() minimumSize = QSize() if contentWidget != None: minimumSize = contentWidget.getMinSize() paneRect = paneRect.intersected(maxRc) if paneRect.width() < 10: paneRect.setRight(paneRect.left() + 10) if paneRect.height() < 10: paneRect.setBottom(paneRect.top() + 10) pane.defaultSize = QSize(paneRect.width(), paneRect.height()) pane.minimumSize = minimumSize toolPath = {} spawnLocationMap = { } # GetIEditor()->GetPersonalizationManager()->GetState("SpawnLocation") if not self.bLayoutLoaded: toolAreaTarget = QToolWindowAreaTarget( QToolWindowAreaReference.Hidden) else: if spawnLocationMap.setdefault(paneClassName, False): toolPath = spawnLocationMap[paneClassName] if not toolPath.setdefault("geometry", False): t = self.getToolManager().targetFromPath(toolPath["path"]) if t.reference != QToolWindowAreaReference.Floating: toolAreaTarget = t self.getToolManager().addToolWindowTarget(pane, toolAreaTarget) if toolAreaTarget.reference == QToolWindowAreaReference.Floating: alreadyPlaced = False if toolPath.setdefault("geometry", False): alreadyPlaced = pane.window().restoreGeometry( toolPath["geometry"]) if not alreadyPlaced: w = pane while not w.isWindow(): w = w.parentWidget() i = 0 w.move(QPoint(32, 32) * (i + 1)) i = (i + 1) % 10 self.onTabPaneMoved(pane, True) self.toolsDirty = True if pane.pane != None: # from qt.controls.QToolWindowManager.QtViewPane import IPane pane.pane.signalPaneCreated.emit(pane.pane) return pane
def _qpainter_needs_tiling(self, render_rect: QRect, canvas_size: QSize) -> bool: """ Return True if QPainter cannot perform given render without tiling. """ to_paint = render_rect.intersected(QRect(QPoint(0, 0), canvas_size)) return max(to_paint.width(), to_paint.height()) > self.QPAINTER_MAXSIZE
def _render_qwebpage_tiled( self, web_rect: QRect, render_rect: QRect, canvas_size: QSize, ) -> 'WrappedImage': """ Render web page tile-by-tile. This function works around bugs in QPaintEngine that occur when render_rect is larger than 32k pixels in either dimension. """ # One bug is worked around by rendering the page one tile at a time # onto a small-ish temporary image. The magic happens in # viewport-window transformation: painter viewport is moved # appropriately so that rendering region is overlayed onto a temporary # "render" image which is then pasted into the resulting one. # # The other bug manifests itself when you do painter.drawImage when # pasting the rendered tiles. Once you reach 32'768 along either # dimension all of a sudden drawImage simply stops drawing anything. # This is a known limitation of Qt painting system where coordinates # are signed short ints. The simplest workaround that comes to mind # is to use pillow for pasting. tile_conf = self._calculate_tiling( to_paint=render_rect.intersected(QRect(QPoint(0, 0), canvas_size))) canvas = self.img_converter.new_pillow_image(canvas_size) ratio = render_rect.width() / float(web_rect.width()) tile_qimage = self.img_converter.new_qimage(tile_conf.tile_size, fill=False) painter = QPainter(tile_qimage) try: painter.setRenderHint(QPainter.Antialiasing, True) painter.setRenderHint(QPainter.TextAntialiasing, True) painter.setRenderHint(QPainter.SmoothPixmapTransform, True) painter.setWindow(web_rect) # painter.setViewport here seems superfluous (actual viewport is # being set inside the loop below), but it is not. For some # reason, if viewport is reset after setClipRect, # clipping rectangle is adjusted, which is not what we want. painter.setViewport(render_rect) # painter.setClipRect(web_rect) self.logger.log( "Tiled rendering. tile_conf=%s; web_rect=%s, render_rect=%s, " "canvas_size=%s" % (tile_conf, web_rect, render_rect, canvas_size), min_level=2) for i in range(tile_conf.horizontal_count): left = i * tile_qimage.width() for j in range(tile_conf.vertical_count): top = j * tile_qimage.height() painter.setViewport(render_rect.translated(-left, -top)) self.logger.log("Rendering with viewport=%s" % painter.viewport(), min_level=2) clip_rect = QRect( QPoint(math.floor(left / ratio), math.floor(top / ratio)), QPoint(math.ceil((left + tile_qimage.width()) / ratio), math.ceil( (top + tile_qimage.height()) / ratio))) self.web_page.mainFrame().render(painter, QRegion(clip_rect)) tile_image = self.img_converter.qimage_to_pil(tile_qimage) # If this is the bottommost tile, its bottom may have stuff # left over from rendering the previous tile. Make sure # these leftovers don't garble the bottom of the canvas # which can be larger than render_rect because of # "height=" option. rendered_vsize = min(render_rect.height() - top, tile_qimage.height()) if rendered_vsize < tile_qimage.height(): box = (0, 0, tile_qimage.width(), rendered_vsize) tile_image = tile_image.crop(box) self.logger.log("Pasting rendered tile to coords: %s" % ((left, top), ), min_level=2) canvas.paste(tile_image, (left, top)) finally: # It is important to end painter explicitly in python code, because # Python finalizer invocation order, unlike C++ destructors, is not # deterministic and there is a possibility of image's finalizer # running before painter's which may break tests and kill your cat. painter.end() return WrappedPillowImage(canvas)
def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle('ConvertAll') modPath = os.path.abspath(sys.path[0]) if modPath.endswith('.zip'): # for py2exe modPath = os.path.dirname(modPath) iconPathList = [iconPath, os.path.join(modPath, 'icons/'), os.path.join(modPath, '../icons')] self.icons = icondict.IconDict() self.icons.addIconPath([path for path in iconPathList if path]) try: QApplication.setWindowIcon(self.icons['convertall_med']) except KeyError: pass self.helpView = None self.basesDialog = None self.fractionDialog = None self.option = Option('convertall', 25) self.option.loadAll(optiondefaults.defaultList) self.colorSet = colorset.ColorSet(self.option) if self.option.strData('ColorTheme') != 'system': self.colorSet.setAppColors() self.sysFont = self.font() self.guiFont = None fontStr = self.option.strData('GuiFont', True) if fontStr: guiFont = self.font() if guiFont.fromString(fontStr): QApplication.setFont(guiFont) self.guiFont = guiFont self.recentUnits = recentunits.RecentUnits(self.option) try: num = ConvertDlg.unitData.readData() except unitdata.UnitDataError as text: QMessageBox.warning(self, 'ConvertAll', _('Error in unit data - {0}'). format(text)) sys.exit(1) try: print(_('{0} units loaded').format(num)) except UnicodeError: print('{0} units loaded'.format(num)) self.fromGroup = UnitGroup(ConvertDlg.unitData, self.option) self.toGroup = UnitGroup(ConvertDlg.unitData, self.option) self.unitButtons = [] self.textButtons = [] topLayout = QHBoxLayout(self) # divide main, buttons mainLayout = QVBoxLayout() mainLayout.setSpacing(8) topLayout.addLayout(mainLayout) unitLayout = QGridLayout() # unit selection unitLayout.setVerticalSpacing(3) unitLayout.setHorizontalSpacing(20) mainLayout.addLayout(unitLayout) fromLabel = QLabel(_('From Unit')) unitLayout.addWidget(fromLabel, 0, 0) self.fromUnitEdit = unitedit.UnitEdit(self.fromGroup) unitLayout.addWidget(self.fromUnitEdit, 1, 0) self.fromUnitEdit.setFocus() toLabel = QLabel(_('To Unit')) unitLayout.addWidget(toLabel, 0, 1) self.toUnitEdit = unitedit.UnitEdit(self.toGroup) unitLayout.addWidget(self.toUnitEdit, 1, 1) self.fromUnitEdit.gotFocus.connect(self.toUnitEdit.setInactive) self.toUnitEdit.gotFocus.connect(self.fromUnitEdit.setInactive) vertButtonLayout = QVBoxLayout() vertButtonLayout.setSpacing(2) mainLayout.addLayout(vertButtonLayout) self.unitListView = unitlistview.UnitListView(ConvertDlg.unitData) mainLayout.addWidget(self.unitListView) self.fromUnitEdit.currentChanged.connect(self.unitListView. updateFiltering) self.toUnitEdit.currentChanged.connect(self.unitListView. updateFiltering) self.fromUnitEdit.keyPressed.connect(self.unitListView.handleKeyPress) self.toUnitEdit.keyPressed.connect(self.unitListView.handleKeyPress) self.unitListView.unitChanged.connect(self.fromUnitEdit.unitUpdate) self.unitListView.unitChanged.connect(self.toUnitEdit.unitUpdate) self.unitListView.haveCurrentUnit.connect(self.enableButtons) self.unitListView.setFocusPolicy(Qt.NoFocus) textButtonLayout = QHBoxLayout() textButtonLayout.setSpacing(6) vertButtonLayout.addLayout(textButtonLayout) textButtonLayout.addStretch(1) self.textButtons.append(QPushButton('{0} (^2)'.format(_('Square')))) self.textButtons.append(QPushButton('{0} (^3)'.format(_('Cube')))) self.textButtons.append(QPushButton('{0} (*)'.format(_('Multiply')))) self.textButtons.append(QPushButton('{0} (/)'.format(_('Divide')))) for button in self.textButtons: button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button.setFocusPolicy(Qt.NoFocus) textButtonLayout.addWidget(button) button.clicked.connect(self.unitListView.addUnitText) textButtonLayout.addStretch(1) unitButtonLayout = QHBoxLayout() unitButtonLayout.setSpacing(6) vertButtonLayout.addLayout(unitButtonLayout) unitButtonLayout.addStretch(1) self.clearButton = QPushButton(_('Clear Unit')) self.clearButton.clicked.connect(self.unitListView.clearUnitText) self.recentButton = QPushButton(_('Recent Unit')) self.recentButton.clicked.connect(self.recentMenu) self.filterButton = QPushButton(_('Filter List')) self.filterButton.clicked.connect(self.filterMenu) self.unitButtons = [self.clearButton, self.recentButton, self.filterButton] for button in self.unitButtons: button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button.setFocusPolicy(Qt.NoFocus) unitButtonLayout.addWidget(button) unitButtonLayout.addStretch(1) self.showHideButtons() numberLayout = QGridLayout() numberLayout.setVerticalSpacing(3) mainLayout.addLayout(numberLayout) statusLabel = QLabel(_('Set units')) statusLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) mainLayout.addWidget(statusLabel) fromNumLabel = QLabel(_('No Unit Set')) numberLayout.addWidget(fromNumLabel, 0, 0) self.fromNumEdit = numedit.NumEdit(self.fromGroup, self.toGroup, fromNumLabel, statusLabel, self.recentUnits, True) numberLayout.addWidget(self.fromNumEdit, 1, 0) self.fromUnitEdit.unitChanged.connect(self.fromNumEdit.unitUpdate) self.fromNumEdit.gotFocus.connect(self.fromUnitEdit.setInactive) self.fromNumEdit.gotFocus.connect(self.toUnitEdit.setInactive) self.fromNumEdit.gotFocus.connect(self.unitListView.resetFiltering) self.fromNumEdit.setEnabled(False) equalsLabel = QLabel(' = ') equalsLabel.setFont(QFont(self.font().family(), 20)) numberLayout.addWidget(equalsLabel, 0, 1, 2, 1) toNumLabel = QLabel(_('No Unit Set')) numberLayout.addWidget(toNumLabel, 0, 3) self.toNumEdit = numedit.NumEdit(self.toGroup, self.fromGroup, toNumLabel, statusLabel, self.recentUnits, False) numberLayout.addWidget(self.toNumEdit, 1, 3) self.toUnitEdit.unitChanged.connect(self.toNumEdit.unitUpdate) self.toNumEdit.gotFocus.connect(self.fromUnitEdit.setInactive) self.toNumEdit.gotFocus.connect(self.toUnitEdit.setInactive) self.toNumEdit.gotFocus.connect(self.unitListView.resetFiltering) self.toNumEdit.setEnabled(False) self.fromNumEdit.convertNum.connect(self.toNumEdit.setNum) self.toNumEdit.convertNum.connect(self.fromNumEdit.setNum) self.fromNumEdit.convertRqd.connect(self.toNumEdit.convert) self.toNumEdit.convertRqd.connect(self.fromNumEdit.convert) buttonLayout = QVBoxLayout() # major buttons topLayout.addLayout(buttonLayout) closeButton = QPushButton(_('&Close')) buttonLayout.addWidget(closeButton) closeButton.setFocusPolicy(Qt.NoFocus) closeButton.clicked.connect(self.close) optionsButton = QPushButton(_('&Options...')) buttonLayout.addWidget(optionsButton) optionsButton.setFocusPolicy(Qt.NoFocus) optionsButton.clicked.connect(self.changeOptions) basesButton = QPushButton(_('&Bases...')) buttonLayout.addWidget(basesButton) basesButton.setFocusPolicy(Qt.NoFocus) basesButton.clicked.connect(self.showBases) fractionsButton = QPushButton(_('&Fractions...')) buttonLayout.addWidget(fractionsButton) fractionsButton.setFocusPolicy(Qt.NoFocus) fractionsButton.clicked.connect(self.showFractions) helpButton = QPushButton(_('&Help...')) buttonLayout.addWidget(helpButton) helpButton.setFocusPolicy(Qt.NoFocus) helpButton.clicked.connect(self.help) aboutButton = QPushButton(_('&About...')) buttonLayout.addWidget(aboutButton) aboutButton.setFocusPolicy(Qt.NoFocus) aboutButton.clicked.connect(self.about) buttonLayout.addStretch() if self.option.boolData('RemenberDlgPos'): rect = QRect(self.option.intData('MainDlgXPos', 0, 10000), self.option.intData('MainDlgYPos', 0, 10000), self.option.intData('MainDlgXSize', 0, 10000), self.option.intData('MainDlgYSize', 0, 10000)) if rect.isValid(): availRect = (QApplication.primaryScreen(). availableVirtualGeometry()) topMargin = self.option.intData('MainDlgTopMargin', 0, 1000) otherMargin = self.option.intData('MainDlgOtherMargin', 0, 1000) # remove frame space from available rect availRect.adjust(otherMargin, topMargin, -otherMargin, -otherMargin) finalRect = rect.intersected(availRect) if finalRect.isEmpty(): rect.moveTo(0, 0) finalRect = rect.intersected(availRect) if finalRect.isValid(): self.setGeometry(finalRect) if self.option.boolData('LoadLastUnit') and len(self.recentUnits) > 1: self.fromGroup.update(self.recentUnits[0]) self.fromUnitEdit.unitUpdate() self.toGroup.update(self.recentUnits[1]) self.toUnitEdit.unitUpdate() self.unitListView.updateFiltering() self.fromNumEdit.setFocus() self.fromNumEdit.selectAll() if self.option.boolData('ShowStartupTip'): self.show() tipDialog = TipDialog(self.option, self) tipDialog.exec_()
def __init__(self, parent=None): QWidget.__init__(self, parent) self.calc = CalcCore() self.setWindowTitle('rpCalc') modPath = os.path.abspath(sys.path[0]) if modPath.endswith('.zip') or modPath.endswith('.exe'): modPath = os.path.dirname(modPath) # for py2exe/cx_freeze iconPathList = [ iconPath, os.path.join(modPath, 'icons/'), os.path.join(modPath, '../icons') ] self.icons = icondict.IconDict() self.icons.addIconPath(filter(None, iconPathList)) self.icons.addIconPath([path for path in iconPathList if path]) try: QApplication.setWindowIcon(self.icons['calc_lg']) except KeyError: pass if self.calc.option.boolData('KeepOnTop'): self.setWindowFlags(Qt.Window | Qt.WindowStaysOnTopHint) else: self.setWindowFlags(Qt.Window) self.setFocusPolicy(Qt.StrongFocus) self.helpView = None self.extraView = None self.altBaseView = None self.optDlg = None self.popupMenu = QMenu(self) self.popupMenu.addAction('Registers on &LCD', self.toggleReg) self.popupMenu.addSeparator() self.popupMenu.addAction('Show &Register List', self.viewReg) self.popupMenu.addAction('Show &History List', self.viewHist) self.popupMenu.addAction('Show &Memory List', self.viewMem) self.popupMenu.addSeparator() self.popupMenu.addAction('Show Other &Bases', self.viewAltBases) self.popupMenu.addSeparator() self.popupMenu.addAction('Show Help &File', self.help) self.popupMenu.addAction('&About rpCalc', self.about) self.popupMenu.addSeparator() self.popupMenu.addAction('&Quit', self.close) topLay = QVBoxLayout(self) self.setLayout(topLay) topLay.setSpacing(4) topLay.setContentsMargins(6, 6, 6, 6) lcdBox = LcdBox() topLay.addWidget(lcdBox) lcdLay = QGridLayout(lcdBox) lcdLay.setColumnStretch(1, 1) lcdLay.setRowStretch(3, 1) self.extraLabels = [QLabel(' T:', ), QLabel(' Z:', ), QLabel(' Y:', )] for i in range(3): lcdLay.addWidget(self.extraLabels[i], i, 0, Qt.AlignLeft) self.extraLcds = [Lcd(1.5, 13), Lcd(1.5, 13), Lcd(1.5, 13)] lcdLay.addWidget(self.extraLcds[2], 0, 1, Qt.AlignRight) lcdLay.addWidget(self.extraLcds[1], 1, 1, Qt.AlignRight) lcdLay.addWidget(self.extraLcds[0], 2, 1, Qt.AlignRight) if not self.calc.option.boolData('ViewRegisters'): for w in self.extraLabels + self.extraLcds: w.hide() self.lcd = Lcd(2.0, 13) lcdLay.addWidget(self.lcd, 3, 0, 1, 2, Qt.AlignRight) self.setLcdHighlight() self.updateLcd() self.updateColors() self.cmdLay = QGridLayout() topLay.addLayout(self.cmdLay) self.cmdDict = {} self.addCmdButton('x^2', 0, 0) self.addCmdButton('sqRT', 0, 1) self.addCmdButton('y^X', 0, 2) self.addCmdButton('xRT', 0, 3) self.addCmdButton('RCIP', 0, 4) self.addCmdButton('SIN', 1, 0) self.addCmdButton('COS', 1, 1) self.addCmdButton('TAN', 1, 2) self.addCmdButton('LN', 1, 3) self.addCmdButton('e^X', 1, 4) self.addCmdButton('ASIN', 2, 0) self.addCmdButton('ACOS', 2, 1) self.addCmdButton('ATAN', 2, 2) self.addCmdButton('LOG', 2, 3) self.addCmdButton('tn^X', 2, 4) self.addCmdButton('STO', 3, 0) self.addCmdButton('RCL', 3, 1) self.addCmdButton('R<', 3, 2) self.addCmdButton('R>', 3, 3) self.addCmdButton('x<>y', 3, 4) self.addCmdButton('SHOW', 4, 0) self.addCmdButton('CLR', 4, 1) self.addCmdButton('PLCS', 4, 2) self.addCmdButton('SCI', 4, 3) self.addCmdButton('DEG', 4, 4) self.addCmdButton('EXIT', 5, 0) self.addCmdButton('Pi', 5, 1) self.addCmdButton('EXP', 5, 2) self.addCmdButton('CHS', 5, 3) self.addCmdButton('<-', 5, 4) self.mainLay = QGridLayout() topLay.addLayout(self.mainLay) self.mainDict = {} self.addMainButton(0, 'OPT', 0, 0) self.addMainButton(Qt.Key_Slash, '/', 0, 1) self.addMainButton(Qt.Key_Asterisk, '*', 0, 2) self.addMainButton(Qt.Key_Minus, '-', 0, 3) self.addMainButton(Qt.Key_7, '7', 1, 0) self.addMainButton(Qt.Key_8, '8', 1, 1) self.addMainButton(Qt.Key_9, '9', 1, 2) self.addMainButton(Qt.Key_Plus, '+', 1, 3, 1, 0) self.addMainButton(Qt.Key_4, '4', 2, 0) self.addMainButton(Qt.Key_5, '5', 2, 1) self.addMainButton(Qt.Key_6, '6', 2, 2) self.addMainButton(Qt.Key_1, '1', 3, 0) self.addMainButton(Qt.Key_2, '2', 3, 1) self.addMainButton(Qt.Key_3, '3', 3, 2) self.addMainButton(Qt.Key_Enter, 'ENT', 3, 3, 1, 0) self.addMainButton(Qt.Key_0, '0', 4, 0, 0, 1) self.addMainButton(Qt.Key_Period, '.', 4, 2) self.mainDict[Qt.Key_Return] = \ self.mainDict[Qt.Key_Enter] # added for european keyboards: self.mainDict[Qt.Key_Comma] = \ self.mainDict[Qt.Key_Period] self.cmdDict['ENT'] = self.mainDict[Qt.Key_Enter] self.cmdDict['OPT'] = self.mainDict[0] self.entryStr = '' self.showMode = False statusBox = QFrame() statusBox.setFrameStyle(QFrame.Panel | QFrame.Sunken) statusBox.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)) topLay.addWidget(statusBox) statusLay = QHBoxLayout(statusBox) self.entryLabel = QLabel(statusBox) statusLay.addWidget(self.entryLabel) statusLay.setContentsMargins(1, 1, 1, 1) self.statusLabel = QLabel(statusBox) self.statusLabel.setAlignment(Qt.AlignRight) statusLay.addWidget(self.statusLabel) if self.calc.option.boolData('ExtraViewStartup'): self.viewReg() if self.calc.option.boolData('AltBaseStartup'): self.viewAltBases() rect = QRect(self.calc.option.intData('MainDlgXPos', 0, 10000), self.calc.option.intData('MainDlgYPos', 0, 10000), self.calc.option.intData('MainDlgXSize', 0, 10000), self.calc.option.intData('MainDlgYSize', 0, 10000)) if rect.isValid(): availRect = ( QApplication.primaryScreen().availableVirtualGeometry()) topMargin = self.calc.option.intData('MainDlgTopMargin', 0, 1000) otherMargin = self.calc.option.intData('MainDlgOtherMargin', 0, 1000) # remove frame space from available rect availRect.adjust(otherMargin, topMargin, -otherMargin, -otherMargin) finalRect = rect.intersected(availRect) if finalRect.isEmpty(): rect.moveTo(0, 0) finalRect = rect.intersected(availRect) if finalRect.isValid(): self.setGeometry(finalRect) self.updateEntryLabel('rpCalc Version {0}'.format(__version__)) QTimer.singleShot(5000, self.updateEntryLabel)