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 | |
|
631343 | 2000-02-07 | Per Hedbor | | constant cvs_version = "$Id: gbutton.pike,v 1.17 2000/02/07 04:43:10 per Exp $";
|
67bff7 | 1999-11-15 | Jonas Wallden | | constant thread_safe = 1;
#include <module.h>
inherit "module";
inherit "roxenlib";
roxen.ImageCache button_cache;
|
95b389 | 1999-11-15 | Jonas Wallden | |
#define IMAGE_SPC 5
|
67bff7 | 1999-11-15 | Jonas Wallden | | array register_module()
{
return( ({ MODULE_PARSER,
"GButton",
"Provides the <tt><gbutton>Title</gbutton></tt> "
|
2e0a35 | 1999-12-09 | Martin Nilsson | | "tag for drawing graphical buttons.",
0, 1 }) );
}
TAGDOCUMENTATION
#if manual
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 | | }
object(Image.Image)|mapping draw_button(mapping args, string text, object id)
{
Image.Image text_img, b, tmp, button;
int req_width, b_width, b_height, t_width, i_width, icn_x, txt_x;
mapping icon;
|
716975 | 2000-02-02 | Per Hedbor | | object button_font = resolve_font( args->font );
|
f6ea61 | 2000-02-07 | Per Hedbor | | Image.Image button_border;
Image.Image button_mask;
|
716975 | 2000-02-02 | Per Hedbor | |
|
f6ea61 | 2000-02-07 | Per Hedbor | | if( args->border_image )
{
mapping q = roxen.low_load_image(args->border_image, id);
if( q )
{
button_border = q->img;
if(!q->alpha)
button_mask = Image.Image( q->img->xsize(),q->img->ysize(),
255,255,255 );
else
button_mask = q->alpha;
}
}
|
e76d2c | 2000-02-03 | Per Hedbor | | if (!button_border)
{
|
f6ea61 | 2000-02-07 | Per Hedbor | | mapping q = Image._load("roxen-images/gbutton_border.xcf");
button_border = q->img;
button_mask = q->alpha;
|
5dac1c | 2000-01-10 | Martin Nilsson | | }
|
67bff7 | 1999-11-15 | Jonas Wallden | |
if (!args->dim)
|
e76d2c | 2000-02-03 | Per Hedbor | | {
|
f6ea61 | 2000-02-07 | Per Hedbor | | b = button_border->grey()->
|
5dac1c | 2000-01-10 | Martin Nilsson | | modify_by_intensity(1, 1, 1, args->bo, args->bob );
|
e76d2c | 2000-02-03 | Per Hedbor | | }
|
716975 | 2000-02-02 | Per Hedbor | | else
|
7597c8 | 1999-11-24 | Per Hedbor | | {
|
e76d2c | 2000-02-03 | Per Hedbor | | array dim_bg;
array dim_bo;
|
716975 | 2000-02-02 | Per Hedbor | |
|
e76d2c | 2000-02-03 | Per Hedbor | | array hsv = Image.Color( @args->bg )->hsv( );
hsv[-1] = min( hsv[-1]+70, 255 );
dim_bg = (array)Image.Color.hsv( @hsv );
hsv[-1] = max( hsv[-1]-140, 0 );
dim_bo = (array)Image.Color.hsv( @hsv );
b = button_border->grey()->
|
67bff7 | 1999-11-15 | Jonas Wallden | | modify_by_intensity(1, 1, 1, dim_bo, dim_bg);
}
b_width = b->xsize();
b_height = b->ysize();
|
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);
|
95b389 | 1999-11-15 | Jonas Wallden | | i_width = icon && (icon->img->xsize() + IMAGE_SPC);
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
|
3c24b6 | 2000-01-19 | Fredrik Noring | | if (sizeof(text)) {
text_img = button_font->write(text)->scale(0, b_height - IMAGE_SPC);
if (args->cnd)
text_img = text_img->scale((int) round(text_img->xsize() * 0.8),
text_img->ysize());
t_width = text_img->xsize();
}
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
req_width = t_width + b_width + i_width;
if (args->wi && (req_width < args->wi))
req_width = args->wi;
switch (lower_case(args->al)) {
case "left":
switch (lower_case(args->ica)) {
case "left":
icn_x = b_width / 2;
txt_x = icn_x + i_width;
break;
default:
case "right":
txt_x = b_width / 2;
|
95b389 | 1999-11-15 | Jonas Wallden | | icn_x = req_width - b_width / 2 - i_width + IMAGE_SPC;
|
67bff7 | 1999-11-15 | Jonas Wallden | | break;
}
break;
default:
case "center":
case "middle":
switch (lower_case(args->ica)) {
case "left":
icn_x = b_width / 2;
txt_x = icn_x + i_width +
(req_width - icn_x - i_width - b_width / 2 - t_width) / 2;
break;
default:
case "center":
case "center_before":
icn_x = (req_width - i_width - t_width) / 2;
txt_x = icn_x + i_width;
break;
case "center_after":
txt_x = (req_width - i_width - t_width) / 2;
|
95b389 | 1999-11-15 | Jonas Wallden | | icn_x = txt_x + t_width + IMAGE_SPC;
|
67bff7 | 1999-11-15 | Jonas Wallden | | break;
case "right":
|
95b389 | 1999-11-15 | Jonas Wallden | | icn_x = req_width - b_width / 2 - i_width + IMAGE_SPC;
txt_x = b_width / 2 + (icn_x - IMAGE_SPC - b_width / 2 - t_width) / 2;
|
67bff7 | 1999-11-15 | Jonas Wallden | | break;
}
break;
case "right":
switch (lower_case(args->ica)) {
default:
case "left":
icn_x = b_width / 2;
txt_x = req_width - b_width / 2 - t_width;
break;
case "right":
|
95b389 | 1999-11-15 | Jonas Wallden | | icn_x = req_width - b_width / 2 - i_width + IMAGE_SPC;
txt_x = icn_x - IMAGE_SPC - t_width;
|
67bff7 | 1999-11-15 | Jonas Wallden | | break;
}
break;
}
|
f6ea61 | 2000-02-07 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | button = Image.Image(req_width, b_height, args->bg);
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
tmp = b->copy(0, 0, b_width / 2 - 1, b_height - 1);
button->paste_mask(tmp, button_mask->copy(0, 0,
b_width / 2 - 1, b_height - 1));
tmp = b->copy(b_width / 2, 0, b_width - 1, b_height - 1);
|
f6ea61 | 2000-02-07 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | button->paste_mask(tmp, button_mask->copy(b_width / 2, 0,
b_width - 1, b_height - 1),
req_width - b_width / 2, 0);
|
716975 | 2000-02-02 | Per Hedbor | |
|
f6ea61 | 2000-02-07 | Per Hedbor | | tmp = button_mask->copy(0, 0, b_width / 2 - 1, b_height - 1)
->invert()->threshold(250);
button->paste_alpha_color(tmp, args->pagebg);
tmp = button_mask->copy(b_width / 2, 0, b_width - 1, b_height - 1)
->invert()->threshold(250);
button->paste_alpha_color(tmp, args->pagebg,
button->xsize()-tmp->xsize(), 0);
|
67bff7 | 1999-11-15 | Jonas Wallden | |
tmp = button->copy(b_width / 2 - 1, 0, b_width / 2 - 1, b_height - 1);
for (int offset = b_width / 2; offset <= req_width - b_width / 2; offset++)
button->paste(tmp, offset, 0);
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | |
if (icon) {
int icn_y = (b_height - 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}));
|
67bff7 | 1999-11-15 | Jonas Wallden | | if (args->dim)
icon->alpha *= 0.3;
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;
|
3c24b6 | 2000-01-19 | Fredrik Noring | | if(text_img)
button->paste_alpha_color(text_img, args->txt, txt_x, 2);
|
716975 | 2000-02-02 | Per Hedbor | |
|
67bff7 | 1999-11-15 | Jonas Wallden | | return button;
}
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,
|
67bff7 | 1999-11-15 | Jonas Wallden | | ]);
|
5dac1c | 2000-01-10 | Martin Nilsson | |
|
e76d2c | 2000-02-03 | Per Hedbor | | array hsv = Image.Color( @new_args->bg )->hsv( );
hsv[-1] = min( hsv[-1]+70, 255 );
new_args->bob = (array)Image.Color.hsv( @hsv );
hsv[-1] = max( hsv[-1]-140, 0 );
new_args->bo = (array)Image.Color.hsv( @hsv );
|
5dac1c | 2000-01-10 | Martin Nilsson | | if(args->bordercolor)
new_args->bo=parse_color(args->bordercolor);
if(args->borderbottom)
new_args->bob=parse_color(args->borderbottom);
|
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);
}
|