// Activation int ActivateBasicLayout(Widget *w) { BasicLayoutArgs *args = w->args; if (!args->nWidgets || !args->widgets) return 0; int ok; int nWidget = args->cWidget; if (K_DOWN()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_BOT, w->construct->previousWidgetBounds); else if (K_UP()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_TOP, w->construct->previousWidgetBounds); else if (K_RIGHT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_RIGHT, w->construct->previousWidgetBounds); else if (K_LEFT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_LEFT, w->construct->previousWidgetBounds); else if (K_TAB() || !args->widgets[nWidget]->isDynamic || !wIsActivable(args->widgets[nWidget])) { nWidget = 0; while (nWidget < args->nWidgets && (!args->widgets[nWidget]->isDynamic || !wIsActivable(args->widgets[nWidget]))) nWidget++; if (nWidget == args->nWidgets) nWidget = -1; } do { if (nWidget > -1 && nWidget < args->nWidgets) args->cWidget = nWidget; ok = wActivateWidget(args->widgets[args->cWidget]); if (ok < 2) return ok; if (K_UP()) { // on regarde qui est le prochain widget nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_TOP, w->construct->previousWidgetBounds); if (nWidget == -1) break; // pas de prochain widget dans ce layout, on va voir s'il y en a un au-dessus ok = 3; } else if (K_DOWN()) { nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_BOT, w->construct->previousWidgetBounds); if (nWidget == -1) break; // pas de prochain widget dans ce layout, on va voir s'il y en a un au-dessus ok = 3; } else if (K_TAB()) { nWidget = args->cWidget; do { ++nWidget; } while (nWidget < args->nWidgets && (!args->widgets[nWidget]->isDynamic || !wIsActivable(args->widgets[nWidget]))); if (nWidget == args->nWidgets) nWidget = -1; if (nWidget == -1) break; ok = 3; } } while (ok == 3); return 2; }
// Activation int ActivateCardinalLayout(Widget *w) { CardinalLayoutArgs *args = w->args; int ok; int nWidget = args->cWidget; if (K_DOWN()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_BOT, w->construct->previousWidgetBounds); else if (K_UP()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_TOP, w->construct->previousWidgetBounds); else if (K_RIGHT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_RIGHT, w->construct->previousWidgetBounds); else if (K_LEFT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_LEFT, w->construct->previousWidgetBounds); else if (K_TAB() || !args->widgets[nWidget]->isDynamic || !wIsActivable(args->widgets[nWidget])) { nWidget = 0; while (nWidget < args->nWidgets && (!args->widgets[nWidget]->isDynamic || !wIsActivable(args->widgets[nWidget]))) nWidget++; if (nWidget == args->nWidgets) nWidget = -1; } do { if (nWidget > -1 && nWidget < args->nWidgets) args->cWidget = nWidget; ok = wActivateWidget(args->widgets[args->cWidget]); if (ok < 2) return ok; if (K_UP() || K_DOWN() || K_LEFT() || K_RIGHT()) { if (K_DOWN()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_BOT, w->construct->previousWidgetBounds); else if (K_UP()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_TOP, w->construct->previousWidgetBounds); else if (K_RIGHT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_RIGHT, w->construct->previousWidgetBounds); else if (K_LEFT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_LEFT, w->construct->previousWidgetBounds); if (nWidget == -1) break; ok = 3; } else if (K_TAB()) { nWidget = args->cWidget; do { ++nWidget; } while (nWidget < args->nWidgets && (!args->widgets[nWidget]->isDynamic || !wIsActivable(args->widgets[nWidget]))); if (nWidget == args->nWidgets) nWidget = -1; if (nWidget == -1) break; ok = 3; } } while (ok == 3); return 2; }
char *ft_term(t_shell *shell, int j, int f) { char buf[5]; t_line *tmp; char *str; tmp = shell->hist; str = NULL; ft_putstr(tgetstr("sc", NULL)); f = 0; while (42) { ft_read(buf); if (buf[0] == '\n') return (exit_mode(shell, str, j)); else if (K_UP(buf)) f *= history(&tmp, 'A', &str); else if (K_DOWN(buf)) f *= history(&tmp, 'B', &str); else if (K_END(buf)) f = 0; else if (K_HOME(buf)) f = ft_strlen(str); else term_center(shell, &str, buf, &f); } return (str); }
// Activation int ActivateList(Widget *w) { SDL_Surface *scr = w->construct->scr; wTHEME *t = w->construct->theme; ListArgs *args = w->args; args->isActive = 1; wMENU *m = args->menu; int ok = ACTION_CONTINUE; int db = w->displayBounds; do { DrawList(w); SDL_Flip(scr); wait_key_pressed(); if (K_CLICK() && args->menu->nItems) { int ws = nSDL_GetStringWidth(t->font, m->title); int xw = (w->bounds.w*3)/5; if (!m->title) xw = w->bounds.w - 6; else if (xw + ws + 9 > w->bounds.w) xw = w->bounds.w - ws - 9; int x = w->bounds.x + w->bounds.w - xw - 3; w->displayBounds = -1; ok=OpenMenu(w, m, x+1, 0, xw, w->bounds.y+4); w->displayBounds = db; wDrawBounds(w); if (ok == MENU_QUIT) ok = ACTION_CONTINUE; if (ok != ACTION_CONTINUE) break; while (K_ESC() || K_LEFT() || K_ENTER()); } else if (K_UP() || K_DOWN() || K_LEFT() || K_RIGHT() || K_MENU() || K_TAB() || K_SCRATCHPAD() || K_ENTER()) break; else if (any_key_pressed()) { if ((ok=wExecCallback(w, SIGNAL_KEY)) != ACTION_CONTINUE) break; SDL_Flip(scr); } } while (!K_ESC()); args->isActive = 0; return ok; }
// Activation int ActivateScrolledLayout(Widget *w) { SDL_Surface *scr = w->construct->scr; ScrolledLayoutArgs *args = w->args; if (!args->nWidgets || !args->widgets) return 0; int ok = 3; int nWidget = args->cWidget; int n = 0; BOOL dynamic = 0; if (K_DOWN() || K_TAB()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_BOT, w->construct->previousWidgetBounds); else if (K_UP()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_TOP, w->construct->previousWidgetBounds); else if (K_RIGHT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_RIGHT, w->construct->previousWidgetBounds); else if (K_LEFT()) nWidget = wFindNextWidget(args->widgets, args->nWidgets, ARROW_LEFT, w->construct->previousWidgetBounds); if ((nWidget == -1 || nWidget == args->cWidget) && args->cWidget >= 0 && !args->widgets[args->cWidget]->isDynamic) { args->cWidget =- 1, nWidget = -1; while (!isFullyDrawn(args->widgets[n])) n++; while (isFullyDrawn(args->widgets[n])) { if (args->widgets[n]->isDynamic) { nWidget = n; break; } n++; if (n == args->nWidgets) break; } } // w->construct->previousWidgetBounds.y += args->y; if (nWidget > -1 && nWidget < args->nWidgets) args->cWidget = nWidget; if (args->cWidget == -1) SDL_Flip(scr); // Début de la boucle while (ok == 3) { dynamic = 0; if (args->cWidget >= 0) { ok = wActivateWidget(args->widgets[args->cWidget]); if (ok < 2) return ok; } else { ok = 2; wait_key_pressed(); if (K_ENTER()) return 1; else if (K_ESC()) return 0; dynamic = 1; } if (K_UP()) { // on regarde qui est le prochain widget // S'il n'y a aucun widget actif visible if (args->cWidget == -1) { UP: n=0; while (!isFullyDrawn(args->widgets[n])) n++; if (!n) continue; int y = args->widgets[n-1]->bounds.y + args->y - w->bounds.y - 3; ok = 3; w->construct->previousWidgetBounds.y -= y - args->y; SetY(w, y); wDrawWidget(w); if (args->widgets[n-1]->isDynamic) args->cWidget = n-1; else { if (args->cWidget >= 0) { if(!isFullyDrawn(args->widgets[args->cWidget])) { args->cWidget = -1; SDL_Flip(scr); } } else SDL_Flip(scr); } } else { if (!args->cWidget) continue; // s'il y a un widget dynamique au dessus pleinement visible on le sélectionne n = args->cWidget-1; while (isFullyDrawn(args->widgets[n])) { if (args->widgets[n]->isDynamic) { args->cWidget = n; ok = 3; break; } if (!n--) break; } // sinon on affiche le prochain if (args->cWidget != n) { if (n == -1) continue; goto UP; } } } else if (K_DOWN() || K_TAB()) { Widget *wx; // S'il n'y a aucun widget actif visible if (args->cWidget == -1) { DOWN: n = args->nWidgets-1; while (!isFullyDrawn(args->widgets[n])) n--; if (n == args->nWidgets-1) continue; wx = args->widgets[n+1]; int y = wx->bounds.y + wx->bounds.h + args->y - w->bounds.y - w->bounds.h + 3; ok = 3; w->construct->previousWidgetBounds.y -= y - args->y; SetY(w, y); wDrawWidget(w); if (wx->isDynamic) args->cWidget = n+1; else { if (args->cWidget >= 0) { if(!isFullyDrawn(args->widgets[args->cWidget])) { args->cWidget = -1; SDL_Flip(scr); } } else SDL_Flip(scr); } } else { if (args->cWidget == args->nWidgets-1) continue; // s'il y a un widget dynamique au dessous pleinement visible on le sélectionne n = args->cWidget+1; while (isFullyDrawn(args->widgets[n])) { if (args->widgets[n]->isDynamic) { args->cWidget = n; ok = 3; break; } if ((++n) == args->nWidgets) break; } // sinon on affiche le prochain if (args->cWidget != n) { if (n == args->nWidgets) continue; goto DOWN; } } } } if (dynamic) w->construct->previousWidgetBounds = w->bounds; return 2; }
int OpenMenu(Widget *w, wMENU *m, int xr, int xl, int minWidth, int y) { if (!w || !m) return MENU_QUIT; if (!m->nItems || !m->items) return MENU_QUIT; SDL_Surface *scr = w->construct->scr; wTHEME *t = w->construct->theme; ListArgs *args = w->args; wITEM *itm; wMENU *menu; int x, l; SDL_Rect area; SDL_Surface *saveImage; Uint32 c = Darker(t->color1, 60); Uint32 cs1 = Darker(t->menus_c1, 15); // color selection args->cMenu = m; args->yItem = 0; args->cItem = 0; int dItems = min(args->dItems, m->nItems); if (!dItems) dItems = m->nItems; SDL_Rect clip; SDL_GetClipRect(scr, &clip); int b; int ok = ACTION_CONTINUE; // calcul de la hauteur int h = 10*dItems+2; while (h > 234) h-=10, dItems-=1; if (y+h > scr->h) y = scr->h - h; // calcul de la largeur int wd = 0; for (x=0; x < m->nItems; x++) { itm = m->items[x]; l = nSDL_GetStringWidth(t->menus_font1, itm->str); if (l > wd) wd = l; l = nSDL_GetStringWidth(t->menus_font2, itm->str); if (l > wd) wd = l; } wd += 10; if (m->nItems > dItems) wd += 7; // pour les scrollbars if (wd < minWidth) wd = minWidth; if (wd > scr->w) wd = scr->w; if (xr+wd > scr->w) { if (xl-wd > 0) xr = xl - wd; else xr = scr->w - wd; } // sauvegarde de l'image area = (SDL_Rect) {xr, y, wd, h}; saveImage = SDL_CreateRGBSurface(SDL_SWSURFACE, wd, h, 16, 0, 0, 0, 0); DrawSurface(scr, &area, saveImage, NULL); if ((ok=wExecCallback(w, SIGNAL_ACTION)) != ACTION_CONTINUE) { SDL_FreeSurface(saveImage); return ok; } do { // dessin !!! SDL_SetClipRect(scr, &area); DrawFillRect(scr, &area, t->menus_c1); DrawRect(scr, &area, c); for (x=0; x < dItems; x++) { itm = m->items[x + args->yItem]; if (x == args->cItem) DrawFillRectXY(scr, xr+1, y+1+10*x, wd-2, 10, cs1); if (itm->magicNumber == 1) { menu = (wMENU *) itm; if (wMenu_HasSelectedItemOrMenu(menu)) DrawClippedStr(scr, t->menus_font2, xr+2, y+2+10*x, menu->title); else DrawClippedStr(scr, t->menus_font1, xr+2, y+2+10*x, menu->title); DrawSurface(t->menus_right,NULL,scr, &(SDL_Rect){xr+wd - (m->nItems > dItems? 17:8), y+2+10*x, 5, 7}); } else { if (itm->isSelected) DrawClippedStr(scr, t->menus_font2, xr+2, y+2+10*x, itm->str); else DrawClippedStr(scr, t->menus_font1, xr+2, y+2+10*x, itm->str); } } if (m->nItems > dItems) DrawVScrollBar(scr, t, &area, 10*m->nItems+2, 10*args->yItem); SDL_SetClipRect(scr, &clip); // activation !!! itm = m->items[args->cItem + args->yItem]; ACTIVATION: SDL_Flip(scr); while ((any_key_pressed() && !K_CTRL()) || K_CLICK()); while (!any_key_pressed()); if (K_CLICK() || K_ENTER()) { if (K_ENTER() && args->maxSelected != 1) { ok = wExecCallback(w, SIGNAL_CLICK); break; } if (itm->magicNumber == 1) goto NEWMENU; if (args->maxSelected == 1) { if (args->nSelected) wMenu_DeselectAll(args->menu); wMenu_SelectItem(m, args->yItem + args->cItem); args->nSelected = 1; DrawSurface(saveImage, NULL, scr, &area); SDL_FreeSurface(saveImage); saveImage = NULL; ok = wExecCallback(w, K_CLICK() || K_ENTER()? SIGNAL_CLICK : SIGNAL_ACTION); break; } else if (args->maxSelected >= 0) { b = wMenu_IsSelected(m, args->yItem + args->cItem); if (!b && args->nSelected) if (args->nSelected == args->maxSelected) goto ACTIVATION; wMenu_SelectItem(m, args->yItem + args->cItem); if (b) args->nSelected--; else args->nSelected++; } if ((ok=wExecCallback(w, SIGNAL_CLICK)) != ACTION_CONTINUE) break; } else if (K_UP()) { if (!args->yItem && !args->cItem) { if (K_CTRL()) goto ACTIVATION; args->cItem = dItems-1; args->yItem = m->nItems-dItems; } else { if (args->cItem) args->cItem--; else args->yItem--; } if ((ok=wExecCallback(w, SIGNAL_ACTION)) != ACTION_CONTINUE) break; } else if (K_DOWN()) { if (args->yItem + args->cItem >= m->nItems-1) { if (K_CTRL()) goto ACTIVATION; args->cItem = 0; args->yItem = 0; } else { if (args->cItem < dItems-1) args->cItem++; else args->yItem++; } if ((ok=wExecCallback(w, SIGNAL_ACTION)) != ACTION_CONTINUE) break; } else if (K_RIGHT() && itm->magicNumber == 1) { NEWMENU:; int yI = args->yItem, cI = args->cItem; ok = OpenMenu(w, (wMENU *) itm, xr+wd-3, xr, minWidth, y+10*args->cItem); args->cMenu = m; args->yItem = yI; args->cItem = cI; if (K_ESC() || K_ENTER() || (K_CLICK() && args->maxSelected == 1) || ok != ACTION_CONTINUE) break; if ((ok=wExecCallback(w, SIGNAL_ACTION)) != ACTION_CONTINUE) break; } else if (K_LEFT()) break; } while (!K_ESC()); if (saveImage) { DrawSurface(saveImage, NULL, scr, &area); SDL_FreeSurface(saveImage); } return ok; }