------------------------------------------------------------ -- Menu visuals local mp = require('mp') local assdraw = require('mp.assdraw') local Menu = assdraw.ass_new() function Menu:new(o) self.__index = self o = o or {} o.selected = o.selected or 1 o.canvas_width = o.canvas_width or 1280 o.canvas_height = o.canvas_height or 720 o.pos_x = o.pos_x or 0 o.pos_y = o.pos_y or 0 o.rect_width = o.rect_width or 320 o.rect_height = o.rect_height or 40 o.active_color = o.active_color or 'ffffff' o.inactive_color = o.inactive_color or 'aaaaaa' o.border_color = o.border_color or '000000' o.text_color = o.text_color or 'ffffff' return setmetatable(o, self) end function Menu:set_position(x, y) self.pos_x = x self.pos_y = y end function Menu:font_size(size) self:append(string.format([[{\fs%s}]], size)) end function Menu:set_text_color(code) self:append(string.format("{\\1c&H%s%s%s&\\1a&H05&}", code:sub(5, 6), code:sub(3, 4), code:sub(1, 2))) end function Menu:set_border_color(code) self:append(string.format("{\\3c&H%s%s%s&}", code:sub(5, 6), code:sub(3, 4), code:sub(1, 2))) end function Menu:apply_text_color() self:set_border_color(self.border_color) self:set_text_color(self.text_color) end function Menu:apply_rect_color(i) self:set_border_color(self.border_color) if i == self.selected then self:set_text_color(self.active_color) else self:set_text_color(self.inactive_color) end end function Menu:draw_text(i) local padding = 5 local font_size = 25 self:new_event() self:pos(self.pos_x + padding, self.pos_y + self.rect_height * (i - 1) + padding) self:font_size(font_size) self:apply_text_color(i) self:append(self.items[i]) end function Menu:draw_item(i) self:new_event() self:pos(self.pos_x, self.pos_y) self:apply_rect_color(i) self:draw_start() self:rect_cw(0, 0 + (i - 1) * self.rect_height, self.rect_width, i * self.rect_height) self:draw_stop() self:draw_text(i) end function Menu:draw() self.text = '' for i, _ in ipairs(self.items) do self:draw_item(i) end mp.set_osd_ass(self.canvas_width, self.canvas_height, self.text) end function Menu:erase() mp.set_osd_ass(self.canvas_width, self.canvas_height, '') end function Menu:up() self.selected = self.selected - 1 if self.selected == 0 then self.selected = #self.items end self:draw() end function Menu:down() self.selected = self.selected + 1 if self.selected > #self.items then self.selected = 1 end self:draw() end return Menu