/* $Id: gui_entry.c,v 1.13 2013/03/11 23:08:39 steffen Exp $ */ /*************************************************************************** * gui_entry.c * * Copyright (C) 2013 Steffen Pohle * steffen@gulpe.de *************************************************************************** * basic windows functions ***************************************************************************/ /* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * main.c is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "osmroute.h" #include "draw.h" #include "gui.h" #include "system.h" /**************************************************************************** * entry */ void gui_entry_draw (GUIItem *item) { char text1[GUI_TEXTLEN]; char text2[GUI_TEXTLEN]; struct line_style ls; GUIEntry *entry = NULL; if (item) entry = (GUIEntry *) item->data; else return; ls.width = 1.0; if (currentwin->focus == (void*) item) ls.c = ls.borderc = color[COLOR_white][3]; else ls.c = ls.borderc = color[COLOR_white][2]; gfx_draw_line (currentwin->screen, item->x, item->y+item->h, item->x+item->w, item->y+item->h, ls); gfx_draw_line (currentwin->screen, item->x, item->y+item->h, item->x, item->y+item->h-2, ls); gfx_draw_line (currentwin->screen, item->x+item->w, item->y+item->h, item->x+item->w, item->y+item->h-2, ls); if (entry->curpos >= strlen (entry->text)) { entry->curpos = strlen (entry->text); snprintf (text1, GUI_TEXTLEN, "%s|", entry->text); } else if (entry->curpos <= 0) { entry->curpos = 0; snprintf (text1, GUI_TEXTLEN, "|%s", entry->text); } else { strncpy (text2, entry->text, entry->curpos); snprintf (text1, GUI_TEXTLEN, "%s|%s", text2, entry->text+entry->curpos); } gfx_draw_text (currentwin->screen, item->x+2, item->y, text1, &color[COLOR_white][3]); }; /* * event handling */ int gui_entry_event (GUIItem *item, GUIEvent *event) { char text1[GUI_TEXTLEN]; char text2[GUI_TEXTLEN]; GUIEntry *entry = NULL; if (item) entry = (GUIEntry *) item->data; if (event->event == EGUI_MOUSEPRESSED) { gui_set_focus (item); gui_softkeyb_show (TRUE); } else if (event->event == EGUI_KEYCHAR) { if (event->keyval == 0x08) { // backspace if (entry->curpos > 0) { memset (text1, 0x0, GUI_TEXTLEN); memset (text2, 0x0, GUI_TEXTLEN); strncpy (text1, entry->text, entry->curpos-1); snprintf (text2, GUI_TEXTLEN, "%s%s", text1, entry->text+entry->curpos); strncpy (entry->text, text2, GUI_TEXTLEN); entry->curpos--; } else { entry->text[0] = 0; entry->curpos = 0; } } else if (event->keyval == 0x1b) { // esc gui_close (); } else if (event->keyval == 0x0d) { // enter if (entry->callback_enter) entry->callback_enter (); } else if (event->keyval == 0x51) { // left entry->curpos--; } else if (event->keyval == 0x53) { // right entry->curpos++; } else if ((event->keyval & 0x00) == 0xff00) { // ignore all the rest } else { strncpy (text1, entry->text, GUI_TEXTLEN ); snprintf (entry->text, GUI_TEXTLEN, "%s%c", text1, event->keyval); entry->curpos++; } } currentwin->screen_changed = 1; return 1; }; GUIItem *gui_entry_new (char *text, int x, int y, int w, int h) { GUIItem *item = (GUIItem*) ml_malloc (sizeof (GUIItem) + sizeof (GUIEntry) + POINTERALIGNMENT); GUIEntry *entry = NULL; if (item) entry = (GUIEntry *) item->data; if (text == NULL) entry->text[0] = 0; else strncpy (entry->text, text, GUI_TEXTLEN); item->x = x; item->y = y; item->w = w; item->h = h; item->type = GUI_ENTRY; entry->callback_changed = NULL; entry->callback_enter = NULL; return item; }; void gui_entry_settext (GUIItem *item, char *text) { GUIEntry *entry = NULL; if (item) entry = (GUIEntry *) item->data; strncpy (entry->text, text, GUI_TEXTLEN); entry->curpos = strlen (entry->text); currentwin->screen_changed = 1; };