--- loncom/homework/drawimage.pm 2024/04/05 22:44:19 1.13 +++ loncom/homework/drawimage.pm 2024/04/09 20:01:31 1.14 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # programatic image drawing # -# $Id: drawimage.pm,v 1.13 2024/04/05 22:44:19 raeburn Exp $ +# $Id: drawimage.pm,v 1.14 2024/04/09 20:01:31 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -31,6 +31,7 @@ use strict; use Apache::loncommon; use Apache::lonnet; use Apache::lonxml; +use Apache::edit; use lib '/home/httpd/lib/perl/'; use Time::HiRes qw(gettimeofday); use LONCAPA; @@ -46,12 +47,28 @@ BEGIN { sub start_drawimage { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; &Apache::lonxml::register('Apache::drawimage',('text','line','rectangle','arc','fill','polygon','image')); + push(@Apache::lonxml::namespace,'drawimage'); + my $result; if ($target eq 'web' || $target eq 'tex') { my $new_id=&Apache::loncommon::get_cgi_id(); if ($cgi_id) { push(@cgi_ids,$cgi_id); } else { undef(%args); } $cgi_id=$new_id; + } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('Background color:','bgcolor' ,$token,8). + &Apache::edit::text_arg('Width(pixel):' ,'width' ,$token,6). + &Apache::edit::text_arg('Height(pixel):' ,'height' ,$token,6). + &Apache::edit::text_arg('TeXWidth(mm):' ,'texwidth',$token,6). + &Apache::edit::end_row().&Apache::edit::start_spanning_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'bgcolor','width', + 'height','texwidth'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } } - return ''; + return $result; } sub end_drawimage { @@ -100,12 +117,12 @@ sub end_drawimage { undef($cgi_id); } } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { + $result.=&Apache::edit::end_table; } - - &Apache::lonxml::register('Apache::drawimage', - ('text','line','rectangle','arc','fill', - 'polygon')); + pop(@Apache::lonxml::namespace); + &Apache::lonxml::deregister('Apache::drawimage', + ('text','line','rectangle','arc','fill', + 'polygon')); return $result; } @@ -114,6 +131,31 @@ sub start_text { my $result; if ($target eq 'web' || $target eq 'tex') { &Apache::lonxml::startredirection(); + } elsif ($target eq 'edit') { + $result = + &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('x:','x',$token,6). + &Apache::edit::text_arg('y:','y',$token,6). + &Apache::edit::text_arg('font:','font',$token,12). + &Apache::edit::text_arg('color:','color',$token,8). + &Apache::edit::select_arg('direction:','direction', + ['vertical','horizontal'],$token). + &Apache::edit::text_arg('rotation:','rotation',$token,6); + my $text=&Apache::lonxml::get_all_text('/text',$parser,$style); + $result .= + &Apache::edit::editfield($token->[1],$text,'Text',60,2). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'x','y', + 'font','color', + 'direction','rotation'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } else { + $result = $token->[4]; + } + $result .= &Apache::edit::modifiedfield('/text',$parser); } return $result; } @@ -133,6 +175,8 @@ sub end_text { $args{"cgi.$cgi_id.OBJTYPE"}.='LABEL:'; my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++; $args{"cgi.$cgi_id.OBJ$i"}=join(':',($x,$y,$text,$font,$color,$direction,$rotation)); + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } return $result; } @@ -150,6 +194,23 @@ sub start_line { my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++; $args{"cgi.$cgi_id.OBJ$i"}=join(':',($x1,$y1,$x2,$y2,$color,$thickness)); $args{"cgi.$cgi_id.OBJTYPE"}.='LINE:'; + } elsif ($target eq 'edit') { + $result .= + &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('x1:','x1' ,$token,6). + &Apache::edit::text_arg('y1:','y1' ,$token,6). + &Apache::edit::text_arg('x2:','x2' ,$token,6). + &Apache::edit::text_arg('y2:','y2' ,$token,6). + &Apache::edit::text_arg('color:','color',$token,8). + &Apache::edit::text_arg('thickness:','thickness',$token,6). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'x1','y1', + 'x2','y2','color','thickness'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } } return $result; } @@ -157,6 +218,9 @@ sub start_line { sub end_line { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } return $result; } @@ -177,6 +241,26 @@ sub start_rectangle { $args{"cgi.$cgi_id.OBJ$i"}= join(':',($x1,$y1,$x2,$y2,$color,$thickness,$filled)); $args{"cgi.$cgi_id.OBJTYPE"}.='RECTANGLE:'; + } elsif ($target eq 'edit') { + $result .= + &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('x1:','x1' ,$token,6). + &Apache::edit::text_arg('y1:','y1' ,$token,6). + &Apache::edit::text_arg('x2:','x2' ,$token,6). + &Apache::edit::text_arg('y2:','y2' ,$token,6). + &Apache::edit::text_arg('color:','color',$token,8). + &Apache::edit::text_arg('thickness:','thickness',$token,6). + &Apache::edit::select_arg('filled:','filled', + ['no','yes'],$token). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'x1','y1', + 'x2','y2','color','thickness', + 'filled'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } } return $result; } @@ -184,6 +268,9 @@ sub start_rectangle { sub end_rectangle { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } return $result; } @@ -205,6 +292,30 @@ sub start_arc { join(':',($x,$y,$width,$height,$start,$end,$color,$thickness, $filled)); $args{"cgi.$cgi_id.OBJTYPE"}.='ARC:'; + } elsif ($target eq 'edit') { + $result .= + &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('x:','x',$token,6). + &Apache::edit::text_arg('y:','y',$token,6). + &Apache::edit::text_arg('width:','width',$token,6). + &Apache::edit::text_arg('height:','height',$token,6). + &Apache::edit::text_arg('start:','start',$token,6). + &Apache::edit::text_arg('end:','end',$token,6). + &Apache::edit::text_arg('color:','color',$token,8). + &Apache::edit::text_arg('thickness:','thickness',$token,6). + &Apache::edit::select_arg('filled:','filled', + ['no','yes'],$token). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'x','y', + 'width','height', + 'start','end', + 'color','thickness', + 'filled'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } } return $result; } @@ -212,6 +323,9 @@ sub start_arc { sub end_arc { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } return $result; } @@ -225,6 +339,20 @@ sub start_fill { my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++; $args{"cgi.$cgi_id.OBJ$i"}=join(':',($x,$y,$color)); $args{"cgi.$cgi_id.OBJTYPE"}.='FILL:'; + } elsif ($target eq 'edit') { + $result .= + &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('x:','x' ,$token,6). + &Apache::edit::text_arg('y:','y' ,$token,6). + &Apache::edit::text_arg('color:','color',$token,8). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'x','y', + 'color'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } } return $result; } @@ -232,6 +360,9 @@ sub start_fill { sub end_fill { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } return $result; } @@ -239,9 +370,27 @@ my @polygon; sub start_polygon { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + push(@Apache::lonxml::namespace,'polygon'); &Apache::lonxml::register('Apache::drawimage',('point')); if ($target eq 'web' || $target eq 'tex') { undef(@polygon); + } elsif ($target eq 'edit') { + $result = + &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('color:','color',$token,8). + &Apache::edit::select_arg('Open:','open', + ['no','yes'],$token). + &Apache::edit::select_arg('Filled:','filled', + ['no','yes'],$token). + &Apache::edit::text_arg('thickness:','thickness',$token,6). + &Apache::edit::end_row(). + &Apache::edit::start_spanning_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'open','filled'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } } return $result; } @@ -259,7 +408,10 @@ sub end_polygon { $args{"cgi.$cgi_id.OBJTYPE"}.='POLYGON:'; $args{"cgi.$cgi_id.OBJ$i"}=join(':',($color,$thickness,$open,$filled)); $args{"cgi.$cgi_id.OBJEXTRA$i"}=join('-',@polygon); + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } + pop(@Apache::lonxml::namespace); &Apache::lonxml::deregister('Apache::drawimage',('point')); return $result; } @@ -271,6 +423,18 @@ sub start_point { my $x = &Apache::lonxml::get_param('x',$parstack,$safeeval); my $y = &Apache::lonxml::get_param('y',$parstack,$safeeval); push (@polygon,"($x,$y)"); + } elsif ($target eq 'edit') { + $result.= + &Apache::edit::tag_start($target,$token). + &Apache::edit::text_arg('x:','x' ,$token,6). + &Apache::edit::text_arg('y:','y' ,$token,6). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'x','y'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } } return $result; } @@ -278,6 +442,9 @@ sub start_point { sub end_point { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; + if ($target eq 'edit') { + $result=&Apache::edit::end_table(); + } return $result; } @@ -286,6 +453,36 @@ sub start_image { my $result; if ($target eq 'web' || $target eq 'tex') { &Apache::lonxml::startredirection(); + } elsif ($target eq 'edit') { + my $bgimg=&Apache::lonxml::get_all_text('/image',$parser,$style); + $Apache::edit::bgimgsrc=$bgimg; + $Apache::edit::bgimgsrcdepth=$Apache::lonxml::curdepth; + my $only = join(',',&Apache::loncommon::filecategorytypes('Pictures')); + $result=&Apache::edit::tag_start($target,$token,'Background Image'). + &Apache::edit::editline($token->[1],$bgimg,'Image Source File',40). + &Apache::edit::browse_or_search(undef,'textnode',undef,$only,undef,1). + '
'. + &Apache::edit::text_arg('x:','x',$token,6). + &Apache::edit::text_arg('y:','y',$token,6). + &Apache::edit::text_arg('clipx:','clipx',$token,6). + &Apache::edit::text_arg('clipy:','clipy',$token,6). + &Apache::edit::text_arg('Clip width(pixel):','clipwidth',$token,6). + &Apache::edit::text_arg('Clip height(pixel):','clipheight',$token,6). + &Apache::edit::text_arg('Scaled width:','scaledwidth',$token,6). + &Apache::edit::text_arg('Scaled height:','scaledheight',$token,6). + &Apache::edit::text_arg('Transparent:','transparent',$token,6). + &Apache::edit::end_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'x','y', + 'clipx','clipy','clipwidth','clipheight', + 'scaledwidth','scaledheight','transparent'); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + } else { + $result = $token->[4]; + } + $result .= &Apache::edit::modifiedfield('/image',$parser); } return $result; } @@ -315,6 +512,8 @@ sub end_image { $args{"cgi.$cgi_id.OBJ$i"} = join(':',($x,$y,&escape($bgimg),$transparent, $clipx,$clipy,$scaledwidth,$scaledheight,$clipwidth,$clipheight)); + } elsif ($target eq 'edit') { + $result=&Apache::edit::end_table(); } return $result; }