about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--app.lua25
-rw-r--r--source.lua25
-rw-r--r--source_edit.lua5
-rw-r--r--source_tests.lua80
4 files changed, 122 insertions, 13 deletions
diff --git a/app.lua b/app.lua
index 69507ec..994f0c7 100644
--- a/app.lua
+++ b/app.lua
@@ -154,6 +154,27 @@ function App.screen.init(dims)
   App.screen.height = dims.height
 end
 
+-- operations on the LÖVE window within the monitor/display
+function App.screen.resize(width, height, flags)
+  App.screen.width = width
+  App.screen.height = height
+  App.screen.flags = flags
+end
+
+function App.screen.size()
+  return App.screen.width, App.screen.height, App.screen.flags
+end
+
+function App.screen.move(x,y, displayindex)
+  App.screen.x = x
+  App.screen.y = y
+  App.screen.displayindex = displayindex
+end
+
+function App.screen.position()
+  return App.screen.x, App.screen.y, App.screen.displayindex
+end
+
 function App.screen.print(msg, x,y)
   local screen_row = 'y'..tostring(y)
 --?   print('drawing "'..msg..'" at y '..tostring(y))
@@ -379,6 +400,10 @@ function App.disable_tests()
   App.fake_mouse_press = nil
   App.fake_mouse_release = nil
   -- other methods dispatch to real hardware
+  App.screen.resize = love.window.setMode
+  App.screen.size = love.window.getMode
+  App.screen.move = love.window.setPosition
+  App.screen.position = love.window.getPosition
   App.screen.print = love.graphics.print
   App.newText = love.graphics.newText
   App.screen.draw = love.graphics.draw
diff --git a/source.lua b/source.lua
index 843a244..611cc05 100644
--- a/source.lua
+++ b/source.lua
@@ -45,7 +45,7 @@ function source.initialize_globals()
     index = 1,
   }
 
-  Menu_status_bar_height = nil  -- initialized below
+  Menu_status_bar_height = 5 + --[[line height in tests]] 15 + 5
 
   -- a few text objects we can avoid recomputing unless the font changes
   Text_cache = {}
@@ -116,15 +116,15 @@ function source.load_settings()
   local settings = Settings.source
   love.graphics.setFont(love.graphics.newFont(settings.font_height))
   -- maximize window to determine maximum allowable dimensions
-  love.window.setMode(0, 0)  -- maximize
-  Display_width, Display_height, App.screen.flags = love.window.getMode()
+  App.screen.resize(0, 0)  -- maximize
+  Display_width, Display_height, App.screen.flags = App.screen.size()
   -- set up desired window dimensions
   App.screen.flags.resizable = true
   App.screen.flags.minwidth = math.min(Display_width, 200)
   App.screen.flags.minheight = math.min(Display_height, 200)
   App.screen.width, App.screen.height = settings.width, settings.height
 --?   print('setting window from settings:', App.screen.width, App.screen.height)
-  love.window.setMode(App.screen.width, App.screen.height, App.screen.flags)
+  App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
 --?   print('loading source position', settings.x, settings.y, settings.displayindex)
   source.set_window_position_from_settings(settings)
   Show_log_browser_side = settings.show_log_browser_side
@@ -156,19 +156,19 @@ end
 
 function source.initialize_window_geometry(em_width)
   -- maximize window
-  love.window.setMode(0, 0)  -- maximize
-  Display_width, Display_height, App.screen.flags = love.window.getMode()
+  App.screen.resize(0, 0)  -- maximize
+  Display_width, Display_height, App.screen.flags = App.screen.size()
   -- shrink height slightly to account for window decoration
   App.screen.height = Display_height-100
   App.screen.width = 40*em_width
   App.screen.flags.resizable = true
   App.screen.flags.minwidth = math.min(App.screen.width, 200)
   App.screen.flags.minheight = math.min(App.screen.width, 200)
-  love.window.setMode(App.screen.width, App.screen.height, App.screen.flags)
+  App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
   print('initializing source position')
   if Settings == nil then Settings = {} end
   if Settings.source == nil then Settings.source = {} end
-  Settings.source.x, Settings.source.y, Settings.source.displayindex = love.window.getPosition()
+  Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position()
 end
 
 function source.resize(w, h)
@@ -254,7 +254,7 @@ end
 function source.settings()
   if Current_app == 'source' then
 --?     print('reading source window position')
-    Settings.source.x, Settings.source.y, Settings.source.displayindex = love.window.getPosition()
+    Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position()
   end
   local filename = Editor_state.filename
   if is_relative_path(filename) then
@@ -322,12 +322,15 @@ function source.keychord_pressed(chord, key)
 --?     print('C-l')
     Show_log_browser_side = not Show_log_browser_side
     if Show_log_browser_side then
-      App.screen.width = Log_browser_state.right + Margin_right
+      App.screen.width = math.min(Display_width, App.screen.width*2)
+      Editor_state.right = App.screen.width/2 - Margin_right
+      Log_browser_state.left = App.screen.width/2 + Margin_left
+      Log_browser_state.right = App.screen.width - Margin_right
     else
       App.screen.width = Editor_state.right + Margin_right
     end
 --?     print('setting window:', App.screen.width, App.screen.height)
-    love.window.setMode(App.screen.width, App.screen.height, App.screen.flags)
+    App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
 --?     print('done setting window')
     -- try to restore position if possible
     -- if the window gets wider the window manager may not respect this
diff --git a/source_edit.lua b/source_edit.lua
index 34752d0..c17ce26 100644
--- a/source_edit.lua
+++ b/source_edit.lua
@@ -127,7 +127,10 @@ end
 function edit.draw(State)
   State.button_handlers = {}
   App.color(Text_color)
