From 8ff846ba6e1ad3f554d6409c231f569b3a147feb Mon Sep 17 00:00:00 2001 From: hius07 <62179190+hius07@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:30:02 +0300 Subject: [PATCH] SortWidget: sort alphabetically (#11705) --- frontend/ui/widget/sortwidget.lua | 83 +++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/frontend/ui/widget/sortwidget.lua b/frontend/ui/widget/sortwidget.lua index 8cfec46a8..5ef050ea8 100644 --- a/frontend/ui/widget/sortwidget.lua +++ b/frontend/ui/widget/sortwidget.lua @@ -2,6 +2,7 @@ local BD = require("ui/bidi") local Blitbuffer = require("ffi/blitbuffer") local BottomContainer = require("ui/widget/container/bottomcontainer") local Button = require("ui/widget/button") +local ButtonDialog = require("ui/widget/buttondialog") local CenterContainer = require("ui/widget/container/centercontainer") local CheckMark = require("ui/widget/checkmark") local Device = require("device") @@ -132,7 +133,7 @@ local SortWidget = FocusManager:extend{ -- table of items to sort item_table = nil, -- mandatory (array) callback = nil, - sort_disabled = false + sort_disabled = false, } function SortWidget:init() @@ -294,6 +295,8 @@ function SortWidget:init() bottom_line_color = Blitbuffer.COLOR_DARK_GRAY, bottom_line_h_padding = padding, title = self.title, + left_icon = not self.sort_disabled and "appbar.menu", + left_icon_tap_callback = function() self:showMenu() end, close_callback = function() self:onClose() end, show_parent = self, } @@ -338,24 +341,24 @@ function SortWidget:init() end function SortWidget:nextPage() - local new_page = math.min(self.show_page+1, self.pages) - if new_page > self.show_page then - self.show_page = new_page - if self.marked > 0 then + if self.show_page < self.pages then + self.show_page = self.show_page + 1 + if self.marked > 0 then -- put selected item first in the page self:moveItem(self.items_per_page * (self.show_page - 1) + 1 - self.marked) + else + self:_populateItems() end - self:_populateItems() end end function SortWidget:prevPage() - local new_page = math.max(self.show_page-1, 1) - if new_page < self.show_page then - self.show_page = new_page - if self.marked > 0 then + if self.show_page > 1 then + self.show_page = self.show_page - 1 + if self.marked > 0 then -- put selected item first in the page self:moveItem(self.items_per_page * (self.show_page - 1) + 1 - self.marked) + else + self:_populateItems() end - self:_populateItems() end end @@ -472,6 +475,64 @@ function SortWidget:onSwipe(arg, ges_ev) end end +function SortWidget:showMenu() + local dialog + local buttons = { + {{ + text = _("Sort A to Z"), + align = "left", + callback = function() + UIManager:close(dialog) + self:sortItems("strcoll") + end, + }}, + {{ + text = _("Sort Z to A"), + align = "left", + callback = function() + UIManager:close(dialog) + self:sortItems("strcoll", true) + end, + }}, + {{ + text = _("Sort A to Z (natural)"), + align = "left", + callback = function() + UIManager:close(dialog) + self:sortItems("natural") + end, + }}, + {{ + text = _("Sort Z to A (natural)"), + align = "left", + callback = function() + UIManager:close(dialog) + self:sortItems("natural", true) + end, + }}, + } + dialog = ButtonDialog:new{ + shrink_unneeded_width = true, + buttons = buttons, + anchor = function() + return self.title_bar.left_button.image.dimen + end, + } + UIManager:show(dialog) +end + +function SortWidget:sortItems(collate, reverse_collate) + if not self.orig_item_table then + self.orig_item_table = util.tableDeepCopy(self.item_table) + end + local FileChooser = require("ui/widget/filechooser") + local sort_func = FileChooser:getSortingFunction(FileChooser.collates[collate], reverse_collate) + table.sort(self.item_table, sort_func) + self.show_page = 1 + self.marked = 1 -- enable cancel button + self:_populateItems() +end + function SortWidget:onClose() UIManager:close(self) UIManager:setDirty(nil, "ui")