Merge pull request #1242 from tsoding/1221

(#1221) Add support to mouse wheel to level picker
master
Alexey Kutepov 2020-01-20 02:16:24 +07:00 committed by GitHub
commit 6793a7879c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 109 additions and 73 deletions

View File

@ -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

View File

@ -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: {

View File

@ -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),

View File

@ -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++;
}
}

View File

@ -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);