Example #1
0
    def __init__(self, parent: core.NodePath, parent_menu: "Menu" = None):
        self._parent = parent
        self._parent_menu = parent_menu
        self._task_manager = TaskManagerGlobal.taskMgr

        self._frame = DirectGui.DirectFrame(
            parent=parent,
            frameSize=(-constants.PADDING, constants.PADDING, 0,
                       constants.PADDING),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
            state=DirectGuiGlobals.NORMAL,
        )
        self._frame.hide()
        self._items: typing.List[DirectGui.DirectButton] = []
        self._bottom = 0.0
        self._width = 0.0
        self._sub_menus: typing.List[Menu] = []
        self._mouse_within = False

        self.destroy = self._frame.destroy
        self.set_pos = self._frame.set_pos

        self._frame.bind(DirectGuiGlobals.WITHIN, self._mouse_in)
        self._frame.bind(DirectGuiGlobals.WITHOUT, self._mouse_out)

        self._auto_hide_task: Task.Task = None
Example #2
0
    def __init__(
        self,
        parent: core.NodePath,
        tile_manager: manager.Manager,
        edit_mode: edit_mode.EditMode,
        task_manager: Task.TaskManager,
    ):
        self._dialog = DirectGui.DirectFrame(parent=parent,
                                             frameSize=(-1.1, 1.1, -0.9, 0.9))
        self._dialog.hide()

        self._tile_manager = tile_manager
        self._tile_selected: typing.Optional[typing.Callable[[int],
                                                             None]] = None
        DirectGui.DirectButton(
            parent=self._dialog,
            text="Ok",
            scale=0.05,
            pos=core.Vec3(0.81, -0.85),
            command=self._confirm,
        )
        DirectGui.DirectButton(
            parent=self._dialog,
            text="Cancel",
            scale=0.05,
            pos=core.Vec3(0.95, -0.85),
            command=self._hide,
        )

        self._tiles = tile_view.TileView(
            self._dialog,
            (-1.05, 1.05, -0.8, 0.88),
            self._tile_manager,
            self._select_tile,
        )
        self._tiles.load_tiles()

        self._task_manager = task_manager

        self._edit_mode = edit_mode
        self._selected_picnum: typing.Optional[int] = None
