Skip to content

Commit

Permalink
Add ability to open multiple filter windows (#398)
Browse files Browse the repository at this point in the history
* Allow opening multiple filter windows

* Add default layout for filter windows
  • Loading branch information
madd-games authored Oct 14, 2024
1 parent 8c8dbc9 commit 8ae26ff
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 24 deletions.
17 changes: 11 additions & 6 deletions src/filters.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,19 @@
// stb array of registered filters.
static filter_t **g_filters = NULL;

static void a_filter_open(void *data)
static void a_filter_toggle(void *data)
{
filter_t *filter = data;
LOG_D("Open filter %s", filter->name);
goxel.gui.current_filter = (filter_t*)data;
if (filter->on_open) {
LOG_D("Toggle filter %s", filter->name);
filter->is_open = !filter->is_open;

if (filter->is_open && filter->on_open) {
filter->on_open(filter);
}

if (!filter->is_open && filter->on_close) {
filter->on_close(filter);
}
}

void filter_register_(filter_t *filter)
Expand All @@ -38,7 +43,7 @@ void filter_register_(filter_t *filter)
action = (action_t) {
.id = filter->action_id,
.default_shortcut = filter->default_shortcut,
.cfunc_data = a_filter_open,
.cfunc_data = a_filter_toggle,
.data = (void*)filter,
.flags = ACTION_CAN_EDIT_SHORTCUT,
};
Expand All @@ -48,7 +53,7 @@ void filter_register_(filter_t *filter)


void filters_iter_all(
void *arg, void (*f)(void *arg, const filter_t *filter))
void *arg, void (*f)(void *arg, filter_t *filter))
{
int i;
for (i = 0; i < arrlen(g_filters); i++) {
Expand Down
5 changes: 4 additions & 1 deletion src/filters.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#ifndef FILTERS_H
#define FILTERS_H

#include <stdbool.h>

typedef struct filter filter_t;

struct filter {
Expand All @@ -28,6 +30,7 @@ struct filter {
const char *name;
const char *action_id;
const char *default_shortcut;
bool is_open;
};

#define FILTER_REGISTER(id_, klass_, ...) \
Expand All @@ -47,6 +50,6 @@ void filter_register_(filter_t *filter);
* Iter all the registered filters
*/
void filters_iter_all(
void *arg, void (*f)(void *arg, const filter_t *filter));
void *arg, void (*f)(void *arg, filter_t *filter));

#endif // FILTERS_H
1 change: 0 additions & 1 deletion src/goxel.h
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,6 @@ typedef struct goxel
int current_panel; // Index of the current visible control panel.
float panel_width;
float viewport[4];
filter_t *current_filter;
} gui;

char **recent_files; // stb arraw of most recently used files.
Expand Down
54 changes: 39 additions & 15 deletions src/gui/app.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* goxel. If not, see <http://www.gnu.org/licenses/>.
*/

#include "filters.h"
#include "goxel.h"

#include "../ext_src/stb/stb_ds.h"
Expand All @@ -36,6 +37,9 @@
# define YOCTO 1
#endif

#define INITIAL_FILTER_OFFSET 10
#define RELATIVE_FILTER_OFFSET 40

// Note: duplicated from gui.cpp! To remove.
static const float ITEM_HEIGHT = 18;

Expand Down Expand Up @@ -101,6 +105,13 @@ static struct {
#endif
};

typedef struct filter_layout_state filter_layout_state_t;

struct filter_layout_state {
int next_x;
int next_y;
};

static void on_click(void) {
if (DEFINED(GUI_SOUND))
sound_play("click", 1.0, 1.0);
Expand Down Expand Up @@ -157,14 +168,37 @@ static void render_hints(const hint_t *hints)
}
}

static void gui_filter_window(void *arg, filter_t *filter)
{
filter_layout_state_t *state = arg;

if (filter->is_open) {
gui_window_begin(filter->name, state->next_x, state->next_y,
goxel.gui.panel_width, 0, GUI_WINDOW_MOVABLE);

if (gui_panel_header(filter->name)) {
if (filter->on_close) {
filter->on_close(filter);
}
filter->is_open = false;
}
filter->gui_fn(filter);

gui_window_end();
}

state->next_x += RELATIVE_FILTER_OFFSET;
state->next_y += RELATIVE_FILTER_OFFSET;
}

void gui_app(void)
{
float x = 0, y = 0;
const char *name;
const float spacing = 8;
int flags;
int i;
filter_t *filter;
filter_layout_state_t filter_layout_state;

goxel.show_export_viewport = false;

Expand Down Expand Up @@ -216,20 +250,10 @@ void gui_app(void)
gui_window_end();
}

filter = goxel.gui.current_filter;
if (filter) {
// XXX: we should have a way to center the filter window.
gui_window_begin(filter->name, 100, 100, goxel.gui.panel_width, 0,
GUI_WINDOW_MOVABLE);
if (gui_panel_header(filter->name)) {
if (goxel.gui.current_filter->on_close) {
goxel.gui.current_filter->on_close(goxel.gui.current_filter);
}
goxel.gui.current_filter = NULL;
}
filter->gui_fn(filter);
gui_window_end();
}
filter_layout_state.next_x = x + goxel.gui.panel_width +
INITIAL_FILTER_OFFSET;
filter_layout_state.next_y = y;
filters_iter_all(&filter_layout_state, gui_filter_window);

goxel.pathtrace = goxel.pathtracer.status &&
(goxel.gui.current_panel == PANEL_RENDER ||
Expand Down
2 changes: 1 addition & 1 deletion src/gui/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ static void on_script(void *user, const char *name)
script_execute(name);
}

static void on_filter(void *user, const filter_t *filter)
static void on_filter(void *user, filter_t *filter)
{
const action_t *action;
if (gui_menu_item(0, filter->name, true)) {
Expand Down

0 comments on commit 8ae26ff

Please sign in to comment.