From ac37668c0765703a2d76edac0d1d8b8f55be4e56 Mon Sep 17 00:00:00 2001 From: Jeffrey Armstrong Date: Thu, 14 May 2020 08:31:44 -0400 Subject: Renderer class now has optional arguments for drawing text to indicate list items, headings, etc. Dumb renderer now draws headings a bit nicer. --- dumb_render.f90 | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 7 deletions(-) (limited to 'dumb_render.f90') diff --git a/dumb_render.f90 b/dumb_render.f90 index 93897ed..3834e5c 100644 --- a/dumb_render.f90 +++ b/dumb_render.f90 @@ -27,6 +27,8 @@ implicit none integer, parameter::width = 79 integer, parameter::height = 24 + character, parameter::bullet_character = '-' + type, extends(renderer) :: dumb_renderer integer::link_index @@ -46,14 +48,14 @@ implicit none procedure :: draw_porportional => dumb_text_draw - procedure :: preformatted_width => dumb_text_width - procedure :: preformatted_height => dumb_text_height + procedure :: preformatted_width => dumb_simple_width + procedure :: preformatted_height => dumb_simple_height procedure :: is_preformatted_visible => dumb_text_visible - procedure :: draw_preformatted => dumb_text_draw + procedure :: draw_preformatted => dumb_simple_draw procedure :: link_width => dumb_link_width - procedure :: link_height => dumb_text_height + procedure :: link_height => dumb_simple_height procedure :: is_link_visible => dumb_text_visible procedure :: draw_link => dumb_link_draw @@ -122,28 +124,66 @@ contains end function store_link - function dumb_text_width(self, text) + function dumb_text_width(self, text, heading, list_item) implicit none class(dumb_renderer)::self character(*), intent(in)::text + integer, optional::heading + logical, optional::list_item integer::dumb_text_width dumb_text_width = len_trim(text) + if(present(list_item)) then + if(list_item) then + dumb_text_width = dumb_text_width + 3 + end if + end if + end function dumb_text_width - function dumb_text_height(self, text) + function dumb_text_height(self, text, heading, list_item) implicit none class(dumb_renderer)::self character(*), intent(in)::text + integer, optional::heading + logical, optional::list_item integer::dumb_text_height dumb_text_height = 1 + if(present(heading)) then + if(heading > 0) then + dumb_text_height = 2 + end if + end if + end function dumb_text_height + function dumb_simple_width(self, text) + implicit none + + class(dumb_renderer)::self + character(*), intent(in)::text + integer::dumb_simple_width + + dumb_simple_width = len_trim(text) + + end function dumb_simple_width + + function dumb_simple_height(self, text) + implicit none + + class(dumb_renderer)::self + character(*), intent(in)::text + integer::dumb_simple_height + + dumb_simple_height = 1 + + end function dumb_simple_height + function dumb_text_visible(self, text) implicit none @@ -157,7 +197,7 @@ contains end function dumb_text_visible - subroutine dumb_text_draw(self, text) + subroutine dumb_simple_draw(self, text) implicit none class(dumb_renderer)::self @@ -177,6 +217,54 @@ contains write(*, formatting) text(1:limit_x) end if + end subroutine dumb_simple_draw + + subroutine dumb_text_draw(self, text, heading, list_item) + implicit none + + class(dumb_renderer)::self + character(*), intent(in)::text + integer, optional::heading + logical, optional::list_item + integer::limit_x + character(5)::formatting + character(self%max_width)::heading_line + + ! Put a bullet for list items + if(present(list_item)) then + if(list_item) then + write(*, '(1X, A1, 1X)', advance='no') bullet_character + end if + end if + + limit_x = min(len_trim(text), self%max_width) + if(limit_x == 0) then + write(*,*) " " + else + if(limit_x < 10) then + write(formatting, '(A2, I1, A1)') '(A', limit_x, ')' + else + write(formatting, '(A2, I2, A1)') '(A', limit_x, ')' + end if + + write(*, formatting) text(1:limit_x) + end if + + ! For headings, plop a second line as an underline + if(present(heading)) then + if(heading > 0) then + if(limit_x > 0) then + if(heading == 1) then + heading_line = repeat("=", limit_x) + else + heading_line = repeat("-", limit_x) + end if + write(*, formatting) heading_line(1:limit_x) + else + write(*,*) " " + end if + end if + end if end subroutine dumb_text_draw -- cgit v1.2.3