Exemple #1
0
 def LoadObjectID(self, loadObjectID, *args, **kwds):
     self.loadedObjectID = loadObjectID
     self.objectLabel.text = '%s %s/%s' % (
         loadObjectID, self.objectIDs.index(loadObjectID) + 1,
         len(self.objectIDs))
     if getattr(self, 'currentMap', None):
         self.currentMap.Close()
     inEditMode = settings.user.ui.Get('mapDebugViewEditEnabled', 0)
     from eve.client.script.ui.shared.mapView.hexagonal.hexMap import HexMap
     self.currentMap = HexMap(parent=self.clipRect,
                              state=uiconst.UI_NORMAL,
                              editMode=inEditMode)
     stopOnErrors = settings.user.ui.Get('mapDebugViewStopOnErrors', 0)
     ignoreFixed = settings.user.ui.Get('mapDebugViewIgnoreFixed', 0)
     refreshLayout = settings.user.ui.Get('mapDebugViewRefreshLayout', 0)
     if refreshLayout:
         refreshLayout = loadObjectID != const.locationUniverse
     if refreshLayout:
         resolved = PlotMapObjects(self.currentMap, loadObjectID)
         if not resolved and stopOnErrors:
             self.autoLoadTimer = None
     else:
         self.currentMap.LoadMapData(loadObjectID,
                                     ignoreFixedLayout=ignoreFixed)
         if loadObjectID > 9 and not settings.user.ui.Get(
                 'mapLoadCombined', 0):
             ol, ll, penalty = ScanAllOverlap(self.currentMap)
             if penalty:
                 print 'Loaded', loadObjectID, 'penalty', penalty
                 if stopOnErrors:
                     self.autoLoadTimer = None
Exemple #2
0
 def LoadContent(self):
     self.lazyLoadThread = None
     if self.objectID is None or self.objectID not in uicore.mapObjectDataByID:
         return
     if not self.display or not self.parent:
         return
     if self.subMap is None:
         from eve.client.script.ui.shared.mapView.hexagonal.hexMap import HexMap
         self.subMap = HexMap(parent=self,
                              parentMap=self.hexGrid,
                              align=uiconst.CENTER,
                              setMapSize=self.mapsize)
         self.subMap.opacity = 0
         self.subMap.LoadMapData(self.objectID)
         self.subMap.state = uiconst.UI_DISABLED
         self.state = uiconst.UI_DISABLED
         width, height = hexUtil.hex_slot_size(self.isFlatTop,
                                               self.hexSize * 1000.0)
         self.subMap.localScaling = height / float(
             self.subMap.sizeUnscaled[1]) / 1000.0
         self.subMap.width = self.subMap.sizeUnscaled[
             0] * self.globalScaling * self.subMap.localScaling
         self.subMap.height = self.subMap.sizeUnscaled[
             1] * self.globalScaling * self.subMap.localScaling
         vX, vY, vW, vH = self._latestViewportData
         left = (self.parent.width - self.width) / 2 + self.left
         top = (self.parent.height - self.height) / 2 + self.top
         self.subMap.TraverseHexMap(
             (vX + left, vY + top, vW, vH),
             scaling=self.globalScaling * self.localScaling)
         uicore.animations.FadeTo(self.subMap, startVal=0.0, endVal=1.0)
     self.subMap.display = True
