aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ag_render.f9070
1 files changed, 60 insertions, 10 deletions
diff --git a/ag_render.f90 b/ag_render.f90
index be21112..888a83c 100644
--- a/ag_render.f90
+++ b/ag_render.f90
@@ -41,6 +41,7 @@ implicit none
integer, parameter::ag_render_event_back = 3
integer, parameter::ag_render_event_go = 4
integer, parameter::ag_render_event_scroll = 5
+ integer, parameter::ag_render_event_resize = 6
type :: link
integer, dimension(4)::location
@@ -165,13 +166,22 @@ contains
end subroutine scrolled_callback
+ subroutine resize_callback()
+ use appgraphics, only: stopidle
+ implicit none
+
+ ag_render_event = ag_render_event_resize
+ call stopidle()
+
+ end subroutine resize_callback
+
subroutine draw_address_bar(self)
use appgraphics
implicit none
type(appgraphics_renderer)::self
- integer::x, address_width
+ integer::x, address_width, label_x
self%address_bar_height = 24
@@ -181,8 +191,7 @@ contains
call setcolor(BLACK)
call settextstyle(WINDOWS_FONT, HORIZ_DIR, 12)
- call bar(0, 0, getmaxx(), self%address_bar_height)
-
+ ! Draw the buttons first
x = getmaxx()/4 - 40
if(self%back_button_id == 0) then
self%back_button_id = createbutton(x, 2, 40, 20, "Back", back_button_callback)
@@ -191,7 +200,7 @@ contains
end if
x = x + 50
- call outtextxy(x, 5, "Address:")
+ label_x = x
x = x + textwidth("Address:") + 5
address_width = getmaxx()/2 - textwidth("Address:") - 5
@@ -208,6 +217,11 @@ contains
call setbuttonposition(self%go_button_id, x, 2, 40, 20)
end if
+ call setviewport(0, 0, getmaxx(), self%address_bar_height, .true.)
+ call clearviewport()
+ call outtextxy(label_x, 5, "Address:")
+ call resetviewport()
+
end subroutine draw_address_bar
subroutine draw_status_bar(self, text)
@@ -226,7 +240,7 @@ contains
call setcolor(BLACK)
call settextstyle(WINDOWS_FONT, HORIZ_DIR, 12)
- call bar(0, getmaxy()-self%status_bar_height, getmaxx(), getmaxy())
+ call bar(0, getmaxy()-self%status_bar_height, getmaxx()+1, getmaxy()+1)
call outtextxy(self%left_border+2, getmaxy()-self%status_bar_height+2, trim(text))
end subroutine draw_status_bar
@@ -240,10 +254,10 @@ contains
integer::h
self%scroll_bar_width = 15
- h = getmaxy()-self%address_bar_height-self%status_bar_height
+ h = getmaxy()-self%address_bar_height-self%status_bar_height - 1
if(self%scroll_id == 0) then
self%scroll_id = createscrollbar(getmaxx()-self%scroll_bar_width, &
- self%address_bar_height, &
+ self%address_bar_height+1, &
self%scroll_bar_width, &
h, &
SCROLL_VERTICAL, &
@@ -253,13 +267,25 @@ contains
else
call setscrollbarposition(self%scroll_id, &
getmaxx()-self%scroll_bar_width, &
- self%address_bar_height, &
+ self%address_bar_height+1, &
self%scroll_bar_width, &
h)
end if
end subroutine draw_scroll_bar
+ function compute_max_width(self)
+ use appgraphics, only: getmaxx
+ implicit none
+
+ type(appgraphics_renderer)::self
+ integer::compute_max_width
+
+ compute_max_width = getmaxx() - self%left_border - &
+ self%right_border - self%scroll_bar_width
+
+ end function compute_max_width
+
subroutine ag_initialize(self)
use appgraphics
implicit none
@@ -272,6 +298,10 @@ contains
call setwindowclosecallback(window_closing_callback)
call registermousehandler(MOUSE_LB_UP, mouse_button_callback)
+ call enableresize(resize_callback)
+
+ call setbkcolor(LIGHTGRAY)
+ call clearviewport()
self%address_id = 0
self%go_button_id = 0
@@ -286,7 +316,7 @@ contains
self%text_color = BLACK
self%link_color = BLUE
- self%max_width = getmaxx()
+ self%max_width = compute_max_width(self)
self%font_size = default_font_size
self%default_font = SERIF_FONT
self%line_spacing = 2
@@ -613,7 +643,8 @@ contains
function ag_action(self, text)
use render, only: render_action_none, render_action_layout, &
- render_action_goto, render_action_quit
+ render_action_goto, render_action_quit, &
+ idle_status
implicit none
class(appgraphics_renderer)::self
@@ -625,6 +656,11 @@ contains
! For scrolling
integer::doclength
+ ! Resize can be laggy, so ensure it actually was finalized
+ if(self%max_width /= compute_max_width(self)) then
+ ag_render_event = ag_render_event_resize
+ end if
+
if(ag_render_event == ag_render_event_none) then
call startidle(10000)
end if
@@ -655,6 +691,20 @@ contains
doclength = self%y - self%initial_y
self%y = (doclength * scroll_position) / (-100)
ag_action = render_action_layout
+
+ case(ag_render_event_resize)
+
+ ! Effectively have to redraw everything
+ call draw_address_bar(self)
+ call draw_status_bar(self, idle_status)
+ call draw_scroll_bar(self)
+ call setscrollposition(self%scroll_id, 0)
+
+ ! Need to recompute the max width for the layout engine
+ self%max_width = compute_max_width(self)
+ self%y = 0
+
+ ag_action = render_action_layout
end select