-  assert(#State.lines == #State.line_cache)
+  if #State.lines ~= #State.line_cache then
+    print(('line_cache is out of date; %d when it should be %d'):format(#State.line_cache, #State.lines))
+    assert(false)
+  end
   if not Text.le1(State.screen_top1, State.cursor1) then
     print(State.screen_top1.line, State.screen_top1.pos, State.screen_top1.posB, State.cursor1.line, State.cursor1.pos, State.cursor1.posB)
     assert(false)
diff --git a/source_tests.lua b/source_tests.lua
index 519c311..81bdb74 100644
--- a/source_tests.lua
+++ b/source_tests.lua
@@ -7,7 +7,7 @@ function test_resize_window()
   check_eq(App.screen.width, 300, 'F - test_resize_window/baseline/width')
   check_eq(App.screen.height, 300, 'F - test_resize_window/baseline/height')
   check_eq(Editor_state.left, Test_margin_left, 'F - test_resize_window/baseline/left_margin')
-  check_eq(Editor_state.right, 300 - Test_margin_right, 'F - test_resize_window/baseline/left_margin')
+  check_eq(Editor_state.right, 300 - Test_margin_right, 'F - test_resize_window/baseline/right_margin')
   App.resize(200, 400)
   -- ugly; resize switches to real, non-test margins
   check_eq(App.screen.width, 200, 'F - test_resize_window/width')
@@ -18,6 +18,84 @@ function test_resize_window()
   -- TODO: how to make assertions about when App.update got past the early exit?
 end
 
+function test_show_log_browser_side()
+  io.write('\ntest_show_log_browser_side')
+  App.screen.init{width=300, height=300}
+  Display_width = App.screen.width
+  Current_app = 'source'
+  Editor_state = edit.initialize_test_state()
+  Editor_state.filename = 'foo'
+  Text.redraw_all(Editor_state)
+  Log_browser_state = edit.initialize_test_state()
+  Text.redraw_all(Log_browser_state)
+  log_browser.parse(Log_browser_state)
+  check(not Show_log_browser_side, 'F - test_show_log_browser_side/baseline')
+  -- pressing ctrl+l shows log-browser side
+  App.wait_fake_time(0.1)
+  App.run_after_keychord('C-l')
+  check(Show_log_browser_side, 'F - test_show_log_browser_side')
+end
+
+function test_show_log_browser_side_doubles_window_width_if_possible()
+  io.write('\ntest_show_log_browser_side_doubles_window_width_if_possible')
+  -- initialize screen dimensions to half width
+  App.screen.init{width=300, height=300}
+  Display_width = App.screen.width*2
+  -- initialize source app with left side occupying entire window (half the display)
+  Current_app = 'source'
+  Editor_state = edit.initialize_test_state()
+  Editor_state.filename = 'foo'
+  Editor_state.left = Margin_left
+  Editor_state.right = App.screen.width - Margin_right
+  local old_editor_right = Editor_state.right
+  Text.redraw_all(Editor_state)
+  Log_browser_state = edit.initialize_test_state()
+  -- log browser has some arbitrary margins
+  Log_browser_state.left = 200 + Margin_left
+  Log_browser_state.right = 400
+  Text.redraw_all(Log_browser_state)
+  log_browser.parse(Log_browser_state)
+  -- display log browser
+  App.wait_fake_time(0.1)
+  App.run_after_keychord('C-l')
+  -- window width is doubled
+  check_eq(App.screen.width, 600, 'F - test_show_log_browser_side_doubles_window_width_if_possible/display:width')
+  -- left side margins are unchanged
+  check_eq(Editor_state.left, Margin_left, 'F - test_show_log_browser_side_doubles_window_width_if_possible/edit:left')
+  check_eq(Editor_state.right, old_editor_right, 'F - test_show_log_browser_side_doubles_window_width_if_possible/edit:right')
+  -- log browser margins are adjusted
+  check_eq(Log_browser_state.left, App.screen.width/2 + Margin_left, 'F - test_show_log_browser_side_doubles_window_width_if_possible/log:left')
+  check_eq(Log_browser_state.right, App.screen.width - Margin_right, 'F - test_show_log_browser_side_doubles_window_width_if_possible/log:right')
+end
+
+function test_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width()
+  io.write('\ntest_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width')
+  -- initialize screen dimensions and indicate that it is maximized
+  App.screen.init{width=300, height=300}
+  Display_width = 300
+  -- initialize source app with left side occupying more than half the display
+  Current_app = 'source'
+  Editor_state = edit.initialize_test_state()
+  Editor_state.filename = 'foo'
+  Editor_state.left = Margin_left
+  Editor_state.right = 200
+  Text.redraw_all(Editor_state)
+  Log_browser_state = edit.initialize_test_state()
+  -- log browser has some arbitrary margins
+  Log_browser_state.left = 200 + Margin_left
+  Log_browser_state.right = 400
+  Text.redraw_all(Log_browser_state)
+  log_browser.parse(Log_browser_state)
+  -- display log browser
+  App.wait_fake_time(0.1)
+  App.run_after_keychord('C-l')
+  -- margins are now adjusted
+  check_eq(Editor_state.left, Margin_left, 'F - test_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width/edit:left')
+  check_eq(Editor_state.right, App.screen.width/2 - Margin_right, 'F - test_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width/edit:right')
+  check_eq(Log_browser_state.left, App.screen.width/2 + Margin_left, 'F - test_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width/log:left')
+  check_eq(Log_browser_state.right, App.screen.width - Margin_right, 'F - test_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width/log:right')
+end
+
 function test_drop_file()
   io.write('\ntest_drop_file')
   App.screen.init{width=Editor_state.left+300, height=300}