summaryrefslogtreecommitdiff
path: root/lain/widgets/contrib/task.lua
blob: 6425926a6232cb5c02197226492f5ab321bb53da (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

--[[
                                                  
     Licensed under GNU General Public License v2 
      * (c) 2013, Jan Xie                         
                                                  
--]]

local icons_dir    = require("lain.helpers").icons_dir

local awful        = require("awful")
local beautiful    = require("beautiful")
local naughty      = require("naughty")

local io           = io
local string       = { len = string.len }
local tonumber     = tonumber

local setmetatable = setmetatable

-- Taskwarrior notification
-- lain.widgets.contrib.task
local task = {}

local task_notification = nil

function task:hide()
    if task_notification ~= nil then
        naughty.destroy(task_notification)
        task_notification = nil
    end
end

function task:show()
    task:hide()

    local f, c_text

    f = io.popen('task')
    c_text = "<span font='"
             .. task.font .. " "
             .. task.font_size .. "'>"
             .. f:read("*all"):gsub("\n*$", "")
             .. "</span>"
    f:close()

    task_notification = naughty.notify({ title = "[task next]",
                                         text = c_text,
                                         icon = task.notify_icon,
                                         position = task.position,
                                         fg = task.fg,
                                         bg = task.bg,
                                         timeout = task.timeout,
                                     })
end

function task:prompt_add()
  awful.prompt.run({ prompt = "Add task: " },
      mypromptbox[mouse.screen].widget,
      function (...)
          local f = io.popen("task add " .. ...)
          c_text = "\n<span font='"
                   .. task.font .. " "
                   .. task.font_size .. "'>"
                   .. f:read("*all")
                   .. "</span>"
          f:close()

          naughty.notify({
              text     = c_text,
              icon     = task.notify_icon,
              position = task.position,
              fg       = task.fg,
              bg       = task.bg,
              timeout  = task.timeout,
          })
      end,
      nil,
      awful.util.getdir("cache") .. "/history_task_add")
end

function task:prompt_search()
  awful.prompt.run({ prompt = "Search task: " },
      mypromptbox[mouse.screen].widget,
      function (...)
          local f = io.popen("task " .. ...)
          c_text = f:read("*all"):gsub(" \n*$", "")
          f:close()

          if string.len(c_text) == 0
          then
              c_text = "No results found."
          else
              c_text = "<span font='"
                       .. task.font .. " "
                       .. task.font_size .. "'>"
                       .. c_text
                       .. "</span>"
          end

          naughty.notify({
              title    = "[task next " .. ... .. "]",
              text     = c_text,
              icon     = task.notify_icon,
              position = task.position,
              fg       = task.fg,
              bg       = task.bg,
              timeout  = task.timeout,
          })
      end,
      nil,
      awful.util.getdir("cache") .. "/history_task")
end

function task:attach(widget, args)
    local args     = args or {}

    task.font_size = tonumber(args.font_size) or 12
    task.font      = beautiful.font:sub(beautiful.font:find(""),
                     beautiful.font:find(" "))
    task.fg        = args.fg or beautiful.fg_normal or "#FFFFFF"
    task.bg        = args.bg or beautiful.bg_normal or "#FFFFFF"
    task.position  = args.position or "top_right"
    task.timeout   = args.timeout or 7

    task.notify_icon = icons_dir .. "/taskwarrior/task.png"
    task.notify_icon_small = icons_dir .. "/taskwarrior/tasksmall.png"

    widget:connect_signal("mouse::enter", function () task:show() end)
    widget:connect_signal("mouse::leave", function () task:hide() end)
end

return setmetatable(task, { __call = function(_, ...) return create(...) end })