diff --git a/simulators/ursina/ui_component.py b/simulators/ursina/ui_component.py index d96785cc9bc091f83c6cf124b01100a3e3a60cf4..b6e793be28e5693bcad1e47bd99a691efac22d6b 100644 --- a/simulators/ursina/ui_component.py +++ b/simulators/ursina/ui_component.py @@ -35,9 +35,10 @@ class UiSlider(Slider): # self.height *= 8/10 + class SwithButton(ButtonGroup): def __init__(self, options, default, tooltips=None): - super().__init__(options, min_selection=1, y=-1, default=default, + super().__init__(options, min_selection=1,default=default, selected_color=color.rgba(0.1, 0.6, 0.1, 1.0), ignore_paused=True, color=color.rgba(0.0, 0.0, 0.0, 0.5)) # self.label.scale = 0.8 @@ -49,6 +50,7 @@ class SwithButton(ButtonGroup): tooltip = Tooltip(tooltips[i]) tooltip.font = UrsinaConfig.CN_FONT button.tooltip = tooltip + self.x = -0.5 class UiButton(Button): diff --git a/simulators/ursina/ursina_event.py b/simulators/ursina/ursina_event.py index 449fd608f365fa515c7f11aeea2992e030a07f9b..138d6dda760f250d3abd0933f3ee7b2e6cee9a16 100644 --- a/simulators/ursina/ursina_event.py +++ b/simulators/ursina/ursina_event.py @@ -19,6 +19,11 @@ class UrsinaEvent: if hasattr(UrsinaEvent, "on_reset_funcs"): return UrsinaEvent.on_reset_funcs = [] + UrsinaEvent.on_searching_bodies_funcs = [] + + @staticmethod + def on_searching_bodies_subscription(subscription_name, fun): + UrsinaEvent.on_searching_bodies_funcs.append((subscription_name, fun)) @staticmethod def on_reset_subscription(fun): @@ -29,5 +34,12 @@ class UrsinaEvent: for f in UrsinaEvent.on_reset_funcs: f() + @staticmethod + def on_searching_bodies(**kwargs): + results = [] + for subscription_name, fun in UrsinaEvent.on_searching_bodies_funcs: + results.append((subscription_name, fun(**kwargs))) + return results + UrsinaEvent.init() diff --git a/simulators/ursina/ursina_ui.py b/simulators/ursina/ursina_ui.py index 8e8823e875ef332e1cee6578bdd6f6b5dc065527..164e00f1d3dc869c4acae6b143c80f646dc48254 100644 --- a/simulators/ursina/ursina_ui.py +++ b/simulators/ursina/ursina_ui.py @@ -7,7 +7,7 @@ # python_version :3.8 # ============================================================================== from ursina import Ursina, window, Entity, Grid, Mesh, camera, Text, application, color, mouse, Vec2, Vec3, \ - load_texture, held_keys, Button + load_texture, held_keys, Button, ButtonList, destroy from ursina.prefabs.first_person_controller import FirstPersonController from simulators.ursina.ui_component import UiSlider, SwithButton, UiButton @@ -55,7 +55,7 @@ class UrsinaUI: tooltips=('天体运行无轨迹', '天体运行有拖尾轨迹')) self.on_off_trail.on_value_changed = self.on_off_trail_changed - self.point_button = UiButton(text='寻找', on_click=self.on_point_button_click) + self.point_button = UiButton(text='寻找', on_click=self.on_searching_bodies_click) self.reset_button = UiButton(text='重置', on_click=self.on_reset_button_click) # button1 = Button(text='Button 1', scale=(0.1, 0.1), position=(-0.1, 0)) @@ -92,8 +92,11 @@ class UrsinaUI: self.slider_run_speed_factor, self.slider_control_speed_factor - ), ignore_paused=True, color=color.rgba(0.0, 0.0, 0.0, 0.5) + ), ignore_paused=True, color=color.rgba(0.0, 0.0, 0.0, 0.5), popup=True ) + self.sec_per_time_switch.x = -0.5 + self.on_off_switch.x = -0.2 + self.on_off_trail.x = -0.2 wp.y = 0.5 # wp.panel.scale_y / 2 * wp.scale_y # center the window panel wp.x = 0.6 # wp.scale_x + 0.1 # wp.x = 0#wp.panel.scale_x / 2 * wp.scale_x @@ -121,8 +124,26 @@ class UrsinaUI: else: UrsinaConfig.show_trail = False - def on_point_button_click(self): - pass + def bodies_button_list_click(self, item): + print("select->", item) + + destroy(self.bodies_button_list) + + def on_searching_bodies_click(self): + results = UrsinaEvent.on_searching_bodies() + if len(results) > 0: + sub_name, bodies = results[0] + # print(results[0]) + button_dict = {} + + for body in bodies: + def callback_action(b=body): + self.bodies_button_list_click(b) + + button_dict[body.name] = callback_action + + self.bodies_button_list = ButtonList(button_dict, font=UrsinaConfig.CN_FONT, button_height=1.5) + # self.bodies_button_list.input = self.bodies_button_list_input def on_reset_button_click(self): UrsinaEvent.on_reset() @@ -131,9 +152,17 @@ class UrsinaUI: if self.on_off_switch.value == self.pause_button_text: self.on_off_switch.selected_color = color.green application.paused = True + for c in self.wp.children: + if not c.ignore_paused: + # c.enabled = True + c.disabled = False else: self.on_off_switch.selected_color = color.red application.paused = False + for c in self.wp.children: + if not c.ignore_paused: + # c.enabled = True + c.disabled = False def on_slider_trail_length_changed(self): UrsinaConfig.trail_length = int(self.slider_trail_length.value) diff --git a/simulators/ursina_simulator.py b/simulators/ursina_simulator.py index b3e110a891ce3ec2c09961c746779eb1d40f741a..bc0d69d84857901f630894887bead30e2662104d 100644 --- a/simulators/ursina_simulator.py +++ b/simulators/ursina_simulator.py @@ -11,6 +11,7 @@ from ursina import Ursina, window, Entity, Grid, Mesh, camera, Text, application load_texture, held_keys from ursina.prefabs.first_person_controller import FirstPersonController +from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_ui import UrsinaUI from simulators.views.ursina_view import UrsinaView, UrsinaPlayer from simulators.ursina.ursina_config import UrsinaConfig @@ -56,6 +57,16 @@ class UrsinaSimulator(Simulator): # planets.append(newPlanet) # x += cp[i] * 10 + UrsinaEvent.on_searching_bodies_subscription(type(self).__name__, self.on_searching_bodies) + + def on_searching_bodies(self, **kwargs): + views = [] + for view in self.body_views: + if view.appeared: + views.append(view) + return views + + def check_elapsed_time(self): """检查时间间隔是否已过""" now = datetime.datetime.now()