int kiss_array_appendstring(kiss_array *a, int id, char *text1, char *text2) { char *p; if (!a) return -1; p = (char *) malloc(KISS_MAX_LENGTH); kiss_string_copy(p, KISS_MAX_LENGTH, text1, text2); kiss_array_append(a, id, p); return 0; }
int kiss_combobox_event(kiss_combobox *combobox, SDL_Event *event, int *draw) { int firstline, index; if (!combobox || !combobox->visible) return 0; if (kiss_vscrollbar_event(&combobox->vscrollbar, event, draw) && combobox->textbox.array->length - combobox->textbox.maxlines >= 0) { combobox->vscrollbar.step = 0.; if (combobox->textbox.array->length - combobox->textbox.maxlines > 0) combobox->vscrollbar.step = 1. / (combobox->textbox.array->length - combobox->textbox.maxlines); firstline = (int) ((combobox->textbox.array->length - combobox->textbox.maxlines) * combobox->vscrollbar.fraction + 0.5); if (firstline >= 0) combobox->textbox.firstline = firstline; *draw = 1; } if (!event) return 0; if (event->type == SDL_WINDOWEVENT && event->window.event == SDL_WINDOWEVENT_EXPOSED) *draw = 1; if (event->type == SDL_MOUSEBUTTONDOWN && kiss_pointinrect(event->button.x, event->button.y, &combobox->entry.rect)) { combobox->window.visible = 1; *draw = 1; } if (kiss_entry_event(&combobox->entry, event, draw)) { combobox->window.visible = 0; strcpy(combobox->text, combobox->entry.text); *draw = 1; return 1; } else if (kiss_textbox_event(&combobox->textbox, event, draw)) { combobox->window.visible = 0; combobox->entry.active = 0; if (combobox->entry.wdw) combobox->entry.wdw->focus = 1; combobox->entry.focus = 0; index = combobox->textbox.firstline + combobox->textbox.selectedline; kiss_string_copy(combobox->entry.text, kiss_maxlength(kiss_textfont, combobox->entry.textwidth, (char *) kiss_array_data(combobox->textbox.array, index), NULL), (char *) kiss_array_data(combobox->textbox.array, index), NULL); *draw = 1; return 1; } return 0; }
int kiss_label_new(kiss_label *label, kiss_window *wdw, char *text, int x, int y) { if (!label || !text) return -1; label->textcolor = kiss_black; label->font = kiss_textfont; kiss_makerect(&label->rect, x, y, 0, 0); kiss_string_copy(label->text, KISS_MAX_LABEL, text, NULL); label->visible = 0; label->wdw = wdw; return 0; }
static void button_ok1_event(kiss_button *button, SDL_Event *e, kiss_window *window1, kiss_window *window2, kiss_label *label_sel, kiss_entry *entry, kiss_label *label_res, kiss_progressbar *progressbar, int *draw) { char buf[KISS_MAX_LENGTH]; if (kiss_button_event(button, e, draw)) { kiss_string_copy(buf, kiss_maxlength(kiss_textfont, window2->rect.w - 2 * kiss_vslider.w, label_sel->text, entry->text), label_sel->text, entry->text); kiss_string_copy(label_res->text, KISS_MAX_LABEL, "The following path was selected:\n", buf); window2->visible = 1; window2->focus = 1; window1->focus = 0; button->prelight = 0; progressbar->fraction = 0.; progressbar->run = 1; *draw = 1; } }
static void textbox2_event(kiss_textbox *textbox, SDL_Event *e, kiss_vscrollbar *vscrollbar2, kiss_entry *entry, int *draw) { int index; if (kiss_textbox_event(textbox, e, draw)) { index = textbox->firstline + textbox->selectedline; if (strcmp((char *) kiss_array_data(textbox->array, index), "")) { kiss_string_copy(entry->text, entry->textwidth / kiss_textfont.advance, (char *) kiss_array_data(textbox->array, index), NULL); *draw = 1; } } }
int kiss_button_new(kiss_button *button, kiss_window *wdw, char *text, int x, int y) { if (!button || !text) return -1; kiss_makerect(&button->rect, x, y, kiss_normal.w, kiss_normal.h); button->textcolor = kiss_white; kiss_string_copy(button->text, KISS_MAX_LENGTH, text, NULL); button->textx = x + kiss_normal.w / 2 - kiss_textwidth(kiss_buttonfont, text, NULL) / 2; button->texty = y + kiss_normal.h / 2 - kiss_buttonfont.fontheight / 2; button->active = 0; button->prelight = 0; button->visible = 0; button->focus = 0; button->wdw = wdw; return 0; }
int kiss_label_draw(kiss_label *label, SDL_Renderer *renderer) { char buf[KISS_MAX_LABEL], *p; int len, y; if (label && label->wdw) label->visible = label->wdw->visible; if (!label || !label->visible || !renderer) return 0; y = label->rect.y + label->font.spacing / 2; len = strlen(label->text); if (len > KISS_MAX_LABEL - 2) label->text[len - 1] = '\n'; else strcat(label->text, "\n"); for (p = label->text; *p; p = strchr(p, '\n') + 1) { kiss_string_copy(buf, strcspn(p, "\n") + 1, p, NULL); kiss_rendertext(renderer, buf, label->rect.x, y, label->font, label->textcolor); y += label->font.lineheight; } label->text[len] = 0; return 1; }
int kiss_entry_new(kiss_entry *entry, kiss_window *wdw, int decorate, char *text, int x, int y, int w) { if (!entry || w < 2 * kiss_border + kiss_textfont.advance || !text) return -1; entry->bg = kiss_white; entry->normalcolor = kiss_black; entry->activecolor = kiss_blue; entry->textwidth = w - 2 * kiss_border; kiss_string_copy(entry->text, kiss_maxlength(kiss_textfont, entry->textwidth, text, NULL), text, NULL); kiss_makerect(&entry->rect, x, y, w, kiss_textfont.fontheight + 2 * kiss_border); entry->decorate = decorate; entry->textx = x + kiss_border; entry->texty = y + kiss_border; entry->active = 0; entry->visible = 0; entry->focus = 0; entry->wdw = wdw; return 0; }
/* Read directory entries into the textboxes */ static void dirent_read(kiss_textbox *textbox1, kiss_vscrollbar *vscrollbar1, kiss_textbox *textbox2, kiss_vscrollbar *vscrollbar2, kiss_label *label_sel) { kiss_dirent *ent; kiss_stat s; kiss_dir *dir; char buf[KISS_MAX_LENGTH], ending[2]; kiss_array_free(textbox1->array); kiss_array_free(textbox2->array); kiss_array_new(textbox1->array); kiss_array_new(textbox2->array); kiss_getcwd(buf, KISS_MAX_LENGTH); strcpy(ending, "/"); if (buf[0] == 'C') strcpy(ending, "\\"); if (!strcmp(buf, "/") || !strcmp(buf, "C:\\")) strcpy(ending, ""); kiss_string_copy(label_sel->text, (2 * textbox1->rect.w + 2 * kiss_up.w) / kiss_textfont.advance, buf, ending); #ifdef _MSC_VER dir = kiss_opendir("*"); #else dir = kiss_opendir("."); #endif while ((ent = kiss_readdir(dir))) { if (!ent->d_name) continue; kiss_getstat(ent->d_name, &s); if (kiss_isdir(s)) kiss_array_appendstring(textbox1->array, 0, ent->d_name, "/"); else if (kiss_isreg(s)) kiss_array_appendstring(textbox2->array, 0, ent->d_name, NULL); } kiss_closedir(dir); text_reset(textbox1, vscrollbar1); text_reset(textbox2, vscrollbar2); }
int kiss_textbox_draw(kiss_textbox *textbox, SDL_Renderer *renderer) { SDL_Rect highlightrect; char buf[KISS_MAX_LENGTH]; int numoflines, i; if (textbox && textbox->wdw) textbox->visible = textbox->wdw->visible; if (!textbox || !textbox->visible || !renderer) return 0; kiss_fillrect(renderer, &textbox->rect, textbox->bg); if (textbox->decorate) kiss_decorate(renderer, &textbox->rect, kiss_blue, kiss_edge); if (textbox->highlightline >= 0) { kiss_makerect(&highlightrect, textbox->textrect.x, textbox->textrect.y + textbox->highlightline * kiss_textfont.lineheight, textbox->textrect.w, kiss_textfont.lineheight); kiss_fillrect(renderer, &highlightrect, textbox->hlcolor); } if (!textbox->array || !textbox->array->length) return 0; numoflines = textbox_numoflines(textbox); for (i = 0; i < numoflines; i++) { kiss_string_copy(buf, kiss_maxlength(kiss_textfont, textbox->textwidth, (char *) kiss_array_data(textbox->array, textbox->firstline + i), NULL), (char *) kiss_array_data(textbox->array, textbox->firstline + i), NULL); kiss_rendertext(renderer, buf, textbox->textrect.x, textbox->textrect.y + i * kiss_textfont.lineheight + kiss_textfont.spacing / 2, kiss_textfont, textbox->textcolor); } return 1; }