6 ex__gui__combobox__wheel_8c
gullradriel edited this page 2026-10-09 00:55:18 +02:00

examples/ex_gui_combobox_wheel.c

Functions

Name
int wheel_then_click(N_GUI_CTX * gui, int cb, int row, int notches)
Open the list, turn the wheel over one row, then click that row.
int row_y(int row)
The screen y of the middle of one row of the open list.
ALLEGRO_EVENT mouse_event(int type, int x, int y, int dz)
Build a left-button mouse event at (x, y).
int main(void )
void expect_true(const char * label, int cond)
Assert a condition, logging which check failed.
void click_at(N_GUI_CTX * gui, int x, int y)
Move to (x, y) and click there.

Attributes

Name
int failures
Count of failed assertions.

Defines

Name
ITEMS
How many items: more than the six it shows.
CB_Y
Where the combobox is and how tall one row of it is.
CB_X
Where the combobox is and how tall one row of it is.
CB_W
Where the combobox is and how tall one row of it is.
CB_H
Where the combobox is and how tall one row of it is.
ALLEGRO_UNSTABLE

Functions Documentation

function wheel_then_click

static int wheel_then_click(
    N_GUI_CTX * gui,
    int cb,
    int row,
    int notches
)

Open the list, turn the wheel over one row, then click that row.

Parameters:

  • gui GUI context.
  • cb The combobox.
  • row Which row the pointer rests on.
  • notches Wheel notches, positive down the list.

Return: The index the click selected.

function row_y

static int row_y(
    int row
)

The screen y of the middle of one row of the open list.

Parameters:

  • row Row, 0 the top one shown.

Return: The y.

function mouse_event

static ALLEGRO_EVENT mouse_event(
    int type,
    int x,
    int y,
    int dz
)

Build a left-button mouse event at (x, y).

Parameters:

  • type The ALLEGRO_EVENT_MOUSE_* type.
  • x Cursor x.
  • y Cursor y.
  • dz Wheel notches, positive up.

Return: The event.

function main

int main(
    void 
)

function expect_true

static void expect_true(
    const char * label,
    int cond
)

Assert a condition, logging which check failed.

Parameters:

  • label What is being checked.
  • cond Non-zero to pass.

function click_at

static void click_at(
    N_GUI_CTX * gui,
    int x,
    int y
)

Move to (x, y) and click there.

Parameters:

  • gui GUI context.
  • x Cursor x.
  • y Cursor y.

Attributes Documentation

variable failures

static int failures = 0;

Count of failed assertions.

Macros Documentation

define ITEMS

#define ITEMS 9

How many items: more than the six it shows.

define CB_Y

#define CB_Y 10

Where the combobox is and how tall one row of it is.

define CB_X

#define CB_X 10

Where the combobox is and how tall one row of it is.

define CB_W

#define CB_W 200

Where the combobox is and how tall one row of it is.

define CB_H

#define CB_H 30

Where the combobox is and how tall one row of it is.

define ALLEGRO_UNSTABLE

#define ALLEGRO_UNSTABLE 1

Source code

/*
 * Nilorea Library
 * Copyright (C) 2005-2026 Castagnier Mickael
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 */


#define ALLEGRO_UNSTABLE 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "nilorea/n_common.h"
#include "nilorea/n_gui.h"
#include "nilorea/n_log.h"

static int failures = 0;

#define CB_X 10
#define CB_Y 10
#define CB_W 200
#define CB_H 30

#define ITEMS 9

static void expect_true(const char* label, int cond) {
    if (!cond) {
        n_log(LOG_ERR, "%s: FAILED", label);
        failures++;
    } else {
        n_log(LOG_INFO, "%s: OK", label);
    }
}

static ALLEGRO_EVENT mouse_event(int type, int x, int y, int dz) {
    ALLEGRO_EVENT ev;
    memset(&ev, 0, sizeof(ev));
    ev.type = (unsigned int)type;
    ev.mouse.x = x;
    ev.mouse.y = y;
    ev.mouse.dz = dz;
    ev.mouse.button = 1;
    return ev;
}

static void click_at(N_GUI_CTX* gui, int x, int y) {
    n_gui_process_event(gui, mouse_event(ALLEGRO_EVENT_MOUSE_AXES, x, y, 0));
    n_gui_process_event(gui, mouse_event(ALLEGRO_EVENT_MOUSE_BUTTON_DOWN, x, y, 0));
    n_gui_process_event(gui, mouse_event(ALLEGRO_EVENT_MOUSE_BUTTON_UP, x, y, 0));
}

static int row_y(int row) {
    return CB_Y + CB_H + row * CB_H + CB_H / 2;
}

static int wheel_then_click(N_GUI_CTX* gui, int cb, int row, int notches) {
    int i = 0;
    int x = CB_X + CB_W / 3;

    click_at(gui, x, CB_Y + CB_H / 2); /* open it */
    n_gui_process_event(gui, mouse_event(ALLEGRO_EVENT_MOUSE_AXES, x, row_y(row), 0));
    for (i = 0; i < abs(notches); i++)
        n_gui_process_event(gui, mouse_event(ALLEGRO_EVENT_MOUSE_AXES, x, row_y(row), notches > 0 ? -1 : 1));
    click_at(gui, x, row_y(row));
    return n_gui_combobox_get_selected(gui, cb);
}

int main(void) {
    ALLEGRO_FONT* font;
    N_GUI_CTX* gui;
    int win, cb, i;
    char name[16];

    set_log_level(LOG_ERR);
    if (!al_init() || !al_init_font_addon()) {
        n_log(LOG_ERR, "allegro init failed");
        return 1;
    }
    font = al_create_builtin_font(); /* no display needed */
    if (!font) {
        n_log(LOG_ERR, "al_create_builtin_font failed");
        return 1;
    }
    gui = n_gui_new_ctx(font);
    if (!gui) {
        n_log(LOG_ERR, "n_gui_new_ctx failed");
        al_destroy_font(font);
        return 1;
    }
    n_gui_set_display_size(gui, 800.0f, 600.0f);
    win = n_gui_add_window(gui, "W", 0.0f, 0.0f, 400.0f, 500.0f);
    n_gui_window_set_flags(gui, win, N_GUI_WIN_FRAMELESS);
    cb = n_gui_add_combobox(gui, win, (float)CB_X, (float)CB_Y, (float)CB_W, (float)CB_H, NULL, NULL);
    for (i = 0; i < ITEMS; i++) {
        snprintf(name, sizeof(name), "item %d", i);
        n_gui_combobox_add_item(gui, cb, name);
    }
    n_gui_open_window(gui, win);

    expect_true("with no wheel, a row selects the item it shows", wheel_then_click(gui, cb, 1, 0) == 1);
    n_gui_combobox_set_selected(gui, cb, 0);
    expect_true("three notches down scroll the list by three items", wheel_then_click(gui, cb, 1, 3) == 4);
    n_gui_combobox_set_selected(gui, cb, 0);
    expect_true("the wheel reaches the last item and stops there", wheel_then_click(gui, cb, 5, 20) == ITEMS - 1);
    n_gui_combobox_set_selected(gui, cb, ITEMS - 1);
    expect_true("and comes back up to the first", wheel_then_click(gui, cb, 0, -20) == 0);

    n_gui_destroy_ctx(&gui);
    al_destroy_font(font);
    if (failures) {
        n_log(LOG_ERR, "ex_gui_combobox_wheel: %d failure(s)", failures);
        return 1;
    }
    n_log(LOG_NOTICE, "ex_gui_combobox_wheel: all checks passed");
    return 0;
}