Skip to content

Commit ad02c73

Browse files
committed
Added emoji group drop-down filter, to better sort and filter, and a custom Proxy class for filtering. Also enabled locale aware sorting on listview and treeviews.
1 parent be91f43 commit ad02c73

9 files changed

+52
-6
lines changed

src/windows/main_window.py

+2
Original file line numberDiff line numberDiff line change
@@ -2216,10 +2216,12 @@ def setup_toolbars(self):
22162216

22172217
# Add emojis toolbar
22182218
self.emojisToolbar = QToolBar("Emojis Toolbar")
2219+
self.emojiFilterGroup = QComboBox()
22192220
self.emojisFilter = QLineEdit()
22202221
self.emojisFilter.setObjectName("emojisFilter")
22212222
self.emojisFilter.setPlaceholderText(_("Filter"))
22222223
self.emojisFilter.setClearButtonEnabled(True)
2224+
self.emojisToolbar.addWidget(self.emojiFilterGroup)
22232225
self.emojisToolbar.addWidget(self.emojisFilter)
22242226
self.tabEmojis.layout().addWidget(self.emojisToolbar)
22252227

src/windows/models/emoji_model.py

+40-4
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,30 @@ def mimeData(self, indexes):
5959
return data
6060

6161

62+
class EmojiFilterProxyModel(QSortFilterProxyModel):
63+
"""Proxy class used for sorting and filtering model data"""
64+
65+
def filterAcceptsRow(self, sourceRow, sourceParent):
66+
"""Filter for emoji groups and text filter"""
67+
68+
if get_app().window.emojiFilterGroup.currentData() and \
69+
get_app().window.emojiFilterGroup.currentData() != "Show All":
70+
# Fetch the group name
71+
index = self.sourceModel().index(sourceRow, 2, sourceParent) # group name column
72+
group_name = self.sourceModel().data(index) # group name (i.e. common)
73+
74+
# Fetch the emoji name
75+
index = self.sourceModel().index(sourceRow, 0, sourceParent) # transition name column
76+
emoji_name = self.sourceModel().data(index) # emoji name (i.e. Smiley Face)
77+
78+
# Return, if regExp match in displayed format.
79+
return get_app().window.emojiFilterGroup.currentData() == group_name and \
80+
self.filterRegExp().indexIn(emoji_name) >= 0
81+
82+
# Continue running built-in parent filter logic
83+
return super(EmojiFilterProxyModel, self).filterAcceptsRow(sourceRow, sourceParent)
84+
85+
6286
class EmojisModel():
6387
def update_model(self, clear=True):
6488
log.info("updating emoji model.")
@@ -88,13 +112,14 @@ def update_model(self, clear=True):
88112

89113
# get a list of files in the OpenShot /emojis directory
90114
emojis_dir = os.path.join(info.PATH, "emojis", "color", "svg")
91-
transition_groups = [{"type": "common", "dir": emojis_dir, "files": os.listdir(emojis_dir)}, ]
115+
emoji_paths = [{"type": "common", "dir": emojis_dir, "files": os.listdir(emojis_dir)}, ]
116+
emoji_groups = {}
92117

93118
# Add optional user-defined transitions folder
94119
if os.path.exists(info.EMOJIS_PATH) and os.listdir(info.EMOJIS_PATH):
95-
transition_groups.append({"type": "user", "dir": info.EMOJIS_PATH, "files": os.listdir(info.EMOJIS_PATH)})
120+
emoji_paths.append({"type": "user", "dir": info.EMOJIS_PATH, "files": os.listdir(info.EMOJIS_PATH)})
96121

97-
for group in transition_groups:
122+
for group in emoji_paths:
98123
type = group["type"]
99124
dir = group["dir"]
100125
files = group["files"]
@@ -109,9 +134,13 @@ def update_model(self, clear=True):
109134

110135
# get name of transition
111136
emoji = emoji_lookup.get(fileBaseName, {})
112-
emoji_name = emoji.get("annotation", fileBaseName)
137+
emoji_name = _(emoji.get("annotation", fileBaseName).capitalize())
113138
emoji_type = emoji.get("group", "user")
114139

140+
# Track unique emoji groups
141+
if emoji_type not in emoji_groups.keys():
142+
emoji_groups[emoji_type] = emoji_type
143+
115144
# Check for thumbnail path (in build-in cache)
116145
thumb_path = os.path.join(info.IMAGES_PATH, "cache", "{}.png".format(fileBaseName))
117146

@@ -152,6 +181,7 @@ def update_model(self, clear=True):
152181
col.setIcon(QIcon(thumb_path))
153182
col.setText(emoji_name)
154183
col.setToolTip(emoji_name)
184+
col.setData(emoji_type)
155185
col.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsDragEnabled)
156186
row.append(col)
157187

