aboutsummaryrefslogtreecommitdiff
path: root/plugins/ephemeral_tabs.lua
blob: e1505c32e0b00d31bc2a773d68d7c24e17744257 (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
-- mod-version:2 -- lite-xl 2.0
local core = require "core"
local command = require "core.command"
local RootView = require "core.rootview"
local DocView = require "core.docview"
local Doc = require "core.doc"
local TreeView = require "plugins.treeview"

local RootView_open_doc = RootView.open_doc
function RootView:open_doc(doc)
  local docview = RootView_open_doc(self, doc)
  -- The absence of the ephemeral flag means that before this moment in this
  -- node this document was not exists
  if docview.ephemeral == nil then
    local node = self:get_active_node_default()
    -- We assume that ephemeral tab is always the last one
    -- But user can drag and drop tabs so full check is needed
    for i, v in ipairs(node.views) do
      if v.ephemeral then
        node:close_view(self.root_node, v)
      end
    end
    docview.ephemeral = true
  end
  return docview
end

local Doc_get_name = DocView.get_name
function DocView:get_name()
  return self.doc and self.ephemeral and ("~ " .. Doc_get_name(self) .. " ~")
          or Doc_get_name(self)
end

-- Any change to the document makes the tab normal
local Doc_on_text_change = Doc.on_text_change
function Doc:on_text_change(type)
  core.active_view.ephemeral = false
  Doc_on_text_change(self, type)
end

-- Double clicking in the TreeView makes the tab normal
local TreeView_on_mouse_pressed = TreeView.on_mouse_pressed
function TreeView:on_mouse_pressed(button, x, y, clicks)
  local result = TreeView_on_mouse_pressed(self, button, x, y, clicks)
  if (clicks > 1) and (core.active_view.doc ~= nil) then
    core.active_view.ephemeral = false
  end
  return result
end

-- Double clicking on a tab makes it normal
local RootView_on_mouse_pressed = RootView.on_mouse_pressed
function RootView:on_mouse_pressed(button, x, y, clicks)
  if RootView_on_mouse_pressed(self, button, x, y, clicks) then
    if clicks > 1 then
      local node = self.root_node:get_child_overlapping_point(x, y)
      local idx = node:get_tab_overlapping_point(x, y)
      if idx then
        node.views[idx].ephemeral = false
      end
    end
    return true
  end
  return false
end

-- Dragging a tab makes it normal
local RootView_on_mouse_released = RootView.on_mouse_released
function RootView:on_mouse_released(button, x, y, ...)
  if self.dragged_node then
    if button == "left" then
      if self.dragged_node.dragging then
        local view = self.dragged_node.node.views[self.dragged_node.idx]
        view.ephemeral = false
      end
    end
  end
  return RootView_on_mouse_released(self, button, x, y, ...)
end