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

tierGauge.py (5507B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\cosmetics\ship\pages\studio\tierGauge.py
      2 import math
      3 from carbonui import Align
      4 from carbonui.text.styles import TextBody
      5 from carbonui.primitives.container import Container
      6 from carbonui.primitives.transform import Transform
      7 from carbonui.uianimations import animations
      8 from cosmetics.client.ships.skins.live_data import current_skin_design, current_skin_design_signals
      9 from eve.client.script.ui import eveColor
     10 from eve.client.script.ui.control.gaugeCircular import GaugeCircular
     11 from eve.client.script.ui.cosmetics.ship.pages.studio import studioSignals, studioUtil
     12 
     13 class TierGauge(Container):
     14     ANGLE_DEG = 30
     15     ANGLE_OFFSET_DEG = 1.8
     16 
     17     def __init__(self, *args, **kwargs):
     18         super(TierGauge, self).__init__(*args, **kwargs)
     19         self._radius = 0.0
     20         self.construct_layout()
     21         self.connect_signals()
     22 
     23     def Close(self):
     24         try:
     25             self.disconnect_signals()
     26         finally:
     27             super(TierGauge, self).Close()
     28 
     29     def connect_signals(self):
     30         current_skin_design_signals.on_tier_level_changed.connect(self.on_tier_level_changed)
     31         current_skin_design_signals.on_slot_fitting_changed.connect(self.on_slot_fitting_changed)
     32         current_skin_design_signals.on_design_reset.connect(self.on_design_reset)
     33         current_skin_design_signals.on_existing_design_loaded.connect(self.on_existing_design_loaded)
     34         studioSignals.on_scene_zoom.connect(self.on_scene_zoom)
     35 
     36     def disconnect_signals(self):
     37         current_skin_design_signals.on_tier_level_changed.disconnect(self.on_tier_level_changed)
     38         current_skin_design_signals.on_slot_fitting_changed.disconnect(self.on_slot_fitting_changed)
     39         current_skin_design_signals.on_design_reset.disconnect(self.on_design_reset)
     40         current_skin_design_signals.on_existing_design_loaded.disconnect(self.on_existing_design_loaded)
     41         studioSignals.on_scene_zoom.disconnect(self.on_scene_zoom)
     42 
     43     def construct_layout(self):
     44         self.gauge = GaugeCircular(name='gauge', parent=self, align=Align.CENTER, lineWidth=5.0, startAngle=math.radians(90 - self.ANGLE_DEG * 0.5), angle=math.radians(self.ANGLE_DEG), clockwise=False, showMarker=False, colorStart=eveColor.CRYO_BLUE, colorEnd=eveColor.CRYO_BLUE, value=0.0)
     45         self.current_tier_container = Transform(name='current_tier_container', parent=self, align=Align.CENTER)
     46         self.current_tier_label = TextBody(name='current_tier_label', parent=self.current_tier_container, align=Align.CENTER, padBottom=7, padLeft=3)
     47         self.next_tier_container = Transform(name='next_tier_container', parent=self, align=Align.CENTER)
     48         self.next_tier_label = TextBody(name='next_tier_label', parent=self.next_tier_container, align=Align.CENTER, padBottom=7)
     49         self.update_tier_values()
     50 
     51     def update_tier_values(self):
     52         tier_tresholds = current_skin_design.get().tier_thresholds
     53         tier_level = current_skin_design.get().tier_level
     54         if tier_level < tier_tresholds.get_max_tier():
     55             self.current_tier_label.text = '{tier}'.format(tier=tier_level)
     56             self.next_tier_label.text = '{tier}'.format(tier=tier_level + 1)
     57         else:
     58             self.current_tier_label.text = ''
     59             self.next_tier_label.text = '{tier}'.format(tier=tier_level)
     60         if tier_tresholds:
     61             tier_points = current_skin_design.get().tier_points
     62             max_value = tier_tresholds.get_threshold_for_tier(tier_level)
     63             if tier_level > 1:
     64                 min_value = tier_tresholds.get_threshold_for_tier(tier_level - 1)
     65             else:
     66                 min_value = 0
     67             if max_value is not None:
     68                 gauge_value = float(tier_points - min_value) / float(max_value - min_value)
     69             else:
     70                 gauge_value = 1
     71             self.gauge.SetValue(gauge_value)
     72         else:
     73             self.gauge.SetValue(0.0)
     74 
     75     def on_tier_level_changed(self, tier_level):
     76         self.update_tier_values()
     77 
     78     def on_slot_fitting_changed(self, slot_id, component_instance):
     79         self.update_tier_values()
     80 
     81     def on_design_reset(self, *args):
     82         self.update_tier_values()
     83 
     84     def on_existing_design_loaded(self, *args):
     85         self.update_tier_values()
     86 
     87     def on_scene_zoom(self, is_zoomed):
     88         target_opacity = 0.0 if is_zoomed else 1.0
     89         animations.FadeTo(self, self.opacity, target_opacity, duration=0.15)
     90 
     91     def update_radial_position(self):
     92         tier_angle_offset = self.ANGLE_OFFSET_DEG + self.ANGLE_DEG * 0.5
     93         current_tier_angle = 90 + tier_angle_offset
     94         current_tier_x, current_tier_y = studioUtil.get_radial_position(self.radius, current_tier_angle)
     95         self.current_tier_container.left = current_tier_x
     96         self.current_tier_container.top = current_tier_y
     97         self.current_tier_container.rotation = math.radians(-tier_angle_offset)
     98         next_tier_angle = 90 - tier_angle_offset
     99         next_tier_x, next_tier_y = studioUtil.get_radial_position(self.radius, next_tier_angle)
    100         self.next_tier_container.left = next_tier_x
    101         self.next_tier_container.top = next_tier_y
    102         self.next_tier_container.rotation = math.radians(tier_angle_offset)
    103         self.gauge.SetRadius(self.radius)
    104 
    105     @property
    106     def radius(self):
    107         return self._radius
    108 
    109     @radius.setter
    110     def radius(self, value):
    111         self._radius = value
    112         self.update_radial_position()