aboutsummaryrefslogtreecommitdiff
path: root/ag_render.f90
diff options
context:
space:
mode:
Diffstat (limited to 'ag_render.f90')
-rw-r--r--ag_render.f90175
1 files changed, 126 insertions, 49 deletions
diff --git a/ag_render.f90 b/ag_render.f90
index bddec84..b91a416 100644
--- a/ag_render.f90
+++ b/ag_render.f90
@@ -34,6 +34,7 @@ implicit none
integer, volatile::ag_render_event
integer, volatile::scroll_position
+ integer, volatile::wheel_movement
integer, parameter::ag_render_event_none = 0
integer, parameter::ag_render_event_closed = 1
@@ -85,12 +86,18 @@ implicit none
! Needed to compute document height
integer::initial_y
+
+ ! Page height
+ integer::page_height
! An error has occurred, so render blank
logical::render_blank
! A title was guessed and set
logical::title_guessed
+
+ ! Text of the title
+ character(len=256)::title_text
contains
@@ -131,6 +138,11 @@ implicit none
procedure :: report_unsupported_protocol => ag_report_unsupported_protocol
+ procedure :: set_favicon => ag_set_favicon
+
+ procedure :: rendering_height_available => ag_rendering_height_available
+ procedure :: scroll_max_value => ag_scroll_max_value
+
end type appgraphics_renderer
contains
@@ -209,13 +221,7 @@ contains
integer::x, y
- scroll_position = scroll_position - (x/35)
- if(scroll_position < 0) then
- scroll_position = 0
- else if(scroll_position > 100) then
- scroll_position = 100
- end if
-
+ wheel_movement = wheel_movement + x
ag_render_event = ag_render_event_wheel
call stopidle()
@@ -226,6 +232,7 @@ contains
implicit none
integer::x
+
scroll_position = x
ag_render_event = ag_render_event_scroll
call stopidle()
@@ -241,6 +248,18 @@ contains
end subroutine resize_callback
+ subroutine ag_set_favicon(self, f)
+ implicit none
+
+ class(appgraphics_renderer)::self
+ character(*), intent(in)::f
+
+ self%favicon = f
+
+ call set_window_title(self, self%title_text)
+
+ end subroutine ag_set_favicon
+
subroutine set_window_title(self, text)
use appgraphics, only: setwindowtitle
implicit none
@@ -248,8 +267,18 @@ contains
type(appgraphics_renderer)::self
character(*), intent(in)::text
- if(len_trim(text) > 0) then
- call setwindowtitle("LR-87 :: "//trim(text))
+ if(len_trim(text) > 256) then
+ self%title_text = text(1:250)//"..."
+ else
+ self%title_text = text
+ end if
+
+ if(len_trim(self%title_text) > 0) then
+ if(len_trim(self%favicon) > 0) then
+ call setwindowtitle("LR-87 :: "//self%favicon//" "//trim(self%title_text))
+ else
+ call setwindowtitle("LR-87 :: "//trim(self%title_text))
+ end if
else
call setwindowtitle("LR-87")
end if
@@ -283,7 +312,7 @@ contains
myexpand = .false.
endif
- self%address_bar_height = 24
+ self%address_bar_height = scaledpi(24)
! Set up some address bar colors
active_page = getactivepage()
@@ -293,60 +322,69 @@ contains
call setfillstyle(SOLID_FILL, LIGHTGRAY)
call setbkcolor(LIGHTGRAY)
call setcolor(BLACK)
- call settextstyle(SYMBOLS_FONT, HORIZ_DIR, 14)
+ call settextstyle(SANS_SERIF_FONT, HORIZ_DIR, scaledpi(18))
end do
call setactivepage(active_page)
! Draw the buttons first
x = 5
if(self%back_button_id < 0) then
- self%back_button_id = createbutton(x, 2, 40, 20, CHAR(231), back_button_callback)
+ self%back_button_id = createbutton(x, 2, scaledpi(40), scaledpi(20), &
+ ACHAR(240)//ACHAR(159)//ACHAR(161)//ACHAR(184), &
+ back_button_callback)
else
- call setbuttonposition(self%back_button_id, x, 2, 40, 20)
+ call setbuttonposition(self%back_button_id, x, 2, scaledpi(40), scaledpi(20))
end if
- x = x + 50
+ x = x + scaledpi(50)
label_x = x
- call settextstyle(WINDOWS_FONT, HORIZ_DIR, 12)
+ call settextstyle(WINDOWS_FONT, HORIZ_DIR, scaledpi(14))
x = x + textwidth("Address:") + 5
address_width = getmaxx()/2 - textwidth("Address:") - 5
+
if(self%address_id < 0) then
- self%address_id = createtextbox(x, 2, address_width, 20)
+ self%address_id = createtextbox(x, 2, address_width, scaledpi(20))
call settextboxentercallback(self%address_id, go_button_callback)
else
- call settextboxposition(self%address_id, x, 2, address_width, 20)
+ call settextboxposition(self%address_id, x, 2, address_width, scaledpi(20))
end if
! Clears any drawing operations for controls quickly
ignored = switch_to_thread()
- call settextstyle(SYMBOLS_FONT, HORIZ_DIR, 14)
+ call settextstyle(SANS_SERIF_FONT, HORIZ_DIR, scaledpi(18))
x = x + 10 + address_width
if(self%go_button_id < 0) then
- self%go_button_id = createbutton(x, 2, 40, 20, CHAR(232), go_button_callback)
+ self%go_button_id = createbutton(x, 2, scaledpi(40), scaledpi(20), &
+ ACHAR(240)//ACHAR(159)//ACHAR(161)//ACHAR(186), &
+ go_button_callback)
else
- call setbuttonposition(self%go_button_id, x, 2, 40, 20)
+ call setbuttonposition(self%go_button_id, x, 2, scaledpi(40), scaledpi(20))
end if
- call settextstyle(SYMBOLS_FONT, HORIZ_DIR, 18)
+ call settextstyle(SANS_SERIF_FONT, HORIZ_DIR, scaledpi(20))
! If we're not expanding, just draw these buttons in order
if(.not. myexpand) then
- x = getmaxx() - 95
+ x = getmaxx() - scaledpi(95)
if(self%fave_button_id < 0) then
- self%fave_button_id = createbutton(x, 2, 40, 20, CHAR(171), fave_button_callback)
+ self%fave_button_id = createbutton(x, 2, scaledpi(40), scaledpi(20), &
+ ACHAR(226)//ACHAR(152)//ACHAR(133), &
+ fave_button_callback)
else
- call setbuttonposition(self%fave_button_id, x, 2, 40, 20)
+ call setbuttonposition(self%fave_button_id, x, 2, scaledpi(40), scaledpi(20))
end if
- x = x + 50
+ x = x + scaledpi(50)
if(self%internal_button_id < 0) then
- self%internal_button_id = createbutton(x, 2, 40, 20, CHAR(62), internal_button_callback)
+ self%internal_button_id = createbutton(x, 2, scaledpi(40), scaledpi(20), &
+ ACHAR(226)//ACHAR(156)//ACHAR(135), &
+ internal_button_callback)
else
- call setbuttonposition(self%internal_button_id, x, 2, 40, 20)
+ call setbuttonposition(self%internal_button_id, x, 2, scaledpi(40), scaledpi(20))
end if
! If expanding due to resize, we need to draw the rightmost first.
@@ -354,11 +392,11 @@ contains
! check for that anymore
else
- x = getmaxx() - 45
- call setbuttonposition(self%internal_button_id, x, 2, 40, 20)
+ x = getmaxx() - scaledpi(45)
+ call setbuttonposition(self%internal_button_id, x, 2, scaledpi(40), scaledpi(20))
- x = x - 50
- call setbuttonposition(self%fave_button_id, x, 2, 40, 20)
+ x = x - scaledpi(50)
+ call setbuttonposition(self%fave_button_id, x, 2, scaledpi(40), scaledpi(20))
end if
@@ -372,7 +410,7 @@ contains
call setviewport(0, 0, getmaxx()+1, self%address_bar_height+1, .true.)
call clearviewport()
- call settextstyle(WINDOWS_FONT, HORIZ_DIR, 12)
+ call settextstyle(WINDOWS_FONT, HORIZ_DIR, scaledpi(14))
call outtextxy(label_x, 5, "Address:")
call resetviewport()
@@ -394,19 +432,18 @@ contains
call resetviewport()
call setviewport(0, getmaxy()-self%status_bar_height, getmaxx()+1, getmaxy()+1, .true.)
active_page = getactivepage()
- self%status_bar_height = 16
+ self%status_bar_height = scaledpi(16)
do i = 0, 1
call setactivepage(i)
call setbkcolor(LIGHTGRAY)
call setcolor(BLACK)
- call settextstyle(WINDOWS_FONT, HORIZ_DIR, 12)
+ call settextstyle(WINDOWS_FONT, HORIZ_DIR, scaledpi(14))
call clearviewport()
call outtextxy(5, 2, trim(text))
-
end do
call setactivepage(active_page)
call resetviewport()
@@ -459,14 +496,15 @@ contains
class(appgraphics_renderer)::self
- self%window_id = initwindow(default_width, default_height, "LR-87", &
+ call setapplicationdpiaware()
+
+ self%window_id = initwindow(scaledpi(default_width), scaledpi(default_height), "LR-87", &
DEFAULT_POSITION, DEFAULT_POSITION, &
.TRUE., .FALSE.)
call setwindowsmallicon(1)
call setwindowlargeicon(1)
-
call setwindowclosecallback(window_closing_callback)
call registermousehandler(MOUSE_LB_UP, mouse_button_callback)
call registermousehandler(MOUSE_MOVE, mouse_move_callback)
@@ -493,7 +531,7 @@ contains
self%link_color = BLUE
self%max_width = compute_max_width(self)
- self%font_size = default_font_size
+ self%font_size = scaledpi(default_font_size)
self%default_font = SERIF_FONT
self%line_spacing = 2
self%left_border = 15
@@ -556,14 +594,44 @@ contains
end subroutine ag_prepare_for_layout
+ function ag_rendering_height_available(self)
+ use appgraphics, only: getmaxy
+ implicit none
+
+ class(appgraphics_renderer), intent(in)::self
+ integer::ag_rendering_height_available
+
+ ag_rendering_height_available = getmaxy() - self%status_bar_height - &
+ self%address_bar_height - 1
+
+ end function ag_rendering_height_available
+
+ function ag_scroll_max_value(self)
+ implicit none
+
+ class(appgraphics_renderer), intent(in)::self
+ integer::ag_scroll_max_value
+
+ ag_scroll_max_value = max(0, self%page_height - self%rendering_height_available())
+
+ end function ag_scroll_max_value
+
subroutine ag_layout_complete(self)
use appgraphics, only: swapbuffers
implicit none
class(appgraphics_renderer)::self
+ integer::nPages
call swapbuffers()
+ if(self%page_height == 0) then
+ self%page_height = self%y + self%initial_y
+ nPages = self%rendering_height_available()
+ call setscrollrange(self%scroll_id, 0, self%scroll_max_value()+nPages)
+ call setscrollpagesize(self%scroll_id, nPages)
+ end if
+
end subroutine ag_layout_complete
subroutine ag_new_page(self)
@@ -573,11 +641,13 @@ contains
self%y = 0
scroll_position = 0
+ wheel_movement = 0
call setscrollposition(self%scroll_id, 0)
ag_render_event = ag_render_event_none
self%title_guessed = .false.
+ self%page_height = 0
end subroutine ag_new_page
@@ -630,7 +700,7 @@ contains
ag_text_width = 0
end if
- ag_text_width = ag_text_width + self%left_border + self%right_border
+ !ag_text_width = ag_text_width + self%left_border + self%right_border
if(present(text_type)) then
if(text_type == proportional_type_list_item) then
@@ -701,7 +771,7 @@ contains
case (proportional_type_heading_1)
! The first level 1 heading can be guessed as the page title
if(.not. self%title_guessed) then
-
+
call set_window_title(self, text)
self%title_guessed = .true.
@@ -769,7 +839,7 @@ contains
text_width = ag_link_width(self, trim(text))
! Need to remove indents, borders, etc.
- text_width = text_width - self%left_border - self%right_border
+ !text_width = text_width - self%left_border - self%right_border
call line(self%left_border, self%y + 7*self%font_size/8, &
self%left_border + text_width, self%y + 7*self%font_size/8)
@@ -803,7 +873,7 @@ contains
ag_preformatted_width = 0
end if
- ag_preformatted_width = ag_preformatted_width + self%left_border + self%right_border
+ !ag_preformatted_width = ag_preformatted_width + self%left_border + self%right_border
end function ag_preformatted_width
@@ -897,9 +967,6 @@ contains
logical::expanding_horizontally
- ! 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
@@ -942,15 +1009,25 @@ contains
call clearmouseclick(MOUSE_MOVE)
case(ag_render_event_wheel)
+ scroll_position = scroll_position - &
+ (wheel_movement/120)* &
+ self%text_height("Scrolled Example", proportional_type_normal)
+
+ ! Limit
+ scroll_position = max(0, scroll_position)
+ scroll_position = min(self%scroll_max_value(), &
+ scroll_position)
+
call setscrollposition(self%scroll_id, scroll_position)
- doclength = self%y - self%initial_y
- self%y = (doclength * scroll_position) / (-100)
+ self%y = -1*scroll_position
ag_action = render_action_layout
+
+ wheel_movement = 0
case(ag_render_event_scroll)
- doclength = self%y - self%initial_y
- self%y = (doclength * scroll_position) / (-100)
+
+ self%y = -1*scroll_position
ag_action = render_action_layout
case(ag_render_event_resize)