Pues aquí os traigo mi último proyecto: una GUI para usar en programas hechos con Bennu.
La idea surgió del hecho de que es un dolor de huevos cada vez que quiero hacer una interfaz con botones y demás. Así que como suelo necesitar botones y me da pereza hacermelos cada vez que lo necesito, pues he decidido hacerme una librería con todo esto y a paseo.
Demostración: https://www.youtube.com/watch?v=zFnASj6Cs6I
Código:
/************************************************/
/* GUI en BennuGD para BennuGD */
/* -------------------------------------------- */
/* */
/* Una solución sencilla para hacer interfaces */
/* de usuario. */
/* */
/* Autor: Yawin */
/* Versión: Alpha v1 */
/************************************************/
import "mod_mouse";
import "mod_video";
import "mod_key";
import "mod_map";
import "mod_proc";
import "mod_grproc";
import "mod_text";
import "mod_string";
import "mod_say";
import "mod_draw";
import "mod_mem";
import "mod_wm";
import "mod_screen";
type _lista
int valor; /* Valor */
_lista* anterior; /* Elemento anterior */
end
global
int gui_window_width, gui_window_height; /*almaceno el ancho y el alto de la ventana*/
int gui_window_color; /*Profundidad de color*/
int gui_window_mode;
int gui_debug; /*Si estamos debugeando o no*/
int gui_cursor; /*Si queremos que se muestre el cursor*/
bool gui_mouse_left; /*Si tenemos el click derecho pulsado*/
/*Controles*/
int gui_p_mouse; /*Identificador del proceso del ratón*/
_lista *gui_controles;
end
/*Gestión de controles*/
function gui_carga_control(int id_obj) /* Esta función carga un control en el sistema */
private
_lista *nuevo; /* Guarda el puntero al nuevo elemento que vamos a añadir */
end
begin
nuevo=alloc(sizeof(_lista));/* Reservo la memoria */
nuevo.valor=id_obj; /* Asigno el identificador de proceso */
nuevo.anterior=gui_controles; /* Asigno el puntero para que apunte al último elemento añadido */
gui_controles=nuevo; /* Reasigno el puntero global para que apunte al nuevo */
log("Cargado control["+gui_controles.valor+"]");
end
function gui_descarga_controles() /* Esta función descarga la lista de controles */
private
int i;
_lista *actual; /* Guarda el elemento en el que nos situamos */
end
begin
while(gui_controles != NULL)
actual=gui_controles; /* Recojemos el primer control */
log("Valor: "+actual.valor);
signal(actual.valor,s_kill); /* Matamos el control */
free(gui_controles); /* Liberamos el control */
gui_controles=actual.anterior; /* Pasamos al siguiente control */
end
end
function gui_descarga_control(int id)
private
int i;
_lista *actual, *int_old;
end
begin
if(!id) return; end
actual=gui_controles; /* Recojemos el primer control */
repeat
if(actual.valor==id)
if(int_old)
int_old.anterior=actual.anterior;
else
gui_controles=actual.anterior;
else
signal(actual.valor,s_kill);
free(actual);
break;
end
int_old=actual;
actual=actual.anterior; /* Pasamos al siguiente control */
until(actual==NULL)
end
/**********************/
function log(string texto)
begin
if(gui_debug)
say(texto);
end
end
function gui_init(int _screen_w, int _screen_h, int _screen_color, int _screen_mode, int _mouse, int _debug)
begin
gui_debug=_debug;
gui_window_width=_screen_w;
gui_window_height=_screen_h;
gui_window_color=_screen_color;
gui_window_mode=_screen_mode;
set_mode(gui_window_width,gui_window_height,gui_window_color,gui_window_mode);
log("GUI_WINDOW_WIDTH: "+gui_window_width);
log("GUI_WINDOW_HEIGHT: "+gui_window_height);
log("GUI_WINDOW_COLOR: "+gui_window_color);
log("GUI_WINDOW_MODE: "+gui_window_mode);
gui_cursor=_mouse;
gui_p_mouse=gui_mouse();
log("GUI inicializado");
end
function gui_stop()
begin
signal(gui_p_mouse,s_kill); /*Matamos el proceso del ratón*/
gui_descarga_controles();
log("GUI parado");
end
process gui_mouse()
private
int grafico;
end
begin
if(gui_p_mouse)
/*Si ya existe el ratón sacamos error*/
log("Error: Ya tenemos un el raton activo");
if(!gui_cursor) log("El cursor no esta visible. Tal vez quieras hacerlo visible"); end
end
x=gui_window_width/2;
y=gui_window_height/2;
z=-1;
file=load_fpg("img/common.fpg");
grafico=1;
loop
if(gui_cursor)
if(graph!=grafico)
graph=grafico;
end
else
if(graph==grafico)
graph=0;
end
end
if(mouse.left && !gui_mouse_left)
gui_mouse_left=true;
elsif(!mouse.left && gui_mouse_left)
gui_mouse_left=false;
end
x=mouse.x;
y=mouse.y;
frame;
end
end
process gui_canvas(int x, int y,int z, int c_w, int c_h, int file, int grafico)
private
int _tw, _th;
end
begin
/*Asignamos posicion*/
if(x<0) x=gui_window_width/2; end
if(y<0) y=gui_window_height/2; end
/*Asignamos tamaño*/
if(c_w<0)
if(gui_window_width/2>x)
c_w=x*2;
elsif(gui_window_width/2<x)
c_w=(gui_window_width-x)*2;
else
c_w=gui_window_width;
end
end
if(c_h<0)
if(gui_window_height/2>y)
c_h=y*2;
elsif(gui_window_height/2<y)
c_h=(gui_window_height-y)*2;
else
c_h=gui_window_height;
end
end
/*Asignamos grafico*/
if(file>0)
if(grafico>0)
graph=grafico;
/* Calculamos tamaño resultante*/
_tw=map_info(file,graph,G_WIDTH);
_th=map_info(file,graph,G_HEIGHT);
size_x=(100*c_w)/_tw;
size_y=(100*c_h)/_th;
end
else
/*Dibujamos un canvas de color sólido*/
graph=new_map(c_w,c_h,gui_window_color);
if(grafico>0)
map_clear(0,graph,grafico);
else
map_clear(0,graph,rgb(195,195,195));
end
end
log("Canvas");
gui_carga_control(id);
loop
frame;
end
end
process gui_label(int x, int y,int z, string texto, int align, int fnt)
private
int priv_gui_texto;
end
begin
priv_gui_texto=write_var(fnt,x,y,z,align,texto);
gui_carga_control(id);
loop
frame;
end
OnExit
delete_text(priv_gui_texto);
end
process gui_button(int x, int y,int z, int c_w, int c_h, int file, int grafico, string texto, int fnt)
private
int _tw, _th, internal_label;
int internal_size_x,internal_size_y;
int internal_entered=false;
public
gui_button_active=false;
end
begin
/*Asignamos posicion*/
if(x<0) x=gui_window_width/2; end
if(y<0) y=gui_window_height/2; end
/*Asignamos tamaño*/
/*if(c_w<0)
if(gui_window_width/2>x)
c_w=x*2;
elsif(gui_window_width/2<x)
c_w=(gui_window_width-x)*2;
else
c_w=gui_window_width;
end
end
if(c_h<0)
if(gui_window_height/2>y)
c_h=y*2;
elsif(gui_window_height/2<y)
c_h=(gui_window_height-y)*2;
else
c_h=gui_window_height;
end
end*/
/*Asignamos grafico*/
if(file>0)
if(grafico>0)
graph=grafico;
/* Calculamos tamaño resultante*/
_tw=map_info(file,graph,G_WIDTH);
_th=map_info(file,graph,G_HEIGHT);
size_x=(100*c_w)/_tw;
size_y=(100*c_h)/_th;
end
else
/*Dibujamos un canvas de color sólido*/
graph=new_map(c_w,c_h,gui_window_color);
if(grafico>0)
map_clear(0,graph,grafico);
else
map_clear(0,graph,rgb(195,195,195));
end
end
internal_size_x=size_x;
internal_size_y=size_y;
gui_carga_control(id);
internal_label=gui_label(x,y,z-1,texto,4,fnt);
loop
if(collision(gui_p_mouse))
if(!mouse.left)
internal_entered=true;
end
if(mouse.left && internal_entered)
gui_button_active=true;
else
gui_button_active=false;
end
else
gui_button_active=false;
internal_entered=false;
end
if(mouse.left && internal_entered)
size_x=internal_size_x-(internal_size_x/4);
size_y=internal_size_y-(internal_size_y/4);
elsif(!mouse.left && !internal_entered)
if(size_x!=internal_size_x)
size_x=internal_size_x;
size_y=internal_size_y;
end
elsif(!mouse.left)
if(size_x!=internal_size_x)
size_x=internal_size_x;
size_y=internal_size_y;
end
end
frame;
end
OnExit
signal(internal_label,s_kill);
end
ejemplos y capturas estaria bueno, muchas gracias!
He dejado un vídeo explicando su funcionamiento xD
muy bueno yawin! felicitaciones!
^__^ Gracias, cualquier sugerencia que tengáis la recogeré encantado. Es más, si alguien encuentra una forma más eficiente de hacer algo, que me pase el código que lo aceptaré encantado.
Pues, siempre pense que eras cosas eran muy utiles. Alla por el 2002 hice una libreria parecida, me gustaria continuarla y actualizarla, pero no tengo tanto tiempo ahora.
Hace un tiempo la vi portada a Bennu, por ahi te sirve alguna idea de alli http://forum.bennugd.org/index.php?topic=1263.msg19924#msg19924
Pues me interesa mogollón, voy a ver si entiendo cómo está programada y si soy capaz de plagiarla inspirarme con ella.
P.d.: Acabo de recordar que el gran Fede hizo un explorador de archivos en Bennu y su GUI era tochísima. boy a ver si le meto mano. http://forum.bennugd.org/index.php?topic=2026.0
Quote from: Yawin on March 04, 2015, 02:06:24 PM
Pues me interesa mogollón, voy a ver si entiendo cómo está programada y si soy capaz de plagiarla inspirarme con ella.
P.d.: Acabo de recordar que el gran Fede hizo un explorador de archivos en Bennu y su GUI era tochísima. boy a ver si le meto mano. http://forum.bennugd.org/index.php?topic=2026.0 (http://forum.bennugd.org/index.php?topic=2026.0)
Boys! Boys! Boys! (https://www.youtube.com/watch?v=Ug8WeZyTxXg)
Llamadme loco, pero me encanta esa canción y, sobre todo, esa cantante xD
Y a mi...
De toas formas me gusta la idea del gui ese, siempre me ha gustao eso de que haya una especie "estandar" Bennu