67bff7 | 1999-11-15 | Jonas Wallden | |
|
5dac1c | 2000-01-10 | Martin Nilsson | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
|
0b9194 | 1999-11-16 | Jonas Wallden | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
|
1ac32d | 2000-02-10 | Jonas Wallden | | constant cvs_version = "$Id: gbutton.pike,v 1.27 2000/02/10 10:57:50 jonasw Exp $";
|
67bff7 | 1999-11-15 | Jonas Wallden | | constant thread_safe = 1;
#include <module.h>
inherit "module";
inherit "roxenlib";
roxen.ImageCache button_cache;
|
c043f8 | 2000-02-10 | Martin Nilsson | | constant module_type = MODULE_PARSER;
constant module_name = "GButton";
constant module_doc = "Provides the <tt><gbutton>Title</gbutton></tt> "
"tag for drawing graphical buttons.";
|
2e0a35 | 1999-12-09 | Martin Nilsson | |
TAGDOCUMENTATION
|
542262 | 2000-02-08 | Martin Nilsson | | #ifdef manual
|
2e0a35 | 1999-12-09 | Martin Nilsson | | constant tagdoc=(["gbutton":"","gbutton-url":""]);
|
67bff7 | 1999-11-15 | Jonas Wallden | | "<table border=0>"
"<tr><td><b>bgcolor</b></td><td>Background color inside and "
"outside button</td></tr>"
"<tr><td><b>bordercolor</b></td><td>Button border color</td></tr>"
"<tr><td><b>textcolor</b></td><td>Button text color</td></tr>"
"<tr><td><b>href</b></td><td>Button URL</td></tr>"
"<tr><td><b>alt</b></td><td>Alternative button alt text</td></tr>"
"<tr><td><b>border</b></td><td>Image border</td></tr>"
|
0b9194 | 1999-11-16 | Jonas Wallden | | "<tr><td><b>state</b></td><td>Set to <tt>enabled</tt> or "
"<tt>disabled</tt> to select button state</td></tr>"
|
67bff7 | 1999-11-15 | Jonas Wallden | |
|
0b9194 | 1999-11-16 | Jonas Wallden | | "<tr><td><b>textstyle</b></td><td>Set to <tt>normal</tt> or "
"<tt>condensed</tt> to alter text style.</td></tr>"
|
67bff7 | 1999-11-15 | Jonas Wallden | |
"<tr><td><b>icon_src</b></td><td>Icon reference</td></tr>"
"<tr><td><b>icon_data</b></td><td>Inline icon data</td></tr>"
"<tr><td><b>align</b></td><td>Text alignment: "
"<tt>left|center|right</tt></td></tr>"
"<tr><td><b>align_icon</b></td><td>Icon alignment: "
"<tt>left|center_before|center_after|right</tt></td></tr>"
"</table><p>"
"There are some alignment restrictions: when text alignment is "
"either <tt>left</tt> or <tt>right</tt>, icons must also be "
|
2e0a35 | 1999-12-09 | Martin Nilsson | | "aligned <tt>left</tt> or <tt>right</tt>."
*/
#endif
|
67bff7 | 1999-11-15 | Jonas Wallden | |
void start()
{
button_cache = roxen.ImageCache("gbutton", draw_button);
}
mapping query_tag_callers()
{
return ([ ]);
}
mapping query_container_callers()
{
|
3014c2 | 1999-11-15 | Per Hedbor | | return ([ "gbutton" : tag_button, "gbutton-url" : tag_button ]);
|
67bff7 | 1999-11-15 | Jonas Wallden | | }
|
fde908 | 2000-02-08 | Per Hedbor | | Image.Layer layer_slice( Image.Layer l, int from, int to )
{
return Image.Layer( ([
"image":l->image()->copy( from,0, to-1, l->ysize()-1 ),
"alpha":l->alpha()->copy( from,0, to-1, l->ysize()-1 ),
]) );
}
Image.Layer stretch_layer( Image.Layer o, int x1, int x2, int w )
{
Image.Layer l, m, r;
int leftovers = w - (x1 + (o->xsize()-x2) );
object oo = o;
l = layer_slice( o, 0, x1 );
|
3ef645 | 2000-02-08 | Jonas Wallden | | m = layer_slice( o, x1+1, x2-1 );
|
fde908 | 2000-02-08 | Per Hedbor | | r = layer_slice( o, x2, o->xsize() );
m->set_image( m->image()->scale( leftovers, l->ysize() ),
m->alpha()->scale( leftovers, l->ysize() ));
l->set_offset( 0,0 );
m->set_offset( x1,0 );
r->set_offset( w-r->xsize(),0 );
o = Image.lay( ({ l, m, r }) );
return o;
}
|
67bff7 | 1999-11-15 | Jonas Wallden | |
object(Image.Image)|mapping draw_button(mapping args, string text, object id)
{
|
fde908 | 2000-02-08 | Per Hedbor | | Image.Image text_img;
|
67bff7 | 1999-11-15 | Jonas Wallden | | mapping icon;
|
716975 | 2000-02-02 | Per Hedbor | | object button_font = resolve_font( args->font );
|
fde908 | 2000-02-08 | Per Hedbor | |
Image.Layer background;
Image.Layer frame;
Image.Layer mask;
int left, right, top, bottom;
int req_width;
|
716975 | 2000-02-02 | Per Hedbor | |
|
3d3a47 | 2000-02-08 | Per Hedbor | | mapping ll = ([]);
|
f6ea61 | 2000-02-07 | Per Hedbor | | if( args->border_image )
{
|
fde908 | 2000-02-08 | Per Hedbor | | array layers = roxen.load_layers(args->border_image, id);
|
01d0db | 2000-02-09 | Martin Nilsson | | if(layers)
foreach( layers, object l )
|
fde908 | 2000-02-08 | Per Hedbor | | {
|
01d0db | 2000-02-09 | Martin Nilsson | | ll[l->get_misc_value( "name" )] = l;
switch( lower_case((l->get_misc_value( "name" )/" ")[0]) )
{
case "background": background = l; break;
case "frame": frame = l; break;
case "mask": mask = l; break;
}
|
fde908 | 2000-02-08 | Per Hedbor | | }
|
f6ea61 | 2000-02-07 | Per Hedbor | | }
|
fde908 | 2000-02-08 | Per Hedbor | |
|
f6ea61 | 2000-02-07 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | if ( !frame )
|
e76d2c | 2000-02-03 | Per Hedbor | | {
|
fde908 | 2000-02-08 | Per Hedbor | | array layers = roxen.load_layers("roxen-images/gbutton.xcf", id);
foreach( layers, object l )
{
|
3d3a47 | 2000-02-08 | Per Hedbor | | ll[l->get_misc_value( "name" )] = l;
|
fde908 | 2000-02-08 | Per Hedbor | | switch( lower_case((l->get_misc_value( "name" )/" ")[0]) )
{
case "background": background = l; break;
case "frame": frame = l; break;
case "mask": mask = l; break;
}
}
|
5dac1c | 2000-01-10 | Martin Nilsson | | }
|
716975 | 2000-02-02 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | if( !mask )
mask = frame;
|
e76d2c | 2000-02-03 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | array x = ({});
array y = ({});
foreach( frame->get_misc_value( "image_guides" ), object g )
if( g->vertical )
x += ({ g->pos });
else
y += ({ g->pos });
|
e76d2c | 2000-02-03 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | sort( y ); sort( x );
if(sizeof( x ) < 2)
x = ({ 5, frame->xsize()-5 });
if(sizeof( y ) < 2)
y = ({ 2, frame->ysize()-2 });
|
e76d2c | 2000-02-03 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | left = x[0]; right = x[-1]; top = y[0]; bottom = y[-1];
right = frame->xsize()-right;
int text_height = bottom - top;
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
if (args->icn)
icon = roxen.low_load_image(args->icn, id);
else if (args->icd)
icon = roxen.low_decode_image(args->icd);
|
fde908 | 2000-02-08 | Per Hedbor | |
int i_width = icon && icon->img->xsize();
|
3ef645 | 2000-02-08 | Jonas Wallden | | int i_spc = i_width ? 5 : 0;
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
|
fde908 | 2000-02-08 | Per Hedbor | | if (sizeof(text))
{
text_img = button_font->write(text)->scale(0, text_height );
|
3c24b6 | 2000-01-19 | Fredrik Noring | | if (args->cnd)
text_img = text_img->scale((int) round(text_img->xsize() * 0.8),
text_img->ysize());
}
|
716975 | 2000-02-02 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | int t_width = text_img && text_img->xsize();
|
67bff7 | 1999-11-15 | Jonas Wallden | |
|
3ef645 | 2000-02-08 | Jonas Wallden | | req_width = text_img->xsize() + left + right + i_width + i_spc;
|
944d9e | 2000-02-08 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | if (args->wi && (req_width < args->wi))
req_width = args->wi;
|
fde908 | 2000-02-08 | Per Hedbor | |
int icn_x, txt_x;
|
944d9e | 2000-02-08 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | switch (lower_case(args->al))
{
|
67bff7 | 1999-11-15 | Jonas Wallden | | case "left":
|
fde908 | 2000-02-08 | Per Hedbor | | switch (lower_case(args->ica))
{
case "left":
icn_x = left;
|
3ef645 | 2000-02-08 | Jonas Wallden | | txt_x = icn_x + i_width + i_spc;
|
fde908 | 2000-02-08 | Per Hedbor | | break;
default:
case "right":
txt_x = left;
icn_x = req_width - right - i_width;
break;
|
67bff7 | 1999-11-15 | Jonas Wallden | | }
break;
default:
case "center":
case "middle":
|
fde908 | 2000-02-08 | Per Hedbor | | switch (lower_case(args->ica))
{
case "left":
icn_x = left;
|
3ef645 | 2000-02-08 | Jonas Wallden | | txt_x = (req_width - right - left - i_width - i_spc - t_width) / 2;
txt_x += icn_x + i_width + i_spc;
|
fde908 | 2000-02-08 | Per Hedbor | | break;
default:
case "center":
case "center_before":
|
3ef645 | 2000-02-08 | Jonas Wallden | | icn_x = (req_width - i_width - i_spc - t_width) / 2;
txt_x = icn_x + i_width + i_spc;
|
fde908 | 2000-02-08 | Per Hedbor | | break;
case "center_after":
|
3ef645 | 2000-02-08 | Jonas Wallden | | txt_x = (req_width - i_width - i_spc - t_width) / 2;
icn_x = txt_x + t_width + i_spc;
|
fde908 | 2000-02-08 | Per Hedbor | | break;
case "right":
icn_x = req_width - right - i_width;
|
3ef645 | 2000-02-08 | Jonas Wallden | | txt_x = left + (icn_x - i_spc - t_width) / 2;
|
fde908 | 2000-02-08 | Per Hedbor | | break;
|
67bff7 | 1999-11-15 | Jonas Wallden | | }
break;
case "right":
|
fde908 | 2000-02-08 | Per Hedbor | | switch (lower_case(args->ica))
{
default:
case "left":
icn_x = left;
txt_x = req_width - right - t_width;
break;
case "right":
icn_x = req_width - right - i_width;
|
3ef645 | 2000-02-08 | Jonas Wallden | | txt_x = icn_x - i_spc - t_width;
|
fde908 | 2000-02-08 | Per Hedbor | | break;
|
67bff7 | 1999-11-15 | Jonas Wallden | | }
break;
}
|
f6ea61 | 2000-02-07 | Per Hedbor | |
|
5321c0 | 2000-02-08 | Per Hedbor | | if( args->extra_frame_layers )
{
array l = ({ frame });
foreach( args->extra_frame_layers/",", string q )
l += ({ ll[q] });
l-=({ 0 });
if( sizeof( l ) )
mask = Image.lay( l );
}
|
f6ea61 | 2000-02-07 | Per Hedbor | |
|
5321c0 | 2000-02-08 | Per Hedbor | | if( args->extra_mask_layers )
{
array l = ({ });
if( mask )
l = ({ mask });
foreach( args->extra_mask_layers/",", string q )
l += ({ ll[q] });
l-=({ 0 });
if( sizeof( l ) )
mask = Image.lay( l );
}
if( args->extra_background_layers )
|
3d3a47 | 2000-02-08 | Per Hedbor | | {
array l = ({ });
if( background )
l = ({ background });
|
5321c0 | 2000-02-08 | Per Hedbor | | foreach( args->extra_background_layers/",", string q )
|
3d3a47 | 2000-02-08 | Per Hedbor | | l += ({ ll[q] });
l-=({ 0 });
|
5321c0 | 2000-02-08 | Per Hedbor | | if( sizeof( l ) )
background = Image.lay( l );
|
3d3a47 | 2000-02-08 | Per Hedbor | | }
|
5321c0 | 2000-02-08 | Per Hedbor | | right = frame->xsize()-right;
frame = stretch_layer( frame, left, right, req_width );
if (mask != frame)
mask = stretch_layer( mask, left, right, req_width );
|
fde908 | 2000-02-08 | Per Hedbor | | if( background )
{
if( !background->alpha() )
background->set_image( background->image(),
Image.Image( background->xsize(),
background->ysize(),
({255,255,255}) ) );
if( args->dim )
background->set_image(background->image(),
background->alpha() * 0.3 );
background = stretch_layer( background, left, right, req_width );
}
|
f6ea61 | 2000-02-07 | Per Hedbor | |
|
fde908 | 2000-02-08 | Per Hedbor | | Image.Image button = Image.Image(req_width, frame->ysize(), args->bg);
button = button->rgb_to_hsv();
|
1ac32d | 2000-02-10 | Jonas Wallden | | if( args->dim ) {
int bg_value = Image.Color(@args->bg)->hsv()[2];
int dim_high, dim_low;
if (bg_value < 128) {
dim_low = max(bg_value - 64, 0);
dim_high = dim_low + 128;
} else {
dim_high = min(bg_value + 64, 255);
dim_low = dim_high - 128;
}
frame->set_image( frame->image()->
modify_by_intensity( 1, 1, 1,
({ dim_low, dim_low, dim_low }),
({ dim_high, dim_high, dim_high })),
|
fde908 | 2000-02-08 | Per Hedbor | | frame->alpha());
|
1ac32d | 2000-02-10 | Jonas Wallden | | }
|
fde908 | 2000-02-08 | Per Hedbor | | object h = button*({255,0,0});
object s = button*({0,255,0});
object v = button*({0,0,255});
v->paste_mask( frame->image(), frame->alpha() );
button = Image.lay( ({
Image.Layer( h )->set_mode( "red" ),
Image.Layer( s )->set_mode( "green" ),
Image.Layer( v )->set_mode( "blue" ),
}) )->image();
button = button->hsv_to_rgb();
if( background )
button->paste_mask( background->image(), background->alpha() );
if( !equal( args->pagebg, args->bg ) )
button->paste_alpha_color( mask->alpha()->invert()->threshold( 200 ),
args->pagebg );
if (icon)
{
int icn_y = (button->ysize() - icon->img->ysize()) / 2;
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | if (!icon->alpha)
|
7597c8 | 1999-11-24 | Per Hedbor | | icon->alpha = icon->img->clone()->clear(({255,255,255}));
|
fde908 | 2000-02-08 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | if (args->dim)
icon->alpha *= 0.3;
|
fde908 | 2000-02-08 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | button->paste_mask(icon->img, icon->alpha, icn_x, icn_y);
}
|
f6ea61 | 2000-02-07 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
if (args->dim)
for (int i = 0; i < 3; i++)
args->txt[i] = (args->txt[i] + args->bg[i]) / 2;
|
fde908 | 2000-02-08 | Per Hedbor | |
|
3c24b6 | 2000-01-19 | Fredrik Noring | | if(text_img)
|
fde908 | 2000-02-08 | Per Hedbor | | button->paste_alpha_color(text_img, args->txt, txt_x, top);
|
716975 | 2000-02-02 | Per Hedbor | |
|
5321c0 | 2000-02-08 | Per Hedbor | | if( args->extra_layers )
{
array l = ({ });
foreach( args->extra_layers/",", string q )
l += ({ ll[q] });
l-=({ 0 });
if( sizeof( l ) )
{
object q = Image.lay( l );
q = stretch_layer( q, left, right, req_width );
button->paste_mask( q->image(), q->alpha() );
}
}
|
fde908 | 2000-02-08 | Per Hedbor | | return ([
"img":button,
"alpha":mask->alpha()->threshold( 40 ),
]);
|
67bff7 | 1999-11-15 | Jonas Wallden | | }
mapping find_internal(string f, RequestID id)
{
return button_cache->http_file_answer(f, id);
}
string tag_button(string tag, mapping args, string contents, RequestID id)
{
|
f6ea61 | 2000-02-07 | Per Hedbor | | string fi = (args["frame-image"]||id->misc->defines["gbutton-frame-image"]);
if( fi )
fi = fix_relative( fi, id );
|
67bff7 | 1999-11-15 | Jonas Wallden | | mapping new_args = ([
|
f6ea61 | 2000-02-07 | Per Hedbor | | "pagebg" :parse_color(id->misc->defines->theme_bgcolor ||
id->misc->defines->bgcolor ||
args->bgcolor ||
"#eeeeee"),
"bg" : parse_color(args->bgcolor ||
id->misc->defines->theme_bgcolor ||
id->misc->defines->bgcolor ||
"#eeeeee"),
|
5dac1c | 2000-01-10 | Martin Nilsson | | "txt" : parse_color(args->textcolor || id->misc->defines->theme_bgcolor ||
id->misc->defines->fgcolor || "#000000"),
|
0b9194 | 1999-11-16 | Jonas Wallden | | "cnd" : args->condensed ||
(lower_case(args->textstyle || "") == "condensed"),
|
67bff7 | 1999-11-15 | Jonas Wallden | | "wi" : (int) args->width,
"al" : args->align || "left",
|
0b9194 | 1999-11-16 | Jonas Wallden | | "dim" : args->dim ||
(< "dim", "disabled" >)[lower_case(args->state || "")],
|
67bff7 | 1999-11-15 | Jonas Wallden | | "icn" : args->icon_src && fix_relative(args->icon_src, id),
"icd" : args->icon_data,
|
716975 | 2000-02-02 | Per Hedbor | | "ica" : args->align_icon || "left",
|
f6ea61 | 2000-02-07 | Per Hedbor | | "font": (args->font||id->misc->defines->font||
roxen->query("default_font")),
"border_image":fi,
|
3d3a47 | 2000-02-08 | Per Hedbor | | "extra_layers":args["extra-layers"],
|
5321c0 | 2000-02-08 | Per Hedbor | | "extra_background_layers":args["extra-background-layers"],
"extra_mask_layers":args["extra-mask-layers"],
"extra_frame_layers":args["extra-frame-layers"],
|
67bff7 | 1999-11-15 | Jonas Wallden | | ]);
|
5dac1c | 2000-01-10 | Martin Nilsson | |
|
95b389 | 1999-11-15 | Jonas Wallden | | new_args->quant = args->quant || 128;
|
67bff7 | 1999-11-15 | Jonas Wallden | | foreach(glob("*-*", indices(args)), string n)
new_args[n] = args[n];
|
95b389 | 1999-11-15 | Jonas Wallden | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | string img_src =
query_internal_location() +
button_cache->store( ({ new_args, contents }), id);
|
3014c2 | 1999-11-15 | Per Hedbor | | if( tag == "gbutton-url" )
return img_src;
|
67bff7 | 1999-11-15 | Jonas Wallden | | mapping img_attrs = ([ "src" : img_src,
"alt" : args->alt || contents,
|
95b389 | 1999-11-15 | Jonas Wallden | | "border" : args->border,
"hspace" : args->hspace,
"vspace" : args->vspace ]);
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | if (mapping size = button_cache->metadata(new_args, id, 1)) {
img_attrs->width = size->xsize;
img_attrs->height = size->ysize;
}
|
5dac1c | 2000-01-10 | Martin Nilsson | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
|
da94fd | 1999-11-16 | Jonas Wallden | | if (args->href && !new_args->dim) {
mapping a_attrs = ([ "href" : args->href ]);
if (args->target)
a_attrs->target = args->target;
return make_container("a", a_attrs, make_tag("img", img_attrs));
} else
|
67bff7 | 1999-11-15 | Jonas Wallden | | return make_tag("img", img_attrs);
}
|