aboutsummaryrefslogtreecommitdiff
path: root/plugins/scale.lua
blob: 0d072863955df0b084759e38782e4782d552d68b (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
-- mod-version:1 -- lite-xl 1.16
local core = require "core"
local common = require "core.common"
local command = require "core.command"
local config = require "core.config"
local keymap = require "core.keymap"
local style = require "core.style"
local RootView = require "core.rootview"
local CommandView = require "core.commandview"

config.scale_mode = "code"
config.scale_use_mousewheel = true

local scale_level = 0
local scale_steps = 0.1
local font_cache = setmetatable({}, { __mode = "k" })

-- default lite fonts
local regular_font = "font.ttf"
local monospace_font = "monospace.ttf"

-- Set font names properly to work with latest lite-xl changes
if io.open(DATADIR .. "/fonts/FiraSans-Regular.ttf", "r") then
  regular_font = "FiraSans-Regular.ttf"
end

if io.open(DATADIR .. "/fonts/JetBrainsMono-Regular.ttf", "r") then
  monospace_font = "JetBrainsMono-Regular.ttf"
end

-- the following should be kept in sync with core.style's default font settings
font_cache[style.font]      = { DATADIR .. "/fonts/" .. regular_font,      14   * SCALE }
font_cache[style.big_font]  = { DATADIR .. "/fonts/" .. regular_font,      34   * SCALE }
font_cache[style.icon_font] = { DATADIR .. "/fonts/icons.ttf",     14   * SCALE }
font_cache[style.code_font] = { DATADIR .. "/fonts/" .. monospace_font, 13.5 * SCALE }


local load_font = renderer.font.load
function renderer.font.load(...)
  local res = load_font(...)
  font_cache[res] = { ... }
  return res
end


local function scale_font(font, s)
  local fc = font_cache[font]
  return renderer.font.load(fc[1], fc[2] * s)
end


local current_scale = SCALE
local default = current_scale


local function get_scale() return current_scale end


local function set_scale(scale)
  scale = common.clamp(scale, 0.2, 6)

  -- save scroll positions
  local scrolls = {}
  for _, view in ipairs(core.root_view.root_node:get_children()) do
    local n = view:get_scrollable_size()
    if n ~= math.huge and not view:is(CommandView) and n > view.size.y then
      scrolls[view] = view.scroll.y / (n - view.size.y)
    end
  end

  local s = scale / current_scale
  current_scale = scale

  if config.scale_mode == "ui" then
    SCALE = current_scale

    style.padding.x      = style.padding.x      * s
    style.padding.y      = style.padding.y      * s
    style.divider_size   = style.divider_size   * s
    style.scrollbar_size = style.scrollbar_size * s
    style.caret_width    = style.caret_width    * s
    style.tab_width      = style.tab_width      * s

    style.big_font  = scale_font(style.big_font,  s)
    style.icon_font = scale_font(style.icon_font, s)
    style.font      = scale_font(style.font,      s)
  end

  style.code_font = scale_font(style.code_font, s)

  -- restore scroll positions
  for view, n in pairs(scrolls) do
    view.scroll.y = n * (view:get_scrollable_size() - view.size.y)
    view.scroll.to.y = view.scroll.y
  end

  core.redraw = true
end


local on_mouse_wheel = RootView.on_mouse_wheel

function RootView:on_mouse_wheel(d, ...)
  if keymap.modkeys["ctrl"] and config.scale_use_mousewheel then
    if d < 0 then command.perform "scale:decrease" end
    if d > 0 then command.perform "scale:increase" end
  else
    return on_mouse_wheel(self, d, ...)
  end
end

local function res_scale()
    scale_level = 0
    set_scale(default)
end

local function inc_scale()
    scale_level = scale_level + 1
    set_scale(default + scale_level * scale_steps)
end

local function dec_scale()
    scale_level = scale_level - 1
    set_scale(default + scale_level * scale_steps)
end


command.add(nil, {
  ["scale:reset"   ] = function() res_scale() end,
  ["scale:decrease"] = function() dec_scale() end,
  ["scale:increase"] = function() inc_scale() end,
})

keymap.add {
  ["ctrl+0"] = "scale:reset",
  ["ctrl+-"] = "scale:decrease",
  ["ctrl+="] = "scale:increase",
}

return { get_scale = get_scale, set_scale = set_scale }