diff --git a/src/land.c b/src/land.c index e903c34..06d52d9 100644 --- a/src/land.c +++ b/src/land.c @@ -42,11 +42,23 @@ static void news_close(char* str); // The local market. static void commodity_exchange(void) { + char** goods; + int ngoods; + + goods = malloc(sizeof(char*)*3); + goods[0] = strdup("Heya!"); + goods[1] = strdup("Just"); + goods[2] = strdup("testing."); + ngoods = 3; + secondary_wid = window_create("Commodity Exchange", -1, -1, COMMODITY_WIDTH, COMMODITY_HEIGHT); window_addButton(secondary_wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnCommodityClose", "Close", commodity_exchange_close); + + window_addList(secondary_wid, 20, -40, COMMODITY_WIDTH-30, COMMODITY_HEIGHT-80-BUTTON_HEIGHT, + "lstGoods", goods, ngoods, -1); } static void commodity_exchange_close(char* str) { diff --git a/src/toolkit.c b/src/toolkit.c index 71d8e2c..a4aa2b8 100644 --- a/src/toolkit.c +++ b/src/toolkit.c @@ -48,6 +48,7 @@ typedef struct Widget_ { char** options; // Pointer to the options. int noptions; // total number of options. int selected; // Currently selected option. + int pos; // Current topmost option (in view). } lst; } dat; } Widget; @@ -175,8 +176,9 @@ void window_addList(const unsigned int wid, const int x, const int y, wgt->dat.lst.options = items; wgt->dat.lst.noptions = nitems; wgt->dat.lst.selected = defitem; // -1 would be none. + wgt->dat.lst.pos = 0; wgt->w = (double) w; - wgt->h = (double) h; + wgt->h = (double) h - ((h % (gl_defFont.h+2)) + 2); if(x < 0) wgt->x = wdw->w - wgt->w + x; else wgt->x = (double) x; if(y < 0) wgt->y = wdw->h - wgt->h + y; @@ -664,10 +666,37 @@ static void toolkit_renderImage(Widget* img, double bx, double by) { // Render the list. static void toolkit_renderList(Widget* lst, double bx, double by) { - double x, y; + int i; + double x, y, tx, ty; + glColour* lc, *c, *oc; x = bx + lst->x; y = by + lst->y; + + lc = &cGrey90; + c = &cGrey70; + oc = &cGrey30; + + // List bg. + toolkit_drawRect(x, y, lst->w, lst->h, &cWhite, NULL); + + // Inner outline. + toolkit_drawOutline(x, y, lst->w, lst->h, 1., lc, c); + // Outter outline. + toolkit_drawOutline(x, y, lst->w, lst->h, 2., oc, NULL); + + // Draw content. + tx = (double)gl_screen.w/2. + x+2.; + ty = (double)gl_screen.h/2. + y+lst->h - 2. - gl_defFont.h; + y = ty-2.; + + for(i = lst->dat.lst.pos; i < lst->dat.lst.noptions; i++) { + gl_printMax(&gl_defFont, (int)lst->w-4, + tx, ty, &cBlack, lst->dat.lst.options[i]); + + ty -= 2 + gl_defFont.h; + if(ty-y > lst->h) break; + } } // Render the window. diff --git a/src/toolkit.h b/src/toolkit.h index 4c90bd6..73548ed 100644 --- a/src/toolkit.h +++ b/src/toolkit.h @@ -19,6 +19,11 @@ void window_addText(const unsigned int wid, const int x, const int y, void window_addImage(const unsigned int wid, const int x, const int y, char* name, glTexture* image); +void window_addList(const unsigned int wid, + const int x, const int y, // Position. + const int w, const int h, // Size. + char* name, char** items, int nitems, int defitem); + // Modification void window_modifyText(const unsigned int wid, char* name, char* newstring); void window_modifyImage(const unsigned int wid, char* name, glTexture* image);