aboutsummaryrefslogtreecommitdiff
path: root/plugins/welcome.lua
blob: afd28ed897d2819cff42a7123894b1ded039f535 (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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
-- mod-version:3 --lite-xl 2.1

local core = require "core"
local style = require "core.style"
local command = require "core.command"
local keymap = require "core.keymap"
local View = require "core.view"
local common = require "core.common"
local EmptyView = require "core.emptyview"
local Node = require "core.node"

local PluginManager = require "plugins.plugin_manager"
local PluginView = require "plugins.plugin_manager.plugin_view"


local welcomed = system.get_file_info(USERDIR .. PATHSEP .. "welcomed") ~= nil
if welcomed then return end

local status, tv = pcall(require "plugins.treeview")
if not status then command.perform("treeview:toggle") end

local loading = nil

local hovered_button = nil
local function draw_button(view, x, y, w, button)
  local highlight = hovered_button == button
  if highlight then core.request_cursor("hand") end
  local button_height = style.font:get_height() + style.padding.y * 2
  local tw = common.draw_text(style.font, highlight and style.accent or style.text, button.label, "left", x, y, w, button_height)
  if tw < x + w then
    renderer.draw_rect(x + w, y - 3, button_height, button_height, highlight and style.dim or style.background2)
    renderer.draw_text(style.icon_font, "+", x + w + style.padding.x, y + style.padding.y, style.accent)
  end
  return x, y, w + button_height, button_height
end

local buttons = {
  { label = "Install Addons Package", command = "welcome:install-addons", tooltip = {
    "Installs syntax highlightings, themes, and plugins that make Lite XL easier to use.",
    "",
    "Recommended for newcomers to Lite XL.",
    "Requires a network connection."
  } },
  { label = "Open Plugin Manager", command = "welcome:open-plugin-manager", tooltip = { "Manually select plugins you'd like to install before beginning with Lite XL.", "", "Requires a network connection." } },
  { label = "Dismiss Welcome Options", command = "welcome:dismiss", tooltip = { "Dismisses this screen permanently." } }
}

local old_get_name = EmptyView.get_name
function EmptyView:get_name() if welcomed then return old_get_name(self) end return "Welcome!" end

local old_draw = EmptyView.draw
function EmptyView:draw()
  if welcomed then return old_draw(self) end
  self:draw_background(style.background)
  if loading then
    local y = self.position.y + self.size.y / 2
    self:draw_background(style.background)
    PluginView.draw_loading_screen(self, loading.label, loading.percent)
    return
  end


  local title = "Lite XL"
  local version = "version " .. VERSION
  local title_width = style.big_font:get_width(title)
  local version_width = style.font:get_width(version)

  local button_width = math.min(self.size.x / 2 - 80, 300)

  local th = style.big_font:get_height()
  local dh = 2 * th + style.padding.y * #buttons
  local w = math.max(title_width, version_width) + button_width + style.padding.x * 2 + math.ceil(1*SCALE)
  local h = (style.font:get_height() + style.padding.y) * #buttons + style.padding.y + style.font:get_height()
  local x = self.position.x + math.max(style.padding.x, (self.size.x - w) / 2)
  local y = self.position.y + (self.size.y - h) / 2


  local x1, y1 = x, y + ((dh - th) / #buttons)
  local xv
  if version_width > title_width then
    version = VERSION
    version_width = style.font:get_width(version)
    xv = x1 - (version_width - title_width)
  end
  x = renderer.draw_text(style.big_font, title, x1, y1, style.dim)
  renderer.draw_text(style.font, version, xv, y1 + th, style.dim)
  x = x + style.padding.x
  renderer.draw_rect(x, y, math.ceil(1 * SCALE), dh, style.dim)

  x = x + style.padding.x

  local button_height = style.padding.y * 2 + style.font:get_height()
  renderer.draw_rect(x, y, button_width, #buttons * (button_height + style.padding.y), style.background)
  for i,v in ipairs(buttons) do
    v.x, v.y, v.w, v.h = draw_button(self, x + style.padding.x, y, button_width, v)
    y = y + v.h + style.padding.y * 2
  end

  if hovered_button then
    for i, v in ipairs(hovered_button.tooltip) do
      common.draw_text(style.font, style.text, v, "center", self.position.x, y + style.padding.y, self.size.x, style.font:get_height())
      y = y + style.font:get_height()
    end
  else
    common.draw_text(style.font, style.text, "Hover over one of the options above to get started.", "center", self.position.x, y + style.padding.y, self.size.x, style.font:get_height())
  end
end

function EmptyView:on_mouse_moved(x, y)
  hovered_button = nil
  for i,v in ipairs(buttons) do
    if v.x and x >= v.x and x < v.x + v.w and y >= v.y and y < v.y + v.h then
      hovered_button = v
    end
  end
end

function EmptyView:on_mouse_pressed(button, x, y)
  if hovered_button and not welcomed then command.perform(hovered_button.command) end
end



local function terminate_welcome()
  io.open(USERDIR .. PATHSEP .. "welcomed", "wb"):close()
  command.perform("treeview:toggle")
  welcomed = true
end

command.add(EmptyView, {
  ["welcome:install-addons"] = function()
    core.log("Installing addons...")
    loading = { percent = 0, label = "Initializing..." }
    core.redraw = true
    PluginManager:install({ id = "meta_addons" }, { progress = function(progress)
      loading = progress
      core.redraw = true
    end, restart = false }):done(function()
      loading = false
      core.log("Addons installed!")
      terminate_welcome()
      command.perform("core:restart")
    end):fail(function(err)
      loading = false
      core.redraw = true
      core.error(err or "Error installing addons.")
    end)
  end,
  ["welcome:open-plugin-manager"] = function()
    command.perform("plugin-manager:show")
  end,
  ["welcome:dismiss"] = function()
    terminate_welcome()
  end
})