Example #1
0
// 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;
}
Example #2
0
// 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;
}
Example #3
0
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);
}
Example #4
0
// 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;
}
Example #5
0
// 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;
}
Example #6
0
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;
}