Exemple #3
0
class DebugMapBrowser(Window):
    default_windowID = 'DebugMapBrowser'
    default_caption = 'Map Debug View'
    autoLoadTimer = None
    loadedObjectID = None
    currentMap = None
    clipRect = None

    def ApplyAttributes(self, attributes):
        Window.ApplyAttributes(self, attributes)
        self.SetTopparentHeight(0)
        uthread.new(self.LoadOptions)

    def LoadOptions(self):
        PrimeMapData()
        self.objectIDs = sorted(uicore.mapObjectDataByID.keys())
        main = self.GetMainArea()
        main.clipChildren = True
        main.padding = 6
        lg = LayoutGrid(parent=main,
                        columns=3,
                        cellPadding=2,
                        align=uiconst.TOTOP)
        self.objectLabel = EveLabelLarge(bold=True)
        lg.AddCell(self.objectLabel, colSpan=lg.columns - 1)
        self.inputEdit = SinglelineEdit(OnReturn=self.OnInputConfirm,
                                        align=uiconst.TOPRIGHT)
        self.inputEdit.SetHistoryVisibility(True)
        lg.AddCell(self.inputEdit, colSpan=1)
        b = Button(func=self.BrowsePrev, label='Previous')
        lg.AddCell(b, colSpan=2)
        Button(parent=lg,
               func=self.BrowseNext,
               label='Next',
               align=uiconst.TOPRIGHT)
        lg.FillRow()
        lg.AddCell(Line(align=uiconst.TOTOP),
                   colSpan=lg.columns,
                   cellPadding=(0, 4, 0, 4))
        b = Button(func=self.BrowseNextLoop,
                   label='Browse next loop',
                   fixedwidth=240)
        lg.AddCell(b, colSpan=lg.columns)
        self.browseLoopButton = b
        settings.user.ui.Set('mapDebugViewRefreshLayout', 0)
        c = Checkbox(configName='mapDebugViewRefreshLayout',
                     text='Refresh layouts',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugViewRefreshLayout',
                                                  0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapDebugViewStopOnErrors',
                     text='Stop on error',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugViewStopOnErrors',
                                                  0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapDebugViewIgnoreFixed',
                     text='Ignore fixed layouts',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugViewIgnoreFixed',
                                                  0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapDebugViewEditEnabled',
                     text='Editmode enabled',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugViewEditEnabled',
                                                  0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapDebugSubdivision',
                     text='Show Grid Subdivision',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugSubdivision', 0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapLoadCombined',
                     text='Load Combined',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapLoadCombined', 0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapDebugShowIDs',
                     text='Show IDs',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugShowIDs', 0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapDebugLoadHexLines',
                     text='Load Hex Lines',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugLoadHexLines', 0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        c = Checkbox(configName='mapDebugShowExitPoints',
                     text='Show Exit Points',
                     align=uiconst.TOPLEFT,
                     checked=settings.user.ui.Get('mapDebugShowExitPoints', 0),
                     wrapLabel=False,
                     callback=self.OnCheckBoxChange)
        lg.AddCell(c, colSpan=lg.columns)
        lg.FillRow()
        lg.AddCell(Line(align=uiconst.TOTOP),
                   colSpan=lg.columns,
                   cellPadding=(0, 4, 0, 4))
        b = Button(func=self.ScanCurrent, label='Scan Current', fixedwidth=240)
        lg.AddCell(b, colSpan=lg.columns)
        b = Button(func=self.AutoFitSize, label='Auto Fit', fixedwidth=240)
        lg.AddCell(b, colSpan=lg.columns)
        self.statsLabel = EveLabelMedium(parent=lg)
        lg.FillRow()
        self.clipRect = Container(parent=uicore.layer.main,
                                  align=uiconst.CENTER,
                                  width=800,
                                  height=600,
                                  clipChildren=True)
        Frame(bgParent=self.clipRect)
        Fill(bgParent=self.clipRect, color=(0, 0, 0, 1))
        self.LoadObjectID(loadObjectID=10000001)

    def Close(self, *args, **kwds):
        Window.Close(self, *args, **kwds)
        if self.currentMap and not self.currentMap.destroyed:
            self.currentMap.Close()
            self.currentMap = None
        if self.clipRect:
            self.clipRect.Close()
            self.clipRect = None

    def OnCheckBoxChange(self, *args, **kwds):
        if self.loadedObjectID:
            uthread.new(self.LoadObjectID, self.loadedObjectID)

    def LoadObjectID(self, loadObjectID, *args, **kwds):
        self.loadedObjectID = loadObjectID
        self.objectLabel.text = '%s %s/%s' % (
            loadObjectID, self.objectIDs.index(loadObjectID) + 1,
            len(self.objectIDs))
        if getattr(self, 'currentMap', None):
            self.currentMap.Close()
        inEditMode = settings.user.ui.Get('mapDebugViewEditEnabled', 0)
        from eve.client.script.ui.shared.mapView.hexagonal.hexMap import HexMap
        self.currentMap = HexMap(parent=self.clipRect,
                                 state=uiconst.UI_NORMAL,
                                 editMode=inEditMode)
        stopOnErrors = settings.user.ui.Get('mapDebugViewStopOnErrors', 0)
        ignoreFixed = settings.user.ui.Get('mapDebugViewIgnoreFixed', 0)
        refreshLayout = settings.user.ui.Get('mapDebugViewRefreshLayout', 0)
        if refreshLayout:
            refreshLayout = loadObjectID != const.locationUniverse
        if refreshLayout:
            resolved = PlotMapObjects(self.currentMap, loadObjectID)
            if not resolved and stopOnErrors:
                self.autoLoadTimer = None
        else:
            self.currentMap.LoadMapData(loadObjectID,
                                        ignoreFixedLayout=ignoreFixed)
            if loadObjectID > 9 and not settings.user.ui.Get(
                    'mapLoadCombined', 0):
                ol, ll, penalty = ScanAllOverlap(self.currentMap)
                if penalty:
                    print 'Loaded', loadObjectID, 'penalty', penalty
                    if stopOnErrors:
                        self.autoLoadTimer = None

    def BrowsePrev(self, *args, **kwds):
        self.autoLoadTimer = None
        if self.loadedObjectID:
            ctrl = uicore.uilib.Key(uiconst.VK_CONTROL)
            if ctrl:
                i = 1
            else:
                i = self.objectIDs.index(self.loadedObjectID)
            self.LoadObjectID(self.objectIDs[max(0, i - 1)])

    def BrowseNext(self, *args, **kwds):
        if self.destroyed:
            self.autoLoadTimer = None
            return
        if self.loadedObjectID:
            i = self.objectIDs.index(self.loadedObjectID)
            if i + 1 < len(self.objectIDs):
                self.LoadObjectID(self.objectIDs[i + 1])
                return True

    def AutoFitSize(self, *args):
        self._AutoFitSize(self, *args)

    def _AutoFitSize(self, *args):
        print 'meee'
        hexMap = self.currentMap
        layout = hexMap.GetCurrentLayout()
        newlayout, size = AutoFitLayout(layout)
        for objectID, column_row in newlayout.iteritems():
            hexCell = hexMap.objectByID[objectID]
            hexCell.MoveToCR(*column_row)

        hexMap.UpdateJumpLines()
        hexMap.SetMapSize(size)

    def ScanCurrent(self, *args):
        self._ScanCurrent(*args)

    def _ScanCurrent(self, *args):
        if self.currentMap:
            ol, ll, penalty = ScanAllOverlap(self.currentMap)
            print penalty

    def MakePattern(self, *args):
        pass

    def BrowseNextLoop(self, *args):
        if self.autoLoadTimer:
            self.browseLoopButton.SetLabel('Browse next loop')
            self.autoLoadTimer = None
        else:
            self.browseLoopButton.SetLabel('Stop')
            self.autoLoadTimer = AutoTimer(1, self.AutoBrowse)

    def AutoBrowse(self):
        stillLoading = self.BrowseNext()
        if not stillLoading:
            self.autoLoadTimer = None

    def OnInputConfirm(self, *args, **kwds):
        try:
            toInt = int(self.inputEdit.GetValue())
            if toInt in self.objectIDs:
                self.LoadObjectID(toInt)
        except:
            pass