Example #3
0
    def __init__(
        self,
        parent: core.NodePath,
        edit_mode_selector: edit_mode.EditMode,
        audio_manager: audio.Manager,
        get_addons: typing.Callable[[], typing.List[addon.Addon]],
    ):
        self._edit_mode_selector = edit_mode_selector
        self._audio_manager = audio_manager
        self._get_addons = get_addons
        self._addons: typing.List[addon.Addon] = []
        self._editor: map_editor.MapEditor = None
        self._map_path: str = None

        self._dialog = DirectGui.DirectFrame(
            parent=parent,
            pos=core.Vec3(-1.1, -0.9),
            frameSize=(0, 2.2, 0, 1.8),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
        )
        self._dialog.hide()
    def __init__(self, parent: core.NodePath,
                 edit_mode_selector: edit_mode.EditMode):
        self._edit_mode_selector = edit_mode_selector
        self._type_selected: typing.Optional[typing.Callable[[str],
                                                             None]] = None

        self._frame = DirectGui.DirectFrame(
            parent=parent,
            pos=core.Vec3(-0.18, -0.1),
            frameSize=(0, 0.36, 0, 0.24),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
        )
        self._frame.hide()

        self._ror_type_selector = DirectGui.DirectOptionMenu(
            parent=self._frame,
            pos=core.Vec3(0.04, 0.14),
            scale=constants.HUGE_TEXT_SIZE,
            items=[
                ror_constants.ROR_TYPE_LINK,
                ror_constants.ROR_TYPE_STACK,
                ror_constants.ROR_TYPE_WATER,
                ror_constants.ROR_TYPE_GOO,
            ],
        )

        DirectGui.DirectButton(
            parent=self._frame,
            pos=core.Vec3(0.18, 0.05),
            frameSize=core.Vec4(-0.06, 0.06, -0.02, 0.06) /
            constants.BIG_TEXT_SIZE,
            scale=constants.BIG_TEXT_SIZE,
            text="Ok",
            command=self._confirm,
        )
    def __init__(
        self,
        parent: core.NodePath,
        edit_mode: edit_mode.EditMode,
        task_manager: Task.TaskManager,
        sound_browser: sound_view.SoundView,
        tile_viewer: tile_dialog.TileDialog,
    ):
        self._task_manager = task_manager

        self._dialog = DirectGui.DirectFrame(
            parent=parent,
            pos=core.Vec3(-1.1, -0.9),
            frameSize=(0, 2.2, 0, 1.8),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
        )
        self._dialog.hide()

        self._tile_section = DirectGui.DirectFrame(parent=self._dialog,
                                                   pos=core.Vec3(0.65, 0.07),
                                                   frameColor=(0, 0, 0, 0))

        current_tile_frame_parent = DirectGui.DirectFrame(
            parent=self._tile_section,
            pos=core.Vec3(0, constants.TEXT_SIZE),
            frameSize=(0, self._TILE_FRAME_SIZE, 0, self._TILE_FRAME_SIZE),
            frameColor=(0.65, 0.65, 0.65, 1),
            relief=DirectGuiGlobals.SUNKEN,
            borderWidth=(0.01, 0.01),
        )
        self._current_tile_frame = DirectGui.DirectButton(
            pos=core.Vec3(0.01, 0.01),
            parent=current_tile_frame_parent,
            frameSize=(0, self._TILE_FRAME_SIZE, self._TILE_FRAME_SIZE, 0),
            relief=DirectGuiGlobals.FLAT,
            command=self._show_tiles,
        )
        self._current_tile_frame.set_transparency(True)
        self._change_tile_button = DirectGui.DirectButton(
            parent=self._tile_section,
            scale=constants.TEXT_SIZE,
            text="Change Tile",
            text_align=core.TextNode.A_left,
            command=self._show_tiles,
        )

        self._property_parent: core.NodePath = self._dialog.attach_new_node(
            "properties")
        self._property_parent.set_pos(0.66, 0, 0.38)

        self._sound_browser = sound_browser
        self._tile_viewer = tile_viewer
        self._edit_mode = edit_mode

        self._sprite: typing.Optional[map_objects.EditorSprite] = None
        self._selected_descriptor: map_objects.sprite_type_descriptor.Descriptor = (
            map_objects.sprite_type_descriptor.Descriptor(-1, {}))
        self._current_descriptor: map_objects.sprite_type_descriptor.Descriptor = (
            map_objects.sprite_type_descriptor.Descriptor(-1, {}))
        self._current_picnum: typing.Optional[int] = None
        self._current_palette: typing.Optional[int] = None
        self._current_status_number: typing.Optional[int] = None

        self._sprite_category_options = DirectGui.DirectOptionMenu(
            parent=self._dialog,
            pos=core.Vec3(0.04, 1.72),
            items=list(descriptors.sprite_category_descriptors.keys()),
            command=self._select_sprite_category,
            scale=constants.TEXT_SIZE,
            text_align=core.TextNode.A_left,
        )
        self._sprite_type_list = sprite_type_list.SpriteTypeList(
            self._dialog, self._tile_viewer.tile_manager,
            self._select_sprite_type)
        self._properties: typing.Optional[
            sprite_property_view.SpritePropertyView] = None

        self._droppables = {
            descriptor.name: sprite_type
            for sprite_type, descriptor in descriptors.sprite_types.items()
            if descriptor.get_is_droppable(
                descriptors.sprite_category_descriptors)
        }
        self._droppables["None"] = 0

        DirectGui.DirectLabel(
            parent=self._dialog,
            text="Special Source:",
            pos=core.Vec3(1.74, 0.38),
            scale=constants.TEXT_SIZE,
        )
        self._special_source_menu = DirectGui.DirectOptionMenu(
            parent=self._dialog,
            pos=core.Vec3(1.90, 0.38),
            items=["None", "Level Start"],
            scale=constants.TEXT_SIZE,
        )

        DirectGui.DirectLabel(
            parent=self._dialog,
            text="Special Target:",
            pos=core.Vec3(1.74, 0.38 - constants.TEXT_SIZE - 0.02),
            scale=constants.TEXT_SIZE,
        )
        self._special_target_menu = DirectGui.DirectOptionMenu(
            parent=self._dialog,
            pos=core.Vec3(1.90, 0.38 - constants.TEXT_SIZE - 0.02),
            items=["None", "Secret", "Next Level", "Secret Level"],
            scale=constants.TEXT_SIZE,
        )

        DirectGui.DirectButton(
            parent=self._dialog,
            pos=core.Vec3(1.98, 0.07),
            text="Ok",
            scale=constants.TEXT_SIZE,
            command=self._save_changes,
        )
        DirectGui.DirectButton(
            parent=self._dialog,
            pos=core.Vec3(2.1, 0.07),
            text="Cancel",
            scale=constants.TEXT_SIZE,
            command=self._hide,
        )
