diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 367310fe..144fa174 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,17 +80,18 @@ jobs: cmake .. -DNOTHING_CI=ON cmake --build . + # TODO(#1243): build-windows-mingw is broken # TODO(#1178): %z related warnings on build-windows-mingw GitHub Action - build-windows-mingw: - runs-on: windows-2019 - steps: - - uses: actions/checkout@v1 - # this gives us msys. - - uses: numworks/setup-msys2@v1 - - name: install dependencies - run: msys2do pacman -S --noconfirm mingw-w64-x86_64-gcc mingw64/mingw-w64-x86_64-SDL2 make mingw-w64-x86_64-pkg-config - - name: build nothing - run: | - msys2do ./build-posix.sh - env: - CC: gcc + # build-windows-mingw: + # runs-on: windows-2019 + # steps: + # - uses: actions/checkout@v1 + # # this gives us msys. + # - uses: numworks/setup-msys2@v1 + # - name: install dependencies + # run: msys2do pacman -S --noconfirm mingw-w64-x86_64-gcc mingw64/mingw-w64-x86_64-SDL2 make mingw-w64-x86_64-pkg-config + # - name: build nothing + # run: | + # msys2do ./build-posix.sh + # env: + # CC: gcc diff --git a/src/game.c b/src/game.c index 2811c515..f0cb7df8 100644 --- a/src/game.c +++ b/src/game.c @@ -324,31 +324,49 @@ static int game_event_level_picker(Game *game, const SDL_Event *event) switch (event->type) { case SDL_KEYDOWN: { switch(event->key.keysym.sym) { - case SDLK_n: { - memory_clean(&game->level_editor_memory); - game->level_editor = create_level_editor( - &game->level_editor_memory, - &game->cursor); + case SDLK_UP: { + level_picker_cursor_up(&game->level_picker); + } break; - if (game->level == NULL) { - game->level = PUSH_LT( - game->lt, - create_level_from_level_editor( - game->level_editor), - destroy_level); + case SDLK_DOWN: { + level_picker_cursor_down(&game->level_picker); + } break; + + case SDLK_p: { + if (event->key.keysym.mod & KMOD_CTRL) { + level_picker_cursor_up(&game->level_picker); + } + } break; + + case SDLK_n: { + if (event->key.keysym.mod & KMOD_CTRL) { + level_picker_cursor_down(&game->level_picker); } else { - game->level = RESET_LT( - game->lt, - game->level, - create_level_from_level_editor( - game->level_editor)); - } + memory_clean(&game->level_editor_memory); + game->level_editor = create_level_editor( + &game->level_editor_memory, + &game->cursor); - if (game->level == NULL) { - return -1; - } + if (game->level == NULL) { + game->level = PUSH_LT( + game->lt, + create_level_from_level_editor( + game->level_editor), + destroy_level); + } else { + game->level = RESET_LT( + game->lt, + game->level, + create_level_from_level_editor( + game->level_editor)); + } - game_switch_state(game, GAME_STATE_LEVEL); + if (game->level == NULL) { + return -1; + } + + game_switch_state(game, GAME_STATE_LEVEL); + } } break; case SDLK_i: { diff --git a/src/game/level/level_editor/undo_history.c b/src/game/level/level_editor/undo_history.c index 2a7745de..5ddfb7eb 100644 --- a/src/game/level/level_editor/undo_history.c +++ b/src/game/level/level_editor/undo_history.c @@ -32,7 +32,7 @@ void undo_history_push(UndoHistory *undo_history, { trace_assert(undo_history); - // TODO: undo_history_push kinda leaks the memory + // TODO(#1244): undo_history_push kinda leaks the memory HistoryItem item = { .revert = revert, .context_data = memory_alloc(undo_history->memory, context_data_size), diff --git a/src/game/level_picker.c b/src/game/level_picker.c index e8773835..fcd704c8 100644 --- a/src/game/level_picker.c +++ b/src/game/level_picker.c @@ -236,54 +236,53 @@ int level_picker_event(LevelPicker *level_picker, } } break; - case SDL_KEYDOWN: + case SDL_KEYDOWN: { switch (event->key.keysym.sym) { - case SDLK_UP: - if (level_picker->items_cursor == 0) { - level_picker->items_cursor = level_picker->items.count - 1; - } else { - level_picker->items_cursor--; - } - break; - case SDLK_DOWN: - level_picker->items_cursor++; - if (level_picker->items_cursor == level_picker->items.count) { - level_picker->items_cursor = 0; - } - break; - case SDLK_RETURN: + case SDLK_RETURN: { if (level_picker->items_cursor < level_picker->items.count) { level_picker->selected_item = (int) level_picker->items_cursor; } - break; + } break; } - break; + } break; - case SDL_MOUSEMOTION: { - const Vec2f mouse_pos = vec((float) event->motion.x, (float) event->motion.y); - Vec2f position = vec_sum( - level_picker->items_position, - level_picker->items_scroll); - - for (size_t i = 0; i < level_picker->items.count; ++i) { - const char *item_text = dynarray_pointer_at( - &level_picker->items, - i); - - Rect boundary_box = sprite_font_boundary_box( - position, - LEVEL_PICKER_LIST_FONT_SCALE, - item_text); - - if (rect_contains_point(boundary_box, mouse_pos)) { - level_picker->items_cursor = i; - } - - position.y += boundary_box.h + LEVEL_PICKER_LIST_PADDING_BOTTOM; + case SDL_MOUSEWHEEL: { + if (event->wheel.y < 0) { + level_picker_cursor_down(level_picker); + } else if (event->wheel.y > 0) { + level_picker_cursor_up(level_picker); } } break; case SDL_MOUSEBUTTONDOWN: { + switch (event->button.button) { + case SDL_BUTTON_LEFT: { + const Vec2f mouse_pos = vec((float) event->button.x, (float) event->button.y); + Vec2f position = vec_sum( + level_picker->items_position, + level_picker->items_scroll); + + for (size_t i = 0; i < level_picker->items.count; ++i) { + const char *item_text = dynarray_pointer_at( + &level_picker->items, + i); + + Rect boundary_box = sprite_font_boundary_box( + position, + LEVEL_PICKER_LIST_FONT_SCALE, + item_text); + + if (rect_contains_point(boundary_box, mouse_pos)) { + level_picker->items_cursor = i; + } + + position.y += boundary_box.h + LEVEL_PICKER_LIST_PADDING_BOTTOM; + } + } break; + } + } break; + + case SDL_MOUSEBUTTONUP: { switch (event->button.button) { case SDL_BUTTON_LEFT: { // check if the click position was actually inside... @@ -359,3 +358,19 @@ int level_picker_enter_camera_event(LevelPicker *level_picker, camera_center_at(camera, level_picker->camera_position); return 0; } + +void level_picker_cursor_up(LevelPicker *level_picker) +{ + trace_assert(level_picker); + if (level_picker->items_cursor > 0) { + level_picker->items_cursor--; + } +} + +void level_picker_cursor_down(LevelPicker *level_picker) +{ + trace_assert(level_picker); + if (level_picker->items_cursor + 1 < level_picker->items.count) { + level_picker->items_cursor++; + } +} diff --git a/src/game/level_picker.h b/src/game/level_picker.h index 2d15ce70..67babdb0 100644 --- a/src/game/level_picker.h +++ b/src/game/level_picker.h @@ -44,6 +44,8 @@ int level_picker_input(LevelPicker *level_picker, SDL_Joystick *the_stick_of_joy); int level_picker_enter_camera_event(LevelPicker *level_picker, Camera *camera); +void level_picker_cursor_up(LevelPicker *level_picker); +void level_picker_cursor_down(LevelPicker *level_picker); const char *level_picker_selected_level(const LevelPicker *level_picker); void level_picker_clean_selection(LevelPicker *level_picker);