bdfedit

来自「Very very small GUI. Usefull for small s」· 代码 · 共 2,178 行 · 第 1/5 页

TXT
2,178
字号
  set x [expr $FLEFT+($num%32)*$WIDTH]  set y [expr $FTOP+(int($num/32))*$HEIGHT]  if [info exists chardata($num)] {    showchardata .fc $x $y $chardata($num) "NUM$num"  } else {    .fc delete NUM$num    .fc create rectangle $x $y [expr $x+$WIDTH-1] [expr $y+$HEIGHT-1] \	    -fill skyblue -outline "" -tags NUM$num  }}proc showholdchar {num} {  global holddata WIDTH HEIGHT HTOP HLEFT  set x [expr $HLEFT+$num*$WIDTH]  set y $HTOP  if [info exists holddata($num)] {    showchardata .fc $x $y $holddata($num) "HOLD$num"  } else {    .fc delete HOLD$num    .fc create rectangle $x $y [expr $x+$WIDTH-1] [expr $y+$HEIGHT-1] \	    -fill pink -outline "" -tags HOLD$num  }}proc showfont {} {  global currchar chardata fontinfo WIDTH HEIGHT FTOP FLEFT FRIGHT FBOTTOM  .fc delete whichchar  .fc delete draghilite  for {set i 0} {$i<256} {incr i} {    showfontchar $i    update  }  for {set i 0} {$i<32} {incr i} {    showholdchar $i    update  }  set x1 [expr ($currchar%32)*$WIDTH-3+$FLEFT]  set y1 [expr ($currchar/32)*$HEIGHT-3+$FTOP]  .fc create rectangle $x1 $y1 [expr $x1+$WIDTH+6] [expr $y1+$HEIGHT+6] -tags whichchar -outline red  .fc create rectangle -5 -5 -5 -5 -tags draghilite -outline green}set WIDTH 12set HEIGHT 24proc setchar {charnum} {  global WIDTH HEIGHT FBOTTOM FLEFT FTOP FRIGHT  global chardata currchar  if [info exists chardata($currchar)] {    if [checkhold $chardata(work) $chardata($currchar)] {      hold work    }  }  set currchar $charnum  if ![info exists chardata($currchar)] {    set chardata(work) [blankchar $WIDTH $HEIGHT]  } else {    set chardata(work) $chardata($currchar)  }  if [info exists chardata(dwidth,$currchar)] {    #set chardata(dwidth,$currchar) $chardata(dwidth,$currchar)    set chardata(dwidth,work) $chardata(dwidth,$currchar)  } else {    #set chardata(dwidth,$currchar) $WIDTH    set chardata(dwidth,work) $WIDTH  }  setgrid chardata work  set x1 [expr ($currchar%32)*$WIDTH-3+$FLEFT]  set y1 [expr ($currchar/32)*$HEIGHT-3+$FTOP]  .fc coords whichchar $x1 $y1 [expr $x1+$WIDTH+6] [expr $y1+$HEIGHT+6]  .fc raise whichchar}proc selectleft {} {  global currchar  if ($currchar) {    setchar [expr $currchar-1]  }}proc selectright {} {  global currchar  if ($currchar<255) {    setchar [expr $currchar+1]  }}proc selectup {} {  global currchar  if ($currchar>=32) {    setchar [expr $currchar-32]  }}proc selectdown {} {  global currchar  if ($currchar<=223) {    setchar [expr $currchar+32]  }}proc nukechar {x y} {  global WIDTH HEIGHT FBOTTOM FLEFT FTOP FRIGHT HLEFT HTOP  global chardata currchar holddata  set fx [expr ($x-$FLEFT)/($WIDTH)]  set fy [expr ($y-$FTOP)/($HEIGHT)]  set hx [expr ($x-$HLEFT)/($WIDTH)]  set hy [expr ($y-$HTOP)/($HEIGHT)]  if {$fx>=0 && $fx<32 && $fy>=0 && $fy<8} {    set num [expr $fx+$fy*32]    if [info exists chardata($num)] {      hold $num      unset chardata($num)      unset chardata(dwidth,$num)      .fc delete NUM$num      set x [expr $fx*$WIDTH+$FLEFT]      set y [expr $fy*$HEIGHT+$FTOP]      .fc create rectangle $x $y [expr $x+$WIDTH-1] [expr $y+$HEIGHT-1] \	      -fill skyblue -outline "" -tags NUM$num    }  } elseif {$hx>=0 && $hx<32 && $hy==0} {    if [info exists holddata($hx)] {      unset holddata($hx)      unset holddata(dwidth,$hx)      .fc delete HOLD$hx      set x [expr $hx*$WIDTH+$HLEFT]      set y [expr $hy*$HEIGHT+$HTOP]      .fc create rectangle $x $y [expr $x+$WIDTH-1] [expr $y+$HEIGHT-1] \	      -fill pink -outline "" -tags HOLD$hx    }  }}proc pickchar {x y} {  global WIDTH HEIGHT FBOTTOM FLEFT FTOP FRIGHT HLEFT HTOP  global chardata currchar holddata  global pickchar pickstate  set fx [expr ($x-$FLEFT)/($WIDTH)]  set fy [expr ($y-$FTOP)/($HEIGHT)]  set hx [expr ($x-$HLEFT)/($WIDTH)]  set hy [expr ($y-$HTOP)/($HEIGHT)]  set pickchar -1  if {$fx>=0 && $fx<32 && $fy>=0 && $fy<8} {    if [string first after $pickstate]==0 {      after cancel $pickstate    }    set pickstate nogrid    set pickchar [expr $fx+$fy*32]    if [info exists chardata($pickchar)] {      set chardata(pick) $chardata($pickchar)      set chardata(dwidth,pick) $chardata(dwidth,$pickchar)      make_drag_cursor $WIDTH $HEIGHT [expr $WIDTH/2] [expr $HEIGHT/2] $chardata(pick)      . config -cursor "@/tmp/drag_cursor.bm /tmp/drag_cursor.bm black white"      bind .c <Enter> "checkdrop %x %y"      set pickstate [after 1000 "set pickstate gridok"]    }  } elseif {$hx>=0 && $hx<32 && $hy==0} {    set pickchar hold    set pickstate gridok    if [info exists holddata($hx)] {      set chardata(pick) $holddata($hx)      set chardata(dwidth,pick) $holddata(dwidth,$hx)      make_drag_cursor $WIDTH $HEIGHT [expr $WIDTH/2] [expr $HEIGHT/2] $chardata(pick)      . config -cursor "@/tmp/drag_cursor.bm /tmp/drag_cursor.bm black white"      bind .c <Enter> "checkdrop %x %y"    }  }}proc dragchar {x y} {  global WIDTH HEIGHT FBOTTOM FLEFT FTOP FRIGHT HLEFT HTOP  global pickchar pickstate oldcurrent  set fx [expr ($x-$FLEFT)/($WIDTH)]  set fy [expr ($y-$FTOP)/($HEIGHT)]  set hx [expr ($x-$HLEFT)/($WIDTH)]  set hy [expr ($y-$HTOP)/($HEIGHT)]  if {$fx>=0 && $fx<32 && $fy>=0 && $fy<8} {    if [string compare $pickstate gridok]==0 {      .fc coords draghilite [expr $FLEFT+$fx*$WIDTH-2] [expr $FTOP+$fy*$HEIGHT-2] [expr $FLEFT+($fx+1)*$WIDTH+2] [expr $FTOP+($fy+1)*$HEIGHT+2]    }  } elseif {$hx>=0 && $hx<32 && $hy==0} {    if [string compare $pickchar hold]!=0 {      .fc coords draghilite [expr $HLEFT-2] [expr $HTOP-2] [expr $HLEFT+32*$WIDTH+2] [expr $HTOP+$HEIGHT+2]    }  } else {    .fc coords draghilite -5 -5 -5 -5  }}proc enddragchar {x y} {  global WIDTH HEIGHT FBOTTOM FLEFT FTOP FRIGHT HLEFT HTOP  global chardata currchar  global pickchar pickstate  after 100 {bind .c <Enter> ""}  . config -cursor {}  .fc coords draghilite -5 -5 -5 -5  update  set fx [expr ($x-$FLEFT)/($WIDTH)]  set fy [expr ($y-$FTOP)/($HEIGHT)]  set hx [expr ($x-$HLEFT)/($WIDTH)]  set hy [expr ($y-$HTOP)/($HEIGHT)]  set newchar [expr $fx+$fy*32]  if [string compare $pickchar $newchar]==0 {    setchar $pickchar  } elseif {$fx>=0 && $fx<32 && $fy>=0 && $fy<8} {    if [string compare $pickstate gridok]==0 {      set dropchar [expr $fx+$fy*32]      if [info exists chardata($dropchar)] {	if [checkhold $chardata($dropchar) $chardata(pick)] {	  hold $dropchar	}      }      set chardata($dropchar) $chardata(pick)      set chardata(dwidth,$dropchar) $chardata(dwidth,pick)      showfontchar $dropchar      if $dropchar==$currchar {	setgrid chardata pick	set chardata(work) $chardata(pick)	set chardata(dwidth,work) $chardata(dwidth,pick)      }    }  } elseif {$hx>=0 && $hx<32 && $hy==0} {    if [string compare $pickchar hold]!=0 {      hold pick    }  }}proc checkdrop {x y} {  global GLEFT GTOP WIDTH HEIGHT GBOX GMARGIN chardata  set left [expr $GLEFT-3]  set right [expr $GLEFT+$WIDTH+3]  set top [expr $GTOP-$HEIGHT-15-3]  set bottom [expr $GTOP-15+3]  set gright [expr $GLEFT+$WIDTH*($GBOX+$GMARGIN)]  set gbottom [expr $GTOP+$HEIGHT*($GBOX+$GMARGIN)]  if {$x>= $left && $x <= $right && $y >= $top && $y <= $bottom} {    setgrid chardata pick    set chardata(work) $chardata(pick)    set chardata(dwidth,work) $chardata(dwidth,pick)  } elseif {$x>= $GLEFT && $x <= $gright && $y >= $GTOP && $y <= $gbottom} {    setgrid chardata pick    set chardata(work) $chardata(pick)    set chardata(dwidth,work) $chardata(dwidth,pick)  }}proc click {x y action} {  global GTOP GLEFT GMARGIN GBOX WIDTH HEIGHT  global ogx ogy  if [lsearch -exact [.c gettags [.c find withtag current]] dwidth]>=0 {    set ogx dwidth    return  }  set gx [expr ($x-$GLEFT)/($GBOX+$GMARGIN)]  set gy [expr ($y-$GTOP)/($GBOX+$GMARGIN)]  set gxmarg [expr ($x-$GLEFT)%($GBOX+$GMARGIN)]  set gymarg [expr ($y-$GTOP)%($GBOX+$GMARGIN)]  set faredge [expr $GBOX+$GMARGIN-1]  if ($gxmarg==0||$gxmarg==$faredge||$gymarg==0||$gymarg==$faredge) {    set ogx -1    set ogy -1    return  }  if {$gx>=0 && $gx<$WIDTH && $gy>=0 && $gy<$HEIGHT} {    $action $gx $gy  }  set ogx $gx  set ogy $gy}proc bmotion {x y action} {  global GTOP GLEFT GMARGIN GBOX WIDTH HEIGHT  global ogx ogy  if [string compare $ogx dwidth]==0 {    adjustdwidth $x $y    return  }  set gx [expr ($x-$GLEFT)/($GBOX+$GMARGIN)]  set gy [expr ($y-$GTOP)/($GBOX+$GMARGIN)]  set gxmarg [expr ($x-$GLEFT)%($GBOX+$GMARGIN)]  set gymarg [expr ($y-$GTOP)%($GBOX+$GMARGIN)]  if ($gxmarg==0||$gxmarg==$WIDTH||$gymarg==0||$gymarg==$WIDTH) {    return  }  if {$gx>=0 && $gx<$WIDTH && $gy>=0 && $gy<$HEIGHT} {    if {$gx!=$ogx || $gy!=$ogy} {      $action $gx $gy      set ogx $gx      set ogy $gy    }  }}proc makegrid {width height xorg yorg} {  global GTOP GLEFT GMARGIN GBOX WIDTH HEIGHT FTOP FBOTTOM FLEFT FRIGHT GPAD  global HLEFT HTOP  set GTOP [expr $GPAD+$HEIGHT]  .c delete all  .c create rectangle [expr $GLEFT-3] [expr $GTOP-$HEIGHT-15-3] [expr $GLEFT+$WIDTH+3] [expr $GTOP-15+3]  for {set y 0} {$y<$height} {incr y} {    for {set x 0} {$x<$width} {incr x} {      set x1 [expr $GLEFT+$x*($GMARGIN+$GBOX)]      set x2 [expr $x1+$GBOX]      set y1 [expr $GTOP+$y*($GMARGIN+$GBOX)]      set y2 [expr $y1+$GBOX]      .c create rectangle $x1 $y1 $x2 $y2 -fill white -outline gray -tags $x,$y    }  }  set HLEFT $FLEFT  set HTOP [expr $FBOTTOM+$FTOP]  #vertical line for marking font origin  set x [expr $GLEFT-$xorg*($GMARGIN+$GBOX)]  set y1 [expr $GTOP]  set y2 [expr $GTOP+$height*($GMARGIN+$GBOX)]  .c create line $x $y1 $x $y2 -width 2 -fill skyblue  #horizontal line of font origin  set x1 [expr $GLEFT]  set x2 [expr $GLEFT+$width*($GMARGIN+$GBOX)]  set y [expr $GTOP+($height+$yorg)*($GMARGIN+$GBOX)]  .c create line $x1 $y $x2 $y -width 2 -fill skyblue  .c create text [expr $GLEFT+$width+20] [expr $GTOP-$height-15-3] \	    -anchor nw -text "" -tags charlabel  .c create window 10 [expr $GTOP-20] -window .c.apply -anchor w  .c create window 10 [expr $GTOP-20+30] -window .c.reset -anchor w  .c create window 10 [expr $GTOP-20+60] -window .c.orig -anchor w  .c create window 10 [expr $GTOP-20+90] -window .c.clear -anchor w  .c create window 10 [expr $GTOP-20+120] -window .c.hold -anchor w  .c config -width [expr $FRIGHT+$FLEFT]  .c config -height [expr $GTOP+($GMARGIN+$GBOX)*$HEIGHT+$GPAD]  .fc config -width [expr $FRIGHT+$FLEFT]  #.fc config -height [expr $FBOTTOM+$FTOP]  .fc config -height [expr $HTOP+$HEIGHT+$FTOP]  set x [expr $GLEFT+$width*($GMARGIN+$GBOX)]  set y1 [expr $GTOP-($GMARGIN+$GBOX)]  set y2 [expr $GTOP+($height+1)*($GMARGIN+$GBOX)]  .c create line $x $y1 $x $y2 -width 2 -fill green -tags dwidth  set xbase [expr $GLEFT+($width-1)*($GMARGIN+$GBOX)+$GMARGIN]  set xpoint [expr $GLEFT+$width*($GMARGIN+$GBOX)]  set ypoint [expr $GTOP+($height+$yorg)*($GMARGIN+$GBOX)]  set ybase1 [expr $ypoint-$GMARGIN*4]  set ybase2 [expr $ypoint+$GMARGIN*4]  .c create polygon $xbase $ybase1 $xbase $ybase2 $xpoint $ypoint -fill skyblue -tags dwidth  .c bind charlabel <1> renamechar  wm geometry . ""}proc adjustdwidth {x y} {  global GTOP GLEFT GMARGIN GBOX WIDTH HEIGHT chardata currchar fontinfo  set newx [expr ($x+($GMARGIN+$GBOX)/2-$GLEFT)/($GMARGIN+$GBOX)]  set newx [expr $newx+$fontinfo(xorigin)]  #if ($newx<0) { set newx 0 }  #if ($newx>$WIDTH) { set newx $WIDTH }  showdwidth $newx  set chardata(dwidth,work) $newx}proc showdwidth {d} {  global GTOP GLEFT GMARGIN GBOX WIDTH HEIGHT fontinfo  .c delete dwidth  set x [expr $GLEFT+($d-$fontinfo(xorigin))*($GMARGIN+$GBOX)]  set y1 [expr $GTOP-($GMARGIN+$GBOX)]  set y2 [expr $GTOP+($HEIGHT+1)*($GMARGIN+$GBOX)]  .c create line $x $y1 $x $y2 -width 2 -fill green -tags dwidth  set xbase [expr $GLEFT+($d-1-$fontinfo(xorigin))*($GMARGIN+$GBOX)+$GMARGIN]  set xpoint [expr $GLEFT+($d-$fontinfo(xorigin))*($GMARGIN+$GBOX)]  set ypoint [expr $GTOP+($HEIGHT+$fontinfo(yorigin))*($GMARGIN+$GBOX)]  set ybase1 [expr $ypoint-$GMARGIN*4]  set ybase2 [expr $ypoint+$GMARGIN*4]  .c create polygon $xbase $ybase1 $xbase $ybase2 $xpoint $ypoint -fill skyblue -tags dwidth}proc oldsetgrid {data} {  global GTOP GLEFT GMARGIN GBOX WIDTH HEIGHT  for {set y 0} {$y<$HEIGHT} {incr y} {    for {set x 0} {$x<$WIDTH} {incr x} {      if [lindex [lindex $data $y] $x] {	.c itemconfig $x,$y -fill black      } else {	.c itemconfig $x,$y -fill white      }    }  }  showchardata .c $GLEFT [expr $GTOP-$HEIGHT-15] $data view}proc setgrid {varname key} {  global GTOP GLEFT GMARGIN GBOX WIDTH HEIGHT chardata currchar  global $varname  set data [set ${varname}($key)]  set x 0  set y 0  foreach row $data {    foreach bit $row {      if $bit {	.c itemconfig $x,$y -fill black      } else {	.c itemconfig $x,$y -fill white      }      incr x    }    set x 0    incr y  }  showchardata .c $GLEFT [expr $GTOP-$HEIGHT-15] $data view  set name ""  if [info exists ${varname}(name,$key)] {    set name [set ${varname}(name,$key)]  } elseif [info exists chardata(name,$currchar)] {    set name $chardata(name,$currchar)  }  if [info exists ${varname}(dwidth,$key)] {    showdwidth [set ${varname}(dwidth,$key)]  } elseif [info exists chardata(dwidth,$currchar)] {    showdwidth $chardata(dwidth,$currchar)  } else {    showdwidth $WIDTH  }  set txt [format "%d (%c) %s" $currchar $currchar $name]  .c itemconfig charlabel -text $txt}#

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?