aboutsummaryrefslogtreecommitdiff
path: root/dumb_render.f90
blob: 7832891980c22cb8ae79aa2b00d9bb45d39103fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
module dumb_render
use render
implicit none

    integer, parameter::width = 79
    integer, parameter::height = 24

    type, extends(renderer) :: dumb_renderer

        integer::link_index
        character(len=1024), dimension(height)::link_urls

    contains

        procedure :: initialize => dumb_initialize
        procedure :: prepare_for_layout => prepare_for_dumb_layout
    
        procedure :: text_width => dumb_text_width
        procedure :: text_height => dumb_text_height
        procedure :: is_text_visible => dumb_text_visible
        
        procedure :: draw_porportional => dumb_text_draw

        procedure :: preformatted_width => dumb_text_width
        procedure :: preformatted_height => dumb_text_height
        procedure :: is_preformatted_visible => dumb_text_visible
        
        procedure :: draw_preformatted => dumb_text_draw
    
        procedure :: link_width => dumb_link_width
        procedure :: link_height => dumb_text_height
        procedure :: is_link_visible => dumb_text_visible
        
        procedure :: draw_link => dumb_link_draw
    
    end type dumb_renderer
    
contains

    subroutine dumb_initialize(self)
    implicit none
    
        class(dumb_renderer)::self
        
        self%max_width = width
        self%y = 0
        
        self%link_index = 0
        self%link_urls = " "
        
    end subroutine dumb_initialize

    subroutine prepare_for_dumb_layout(self)
    implicit none
    
        class(dumb_renderer)::self
        
        self%link_index = 0
        self%link_urls = " "
        
        ! Write a page feed to clear the screen (not really necessary, but...)
        write(*, '(A1)', advance='no') char(12)
        
    end subroutine prepare_for_dumb_layout

    function store_link(self, url)
    implicit none
    
        class(dumb_renderer)::self
        character(*), intent(in)::url
        integer::store_link
        
        self%link_index = self%link_index + 1
        self%link_urls(self%link_index) = url
        
        store_link = self%link_index
        
    end function store_link

    function dumb_text_width(self, text)
    implicit none
        
        class(dumb_renderer)::self
        character(*), intent(in)::text
        integer::dumb_text_width
        
        dumb_text_width = len_trim(text)
        
    end function dumb_text_width
        
    function dumb_text_height(self, text)
    implicit none
        
        class(dumb_renderer)::self
        character(*), intent(in)::text
        integer::dumb_text_height
        
        dumb_text_height = 1
        
    end function dumb_text_height
    
    function dumb_text_visible(self, text)
    implicit none
    
        class(dumb_renderer)::self
        character(*), intent(in)::text
        logical::dumb_text_visible
        
        dumb_text_visible = (self%y >= 0 .AND. self%y < 24)
    
    end function dumb_text_visible
    
    subroutine dumb_text_draw(self, text)
    implicit none
    
        class(dumb_renderer)::self
        character(*), intent(in)::text
        integer::limit_x
        character(5)::formatting
        
        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
    
    end subroutine dumb_text_draw
    
    function build_link_text(self, text, idnum) result(res)
    implicit none
        
        class(dumb_renderer)::self
        character(*), intent(in)::text
        integer, intent(in)::idnum
        character(width)::res
        
        write(res, '(A1, I3, A2)') '[', idnum,']['
        
        if(len_trim(text) < (width - 7)) then
            res = trim(res)//trim(text)//']'
        else
            res = trim(res)//text(1:(width-7))//']'
        end if
    
    end function build_link_text
    
    function dumb_link_width(self, text)
    implicit none
    
        class(dumb_renderer)::self
        character(*), intent(in)::text
        integer::dumb_link_width
        
        character(width)::link
    
        link = build_link_text(self, text, 0)
        
        dumb_link_width = dumb_text_width(self, link)
    
    end function dumb_link_width
    
    subroutine dumb_link_draw(self, text, url)
    implicit none
    
        class(dumb_renderer)::self
        character(*), intent(in)::text, url
        integer::i
        character(width)::link
    
        i = store_link(self, url)    
        link = build_link_text(self, text, i)
        
        call dumb_text_draw(self, link)
        
    end subroutine dumb_link_draw
    
end module dumb_render