示例#1
0
    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()
示例#3
0
    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()
示例#4
0
    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'])
示例#5
0
    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()
示例#6
0
    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
示例#7
0
 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
示例#8
0
    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)
示例#9
0
    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_()
示例#10
0
    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)