From: Samir Benmendil Date: Wed, 5 Aug 2020 19:27:03 +0000 (+0100) Subject: awesome/mpd_widget: turn it into a "class" X-Git-Url: https://git.rmz.io/dotfiles.git/commitdiff_plain/1529a3b60191542f2283015ec4bf1faea8f4725b?ds=inline awesome/mpd_widget: turn it into a "class" --- diff --git a/awesome/widgets/mpd_widget.lua b/awesome/widgets/mpd_widget.lua index e68fd8c..f5f0ce7 100644 --- a/awesome/widgets/mpd_widget.lua +++ b/awesome/widgets/mpd_widget.lua @@ -8,40 +8,23 @@ local timer = require("gears.timer") --TODO remove local dbg = require("gears.debug") -mpd_widget = textbox() +local widget = {} +widget._textbox = textbox() +widget._currentsong = {} -local function update_widget() +function widget:update_widget() local text = "" - if state == "pause" then - text = "|| " - end + local artist = self._currentsong.artist + local title = self._currentsong.title + local file = self._currentsong.file text = text .. tostring(artist or "") .. " - " .. tostring(title or "") - mpd_widget.text = text -end - -local connection -local function error_handler(err) - mpd_widget:set_text("Error: " .. tostring(err)) - timer.start_new(10, function() - connection:send("ping") - end) -end - -connection = mpc.new(nil, nil, nil, error_handler, - "status", function(_, result) - state = result.state - end, - "currentsong", function(_, result) - title, artist, file = result.title, result.artist, result.file - pcall(update_widget) + if not artist then + text = string.format("%s", title or file ) + else + text = string.format("%s - %s", artist, title) end -) - -mpd_widget:buttons(gears.table.join( - awful.button({}, 1, function() connection:toggle_play() end) -, awful.button({}, 4, function() connection:change_volume(5) end) -, awful.button({}, 5, function() connection:change_volume(-5) end)) -) + self._textbox.text = text +end local function sec_to_min(sec) m, s = math.modf((sec or 0.0) / 60) @@ -52,16 +35,14 @@ local function song_duration(elapsed, duration) return sec_to_min(elapsed) .. "/" .. sec_to_min(duration) end -local function get_info(callback) +function widget:get_info(callback) local status = nil - connection:send("status", function(_, s) status = s end) + self._connection:send("status", function(_, s) status = s end) local song = nil - connection:send("currentsong", function(_, s) song = s end) + self._connection:send("currentsong", function(_, s) song = s end) - connection:send("ping", function() - dbg.dump(status) - dbg.dump(song) + self._connection:send("ping", function() local info = {} info.title = status.state .. " " .. status.song .. "/" .. status.playlistlength .. " " .. song_duration(status.elapsed, status.duration) @@ -72,51 +53,104 @@ local function get_info(callback) end) end -local popup = {} -function popup:show() - get_info(function(table) - if self._notification ~= nil then return end +function widget:popup_show() + self:get_info(function(table) + if self._notification then return end self._notification = naughty.notify( { title = table.title -- , icon = img , text = table.text , timeout = 0 + , destroy = function() self._timer:stop() end }) + self._timer:start() end) end -function popup:hide() - if self._notification ~= nil then - naughty.destroy(self._notification) - self._notification = nil +function widget:popup_hide(delay) + if self._hide_timer and self._hide_timer.started then + self._hide_timer:again() + else + self._hide_timer = timer( + { timeout = delay + , autostart = true + , single_shot = true + , callback = function() + if self._hover then return end + if not self._notification then return end + naughty.destroy(self._notification) + self._notification = nil + end + }) end end -function popup:update() - get_info(function(table) - if self._notification == nil then return end +function widget:popup_update() + self:get_info(function(table) + if not self._notification then return end naughty.replace_text(self._notification, table.title, table.text) end) end -function popup:run() +function widget:popup_oneshot(timeout) + if self._notification then + self:popup_update() + self:popup_hide(5) + else + self:popup_show() + self:popup_hide(5) + end +end + +function widget:error_handler(err) + self._textbox:set_text("Error: " .. tostring(err)) + timer.start_new(10, function() + self._connection:send("ping") + end) +end + +function widget:run() + self._connection = mpc.new(nil, nil, nil, function(err) self:error_handler(err) end, + "status", function(_, result) + if not self._status or result.state ~= self._status.state then + self._status = result + self:update_widget() + self:popup_oneshot(5) + end + end, + "currentsong", function(_, result) + if not self._currentsong or result.id ~= self._currentsong.id then + self._currentsong = result + self:update_widget() + self:popup_oneshot(5) + end + end + ) + self._timer = timer({ timeout = 1 }) - self._timer:connect_signal("start", function() self:show() end) - self._timer:connect_signal("timeout", function() self:update() end) - self._timer:connect_signal("stop", function() self:hide() end) --TODO delay + self._timer:connect_signal("timeout", function() self:popup_update() end) - mpd_widget:connect_signal("mouse::enter", function() self._timer:again() end) - mpd_widget:connect_signal("mouse::leave", function() self._timer:stop() end) + self._hover = false; + self._textbox:connect_signal("mouse::enter", function() self._hover = true; self:popup_show() end) + self._textbox:connect_signal("mouse::leave", function() self._hover = false; self:popup_hide(2) end) end -popup:run() +widget:run() + +widget._textbox:buttons(gears.table.join( + awful.button({}, 1, function() widget._connection:toggle_play() end) +, awful.button({}, 4, function() widget._connection:change_volume(5) end) +, awful.button({}, 5, function() widget._connection:change_volume(-5) end)) +) globalkeys = gears.table.join(globalkeys, - awful.key({ modkey }, "p", function() connection:toggle_play() end, + awful.key({ modkey }, "p", function() widget._connection:toggle_play() end, { description = "toogle play", group = "mpd" }), - awful.key({ modkey }, ",", function() connection:send("previous") end, + awful.key({ modkey }, "'", function() widget:popup_oneshot(5) end, + { description = "show more info", group = "mpd" }), + awful.key({ modkey }, ",", function() widget._connection:send("previous") end, { description = "previous track", group = "mpd" }), - awful.key({ modkey }, ".", function() connection:send("next") end, + awful.key({ modkey }, ".", function() widget._connection:send("next") end, { description = "next track", group = "mpd" }) ) -return mpd_widget +return widget._textbox