Example #6
0
    def __init__(
        self,
        parent: core.NodePath,
        audio_manager: manager.Manager,
        task_manager: Task.TaskManager,
        edit_mode_selector: edit_mode.EditMode,
    ):
        path = find_resource("sound_names.yaml")
        with open(path, "r") as file:
            self._sound_descriptors = yaml.safe_load(file.read())
        self._dialog = DirectGui.DirectFrame(
            parent=parent,
            frameSize=(-1.02, 1.02, -0.95, 0.95),
            frameColor=(0.85, 0.85, 0.85, 1),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
        )
        self._dialog.hide()

        self._frame = DirectGui.DirectScrolledFrame(
            parent=self._dialog,
            frameColor=(0.65, 0.65, 0.65, 1),
            frameSize=(-1, 1, -0.8, 0.93),
            canvasSize=(0, self._CANVAS_WIDTH, -1, 0),
            scrollBarWidth=0.04,
            relief=DirectGuiGlobals.SUNKEN,
        )
        self._bind_scroll(self._frame)

        self._audio_manager = audio_manager
        self._task_manager = task_manager
        self._edit_mode_selector = edit_mode_selector

        self._preview_sound: core.AudioSound = None
        self._selected_sound_index = -1
        self._stop_sound_callback: typing.Callable[[], None] = None
        self._selected_label: DirectGui.DirectButton = None
        self._clicked_label: DirectGui.DirectButton = None
        self._sound_selected: typing.Callable[[int], None] = None

        self._categorized_sound_names: typing.Dict[str, typing.List[int]] = defaultdict(
            lambda: []
        )
        for index, descriptor in self._sound_descriptors.items():
            sounds = self._categorized_sound_names[descriptor["category"]]
            sounds.append(index)

        self._labels: typing.Dict[int, DirectGui.DirectButton] = {}
        half_height = self._TEXT_FRAME_SCALE / (2 * constants.TEXT_SIZE)
        for sound_index, descriptor in self._sound_descriptors.items():
            text = f"{sound_index}. {descriptor['name']}"
            label = DirectGui.DirectButton(
                parent=self._canvas,
                frameSize=(
                    0,
                    self._DESCRIPTION_WIDTH / constants.TEXT_SIZE,
                    -half_height,
                    half_height,
                ),
                frameColor=(0, 0, 0, 0),
                scale=constants.TEXT_SIZE,
                text=text,
                text_align=core.TextNode.A_left,
                text_wordwrap=(self._DESCRIPTION_WIDTH) / constants.TEXT_SIZE,
            )
            self._bind_scroll(label)

            label["extraArgs"] = [label, sound_index, descriptor]
            label["command"] = self._select_sound
            self._labels[sound_index] = label

        self._show_category("misc")

        items = self._categorized_sound_names.keys()
        items = list(sorted(items))
        DirectGui.DirectOptionMenu(
            parent=self._dialog,
            pos=core.Vec3(-1, -0.9),
            items=items,
            scale=constants.TEXT_SIZE,
            text_align=core.TextNode.A_left,
            command=self._show_category,
        )

        DirectGui.DirectButton(
            parent=self._dialog,
            pos=core.Vec3(0.8, -0.9),
            text="Ok",
            scale=constants.TEXT_SIZE,
            command=self._confirm,
        )
        DirectGui.DirectButton(
            parent=self._dialog,
            pos=core.Vec3(0.92, -0.9),
            text="Cancel",
            scale=constants.TEXT_SIZE,
            command=self._hide,
        )
