[Add] Custom mouse events for custome widgets

This commit is contained in:
Allanis 2013-03-10 13:41:36 +00:00
parent c687e7a173
commit 7fb9bbedce
4 changed files with 70 additions and 42 deletions

View File

@ -111,7 +111,7 @@ static void outfits(void) {
"Sell", outfits_sell);
window_addCust(secondary_wid, -40-BUTTON_WIDTH, 60+2*BUTTON_HEIGHT,
BUTTON_WIDTH, BUTTON_HEIGHT, "cstMod", 0, outfits_renderMod);
BUTTON_WIDTH, BUTTON_HEIGHT, "cstMod", 0, outfits_renderMod, NULL);
window_addText(secondary_wid, 40+200+20, -60,
80, 96, 0, "txtSDesc", &gl_smallFont, &cDConsole,

View File

@ -20,9 +20,10 @@ static int map_selected = 0;
extern StarSystem* systems_stack;
extern int systems_nstack;
static void map_render(double bx, double by, double w, double h);
static void map_close(char* str);
static void map_update(void);
static void map_render(double bx, double by, double w, double h);
static void map_mouse(Uint8 type, double mx, double my);
// Open the map window.
void map_open(void) {
@ -50,7 +51,7 @@ void map_open(void) {
&gl_smallFont, &cBlack, NULL);
window_addCust(map_wid, 20, 20, MAP_WIDTH - 150, MAP_HEIGHT - 60,
"cstMap", 1, map_render);
"cstMap", 1, map_render, map_mouse);
window_addButton(map_wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT,
"btnClose", "Close", map_close);
@ -112,6 +113,12 @@ static void map_update(void) {
// Render the map as a custom widget.
static void map_render(double bx, double by, double w, double h) {
int i;
double x, y, r;
StarSystem* sys;
r = 5.;
x = bx - map_xpos + w/2;
y = by - map_ypos + h/2;
// Background
COLOUR(cBlack);
glBegin(GL_QUADS);
@ -125,9 +132,18 @@ static void map_render(double bx, double by, double w, double h) {
for(i = 0; i < systems_nstack; i++) {
if(&systems_stack[i] == cur_system) COLOUR(cRadar_targ);
else COLOUR(cYellow);
gl_drawCircleInRect(bx + systems_stack[i].pos.x - map_xpos + w/2,
by + systems_stack[i].pos.y - map_ypos + h/2,
5, bx, by, w, h);
gl_drawCircleInRect(x + systems_stack[i].pos.x,
y + systems_stack[i].pos.y,
r, bx, by, w, h);
}
// Selected planet.
sys = &systems_stack[map_selected];
COLOUR(cRed);
gl_drawCircleInRect(x + sys->pos.x, y + sys->pos.y, r+3., bx, by, w, h);
}
// Map event handling.
static void map_mouse(Uint8 type, double mx, double my) {
}

View File

@ -66,6 +66,7 @@ typedef struct Widget_ {
struct {
int border;
void(*render) (double bx, double by, double bw, double bh);
void(*mouse) (Uint8 type, double bx, double by);
} cst;
} dat;
} Widget;
@ -129,8 +130,9 @@ static void toolkit_alertClose(char* str);
// Add a button that when pressed will trigger call, passing it's name as the
// only parameter.
void window_addButton(const unsigned int wid, const int x, const int y, const int w,
const int h, char* name, char* display, void (*call)(char*)) {
void window_addButton(const unsigned int wid, const int x, const int y,
const int w, const int h, char* name,
char* display, void (*call)(char*)) {
Window* wdw = window_wget(wid);
Widget* wgt = window_newWidget(wdw);
@ -200,8 +202,8 @@ void window_addImage(const unsigned int wid, const int x, const int y,
}
void window_addList(const unsigned int wid, const int x, const int y,
const int w, const int h, char* name, char** items, int nitems, int defitem,
void(*call) (char*)) {
const int w, const int h, char* name, char** items, int nitems,
int defitem, void(*call) (char*)) {
Window *wdw = window_wget(wid);
Widget* wgt = window_newWidget(wdw);
@ -226,8 +228,8 @@ void window_addList(const unsigned int wid, const int x, const int y,
toolkit_nextFocus();
}
void window_addRect(const unsigned int wid, const int x, const int y, const int w,
const int h, char* name, glColour* colour, int border) {
void window_addRect(const unsigned int wid, const int x, const int y,
const int w, const int h, char* name, glColour* colour, int border) {
Window* wdw = window_wget(wid);
Widget* wgt = window_newWidget(wdw);
@ -248,7 +250,8 @@ void window_addRect(const unsigned int wid, const int x, const int y, const int
void window_addCust(const unsigned int wid, const int x, const int y,
const int w, const int h, char* name, const int border,
void(*render) (double x, double y, double w, double h)) {
void(*render) (double x, double y, double w, double h),
void(*mouse) (Uint8 type, double x, double y)) {
Window* wdw = window_wget(wid);
Widget* wgt = window_newWidget(wdw);
@ -260,6 +263,7 @@ void window_addCust(const unsigned int wid, const int x, const int y,
// Specific.
wgt->dat.cst.border = border;
wgt->dat.cst.render = render;
wgt->dat.cst.mouse = mouse;
// Position/size.
wgt->w = (double)w;
@ -336,7 +340,8 @@ unsigned int window_get(const char* wdwname) {
}
// Create a window.
unsigned int window_create(char* name, const int x, const int y, const int w, const int h) {
unsigned int window_create(char* name, const int x, const int y,
const int w, const int h) {
if(nwindows >= mwindows) {
// We have reached our memory limit.
windows = realloc(windows, sizeof(Window)*(++mwindows));
@ -783,7 +788,8 @@ static void toolkit_renderList(Widget* lst, double bx, double by) {
toolkit_drawOutline(x, y, lst->w, lst->h, 1., toolkit_colDark, NULL);
// Draw selected.
toolkit_drawRect(x, y-1.+lst->h-(1+lst->dat.lst.selected-lst->dat.lst.pos)*(gl_defFont.h+2.),
toolkit_drawRect(x,
y-1.+lst->h-(1+lst->dat.lst.selected-lst->dat.lst.pos)*(gl_defFont.h+2.),
lst->w, gl_defFont.h+2., &cHilight, NULL);
// Draw content.
@ -903,7 +909,11 @@ static void toolkit_mouseEvent(SDL_Event* event) {
for(i = 0; i < w->nwidgets; i++) {
wgt = &w->widgets[i];
if((x > wgt->x) && (x < (wgt->x + wgt->w)) && (y > wgt->y) && (y < (wgt->y + wgt->h))) {
if((x > wgt->x) && (x < (wgt->x + wgt->w)) &&
(y > wgt->y) && (y < (wgt->y + wgt->h))) {
if((wgt->type == WIDGET_CUST) && wgt->dat.cst.mouse)
(*wgt->dat.cst.mouse)(event->type, x, y);
else
switch(event->type) {
case SDL_MOUSEMOTION:
wgt->status = WIDGET_STATUS_MOUSEOVER;

View File

@ -6,7 +6,8 @@
extern int toolkit;
// Creation.
unsigned int window_create(char* name, const int x, const int y, const int w, const int h);
unsigned int window_create(char* name, const int x, const int y,
const int w, const int h);
void window_addButton(const unsigned int wid, const int x, const int y,
const int w, const int h, char* name, char* display,
@ -34,7 +35,8 @@ void window_addCust(const unsigned int wid,
const int x, const int y, // Position.
const int w, const int h, // Size.
char* name, const int border,
void(*render) (double x, double y, double w, double h));
void(*render) (double x, double y, double w, double h),
void(*mouse) (Uint8 type, double x, double y));
// Popups and alerts.
void toolkit_alert(const char* fmt, ...);