diff options
Diffstat (limited to 'ag_render.f90')
-rw-r--r-- | ag_render.f90 | 175 |
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) |