So... I was fiddling around with this and I ran into enough obstacles
that I figured I should just show some code rather than expect anyone
else to have done this.

T =: 3 3 $ 'Task 1';1;3;'Task 2';3;6;'Task 3';4;7

require'gl2'
coinsert'jgl2'

glqtextmetrics=: {{
  tm=. 7#2-2
  chkgl2 cdrc=. ('"',libjqt,'" glqtextmetrics  ',(IFWIN#'+'),' i *i') cd <tm
  1{::cdrc
}}"1

textmetrics=: ''&$: :{{
  NB. (max line width), height in pixels
  NB. x: optional font spec
  NB. y: newline delimited text
  wd 'pc junk;cc z isidraw'
  if. #x do. glfont x end.
  (wd 'pclose') ] (>./glqextentw y),{.glqtextmetrics''
}}

minigantt=: {{
  pad=. 4
  'w h'=. textmetrics ;({."1 y),each LF
  guw=. h NB. gantt unit width
  NB. 50 is arbitrary number to make window wide enough
  W=. 50+(3*pad)+(>./w)+guw*1+>./;}."1 y
  H=. pad+(#y)*pad+h
  wd 'pc gantt closeok; minwh ',":W,H
  wd 'cc chart isidraw; pshow'
  gltextcolor glrgb 0 0 0 NB. black text
  glbrush glrgb 0 0 255 NB. blue rectangles
  glpen 1 NB. null pen - no outline on rectangles
  X=. w+2*pad NB. screen location of x=0 for gantt rectangles
  for_j. i.#y do.
    Y=. pad+j*pad+h
    gltextxy pad,Y
    gltext (<j,0){::y
    'left right'=. ;}.j{y
    glrect (X+guw*left),Y,(guw*right),h
  end.
}}

Run:
   minigantt T

to bring up a draft gantt chart. Note that I have assumed that numeric
values are reasonable here (positive but not too large).

For some documentation on the drawing language I used here, see:
https://code.jsoftware.com/wiki/Guides/Window_Driver/Command_Reference
https://code.jsoftware.com/wiki/Guides/Window_Driver/gl2_Command_Reference

Issues I ran into had to do with picking the right sizes for things.
There's some padding here that I have not spent enough time trying to
understand (that's where that 50 in minigantt comes from). Also,
there's a bug in the current implementation of glqtextmetrics which
needs to be worked around.

Also, for more generic use it may be desirable to add support for
scrolling and/or paging and/or more labelling -- it might be desirable
to have an x axis, for example.

And, I may have an inadvertent version dependency in this code which
will only show up in later J versions.

Still, this at least shows a way that this kind of problem might be approached.

And, I think we need more of these kinds of problems, to work through
some of the issues which pop up when we make these attempts.

Thanks,

-- 
Raul

On Sat, Nov 13, 2021 at 7:48 PM Raul Miller <[email protected]> wrote:
>
> I wrote:
>
> On Sat, Nov 13, 2021 at 7:44 PM Raul Miller <[email protected]> wrote:
> > You could use viewmat to generate the bars horizontally. Though I
> > don't know how to put labels on a viewmat result.
>
> That was false: I do know how to put labels on a viewmat result. But I
> am usually too lazy to bother.
>
> (You start with a bitmap representation of each character you wish to
> include, and then you index them based on the characters in your text
> and update the relevant parts of your viewmat with those "pixels".)
>
> FYI,
>
> --
> Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to