Example #7
0
    def __init__(self, aspect_2d: core.NodePath,
                 on_type_changed: typing.Callable[[], None]):
        self._aspect_2d = aspect_2d
        self._on_type_changed = on_type_changed

        self._frame = DirectGui.DirectFrame(
            parent=self._aspect_2d,
            frameSize=(0, 0.56, 0, 0.2),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
            frameColor=(0.85, 0.85, 0.85, 0.75),
            state=DirectGuiGlobals.NORMAL,
        )
        gui.bind_gui_for_focus(self._frame)
        self._frame.hide()

        self._property_parent: core.NodePath = self._aspect_2d.attach_new_node(
            "properties")
        self._properties_frame = DirectGui.DirectFrame(
            parent=self._property_parent,
            frameSize=(-0.02, 1.02, 0.02, 1.32),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
            frameColor=(0.85, 0.85, 0.85, 0.75),
            state=DirectGuiGlobals.NORMAL,
        )
        self._properties_parent: core.NodePath = self._properties_frame.attach_new_node(
            "properties")
        self._properties_parent.set_z(0.10)
        gui.bind_gui_for_focus(self._properties_frame)
        self._properties_frame.hide()
        self._properties: sprite_property_view.SpritePropertyView = None

        self._sector: map_objects.EditorSector = None
        self._current_sector_type: sector_type_descriptor.SectorTypeDescriptor = None

        self._type_lookup = {
            sector_type.name: type_index
            for type_index, sector_type in descriptors.sector_types.items()
        }
        type_names = list(self._type_lookup.keys())
        self._type_selector = DirectGui.DirectOptionMenu(
            parent=self._frame,
            pos=core.Vec3(0.05, 0.08),
            scale=constants.BIG_TEXT_SIZE,
            items=type_names,
            command=self._type_changed,
        )

        DirectGui.DirectLabel(
            parent=self._properties_frame,
            text="Special Source:",
            pos=core.Vec3(7 * constants.PADDING,
                          2 * constants.TEXT_SIZE + 2 * constants.PADDING),
            scale=constants.TEXT_SIZE,
            frameColor=(0, 0, 0, 0),
        )
        self._special_source_menu = DirectGui.DirectOptionMenu(
            parent=self._properties_frame,
            pos=core.Vec3(
                7 * constants.PADDING + 0.16,
                2 * constants.TEXT_SIZE + 2 * constants.PADDING,
            ),
            items=["None", "Level Start"],
            scale=constants.TEXT_SIZE,
        )

        DirectGui.DirectLabel(
            parent=self._properties_frame,
            text="Special Target:",
            pos=core.Vec3(7 * constants.PADDING,
                          constants.TEXT_SIZE + constants.PADDING),
            scale=constants.TEXT_SIZE,
            frameColor=(0, 0, 0, 0),
        )
        self._special_target_menu = DirectGui.DirectOptionMenu(
            parent=self._properties_frame,
            pos=core.Vec3(7 * constants.PADDING + 0.16, constants.TEXT_SIZE) +
            constants.PADDING,
            items=["None", "Secret", "Next Level", "Secret Level"],
            scale=constants.TEXT_SIZE,
        )

        self._update_frame_position()
Example #8
0
    def __init__(self, parent: core.NodePath, edit_mode: edit_mode.EditMode):
        self._dialog = DirectGui.DirectFrame(
            parent=parent,
            pos=core.Vec3(-0.78, -0.9),
            frameSize=(0, 1.58, 0, 1.8),
            relief=DirectGuiGlobals.RAISED,
            borderWidth=(0.01, 0.01),
        )
        self._dialog.hide()

        self._property_parent: core.NodePath = self._dialog.attach_new_node(
            "properties")
        self._property_parent.set_pos(0.04, 0, 0.38)

        self._edit_mode = edit_mode

        self._wall: map_objects.EditorWall = None
        self._selected_descriptor: wall_type_descriptor.WallTypeDescriptor = None
        self._current_descriptor: wall_type_descriptor.WallTypeDescriptor = None
        self._current_picnum: int = None
        self._current_palette: int = None
        self._current_status_number: int = None

        self._properties: sprite_property_view.SpritePropertyView = None

        self._type_lookup = {
            wall_type.name: type_index
            for type_index, wall_type in descriptors.wall_types.items()
        }
        type_names = list(self._type_lookup.keys())
        self._type_selector = DirectGui.DirectOptionMenu(
            parent=self._dialog,
            pos=core.Vec3(0.05, 0.38),
            scale=constants.TEXT_SIZE,
            items=type_names,
            command=self._type_changed,
        )

        DirectGui.DirectLabel(
            parent=self._dialog,
            text="Special Source:",
            pos=core.Vec3(1.12, 0.38),
            scale=constants.TEXT_SIZE,
        )
        self._special_source_menu = DirectGui.DirectOptionMenu(
            parent=self._dialog,
            pos=core.Vec3(1.28, 0.38),
            items=["None", "Level Start"],
            scale=constants.TEXT_SIZE,
        )

        DirectGui.DirectLabel(
            parent=self._dialog,
            text="Special Target:",
            pos=core.Vec3(1.12, 0.38 - constants.TEXT_SIZE - 0.02),
            scale=constants.TEXT_SIZE,
        )
        self._special_target_menu = DirectGui.DirectOptionMenu(
            parent=self._dialog,
            pos=core.Vec3(1.28, 0.38 - constants.TEXT_SIZE - 0.02),
            items=["None", "Next Level", "Secret Level"],
            scale=constants.TEXT_SIZE,
        )

        DirectGui.DirectButton(
            parent=self._dialog,
            pos=core.Vec3(1.36, 0.07),
            text="Ok",
            scale=constants.TEXT_SIZE,
            command=self._save_changes,
        )
        DirectGui.DirectButton(
            parent=self._dialog,
            pos=core.Vec3(1.48, 0.07),
            text="Cancel",
            scale=constants.TEXT_SIZE,
            command=self._hide,
        )