Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 90 additions & 14 deletions mymcplusplus/gui/dirlist_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,13 @@ def __init__(self, type, dirent, icon_sys, size, title):
self.size = size
self.title = title


def __init__(self, parent, evt_focus, evt_select, config):
self.config = config
self.selected = set()
self.dirtable = []
# current sort state for column header clicks
self.sort_column = self.Column.DIRECTORY
self.sort_reverse = False

self.evt_select = evt_select
wx.ListCtrl.__init__(self, parent, wx.ID_ANY,
Expand All @@ -63,7 +65,6 @@ def __init__(self, parent, evt_focus, evt_select, config):
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.evt_item_selected)
self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.evt_item_deselected)


def _update_dirtable(self, mc, dir):
self.dirtable = table = []
enc = "unicode"
Expand Down Expand Up @@ -91,7 +92,6 @@ def _update_dirtable(self, mc, dir):
size = mc.dir_size(dirpath)
table.append(self.TableEntry(type, ent, icon_sys, size, title))


def update_dirtable(self, mc):
self.dirtable = []
if mc is None:
Expand All @@ -102,30 +102,97 @@ def update_dirtable(self, mc):
finally:
dir.close()

def update_column_headers(self):
"""Update column texts with an arrow on the active sort column."""

def cmp_dir_name(self, i1, i2):
return self.dirtable[i1].dirent[8] > self.dirtable[i2].dirent[8]
# Base titles for each column
columns = [
(self.Column.DIRECTORY, "Directory"),
(self.Column.SIZE, "Size"),
(self.Column.MODIFIED, "Modified"),
(self.Column.DESCRIPTION, "Description"),
]

# Unicode arrows for clarity; switch to " ^"/" v" if you prefer ASCII
arrow_up = " ▲"
arrow_down = " ▼"

def cmp_dir_title(self, i1, i2):
return self.dirtable[i1].title > self.dirtable[i2].title
for col_enum, base in columns:
text = base
if col_enum == self.sort_column:
text += arrow_down if self.sort_reverse else arrow_up

item = self.GetColumn(col_enum.value)
item.SetText(text)
self.SetColumn(col_enum.value, item)

def cmp_dir_size(self, i1, i2):
return self.dirtable[i1].size > self.dirtable[i2].size
def _apply_sort_direction(self, result):
"""Flip the comparison result if we're in reverse-sort mode.

wx.ListCtrl.SortItems expects a negative/zero/positive integer.
"""
if self.sort_reverse:
return -result
return result

def cmp_dir_name(self, i1, i2):
v1 = self.dirtable[i1].dirent[8]
v2 = self.dirtable[i2].dirent[8]
if v1 < v2:
result = -1
elif v1 > v2:
result = 1
else:
result = 0
return self._apply_sort_direction(result)

def cmp_dir_title(self, i1, i2):
v1 = self.dirtable[i1].title
v2 = self.dirtable[i2].title
if v1 < v2:
result = -1
elif v1 > v2:
result = 1
else:
result = 0
return self._apply_sort_direction(result)

def cmp_dir_size(self, i1, i2):
v1 = self.dirtable[i1].size
v2 = self.dirtable[i2].size
if v1 < v2:
result = -1
elif v1 > v2:
result = 1
else:
result = 0
return self._apply_sort_direction(result)

def cmp_dir_modified(self, i1, i2):
m1 = list(self.dirtable[i1].dirent[6])
m2 = list(self.dirtable[i2].dirent[6])
# dirent[6] is a tuple like (sec, min, hour, day, month, year)
# Reverse so that comparisons happen in chronological order.
m1.reverse()
m2.reverse()
return m1 > m2

if m1 < m2:
result = -1
elif m1 > m2:
result = 1
else:
result = 0
return self._apply_sort_direction(result)

def evt_col_click(self, event):
col = self.Column(event.Column)

# Clicking the same column toggles ascending/descending.
if col == self.sort_column:
self.sort_reverse = not self.sort_reverse
else:
self.sort_column = col
self.sort_reverse = False

if col == self.Column.DIRECTORY:
cmp = self.cmp_dir_name
elif col == self.Column.SIZE:
Expand All @@ -136,19 +203,21 @@ def evt_col_click(self, event):
cmp = self.cmp_dir_title
else:
return
self.SortItems(cmp)

# Update header text to show the arrow for the active sort
self.update_column_headers()

# Apply the sort
self.SortItems(cmp)

def evt_item_selected(self, event):
self.selected.add(event.GetData())
self.evt_select(event)


def evt_item_deselected(self, event):
self.selected.discard(event.GetData())
self.evt_select(event)


def update(self, mc):
"""Update the ListCtrl according to the contents of the
memory card image."""
Expand All @@ -171,6 +240,11 @@ def update(self, mc):
column.SetAlign(align)
self.InsertColumn(index, column)

# Default sort: directory name ascending
self.sort_column = self.Column.DIRECTORY
self.sort_reverse = False
self.update_column_headers()

self.update_dirtable(mc)

empty = len(self.dirtable) == 0
Expand All @@ -192,4 +266,6 @@ def update(self, mc):
for i in range(4):
self.SetColumnWidth(i, wx.LIST_AUTOSIZE)
self.SetColumnWidth(i, self.GetColumnWidth(i) + du)

# Apply default sort (Directory, ascending)
self.SortItems(self.cmp_dir_name)
Loading