@@ -181,6 +211,12 @@ def update_model(self, clear=True):
181211
self.model.appendRow(row)
182212
self.model_paths[path] = path
183213

214+
# Loop through emoji groups, and populate emoji filter drop-down
215+
get_app().window.emojiFilterGroup.clear()
216+
get_app().window.emojiFilterGroup.addItem(_("Show All"), "Show All")
217+
for emoji_type in sorted(emoji_groups.keys()):
218+
get_app().window.emojiFilterGroup.addItem(_(emoji_type.capitalize()), emoji_type)
219+
184220
def __init__(self, *args):
185221

186222
# Create standard model

src/windows/views/effects_listview.py

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def __init__(self, model):
8787
self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
8888
self.proxy_model.setSortCaseSensitivity(Qt.CaseSensitive)
8989
self.proxy_model.setSourceModel(self.effects_model.model)
90+
self.proxy_model.setSortLocaleAware(True)
9091

9192
# Keep track of mouse press start position to determine when to start drag
9293
self.setAcceptDrops(True)

src/windows/views/effects_treeview.py

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ def __init__(self, model):
9494
self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
9595
self.proxy_model.setSortCaseSensitivity(Qt.CaseSensitive)
9696
self.proxy_model.setSourceModel(self.effects_model.model)
97+
self.proxy_model.setSortLocaleAware(True)
9798

9899
# Keep track of mouse press start position to determine when to start drag
99100
self.setAcceptDrops(True)

src/windows/views/emojis_listview.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import openshot # Python module for libopenshot (required video editing module installed separately)
3434
from classes.query import File
3535
from classes.app import get_app
36-
from windows.models.emoji_model import EmojisModel
36+
from windows.models.emoji_model import EmojisModel, EmojiFilterProxyModel
3737
from classes.logger import log
3838
import json
3939

@@ -131,11 +131,12 @@ def __init__(self, model):
131131
self.emojis_model = model
132132

133133
# Create proxy model (for sorting and filtering)
134-
self.proxy_model = QSortFilterProxyModel(self)
134+
self.proxy_model = EmojiFilterProxyModel(self)
135135
self.proxy_model.setDynamicSortFilter(False)
136136
self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
137137
self.proxy_model.setSortCaseSensitivity(Qt.CaseSensitive)
138138
self.proxy_model.setSourceModel(self.emojis_model.model)
139+
self.proxy_model.setSortLocaleAware(True)
139140

140141
# Keep track of mouse press start position to determine when to start drag
141142
self.setAcceptDrops(True)
@@ -158,3 +159,4 @@ def __init__(self, model):
158159
# setup filter events
159160
app = get_app()
160161
app.window.emojisFilter.textChanged.connect(self.filter_changed)
162+
app.window.emojiFilterGroup.currentIndexChanged.connect(self.filter_changed)

src/windows/views/files_listview.py

+1
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ def __init__(self, model):
335335
self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
336336
self.proxy_model.setSortCaseSensitivity(Qt.CaseSensitive)
337337
self.proxy_model.setSourceModel(self.files_model.model)
338+
self.proxy_model.setSortLocaleAware(True)
338339

339340
# Keep track of mouse press start position to determine when to start drag
340341
self.setAcceptDrops(True)

src/windows/views/files_treeview.py

+1
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ def __init__(self, model):
387387
self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
388388
self.proxy_model.setSortCaseSensitivity(Qt.CaseSensitive)
389389
self.proxy_model.setSourceModel(self.files_model.model)
390+
self.proxy_model.setSortLocaleAware(True)
390391

391392
# Keep track of mouse press start position to determine when to start drag
392393
self.setAcceptDrops(True)

src/windows/views/transitions_listview.py

+1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ def __init__(self, model):
9191
self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
9292
self.proxy_model.setSortCaseSensitivity(Qt.CaseSensitive)
9393
self.proxy_model.setSourceModel(self.transition_model.model)
94+
self.proxy_model.setSortLocaleAware(True)
9495

9596
# Keep track of mouse press start position to determine when to start drag
9697
self.setAcceptDrops(True)

src/windows/views/transitions_treeview.py

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def __init__(self, model):
9595
self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
9696
self.proxy_model.setSortCaseSensitivity(Qt.CaseSensitive)
9797
self.proxy_model.setSourceModel(self.transition_model.model)
98+
self.proxy_model.setSortLocaleAware(True)
9899

99100
# Keep track of mouse press start position to determine when to start drag
100101
self.setAcceptDrops(True)

0 commit comments

Comments
 (0)