470 lines
12 KiB
Python
470 lines
12 KiB
Python
from ui_menu_pulldown_item import (
|
|
FileQuitItem,
|
|
PulldownMenuData,
|
|
PulldownMenuItem,
|
|
SeparatorItem,
|
|
ViewSetZoomItem,
|
|
ViewToggleCameraTiltItem,
|
|
ViewToggleCRTItem,
|
|
ViewToggleGridItem,
|
|
)
|
|
|
|
|
|
class GameModePulldownMenuItem(PulldownMenuItem):
|
|
# unless overridden, game mode items not allowed in art mode
|
|
art_mode_allowed = False
|
|
|
|
|
|
#
|
|
# game menu
|
|
#
|
|
class HideEditUIItem(GameModePulldownMenuItem):
|
|
label = "Hide edit UI"
|
|
command = "toggle_game_edit_ui"
|
|
close_on_select = True
|
|
always_active = True
|
|
|
|
|
|
class NewGameDirItem(GameModePulldownMenuItem):
|
|
label = "New game…"
|
|
command = "new_game_dir"
|
|
always_active = True
|
|
|
|
|
|
class SetGameDirItem(GameModePulldownMenuItem):
|
|
label = "Open game…"
|
|
command = "set_game_dir"
|
|
close_on_select = True
|
|
always_active = True
|
|
|
|
|
|
class PauseGameItem(GameModePulldownMenuItem):
|
|
label = "blah"
|
|
command = "toggle_anim_playback"
|
|
always_active = True
|
|
|
|
def get_label(app):
|
|
return ["Pause game", "Unpause game"][app.gw.paused]
|
|
|
|
|
|
class OpenConsoleItem(GameModePulldownMenuItem):
|
|
label = "Open dev console"
|
|
command = "toggle_console"
|
|
close_on_select = True
|
|
always_active = True
|
|
art_mode_allowed = True
|
|
|
|
|
|
#
|
|
# state menu
|
|
#
|
|
class ResetStateItem(GameModePulldownMenuItem):
|
|
label = "Reset to last state"
|
|
command = "reset_game"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
class LoadStateItem(GameModePulldownMenuItem):
|
|
label = "Load state…"
|
|
command = "load_game_state"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
class SaveStateItem(GameModePulldownMenuItem):
|
|
label = "Save current state"
|
|
command = "save_current"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
class SaveNewStateItem(GameModePulldownMenuItem):
|
|
label = "Save new state…"
|
|
command = "save_game_state"
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
#
|
|
# view menu
|
|
#
|
|
class ObjectsToCameraItem(GameModePulldownMenuItem):
|
|
label = "Move selected object(s) to camera"
|
|
command = "objects_to_camera"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
|
|
class CameraToObjectsItem(GameModePulldownMenuItem):
|
|
label = "Move camera to selected object"
|
|
command = "camera_to_objects"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) != 1
|
|
|
|
|
|
class ToggleDebugObjectsItem(GameModePulldownMenuItem):
|
|
label = " Draw debug objects"
|
|
command = "toggle_debug_objects"
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
def should_mark(ui):
|
|
return ui.app.gw.properties and ui.app.gw.properties.draw_debug_objects
|
|
|
|
|
|
class ToggleOriginVizItem(GameModePulldownMenuItem):
|
|
label = " Show all object origins"
|
|
command = "toggle_all_origin_viz"
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
def should_mark(ui):
|
|
return ui.app.gw.show_origin_all
|
|
|
|
|
|
class ToggleBoundsVizItem(GameModePulldownMenuItem):
|
|
label = " Show all object bounds"
|
|
command = "toggle_all_bounds_viz"
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
def should_mark(ui):
|
|
return ui.app.gw.show_bounds_all
|
|
|
|
|
|
class ToggleCollisionVizItem(GameModePulldownMenuItem):
|
|
label = " Show all object collision"
|
|
command = "toggle_all_collision_viz"
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
def should_mark(ui):
|
|
return ui.app.gw.show_collision_all
|
|
|
|
|
|
#
|
|
# world menu
|
|
#
|
|
class EditWorldPropertiesItem(GameModePulldownMenuItem):
|
|
label = "Edit world properties…"
|
|
command = "edit_world_properties"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
#
|
|
# room menu
|
|
#
|
|
|
|
|
|
class ChangeRoomItem(GameModePulldownMenuItem):
|
|
label = "Change current room…"
|
|
command = "change_current_room"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
|
|
|
|
class AddRoomItem(GameModePulldownMenuItem):
|
|
label = "Add room…"
|
|
command = "add_room"
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
class SetRoomObjectsItem(GameModePulldownMenuItem):
|
|
label = "Add/remove objects from room…"
|
|
command = "set_room_objects"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
|
|
class RemoveRoomItem(GameModePulldownMenuItem):
|
|
label = "Remove this room"
|
|
command = "remove_current_room"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
|
|
class RenameRoomItem(GameModePulldownMenuItem):
|
|
label = "Rename this room…"
|
|
command = "rename_current_room"
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
|
|
class ToggleAllRoomsVizItem(GameModePulldownMenuItem):
|
|
label = "blah"
|
|
command = "toggle_all_rooms_visible"
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
|
|
def get_label(app):
|
|
return ["Show all rooms", "Show only current room"][app.gw.show_all_rooms]
|
|
|
|
|
|
class ToggleListOnlyRoomObjectItem(GameModePulldownMenuItem):
|
|
label = " List only objects in this room"
|
|
command = "toggle_list_only_room_objects"
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
|
|
def should_mark(ui):
|
|
return ui.app.gw.list_only_current_room_objects
|
|
|
|
|
|
class ToggleRoomCamerasItem(GameModePulldownMenuItem):
|
|
label = " Camera changes with room"
|
|
command = "toggle_room_camera_changes"
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
|
|
def should_mark(ui):
|
|
return ui.app.gw.room_camera_changes_enabled
|
|
|
|
|
|
class SetRoomCameraItem(GameModePulldownMenuItem):
|
|
label = "Set this room's camera marker…"
|
|
command = "set_room_camera_marker"
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
|
|
class SetRoomEdgeDestinationsItem(GameModePulldownMenuItem):
|
|
label = "Set this room's edge warps…"
|
|
command = "set_room_edge_warps"
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
|
|
class SetRoomBoundsObject(GameModePulldownMenuItem):
|
|
label = "Set this room's edge object…"
|
|
command = "set_room_bounds_obj"
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
|
|
class AddSelectedToCurrentRoomItem(GameModePulldownMenuItem):
|
|
label = "Add selected objects to this room"
|
|
command = "add_selected_to_room"
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None or len(app.gw.selected_objects) == 0
|
|
|
|
|
|
class RemoveSelectedFromCurrentRoomItem(GameModePulldownMenuItem):
|
|
label = "Remove selected objects from this room"
|
|
command = "remove_selected_from_room"
|
|
|
|
def should_dim(app):
|
|
return app.gw.current_room is None or len(app.gw.selected_objects) == 0
|
|
|
|
|
|
#
|
|
# object menu
|
|
#
|
|
|
|
|
|
class SpawnObjectItem(GameModePulldownMenuItem):
|
|
label = "Spawn object…"
|
|
command = "choose_spawn_object_class"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
class DuplicateObjectsItem(GameModePulldownMenuItem):
|
|
label = "Duplicate selected objects"
|
|
command = "duplicate_selected_objects"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
|
|
class SelectObjectsItem(GameModePulldownMenuItem):
|
|
label = "Select objects…"
|
|
command = "select_objects"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
|
|
class EditArtForObjectsItem(GameModePulldownMenuItem):
|
|
label = "Edit art for selected…"
|
|
command = "edit_art_for_selected_objects"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
|
|
class SetObjectRoomsItem(GameModePulldownMenuItem):
|
|
label = "Add/remove this object from rooms…"
|
|
command = "set_object_rooms"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) != 1
|
|
|
|
|
|
class DeleteSelectedObjectsItem(GameModePulldownMenuItem):
|
|
label = "Delete selected object(s)"
|
|
command = "erase_selection_or_art"
|
|
close_on_select = True
|
|
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
|
|
class GameMenuData(PulldownMenuData):
|
|
items = [
|
|
HideEditUIItem,
|
|
OpenConsoleItem,
|
|
SeparatorItem,
|
|
NewGameDirItem,
|
|
SetGameDirItem,
|
|
PauseGameItem,
|
|
SeparatorItem,
|
|
FileQuitItem,
|
|
]
|
|
|
|
|
|
class GameStateMenuData(PulldownMenuData):
|
|
items = [ResetStateItem, LoadStateItem, SaveStateItem, SaveNewStateItem]
|
|
|
|
|
|
class GameViewMenuData(PulldownMenuData):
|
|
items = [
|
|
ViewToggleCRTItem,
|
|
ViewToggleGridItem,
|
|
SeparatorItem,
|
|
ViewSetZoomItem,
|
|
ViewToggleCameraTiltItem,
|
|
SeparatorItem,
|
|
ObjectsToCameraItem,
|
|
CameraToObjectsItem,
|
|
ToggleDebugObjectsItem,
|
|
ToggleOriginVizItem,
|
|
ToggleBoundsVizItem,
|
|
ToggleCollisionVizItem,
|
|
]
|
|
|
|
def should_mark_item(item, ui):
|
|
if hasattr(item, "should_mark"):
|
|
return item.should_mark(ui)
|
|
return False
|
|
|
|
|
|
class GameWorldMenuData(PulldownMenuData):
|
|
items = [EditWorldPropertiesItem]
|
|
|
|
|
|
class GameRoomMenuData(PulldownMenuData):
|
|
items = [
|
|
ChangeRoomItem,
|
|
AddRoomItem,
|
|
RemoveRoomItem,
|
|
RenameRoomItem,
|
|
ToggleAllRoomsVizItem,
|
|
ToggleListOnlyRoomObjectItem,
|
|
ToggleRoomCamerasItem,
|
|
SeparatorItem,
|
|
AddSelectedToCurrentRoomItem,
|
|
RemoveSelectedFromCurrentRoomItem,
|
|
SetRoomObjectsItem,
|
|
SeparatorItem,
|
|
SetRoomCameraItem,
|
|
SetRoomEdgeDestinationsItem,
|
|
SetRoomBoundsObject,
|
|
SeparatorItem,
|
|
]
|
|
|
|
def should_mark_item(item, ui):
|
|
"show checkmark for current room"
|
|
if not ui.app.gw.current_room:
|
|
return False
|
|
if hasattr(item, "should_mark"):
|
|
return item.should_mark(ui)
|
|
return ui.app.gw.current_room.name == item.cb_arg
|
|
|
|
def get_items(app):
|
|
items = []
|
|
if len(app.gw.rooms) == 0:
|
|
return items
|
|
# TODO: this is almost c+p'd from LayerMenuData, generalize it
|
|
# first determine longest line to set width of items
|
|
longest_line = 0
|
|
for room_name in app.gw.rooms:
|
|
if len(room_name) > longest_line:
|
|
longest_line = len(room_name)
|
|
# check non-generated menu items too
|
|
for item in GameRoomMenuData.items:
|
|
if len(item.label) + 1 > longest_line:
|
|
longest_line = len(item.label) + 1
|
|
# cap at max allowed line length
|
|
for room_name in app.gw.rooms:
|
|
|
|
class TempMenuItemClass(GameModePulldownMenuItem):
|
|
pass
|
|
|
|
item = TempMenuItemClass
|
|
# leave spaces for mark
|
|
item.label = " {}".format(room_name)
|
|
# pad, put Z depth on far right
|
|
item.label = item.label.ljust(longest_line)
|
|
# trim to keep below a max length
|
|
item.label = item.label[:longest_line]
|
|
# tell PulldownMenu's button creation process not to auto-pad
|
|
item.no_pad = True
|
|
item.command = "change_current_room_to"
|
|
item.cb_arg = room_name
|
|
items.append(item)
|
|
# sort room list alphabetically so it's stable, if arbitrary
|
|
items.sort(key=lambda item: item.label, reverse=False)
|
|
return items
|
|
|
|
|
|
class GameObjectMenuData(PulldownMenuData):
|
|
items = [
|
|
SpawnObjectItem,
|
|
DuplicateObjectsItem,
|
|
SeparatorItem,
|
|
SelectObjectsItem,
|
|
EditArtForObjectsItem,
|
|
SetObjectRoomsItem,
|
|
DeleteSelectedObjectsItem,
|
|
]
|