Merge pull request #1242 from tsoding/1221
(#1221) Add support to mouse wheel to level pickermaster
commit
6793a7879c
|
@ -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
|
||||
|
|
60
src/game.c
60
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: {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue