NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

medalribbonranks.py (33520B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\medalribbonranks.py
      2 import sys
      3 import utillib
      4 from carbon.common.script.util.commonutils import GetAttrs
      5 from carbonui import fontconst
      6 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText
      7 from carbonui.decorative.panelUnderlay import PanelUnderlay
      8 from carbonui.fontconst import EVE_MEDIUM_FONTSIZE, EVE_SMALL_FONTSIZE
      9 from carbonui.primitives.container import Container
     10 from carbonui.primitives.containerAutoSize import ContainerAutoSize
     11 from carbonui.primitives.fill import Fill
     12 from carbonui.primitives.frame import Frame
     13 from carbonui.primitives.sprite import Sprite
     14 from carbonui.button.group import ButtonGroup, ButtonSizeMode
     15 from carbonui.control.window import Window
     16 from eve.client.script.ui.util import uix
     17 import localization
     18 import carbonui.const as uiconst
     19 import trinity
     20 from eve.client.script.ui.control import eveIcon, eveLabel
     21 from eve.client.script.ui.control.colorpicker import ColorPreview
     22 from eve.client.script.ui.control.entries.label_text import LabelTextTop
     23 from carbonui.uicore import uicore
     24 from eve.client.script.ui.control.eveEditPlainText import EditPlainText
     25 from eve.client.script.ui.shared.neocom.wallet import walletUtil
     26 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     27 
     28 class Rank(Container):
     29     __guid__ = 'xtriui.Rank'
     30     rank = None
     31     warFactionID = None
     32 
     33     def Startup(self, warFactionID = None, rank = None):
     34         self.SetWarFaction(warFactionID)
     35         self.SetRank(rank)
     36         self.Flush()
     37         self.sr.rank = uix.GetRankSprite(rank, warFactionID, uiconst.TOALL)
     38         self.children.insert(0, self.sr.rank)
     39 
     40     def SetWarFaction(self, warFactionID):
     41         self.warFactionID = warFactionID
     42 
     43     def SetRank(self, rank):
     44         self.rank = rank
     45 
     46 
     47 class LayerBase(Container):
     48     __guid__ = 'xtriui.LayerBase'
     49 
     50     def ApplyAttributes(self, attributes):
     51         Container.ApplyAttributes(self, attributes)
     52         self.lname = None
     53         self.inited = False
     54         self.typeID = None
     55         self.selected = False
     56         self.idx = None
     57         self.data = []
     58         self.retdata = {}
     59         self.prettydata = {}
     60         self.sr.dad = None
     61         self.type = ''
     62 
     63     def Startup(self, name = 'Layer', data = None):
     64         self.name = '%sBase' % name
     65         if self.lname is None:
     66             self.lname = name
     67         self.Flush()
     68         self.LoadData(data)
     69         self.sr.selection = Fill(parent=self, padding=(1, 2, 2, 2), color=(1.0, 1.0, 1.0, 0.25))
     70         self.sr.selection.name = 'selected'
     71         self.SetSelected()
     72 
     73     def GetData(self, *args):
     74         return self.retdata
     75 
     76     def GetPrettyData(self, *args):
     77         self.prettydata = {}
     78         i = 1
     79         for lid, (type, mapping, color) in self.retdata.iteritems():
     80             if type and mapping:
     81                 self.prettydata[i] = (type, mapping, color)
     82                 i = i + 1
     83 
     84         return self.prettydata
     85 
     86     def LoadData(self, data = None, layerid = 0):
     87         if data is None:
     88             return
     89         self.data = data
     90         for lid, (type, mapping, color) in enumerate(data):
     91             if len(data) == 1:
     92                 lid = layerid
     93             par = self.GetLayer(lid)
     94             if not par:
     95                 par = Container(parent=self, align=uiconst.TOALL, pos=(0, 0, 0, 0), clipChildren=0, state=uiconst.UI_HIDDEN)
     96                 par.name = '%sLayer%s' % (self.lname, lid)
     97             spr = self.GetSprite(lid)
     98             if not spr:
     99                 sprite = Sprite(parent=par, align=uiconst.TOALL, left=0, lockAspect=1, state=uiconst.UI_DISABLED)
    100                 sprite.name = '%sSprite%s' % (self.lname, lid)
    101             if mapping != None:
    102                 self.SetSprite(lid, type, mapping)
    103             if color is not None and color != -1:
    104                 self.SetSpriteColor(lid, color)
    105 
    106     def SetSelected(self, selected = False):
    107         self.selected = selected
    108         if selected:
    109             self.sr.selection.state = uiconst.UI_DISABLED
    110         else:
    111             self.sr.selection.state = uiconst.UI_HIDDEN
    112         par = self.FindParentByName('ImageSlider')
    113         if par:
    114             par.mastertype = self.type
    115 
    116     def IsSelected(self):
    117         return bool(self.sr.selection.state == uiconst.UI_DISABLED)
    118 
    119     def GetLayer(self, id):
    120         obj = self.FindChild('%sLayer%s' % (self.lname, id))
    121         if obj:
    122             return obj
    123 
    124     def GetSprite(self, id):
    125         obj = self.FindChild('%sSprite%s' % (self.lname, id))
    126         if obj:
    127             return obj
    128 
    129     def GetSpriteColor(self, id):
    130         obj = self.GetSprite(id)
    131         if obj:
    132             return trinity.TriColor(*obj.color.GetRGBA()).AsInt()
    133 
    134     def ClearSprite(self, id):
    135         self.SetSprite(id, '', '')
    136 
    137     def SetSprite(self, id, type, mapping):
    138         obj = self.GetSprite(id)
    139         if not obj:
    140             return
    141         self.type = type
    142         lay = self.GetLayer(id)
    143         if lay:
    144             if type and mapping:
    145                 lay.state = uiconst.UI_PICKCHILDREN
    146             else:
    147                 lay.state = uiconst.UI_HIDDEN
    148             if lay not in self.retdata:
    149                 self.retdata[id] = (type, mapping, self.GetSpriteColor(id))
    150             curr = self.retdata[id]
    151             self.retdata[id] = (type, mapping, self.GetSpriteColor(id))
    152         return obj
    153 
    154     def SetSpriteColor(self, id, color):
    155         obj = self.GetSprite(id)
    156         if obj:
    157             c = trinity.TriColor()
    158             c.FromInt(color)
    159             obj.color = (c.r,
    160              c.g,
    161              c.b,
    162              c.a)
    163             if id not in self.retdata:
    164                 self.retdata[id] = ('', None, 0)
    165             curr = self.retdata[id]
    166             self.retdata[id] = (curr[0], curr[1], color)
    167 
    168     def SetHSV(self, id, hsv):
    169         if not self or self.destroyed:
    170             return
    171         obj = self.GetSprite(id)
    172         if obj:
    173             obj.color.SetHSV(*hsv)
    174             if id not in self.retdata:
    175                 self.retdata[id] = ('', 0)
    176             curr = self.retdata[id]
    177             colInt = trinity.TriColor(*obj.color.GetRGBA()).AsInt()
    178             self.retdata[id] = (curr[0], curr[1], colInt)
    179 
    180     def MapLogo(self, iconNum, sprite, root):
    181         texpix, num = iconNum.split('_')
    182         while texpix.find('0') == 0:
    183             texpix = texpix[1:]
    184 
    185         texturePath = '%s%s%s.dds' % (root, ['', '0'][int(texpix) < 10], texpix)
    186         sprite.SetTexturePath(str(texturePath))
    187         num = int(num)
    188         sprite.rectWidth = sprite.rectHeight = 128
    189         sprite.rectLeft = [0, 128][num in (2, 4)]
    190         sprite.rectTop = [0, 128][num > 2]
    191 
    192 
    193 class Medal(LayerBase):
    194     __guid__ = 'xtriui.Medal'
    195     typeID = const.typeMedal
    196 
    197     def Startup(self, data = None):
    198         self.Flush()
    199         LayerBase.Startup(self, 'Medal', data)
    200 
    201     def SetSprite(self, id, type, iconNum):
    202         obj = LayerBase.SetSprite(self, id, type, iconNum)
    203         if iconNum and type and obj:
    204             self.MapLogo(iconNum, obj, root='res:/UI/Texture/Medals/Medals/%s' % type.lower())
    205         return obj
    206 
    207 
    208 class Ribbon(LayerBase):
    209     __guid__ = 'xtriui.Ribbon'
    210     typeID = const.typeRibbon
    211 
    212     def Startup(self, data = None):
    213         self.Flush()
    214         LayerBase.Startup(self, 'Ribbon', data)
    215 
    216     def SetSprite(self, id, type, iconNum):
    217         obj = LayerBase.SetSprite(self, id, type, iconNum)
    218         if iconNum and type and obj:
    219             self.MapLogo(iconNum, obj, root='res:/UI/Texture/Medals/Ribbons/%s' % type.lower())
    220         return obj
    221 
    222 
    223 class MedalRibbon(Container):
    224     __guid__ = 'xtriui.MedalRibbon'
    225 
    226     def Startup(self, data = None, size = 128, *args):
    227         ribbondata = []
    228         medaldata = []
    229         if data is None:
    230             data = []
    231         else:
    232             ribbon, ribbondata = data[0]
    233             medal, medaldata = data[1]
    234         top = 0
    235         imgSize = size / 2
    236         for i, (each, obj, data, toppush, size) in enumerate((('ribbon',
    237           ribbon,
    238           ribbondata,
    239           0,
    240           imgSize), ('medal',
    241           medal,
    242           medaldata,
    243           float(imgSize) - float(imgSize) * 20.0 / 128.0,
    244           imgSize))):
    245             mr = obj(name=each, parent=self, align=uiconst.TOPLEFT, left=0, top=top + int(toppush), width=size, height=size, state=uiconst.UI_NORMAL)
    246             mr.Startup(data)
    247             setattr(self.sr, each, mr)
    248             top += toppush
    249 
    250 
    251 class ImageSlider(Container):
    252     __guid__ = 'xtriui.ImageSlider'
    253 
    254     def ApplyAttributes(self, attributes):
    255         Container.ApplyAttributes(self, attributes)
    256         self.initing = False
    257         self.data = None
    258         self.curridx = 0
    259         self.cursoridx = 0
    260         self.visiblecount = 2
    261         self.isBrowsing = False
    262         self.sr.dad = None
    263         self.sr.dadlayer = None
    264         self.isTabStop = 1
    265         self.sr.activeframe = None
    266         self.selected = 0
    267         self.keepselection = False
    268         self.width += 4
    269 
    270     def Startup(self, dataset, *args):
    271         self.data = dataset
    272         self.isTabStop = 1
    273         l, t, w, h = self.GetAbsolute()
    274         self.Flush()
    275         self.visiblecount = w / h - 1
    276         self.actualcount = min(len(self.data), self.visiblecount)
    277         self.maximumcount = min(len(self.data), self.visiblecount) + 2
    278         self.boundaryLeft = 0
    279         self.boundaryRight = len(self.data) - self.visiblecount
    280         prv = Container(name='ImgSliderPrev', align=uiconst.TOLEFT, width=h / 2, parent=self)
    281         prv.OnClick = (self.Browse, -1)
    282         self.sr.prev = prv
    283         Frame(parent=prv, color=(1.0, 1.0, 1.0, 0.125))
    284         Container(name='push', align=uiconst.TOLEFT, width=2, parent=self)
    285         eveIcon.Icon(icon='ui_38_16_223', parent=prv, size=16, left=0, top=0, align=uiconst.CENTER, state=uiconst.UI_DISABLED, hint=localization.GetByLabel('UI/Corporations/CreateDecorationWindow/PreviousItem'))
    286         Fill(parent=prv, color=(0.0, 0.0, 0.0, 0.25))
    287         nxt = Container(name='ImgSliderNext', align=uiconst.TORIGHT, width=h / 2, parent=self)
    288         nxt.OnClick = (self.Browse, 1)
    289         self.sr.next = nxt
    290         Frame(parent=nxt, color=(1.0, 1.0, 1.0, 0.125))
    291         Container(name='push', align=uiconst.TORIGHT, width=2, parent=self)
    292         eveIcon.Icon(icon='ui_38_16_224', parent=nxt, size=16, left=0, top=0, align=uiconst.CENTER, state=uiconst.UI_DISABLED, hint=localization.GetByLabel('UI/Corporations/CreateDecorationWindow/NextItem'))
    293         Fill(parent=nxt, color=(0.0, 0.0, 0.0, 0.25))
    294         self.sr.mainpar = Container(name='ImgSliderMainPar', parent=self, align=uiconst.TOALL, state=uiconst.UI_NORMAL)
    295         self.sr.main = Container(name='ImgSliderMain', parent=self.sr.mainpar, align=uiconst.TOALL, state=uiconst.UI_NORMAL, clipChildren=1)
    296         self.sr.backgroundFrame = PanelUnderlay(parent=self, padding=(-1, -1, -1, -1))
    297         Fill(parent=self, color=(0.0, 0.0, 0.0, 0.25))
    298         self.Initialize()
    299 
    300     def Initialize(self, *args):
    301         if self.initing:
    302             return
    303         self.initing = True
    304         self.PrepareData()
    305         self.Browse(0)
    306         self.initing = False
    307 
    308     def PrepareData(self):
    309         l, t, w, h = self.GetAbsolute()
    310         for i in range(self.visiblecount + 2):
    311             try:
    312                 obj, ret = self.data[i - 1]
    313             except:
    314                 obj, ret = (None, None)
    315                 sys.exc_clear()
    316 
    317             slimdeco = self.sr.main.FindChild('cont_%s' % i)
    318             if slimdeco is None:
    319                 slimdeco = Container(name='cont_%s' % i, parent=self.sr.main, align=uiconst.TOLEFT, left=0, top=0, width=h, state=uiconst.UI_NORMAL)
    320             self.SetObject(slimdeco, obj, ret)
    321             if i == 0:
    322                 left = 0
    323 
    324         if self.actualcount < self.visiblecount:
    325             self.sr.main.children[-1].Close()
    326 
    327     def GetActiveFrame(self):
    328         if self.sr.activeframe is None:
    329             self.sr.activeframe = Frame(parent=self.sr.mainpar, left=0, top=0, width=0, height=0, color=(1.0,
    330              1.0,
    331              1.0,
    332              uiconst.ACTIVE_FRAME_ALPHA), idx=0, state=uiconst.UI_HIDDEN)
    333 
    334     def SetObject(self, parent, obj, ret, direction = None):
    335         if None in (parent, obj, ret):
    336             return
    337         se = obj(name='', parent=parent, align=uiconst.TOALL, state=uiconst.UI_NORMAL, pos=(0, 0, 0, 0), idx=0)
    338         se.Startup(ret)
    339         se.OnClick = (self.OnChildMouseClicked, se)
    340         if direction == -1:
    341             se.idx = max(0, self.curridx - 1)
    342         else:
    343             se.idx = len(self.sr.main.children) - 2 + self.curridx
    344         se.sr.dad = self
    345         parent.sr.obj = se
    346 
    347     def OnChildMouseClicked(self, object, *args):
    348         self.cursoridx = object.idx + 1
    349         self.OnChildClick(object)
    350 
    351     def OnChildClick(self, object, *args):
    352         for each in self.sr.main.children:
    353             selector = GetAttrs(each, 'sr', 'obj', 'SetSelected')
    354             if selector is not None:
    355                 selector()
    356 
    357         object.SetSelected(True)
    358         self.sr.dad.LoadData(object.data, self.sr.dadlayer)
    359         self.PostOnClick(self)
    360 
    361     def PostOnClick(self, *args):
    362         pass
    363 
    364     def SetParentListener(self, object, layer = None):
    365         self.sr.dad = object
    366         self.sr.dadlayer = layer
    367 
    368     def GetEntry(self, idx):
    369         se = self.FindChild('sliderEntry_%s' % idx)
    370         if se:
    371             return se
    372 
    373     def OnSetFocus(self, *args):
    374         self.GetActiveFrame()
    375         if self.sr.activeframe:
    376             self.sr.activeframe.state = uiconst.UI_DISABLED
    377 
    378     def OnKillFocus(self, *args):
    379         self.GetActiveFrame()
    380         if self.sr.activeframe:
    381             self.sr.activeframe.state = uiconst.UI_HIDDEN
    382 
    383     def OnLeft(self, *args):
    384         self.DelegateControl(-1)
    385 
    386     def OnRight(self, *args):
    387         self.DelegateControl(1)
    388 
    389     def DelegateControl(self, direction, *args):
    390         if self.isBrowsing:
    391             return
    392         shift = uicore.uilib.Key(uiconst.VK_SHIFT)
    393         ctrl = uicore.uilib.Key(uiconst.VK_CONTROL)
    394         self.cursoridx += direction
    395         self.cursoridx = self.GetCurrentCursor()
    396         index = self.cursoridx - self.curridx
    397         numChildren = len(self.sr.main.children)
    398         if index < 0:
    399             self.cursoridx = self.curridx + 1
    400             self.cursoridx = self.GetCurrentCursor()
    401         elif index > numChildren - 1:
    402             self.cursoridx = self.curridx + numChildren - 2
    403             self.cursoridx = self.GetCurrentCursor()
    404         obj = self.sr.main.children[self.cursoridx - self.curridx].sr.obj
    405         self.OnChildClick(obj)
    406         if direction == 1:
    407             if self.cursoridx > self.curridx + self.visiblecount:
    408                 self.Browse(direction)
    409         elif direction == -1:
    410             if self.cursoridx <= self.curridx:
    411                 self.Browse(direction)
    412 
    413     def IsRightDisabled(self, *args):
    414         return self.GetCurrentIndex() >= self.boundaryRight
    415 
    416     def IsLeftDisabled(self, *args):
    417         return self.GetCurrentIndex() <= self.boundaryLeft
    418 
    419     def GetCurrentIndex(self, *args):
    420         return max(0, min(self.curridx, self.boundaryRight))
    421 
    422     def GetCurrentCursor(self, *args):
    423         return max(1, min(self.cursoridx, len(self.data)))
    424 
    425     def Browse(self, direction, *args):
    426         if self.isBrowsing:
    427             return
    428         if direction == 2:
    429             for x in xrange(0, 8):
    430                 self.Browse(1)
    431 
    432         if direction == -2:
    433             for x in xrange(0, 8):
    434                 self.Browse(-1)
    435 
    436         l, t, w, h = self.GetAbsolute()
    437         self.isBrowsing = True
    438         self.curridx += direction
    439         self.curridx = self.GetCurrentIndex()
    440         self.cursoridx = self.GetCurrentCursor()
    441         colors = {'red': (0.4, 0.13, 0.13, 0.8),
    442          'green': (0.27, 0.53, 0.22, 0.8)}
    443         if self.IsRightDisabled():
    444             self.sr.next.state = uiconst.UI_DISABLED
    445             self.sr.next.opacity = 0.4
    446         else:
    447             self.sr.next.state = uiconst.UI_NORMAL
    448             self.sr.next.opacity = 1.0
    449         if self.IsLeftDisabled():
    450             self.sr.prev.state = uiconst.UI_DISABLED
    451             self.sr.prev.opacity = 0.4
    452         else:
    453             self.sr.prev.state = uiconst.UI_NORMAL
    454             self.sr.prev.opacity = 1.0
    455         if direction == -1:
    456             item = self.sr.main.children[-1]
    457             item.SetOrder(0)
    458             item.Flush()
    459             obj, data = self.data[max(0, self.curridx - 1)]
    460             self.SetObject(item, obj, data, direction=direction)
    461         elif direction == 1:
    462             item = self.sr.main.children[0]
    463             item.SetOrder(-1)
    464             item.Flush()
    465             obj, data = self.data[min(self.curridx + self.visiblecount, len(self.data) - 1)]
    466             self.SetObject(item, obj, data, direction=direction)
    467         self.sr.main.children[0].left = -h
    468         for i, each in enumerate(self.sr.main.children[:]):
    469             if i > 0:
    470                 each.left = 0
    471 
    472         self.isBrowsing = False
    473 
    474 
    475 class MedalRibbonPickerWindow(Window):
    476     __guid__ = 'form.MedalRibbonPickerWindow'
    477     default_windowID = 'MedalRibbonPickerWindow'
    478     default_iconNum = 'res:/ui/Texture/WindowIcons/corporationdecorations.png'
    479 
    480     def ApplyAttributes(self, attributes):
    481         Window.ApplyAttributes(self, attributes)
    482         self.submitting = False
    483         self.currentselection = None
    484         self.SetCaption(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Title'))
    485         self.SetMinSize([465, 630])
    486         self.MakeUnResizeable()
    487         self.AddSliders()
    488 
    489     def SubmitData(self, *args):
    490         if self.submitting:
    491             return
    492         self.submitting = True
    493         missingFields = []
    494         mName = self.sr.medalname.GetValue()
    495         if not bool(mName):
    496             missingFields.append(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/DecorationName'))
    497         mDesc = self.sr.medaldesc.GetAllText()
    498         if not bool(mDesc):
    499             missingFields.append(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Description'))
    500         rData = self.sr.medalribbonobject.sr.ribbon.GetPrettyData()
    501         if not rData:
    502             missingFields.append(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Ribbon'))
    503         mData = self.sr.medalribbonobject.sr.medal.GetPrettyData()
    504         if not mData:
    505             missingFields.append(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Medal'))
    506         walletAccess = walletUtil.HaveAccessToCorpWalletDivision(session.corpAccountKey)
    507         if not walletAccess:
    508             if prompt_player_fsd_dialog('SelectWalletDivision', {}, uiconst.YESNO) == uiconst.ID_YES:
    509                 walletUtil.SelectWalletDivision()
    510             else:
    511                 missingFields.append(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/ActiveWalletDivision'))
    512         k = getattr(session, 'corpAccountKey')
    513         if k is None and localization.GetByLabel('UI/Corporations/CreateDecorationWindow/ActiveWalletDivision') not in missingFields:
    514             missingFields.append(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/ActiveWalletDivision'))
    515         if missingFields:
    516             prompt_player_fsd_dialog('GenericMissingInfo', {'fields': localization.GetByLabel('UI/Map/StarMap/lblBoldName', name=', '.join(missingFields))})
    517             self.submitting = False
    518             return
    519         cMedalData = []
    520         for lid, (type, mapping, color) in rData.iteritems():
    521             cMedalData.append([1, '.'.join((type, mapping)), color])
    522 
    523         for lid, (type, mapping, color) in mData.iteritems():
    524             cMedalData.append([2, '.'.join((type, mapping)), color])
    525 
    526         try:
    527             sm.StartService('medals').CreateMedal(mName, mDesc, cMedalData)
    528             self.Close()
    529         finally:
    530             self.submitting = False
    531 
    532     def AddSliders(self, *args):
    533         self.currentselection = None
    534         self.ribbonsliders = []
    535         self.medalsliders = []
    536         self.sr.main.Flush()
    537         ribbondata = [Ribbon, [('', None, None),
    538           ('', None, None),
    539           ('', None, None),
    540           ('', None, None),
    541           ('', None, None)]]
    542         medaldata = [Medal, [('', None, None),
    543           ('', None, None),
    544           ('', None, None),
    545           ('', None, None)]]
    546         top = 0
    547         imgSize = 128
    548         self.sr.buttoncont = ContainerAutoSize(name='Buttons', align=uiconst.TOBOTTOM, parent=self.sr.main)
    549         self.sr.mainpar = Container(name='MainPar', align=uiconst.TOALL, parent=self.sr.main, pos=(0, 0, 0, 0))
    550         mp = Container(name='Left', align=uiconst.TOLEFT, width=imgSize, left=const.defaultPadding, top=const.defaultPadding, parent=self.sr.mainpar)
    551         medalribbonobject = MedalRibbon(name='MedalRibbonParent', width=128, height=256, parent=mp, align=uiconst.CENTER)
    552         medalribbonobject.Startup([ribbondata, medaldata], imgSize * 2)
    553         self.sr.medalribbonobject = medalribbonobject
    554         btns = []
    555         btns.append([localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Submit'),
    556          self.SubmitData,
    557          None,
    558          None])
    559         btns.append([localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Reset'),
    560          self.AddSliders,
    561          None,
    562          None])
    563         buttons = ButtonGroup(btns=btns, parent=self.sr.buttoncont, button_size_mode=ButtonSizeMode.DYNAMIC)
    564         self.sr.mainselector = Container(name='MainSelector', align=uiconst.TOALL, parent=self.sr.mainpar, pos=(const.defaultPadding,
    565          0,
    566          const.defaultPadding,
    567          0))
    568         uix.GetContainerHeader(localization.GetByLabel('UI/Contracts/BasicInfo'), self.sr.mainselector, 0)
    569         Container(name='push', align=uiconst.TOTOP, height=6, parent=self.sr.mainselector)
    570         medalnamecont = Container(parent=self.sr.mainselector, align=uiconst.TOTOP)
    571         Container(name='push', align=uiconst.TOTOP, height=24, parent=medalnamecont)
    572         Container(name='push', align=uiconst.TOLEFT, width=4, parent=medalnamecont)
    573         Container(name='push', align=uiconst.TORIGHT, width=4, parent=medalnamecont)
    574         self.sr.medalname = SingleLineEditText(name='medalname', parent=medalnamecont, setvalue=None, pos=(0, 12, 284, 0), label=localization.GetByLabel('UI/Corporations/CreateDecorationWindow/DecorationName'), maxLength=100)
    575         top = const.defaultPadding + self.sr.medalname.top + self.sr.medalname.height
    576         eveLabel.EveLabelSmall(text=localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Description'), parent=medalnamecont, top=top, width=100)
    577         self.sr.medaldesc = EditPlainText(setvalue='', parent=medalnamecont, align=uiconst.TOPLEFT, name='medaldesc', maxLength=1000, top=top + 16, left=-1, width=286, height=64)
    578         medalnamecont.height = self.sr.medalname.height + self.sr.medaldesc.height + 8 + 23
    579         Container(name='push', align=uiconst.TOTOP, height=4, parent=self.sr.mainselector)
    580         uix.GetContainerHeader(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Ribbon'), self.sr.mainselector, 1)
    581         labels = ['caldari',
    582          'minmatar',
    583          'gallente',
    584          'amarr']
    585         data = []
    586         for label in labels:
    587             data.append([Ribbon, [(label, '1_1', None),
    588               ('', None, None),
    589               ('', None, None),
    590               ('', None, None),
    591               (label, '1_2', None)]])
    592 
    593         slider = self.GetImageSlider(data)
    594         slider.SetParentListener(self.sr.medalribbonobject.sr.ribbon, None)
    595         slider.SetAlign(uiconst.TOPRIGHT)
    596         slider.PostOnClick = self.PostOnClick
    597         self.sr.baseribbonslider = slider
    598         self.ribbonsliders.append(slider)
    599         parent = slider.parent
    600         colorPreview = ColorPreview(name='colorPreview', align=uiconst.TORIGHT, height=32, width=32)
    601         Frame(parent=colorPreview, color=(1.0, 1.0, 1.0, 0.5))
    602         colorPreview.Startup()
    603         colorPreview.sr.layerid = 4
    604         colorPreview.sr.dad = self.sr.medalribbonobject.sr.ribbon
    605         colorPreview.FromInt(-330271)
    606         colorPreview.state = uiconst.UI_HIDDEN
    607         push = Container(name='push', align=uiconst.TORIGHT, height=32, width=4)
    608         slider.parent.children.insert(0, push)
    609         slider.parent.children.insert(0, colorPreview)
    610         ranger = range(1, 4)
    611         ranger.reverse()
    612         for x in ranger:
    613             data = []
    614             data = self.GetRibbonShapeData('Caldari')
    615             slider = self.GetImageSlider(data, True)
    616             slider.SetParentListener(self.sr.medalribbonobject.sr.ribbon, x)
    617             slider.SetAlign(uiconst.TOPRIGHT)
    618             slider.PostOnClick = self.PostOnClick
    619             parent = slider.parent
    620             self.AddSliderReset(slider)
    621             colorPreview = ColorPreview(name='colorPreview', align=uiconst.TORIGHT, width=32, height=32)
    622             Frame(parent=colorPreview, color=(1.0, 1.0, 1.0, 0.5))
    623             colorPreview.Startup()
    624             colorPreview.sr.layerid = x
    625             colorPreview.sr.dad = self.sr.medalribbonobject.sr.ribbon
    626             colorPreview.FromInt(-330271)
    627             colorPreview.state = uiconst.UI_HIDDEN
    628             push = Container(name='push', align=uiconst.TORIGHT, height=32, width=4)
    629             slider.parent.children.insert(0, push)
    630             slider.parent.children.insert(0, colorPreview)
    631             slider.parent.state = uiconst.UI_HIDDEN
    632             self.ribbonsliders.append(slider)
    633 
    634         Container(name='push', align=uiconst.TOTOP, height=4, parent=self.sr.mainselector)
    635         uix.GetContainerHeader(localization.GetByLabel('UI/Corporations/CreateDecorationWindow/Medal'), self.sr.mainselector, 1)
    636         labels = (('compass', 2),
    637          ('imperial', 2),
    638          ('pentagon', 1),
    639          ('rombus', 1),
    640          ('round', 6),
    641          ('shield', 1),
    642          ('square', 2),
    643          ('star', 7))
    644         data = []
    645         for label, amount in labels:
    646             for x in xrange(0, amount * 4):
    647                 icon = '%s_%s' % (x / 4 + 1, x % 4 + 1)
    648                 data.append([Medal, [(label, icon, None)]])
    649 
    650         slider = self.GetImageSlider(data)
    651         slider.SetParentListener(self.sr.medalribbonobject.sr.medal, 3)
    652         slider.SetAlign(uiconst.TOPRIGHT)
    653         slider.PostOnClick = self.PostOnClick
    654         self.sr.basemedalslider = slider
    655         self.medalsliders.append(slider)
    656         labels = (('elements', 33),)
    657         ranger = range(0, 3)
    658         ranger.reverse()
    659         for i in ranger:
    660             data = []
    661             for label, amount in labels:
    662                 for x in xrange(0, amount * 4):
    663                     icon = '%s_%s' % (x / 4 + 1, x % 4 + 1)
    664                     data.append([Medal, [(label, icon, None)]])
    665 
    666             slider = self.GetImageSlider(data)
    667             slider.SetParentListener(self.sr.medalribbonobject.sr.medal, i)
    668             slider.PostOnClick = self.PostOnClick
    669             slider.SetAlign(uiconst.TOPRIGHT)
    670             slider.parent.state = uiconst.UI_HIDDEN
    671             self.AddSliderReset(slider)
    672             self.medalsliders.append(slider)
    673 
    674     def AddSliderReset(self, slider):
    675         rem = Container(name='ImgSliderRemove', align=uiconst.TOLEFT, width=16, height=32)
    676         Frame(parent=rem, color=(1.0, 1.0, 1.0, 0.125))
    677         dbtn = eveIcon.Icon(icon='ui_38_16_111', parent=rem, size=16, left=0, top=0, align=uiconst.CENTER)
    678         dbtn.OnClick = (self.ResetSlider, dbtn)
    679         dbtn.hint = localization.GetByLabel('UI/Corporations/CreateDecorationWindow/ResetItem')
    680         dbtn.slider = slider
    681         Fill(parent=rem, color=(0.0, 0.0, 0.0, 0.25))
    682         push = Container(name='push', align=uiconst.TOLEFT, height=32, width=4)
    683         slider.parent.children.insert(0, rem)
    684         slider.parent.children.insert(0, push)
    685 
    686     def ResetSlider(self, obj, *args):
    687         slider = obj.slider
    688         slider.sr.dad.ClearSprite(slider.sr.dadlayer)
    689         slider.parent.state = uiconst.UI_HIDDEN
    690 
    691     def PostOnClick(self, obj, *args):
    692         if obj in self.ribbonsliders:
    693             idx = self.ribbonsliders.index(obj)
    694             nidx = idx + 1
    695             colorPreview = obj.parent.FindChild('colorPreview')
    696             if colorPreview:
    697                 colorPreview.state = uiconst.UI_PICKCHILDREN
    698             if len(self.ribbonsliders) <= nidx:
    699                 return
    700             self.ribbonsliders[nidx].parent.state = uiconst.UI_PICKCHILDREN
    701             if idx == 0:
    702                 mtype = getattr(obj, 'mastertype', None)
    703                 if mtype is not None and self.currentselection != mtype:
    704                     for slider in self.ribbonsliders[1:]:
    705                         slider.sr.dad.ClearSprite(slider.sr.dadlayer)
    706                         data = self.GetRibbonShapeData(mtype)
    707                         slider.Startup(data)
    708 
    709         elif obj in self.medalsliders:
    710             idx = self.medalsliders.index(obj)
    711             nidx = idx + 1
    712             if len(self.medalsliders) <= nidx:
    713                 return
    714             self.medalsliders[nidx].parent.state = uiconst.UI_PICKCHILDREN
    715         self.currentselection = getattr(self.ribbonsliders[0], 'mastertype', None)
    716 
    717     def GetImageSlider(self, data, ks = False, *args):
    718         size, amount = (32, 7)
    719         cont = Container(name='ImageSliderPar', parent=self.sr.mainselector, align=uiconst.TOTOP, height=size, top=const.defaultPadding, state=uiconst.UI_NORMAL)
    720         slider = ImageSlider(name='ImageSlider', parent=cont, clipChildren=0, align=uiconst.TOPLEFT, width=size * amount, height=size, left=const.defaultPadding + size, state=uiconst.UI_NORMAL)
    721         if ks:
    722             slider.keepselection = True
    723         slider.Startup(data)
    724         return slider
    725 
    726     def GetRibbonShapeData(self, selectedRace, *args):
    727         labels = [(selectedRace, 11)]
    728         ret = []
    729         for label, amount in labels:
    730             for x in xrange(4, amount):
    731                 icon = '%s_%s' % (x / 4 + 1, x % 4 + 1)
    732                 ret.append([Ribbon, [(label, icon, None)]])
    733 
    734         return ret
    735 
    736 
    737 class RankEntry(LabelTextTop):
    738     __guid__ = 'listentry.RankEntry'
    739     __params__ = ['label',
    740      'text',
    741      'warFactionID',
    742      'rank']
    743 
    744     def Startup(self, *args):
    745         LabelTextTop.Startup(self, *args)
    746         rankobject = Rank(name='rankobject', align=uiconst.CENTERLEFT, left=3, parent=self, idx=0)
    747         self.sr.rankobject = rankobject
    748 
    749     def Load(self, node):
    750         LabelTextTop.Load(self, node)
    751         self.sr.label.left = self.sr.text.left = self.height + 10
    752         self.sr.label.top = 9
    753         self.sr.text.top = self.sr.label.top + self.sr.label.textheight
    754         size = node.Get('iconsize', 48)
    755         self.sr.rankobject.width = self.sr.rankobject.height = size
    756         self.sr.rankobject.Startup(node.warFactionID, node.rank)
    757 
    758     def ShowInfo(self, *args):
    759         typeID = self.sr.node.Get('typeID', None)
    760         warFactionID = self.sr.node.Get('warFactionID', None)
    761         currentRank = self.sr.node.Get('rank', None)
    762         if None not in (typeID, warFactionID, currentRank):
    763             abstractinfo = utillib.KeyVal(warFactionID=warFactionID, currentRank=currentRank)
    764             sm.GetService('info').ShowInfo(typeID, abstractinfo=abstractinfo)
    765 
    766     def GetHeight(self, *args):
    767         node, width = args
    768         iconSize = node.Get('iconsize', 48)
    769         labelheight = uix.GetTextHeight(node.label, fontsize=fontconst.EVE_SMALL_FONTSIZE, maxLines=1, uppercase=1)
    770         textheight = uix.GetTextHeight(node.text, fontsize=fontconst.EVE_MEDIUM_FONTSIZE, maxLines=1)
    771         node.height = max(iconSize, 18 + labelheight + textheight)
    772         return node.height
    773 
    774 
    775 class MedalRibbonEntry(LabelTextTop):
    776     __guid__ = 'listentry.MedalRibbonEntry'
    777     __params__ = ['label', 'text', 'abstractinfo']
    778 
    779     def Startup(self, *args):
    780         LabelTextTop.Startup(self, *args)
    781         medalribbonobject = MedalRibbon(name='MedalRibbonParent', parent=self, align=uiconst.TOPLEFT, width=32, height=32, left=1, top=1)
    782         self.sr.medalribbonobject = medalribbonobject
    783 
    784     def Load(self, node):
    785         LabelTextTop.Load(self, node)
    786         self.sr.medalribbonobject.Flush()
    787         typeID = node.Get('typeID', None)
    788         itemID = node.Get('itemID', None)
    789         abstractinfo = node.Get('abstractinfo', None)
    790         if None not in (typeID, itemID, abstractinfo):
    791             self.sr.infoicon.state = uiconst.UI_NORMAL
    792         else:
    793             self.sr.infoicon.state = uiconst.UI_HIDDEN
    794         size = node.Get('iconsize', 32)
    795         self.sr.icon.state = uiconst.UI_HIDDEN
    796         self.sr.medalribbonobject.width = size * 2
    797         self.sr.medalribbonobject.height = size
    798         self.sr.medalribbonobject.left = 8
    799         self.sr.medalribbonobject.top = 3
    800         self.sr.medalribbonobject.Startup(node.abstractinfo, size)
    801         self.sr.label.left = self.sr.text.left = 32
    802 
    803     def ShowInfo(self, *args):
    804         if self.sr.node.Get('typeID', None) and self.sr.node.Get('abstractinfo', None):
    805             sm.GetService('info').ShowInfo(self.sr.node.typeID, self.sr.node.itemID, abstractinfo=self.sr.node.Get('abstractinfo', None))
    806 
    807     def GetHeight(self, *args):
    808         node, width = args
    809         labelheight = uix.GetTextHeight(node.label, fontsize=EVE_SMALL_FONTSIZE, maxLines=1, uppercase=1)
    810         textheight = uix.GetTextHeight(node.text, fontsize=EVE_MEDIUM_FONTSIZE, maxLines=1)
    811         size = node.Get('iconsize', 32)
    812         node.height = max(labelheight + textheight, size) + 2
    813         return node.height