Exemple #4
0
class HexCell(Container):
    default_pickRadius = -1
    default_opacity = 1.0
    default_align = uiconst.CENTER
    default_state = uiconst.UI_PICKCHILDREN
    isFlatTop = True
    editMode = False
    hexGrid = None
    hexSize = 16.0
    hexGridSize = 32.0
    gridPosition = (0, 0)
    outline = None
    positionLabel = None
    objectID = None
    outlineColor = (1, 1, 1, 1)
    subMap = None
    lazyLoadThread = None
    OnDragCallback = None
    OnDragEndCallback = None
    OnMouseDownCallback = None
    OnMouseUpCallback = None
    OnMouseWheelCallback = None
    globalScaling = 1.0
    localScaling = 1.0
    mapsize = None

    def ApplyAttributes(self, attributes):
        Container.ApplyAttributes(self, attributes)
        self.editMode = attributes.editMode
        self.hexGrid = attributes.hexGrid
        self.hexSize = attributes.hexSize or self.hexSize
        self.hexGridSize = attributes.hexGridSize or self.hexGridSize
        self.isFlatTop = attributes.isFlatTop or self.isFlatTop
        self.sizeUnscaled = hexUtil.hex_slot_size(self.isFlatTop, self.hexSize)
        self.width, self.height = self.sizeUnscaled
        if settings.user.ui.Get('mapDebugShowIDs', 0):
            self.positionLabel = EveLabelSmall(parent=self,
                                               align=uiconst.CENTERTOP)
        self.backgroundSprite = Sprite(
            bgParent=self,
            texturePath=
            'res:/UI/Texture/classes/HexMap/baseHexUnderlaySmall.png',
            color=self.hexGrid.mainColor)
        if self.editMode:
            self.state = uiconst.UI_NORMAL

    def Close(self, *args):
        Container.Close(self, *args)
        self.hexGrid = None
        self.OnMouseDownCallback = None
        self.OnMouseUpCallback = None
        self.OnMouseWheelCallback = None

    def SetMapGridSize(self, mapsize):
        self.mapsize = mapsize

    def UpdateAlignment(self,
                        budgetLeft=0,
                        budgetTop=0,
                        budgetWidth=0,
                        budgetHeight=0,
                        updateChildrenOnly=False):
        ret = Container.UpdateAlignment(self, budgetLeft, budgetTop,
                                        budgetWidth, budgetHeight,
                                        updateChildrenOnly)
        return ret

    def TraverseHexCell(self, viewportRect, scaling):
        self.globalScaling = scaling
        self._latestViewportData = viewportRect
        w, h = self.sizeUnscaled
        self.width = w * self.globalScaling * self.localScaling
        self.height = h * self.globalScaling * self.localScaling
        if self.gridPosition:
            self.MoveToCR(*self.gridPosition)
        vX, vY, vW, vH = viewportRect
        l = vX + self.left - self.width / 2 + self.parent.width / 2
        r = l + self.width
        t = vY + self.top - self.height / 2 + self.parent.height / 2
        b = t + self.height
        if self.width < 50:
            self.backgroundSprite.texturePath = 'res:/UI/Texture/classes/HexMap/baseHexUnderlaySmall.png'
        elif self.width < 100:
            self.backgroundSprite.texturePath = 'res:/UI/Texture/classes/HexMap/baseHexUnderlayMedium.png'
        else:
            self.backgroundSprite.texturePath = 'res:/UI/Texture/classes/HexMap/baseHexUnderlay.png'
        if (r >= 0 and l <= vW or r >= vW
                and l <= 0) and (b >= 0 and t <= vH or b >= vH and t <= 0):
            self.display = True
            if self.height < self.hexSize / 2:
                if self.positionLabel:
                    self.positionLabel.display = False
            elif self.positionLabel:
                self.positionLabel.display = True
            if self.height >= 96:
                if not self.editMode and not self.lazyLoadThread and not self.subMap:
                    self.lazyLoadThread = AutoTimer(
                        50 + random.randint(1, 500), self.LoadContent)
                if self.subMap:
                    width, height = hexUtil.hex_slot_size(
                        self.isFlatTop, self.hexSize * 1000.0)
                    self.subMap.localScaling = height / float(
                        self.subMap.sizeUnscaled[1]) / 1000.0
                    self.subMap.width = self.subMap.sizeUnscaled[
                        0] * self.globalScaling * self.subMap.localScaling
                    self.subMap.height = self.subMap.sizeUnscaled[
                        1] * self.globalScaling * self.subMap.localScaling
                    left = (self.parent.width - self.width) / 2 + self.left
                    top = (self.parent.height - self.height) / 2 + self.top
                    self.subMap.TraverseHexMap(
                        (vX + left, vY + top, vW, vH),
                        scaling=self.globalScaling * self.localScaling)
            else:
                self.UnloadContent()
        else:
            self.display = False
            self.UnloadContent()

    def GetMap(self):
        return self.subMap

    def LoadContent(self):
        self.lazyLoadThread = None
        if self.objectID is None or self.objectID not in uicore.mapObjectDataByID:
            return
        if not self.display or not self.parent:
            return
        if self.subMap is None:
            from eve.client.script.ui.shared.mapView.hexagonal.hexMap import HexMap
            self.subMap = HexMap(parent=self,
                                 parentMap=self.hexGrid,
                                 align=uiconst.CENTER,
                                 setMapSize=self.mapsize)
            self.subMap.opacity = 0
            self.subMap.LoadMapData(self.objectID)
            self.subMap.state = uiconst.UI_DISABLED
            self.state = uiconst.UI_DISABLED
            width, height = hexUtil.hex_slot_size(self.isFlatTop,
                                                  self.hexSize * 1000.0)
            self.subMap.localScaling = height / float(
                self.subMap.sizeUnscaled[1]) / 1000.0
            self.subMap.width = self.subMap.sizeUnscaled[
                0] * self.globalScaling * self.subMap.localScaling
            self.subMap.height = self.subMap.sizeUnscaled[
                1] * self.globalScaling * self.subMap.localScaling
            vX, vY, vW, vH = self._latestViewportData
            left = (self.parent.width - self.width) / 2 + self.left
            top = (self.parent.height - self.height) / 2 + self.top
            self.subMap.TraverseHexMap(
                (vX + left, vY + top, vW, vH),
                scaling=self.globalScaling * self.localScaling)
            uicore.animations.FadeTo(self.subMap, startVal=0.0, endVal=1.0)
        self.subMap.display = True

    def UnloadContent(self):
        self.lazyLoadThread = None
        if self.subMap:
            self.subMap.Close()
            self.subMap = None

    def MoveToXYZ(self, x, y, z):
        column, row = hexUtil.cube_to_axial_coordinate(x, y, z)
        self.MoveToCR(column, row)

    def OffsetCR(self, offsetColumn, offsetRow):
        column, row = self.gridPosition
        oddColumnOffset = offsetColumn & 1
        if oddColumnOffset and not column & 1:
            offsetRow -= 1
        self.MoveToCR(column + offsetColumn, row + offsetRow)

    def MoveToCR(self, column, row):
        cX, cY = hexUtil.hex_slot_center_position(column, row, self.isFlatTop,
                                                  self.hexGridSize)
        self.left = cX * self.globalScaling * self.localScaling
        self.top = cY * self.globalScaling * self.localScaling
        self.gridPosition = (column, row)
        if self.positionLabel:
            parentID = uicore.mapObjectParentByID.get(self.objectID, None)
            self.positionLabel.text = '%s<br>%s<br>%s/%s' % (
                self.objectID, parentID, column, row)

    def GetGridPosition(self):
        return self.gridPosition

    def GetCenterPosition(self):
        return (self.left + self.width / 2, self.top + self.height / 2)

    def GetPosition(self):
        return (self.left, self.top)

    def GetNeighborsInRange(self, startRange=0, endRange=1):
        startpos = self.gridPosition
        for i in xrange(startRange):
            startpos = hexUtil.neighbour_axial(startpos, 4, self.isFlatTop)

        ret = []
        for i in xrange(startRange, endRange):
            startpos = hexUtil.neighbour_axial(startpos, 4, self.isFlatTop)
            cr = startpos
            for direction in xrange(6):
                for length in xrange(i + 1):
                    cr = hexUtil.neighbour_axial(cr, direction, self.isFlatTop)
                    ret.append(cr)

        return ret

    def GetSlotNeighborsInDirection(self,
                                    column_row,
                                    directions=(0, 1, 2, 3, 4, 5),
                                    startRange=0,
                                    endRange=10):
        ret = []
        for direction in directions:
            cr = column_row
            for i in xrange(startRange):
                cr = hexUtil.neighbour_axial(cr, direction, self.isFlatTop)

            for length in xrange(startRange, endRange):
                cr = hexUtil.neighbour_axial(cr, direction, self.isFlatTop)
                ret.append(cr)

        return ret

    def OnMouseDown(self, mouseButton, *args):
        if self.editMode:
            self.dragThread = AutoTimer(1, self.DragHexCell)

    def OnMouseUp(self, mouseButton, *args):
        if self.OnMouseUpCallback:
            self.OnMouseUpCallback(mouseButton, self)

    def OnMouseWheel(self, dz):
        if self.OnMouseWheelCallback:
            self.OnMouseWheelCallback(dz, self)

    def OnDblClick(self, *args):
        if self.objectID and not self.editMode:
            mapRoot = self.FindTopLevelMap()
            if mapRoot:
                mapRoot.LoadMapData(self.objectID)

    def DragHexCell(self):
        if not uicore.uilib.leftbtn:
            self.dragThread = None
            if self.OnDragEndCallback:
                self.OnDragEndCallback(self)
            return
        pl, pt = self.parent.GetAbsolutePosition()
        self.left = uicore.uilib.x - pl - self.parent.width / 2
        self.top = uicore.uilib.y - pt - self.parent.height / 2
        if self.OnDragCallback:
            self.OnDragCallback()

    def FindTopLevelMap(self):
        check = self
        while check:
            if isinstance(check, HexMap) and not check.isChild:
                return check
            check = check.parent

    def DrawOutline(self, margin=0):
        if self.outline:
            outline = self.outline
        else:
            outline = VectorLineTrace(parent=self, lineWidth=1, idx=0)
            outline.isLoop = True
            self.outline = outline
        outline.Flush()
        self.cornerPoints = []
        colors = [(1, 0, 0, 1), (1, 1, 1, 1), (0, 1, 0, 1), (1, 1, 1, 1),
                  (0, 0, 1, 1), (1, 1, 1, 1)]
        for i in xrange(6):
            if self.isFlatTop:
                outlineRad = self.displayWidth * 0.5 - margin
                angle = 2.0 * math.pi / 6.0 * i
            else:
                outlineRad = self.displayHeight * 0.5 - margin
                angle = 2.0 * math.pi / 6.0 * (i + 0.5)
            x_i = ReverseScaleDpi(self.displayWidth * 0.5 +
                                  outlineRad * math.cos(angle))
            y_i = ReverseScaleDpi(self.displayHeight * 0.5 +
                                  outlineRad * math.sin(angle))
            outline.AddPoint((x_i, y_i), colors[i])
            self.cornerPoints.append((x_i, y_i))

    def Hilite(self):
        self.outline.lineWidth = 3

    @apply
    def displayRect():
        fget = Base.displayRect.fget

        def fset(self, value):
            pW, pH = self._displayWidth, self._displayHeight
            displayX, displayY, displayWidth, displayHeight = value
            self._displayX = int(round(displayX))
            self._displayY = int(round(displayY))
            self._displayWidth = int(
                round(displayX + displayWidth)) - self._displayX
            self._displayHeight = int(
                round(displayY + displayHeight)) - self._displayY
            ro = self.renderObject
            if ro:
                ro.displayX = self._displayX
                ro.displayY = self._displayY
                ro.displayWidth = self._displayWidth
                ro.displayHeight = self._displayHeight
            if self._displayWidth != pW or self._displayHeight != pH:
                if self._backgroundlist and len(self.background):
                    self.UpdateBackgrounds()
                if self.outline:
                    self.DrawOutline()

        return property(**locals())

    @apply
    def position():
        doc = '(ui) position of hexMap'

        def fget(self):
            return (self._left, self._top)

        def fset(self, value):
            self.left = value[0]
            self.top = value[1]

        return property(**locals())

    @apply
    def size():
        doc = '(ui) size of hexMap'

        def fget(self):
            return (self._width, self._height)

        def fset(self, value):
            self.width = value[0]
            self.height = value[1]

        return property(**locals())