diff --git a/data/gschemas.compiled b/data/gschemas.compiled
new file mode 100644
index 0000000..0c2a5c6
Binary files /dev/null and b/data/gschemas.compiled differ
diff --git a/data/jp.angeltech.MoeMoji.gschema.xml b/data/jp.angeltech.MoeMoji.gschema.xml
index c9c7839..96b9558 100644
--- a/data/jp.angeltech.MoeMoji.gschema.xml
+++ b/data/jp.angeltech.MoeMoji.gschema.xml
@@ -4,7 +4,17 @@
'alpha-asc'
Category sort order
- How categories are sorted: alpha-asc, alpha-desc, modified-asc, modified-desc, created-asc, created-desc
+ How categories are sorted: alpha-asc, alpha-desc, modified-asc, modified-desc
+
+
+ ['happy', 'love', 'greeting', 'hugging', 'friends', 'winking', 'sympathy', 'music', 'magic', 'surprise', 'food', 'games', 'faces', 'running', 'sleeping', 'writing', 'special', 'nosebleeding', 'apologizing', 'hiding', 'embarassment', 'confusion', 'doubt', 'indifference', 'dissatisfaction', 'fear', 'sadness', 'pain', 'anger', 'enemies', 'weapons', 'cat', 'dog', 'bear', 'rabbit', 'bird', 'fish', 'pig', 'spider']
+ Category order
+ Ordered list of category directory basenames for custom sidebar/content ordering
+
+
+ []
+ Pinned kaomojis
+ List of pinned kaomoji strings shown in the sidebar
diff --git a/data/kaomoji/anger/.name b/data/kaomoji/anger/.name
new file mode 100644
index 0000000..ef58713
--- /dev/null
+++ b/data/kaomoji/anger/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ anger
diff --git a/data/kaomoji/13 - anger/1.txt b/data/kaomoji/anger/1.txt
similarity index 100%
rename from data/kaomoji/13 - anger/1.txt
rename to data/kaomoji/anger/1.txt
diff --git a/data/kaomoji/13 - anger/10.txt b/data/kaomoji/anger/10.txt
similarity index 100%
rename from data/kaomoji/13 - anger/10.txt
rename to data/kaomoji/anger/10.txt
diff --git a/data/kaomoji/13 - anger/11.txt b/data/kaomoji/anger/11.txt
similarity index 100%
rename from data/kaomoji/13 - anger/11.txt
rename to data/kaomoji/anger/11.txt
diff --git a/data/kaomoji/13 - anger/12.txt b/data/kaomoji/anger/12.txt
similarity index 100%
rename from data/kaomoji/13 - anger/12.txt
rename to data/kaomoji/anger/12.txt
diff --git a/data/kaomoji/13 - anger/13.txt b/data/kaomoji/anger/13.txt
similarity index 100%
rename from data/kaomoji/13 - anger/13.txt
rename to data/kaomoji/anger/13.txt
diff --git a/data/kaomoji/13 - anger/14.txt b/data/kaomoji/anger/14.txt
similarity index 100%
rename from data/kaomoji/13 - anger/14.txt
rename to data/kaomoji/anger/14.txt
diff --git a/data/kaomoji/13 - anger/15.txt b/data/kaomoji/anger/15.txt
similarity index 100%
rename from data/kaomoji/13 - anger/15.txt
rename to data/kaomoji/anger/15.txt
diff --git a/data/kaomoji/13 - anger/16.txt b/data/kaomoji/anger/16.txt
similarity index 100%
rename from data/kaomoji/13 - anger/16.txt
rename to data/kaomoji/anger/16.txt
diff --git a/data/kaomoji/13 - anger/17.txt b/data/kaomoji/anger/17.txt
similarity index 100%
rename from data/kaomoji/13 - anger/17.txt
rename to data/kaomoji/anger/17.txt
diff --git a/data/kaomoji/13 - anger/18.txt b/data/kaomoji/anger/18.txt
similarity index 100%
rename from data/kaomoji/13 - anger/18.txt
rename to data/kaomoji/anger/18.txt
diff --git a/data/kaomoji/13 - anger/19.txt b/data/kaomoji/anger/19.txt
similarity index 100%
rename from data/kaomoji/13 - anger/19.txt
rename to data/kaomoji/anger/19.txt
diff --git a/data/kaomoji/13 - anger/2.txt b/data/kaomoji/anger/2.txt
similarity index 100%
rename from data/kaomoji/13 - anger/2.txt
rename to data/kaomoji/anger/2.txt
diff --git a/data/kaomoji/13 - anger/20.txt b/data/kaomoji/anger/20.txt
similarity index 100%
rename from data/kaomoji/13 - anger/20.txt
rename to data/kaomoji/anger/20.txt
diff --git a/data/kaomoji/13 - anger/21.txt b/data/kaomoji/anger/21.txt
similarity index 100%
rename from data/kaomoji/13 - anger/21.txt
rename to data/kaomoji/anger/21.txt
diff --git a/data/kaomoji/13 - anger/22.txt b/data/kaomoji/anger/22.txt
similarity index 100%
rename from data/kaomoji/13 - anger/22.txt
rename to data/kaomoji/anger/22.txt
diff --git a/data/kaomoji/13 - anger/23.txt b/data/kaomoji/anger/23.txt
similarity index 100%
rename from data/kaomoji/13 - anger/23.txt
rename to data/kaomoji/anger/23.txt
diff --git a/data/kaomoji/13 - anger/24.txt b/data/kaomoji/anger/24.txt
similarity index 100%
rename from data/kaomoji/13 - anger/24.txt
rename to data/kaomoji/anger/24.txt
diff --git a/data/kaomoji/13 - anger/25.txt b/data/kaomoji/anger/25.txt
similarity index 100%
rename from data/kaomoji/13 - anger/25.txt
rename to data/kaomoji/anger/25.txt
diff --git a/data/kaomoji/13 - anger/26.txt b/data/kaomoji/anger/26.txt
similarity index 100%
rename from data/kaomoji/13 - anger/26.txt
rename to data/kaomoji/anger/26.txt
diff --git a/data/kaomoji/13 - anger/27.txt b/data/kaomoji/anger/27.txt
similarity index 100%
rename from data/kaomoji/13 - anger/27.txt
rename to data/kaomoji/anger/27.txt
diff --git a/data/kaomoji/13 - anger/28.txt b/data/kaomoji/anger/28.txt
similarity index 100%
rename from data/kaomoji/13 - anger/28.txt
rename to data/kaomoji/anger/28.txt
diff --git a/data/kaomoji/13 - anger/29.txt b/data/kaomoji/anger/29.txt
similarity index 100%
rename from data/kaomoji/13 - anger/29.txt
rename to data/kaomoji/anger/29.txt
diff --git a/data/kaomoji/13 - anger/3.txt b/data/kaomoji/anger/3.txt
similarity index 100%
rename from data/kaomoji/13 - anger/3.txt
rename to data/kaomoji/anger/3.txt
diff --git a/data/kaomoji/13 - anger/30.txt b/data/kaomoji/anger/30.txt
similarity index 100%
rename from data/kaomoji/13 - anger/30.txt
rename to data/kaomoji/anger/30.txt
diff --git a/data/kaomoji/13 - anger/31.txt b/data/kaomoji/anger/31.txt
similarity index 100%
rename from data/kaomoji/13 - anger/31.txt
rename to data/kaomoji/anger/31.txt
diff --git a/data/kaomoji/13 - anger/32.txt b/data/kaomoji/anger/32.txt
similarity index 100%
rename from data/kaomoji/13 - anger/32.txt
rename to data/kaomoji/anger/32.txt
diff --git a/data/kaomoji/13 - anger/33.txt b/data/kaomoji/anger/33.txt
similarity index 100%
rename from data/kaomoji/13 - anger/33.txt
rename to data/kaomoji/anger/33.txt
diff --git a/data/kaomoji/13 - anger/34.txt b/data/kaomoji/anger/34.txt
similarity index 100%
rename from data/kaomoji/13 - anger/34.txt
rename to data/kaomoji/anger/34.txt
diff --git a/data/kaomoji/13 - anger/4.txt b/data/kaomoji/anger/4.txt
similarity index 100%
rename from data/kaomoji/13 - anger/4.txt
rename to data/kaomoji/anger/4.txt
diff --git a/data/kaomoji/13 - anger/5.txt b/data/kaomoji/anger/5.txt
similarity index 100%
rename from data/kaomoji/13 - anger/5.txt
rename to data/kaomoji/anger/5.txt
diff --git a/data/kaomoji/13 - anger/6.txt b/data/kaomoji/anger/6.txt
similarity index 100%
rename from data/kaomoji/13 - anger/6.txt
rename to data/kaomoji/anger/6.txt
diff --git a/data/kaomoji/13 - anger/7.txt b/data/kaomoji/anger/7.txt
similarity index 100%
rename from data/kaomoji/13 - anger/7.txt
rename to data/kaomoji/anger/7.txt
diff --git a/data/kaomoji/13 - anger/8.txt b/data/kaomoji/anger/8.txt
similarity index 100%
rename from data/kaomoji/13 - anger/8.txt
rename to data/kaomoji/anger/8.txt
diff --git a/data/kaomoji/13 - anger/9.txt b/data/kaomoji/anger/9.txt
similarity index 100%
rename from data/kaomoji/13 - anger/9.txt
rename to data/kaomoji/anger/9.txt
diff --git a/data/kaomoji/apologizing/.name b/data/kaomoji/apologizing/.name
new file mode 100644
index 0000000..093cbcc
--- /dev/null
+++ b/data/kaomoji/apologizing/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ apologizing
diff --git a/data/kaomoji/5 - apologizing/1.txt b/data/kaomoji/apologizing/1.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/1.txt
rename to data/kaomoji/apologizing/1.txt
diff --git a/data/kaomoji/5 - apologizing/2.txt b/data/kaomoji/apologizing/2.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/2.txt
rename to data/kaomoji/apologizing/2.txt
diff --git a/data/kaomoji/5 - apologizing/3.txt b/data/kaomoji/apologizing/3.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/3.txt
rename to data/kaomoji/apologizing/3.txt
diff --git a/data/kaomoji/5 - apologizing/4.txt b/data/kaomoji/apologizing/4.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/4.txt
rename to data/kaomoji/apologizing/4.txt
diff --git a/data/kaomoji/5 - apologizing/5.txt b/data/kaomoji/apologizing/5.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/5.txt
rename to data/kaomoji/apologizing/5.txt
diff --git a/data/kaomoji/5 - apologizing/6.txt b/data/kaomoji/apologizing/6.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/6.txt
rename to data/kaomoji/apologizing/6.txt
diff --git a/data/kaomoji/5 - apologizing/7.txt b/data/kaomoji/apologizing/7.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/7.txt
rename to data/kaomoji/apologizing/7.txt
diff --git a/data/kaomoji/5 - apologizing/8.txt b/data/kaomoji/apologizing/8.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/8.txt
rename to data/kaomoji/apologizing/8.txt
diff --git a/data/kaomoji/5 - apologizing/9.txt b/data/kaomoji/apologizing/9.txt
similarity index 100%
rename from data/kaomoji/5 - apologizing/9.txt
rename to data/kaomoji/apologizing/9.txt
diff --git a/data/kaomoji/bear/.name b/data/kaomoji/bear/.name
new file mode 100644
index 0000000..d6a7c5c
--- /dev/null
+++ b/data/kaomoji/bear/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ bear
diff --git a/data/kaomoji/bird/.name b/data/kaomoji/bird/.name
new file mode 100644
index 0000000..cee1d3d
--- /dev/null
+++ b/data/kaomoji/bird/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ bird
diff --git a/data/kaomoji/cat/.name b/data/kaomoji/cat/.name
new file mode 100644
index 0000000..739873b
--- /dev/null
+++ b/data/kaomoji/cat/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ cat
diff --git a/data/kaomoji/confusion/.name b/data/kaomoji/confusion/.name
new file mode 100644
index 0000000..bdb1f1a
--- /dev/null
+++ b/data/kaomoji/confusion/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ confusion
diff --git a/data/kaomoji/9 - confusion/1.txt b/data/kaomoji/confusion/1.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/1.txt
rename to data/kaomoji/confusion/1.txt
diff --git a/data/kaomoji/9 - confusion/10.txt b/data/kaomoji/confusion/10.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/10.txt
rename to data/kaomoji/confusion/10.txt
diff --git a/data/kaomoji/9 - confusion/11.txt b/data/kaomoji/confusion/11.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/11.txt
rename to data/kaomoji/confusion/11.txt
diff --git a/data/kaomoji/9 - confusion/12.txt b/data/kaomoji/confusion/12.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/12.txt
rename to data/kaomoji/confusion/12.txt
diff --git a/data/kaomoji/9 - confusion/13.txt b/data/kaomoji/confusion/13.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/13.txt
rename to data/kaomoji/confusion/13.txt
diff --git a/data/kaomoji/9 - confusion/14.txt b/data/kaomoji/confusion/14.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/14.txt
rename to data/kaomoji/confusion/14.txt
diff --git a/data/kaomoji/9 - confusion/15.txt b/data/kaomoji/confusion/15.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/15.txt
rename to data/kaomoji/confusion/15.txt
diff --git a/data/kaomoji/9 - confusion/16.txt b/data/kaomoji/confusion/16.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/16.txt
rename to data/kaomoji/confusion/16.txt
diff --git a/data/kaomoji/9 - confusion/17.txt b/data/kaomoji/confusion/17.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/17.txt
rename to data/kaomoji/confusion/17.txt
diff --git a/data/kaomoji/9 - confusion/18.txt b/data/kaomoji/confusion/18.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/18.txt
rename to data/kaomoji/confusion/18.txt
diff --git a/data/kaomoji/9 - confusion/19.txt b/data/kaomoji/confusion/19.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/19.txt
rename to data/kaomoji/confusion/19.txt
diff --git a/data/kaomoji/9 - confusion/2.txt b/data/kaomoji/confusion/2.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/2.txt
rename to data/kaomoji/confusion/2.txt
diff --git a/data/kaomoji/9 - confusion/20.txt b/data/kaomoji/confusion/20.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/20.txt
rename to data/kaomoji/confusion/20.txt
diff --git a/data/kaomoji/9 - confusion/21.txt b/data/kaomoji/confusion/21.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/21.txt
rename to data/kaomoji/confusion/21.txt
diff --git a/data/kaomoji/9 - confusion/22.txt b/data/kaomoji/confusion/22.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/22.txt
rename to data/kaomoji/confusion/22.txt
diff --git a/data/kaomoji/9 - confusion/23.txt b/data/kaomoji/confusion/23.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/23.txt
rename to data/kaomoji/confusion/23.txt
diff --git a/data/kaomoji/9 - confusion/24.txt b/data/kaomoji/confusion/24.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/24.txt
rename to data/kaomoji/confusion/24.txt
diff --git a/data/kaomoji/9 - confusion/25.txt b/data/kaomoji/confusion/25.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/25.txt
rename to data/kaomoji/confusion/25.txt
diff --git a/data/kaomoji/9 - confusion/26.txt b/data/kaomoji/confusion/26.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/26.txt
rename to data/kaomoji/confusion/26.txt
diff --git a/data/kaomoji/9 - confusion/3.txt b/data/kaomoji/confusion/3.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/3.txt
rename to data/kaomoji/confusion/3.txt
diff --git a/data/kaomoji/9 - confusion/4.txt b/data/kaomoji/confusion/4.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/4.txt
rename to data/kaomoji/confusion/4.txt
diff --git a/data/kaomoji/9 - confusion/5.txt b/data/kaomoji/confusion/5.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/5.txt
rename to data/kaomoji/confusion/5.txt
diff --git a/data/kaomoji/9 - confusion/6.txt b/data/kaomoji/confusion/6.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/6.txt
rename to data/kaomoji/confusion/6.txt
diff --git a/data/kaomoji/9 - confusion/7.txt b/data/kaomoji/confusion/7.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/7.txt
rename to data/kaomoji/confusion/7.txt
diff --git a/data/kaomoji/9 - confusion/8.txt b/data/kaomoji/confusion/8.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/8.txt
rename to data/kaomoji/confusion/8.txt
diff --git a/data/kaomoji/9 - confusion/9.txt b/data/kaomoji/confusion/9.txt
similarity index 100%
rename from data/kaomoji/9 - confusion/9.txt
rename to data/kaomoji/confusion/9.txt
diff --git a/data/kaomoji/dissatisfaction/.name b/data/kaomoji/dissatisfaction/.name
new file mode 100644
index 0000000..c82dda9
--- /dev/null
+++ b/data/kaomoji/dissatisfaction/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ dissatisfaction
diff --git a/data/kaomoji/6 - dissatisfaction/1.txt b/data/kaomoji/dissatisfaction/1.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/1.txt
rename to data/kaomoji/dissatisfaction/1.txt
diff --git a/data/kaomoji/6 - dissatisfaction/10.txt b/data/kaomoji/dissatisfaction/10.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/10.txt
rename to data/kaomoji/dissatisfaction/10.txt
diff --git a/data/kaomoji/6 - dissatisfaction/11.txt b/data/kaomoji/dissatisfaction/11.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/11.txt
rename to data/kaomoji/dissatisfaction/11.txt
diff --git a/data/kaomoji/6 - dissatisfaction/12.txt b/data/kaomoji/dissatisfaction/12.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/12.txt
rename to data/kaomoji/dissatisfaction/12.txt
diff --git a/data/kaomoji/6 - dissatisfaction/13.txt b/data/kaomoji/dissatisfaction/13.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/13.txt
rename to data/kaomoji/dissatisfaction/13.txt
diff --git a/data/kaomoji/6 - dissatisfaction/14.txt b/data/kaomoji/dissatisfaction/14.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/14.txt
rename to data/kaomoji/dissatisfaction/14.txt
diff --git a/data/kaomoji/6 - dissatisfaction/15.txt b/data/kaomoji/dissatisfaction/15.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/15.txt
rename to data/kaomoji/dissatisfaction/15.txt
diff --git a/data/kaomoji/6 - dissatisfaction/16.txt b/data/kaomoji/dissatisfaction/16.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/16.txt
rename to data/kaomoji/dissatisfaction/16.txt
diff --git a/data/kaomoji/6 - dissatisfaction/17.txt b/data/kaomoji/dissatisfaction/17.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/17.txt
rename to data/kaomoji/dissatisfaction/17.txt
diff --git a/data/kaomoji/6 - dissatisfaction/18.txt b/data/kaomoji/dissatisfaction/18.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/18.txt
rename to data/kaomoji/dissatisfaction/18.txt
diff --git a/data/kaomoji/6 - dissatisfaction/19.txt b/data/kaomoji/dissatisfaction/19.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/19.txt
rename to data/kaomoji/dissatisfaction/19.txt
diff --git a/data/kaomoji/6 - dissatisfaction/2.txt b/data/kaomoji/dissatisfaction/2.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/2.txt
rename to data/kaomoji/dissatisfaction/2.txt
diff --git a/data/kaomoji/6 - dissatisfaction/20.txt b/data/kaomoji/dissatisfaction/20.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/20.txt
rename to data/kaomoji/dissatisfaction/20.txt
diff --git a/data/kaomoji/6 - dissatisfaction/21.txt b/data/kaomoji/dissatisfaction/21.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/21.txt
rename to data/kaomoji/dissatisfaction/21.txt
diff --git a/data/kaomoji/6 - dissatisfaction/22.txt b/data/kaomoji/dissatisfaction/22.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/22.txt
rename to data/kaomoji/dissatisfaction/22.txt
diff --git a/data/kaomoji/6 - dissatisfaction/23.txt b/data/kaomoji/dissatisfaction/23.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/23.txt
rename to data/kaomoji/dissatisfaction/23.txt
diff --git a/data/kaomoji/6 - dissatisfaction/24.txt b/data/kaomoji/dissatisfaction/24.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/24.txt
rename to data/kaomoji/dissatisfaction/24.txt
diff --git a/data/kaomoji/6 - dissatisfaction/25.txt b/data/kaomoji/dissatisfaction/25.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/25.txt
rename to data/kaomoji/dissatisfaction/25.txt
diff --git a/data/kaomoji/6 - dissatisfaction/26.txt b/data/kaomoji/dissatisfaction/26.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/26.txt
rename to data/kaomoji/dissatisfaction/26.txt
diff --git a/data/kaomoji/6 - dissatisfaction/3.txt b/data/kaomoji/dissatisfaction/3.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/3.txt
rename to data/kaomoji/dissatisfaction/3.txt
diff --git a/data/kaomoji/6 - dissatisfaction/4.txt b/data/kaomoji/dissatisfaction/4.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/4.txt
rename to data/kaomoji/dissatisfaction/4.txt
diff --git a/data/kaomoji/6 - dissatisfaction/5.txt b/data/kaomoji/dissatisfaction/5.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/5.txt
rename to data/kaomoji/dissatisfaction/5.txt
diff --git a/data/kaomoji/6 - dissatisfaction/6.txt b/data/kaomoji/dissatisfaction/6.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/6.txt
rename to data/kaomoji/dissatisfaction/6.txt
diff --git a/data/kaomoji/6 - dissatisfaction/7.txt b/data/kaomoji/dissatisfaction/7.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/7.txt
rename to data/kaomoji/dissatisfaction/7.txt
diff --git a/data/kaomoji/6 - dissatisfaction/8.txt b/data/kaomoji/dissatisfaction/8.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/8.txt
rename to data/kaomoji/dissatisfaction/8.txt
diff --git a/data/kaomoji/6 - dissatisfaction/9.txt b/data/kaomoji/dissatisfaction/9.txt
similarity index 100%
rename from data/kaomoji/6 - dissatisfaction/9.txt
rename to data/kaomoji/dissatisfaction/9.txt
diff --git a/data/kaomoji/dog/.name b/data/kaomoji/dog/.name
new file mode 100644
index 0000000..7599b9d
--- /dev/null
+++ b/data/kaomoji/dog/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ dog
diff --git a/data/kaomoji/doubt/.name b/data/kaomoji/doubt/.name
new file mode 100644
index 0000000..963ae3b
--- /dev/null
+++ b/data/kaomoji/doubt/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ doubt
diff --git a/data/kaomoji/10 - doubt/1.txt b/data/kaomoji/doubt/1.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/1.txt
rename to data/kaomoji/doubt/1.txt
diff --git a/data/kaomoji/10 - doubt/10.txt b/data/kaomoji/doubt/10.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/10.txt
rename to data/kaomoji/doubt/10.txt
diff --git a/data/kaomoji/10 - doubt/11.txt b/data/kaomoji/doubt/11.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/11.txt
rename to data/kaomoji/doubt/11.txt
diff --git a/data/kaomoji/10 - doubt/12.txt b/data/kaomoji/doubt/12.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/12.txt
rename to data/kaomoji/doubt/12.txt
diff --git a/data/kaomoji/10 - doubt/2.txt b/data/kaomoji/doubt/2.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/2.txt
rename to data/kaomoji/doubt/2.txt
diff --git a/data/kaomoji/10 - doubt/3.txt b/data/kaomoji/doubt/3.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/3.txt
rename to data/kaomoji/doubt/3.txt
diff --git a/data/kaomoji/10 - doubt/4.txt b/data/kaomoji/doubt/4.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/4.txt
rename to data/kaomoji/doubt/4.txt
diff --git a/data/kaomoji/10 - doubt/5.txt b/data/kaomoji/doubt/5.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/5.txt
rename to data/kaomoji/doubt/5.txt
diff --git a/data/kaomoji/10 - doubt/6.txt b/data/kaomoji/doubt/6.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/6.txt
rename to data/kaomoji/doubt/6.txt
diff --git a/data/kaomoji/10 - doubt/7.txt b/data/kaomoji/doubt/7.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/7.txt
rename to data/kaomoji/doubt/7.txt
diff --git a/data/kaomoji/10 - doubt/8.txt b/data/kaomoji/doubt/8.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/8.txt
rename to data/kaomoji/doubt/8.txt
diff --git a/data/kaomoji/10 - doubt/9.txt b/data/kaomoji/doubt/9.txt
similarity index 100%
rename from data/kaomoji/10 - doubt/9.txt
rename to data/kaomoji/doubt/9.txt
diff --git a/data/kaomoji/embarassment/.name b/data/kaomoji/embarassment/.name
new file mode 100644
index 0000000..c1547a6
--- /dev/null
+++ b/data/kaomoji/embarassment/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ embarassment
diff --git a/data/kaomoji/7 - embarrassment/1.txt b/data/kaomoji/embarassment/1.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/1.txt
rename to data/kaomoji/embarassment/1.txt
diff --git a/data/kaomoji/7 - embarrassment/10.txt b/data/kaomoji/embarassment/10.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/10.txt
rename to data/kaomoji/embarassment/10.txt
diff --git a/data/kaomoji/7 - embarrassment/11.txt b/data/kaomoji/embarassment/11.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/11.txt
rename to data/kaomoji/embarassment/11.txt
diff --git a/data/kaomoji/7 - embarrassment/12.txt b/data/kaomoji/embarassment/12.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/12.txt
rename to data/kaomoji/embarassment/12.txt
diff --git a/data/kaomoji/7 - embarrassment/13.txt b/data/kaomoji/embarassment/13.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/13.txt
rename to data/kaomoji/embarassment/13.txt
diff --git a/data/kaomoji/7 - embarrassment/14.txt b/data/kaomoji/embarassment/14.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/14.txt
rename to data/kaomoji/embarassment/14.txt
diff --git a/data/kaomoji/7 - embarrassment/15.txt b/data/kaomoji/embarassment/15.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/15.txt
rename to data/kaomoji/embarassment/15.txt
diff --git a/data/kaomoji/7 - embarrassment/16.txt b/data/kaomoji/embarassment/16.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/16.txt
rename to data/kaomoji/embarassment/16.txt
diff --git a/data/kaomoji/7 - embarrassment/17.txt b/data/kaomoji/embarassment/17.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/17.txt
rename to data/kaomoji/embarassment/17.txt
diff --git a/data/kaomoji/7 - embarrassment/18.txt b/data/kaomoji/embarassment/18.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/18.txt
rename to data/kaomoji/embarassment/18.txt
diff --git a/data/kaomoji/7 - embarrassment/19.txt b/data/kaomoji/embarassment/19.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/19.txt
rename to data/kaomoji/embarassment/19.txt
diff --git a/data/kaomoji/7 - embarrassment/2.txt b/data/kaomoji/embarassment/2.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/2.txt
rename to data/kaomoji/embarassment/2.txt
diff --git a/data/kaomoji/7 - embarrassment/20.txt b/data/kaomoji/embarassment/20.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/20.txt
rename to data/kaomoji/embarassment/20.txt
diff --git a/data/kaomoji/7 - embarrassment/21.txt b/data/kaomoji/embarassment/21.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/21.txt
rename to data/kaomoji/embarassment/21.txt
diff --git a/data/kaomoji/7 - embarrassment/22.txt b/data/kaomoji/embarassment/22.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/22.txt
rename to data/kaomoji/embarassment/22.txt
diff --git a/data/kaomoji/7 - embarrassment/23.txt b/data/kaomoji/embarassment/23.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/23.txt
rename to data/kaomoji/embarassment/23.txt
diff --git a/data/kaomoji/7 - embarrassment/24.txt b/data/kaomoji/embarassment/24.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/24.txt
rename to data/kaomoji/embarassment/24.txt
diff --git a/data/kaomoji/7 - embarrassment/25.txt b/data/kaomoji/embarassment/25.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/25.txt
rename to data/kaomoji/embarassment/25.txt
diff --git a/data/kaomoji/7 - embarrassment/3.txt b/data/kaomoji/embarassment/3.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/3.txt
rename to data/kaomoji/embarassment/3.txt
diff --git a/data/kaomoji/7 - embarrassment/4.txt b/data/kaomoji/embarassment/4.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/4.txt
rename to data/kaomoji/embarassment/4.txt
diff --git a/data/kaomoji/7 - embarrassment/5.txt b/data/kaomoji/embarassment/5.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/5.txt
rename to data/kaomoji/embarassment/5.txt
diff --git a/data/kaomoji/7 - embarrassment/6.txt b/data/kaomoji/embarassment/6.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/6.txt
rename to data/kaomoji/embarassment/6.txt
diff --git a/data/kaomoji/7 - embarrassment/7.txt b/data/kaomoji/embarassment/7.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/7.txt
rename to data/kaomoji/embarassment/7.txt
diff --git a/data/kaomoji/7 - embarrassment/8.txt b/data/kaomoji/embarassment/8.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/8.txt
rename to data/kaomoji/embarassment/8.txt
diff --git a/data/kaomoji/7 - embarrassment/9.txt b/data/kaomoji/embarassment/9.txt
similarity index 100%
rename from data/kaomoji/7 - embarrassment/9.txt
rename to data/kaomoji/embarassment/9.txt
diff --git a/data/kaomoji/enemies/.name b/data/kaomoji/enemies/.name
new file mode 100644
index 0000000..1167150
--- /dev/null
+++ b/data/kaomoji/enemies/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ enemies
diff --git a/data/kaomoji/8 - enemies/1.txt b/data/kaomoji/enemies/1.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/1.txt
rename to data/kaomoji/enemies/1.txt
diff --git a/data/kaomoji/8 - enemies/10.txt b/data/kaomoji/enemies/10.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/10.txt
rename to data/kaomoji/enemies/10.txt
diff --git a/data/kaomoji/8 - enemies/11.txt b/data/kaomoji/enemies/11.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/11.txt
rename to data/kaomoji/enemies/11.txt
diff --git a/data/kaomoji/8 - enemies/12.txt b/data/kaomoji/enemies/12.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/12.txt
rename to data/kaomoji/enemies/12.txt
diff --git a/data/kaomoji/8 - enemies/13.txt b/data/kaomoji/enemies/13.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/13.txt
rename to data/kaomoji/enemies/13.txt
diff --git a/data/kaomoji/8 - enemies/14.txt b/data/kaomoji/enemies/14.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/14.txt
rename to data/kaomoji/enemies/14.txt
diff --git a/data/kaomoji/8 - enemies/15.txt b/data/kaomoji/enemies/15.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/15.txt
rename to data/kaomoji/enemies/15.txt
diff --git a/data/kaomoji/8 - enemies/16.txt b/data/kaomoji/enemies/16.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/16.txt
rename to data/kaomoji/enemies/16.txt
diff --git a/data/kaomoji/8 - enemies/17.txt b/data/kaomoji/enemies/17.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/17.txt
rename to data/kaomoji/enemies/17.txt
diff --git a/data/kaomoji/8 - enemies/18.txt b/data/kaomoji/enemies/18.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/18.txt
rename to data/kaomoji/enemies/18.txt
diff --git a/data/kaomoji/8 - enemies/19.txt b/data/kaomoji/enemies/19.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/19.txt
rename to data/kaomoji/enemies/19.txt
diff --git a/data/kaomoji/8 - enemies/2.txt b/data/kaomoji/enemies/2.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/2.txt
rename to data/kaomoji/enemies/2.txt
diff --git a/data/kaomoji/8 - enemies/20.txt b/data/kaomoji/enemies/20.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/20.txt
rename to data/kaomoji/enemies/20.txt
diff --git a/data/kaomoji/8 - enemies/21.txt b/data/kaomoji/enemies/21.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/21.txt
rename to data/kaomoji/enemies/21.txt
diff --git a/data/kaomoji/8 - enemies/22.txt b/data/kaomoji/enemies/22.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/22.txt
rename to data/kaomoji/enemies/22.txt
diff --git a/data/kaomoji/8 - enemies/23.txt b/data/kaomoji/enemies/23.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/23.txt
rename to data/kaomoji/enemies/23.txt
diff --git a/data/kaomoji/8 - enemies/24.txt b/data/kaomoji/enemies/24.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/24.txt
rename to data/kaomoji/enemies/24.txt
diff --git a/data/kaomoji/8 - enemies/3.txt b/data/kaomoji/enemies/3.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/3.txt
rename to data/kaomoji/enemies/3.txt
diff --git a/data/kaomoji/8 - enemies/4.txt b/data/kaomoji/enemies/4.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/4.txt
rename to data/kaomoji/enemies/4.txt
diff --git a/data/kaomoji/8 - enemies/5.txt b/data/kaomoji/enemies/5.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/5.txt
rename to data/kaomoji/enemies/5.txt
diff --git a/data/kaomoji/8 - enemies/6.txt b/data/kaomoji/enemies/6.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/6.txt
rename to data/kaomoji/enemies/6.txt
diff --git a/data/kaomoji/8 - enemies/7.txt b/data/kaomoji/enemies/7.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/7.txt
rename to data/kaomoji/enemies/7.txt
diff --git a/data/kaomoji/8 - enemies/8.txt b/data/kaomoji/enemies/8.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/8.txt
rename to data/kaomoji/enemies/8.txt
diff --git a/data/kaomoji/8 - enemies/9.txt b/data/kaomoji/enemies/9.txt
similarity index 100%
rename from data/kaomoji/8 - enemies/9.txt
rename to data/kaomoji/enemies/9.txt
diff --git a/data/kaomoji/faces/.name b/data/kaomoji/faces/.name
new file mode 100644
index 0000000..35d589d
--- /dev/null
+++ b/data/kaomoji/faces/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ faces
diff --git a/data/kaomoji/27 - faces/1.txt b/data/kaomoji/faces/1.txt
similarity index 100%
rename from data/kaomoji/27 - faces/1.txt
rename to data/kaomoji/faces/1.txt
diff --git a/data/kaomoji/27 - faces/10.txt b/data/kaomoji/faces/10.txt
similarity index 100%
rename from data/kaomoji/27 - faces/10.txt
rename to data/kaomoji/faces/10.txt
diff --git a/data/kaomoji/27 - faces/11.txt b/data/kaomoji/faces/11.txt
similarity index 100%
rename from data/kaomoji/27 - faces/11.txt
rename to data/kaomoji/faces/11.txt
diff --git a/data/kaomoji/27 - faces/12.txt b/data/kaomoji/faces/12.txt
similarity index 100%
rename from data/kaomoji/27 - faces/12.txt
rename to data/kaomoji/faces/12.txt
diff --git a/data/kaomoji/27 - faces/13.txt b/data/kaomoji/faces/13.txt
similarity index 100%
rename from data/kaomoji/27 - faces/13.txt
rename to data/kaomoji/faces/13.txt
diff --git a/data/kaomoji/27 - faces/14.txt b/data/kaomoji/faces/14.txt
similarity index 100%
rename from data/kaomoji/27 - faces/14.txt
rename to data/kaomoji/faces/14.txt
diff --git a/data/kaomoji/27 - faces/15.txt b/data/kaomoji/faces/15.txt
similarity index 100%
rename from data/kaomoji/27 - faces/15.txt
rename to data/kaomoji/faces/15.txt
diff --git a/data/kaomoji/27 - faces/16.txt b/data/kaomoji/faces/16.txt
similarity index 100%
rename from data/kaomoji/27 - faces/16.txt
rename to data/kaomoji/faces/16.txt
diff --git a/data/kaomoji/27 - faces/17.txt b/data/kaomoji/faces/17.txt
similarity index 100%
rename from data/kaomoji/27 - faces/17.txt
rename to data/kaomoji/faces/17.txt
diff --git a/data/kaomoji/27 - faces/18.txt b/data/kaomoji/faces/18.txt
similarity index 100%
rename from data/kaomoji/27 - faces/18.txt
rename to data/kaomoji/faces/18.txt
diff --git a/data/kaomoji/27 - faces/2.txt b/data/kaomoji/faces/2.txt
similarity index 100%
rename from data/kaomoji/27 - faces/2.txt
rename to data/kaomoji/faces/2.txt
diff --git a/data/kaomoji/27 - faces/3.txt b/data/kaomoji/faces/3.txt
similarity index 100%
rename from data/kaomoji/27 - faces/3.txt
rename to data/kaomoji/faces/3.txt
diff --git a/data/kaomoji/27 - faces/4.txt b/data/kaomoji/faces/4.txt
similarity index 100%
rename from data/kaomoji/27 - faces/4.txt
rename to data/kaomoji/faces/4.txt
diff --git a/data/kaomoji/27 - faces/5.txt b/data/kaomoji/faces/5.txt
similarity index 100%
rename from data/kaomoji/27 - faces/5.txt
rename to data/kaomoji/faces/5.txt
diff --git a/data/kaomoji/27 - faces/6.txt b/data/kaomoji/faces/6.txt
similarity index 100%
rename from data/kaomoji/27 - faces/6.txt
rename to data/kaomoji/faces/6.txt
diff --git a/data/kaomoji/27 - faces/7.txt b/data/kaomoji/faces/7.txt
similarity index 100%
rename from data/kaomoji/27 - faces/7.txt
rename to data/kaomoji/faces/7.txt
diff --git a/data/kaomoji/27 - faces/8.txt b/data/kaomoji/faces/8.txt
similarity index 100%
rename from data/kaomoji/27 - faces/8.txt
rename to data/kaomoji/faces/8.txt
diff --git a/data/kaomoji/27 - faces/9.txt b/data/kaomoji/faces/9.txt
similarity index 100%
rename from data/kaomoji/27 - faces/9.txt
rename to data/kaomoji/faces/9.txt
diff --git a/data/kaomoji/fear/.name b/data/kaomoji/fear/.name
new file mode 100644
index 0000000..09e844d
--- /dev/null
+++ b/data/kaomoji/fear/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ fear
diff --git a/data/kaomoji/19 - fear/1.txt b/data/kaomoji/fear/1.txt
similarity index 100%
rename from data/kaomoji/19 - fear/1.txt
rename to data/kaomoji/fear/1.txt
diff --git a/data/kaomoji/19 - fear/10.txt b/data/kaomoji/fear/10.txt
similarity index 100%
rename from data/kaomoji/19 - fear/10.txt
rename to data/kaomoji/fear/10.txt
diff --git a/data/kaomoji/19 - fear/11.txt b/data/kaomoji/fear/11.txt
similarity index 100%
rename from data/kaomoji/19 - fear/11.txt
rename to data/kaomoji/fear/11.txt
diff --git a/data/kaomoji/19 - fear/12.txt b/data/kaomoji/fear/12.txt
similarity index 100%
rename from data/kaomoji/19 - fear/12.txt
rename to data/kaomoji/fear/12.txt
diff --git a/data/kaomoji/19 - fear/13.txt b/data/kaomoji/fear/13.txt
similarity index 100%
rename from data/kaomoji/19 - fear/13.txt
rename to data/kaomoji/fear/13.txt
diff --git a/data/kaomoji/19 - fear/14.txt b/data/kaomoji/fear/14.txt
similarity index 100%
rename from data/kaomoji/19 - fear/14.txt
rename to data/kaomoji/fear/14.txt
diff --git a/data/kaomoji/19 - fear/15.txt b/data/kaomoji/fear/15.txt
similarity index 100%
rename from data/kaomoji/19 - fear/15.txt
rename to data/kaomoji/fear/15.txt
diff --git a/data/kaomoji/19 - fear/16.txt b/data/kaomoji/fear/16.txt
similarity index 100%
rename from data/kaomoji/19 - fear/16.txt
rename to data/kaomoji/fear/16.txt
diff --git a/data/kaomoji/19 - fear/17.txt b/data/kaomoji/fear/17.txt
similarity index 100%
rename from data/kaomoji/19 - fear/17.txt
rename to data/kaomoji/fear/17.txt
diff --git a/data/kaomoji/19 - fear/18.txt b/data/kaomoji/fear/18.txt
similarity index 100%
rename from data/kaomoji/19 - fear/18.txt
rename to data/kaomoji/fear/18.txt
diff --git a/data/kaomoji/19 - fear/19.txt b/data/kaomoji/fear/19.txt
similarity index 100%
rename from data/kaomoji/19 - fear/19.txt
rename to data/kaomoji/fear/19.txt
diff --git a/data/kaomoji/19 - fear/2.txt b/data/kaomoji/fear/2.txt
similarity index 100%
rename from data/kaomoji/19 - fear/2.txt
rename to data/kaomoji/fear/2.txt
diff --git a/data/kaomoji/19 - fear/3.txt b/data/kaomoji/fear/3.txt
similarity index 100%
rename from data/kaomoji/19 - fear/3.txt
rename to data/kaomoji/fear/3.txt
diff --git a/data/kaomoji/19 - fear/4.txt b/data/kaomoji/fear/4.txt
similarity index 100%
rename from data/kaomoji/19 - fear/4.txt
rename to data/kaomoji/fear/4.txt
diff --git a/data/kaomoji/19 - fear/5.txt b/data/kaomoji/fear/5.txt
similarity index 100%
rename from data/kaomoji/19 - fear/5.txt
rename to data/kaomoji/fear/5.txt
diff --git a/data/kaomoji/19 - fear/6.txt b/data/kaomoji/fear/6.txt
similarity index 100%
rename from data/kaomoji/19 - fear/6.txt
rename to data/kaomoji/fear/6.txt
diff --git a/data/kaomoji/19 - fear/7.txt b/data/kaomoji/fear/7.txt
similarity index 100%
rename from data/kaomoji/19 - fear/7.txt
rename to data/kaomoji/fear/7.txt
diff --git a/data/kaomoji/19 - fear/8.txt b/data/kaomoji/fear/8.txt
similarity index 100%
rename from data/kaomoji/19 - fear/8.txt
rename to data/kaomoji/fear/8.txt
diff --git a/data/kaomoji/19 - fear/9.txt b/data/kaomoji/fear/9.txt
similarity index 100%
rename from data/kaomoji/19 - fear/9.txt
rename to data/kaomoji/fear/9.txt
diff --git a/data/kaomoji/fish/.name b/data/kaomoji/fish/.name
new file mode 100644
index 0000000..07e09fe
--- /dev/null
+++ b/data/kaomoji/fish/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ fish
diff --git a/data/kaomoji/food/.name b/data/kaomoji/food/.name
new file mode 100644
index 0000000..2724e59
--- /dev/null
+++ b/data/kaomoji/food/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ food
diff --git a/data/kaomoji/20 - food/1.txt b/data/kaomoji/food/1.txt
similarity index 100%
rename from data/kaomoji/20 - food/1.txt
rename to data/kaomoji/food/1.txt
diff --git a/data/kaomoji/20 - food/10.txt b/data/kaomoji/food/10.txt
similarity index 100%
rename from data/kaomoji/20 - food/10.txt
rename to data/kaomoji/food/10.txt
diff --git a/data/kaomoji/20 - food/11.txt b/data/kaomoji/food/11.txt
similarity index 100%
rename from data/kaomoji/20 - food/11.txt
rename to data/kaomoji/food/11.txt
diff --git a/data/kaomoji/20 - food/12.txt b/data/kaomoji/food/12.txt
similarity index 100%
rename from data/kaomoji/20 - food/12.txt
rename to data/kaomoji/food/12.txt
diff --git a/data/kaomoji/20 - food/13.txt b/data/kaomoji/food/13.txt
similarity index 100%
rename from data/kaomoji/20 - food/13.txt
rename to data/kaomoji/food/13.txt
diff --git a/data/kaomoji/20 - food/14.txt b/data/kaomoji/food/14.txt
similarity index 100%
rename from data/kaomoji/20 - food/14.txt
rename to data/kaomoji/food/14.txt
diff --git a/data/kaomoji/20 - food/15.txt b/data/kaomoji/food/15.txt
similarity index 100%
rename from data/kaomoji/20 - food/15.txt
rename to data/kaomoji/food/15.txt
diff --git a/data/kaomoji/20 - food/16.txt b/data/kaomoji/food/16.txt
similarity index 100%
rename from data/kaomoji/20 - food/16.txt
rename to data/kaomoji/food/16.txt
diff --git a/data/kaomoji/20 - food/17.txt b/data/kaomoji/food/17.txt
similarity index 100%
rename from data/kaomoji/20 - food/17.txt
rename to data/kaomoji/food/17.txt
diff --git a/data/kaomoji/20 - food/18.txt b/data/kaomoji/food/18.txt
similarity index 100%
rename from data/kaomoji/20 - food/18.txt
rename to data/kaomoji/food/18.txt
diff --git a/data/kaomoji/20 - food/19.txt b/data/kaomoji/food/19.txt
similarity index 100%
rename from data/kaomoji/20 - food/19.txt
rename to data/kaomoji/food/19.txt
diff --git a/data/kaomoji/20 - food/2.txt b/data/kaomoji/food/2.txt
similarity index 100%
rename from data/kaomoji/20 - food/2.txt
rename to data/kaomoji/food/2.txt
diff --git a/data/kaomoji/20 - food/20.txt b/data/kaomoji/food/20.txt
similarity index 100%
rename from data/kaomoji/20 - food/20.txt
rename to data/kaomoji/food/20.txt
diff --git a/data/kaomoji/20 - food/21.txt b/data/kaomoji/food/21.txt
similarity index 100%
rename from data/kaomoji/20 - food/21.txt
rename to data/kaomoji/food/21.txt
diff --git a/data/kaomoji/20 - food/3.txt b/data/kaomoji/food/3.txt
similarity index 100%
rename from data/kaomoji/20 - food/3.txt
rename to data/kaomoji/food/3.txt
diff --git a/data/kaomoji/20 - food/4.txt b/data/kaomoji/food/4.txt
similarity index 100%
rename from data/kaomoji/20 - food/4.txt
rename to data/kaomoji/food/4.txt
diff --git a/data/kaomoji/20 - food/5.txt b/data/kaomoji/food/5.txt
similarity index 100%
rename from data/kaomoji/20 - food/5.txt
rename to data/kaomoji/food/5.txt
diff --git a/data/kaomoji/20 - food/6.txt b/data/kaomoji/food/6.txt
similarity index 100%
rename from data/kaomoji/20 - food/6.txt
rename to data/kaomoji/food/6.txt
diff --git a/data/kaomoji/20 - food/7.txt b/data/kaomoji/food/7.txt
similarity index 100%
rename from data/kaomoji/20 - food/7.txt
rename to data/kaomoji/food/7.txt
diff --git a/data/kaomoji/20 - food/8.txt b/data/kaomoji/food/8.txt
similarity index 100%
rename from data/kaomoji/20 - food/8.txt
rename to data/kaomoji/food/8.txt
diff --git a/data/kaomoji/20 - food/9.txt b/data/kaomoji/food/9.txt
similarity index 100%
rename from data/kaomoji/20 - food/9.txt
rename to data/kaomoji/food/9.txt
diff --git a/data/kaomoji/friends/.name b/data/kaomoji/friends/.name
new file mode 100644
index 0000000..c6c92d9
--- /dev/null
+++ b/data/kaomoji/friends/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ friends
diff --git a/data/kaomoji/12 - friends/1.txt b/data/kaomoji/friends/1.txt
similarity index 100%
rename from data/kaomoji/12 - friends/1.txt
rename to data/kaomoji/friends/1.txt
diff --git a/data/kaomoji/12 - friends/10.txt b/data/kaomoji/friends/10.txt
similarity index 100%
rename from data/kaomoji/12 - friends/10.txt
rename to data/kaomoji/friends/10.txt
diff --git a/data/kaomoji/12 - friends/11.txt b/data/kaomoji/friends/11.txt
similarity index 100%
rename from data/kaomoji/12 - friends/11.txt
rename to data/kaomoji/friends/11.txt
diff --git a/data/kaomoji/12 - friends/12.txt b/data/kaomoji/friends/12.txt
similarity index 100%
rename from data/kaomoji/12 - friends/12.txt
rename to data/kaomoji/friends/12.txt
diff --git a/data/kaomoji/12 - friends/13.txt b/data/kaomoji/friends/13.txt
similarity index 100%
rename from data/kaomoji/12 - friends/13.txt
rename to data/kaomoji/friends/13.txt
diff --git a/data/kaomoji/12 - friends/14.txt b/data/kaomoji/friends/14.txt
similarity index 100%
rename from data/kaomoji/12 - friends/14.txt
rename to data/kaomoji/friends/14.txt
diff --git a/data/kaomoji/12 - friends/15.txt b/data/kaomoji/friends/15.txt
similarity index 100%
rename from data/kaomoji/12 - friends/15.txt
rename to data/kaomoji/friends/15.txt
diff --git a/data/kaomoji/12 - friends/16.txt b/data/kaomoji/friends/16.txt
similarity index 100%
rename from data/kaomoji/12 - friends/16.txt
rename to data/kaomoji/friends/16.txt
diff --git a/data/kaomoji/12 - friends/17.txt b/data/kaomoji/friends/17.txt
similarity index 100%
rename from data/kaomoji/12 - friends/17.txt
rename to data/kaomoji/friends/17.txt
diff --git a/data/kaomoji/12 - friends/18.txt b/data/kaomoji/friends/18.txt
similarity index 100%
rename from data/kaomoji/12 - friends/18.txt
rename to data/kaomoji/friends/18.txt
diff --git a/data/kaomoji/12 - friends/19.txt b/data/kaomoji/friends/19.txt
similarity index 100%
rename from data/kaomoji/12 - friends/19.txt
rename to data/kaomoji/friends/19.txt
diff --git a/data/kaomoji/12 - friends/2.txt b/data/kaomoji/friends/2.txt
similarity index 100%
rename from data/kaomoji/12 - friends/2.txt
rename to data/kaomoji/friends/2.txt
diff --git a/data/kaomoji/12 - friends/20.txt b/data/kaomoji/friends/20.txt
similarity index 100%
rename from data/kaomoji/12 - friends/20.txt
rename to data/kaomoji/friends/20.txt
diff --git a/data/kaomoji/12 - friends/21.txt b/data/kaomoji/friends/21.txt
similarity index 100%
rename from data/kaomoji/12 - friends/21.txt
rename to data/kaomoji/friends/21.txt
diff --git a/data/kaomoji/12 - friends/22.txt b/data/kaomoji/friends/22.txt
similarity index 100%
rename from data/kaomoji/12 - friends/22.txt
rename to data/kaomoji/friends/22.txt
diff --git a/data/kaomoji/12 - friends/23.txt b/data/kaomoji/friends/23.txt
similarity index 100%
rename from data/kaomoji/12 - friends/23.txt
rename to data/kaomoji/friends/23.txt
diff --git a/data/kaomoji/12 - friends/3.txt b/data/kaomoji/friends/3.txt
similarity index 100%
rename from data/kaomoji/12 - friends/3.txt
rename to data/kaomoji/friends/3.txt
diff --git a/data/kaomoji/12 - friends/4.txt b/data/kaomoji/friends/4.txt
similarity index 100%
rename from data/kaomoji/12 - friends/4.txt
rename to data/kaomoji/friends/4.txt
diff --git a/data/kaomoji/12 - friends/5.txt b/data/kaomoji/friends/5.txt
similarity index 100%
rename from data/kaomoji/12 - friends/5.txt
rename to data/kaomoji/friends/5.txt
diff --git a/data/kaomoji/12 - friends/6.txt b/data/kaomoji/friends/6.txt
similarity index 100%
rename from data/kaomoji/12 - friends/6.txt
rename to data/kaomoji/friends/6.txt
diff --git a/data/kaomoji/12 - friends/7.txt b/data/kaomoji/friends/7.txt
similarity index 100%
rename from data/kaomoji/12 - friends/7.txt
rename to data/kaomoji/friends/7.txt
diff --git a/data/kaomoji/12 - friends/8.txt b/data/kaomoji/friends/8.txt
similarity index 100%
rename from data/kaomoji/12 - friends/8.txt
rename to data/kaomoji/friends/8.txt
diff --git a/data/kaomoji/12 - friends/9.txt b/data/kaomoji/friends/9.txt
similarity index 100%
rename from data/kaomoji/12 - friends/9.txt
rename to data/kaomoji/friends/9.txt
diff --git a/data/kaomoji/games/.name b/data/kaomoji/games/.name
new file mode 100644
index 0000000..c9ef3ae
--- /dev/null
+++ b/data/kaomoji/games/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ games
diff --git a/data/kaomoji/28 - games/1.txt b/data/kaomoji/games/1.txt
similarity index 100%
rename from data/kaomoji/28 - games/1.txt
rename to data/kaomoji/games/1.txt
diff --git a/data/kaomoji/28 - games/10.txt b/data/kaomoji/games/10.txt
similarity index 100%
rename from data/kaomoji/28 - games/10.txt
rename to data/kaomoji/games/10.txt
diff --git a/data/kaomoji/28 - games/11.txt b/data/kaomoji/games/11.txt
similarity index 100%
rename from data/kaomoji/28 - games/11.txt
rename to data/kaomoji/games/11.txt
diff --git a/data/kaomoji/28 - games/2.txt b/data/kaomoji/games/2.txt
similarity index 100%
rename from data/kaomoji/28 - games/2.txt
rename to data/kaomoji/games/2.txt
diff --git a/data/kaomoji/28 - games/3.txt b/data/kaomoji/games/3.txt
similarity index 100%
rename from data/kaomoji/28 - games/3.txt
rename to data/kaomoji/games/3.txt
diff --git a/data/kaomoji/28 - games/4.txt b/data/kaomoji/games/4.txt
similarity index 100%
rename from data/kaomoji/28 - games/4.txt
rename to data/kaomoji/games/4.txt
diff --git a/data/kaomoji/28 - games/5.txt b/data/kaomoji/games/5.txt
similarity index 100%
rename from data/kaomoji/28 - games/5.txt
rename to data/kaomoji/games/5.txt
diff --git a/data/kaomoji/28 - games/6.txt b/data/kaomoji/games/6.txt
similarity index 100%
rename from data/kaomoji/28 - games/6.txt
rename to data/kaomoji/games/6.txt
diff --git a/data/kaomoji/28 - games/7.txt b/data/kaomoji/games/7.txt
similarity index 100%
rename from data/kaomoji/28 - games/7.txt
rename to data/kaomoji/games/7.txt
diff --git a/data/kaomoji/28 - games/8.txt b/data/kaomoji/games/8.txt
similarity index 100%
rename from data/kaomoji/28 - games/8.txt
rename to data/kaomoji/games/8.txt
diff --git a/data/kaomoji/28 - games/9.txt b/data/kaomoji/games/9.txt
similarity index 100%
rename from data/kaomoji/28 - games/9.txt
rename to data/kaomoji/games/9.txt
diff --git a/data/kaomoji/greeting/.name b/data/kaomoji/greeting/.name
new file mode 100644
index 0000000..0d60869
--- /dev/null
+++ b/data/kaomoji/greeting/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ greeting
diff --git a/data/kaomoji/14 - greeting/1.txt b/data/kaomoji/greeting/1.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/1.txt
rename to data/kaomoji/greeting/1.txt
diff --git a/data/kaomoji/14 - greeting/10.txt b/data/kaomoji/greeting/10.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/10.txt
rename to data/kaomoji/greeting/10.txt
diff --git a/data/kaomoji/14 - greeting/11.txt b/data/kaomoji/greeting/11.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/11.txt
rename to data/kaomoji/greeting/11.txt
diff --git a/data/kaomoji/14 - greeting/12.txt b/data/kaomoji/greeting/12.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/12.txt
rename to data/kaomoji/greeting/12.txt
diff --git a/data/kaomoji/14 - greeting/13.txt b/data/kaomoji/greeting/13.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/13.txt
rename to data/kaomoji/greeting/13.txt
diff --git a/data/kaomoji/14 - greeting/14.txt b/data/kaomoji/greeting/14.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/14.txt
rename to data/kaomoji/greeting/14.txt
diff --git a/data/kaomoji/14 - greeting/15.txt b/data/kaomoji/greeting/15.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/15.txt
rename to data/kaomoji/greeting/15.txt
diff --git a/data/kaomoji/14 - greeting/16.txt b/data/kaomoji/greeting/16.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/16.txt
rename to data/kaomoji/greeting/16.txt
diff --git a/data/kaomoji/14 - greeting/17.txt b/data/kaomoji/greeting/17.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/17.txt
rename to data/kaomoji/greeting/17.txt
diff --git a/data/kaomoji/14 - greeting/18.txt b/data/kaomoji/greeting/18.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/18.txt
rename to data/kaomoji/greeting/18.txt
diff --git a/data/kaomoji/14 - greeting/19.txt b/data/kaomoji/greeting/19.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/19.txt
rename to data/kaomoji/greeting/19.txt
diff --git a/data/kaomoji/14 - greeting/2.txt b/data/kaomoji/greeting/2.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/2.txt
rename to data/kaomoji/greeting/2.txt
diff --git a/data/kaomoji/14 - greeting/20.txt b/data/kaomoji/greeting/20.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/20.txt
rename to data/kaomoji/greeting/20.txt
diff --git a/data/kaomoji/14 - greeting/21.txt b/data/kaomoji/greeting/21.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/21.txt
rename to data/kaomoji/greeting/21.txt
diff --git a/data/kaomoji/14 - greeting/22.txt b/data/kaomoji/greeting/22.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/22.txt
rename to data/kaomoji/greeting/22.txt
diff --git a/data/kaomoji/14 - greeting/23.txt b/data/kaomoji/greeting/23.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/23.txt
rename to data/kaomoji/greeting/23.txt
diff --git a/data/kaomoji/14 - greeting/24.txt b/data/kaomoji/greeting/24.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/24.txt
rename to data/kaomoji/greeting/24.txt
diff --git a/data/kaomoji/14 - greeting/25.txt b/data/kaomoji/greeting/25.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/25.txt
rename to data/kaomoji/greeting/25.txt
diff --git a/data/kaomoji/14 - greeting/26.txt b/data/kaomoji/greeting/26.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/26.txt
rename to data/kaomoji/greeting/26.txt
diff --git a/data/kaomoji/14 - greeting/27.txt b/data/kaomoji/greeting/27.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/27.txt
rename to data/kaomoji/greeting/27.txt
diff --git a/data/kaomoji/14 - greeting/28.txt b/data/kaomoji/greeting/28.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/28.txt
rename to data/kaomoji/greeting/28.txt
diff --git a/data/kaomoji/14 - greeting/3.txt b/data/kaomoji/greeting/3.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/3.txt
rename to data/kaomoji/greeting/3.txt
diff --git a/data/kaomoji/14 - greeting/4.txt b/data/kaomoji/greeting/4.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/4.txt
rename to data/kaomoji/greeting/4.txt
diff --git a/data/kaomoji/14 - greeting/5.txt b/data/kaomoji/greeting/5.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/5.txt
rename to data/kaomoji/greeting/5.txt
diff --git a/data/kaomoji/14 - greeting/6.txt b/data/kaomoji/greeting/6.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/6.txt
rename to data/kaomoji/greeting/6.txt
diff --git a/data/kaomoji/14 - greeting/7.txt b/data/kaomoji/greeting/7.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/7.txt
rename to data/kaomoji/greeting/7.txt
diff --git a/data/kaomoji/14 - greeting/8.txt b/data/kaomoji/greeting/8.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/8.txt
rename to data/kaomoji/greeting/8.txt
diff --git a/data/kaomoji/14 - greeting/9.txt b/data/kaomoji/greeting/9.txt
similarity index 100%
rename from data/kaomoji/14 - greeting/9.txt
rename to data/kaomoji/greeting/9.txt
diff --git a/data/kaomoji/happy/.name b/data/kaomoji/happy/.name
new file mode 100644
index 0000000..f5bfd48
--- /dev/null
+++ b/data/kaomoji/happy/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ happy
\ No newline at end of file
diff --git a/data/kaomoji/1 - joy/1.txt b/data/kaomoji/happy/1.txt
similarity index 100%
rename from data/kaomoji/1 - joy/1.txt
rename to data/kaomoji/happy/1.txt
diff --git a/data/kaomoji/1 - joy/10.txt b/data/kaomoji/happy/10.txt
similarity index 100%
rename from data/kaomoji/1 - joy/10.txt
rename to data/kaomoji/happy/10.txt
diff --git a/data/kaomoji/1 - joy/100.txt b/data/kaomoji/happy/100.txt
similarity index 100%
rename from data/kaomoji/1 - joy/100.txt
rename to data/kaomoji/happy/100.txt
diff --git a/data/kaomoji/1 - joy/11.txt b/data/kaomoji/happy/11.txt
similarity index 100%
rename from data/kaomoji/1 - joy/11.txt
rename to data/kaomoji/happy/11.txt
diff --git a/data/kaomoji/1 - joy/12.txt b/data/kaomoji/happy/12.txt
similarity index 100%
rename from data/kaomoji/1 - joy/12.txt
rename to data/kaomoji/happy/12.txt
diff --git a/data/kaomoji/1 - joy/13.txt b/data/kaomoji/happy/13.txt
similarity index 100%
rename from data/kaomoji/1 - joy/13.txt
rename to data/kaomoji/happy/13.txt
diff --git a/data/kaomoji/1 - joy/14.txt b/data/kaomoji/happy/14.txt
similarity index 100%
rename from data/kaomoji/1 - joy/14.txt
rename to data/kaomoji/happy/14.txt
diff --git a/data/kaomoji/1 - joy/15.txt b/data/kaomoji/happy/15.txt
similarity index 100%
rename from data/kaomoji/1 - joy/15.txt
rename to data/kaomoji/happy/15.txt
diff --git a/data/kaomoji/1 - joy/16.txt b/data/kaomoji/happy/16.txt
similarity index 100%
rename from data/kaomoji/1 - joy/16.txt
rename to data/kaomoji/happy/16.txt
diff --git a/data/kaomoji/1 - joy/17.txt b/data/kaomoji/happy/17.txt
similarity index 100%
rename from data/kaomoji/1 - joy/17.txt
rename to data/kaomoji/happy/17.txt
diff --git a/data/kaomoji/1 - joy/18.txt b/data/kaomoji/happy/18.txt
similarity index 100%
rename from data/kaomoji/1 - joy/18.txt
rename to data/kaomoji/happy/18.txt
diff --git a/data/kaomoji/1 - joy/19.txt b/data/kaomoji/happy/19.txt
similarity index 100%
rename from data/kaomoji/1 - joy/19.txt
rename to data/kaomoji/happy/19.txt
diff --git a/data/kaomoji/1 - joy/2.txt b/data/kaomoji/happy/2.txt
similarity index 100%
rename from data/kaomoji/1 - joy/2.txt
rename to data/kaomoji/happy/2.txt
diff --git a/data/kaomoji/1 - joy/20.txt b/data/kaomoji/happy/20.txt
similarity index 100%
rename from data/kaomoji/1 - joy/20.txt
rename to data/kaomoji/happy/20.txt
diff --git a/data/kaomoji/1 - joy/21.txt b/data/kaomoji/happy/21.txt
similarity index 100%
rename from data/kaomoji/1 - joy/21.txt
rename to data/kaomoji/happy/21.txt
diff --git a/data/kaomoji/1 - joy/22.txt b/data/kaomoji/happy/22.txt
similarity index 100%
rename from data/kaomoji/1 - joy/22.txt
rename to data/kaomoji/happy/22.txt
diff --git a/data/kaomoji/1 - joy/23.txt b/data/kaomoji/happy/23.txt
similarity index 100%
rename from data/kaomoji/1 - joy/23.txt
rename to data/kaomoji/happy/23.txt
diff --git a/data/kaomoji/1 - joy/24.txt b/data/kaomoji/happy/24.txt
similarity index 100%
rename from data/kaomoji/1 - joy/24.txt
rename to data/kaomoji/happy/24.txt
diff --git a/data/kaomoji/1 - joy/25.txt b/data/kaomoji/happy/25.txt
similarity index 100%
rename from data/kaomoji/1 - joy/25.txt
rename to data/kaomoji/happy/25.txt
diff --git a/data/kaomoji/1 - joy/26.txt b/data/kaomoji/happy/26.txt
similarity index 100%
rename from data/kaomoji/1 - joy/26.txt
rename to data/kaomoji/happy/26.txt
diff --git a/data/kaomoji/1 - joy/27.txt b/data/kaomoji/happy/27.txt
similarity index 100%
rename from data/kaomoji/1 - joy/27.txt
rename to data/kaomoji/happy/27.txt
diff --git a/data/kaomoji/1 - joy/28.txt b/data/kaomoji/happy/28.txt
similarity index 100%
rename from data/kaomoji/1 - joy/28.txt
rename to data/kaomoji/happy/28.txt
diff --git a/data/kaomoji/1 - joy/29.txt b/data/kaomoji/happy/29.txt
similarity index 100%
rename from data/kaomoji/1 - joy/29.txt
rename to data/kaomoji/happy/29.txt
diff --git a/data/kaomoji/1 - joy/3.txt b/data/kaomoji/happy/3.txt
similarity index 100%
rename from data/kaomoji/1 - joy/3.txt
rename to data/kaomoji/happy/3.txt
diff --git a/data/kaomoji/1 - joy/30.txt b/data/kaomoji/happy/30.txt
similarity index 100%
rename from data/kaomoji/1 - joy/30.txt
rename to data/kaomoji/happy/30.txt
diff --git a/data/kaomoji/1 - joy/31.txt b/data/kaomoji/happy/31.txt
similarity index 100%
rename from data/kaomoji/1 - joy/31.txt
rename to data/kaomoji/happy/31.txt
diff --git a/data/kaomoji/1 - joy/32.txt b/data/kaomoji/happy/32.txt
similarity index 100%
rename from data/kaomoji/1 - joy/32.txt
rename to data/kaomoji/happy/32.txt
diff --git a/data/kaomoji/1 - joy/33.txt b/data/kaomoji/happy/33.txt
similarity index 100%
rename from data/kaomoji/1 - joy/33.txt
rename to data/kaomoji/happy/33.txt
diff --git a/data/kaomoji/1 - joy/34.txt b/data/kaomoji/happy/34.txt
similarity index 100%
rename from data/kaomoji/1 - joy/34.txt
rename to data/kaomoji/happy/34.txt
diff --git a/data/kaomoji/1 - joy/35.txt b/data/kaomoji/happy/35.txt
similarity index 100%
rename from data/kaomoji/1 - joy/35.txt
rename to data/kaomoji/happy/35.txt
diff --git a/data/kaomoji/1 - joy/36.txt b/data/kaomoji/happy/36.txt
similarity index 100%
rename from data/kaomoji/1 - joy/36.txt
rename to data/kaomoji/happy/36.txt
diff --git a/data/kaomoji/1 - joy/37.txt b/data/kaomoji/happy/37.txt
similarity index 100%
rename from data/kaomoji/1 - joy/37.txt
rename to data/kaomoji/happy/37.txt
diff --git a/data/kaomoji/1 - joy/38.txt b/data/kaomoji/happy/38.txt
similarity index 100%
rename from data/kaomoji/1 - joy/38.txt
rename to data/kaomoji/happy/38.txt
diff --git a/data/kaomoji/1 - joy/39.txt b/data/kaomoji/happy/39.txt
similarity index 100%
rename from data/kaomoji/1 - joy/39.txt
rename to data/kaomoji/happy/39.txt
diff --git a/data/kaomoji/1 - joy/4.txt b/data/kaomoji/happy/4.txt
similarity index 100%
rename from data/kaomoji/1 - joy/4.txt
rename to data/kaomoji/happy/4.txt
diff --git a/data/kaomoji/1 - joy/40.txt b/data/kaomoji/happy/40.txt
similarity index 100%
rename from data/kaomoji/1 - joy/40.txt
rename to data/kaomoji/happy/40.txt
diff --git a/data/kaomoji/1 - joy/41.txt b/data/kaomoji/happy/41.txt
similarity index 100%
rename from data/kaomoji/1 - joy/41.txt
rename to data/kaomoji/happy/41.txt
diff --git a/data/kaomoji/1 - joy/42.txt b/data/kaomoji/happy/42.txt
similarity index 100%
rename from data/kaomoji/1 - joy/42.txt
rename to data/kaomoji/happy/42.txt
diff --git a/data/kaomoji/1 - joy/43.txt b/data/kaomoji/happy/43.txt
similarity index 100%
rename from data/kaomoji/1 - joy/43.txt
rename to data/kaomoji/happy/43.txt
diff --git a/data/kaomoji/1 - joy/44.txt b/data/kaomoji/happy/44.txt
similarity index 100%
rename from data/kaomoji/1 - joy/44.txt
rename to data/kaomoji/happy/44.txt
diff --git a/data/kaomoji/1 - joy/45.txt b/data/kaomoji/happy/45.txt
similarity index 100%
rename from data/kaomoji/1 - joy/45.txt
rename to data/kaomoji/happy/45.txt
diff --git a/data/kaomoji/1 - joy/46.txt b/data/kaomoji/happy/46.txt
similarity index 100%
rename from data/kaomoji/1 - joy/46.txt
rename to data/kaomoji/happy/46.txt
diff --git a/data/kaomoji/1 - joy/47.txt b/data/kaomoji/happy/47.txt
similarity index 100%
rename from data/kaomoji/1 - joy/47.txt
rename to data/kaomoji/happy/47.txt
diff --git a/data/kaomoji/1 - joy/48.txt b/data/kaomoji/happy/48.txt
similarity index 100%
rename from data/kaomoji/1 - joy/48.txt
rename to data/kaomoji/happy/48.txt
diff --git a/data/kaomoji/1 - joy/49.txt b/data/kaomoji/happy/49.txt
similarity index 100%
rename from data/kaomoji/1 - joy/49.txt
rename to data/kaomoji/happy/49.txt
diff --git a/data/kaomoji/1 - joy/5.txt b/data/kaomoji/happy/5.txt
similarity index 100%
rename from data/kaomoji/1 - joy/5.txt
rename to data/kaomoji/happy/5.txt
diff --git a/data/kaomoji/1 - joy/50.txt b/data/kaomoji/happy/50.txt
similarity index 100%
rename from data/kaomoji/1 - joy/50.txt
rename to data/kaomoji/happy/50.txt
diff --git a/data/kaomoji/1 - joy/51.txt b/data/kaomoji/happy/51.txt
similarity index 100%
rename from data/kaomoji/1 - joy/51.txt
rename to data/kaomoji/happy/51.txt
diff --git a/data/kaomoji/1 - joy/52.txt b/data/kaomoji/happy/52.txt
similarity index 100%
rename from data/kaomoji/1 - joy/52.txt
rename to data/kaomoji/happy/52.txt
diff --git a/data/kaomoji/1 - joy/53.txt b/data/kaomoji/happy/53.txt
similarity index 100%
rename from data/kaomoji/1 - joy/53.txt
rename to data/kaomoji/happy/53.txt
diff --git a/data/kaomoji/1 - joy/54.txt b/data/kaomoji/happy/54.txt
similarity index 100%
rename from data/kaomoji/1 - joy/54.txt
rename to data/kaomoji/happy/54.txt
diff --git a/data/kaomoji/1 - joy/55.txt b/data/kaomoji/happy/55.txt
similarity index 100%
rename from data/kaomoji/1 - joy/55.txt
rename to data/kaomoji/happy/55.txt
diff --git a/data/kaomoji/1 - joy/56.txt b/data/kaomoji/happy/56.txt
similarity index 100%
rename from data/kaomoji/1 - joy/56.txt
rename to data/kaomoji/happy/56.txt
diff --git a/data/kaomoji/1 - joy/57.txt b/data/kaomoji/happy/57.txt
similarity index 100%
rename from data/kaomoji/1 - joy/57.txt
rename to data/kaomoji/happy/57.txt
diff --git a/data/kaomoji/1 - joy/58.txt b/data/kaomoji/happy/58.txt
similarity index 100%
rename from data/kaomoji/1 - joy/58.txt
rename to data/kaomoji/happy/58.txt
diff --git a/data/kaomoji/1 - joy/59.txt b/data/kaomoji/happy/59.txt
similarity index 100%
rename from data/kaomoji/1 - joy/59.txt
rename to data/kaomoji/happy/59.txt
diff --git a/data/kaomoji/1 - joy/6.txt b/data/kaomoji/happy/6.txt
similarity index 100%
rename from data/kaomoji/1 - joy/6.txt
rename to data/kaomoji/happy/6.txt
diff --git a/data/kaomoji/1 - joy/60.txt b/data/kaomoji/happy/60.txt
similarity index 100%
rename from data/kaomoji/1 - joy/60.txt
rename to data/kaomoji/happy/60.txt
diff --git a/data/kaomoji/1 - joy/61.txt b/data/kaomoji/happy/61.txt
similarity index 100%
rename from data/kaomoji/1 - joy/61.txt
rename to data/kaomoji/happy/61.txt
diff --git a/data/kaomoji/1 - joy/62.txt b/data/kaomoji/happy/62.txt
similarity index 100%
rename from data/kaomoji/1 - joy/62.txt
rename to data/kaomoji/happy/62.txt
diff --git a/data/kaomoji/1 - joy/63.txt b/data/kaomoji/happy/63.txt
similarity index 100%
rename from data/kaomoji/1 - joy/63.txt
rename to data/kaomoji/happy/63.txt
diff --git a/data/kaomoji/1 - joy/64.txt b/data/kaomoji/happy/64.txt
similarity index 100%
rename from data/kaomoji/1 - joy/64.txt
rename to data/kaomoji/happy/64.txt
diff --git a/data/kaomoji/1 - joy/65.txt b/data/kaomoji/happy/65.txt
similarity index 100%
rename from data/kaomoji/1 - joy/65.txt
rename to data/kaomoji/happy/65.txt
diff --git a/data/kaomoji/1 - joy/66.txt b/data/kaomoji/happy/66.txt
similarity index 100%
rename from data/kaomoji/1 - joy/66.txt
rename to data/kaomoji/happy/66.txt
diff --git a/data/kaomoji/1 - joy/67.txt b/data/kaomoji/happy/67.txt
similarity index 100%
rename from data/kaomoji/1 - joy/67.txt
rename to data/kaomoji/happy/67.txt
diff --git a/data/kaomoji/1 - joy/68.txt b/data/kaomoji/happy/68.txt
similarity index 100%
rename from data/kaomoji/1 - joy/68.txt
rename to data/kaomoji/happy/68.txt
diff --git a/data/kaomoji/1 - joy/69.txt b/data/kaomoji/happy/69.txt
similarity index 100%
rename from data/kaomoji/1 - joy/69.txt
rename to data/kaomoji/happy/69.txt
diff --git a/data/kaomoji/1 - joy/7.txt b/data/kaomoji/happy/7.txt
similarity index 100%
rename from data/kaomoji/1 - joy/7.txt
rename to data/kaomoji/happy/7.txt
diff --git a/data/kaomoji/1 - joy/70.txt b/data/kaomoji/happy/70.txt
similarity index 100%
rename from data/kaomoji/1 - joy/70.txt
rename to data/kaomoji/happy/70.txt
diff --git a/data/kaomoji/1 - joy/71.txt b/data/kaomoji/happy/71.txt
similarity index 100%
rename from data/kaomoji/1 - joy/71.txt
rename to data/kaomoji/happy/71.txt
diff --git a/data/kaomoji/1 - joy/72.txt b/data/kaomoji/happy/72.txt
similarity index 100%
rename from data/kaomoji/1 - joy/72.txt
rename to data/kaomoji/happy/72.txt
diff --git a/data/kaomoji/1 - joy/73.txt b/data/kaomoji/happy/73.txt
similarity index 100%
rename from data/kaomoji/1 - joy/73.txt
rename to data/kaomoji/happy/73.txt
diff --git a/data/kaomoji/1 - joy/74.txt b/data/kaomoji/happy/74.txt
similarity index 100%
rename from data/kaomoji/1 - joy/74.txt
rename to data/kaomoji/happy/74.txt
diff --git a/data/kaomoji/1 - joy/75.txt b/data/kaomoji/happy/75.txt
similarity index 100%
rename from data/kaomoji/1 - joy/75.txt
rename to data/kaomoji/happy/75.txt
diff --git a/data/kaomoji/1 - joy/76.txt b/data/kaomoji/happy/76.txt
similarity index 100%
rename from data/kaomoji/1 - joy/76.txt
rename to data/kaomoji/happy/76.txt
diff --git a/data/kaomoji/1 - joy/77.txt b/data/kaomoji/happy/77.txt
similarity index 100%
rename from data/kaomoji/1 - joy/77.txt
rename to data/kaomoji/happy/77.txt
diff --git a/data/kaomoji/1 - joy/78.txt b/data/kaomoji/happy/78.txt
similarity index 100%
rename from data/kaomoji/1 - joy/78.txt
rename to data/kaomoji/happy/78.txt
diff --git a/data/kaomoji/1 - joy/79.txt b/data/kaomoji/happy/79.txt
similarity index 100%
rename from data/kaomoji/1 - joy/79.txt
rename to data/kaomoji/happy/79.txt
diff --git a/data/kaomoji/1 - joy/8.txt b/data/kaomoji/happy/8.txt
similarity index 100%
rename from data/kaomoji/1 - joy/8.txt
rename to data/kaomoji/happy/8.txt
diff --git a/data/kaomoji/1 - joy/80.txt b/data/kaomoji/happy/80.txt
similarity index 100%
rename from data/kaomoji/1 - joy/80.txt
rename to data/kaomoji/happy/80.txt
diff --git a/data/kaomoji/1 - joy/81.txt b/data/kaomoji/happy/81.txt
similarity index 100%
rename from data/kaomoji/1 - joy/81.txt
rename to data/kaomoji/happy/81.txt
diff --git a/data/kaomoji/1 - joy/82.txt b/data/kaomoji/happy/82.txt
similarity index 100%
rename from data/kaomoji/1 - joy/82.txt
rename to data/kaomoji/happy/82.txt
diff --git a/data/kaomoji/1 - joy/83.txt b/data/kaomoji/happy/83.txt
similarity index 100%
rename from data/kaomoji/1 - joy/83.txt
rename to data/kaomoji/happy/83.txt
diff --git a/data/kaomoji/1 - joy/84.txt b/data/kaomoji/happy/84.txt
similarity index 100%
rename from data/kaomoji/1 - joy/84.txt
rename to data/kaomoji/happy/84.txt
diff --git a/data/kaomoji/1 - joy/85.txt b/data/kaomoji/happy/85.txt
similarity index 100%
rename from data/kaomoji/1 - joy/85.txt
rename to data/kaomoji/happy/85.txt
diff --git a/data/kaomoji/1 - joy/86.txt b/data/kaomoji/happy/86.txt
similarity index 100%
rename from data/kaomoji/1 - joy/86.txt
rename to data/kaomoji/happy/86.txt
diff --git a/data/kaomoji/1 - joy/87.txt b/data/kaomoji/happy/87.txt
similarity index 100%
rename from data/kaomoji/1 - joy/87.txt
rename to data/kaomoji/happy/87.txt
diff --git a/data/kaomoji/1 - joy/88.txt b/data/kaomoji/happy/88.txt
similarity index 100%
rename from data/kaomoji/1 - joy/88.txt
rename to data/kaomoji/happy/88.txt
diff --git a/data/kaomoji/1 - joy/89.txt b/data/kaomoji/happy/89.txt
similarity index 100%
rename from data/kaomoji/1 - joy/89.txt
rename to data/kaomoji/happy/89.txt
diff --git a/data/kaomoji/1 - joy/9.txt b/data/kaomoji/happy/9.txt
similarity index 100%
rename from data/kaomoji/1 - joy/9.txt
rename to data/kaomoji/happy/9.txt
diff --git a/data/kaomoji/1 - joy/90.txt b/data/kaomoji/happy/90.txt
similarity index 100%
rename from data/kaomoji/1 - joy/90.txt
rename to data/kaomoji/happy/90.txt
diff --git a/data/kaomoji/1 - joy/91.txt b/data/kaomoji/happy/91.txt
similarity index 100%
rename from data/kaomoji/1 - joy/91.txt
rename to data/kaomoji/happy/91.txt
diff --git a/data/kaomoji/1 - joy/92.txt b/data/kaomoji/happy/92.txt
similarity index 100%
rename from data/kaomoji/1 - joy/92.txt
rename to data/kaomoji/happy/92.txt
diff --git a/data/kaomoji/1 - joy/93.txt b/data/kaomoji/happy/93.txt
similarity index 100%
rename from data/kaomoji/1 - joy/93.txt
rename to data/kaomoji/happy/93.txt
diff --git a/data/kaomoji/1 - joy/94.txt b/data/kaomoji/happy/94.txt
similarity index 100%
rename from data/kaomoji/1 - joy/94.txt
rename to data/kaomoji/happy/94.txt
diff --git a/data/kaomoji/1 - joy/95.txt b/data/kaomoji/happy/95.txt
similarity index 100%
rename from data/kaomoji/1 - joy/95.txt
rename to data/kaomoji/happy/95.txt
diff --git a/data/kaomoji/1 - joy/96.txt b/data/kaomoji/happy/96.txt
similarity index 100%
rename from data/kaomoji/1 - joy/96.txt
rename to data/kaomoji/happy/96.txt
diff --git a/data/kaomoji/1 - joy/97.txt b/data/kaomoji/happy/97.txt
similarity index 100%
rename from data/kaomoji/1 - joy/97.txt
rename to data/kaomoji/happy/97.txt
diff --git a/data/kaomoji/1 - joy/98.txt b/data/kaomoji/happy/98.txt
similarity index 100%
rename from data/kaomoji/1 - joy/98.txt
rename to data/kaomoji/happy/98.txt
diff --git a/data/kaomoji/1 - joy/99.txt b/data/kaomoji/happy/99.txt
similarity index 100%
rename from data/kaomoji/1 - joy/99.txt
rename to data/kaomoji/happy/99.txt
diff --git a/data/kaomoji/hiding/.name b/data/kaomoji/hiding/.name
new file mode 100644
index 0000000..82ecb10
--- /dev/null
+++ b/data/kaomoji/hiding/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ hiding
diff --git a/data/kaomoji/15 - hiding/1.txt b/data/kaomoji/hiding/1.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/1.txt
rename to data/kaomoji/hiding/1.txt
diff --git a/data/kaomoji/15 - hiding/10.txt b/data/kaomoji/hiding/10.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/10.txt
rename to data/kaomoji/hiding/10.txt
diff --git a/data/kaomoji/15 - hiding/11.txt b/data/kaomoji/hiding/11.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/11.txt
rename to data/kaomoji/hiding/11.txt
diff --git a/data/kaomoji/15 - hiding/12.txt b/data/kaomoji/hiding/12.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/12.txt
rename to data/kaomoji/hiding/12.txt
diff --git a/data/kaomoji/15 - hiding/13.txt b/data/kaomoji/hiding/13.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/13.txt
rename to data/kaomoji/hiding/13.txt
diff --git a/data/kaomoji/15 - hiding/14.txt b/data/kaomoji/hiding/14.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/14.txt
rename to data/kaomoji/hiding/14.txt
diff --git a/data/kaomoji/15 - hiding/2.txt b/data/kaomoji/hiding/2.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/2.txt
rename to data/kaomoji/hiding/2.txt
diff --git a/data/kaomoji/15 - hiding/3.txt b/data/kaomoji/hiding/3.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/3.txt
rename to data/kaomoji/hiding/3.txt
diff --git a/data/kaomoji/15 - hiding/4.txt b/data/kaomoji/hiding/4.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/4.txt
rename to data/kaomoji/hiding/4.txt
diff --git a/data/kaomoji/15 - hiding/5.txt b/data/kaomoji/hiding/5.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/5.txt
rename to data/kaomoji/hiding/5.txt
diff --git a/data/kaomoji/15 - hiding/6.txt b/data/kaomoji/hiding/6.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/6.txt
rename to data/kaomoji/hiding/6.txt
diff --git a/data/kaomoji/15 - hiding/7.txt b/data/kaomoji/hiding/7.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/7.txt
rename to data/kaomoji/hiding/7.txt
diff --git a/data/kaomoji/15 - hiding/8.txt b/data/kaomoji/hiding/8.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/8.txt
rename to data/kaomoji/hiding/8.txt
diff --git a/data/kaomoji/15 - hiding/9.txt b/data/kaomoji/hiding/9.txt
similarity index 100%
rename from data/kaomoji/15 - hiding/9.txt
rename to data/kaomoji/hiding/9.txt
diff --git a/data/kaomoji/hugging/.name b/data/kaomoji/hugging/.name
new file mode 100644
index 0000000..80dcae4
--- /dev/null
+++ b/data/kaomoji/hugging/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ hugging
diff --git a/data/kaomoji/16 - hugging/1.txt b/data/kaomoji/hugging/1.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/1.txt
rename to data/kaomoji/hugging/1.txt
diff --git a/data/kaomoji/16 - hugging/10.txt b/data/kaomoji/hugging/10.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/10.txt
rename to data/kaomoji/hugging/10.txt
diff --git a/data/kaomoji/16 - hugging/11.txt b/data/kaomoji/hugging/11.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/11.txt
rename to data/kaomoji/hugging/11.txt
diff --git a/data/kaomoji/16 - hugging/12.txt b/data/kaomoji/hugging/12.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/12.txt
rename to data/kaomoji/hugging/12.txt
diff --git a/data/kaomoji/16 - hugging/13.txt b/data/kaomoji/hugging/13.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/13.txt
rename to data/kaomoji/hugging/13.txt
diff --git a/data/kaomoji/16 - hugging/14.txt b/data/kaomoji/hugging/14.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/14.txt
rename to data/kaomoji/hugging/14.txt
diff --git a/data/kaomoji/16 - hugging/15.txt b/data/kaomoji/hugging/15.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/15.txt
rename to data/kaomoji/hugging/15.txt
diff --git a/data/kaomoji/16 - hugging/16.txt b/data/kaomoji/hugging/16.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/16.txt
rename to data/kaomoji/hugging/16.txt
diff --git a/data/kaomoji/16 - hugging/2.txt b/data/kaomoji/hugging/2.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/2.txt
rename to data/kaomoji/hugging/2.txt
diff --git a/data/kaomoji/16 - hugging/3.txt b/data/kaomoji/hugging/3.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/3.txt
rename to data/kaomoji/hugging/3.txt
diff --git a/data/kaomoji/16 - hugging/4.txt b/data/kaomoji/hugging/4.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/4.txt
rename to data/kaomoji/hugging/4.txt
diff --git a/data/kaomoji/16 - hugging/5.txt b/data/kaomoji/hugging/5.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/5.txt
rename to data/kaomoji/hugging/5.txt
diff --git a/data/kaomoji/16 - hugging/6.txt b/data/kaomoji/hugging/6.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/6.txt
rename to data/kaomoji/hugging/6.txt
diff --git a/data/kaomoji/16 - hugging/7.txt b/data/kaomoji/hugging/7.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/7.txt
rename to data/kaomoji/hugging/7.txt
diff --git a/data/kaomoji/16 - hugging/8.txt b/data/kaomoji/hugging/8.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/8.txt
rename to data/kaomoji/hugging/8.txt
diff --git a/data/kaomoji/16 - hugging/9.txt b/data/kaomoji/hugging/9.txt
similarity index 100%
rename from data/kaomoji/16 - hugging/9.txt
rename to data/kaomoji/hugging/9.txt
diff --git a/data/kaomoji/indifference/.name b/data/kaomoji/indifference/.name
new file mode 100644
index 0000000..83cfebd
--- /dev/null
+++ b/data/kaomoji/indifference/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ indifference
diff --git a/data/kaomoji/17 - indifference/1.txt b/data/kaomoji/indifference/1.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/1.txt
rename to data/kaomoji/indifference/1.txt
diff --git a/data/kaomoji/17 - indifference/10.txt b/data/kaomoji/indifference/10.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/10.txt
rename to data/kaomoji/indifference/10.txt
diff --git a/data/kaomoji/17 - indifference/11.txt b/data/kaomoji/indifference/11.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/11.txt
rename to data/kaomoji/indifference/11.txt
diff --git a/data/kaomoji/17 - indifference/12.txt b/data/kaomoji/indifference/12.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/12.txt
rename to data/kaomoji/indifference/12.txt
diff --git a/data/kaomoji/17 - indifference/13.txt b/data/kaomoji/indifference/13.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/13.txt
rename to data/kaomoji/indifference/13.txt
diff --git a/data/kaomoji/17 - indifference/14.txt b/data/kaomoji/indifference/14.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/14.txt
rename to data/kaomoji/indifference/14.txt
diff --git a/data/kaomoji/17 - indifference/15.txt b/data/kaomoji/indifference/15.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/15.txt
rename to data/kaomoji/indifference/15.txt
diff --git a/data/kaomoji/17 - indifference/16.txt b/data/kaomoji/indifference/16.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/16.txt
rename to data/kaomoji/indifference/16.txt
diff --git a/data/kaomoji/17 - indifference/17.txt b/data/kaomoji/indifference/17.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/17.txt
rename to data/kaomoji/indifference/17.txt
diff --git a/data/kaomoji/17 - indifference/18.txt b/data/kaomoji/indifference/18.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/18.txt
rename to data/kaomoji/indifference/18.txt
diff --git a/data/kaomoji/17 - indifference/19.txt b/data/kaomoji/indifference/19.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/19.txt
rename to data/kaomoji/indifference/19.txt
diff --git a/data/kaomoji/17 - indifference/2.txt b/data/kaomoji/indifference/2.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/2.txt
rename to data/kaomoji/indifference/2.txt
diff --git a/data/kaomoji/17 - indifference/20.txt b/data/kaomoji/indifference/20.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/20.txt
rename to data/kaomoji/indifference/20.txt
diff --git a/data/kaomoji/17 - indifference/21.txt b/data/kaomoji/indifference/21.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/21.txt
rename to data/kaomoji/indifference/21.txt
diff --git a/data/kaomoji/17 - indifference/22.txt b/data/kaomoji/indifference/22.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/22.txt
rename to data/kaomoji/indifference/22.txt
diff --git a/data/kaomoji/17 - indifference/23.txt b/data/kaomoji/indifference/23.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/23.txt
rename to data/kaomoji/indifference/23.txt
diff --git a/data/kaomoji/17 - indifference/3.txt b/data/kaomoji/indifference/3.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/3.txt
rename to data/kaomoji/indifference/3.txt
diff --git a/data/kaomoji/17 - indifference/4.txt b/data/kaomoji/indifference/4.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/4.txt
rename to data/kaomoji/indifference/4.txt
diff --git a/data/kaomoji/17 - indifference/5.txt b/data/kaomoji/indifference/5.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/5.txt
rename to data/kaomoji/indifference/5.txt
diff --git a/data/kaomoji/17 - indifference/6.txt b/data/kaomoji/indifference/6.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/6.txt
rename to data/kaomoji/indifference/6.txt
diff --git a/data/kaomoji/17 - indifference/7.txt b/data/kaomoji/indifference/7.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/7.txt
rename to data/kaomoji/indifference/7.txt
diff --git a/data/kaomoji/17 - indifference/8.txt b/data/kaomoji/indifference/8.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/8.txt
rename to data/kaomoji/indifference/8.txt
diff --git a/data/kaomoji/17 - indifference/9.txt b/data/kaomoji/indifference/9.txt
similarity index 100%
rename from data/kaomoji/17 - indifference/9.txt
rename to data/kaomoji/indifference/9.txt
diff --git a/data/kaomoji/love/.name b/data/kaomoji/love/.name
new file mode 100644
index 0000000..dba19a2
--- /dev/null
+++ b/data/kaomoji/love/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ love
diff --git a/data/kaomoji/2 - love/1.txt b/data/kaomoji/love/1.txt
similarity index 100%
rename from data/kaomoji/2 - love/1.txt
rename to data/kaomoji/love/1.txt
diff --git a/data/kaomoji/2 - love/10.txt b/data/kaomoji/love/10.txt
similarity index 100%
rename from data/kaomoji/2 - love/10.txt
rename to data/kaomoji/love/10.txt
diff --git a/data/kaomoji/2 - love/11.txt b/data/kaomoji/love/11.txt
similarity index 100%
rename from data/kaomoji/2 - love/11.txt
rename to data/kaomoji/love/11.txt
diff --git a/data/kaomoji/2 - love/12.txt b/data/kaomoji/love/12.txt
similarity index 100%
rename from data/kaomoji/2 - love/12.txt
rename to data/kaomoji/love/12.txt
diff --git a/data/kaomoji/2 - love/13.txt b/data/kaomoji/love/13.txt
similarity index 100%
rename from data/kaomoji/2 - love/13.txt
rename to data/kaomoji/love/13.txt
diff --git a/data/kaomoji/2 - love/14.txt b/data/kaomoji/love/14.txt
similarity index 100%
rename from data/kaomoji/2 - love/14.txt
rename to data/kaomoji/love/14.txt
diff --git a/data/kaomoji/2 - love/15.txt b/data/kaomoji/love/15.txt
similarity index 100%
rename from data/kaomoji/2 - love/15.txt
rename to data/kaomoji/love/15.txt
diff --git a/data/kaomoji/2 - love/16.txt b/data/kaomoji/love/16.txt
similarity index 100%
rename from data/kaomoji/2 - love/16.txt
rename to data/kaomoji/love/16.txt
diff --git a/data/kaomoji/2 - love/17.txt b/data/kaomoji/love/17.txt
similarity index 100%
rename from data/kaomoji/2 - love/17.txt
rename to data/kaomoji/love/17.txt
diff --git a/data/kaomoji/2 - love/18.txt b/data/kaomoji/love/18.txt
similarity index 100%
rename from data/kaomoji/2 - love/18.txt
rename to data/kaomoji/love/18.txt
diff --git a/data/kaomoji/2 - love/19.txt b/data/kaomoji/love/19.txt
similarity index 100%
rename from data/kaomoji/2 - love/19.txt
rename to data/kaomoji/love/19.txt
diff --git a/data/kaomoji/2 - love/2.txt b/data/kaomoji/love/2.txt
similarity index 100%
rename from data/kaomoji/2 - love/2.txt
rename to data/kaomoji/love/2.txt
diff --git a/data/kaomoji/2 - love/20.txt b/data/kaomoji/love/20.txt
similarity index 100%
rename from data/kaomoji/2 - love/20.txt
rename to data/kaomoji/love/20.txt
diff --git a/data/kaomoji/2 - love/21.txt b/data/kaomoji/love/21.txt
similarity index 100%
rename from data/kaomoji/2 - love/21.txt
rename to data/kaomoji/love/21.txt
diff --git a/data/kaomoji/2 - love/22.txt b/data/kaomoji/love/22.txt
similarity index 100%
rename from data/kaomoji/2 - love/22.txt
rename to data/kaomoji/love/22.txt
diff --git a/data/kaomoji/2 - love/23.txt b/data/kaomoji/love/23.txt
similarity index 100%
rename from data/kaomoji/2 - love/23.txt
rename to data/kaomoji/love/23.txt
diff --git a/data/kaomoji/2 - love/24.txt b/data/kaomoji/love/24.txt
similarity index 100%
rename from data/kaomoji/2 - love/24.txt
rename to data/kaomoji/love/24.txt
diff --git a/data/kaomoji/2 - love/25.txt b/data/kaomoji/love/25.txt
similarity index 100%
rename from data/kaomoji/2 - love/25.txt
rename to data/kaomoji/love/25.txt
diff --git a/data/kaomoji/2 - love/26.txt b/data/kaomoji/love/26.txt
similarity index 100%
rename from data/kaomoji/2 - love/26.txt
rename to data/kaomoji/love/26.txt
diff --git a/data/kaomoji/2 - love/27.txt b/data/kaomoji/love/27.txt
similarity index 100%
rename from data/kaomoji/2 - love/27.txt
rename to data/kaomoji/love/27.txt
diff --git a/data/kaomoji/2 - love/28.txt b/data/kaomoji/love/28.txt
similarity index 100%
rename from data/kaomoji/2 - love/28.txt
rename to data/kaomoji/love/28.txt
diff --git a/data/kaomoji/2 - love/29.txt b/data/kaomoji/love/29.txt
similarity index 100%
rename from data/kaomoji/2 - love/29.txt
rename to data/kaomoji/love/29.txt
diff --git a/data/kaomoji/2 - love/3.txt b/data/kaomoji/love/3.txt
similarity index 100%
rename from data/kaomoji/2 - love/3.txt
rename to data/kaomoji/love/3.txt
diff --git a/data/kaomoji/2 - love/30.txt b/data/kaomoji/love/30.txt
similarity index 100%
rename from data/kaomoji/2 - love/30.txt
rename to data/kaomoji/love/30.txt
diff --git a/data/kaomoji/2 - love/31.txt b/data/kaomoji/love/31.txt
similarity index 100%
rename from data/kaomoji/2 - love/31.txt
rename to data/kaomoji/love/31.txt
diff --git a/data/kaomoji/2 - love/32.txt b/data/kaomoji/love/32.txt
similarity index 100%
rename from data/kaomoji/2 - love/32.txt
rename to data/kaomoji/love/32.txt
diff --git a/data/kaomoji/2 - love/33.txt b/data/kaomoji/love/33.txt
similarity index 100%
rename from data/kaomoji/2 - love/33.txt
rename to data/kaomoji/love/33.txt
diff --git a/data/kaomoji/2 - love/34.txt b/data/kaomoji/love/34.txt
similarity index 100%
rename from data/kaomoji/2 - love/34.txt
rename to data/kaomoji/love/34.txt
diff --git a/data/kaomoji/2 - love/35.txt b/data/kaomoji/love/35.txt
similarity index 100%
rename from data/kaomoji/2 - love/35.txt
rename to data/kaomoji/love/35.txt
diff --git a/data/kaomoji/2 - love/36.txt b/data/kaomoji/love/36.txt
similarity index 100%
rename from data/kaomoji/2 - love/36.txt
rename to data/kaomoji/love/36.txt
diff --git a/data/kaomoji/2 - love/37.txt b/data/kaomoji/love/37.txt
similarity index 100%
rename from data/kaomoji/2 - love/37.txt
rename to data/kaomoji/love/37.txt
diff --git a/data/kaomoji/2 - love/38.txt b/data/kaomoji/love/38.txt
similarity index 100%
rename from data/kaomoji/2 - love/38.txt
rename to data/kaomoji/love/38.txt
diff --git a/data/kaomoji/2 - love/39.txt b/data/kaomoji/love/39.txt
similarity index 100%
rename from data/kaomoji/2 - love/39.txt
rename to data/kaomoji/love/39.txt
diff --git a/data/kaomoji/2 - love/4.txt b/data/kaomoji/love/4.txt
similarity index 100%
rename from data/kaomoji/2 - love/4.txt
rename to data/kaomoji/love/4.txt
diff --git a/data/kaomoji/2 - love/40.txt b/data/kaomoji/love/40.txt
similarity index 100%
rename from data/kaomoji/2 - love/40.txt
rename to data/kaomoji/love/40.txt
diff --git a/data/kaomoji/2 - love/41.txt b/data/kaomoji/love/41.txt
similarity index 100%
rename from data/kaomoji/2 - love/41.txt
rename to data/kaomoji/love/41.txt
diff --git a/data/kaomoji/2 - love/42.txt b/data/kaomoji/love/42.txt
similarity index 100%
rename from data/kaomoji/2 - love/42.txt
rename to data/kaomoji/love/42.txt
diff --git a/data/kaomoji/2 - love/43.txt b/data/kaomoji/love/43.txt
similarity index 100%
rename from data/kaomoji/2 - love/43.txt
rename to data/kaomoji/love/43.txt
diff --git a/data/kaomoji/2 - love/44.txt b/data/kaomoji/love/44.txt
similarity index 100%
rename from data/kaomoji/2 - love/44.txt
rename to data/kaomoji/love/44.txt
diff --git a/data/kaomoji/2 - love/45.txt b/data/kaomoji/love/45.txt
similarity index 100%
rename from data/kaomoji/2 - love/45.txt
rename to data/kaomoji/love/45.txt
diff --git a/data/kaomoji/2 - love/46.txt b/data/kaomoji/love/46.txt
similarity index 100%
rename from data/kaomoji/2 - love/46.txt
rename to data/kaomoji/love/46.txt
diff --git a/data/kaomoji/2 - love/47.txt b/data/kaomoji/love/47.txt
similarity index 100%
rename from data/kaomoji/2 - love/47.txt
rename to data/kaomoji/love/47.txt
diff --git a/data/kaomoji/2 - love/48.txt b/data/kaomoji/love/48.txt
similarity index 100%
rename from data/kaomoji/2 - love/48.txt
rename to data/kaomoji/love/48.txt
diff --git a/data/kaomoji/2 - love/49.txt b/data/kaomoji/love/49.txt
similarity index 100%
rename from data/kaomoji/2 - love/49.txt
rename to data/kaomoji/love/49.txt
diff --git a/data/kaomoji/2 - love/5.txt b/data/kaomoji/love/5.txt
similarity index 100%
rename from data/kaomoji/2 - love/5.txt
rename to data/kaomoji/love/5.txt
diff --git a/data/kaomoji/2 - love/50.txt b/data/kaomoji/love/50.txt
similarity index 100%
rename from data/kaomoji/2 - love/50.txt
rename to data/kaomoji/love/50.txt
diff --git a/data/kaomoji/2 - love/51.txt b/data/kaomoji/love/51.txt
similarity index 100%
rename from data/kaomoji/2 - love/51.txt
rename to data/kaomoji/love/51.txt
diff --git a/data/kaomoji/2 - love/52.txt b/data/kaomoji/love/52.txt
similarity index 100%
rename from data/kaomoji/2 - love/52.txt
rename to data/kaomoji/love/52.txt
diff --git a/data/kaomoji/2 - love/6.txt b/data/kaomoji/love/6.txt
similarity index 100%
rename from data/kaomoji/2 - love/6.txt
rename to data/kaomoji/love/6.txt
diff --git a/data/kaomoji/2 - love/7.txt b/data/kaomoji/love/7.txt
similarity index 100%
rename from data/kaomoji/2 - love/7.txt
rename to data/kaomoji/love/7.txt
diff --git a/data/kaomoji/2 - love/8.txt b/data/kaomoji/love/8.txt
similarity index 100%
rename from data/kaomoji/2 - love/8.txt
rename to data/kaomoji/love/8.txt
diff --git a/data/kaomoji/2 - love/9.txt b/data/kaomoji/love/9.txt
similarity index 100%
rename from data/kaomoji/2 - love/9.txt
rename to data/kaomoji/love/9.txt
diff --git a/data/kaomoji/magic/.name b/data/kaomoji/magic/.name
new file mode 100644
index 0000000..a6fcc93
--- /dev/null
+++ b/data/kaomoji/magic/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ magic
diff --git a/data/kaomoji/26 - magic/1.txt b/data/kaomoji/magic/1.txt
similarity index 100%
rename from data/kaomoji/26 - magic/1.txt
rename to data/kaomoji/magic/1.txt
diff --git a/data/kaomoji/26 - magic/10.txt b/data/kaomoji/magic/10.txt
similarity index 100%
rename from data/kaomoji/26 - magic/10.txt
rename to data/kaomoji/magic/10.txt
diff --git a/data/kaomoji/26 - magic/2.txt b/data/kaomoji/magic/2.txt
similarity index 100%
rename from data/kaomoji/26 - magic/2.txt
rename to data/kaomoji/magic/2.txt
diff --git a/data/kaomoji/26 - magic/3.txt b/data/kaomoji/magic/3.txt
similarity index 100%
rename from data/kaomoji/26 - magic/3.txt
rename to data/kaomoji/magic/3.txt
diff --git a/data/kaomoji/26 - magic/4.txt b/data/kaomoji/magic/4.txt
similarity index 100%
rename from data/kaomoji/26 - magic/4.txt
rename to data/kaomoji/magic/4.txt
diff --git a/data/kaomoji/26 - magic/5.txt b/data/kaomoji/magic/5.txt
similarity index 100%
rename from data/kaomoji/26 - magic/5.txt
rename to data/kaomoji/magic/5.txt
diff --git a/data/kaomoji/26 - magic/6.txt b/data/kaomoji/magic/6.txt
similarity index 100%
rename from data/kaomoji/26 - magic/6.txt
rename to data/kaomoji/magic/6.txt
diff --git a/data/kaomoji/26 - magic/7.txt b/data/kaomoji/magic/7.txt
similarity index 100%
rename from data/kaomoji/26 - magic/7.txt
rename to data/kaomoji/magic/7.txt
diff --git a/data/kaomoji/26 - magic/8.txt b/data/kaomoji/magic/8.txt
similarity index 100%
rename from data/kaomoji/26 - magic/8.txt
rename to data/kaomoji/magic/8.txt
diff --git a/data/kaomoji/26 - magic/9.txt b/data/kaomoji/magic/9.txt
similarity index 100%
rename from data/kaomoji/26 - magic/9.txt
rename to data/kaomoji/magic/9.txt
diff --git a/data/kaomoji/music/.name b/data/kaomoji/music/.name
new file mode 100644
index 0000000..cf10d26
--- /dev/null
+++ b/data/kaomoji/music/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ music
diff --git a/data/kaomoji/18 - music/1.txt b/data/kaomoji/music/1.txt
similarity index 100%
rename from data/kaomoji/18 - music/1.txt
rename to data/kaomoji/music/1.txt
diff --git a/data/kaomoji/18 - music/10.txt b/data/kaomoji/music/10.txt
similarity index 100%
rename from data/kaomoji/18 - music/10.txt
rename to data/kaomoji/music/10.txt
diff --git a/data/kaomoji/18 - music/11.txt b/data/kaomoji/music/11.txt
similarity index 100%
rename from data/kaomoji/18 - music/11.txt
rename to data/kaomoji/music/11.txt
diff --git a/data/kaomoji/18 - music/12.txt b/data/kaomoji/music/12.txt
similarity index 100%
rename from data/kaomoji/18 - music/12.txt
rename to data/kaomoji/music/12.txt
diff --git a/data/kaomoji/18 - music/13.txt b/data/kaomoji/music/13.txt
similarity index 100%
rename from data/kaomoji/18 - music/13.txt
rename to data/kaomoji/music/13.txt
diff --git a/data/kaomoji/18 - music/14.txt b/data/kaomoji/music/14.txt
similarity index 100%
rename from data/kaomoji/18 - music/14.txt
rename to data/kaomoji/music/14.txt
diff --git a/data/kaomoji/18 - music/15.txt b/data/kaomoji/music/15.txt
similarity index 100%
rename from data/kaomoji/18 - music/15.txt
rename to data/kaomoji/music/15.txt
diff --git a/data/kaomoji/18 - music/16.txt b/data/kaomoji/music/16.txt
similarity index 100%
rename from data/kaomoji/18 - music/16.txt
rename to data/kaomoji/music/16.txt
diff --git a/data/kaomoji/18 - music/17.txt b/data/kaomoji/music/17.txt
similarity index 100%
rename from data/kaomoji/18 - music/17.txt
rename to data/kaomoji/music/17.txt
diff --git a/data/kaomoji/18 - music/18.txt b/data/kaomoji/music/18.txt
similarity index 100%
rename from data/kaomoji/18 - music/18.txt
rename to data/kaomoji/music/18.txt
diff --git a/data/kaomoji/18 - music/19.txt b/data/kaomoji/music/19.txt
similarity index 100%
rename from data/kaomoji/18 - music/19.txt
rename to data/kaomoji/music/19.txt
diff --git a/data/kaomoji/18 - music/2.txt b/data/kaomoji/music/2.txt
similarity index 100%
rename from data/kaomoji/18 - music/2.txt
rename to data/kaomoji/music/2.txt
diff --git a/data/kaomoji/18 - music/20.txt b/data/kaomoji/music/20.txt
similarity index 100%
rename from data/kaomoji/18 - music/20.txt
rename to data/kaomoji/music/20.txt
diff --git a/data/kaomoji/18 - music/21.txt b/data/kaomoji/music/21.txt
similarity index 100%
rename from data/kaomoji/18 - music/21.txt
rename to data/kaomoji/music/21.txt
diff --git a/data/kaomoji/18 - music/22.txt b/data/kaomoji/music/22.txt
similarity index 100%
rename from data/kaomoji/18 - music/22.txt
rename to data/kaomoji/music/22.txt
diff --git a/data/kaomoji/18 - music/23.txt b/data/kaomoji/music/23.txt
similarity index 100%
rename from data/kaomoji/18 - music/23.txt
rename to data/kaomoji/music/23.txt
diff --git a/data/kaomoji/18 - music/24.txt b/data/kaomoji/music/24.txt
similarity index 100%
rename from data/kaomoji/18 - music/24.txt
rename to data/kaomoji/music/24.txt
diff --git a/data/kaomoji/18 - music/25.txt b/data/kaomoji/music/25.txt
similarity index 100%
rename from data/kaomoji/18 - music/25.txt
rename to data/kaomoji/music/25.txt
diff --git a/data/kaomoji/18 - music/26.txt b/data/kaomoji/music/26.txt
similarity index 100%
rename from data/kaomoji/18 - music/26.txt
rename to data/kaomoji/music/26.txt
diff --git a/data/kaomoji/18 - music/27.txt b/data/kaomoji/music/27.txt
similarity index 100%
rename from data/kaomoji/18 - music/27.txt
rename to data/kaomoji/music/27.txt
diff --git a/data/kaomoji/18 - music/28.txt b/data/kaomoji/music/28.txt
similarity index 100%
rename from data/kaomoji/18 - music/28.txt
rename to data/kaomoji/music/28.txt
diff --git a/data/kaomoji/18 - music/29.txt b/data/kaomoji/music/29.txt
similarity index 100%
rename from data/kaomoji/18 - music/29.txt
rename to data/kaomoji/music/29.txt
diff --git a/data/kaomoji/18 - music/3.txt b/data/kaomoji/music/3.txt
similarity index 100%
rename from data/kaomoji/18 - music/3.txt
rename to data/kaomoji/music/3.txt
diff --git a/data/kaomoji/18 - music/30.txt b/data/kaomoji/music/30.txt
similarity index 100%
rename from data/kaomoji/18 - music/30.txt
rename to data/kaomoji/music/30.txt
diff --git a/data/kaomoji/18 - music/31.txt b/data/kaomoji/music/31.txt
similarity index 100%
rename from data/kaomoji/18 - music/31.txt
rename to data/kaomoji/music/31.txt
diff --git a/data/kaomoji/18 - music/32.txt b/data/kaomoji/music/32.txt
similarity index 100%
rename from data/kaomoji/18 - music/32.txt
rename to data/kaomoji/music/32.txt
diff --git a/data/kaomoji/18 - music/4.txt b/data/kaomoji/music/4.txt
similarity index 100%
rename from data/kaomoji/18 - music/4.txt
rename to data/kaomoji/music/4.txt
diff --git a/data/kaomoji/18 - music/5.txt b/data/kaomoji/music/5.txt
similarity index 100%
rename from data/kaomoji/18 - music/5.txt
rename to data/kaomoji/music/5.txt
diff --git a/data/kaomoji/18 - music/6.txt b/data/kaomoji/music/6.txt
similarity index 100%
rename from data/kaomoji/18 - music/6.txt
rename to data/kaomoji/music/6.txt
diff --git a/data/kaomoji/18 - music/7.txt b/data/kaomoji/music/7.txt
similarity index 100%
rename from data/kaomoji/18 - music/7.txt
rename to data/kaomoji/music/7.txt
diff --git a/data/kaomoji/18 - music/8.txt b/data/kaomoji/music/8.txt
similarity index 100%
rename from data/kaomoji/18 - music/8.txt
rename to data/kaomoji/music/8.txt
diff --git a/data/kaomoji/18 - music/9.txt b/data/kaomoji/music/9.txt
similarity index 100%
rename from data/kaomoji/18 - music/9.txt
rename to data/kaomoji/music/9.txt
diff --git a/data/kaomoji/nosebleeding/.name b/data/kaomoji/nosebleeding/.name
new file mode 100644
index 0000000..289f4fe
--- /dev/null
+++ b/data/kaomoji/nosebleeding/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ nosebleeding
diff --git a/data/kaomoji/3 - nosebleeding/1.txt b/data/kaomoji/nosebleeding/1.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/1.txt
rename to data/kaomoji/nosebleeding/1.txt
diff --git a/data/kaomoji/3 - nosebleeding/2.txt b/data/kaomoji/nosebleeding/2.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/2.txt
rename to data/kaomoji/nosebleeding/2.txt
diff --git a/data/kaomoji/3 - nosebleeding/3.txt b/data/kaomoji/nosebleeding/3.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/3.txt
rename to data/kaomoji/nosebleeding/3.txt
diff --git a/data/kaomoji/3 - nosebleeding/4.txt b/data/kaomoji/nosebleeding/4.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/4.txt
rename to data/kaomoji/nosebleeding/4.txt
diff --git a/data/kaomoji/3 - nosebleeding/5.txt b/data/kaomoji/nosebleeding/5.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/5.txt
rename to data/kaomoji/nosebleeding/5.txt
diff --git a/data/kaomoji/3 - nosebleeding/6.txt b/data/kaomoji/nosebleeding/6.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/6.txt
rename to data/kaomoji/nosebleeding/6.txt
diff --git a/data/kaomoji/3 - nosebleeding/7.txt b/data/kaomoji/nosebleeding/7.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/7.txt
rename to data/kaomoji/nosebleeding/7.txt
diff --git a/data/kaomoji/3 - nosebleeding/8.txt b/data/kaomoji/nosebleeding/8.txt
similarity index 100%
rename from data/kaomoji/3 - nosebleeding/8.txt
rename to data/kaomoji/nosebleeding/8.txt
diff --git a/data/kaomoji/pain/.name b/data/kaomoji/pain/.name
new file mode 100644
index 0000000..f5d58fe
--- /dev/null
+++ b/data/kaomoji/pain/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ pain
diff --git a/data/kaomoji/11 - pain/1.txt b/data/kaomoji/pain/1.txt
similarity index 100%
rename from data/kaomoji/11 - pain/1.txt
rename to data/kaomoji/pain/1.txt
diff --git a/data/kaomoji/11 - pain/10.txt b/data/kaomoji/pain/10.txt
similarity index 100%
rename from data/kaomoji/11 - pain/10.txt
rename to data/kaomoji/pain/10.txt
diff --git a/data/kaomoji/11 - pain/11.txt b/data/kaomoji/pain/11.txt
similarity index 100%
rename from data/kaomoji/11 - pain/11.txt
rename to data/kaomoji/pain/11.txt
diff --git a/data/kaomoji/11 - pain/12.txt b/data/kaomoji/pain/12.txt
similarity index 100%
rename from data/kaomoji/11 - pain/12.txt
rename to data/kaomoji/pain/12.txt
diff --git a/data/kaomoji/11 - pain/13.txt b/data/kaomoji/pain/13.txt
similarity index 100%
rename from data/kaomoji/11 - pain/13.txt
rename to data/kaomoji/pain/13.txt
diff --git a/data/kaomoji/11 - pain/14.txt b/data/kaomoji/pain/14.txt
similarity index 100%
rename from data/kaomoji/11 - pain/14.txt
rename to data/kaomoji/pain/14.txt
diff --git a/data/kaomoji/11 - pain/15.txt b/data/kaomoji/pain/15.txt
similarity index 100%
rename from data/kaomoji/11 - pain/15.txt
rename to data/kaomoji/pain/15.txt
diff --git a/data/kaomoji/11 - pain/2.txt b/data/kaomoji/pain/2.txt
similarity index 100%
rename from data/kaomoji/11 - pain/2.txt
rename to data/kaomoji/pain/2.txt
diff --git a/data/kaomoji/11 - pain/3.txt b/data/kaomoji/pain/3.txt
similarity index 100%
rename from data/kaomoji/11 - pain/3.txt
rename to data/kaomoji/pain/3.txt
diff --git a/data/kaomoji/11 - pain/4.txt b/data/kaomoji/pain/4.txt
similarity index 100%
rename from data/kaomoji/11 - pain/4.txt
rename to data/kaomoji/pain/4.txt
diff --git a/data/kaomoji/11 - pain/5.txt b/data/kaomoji/pain/5.txt
similarity index 100%
rename from data/kaomoji/11 - pain/5.txt
rename to data/kaomoji/pain/5.txt
diff --git a/data/kaomoji/11 - pain/6.txt b/data/kaomoji/pain/6.txt
similarity index 100%
rename from data/kaomoji/11 - pain/6.txt
rename to data/kaomoji/pain/6.txt
diff --git a/data/kaomoji/11 - pain/7.txt b/data/kaomoji/pain/7.txt
similarity index 100%
rename from data/kaomoji/11 - pain/7.txt
rename to data/kaomoji/pain/7.txt
diff --git a/data/kaomoji/11 - pain/8.txt b/data/kaomoji/pain/8.txt
similarity index 100%
rename from data/kaomoji/11 - pain/8.txt
rename to data/kaomoji/pain/8.txt
diff --git a/data/kaomoji/11 - pain/9.txt b/data/kaomoji/pain/9.txt
similarity index 100%
rename from data/kaomoji/11 - pain/9.txt
rename to data/kaomoji/pain/9.txt
diff --git a/data/kaomoji/pig/.name b/data/kaomoji/pig/.name
new file mode 100644
index 0000000..1fac7e7
--- /dev/null
+++ b/data/kaomoji/pig/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ pig
diff --git a/data/kaomoji/rabbit/.name b/data/kaomoji/rabbit/.name
new file mode 100644
index 0000000..98584de
--- /dev/null
+++ b/data/kaomoji/rabbit/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ rabbit
diff --git a/data/kaomoji/running/.name b/data/kaomoji/running/.name
new file mode 100644
index 0000000..287a110
--- /dev/null
+++ b/data/kaomoji/running/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ running
diff --git a/data/kaomoji/23 - running/1.txt b/data/kaomoji/running/1.txt
similarity index 100%
rename from data/kaomoji/23 - running/1.txt
rename to data/kaomoji/running/1.txt
diff --git a/data/kaomoji/23 - running/2.txt b/data/kaomoji/running/2.txt
similarity index 100%
rename from data/kaomoji/23 - running/2.txt
rename to data/kaomoji/running/2.txt
diff --git a/data/kaomoji/23 - running/3.txt b/data/kaomoji/running/3.txt
similarity index 100%
rename from data/kaomoji/23 - running/3.txt
rename to data/kaomoji/running/3.txt
diff --git a/data/kaomoji/23 - running/4.txt b/data/kaomoji/running/4.txt
similarity index 100%
rename from data/kaomoji/23 - running/4.txt
rename to data/kaomoji/running/4.txt
diff --git a/data/kaomoji/23 - running/5.txt b/data/kaomoji/running/5.txt
similarity index 100%
rename from data/kaomoji/23 - running/5.txt
rename to data/kaomoji/running/5.txt
diff --git a/data/kaomoji/23 - running/6.txt b/data/kaomoji/running/6.txt
similarity index 100%
rename from data/kaomoji/23 - running/6.txt
rename to data/kaomoji/running/6.txt
diff --git a/data/kaomoji/23 - running/7.txt b/data/kaomoji/running/7.txt
similarity index 100%
rename from data/kaomoji/23 - running/7.txt
rename to data/kaomoji/running/7.txt
diff --git a/data/kaomoji/23 - running/8.txt b/data/kaomoji/running/8.txt
similarity index 100%
rename from data/kaomoji/23 - running/8.txt
rename to data/kaomoji/running/8.txt
diff --git a/data/kaomoji/23 - running/9.txt b/data/kaomoji/running/9.txt
similarity index 100%
rename from data/kaomoji/23 - running/9.txt
rename to data/kaomoji/running/9.txt
diff --git a/data/kaomoji/sadness/.name b/data/kaomoji/sadness/.name
new file mode 100644
index 0000000..6064173
--- /dev/null
+++ b/data/kaomoji/sadness/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ sadness
diff --git a/data/kaomoji/4 - sadness/1.txt b/data/kaomoji/sadness/1.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/1.txt
rename to data/kaomoji/sadness/1.txt
diff --git a/data/kaomoji/4 - sadness/10.txt b/data/kaomoji/sadness/10.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/10.txt
rename to data/kaomoji/sadness/10.txt
diff --git a/data/kaomoji/4 - sadness/11.txt b/data/kaomoji/sadness/11.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/11.txt
rename to data/kaomoji/sadness/11.txt
diff --git a/data/kaomoji/4 - sadness/12.txt b/data/kaomoji/sadness/12.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/12.txt
rename to data/kaomoji/sadness/12.txt
diff --git a/data/kaomoji/4 - sadness/13.txt b/data/kaomoji/sadness/13.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/13.txt
rename to data/kaomoji/sadness/13.txt
diff --git a/data/kaomoji/4 - sadness/14.txt b/data/kaomoji/sadness/14.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/14.txt
rename to data/kaomoji/sadness/14.txt
diff --git a/data/kaomoji/4 - sadness/15.txt b/data/kaomoji/sadness/15.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/15.txt
rename to data/kaomoji/sadness/15.txt
diff --git a/data/kaomoji/4 - sadness/16.txt b/data/kaomoji/sadness/16.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/16.txt
rename to data/kaomoji/sadness/16.txt
diff --git a/data/kaomoji/4 - sadness/17.txt b/data/kaomoji/sadness/17.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/17.txt
rename to data/kaomoji/sadness/17.txt
diff --git a/data/kaomoji/4 - sadness/18.txt b/data/kaomoji/sadness/18.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/18.txt
rename to data/kaomoji/sadness/18.txt
diff --git a/data/kaomoji/4 - sadness/19.txt b/data/kaomoji/sadness/19.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/19.txt
rename to data/kaomoji/sadness/19.txt
diff --git a/data/kaomoji/4 - sadness/2.txt b/data/kaomoji/sadness/2.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/2.txt
rename to data/kaomoji/sadness/2.txt
diff --git a/data/kaomoji/4 - sadness/20.txt b/data/kaomoji/sadness/20.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/20.txt
rename to data/kaomoji/sadness/20.txt
diff --git a/data/kaomoji/4 - sadness/21.txt b/data/kaomoji/sadness/21.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/21.txt
rename to data/kaomoji/sadness/21.txt
diff --git a/data/kaomoji/4 - sadness/22.txt b/data/kaomoji/sadness/22.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/22.txt
rename to data/kaomoji/sadness/22.txt
diff --git a/data/kaomoji/4 - sadness/23.txt b/data/kaomoji/sadness/23.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/23.txt
rename to data/kaomoji/sadness/23.txt
diff --git a/data/kaomoji/4 - sadness/24.txt b/data/kaomoji/sadness/24.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/24.txt
rename to data/kaomoji/sadness/24.txt
diff --git a/data/kaomoji/4 - sadness/25.txt b/data/kaomoji/sadness/25.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/25.txt
rename to data/kaomoji/sadness/25.txt
diff --git a/data/kaomoji/4 - sadness/26.txt b/data/kaomoji/sadness/26.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/26.txt
rename to data/kaomoji/sadness/26.txt
diff --git a/data/kaomoji/4 - sadness/27.txt b/data/kaomoji/sadness/27.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/27.txt
rename to data/kaomoji/sadness/27.txt
diff --git a/data/kaomoji/4 - sadness/28.txt b/data/kaomoji/sadness/28.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/28.txt
rename to data/kaomoji/sadness/28.txt
diff --git a/data/kaomoji/4 - sadness/29.txt b/data/kaomoji/sadness/29.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/29.txt
rename to data/kaomoji/sadness/29.txt
diff --git a/data/kaomoji/4 - sadness/3.txt b/data/kaomoji/sadness/3.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/3.txt
rename to data/kaomoji/sadness/3.txt
diff --git a/data/kaomoji/4 - sadness/30.txt b/data/kaomoji/sadness/30.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/30.txt
rename to data/kaomoji/sadness/30.txt
diff --git a/data/kaomoji/4 - sadness/31.txt b/data/kaomoji/sadness/31.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/31.txt
rename to data/kaomoji/sadness/31.txt
diff --git a/data/kaomoji/4 - sadness/32.txt b/data/kaomoji/sadness/32.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/32.txt
rename to data/kaomoji/sadness/32.txt
diff --git a/data/kaomoji/4 - sadness/33.txt b/data/kaomoji/sadness/33.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/33.txt
rename to data/kaomoji/sadness/33.txt
diff --git a/data/kaomoji/4 - sadness/34.txt b/data/kaomoji/sadness/34.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/34.txt
rename to data/kaomoji/sadness/34.txt
diff --git a/data/kaomoji/4 - sadness/35.txt b/data/kaomoji/sadness/35.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/35.txt
rename to data/kaomoji/sadness/35.txt
diff --git a/data/kaomoji/4 - sadness/36.txt b/data/kaomoji/sadness/36.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/36.txt
rename to data/kaomoji/sadness/36.txt
diff --git a/data/kaomoji/4 - sadness/4.txt b/data/kaomoji/sadness/4.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/4.txt
rename to data/kaomoji/sadness/4.txt
diff --git a/data/kaomoji/4 - sadness/5.txt b/data/kaomoji/sadness/5.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/5.txt
rename to data/kaomoji/sadness/5.txt
diff --git a/data/kaomoji/4 - sadness/6.txt b/data/kaomoji/sadness/6.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/6.txt
rename to data/kaomoji/sadness/6.txt
diff --git a/data/kaomoji/4 - sadness/7.txt b/data/kaomoji/sadness/7.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/7.txt
rename to data/kaomoji/sadness/7.txt
diff --git a/data/kaomoji/4 - sadness/8.txt b/data/kaomoji/sadness/8.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/8.txt
rename to data/kaomoji/sadness/8.txt
diff --git a/data/kaomoji/4 - sadness/9.txt b/data/kaomoji/sadness/9.txt
similarity index 100%
rename from data/kaomoji/4 - sadness/9.txt
rename to data/kaomoji/sadness/9.txt
diff --git a/data/kaomoji/sleeping/.name b/data/kaomoji/sleeping/.name
new file mode 100644
index 0000000..81b1356
--- /dev/null
+++ b/data/kaomoji/sleeping/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ sleeping
diff --git a/data/kaomoji/25 - sleeping/1.txt b/data/kaomoji/sleeping/1.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/1.txt
rename to data/kaomoji/sleeping/1.txt
diff --git a/data/kaomoji/25 - sleeping/10.txt b/data/kaomoji/sleeping/10.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/10.txt
rename to data/kaomoji/sleeping/10.txt
diff --git a/data/kaomoji/25 - sleeping/2.txt b/data/kaomoji/sleeping/2.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/2.txt
rename to data/kaomoji/sleeping/2.txt
diff --git a/data/kaomoji/25 - sleeping/3.txt b/data/kaomoji/sleeping/3.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/3.txt
rename to data/kaomoji/sleeping/3.txt
diff --git a/data/kaomoji/25 - sleeping/4.txt b/data/kaomoji/sleeping/4.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/4.txt
rename to data/kaomoji/sleeping/4.txt
diff --git a/data/kaomoji/25 - sleeping/5.txt b/data/kaomoji/sleeping/5.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/5.txt
rename to data/kaomoji/sleeping/5.txt
diff --git a/data/kaomoji/25 - sleeping/6.txt b/data/kaomoji/sleeping/6.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/6.txt
rename to data/kaomoji/sleeping/6.txt
diff --git a/data/kaomoji/25 - sleeping/7.txt b/data/kaomoji/sleeping/7.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/7.txt
rename to data/kaomoji/sleeping/7.txt
diff --git a/data/kaomoji/25 - sleeping/8.txt b/data/kaomoji/sleeping/8.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/8.txt
rename to data/kaomoji/sleeping/8.txt
diff --git a/data/kaomoji/25 - sleeping/9.txt b/data/kaomoji/sleeping/9.txt
similarity index 100%
rename from data/kaomoji/25 - sleeping/9.txt
rename to data/kaomoji/sleeping/9.txt
diff --git a/data/kaomoji/special/.name b/data/kaomoji/special/.name
new file mode 100644
index 0000000..3569726
--- /dev/null
+++ b/data/kaomoji/special/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ special
diff --git a/data/kaomoji/spider/.name b/data/kaomoji/spider/.name
new file mode 100644
index 0000000..6a6a61f
--- /dev/null
+++ b/data/kaomoji/spider/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ spider
diff --git a/data/kaomoji/surprise/.name b/data/kaomoji/surprise/.name
new file mode 100644
index 0000000..b3be1dc
--- /dev/null
+++ b/data/kaomoji/surprise/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ surprise
diff --git a/data/kaomoji/30 - surprise/1.txt b/data/kaomoji/surprise/1.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/1.txt
rename to data/kaomoji/surprise/1.txt
diff --git a/data/kaomoji/30 - surprise/10.txt b/data/kaomoji/surprise/10.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/10.txt
rename to data/kaomoji/surprise/10.txt
diff --git a/data/kaomoji/30 - surprise/11.txt b/data/kaomoji/surprise/11.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/11.txt
rename to data/kaomoji/surprise/11.txt
diff --git a/data/kaomoji/30 - surprise/12.txt b/data/kaomoji/surprise/12.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/12.txt
rename to data/kaomoji/surprise/12.txt
diff --git a/data/kaomoji/30 - surprise/13.txt b/data/kaomoji/surprise/13.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/13.txt
rename to data/kaomoji/surprise/13.txt
diff --git a/data/kaomoji/30 - surprise/14.txt b/data/kaomoji/surprise/14.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/14.txt
rename to data/kaomoji/surprise/14.txt
diff --git a/data/kaomoji/30 - surprise/2.txt b/data/kaomoji/surprise/2.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/2.txt
rename to data/kaomoji/surprise/2.txt
diff --git a/data/kaomoji/30 - surprise/3.txt b/data/kaomoji/surprise/3.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/3.txt
rename to data/kaomoji/surprise/3.txt
diff --git a/data/kaomoji/30 - surprise/4.txt b/data/kaomoji/surprise/4.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/4.txt
rename to data/kaomoji/surprise/4.txt
diff --git a/data/kaomoji/30 - surprise/5.txt b/data/kaomoji/surprise/5.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/5.txt
rename to data/kaomoji/surprise/5.txt
diff --git a/data/kaomoji/30 - surprise/6.txt b/data/kaomoji/surprise/6.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/6.txt
rename to data/kaomoji/surprise/6.txt
diff --git a/data/kaomoji/30 - surprise/7.txt b/data/kaomoji/surprise/7.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/7.txt
rename to data/kaomoji/surprise/7.txt
diff --git a/data/kaomoji/30 - surprise/8.txt b/data/kaomoji/surprise/8.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/8.txt
rename to data/kaomoji/surprise/8.txt
diff --git a/data/kaomoji/30 - surprise/9.txt b/data/kaomoji/surprise/9.txt
similarity index 100%
rename from data/kaomoji/30 - surprise/9.txt
rename to data/kaomoji/surprise/9.txt
diff --git a/data/kaomoji/sympathy/.name b/data/kaomoji/sympathy/.name
new file mode 100644
index 0000000..2340c13
--- /dev/null
+++ b/data/kaomoji/sympathy/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ sympathy
diff --git a/data/kaomoji/32 - sympathy/1.txt b/data/kaomoji/sympathy/1.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/1.txt
rename to data/kaomoji/sympathy/1.txt
diff --git a/data/kaomoji/32 - sympathy/10.txt b/data/kaomoji/sympathy/10.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/10.txt
rename to data/kaomoji/sympathy/10.txt
diff --git a/data/kaomoji/32 - sympathy/11.txt b/data/kaomoji/sympathy/11.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/11.txt
rename to data/kaomoji/sympathy/11.txt
diff --git a/data/kaomoji/32 - sympathy/12.txt b/data/kaomoji/sympathy/12.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/12.txt
rename to data/kaomoji/sympathy/12.txt
diff --git a/data/kaomoji/32 - sympathy/2.txt b/data/kaomoji/sympathy/2.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/2.txt
rename to data/kaomoji/sympathy/2.txt
diff --git a/data/kaomoji/32 - sympathy/3.txt b/data/kaomoji/sympathy/3.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/3.txt
rename to data/kaomoji/sympathy/3.txt
diff --git a/data/kaomoji/32 - sympathy/4.txt b/data/kaomoji/sympathy/4.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/4.txt
rename to data/kaomoji/sympathy/4.txt
diff --git a/data/kaomoji/32 - sympathy/5.txt b/data/kaomoji/sympathy/5.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/5.txt
rename to data/kaomoji/sympathy/5.txt
diff --git a/data/kaomoji/32 - sympathy/6.txt b/data/kaomoji/sympathy/6.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/6.txt
rename to data/kaomoji/sympathy/6.txt
diff --git a/data/kaomoji/32 - sympathy/7.txt b/data/kaomoji/sympathy/7.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/7.txt
rename to data/kaomoji/sympathy/7.txt
diff --git a/data/kaomoji/32 - sympathy/8.txt b/data/kaomoji/sympathy/8.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/8.txt
rename to data/kaomoji/sympathy/8.txt
diff --git a/data/kaomoji/32 - sympathy/9.txt b/data/kaomoji/sympathy/9.txt
similarity index 100%
rename from data/kaomoji/32 - sympathy/9.txt
rename to data/kaomoji/sympathy/9.txt
diff --git a/data/kaomoji/weapons/.name b/data/kaomoji/weapons/.name
new file mode 100644
index 0000000..edfacfb
--- /dev/null
+++ b/data/kaomoji/weapons/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ weapons
diff --git a/data/kaomoji/33 - weapons/1.txt b/data/kaomoji/weapons/1.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/1.txt
rename to data/kaomoji/weapons/1.txt
diff --git a/data/kaomoji/33 - weapons/10.txt b/data/kaomoji/weapons/10.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/10.txt
rename to data/kaomoji/weapons/10.txt
diff --git a/data/kaomoji/33 - weapons/11.txt b/data/kaomoji/weapons/11.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/11.txt
rename to data/kaomoji/weapons/11.txt
diff --git a/data/kaomoji/33 - weapons/12.txt b/data/kaomoji/weapons/12.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/12.txt
rename to data/kaomoji/weapons/12.txt
diff --git a/data/kaomoji/33 - weapons/13.txt b/data/kaomoji/weapons/13.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/13.txt
rename to data/kaomoji/weapons/13.txt
diff --git a/data/kaomoji/33 - weapons/14.txt b/data/kaomoji/weapons/14.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/14.txt
rename to data/kaomoji/weapons/14.txt
diff --git a/data/kaomoji/33 - weapons/15.txt b/data/kaomoji/weapons/15.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/15.txt
rename to data/kaomoji/weapons/15.txt
diff --git a/data/kaomoji/33 - weapons/16.txt b/data/kaomoji/weapons/16.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/16.txt
rename to data/kaomoji/weapons/16.txt
diff --git a/data/kaomoji/33 - weapons/17.txt b/data/kaomoji/weapons/17.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/17.txt
rename to data/kaomoji/weapons/17.txt
diff --git a/data/kaomoji/33 - weapons/18.txt b/data/kaomoji/weapons/18.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/18.txt
rename to data/kaomoji/weapons/18.txt
diff --git a/data/kaomoji/33 - weapons/2.txt b/data/kaomoji/weapons/2.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/2.txt
rename to data/kaomoji/weapons/2.txt
diff --git a/data/kaomoji/33 - weapons/3.txt b/data/kaomoji/weapons/3.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/3.txt
rename to data/kaomoji/weapons/3.txt
diff --git a/data/kaomoji/33 - weapons/4.txt b/data/kaomoji/weapons/4.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/4.txt
rename to data/kaomoji/weapons/4.txt
diff --git a/data/kaomoji/33 - weapons/5.txt b/data/kaomoji/weapons/5.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/5.txt
rename to data/kaomoji/weapons/5.txt
diff --git a/data/kaomoji/33 - weapons/6.txt b/data/kaomoji/weapons/6.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/6.txt
rename to data/kaomoji/weapons/6.txt
diff --git a/data/kaomoji/33 - weapons/7.txt b/data/kaomoji/weapons/7.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/7.txt
rename to data/kaomoji/weapons/7.txt
diff --git a/data/kaomoji/33 - weapons/8.txt b/data/kaomoji/weapons/8.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/8.txt
rename to data/kaomoji/weapons/8.txt
diff --git a/data/kaomoji/33 - weapons/9.txt b/data/kaomoji/weapons/9.txt
similarity index 100%
rename from data/kaomoji/33 - weapons/9.txt
rename to data/kaomoji/weapons/9.txt
diff --git a/data/kaomoji/winking/.name b/data/kaomoji/winking/.name
new file mode 100644
index 0000000..6960556
--- /dev/null
+++ b/data/kaomoji/winking/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ winking
diff --git a/data/kaomoji/29 - winking/1.txt b/data/kaomoji/winking/1.txt
similarity index 100%
rename from data/kaomoji/29 - winking/1.txt
rename to data/kaomoji/winking/1.txt
diff --git a/data/kaomoji/29 - winking/10.txt b/data/kaomoji/winking/10.txt
similarity index 100%
rename from data/kaomoji/29 - winking/10.txt
rename to data/kaomoji/winking/10.txt
diff --git a/data/kaomoji/29 - winking/11.txt b/data/kaomoji/winking/11.txt
similarity index 100%
rename from data/kaomoji/29 - winking/11.txt
rename to data/kaomoji/winking/11.txt
diff --git a/data/kaomoji/29 - winking/12.txt b/data/kaomoji/winking/12.txt
similarity index 100%
rename from data/kaomoji/29 - winking/12.txt
rename to data/kaomoji/winking/12.txt
diff --git a/data/kaomoji/29 - winking/13.txt b/data/kaomoji/winking/13.txt
similarity index 100%
rename from data/kaomoji/29 - winking/13.txt
rename to data/kaomoji/winking/13.txt
diff --git a/data/kaomoji/29 - winking/14.txt b/data/kaomoji/winking/14.txt
similarity index 100%
rename from data/kaomoji/29 - winking/14.txt
rename to data/kaomoji/winking/14.txt
diff --git a/data/kaomoji/29 - winking/15.txt b/data/kaomoji/winking/15.txt
similarity index 100%
rename from data/kaomoji/29 - winking/15.txt
rename to data/kaomoji/winking/15.txt
diff --git a/data/kaomoji/29 - winking/16.txt b/data/kaomoji/winking/16.txt
similarity index 100%
rename from data/kaomoji/29 - winking/16.txt
rename to data/kaomoji/winking/16.txt
diff --git a/data/kaomoji/29 - winking/17.txt b/data/kaomoji/winking/17.txt
similarity index 100%
rename from data/kaomoji/29 - winking/17.txt
rename to data/kaomoji/winking/17.txt
diff --git a/data/kaomoji/29 - winking/18.txt b/data/kaomoji/winking/18.txt
similarity index 100%
rename from data/kaomoji/29 - winking/18.txt
rename to data/kaomoji/winking/18.txt
diff --git a/data/kaomoji/29 - winking/19.txt b/data/kaomoji/winking/19.txt
similarity index 100%
rename from data/kaomoji/29 - winking/19.txt
rename to data/kaomoji/winking/19.txt
diff --git a/data/kaomoji/29 - winking/2.txt b/data/kaomoji/winking/2.txt
similarity index 100%
rename from data/kaomoji/29 - winking/2.txt
rename to data/kaomoji/winking/2.txt
diff --git a/data/kaomoji/29 - winking/20.txt b/data/kaomoji/winking/20.txt
similarity index 100%
rename from data/kaomoji/29 - winking/20.txt
rename to data/kaomoji/winking/20.txt
diff --git a/data/kaomoji/29 - winking/3.txt b/data/kaomoji/winking/3.txt
similarity index 100%
rename from data/kaomoji/29 - winking/3.txt
rename to data/kaomoji/winking/3.txt
diff --git a/data/kaomoji/29 - winking/4.txt b/data/kaomoji/winking/4.txt
similarity index 100%
rename from data/kaomoji/29 - winking/4.txt
rename to data/kaomoji/winking/4.txt
diff --git a/data/kaomoji/29 - winking/5.txt b/data/kaomoji/winking/5.txt
similarity index 100%
rename from data/kaomoji/29 - winking/5.txt
rename to data/kaomoji/winking/5.txt
diff --git a/data/kaomoji/29 - winking/6.txt b/data/kaomoji/winking/6.txt
similarity index 100%
rename from data/kaomoji/29 - winking/6.txt
rename to data/kaomoji/winking/6.txt
diff --git a/data/kaomoji/29 - winking/7.txt b/data/kaomoji/winking/7.txt
similarity index 100%
rename from data/kaomoji/29 - winking/7.txt
rename to data/kaomoji/winking/7.txt
diff --git a/data/kaomoji/29 - winking/8.txt b/data/kaomoji/winking/8.txt
similarity index 100%
rename from data/kaomoji/29 - winking/8.txt
rename to data/kaomoji/winking/8.txt
diff --git a/data/kaomoji/29 - winking/9.txt b/data/kaomoji/winking/9.txt
similarity index 100%
rename from data/kaomoji/29 - winking/9.txt
rename to data/kaomoji/winking/9.txt
diff --git a/data/kaomoji/writing/.name b/data/kaomoji/writing/.name
new file mode 100644
index 0000000..5b7837f
--- /dev/null
+++ b/data/kaomoji/writing/.name
@@ -0,0 +1 @@
+˗ˏˋ ★ ˎˊ˗ writing
diff --git a/data/kaomoji/31 - writing/1.txt b/data/kaomoji/writing/1.txt
similarity index 100%
rename from data/kaomoji/31 - writing/1.txt
rename to data/kaomoji/writing/1.txt
diff --git a/data/kaomoji/31 - writing/10.txt b/data/kaomoji/writing/10.txt
similarity index 100%
rename from data/kaomoji/31 - writing/10.txt
rename to data/kaomoji/writing/10.txt
diff --git a/data/kaomoji/31 - writing/11.txt b/data/kaomoji/writing/11.txt
similarity index 100%
rename from data/kaomoji/31 - writing/11.txt
rename to data/kaomoji/writing/11.txt
diff --git a/data/kaomoji/31 - writing/12.txt b/data/kaomoji/writing/12.txt
similarity index 100%
rename from data/kaomoji/31 - writing/12.txt
rename to data/kaomoji/writing/12.txt
diff --git a/data/kaomoji/31 - writing/2.txt b/data/kaomoji/writing/2.txt
similarity index 100%
rename from data/kaomoji/31 - writing/2.txt
rename to data/kaomoji/writing/2.txt
diff --git a/data/kaomoji/31 - writing/3.txt b/data/kaomoji/writing/3.txt
similarity index 100%
rename from data/kaomoji/31 - writing/3.txt
rename to data/kaomoji/writing/3.txt
diff --git a/data/kaomoji/31 - writing/4.txt b/data/kaomoji/writing/4.txt
similarity index 100%
rename from data/kaomoji/31 - writing/4.txt
rename to data/kaomoji/writing/4.txt
diff --git a/data/kaomoji/31 - writing/5.txt b/data/kaomoji/writing/5.txt
similarity index 100%
rename from data/kaomoji/31 - writing/5.txt
rename to data/kaomoji/writing/5.txt
diff --git a/data/kaomoji/31 - writing/6.txt b/data/kaomoji/writing/6.txt
similarity index 100%
rename from data/kaomoji/31 - writing/6.txt
rename to data/kaomoji/writing/6.txt
diff --git a/data/kaomoji/31 - writing/7.txt b/data/kaomoji/writing/7.txt
similarity index 100%
rename from data/kaomoji/31 - writing/7.txt
rename to data/kaomoji/writing/7.txt
diff --git a/data/kaomoji/31 - writing/8.txt b/data/kaomoji/writing/8.txt
similarity index 100%
rename from data/kaomoji/31 - writing/8.txt
rename to data/kaomoji/writing/8.txt
diff --git a/data/kaomoji/31 - writing/9.txt b/data/kaomoji/writing/9.txt
similarity index 100%
rename from data/kaomoji/31 - writing/9.txt
rename to data/kaomoji/writing/9.txt
diff --git a/src/moemoji-window.c b/src/moemoji-window.c
index 1475497..cbdbf75 100644
--- a/src/moemoji-window.c
+++ b/src/moemoji-window.c
@@ -13,6 +13,7 @@ static void reload_categories(MoeMojiWindow *self);
static void category_widgets_free(gpointer data) {
CategoryWidgets *cw = data;
g_free(cw->name);
+ g_free(cw->path);
g_free(cw);
}
@@ -58,12 +59,15 @@ char *find_kaomoji_dir(void) {
return NULL;
}
-static void on_kaomoji_clicked(GtkButton *button,
- G_GNUC_UNUSED gpointer user_data) {
+static void on_kaomoji_clicked(GtkButton *button, gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
const char *full = g_object_get_data(G_OBJECT(button), "full-text");
const char *text = full ? full : gtk_button_get_label(button);
GdkClipboard *clipboard = gtk_widget_get_clipboard(GTK_WIDGET(button));
gdk_clipboard_set_text(clipboard, text);
+ AdwToast *toast = adw_toast_new("Copied!");
+ adw_toast_set_timeout(toast, 1);
+ adw_toast_overlay_add_toast(self->toast_overlay, toast);
}
static void on_popover_enter(G_GNUC_UNUSED GtkEventControllerMotion *ctrl,
@@ -84,7 +88,183 @@ static void on_button_destroy(GtkWidget *button,
gtk_widget_unparent(popover);
}
-static void add_kaomoji_button(GtkFlowBox *flow, const char *text) {
+static void on_context_popover_closed(GtkPopover *popover,
+ G_GNUC_UNUSED gpointer user_data) {
+ GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(popover));
+ if (parent) {
+ gtk_widget_remove_css_class(parent, "context-active");
+ g_object_set_data(G_OBJECT(parent), "ctx-popover", NULL);
+ gtk_widget_unparent(GTK_WIDGET(popover));
+ }
+}
+
+static void on_ctx_parent_destroy(GtkWidget *parent,
+ G_GNUC_UNUSED gpointer user_data) {
+ GtkWidget *popover = g_object_get_data(G_OBJECT(parent), "ctx-popover");
+ if (popover)
+ gtk_widget_unparent(popover);
+}
+
+static gboolean enable_popover_buttons_idle(gpointer data) {
+ GtkWidget *box = GTK_WIDGET(data);
+ for (GtkWidget *child = gtk_widget_get_first_child(box); child != NULL;
+ child = gtk_widget_get_next_sibling(child)) {
+ gtk_widget_set_can_target(child, TRUE);
+ }
+ return G_SOURCE_REMOVE;
+}
+
+static GtkWidget *ctx_add_button(GtkBox *box, const char *label,
+ GCallback callback, gpointer user_data) {
+ GtkWidget *btn = gtk_button_new_with_label(label);
+ gtk_widget_add_css_class(btn, "flat");
+ gtk_widget_set_can_target(btn, FALSE);
+ gtk_widget_set_focusable(btn, FALSE);
+ g_signal_connect(btn, "clicked", callback, user_data);
+ gtk_box_append(box, btn);
+ return btn;
+}
+
+static void show_context_popover(GtkWidget *parent, GtkWidget *box, double x,
+ double y) {
+ gtk_widget_add_css_class(parent, "context-active");
+
+ GtkWidget *old = g_object_get_data(G_OBJECT(parent), "ctx-popover");
+ if (old)
+ gtk_widget_unparent(old);
+
+ GtkWidget *popover = gtk_popover_new();
+ gtk_widget_set_parent(popover, parent);
+ gtk_widget_add_css_class(popover, "context-menu-popover");
+ gtk_popover_set_has_arrow(GTK_POPOVER(popover), FALSE);
+ GdkRectangle rect = {(int)x, (int)y, 1, 1};
+ gtk_popover_set_pointing_to(GTK_POPOVER(popover), &rect);
+ gtk_popover_set_child(GTK_POPOVER(popover), box);
+ g_object_set_data(G_OBJECT(parent), "ctx-popover", popover);
+ g_signal_connect(popover, "closed", G_CALLBACK(on_context_popover_closed),
+ NULL);
+ g_signal_connect(parent, "destroy", G_CALLBACK(on_ctx_parent_destroy), NULL);
+ gtk_popover_popup(GTK_POPOVER(popover));
+ g_idle_add(enable_popover_buttons_idle, box);
+}
+
+static void rebuild_pinned_box(MoeMojiWindow *self);
+
+static gboolean is_kaomoji_pinned(MoeMojiWindow *self, const char *text) {
+ g_auto(GStrv) pinned = g_settings_get_strv(self->settings, "pinned-kaomojis");
+ return g_strv_contains((const char *const *)pinned, text);
+}
+
+static void on_ctx_pin_emote(G_GNUC_UNUSED GSimpleAction *action,
+ G_GNUC_UNUSED GVariant *parameter,
+ gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ const char *text = self->ctx_emote_text;
+ if (!text || is_kaomoji_pinned(self, text))
+ return;
+ g_auto(GStrv) pinned = g_settings_get_strv(self->settings, "pinned-kaomojis");
+ guint len = g_strv_length(pinned);
+ char **new_pinned = g_new(char *, len + 2);
+ for (guint i = 0; i < len; i++)
+ new_pinned[i] = pinned[i];
+ new_pinned[len] = g_strdup(text);
+ new_pinned[len + 1] = NULL;
+ g_settings_set_strv(self->settings, "pinned-kaomojis",
+ (const char *const *)new_pinned);
+ g_free(new_pinned[len]);
+ g_free(new_pinned);
+ rebuild_pinned_box(self);
+}
+
+static void on_ctx_unpin_emote(G_GNUC_UNUSED GSimpleAction *action,
+ G_GNUC_UNUSED GVariant *parameter,
+ gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ const char *text = self->ctx_emote_text;
+ if (!text)
+ return;
+ g_auto(GStrv) pinned = g_settings_get_strv(self->settings, "pinned-kaomojis");
+ GPtrArray *new_arr = g_ptr_array_new();
+ for (guint i = 0; pinned[i]; i++) {
+ if (g_strcmp0(pinned[i], text) != 0)
+ g_ptr_array_add(new_arr, pinned[i]);
+ }
+ g_ptr_array_add(new_arr, NULL);
+ g_settings_set_strv(self->settings, "pinned-kaomojis",
+ (const char *const *)new_arr->pdata);
+ g_ptr_array_free(new_arr, TRUE);
+ rebuild_pinned_box(self);
+}
+
+static void on_ctx_action_clicked(GtkButton *button, gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ const char *action = g_object_get_data(G_OBJECT(button), "action-name");
+ if (!action)
+ return;
+ GtkWidget *popover =
+ gtk_widget_get_ancestor(GTK_WIDGET(button), GTK_TYPE_POPOVER);
+ g_action_group_activate_action(G_ACTION_GROUP(self), action, NULL);
+ if (popover)
+ gtk_popover_popdown(GTK_POPOVER(popover));
+}
+
+static void on_pinned_right_click(GtkGestureClick *gesture,
+ G_GNUC_UNUSED int n_press, double x, double y,
+ gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ GtkWidget *button =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(gesture));
+ const char *full_text = g_object_get_data(G_OBJECT(button), "full-text");
+ const char *text =
+ full_text ? full_text : gtk_button_get_label(GTK_BUTTON(button));
+
+ g_free(self->ctx_emote_text);
+ self->ctx_emote_text = g_strdup(text);
+
+ GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ GtkWidget *unpin_btn = ctx_add_button(
+ GTK_BOX(box), "Unpin", G_CALLBACK(on_ctx_action_clicked), self);
+ g_object_set_data(G_OBJECT(unpin_btn), "action-name", "ctx-unpin-emote");
+ show_context_popover(button, box, x, y);
+}
+
+static void on_kaomoji_right_click(GtkGestureClick *gesture,
+ G_GNUC_UNUSED int n_press, double x,
+ double y, gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ GtkWidget *button =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(gesture));
+ const char *filepath = g_object_get_data(G_OBJECT(button), "emote-path");
+ if (!filepath)
+ return;
+ const char *full_text = g_object_get_data(G_OBJECT(button), "full-text");
+ const char *emote_text =
+ full_text ? full_text : gtk_button_get_label(GTK_BUTTON(button));
+
+ g_free(self->ctx_emote_path);
+ self->ctx_emote_path = g_strdup(filepath);
+ g_free(self->ctx_emote_text);
+ self->ctx_emote_text = g_strdup(emote_text);
+
+ GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ GtkWidget *pin_btn;
+ if (is_kaomoji_pinned(self, emote_text)) {
+ pin_btn = ctx_add_button(GTK_BOX(box), "Unpin",
+ G_CALLBACK(on_ctx_action_clicked), self);
+ g_object_set_data(G_OBJECT(pin_btn), "action-name", "ctx-unpin-emote");
+ } else {
+ pin_btn = ctx_add_button(GTK_BOX(box), "Pin",
+ G_CALLBACK(on_ctx_action_clicked), self);
+ g_object_set_data(G_OBJECT(pin_btn), "action-name", "ctx-pin-emote");
+ }
+ GtkWidget *del_btn = ctx_add_button(GTK_BOX(box), "Delete",
+ G_CALLBACK(on_ctx_action_clicked), self);
+ g_object_set_data(G_OBJECT(del_btn), "action-name", "ctx-delete-emote");
+ show_context_popover(button, box, x, y);
+}
+
+static void add_kaomoji_button(MoeMojiWindow *self, GtkFlowBox *flow,
+ const char *text, const char *filepath) {
gboolean multiline = (strchr(text, '\n') != NULL);
const char *label_text = text;
g_autofree char *first_line = NULL;
@@ -106,7 +286,17 @@ static void add_kaomoji_button(GtkFlowBox *flow, const char *text) {
g_object_set_data_full(G_OBJECT(button), "full-text", g_strdup(text),
g_free);
- g_signal_connect(button, "clicked", G_CALLBACK(on_kaomoji_clicked), NULL);
+ if (filepath)
+ g_object_set_data_full(G_OBJECT(button), "emote-path", g_strdup(filepath),
+ g_free);
+
+ GtkGestureClick *right_click = GTK_GESTURE_CLICK(gtk_gesture_click_new());
+ gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(right_click), 3);
+ g_signal_connect(right_click, "pressed", G_CALLBACK(on_kaomoji_right_click),
+ self);
+ gtk_widget_add_controller(button, GTK_EVENT_CONTROLLER(right_click));
+
+ g_signal_connect(button, "clicked", G_CALLBACK(on_kaomoji_clicked), self);
if (multiline) {
GtkWidget *popover = gtk_popover_new();
gtk_popover_set_autohide(GTK_POPOVER(popover), FALSE);
@@ -154,6 +344,33 @@ static gint compare_files_by_mtime(gconstpointer a, gconstpointer b) {
return 0;
}
+static void on_category_header_right_click(GtkGestureClick *gesture,
+ G_GNUC_UNUSED int n_press, double x,
+ double y, gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ GtkWidget *header =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(gesture));
+ const char *cat_path = g_object_get_data(G_OBJECT(header), "cat-path");
+ const char *cat_name = g_object_get_data(G_OBJECT(header), "cat-name");
+ if (!cat_path)
+ return;
+
+ g_free(self->ctx_cat_path);
+ self->ctx_cat_path = g_strdup(cat_path);
+ g_free(self->ctx_cat_name);
+ self->ctx_cat_name = g_strdup(cat_name);
+
+ GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ GtkWidget *rename_btn = ctx_add_button(
+ GTK_BOX(box), "Rename", G_CALLBACK(on_ctx_action_clicked), self);
+ g_object_set_data(G_OBJECT(rename_btn), "action-name", "ctx-rename-category");
+ GtkWidget *del_cat_btn = ctx_add_button(
+ GTK_BOX(box), "Delete", G_CALLBACK(on_ctx_action_clicked), self);
+ g_object_set_data(G_OBJECT(del_cat_btn), "action-name",
+ "ctx-delete-category");
+ show_context_popover(header, box, x, y);
+}
+
static void load_category(MoeMojiWindow *self, const char *kaomoji_dir,
const char *dirname) {
char *cat_path = g_build_filename(kaomoji_dir, dirname, NULL);
@@ -166,6 +383,15 @@ static void load_category(MoeMojiWindow *self, const char *kaomoji_dir,
GtkWidget *header = gtk_label_new(display_name);
gtk_widget_add_css_class(header, "category-header");
gtk_label_set_xalign(GTK_LABEL(header), 0.0);
+ g_object_set_data_full(G_OBJECT(header), "cat-path", g_strdup(cat_path),
+ g_free);
+ g_object_set_data_full(G_OBJECT(header), "cat-name", g_strdup(display_name),
+ g_free);
+ GtkGestureClick *cat_right_click = GTK_GESTURE_CLICK(gtk_gesture_click_new());
+ gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(cat_right_click), 3);
+ g_signal_connect(cat_right_click, "pressed",
+ G_CALLBACK(on_category_header_right_click), self);
+ gtk_widget_add_controller(header, GTK_EVENT_CONTROLLER(cat_right_click));
gtk_box_append(self->content_box, header);
GtkWidget *flow = gtk_flow_box_new();
gtk_flow_box_set_homogeneous(GTK_FLOW_BOX(flow), TRUE);
@@ -186,7 +412,7 @@ static void load_category(MoeMojiWindow *self, const char *kaomoji_dir,
if (g_file_get_contents(filepath, &contents, NULL, NULL)) {
g_strchomp(contents);
if (contents[0] != '\0')
- add_kaomoji_button(GTK_FLOW_BOX(flow), contents);
+ add_kaomoji_button(self, GTK_FLOW_BOX(flow), contents, filepath);
g_free(contents);
}
}
@@ -196,6 +422,7 @@ static void load_category(MoeMojiWindow *self, const char *kaomoji_dir,
cw->header = header;
cw->flow = flow;
cw->name = display_name;
+ cw->path = g_strdup(cat_path);
g_ptr_array_add(self->category_widgets, cw);
g_dir_close(dir);
g_free(cat_path);
@@ -219,6 +446,25 @@ static void set_active_chip(MoeMojiWindow *self, int index) {
}
}
+static void scroll_chip_into_view(MoeMojiWindow *self, GtkWidget *chip) {
+ GtkWidget *sw = gtk_widget_get_ancestor(chip, GTK_TYPE_SCROLLED_WINDOW);
+ if (!sw)
+ return;
+ graphene_point_t p;
+ GtkWidget *content = gtk_scrolled_window_get_child(GTK_SCROLLED_WINDOW(sw));
+ if (gtk_widget_compute_point(chip, content, &GRAPHENE_POINT_INIT(0, 0), &p)) {
+ GtkAdjustment *adj =
+ gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sw));
+ double page = gtk_adjustment_get_page_size(adj);
+ double val = gtk_adjustment_get_value(adj);
+ int h = gtk_widget_get_height(chip);
+ if (p.y < val)
+ gtk_adjustment_set_value(adj, p.y);
+ else if (p.y + h > val + page)
+ gtk_adjustment_set_value(adj, p.y + h - page);
+ }
+}
+
static void scroll_to_category(MoeMojiWindow *self, int index) {
CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, index);
graphene_point_t p;
@@ -228,6 +474,7 @@ static void scroll_to_category(MoeMojiWindow *self, int index) {
GTK_SCROLLED_WINDOW(self->kaomoji_scroll));
gtk_adjustment_set_value(vadj, p.y);
}
+ scroll_chip_into_view(self, cw->chip);
}
static void on_chip_clicked(GtkButton *button, gpointer user_data) {
@@ -297,8 +544,9 @@ static void on_kaomoji_scroll_map(G_GNUC_UNUSED GtkWidget *widget,
static void on_search_changed(GtkSearchEntry *entry, gpointer user_data) {
MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
const char *query = gtk_editable_get_text(GTK_EDITABLE(entry));
- if (query == NULL || query[0] == '\0')
+ if (!query || query[0] == '\0')
return;
+ gtk_widget_grab_focus(GTK_WIDGET(entry));
g_autofree char *query_lower = g_utf8_strdown(query, -1);
for (guint i = 0; i < self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
@@ -371,9 +619,7 @@ static gint compare_entries(gconstpointer a, gconstpointer b) {
return desc ? -r : r;
}
- const char *attr = g_str_has_prefix(order, "created")
- ? G_FILE_ATTRIBUTE_TIME_CREATED
- : G_FILE_ATTRIBUTE_TIME_MODIFIED;
+ const char *attr = G_FILE_ATTRIBUTE_TIME_MODIFIED;
gint64 ta = get_dir_time(ea[0], ea[1], attr);
gint64 tb = get_dir_time(eb[0], eb[1], attr);
gint r = (ta > tb) - (ta < tb);
@@ -402,6 +648,36 @@ static GPtrArray *collect_all_categories(void) {
return entries;
}
+static void apply_saved_order(GSettings *settings, GPtrArray *entries) {
+ g_auto(GStrv) saved = g_settings_get_strv(settings, "category-order");
+ if (!saved || !saved[0])
+ return;
+
+ GPtrArray *ordered = g_ptr_array_new();
+ gboolean *used = g_new0(gboolean, entries->len);
+
+ for (int i = 0; saved[i]; i++) {
+ for (guint j = 0; j < entries->len; j++) {
+ if (used[j])
+ continue;
+ char **pair = g_ptr_array_index(entries, j);
+ if (g_strcmp0(pair[1], saved[i]) == 0) {
+ g_ptr_array_add(ordered, pair);
+ used[j] = TRUE;
+ break;
+ }
+ }
+ }
+ for (guint j = 0; j < entries->len; j++) {
+ if (!used[j])
+ g_ptr_array_add(ordered, g_ptr_array_index(entries, j));
+ }
+ for (guint i = 0; i < ordered->len; i++)
+ g_ptr_array_index(entries, i) = g_ptr_array_index(ordered, i);
+ g_ptr_array_free(ordered, TRUE);
+ g_free(used);
+}
+
static void free_category_entries(GPtrArray *entries) {
for (guint i = 0; i < entries->len; i++) {
char **pair = g_ptr_array_index(entries, i);
@@ -419,6 +695,7 @@ static void navigate_to(MoeMojiWindow *self, const char *page,
: GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT);
gtk_stack_set_visible_child_name(self->view_stack, page);
gboolean is_main = (g_strcmp0(page, "main") == 0);
+ gtk_widget_set_visible(self->sidebar_toggle, is_main);
gtk_widget_set_visible(self->add_button, is_main);
gtk_widget_set_visible(self->sort_button, is_main);
gtk_widget_set_visible(self->back_button, !is_main);
@@ -477,9 +754,19 @@ static void on_category_name_changed(G_GNUC_UNUSED GtkEditable *editable,
MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
const char *text =
gtk_editable_get_text(GTK_EDITABLE(self->category_name_entry));
- gtk_widget_set_sensitive(self->category_save_button,
- is_valid_category_name(text) &&
- !category_name_taken(text));
+ const char *error = NULL;
+ gboolean valid = TRUE;
+
+ if (!is_valid_category_name(text)) {
+ valid = FALSE;
+ } else if (category_name_taken(text)) {
+ error = "A category with this name already exists";
+ valid = FALSE;
+ }
+
+ gtk_widget_set_sensitive(self->category_save_button, valid);
+ gtk_label_set_text(GTK_LABEL(self->category_error_label), error ? error : "");
+ gtk_widget_set_visible(self->category_error_label, error != NULL);
}
static void on_category_save_clicked(G_GNUC_UNUSED GtkButton *button,
@@ -566,6 +853,244 @@ static void on_entry_save_clicked(G_GNUC_UNUSED GtkButton *button,
navigate_to(self, "main", FALSE);
}
+static void save_category_order(MoeMojiWindow *self) {
+ guint len = self->category_widgets->len;
+ char **order = g_new0(char *, len + 1);
+ for (guint i = 0; i < len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
+ order[i] = g_path_get_basename(cw->path);
+ }
+ g_settings_set_strv(self->settings, "category-order",
+ (const char *const *)order);
+ g_strfreev(order);
+}
+
+static GdkContentProvider *on_chip_drag_prepare(GtkDragSource *source,
+ G_GNUC_UNUSED double x,
+ G_GNUC_UNUSED double y,
+ G_GNUC_UNUSED gpointer data) {
+ GtkWidget *widget =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(source));
+ const char *path = g_object_get_data(G_OBJECT(widget), "cat-path");
+ if (!path)
+ return NULL;
+ GValue val = G_VALUE_INIT;
+ g_value_init(&val, G_TYPE_STRING);
+ g_value_set_string(&val, path);
+ return gdk_content_provider_new_for_value(&val);
+}
+
+static void on_chip_drag_begin(GtkDragSource *source,
+ G_GNUC_UNUSED GdkDrag *drag,
+ G_GNUC_UNUSED gpointer data) {
+ GtkWidget *widget =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(source));
+ GdkPaintable *paintable = gtk_widget_paintable_new(widget);
+ gtk_drag_source_set_icon(source, paintable, 0, 0);
+ g_object_unref(paintable);
+}
+
+static void clear_drop_indicator(GtkWidget *chip_box) {
+ GtkWidget *active = g_object_get_data(G_OBJECT(chip_box), "active-drop-sep");
+ if (active) {
+ gtk_widget_set_visible(active, FALSE);
+ g_object_set_data(G_OBJECT(chip_box), "active-drop-sep", NULL);
+ }
+}
+
+static void show_drop_indicator(GtkWidget *chip, double y) {
+ GtkWidget *chip_box = gtk_widget_get_parent(chip);
+ if (!chip_box)
+ return;
+ clear_drop_indicator(chip_box);
+
+ int height = gtk_widget_get_height(chip);
+ GtkWidget *sep;
+ if (y < height / 2.0)
+ sep = g_object_get_data(G_OBJECT(chip), "drop-sep-before");
+ else
+ sep = g_object_get_data(G_OBJECT(chip), "drop-sep-after");
+ if (sep) {
+ gtk_widget_set_visible(sep, TRUE);
+ g_object_set_data(G_OBJECT(chip_box), "active-drop-sep", sep);
+ }
+}
+
+static gboolean reorder_chips_idle(gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ if (self->category_widgets->len == 0)
+ return G_SOURCE_REMOVE;
+ CategoryWidgets *first = g_ptr_array_index(self->category_widgets, 0);
+ GtkWidget *chip_box = gtk_widget_get_parent(first->chip);
+ if (!chip_box)
+ return G_SOURCE_REMOVE;
+ GtkWidget *chip_after = NULL;
+ for (guint i = 0; i < self->category_widgets->len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
+ GtkWidget *sep = g_object_get_data(G_OBJECT(cw->chip), "drop-sep-before");
+ if (sep) {
+ gtk_widget_insert_after(sep, chip_box, chip_after);
+ chip_after = sep;
+ }
+ gtk_widget_insert_after(cw->chip, chip_box, chip_after);
+ chip_after = cw->chip;
+ }
+ CategoryWidgets *last_cw = g_ptr_array_index(self->category_widgets,
+ self->category_widgets->len - 1);
+ GtkWidget *sep_end =
+ g_object_get_data(G_OBJECT(last_cw->chip), "drop-sep-after");
+ if (sep_end)
+ gtk_widget_insert_after(sep_end, chip_box, chip_after);
+ return G_SOURCE_REMOVE;
+}
+
+static gboolean on_chip_drop(GtkDropTarget *target, const GValue *value,
+ G_GNUC_UNUSED double x, double y,
+ gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ GtkWidget *dst_widget =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(target));
+ const char *src_path = g_value_get_string(value);
+ const char *dst_path = g_object_get_data(G_OBJECT(dst_widget), "cat-path");
+
+ if (!src_path || !dst_path || g_strcmp0(src_path, dst_path) == 0)
+ return FALSE;
+
+ int src_idx = -1, dst_idx = -1;
+ for (guint i = 0; i < self->category_widgets->len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
+ if (g_strcmp0(cw->path, src_path) == 0)
+ src_idx = (int)i;
+ if (g_strcmp0(cw->path, dst_path) == 0)
+ dst_idx = (int)i;
+ }
+ if (src_idx < 0 || dst_idx < 0)
+ return FALSE;
+
+ int height = gtk_widget_get_height(dst_widget);
+ int insert_idx = (y < height / 2.0) ? dst_idx : dst_idx + 1;
+ if (src_idx < insert_idx)
+ insert_idx--;
+ if (insert_idx == src_idx)
+ return FALSE;
+
+ CategoryWidgets *moved = g_ptr_array_index(self->category_widgets, src_idx);
+ GPtrArray *reordered = g_ptr_array_new();
+ for (guint i = 0; i < self->category_widgets->len; i++) {
+ if ((int)i == src_idx)
+ continue;
+ if ((int)reordered->len == insert_idx)
+ g_ptr_array_add(reordered, moved);
+ g_ptr_array_add(reordered, g_ptr_array_index(self->category_widgets, i));
+ }
+ if ((int)reordered->len == insert_idx)
+ g_ptr_array_add(reordered, moved);
+
+ for (guint i = 0; i < reordered->len; i++)
+ g_ptr_array_index(self->category_widgets, i) =
+ g_ptr_array_index(reordered, i);
+ g_ptr_array_free(reordered, TRUE);
+
+ save_category_order(self);
+
+ GtkWidget *after = NULL;
+ for (guint i = 0; i < self->category_widgets->len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
+ gtk_widget_insert_after(cw->header, GTK_WIDGET(self->content_box), after);
+ gtk_widget_insert_after(cw->flow, GTK_WIDGET(self->content_box),
+ cw->header);
+ after = cw->flow;
+ }
+ if (self->bottom_spacer)
+ gtk_widget_insert_after(self->bottom_spacer, GTK_WIDGET(self->content_box),
+ after);
+
+ GtkWidget *chip_box = gtk_widget_get_parent(dst_widget);
+ if (chip_box)
+ clear_drop_indicator(chip_box);
+
+ for (guint i = 0; i < self->category_widgets->len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
+ if ((int)i == self->active_chip_index)
+ gtk_widget_add_css_class(cw->chip, "chip-active");
+ else
+ gtk_widget_remove_css_class(cw->chip, "chip-active");
+ }
+
+ g_idle_add(reorder_chips_idle, self);
+
+ return TRUE;
+}
+
+static GdkDragAction on_chip_drag_hover(GtkDropTarget *target,
+ G_GNUC_UNUSED double x, double y,
+ G_GNUC_UNUSED gpointer data) {
+ GtkWidget *widget =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(target));
+ show_drop_indicator(widget, y);
+ return GDK_ACTION_MOVE;
+}
+
+static void on_chip_drag_leave(GtkDropTarget *target,
+ G_GNUC_UNUSED gpointer data) {
+ GtkWidget *widget =
+ gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(target));
+ GtkWidget *chip_box = gtk_widget_get_parent(widget);
+ if (chip_box)
+ clear_drop_indicator(chip_box);
+}
+
+static void rebuild_pinned_box(MoeMojiWindow *self) {
+ if (!self->pinned_box)
+ return;
+ GtkWidget *child;
+ while ((child = gtk_widget_get_first_child(GTK_WIDGET(self->pinned_box))) !=
+ NULL)
+ gtk_box_remove(self->pinned_box, child);
+
+ g_auto(GStrv) pinned = g_settings_get_strv(self->settings, "pinned-kaomojis");
+ if (!pinned || !pinned[0]) {
+ gtk_widget_set_visible(GTK_WIDGET(self->pinned_box), FALSE);
+ return;
+ }
+ gtk_widget_set_visible(GTK_WIDGET(self->pinned_box), TRUE);
+
+ GtkWidget *header = gtk_label_new("Pinned");
+ gtk_widget_add_css_class(header, "pinned-header");
+ gtk_label_set_xalign(GTK_LABEL(header), 0.0);
+ gtk_box_append(self->pinned_box, header);
+
+ for (guint i = 0; pinned[i]; i++) {
+ const char *text = pinned[i];
+ gboolean multiline = (strchr(text, '\n') != NULL);
+ const char *label_text = text;
+ g_autofree char *first_line = NULL;
+ if (multiline) {
+ const char *nl = strchr(text, '\n');
+ first_line = g_strndup(text, nl - text);
+ label_text = first_line;
+ }
+ GtkWidget *btn = gtk_button_new_with_label(label_text);
+ gtk_widget_add_css_class(btn, "category-chip");
+ gtk_widget_add_css_class(btn, "flat");
+ gtk_button_set_has_frame(GTK_BUTTON(btn), FALSE);
+ GtkWidget *label = gtk_button_get_child(GTK_BUTTON(btn));
+ gtk_label_set_xalign(GTK_LABEL(label), 0.0);
+ gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END);
+ if (multiline)
+ g_object_set_data_full(G_OBJECT(btn), "full-text", g_strdup(text),
+ g_free);
+ g_signal_connect(btn, "clicked", G_CALLBACK(on_kaomoji_clicked), self);
+
+ GtkGestureClick *rc = GTK_GESTURE_CLICK(gtk_gesture_click_new());
+ gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(rc), 3);
+ g_signal_connect(rc, "pressed", G_CALLBACK(on_pinned_right_click), self);
+ gtk_widget_add_controller(btn, GTK_EVENT_CONTROLLER(rc));
+
+ gtk_box_append(self->pinned_box, btn);
+ }
+}
+
static void reload_categories(MoeMojiWindow *self) {
GtkWidget *child;
while ((child = gtk_widget_get_first_child(GTK_WIDGET(self->content_box))) !=
@@ -576,10 +1101,12 @@ static void reload_categories(MoeMojiWindow *self) {
self->bottom_spacer = NULL;
if (self->category_bar) {
- gtk_box_remove(self->outer_box, GTK_WIDGET(self->category_bar));
+ gtk_paned_set_start_child(self->paned, NULL);
self->category_bar = NULL;
}
+ gtk_widget_set_visible(self->sidebar_toggle, FALSE);
GPtrArray *entries = collect_all_categories();
+ apply_saved_order(self->settings, entries);
if (entries->len == 0) {
GtkWidget *label = gtk_label_new("No kaomoji data found.");
@@ -595,33 +1122,84 @@ static void reload_categories(MoeMojiWindow *self) {
self->bottom_spacer = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_append(self->content_box, self->bottom_spacer);
if (self->category_widgets->len > 0) {
- GtkWidget *flow = gtk_flow_box_new();
- gtk_flow_box_set_homogeneous(GTK_FLOW_BOX(flow), FALSE);
- gtk_flow_box_set_max_children_per_line(GTK_FLOW_BOX(flow), 20);
- gtk_flow_box_set_selection_mode(GTK_FLOW_BOX(flow), GTK_SELECTION_NONE);
- gtk_widget_add_css_class(flow, "category-chips");
+ GtkWidget *chip_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2);
for (guint i = 0; i < self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
GtkWidget *btn = gtk_button_new_with_label(cw->name);
gtk_widget_add_css_class(btn, "category-chip");
gtk_widget_add_css_class(btn, "flat");
+ gtk_button_set_has_frame(GTK_BUTTON(btn), FALSE);
+ GtkWidget *chip_label = gtk_button_get_child(GTK_BUTTON(btn));
+ gtk_label_set_xalign(GTK_LABEL(chip_label), 0.0);
+ gtk_label_set_ellipsize(GTK_LABEL(chip_label), PANGO_ELLIPSIZE_END);
+ g_object_set_data_full(G_OBJECT(btn), "cat-path", g_strdup(cw->path),
+ g_free);
+ g_object_set_data_full(G_OBJECT(btn), "cat-name", g_strdup(cw->name),
+ g_free);
+ GtkGestureClick *rc = GTK_GESTURE_CLICK(gtk_gesture_click_new());
+ gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(rc), 3);
+ g_signal_connect(rc, "pressed",
+ G_CALLBACK(on_category_header_right_click), self);
+ gtk_widget_add_controller(btn, GTK_EVENT_CONTROLLER(rc));
g_signal_connect(btn, "clicked", G_CALLBACK(on_chip_clicked), self);
+
+ GtkDragSource *src = gtk_drag_source_new();
+ gtk_drag_source_set_actions(src, GDK_ACTION_MOVE);
+ g_signal_connect(src, "prepare", G_CALLBACK(on_chip_drag_prepare), self);
+ g_signal_connect(src, "drag-begin", G_CALLBACK(on_chip_drag_begin), self);
+ gtk_widget_add_controller(btn, GTK_EVENT_CONTROLLER(src));
+
+ GtkDropTarget *tgt = gtk_drop_target_new(G_TYPE_STRING, GDK_ACTION_MOVE);
+ g_signal_connect(tgt, "drop", G_CALLBACK(on_chip_drop), self);
+ g_signal_connect(tgt, "enter", G_CALLBACK(on_chip_drag_hover), self);
+ g_signal_connect(tgt, "motion", G_CALLBACK(on_chip_drag_hover), self);
+ g_signal_connect(tgt, "leave", G_CALLBACK(on_chip_drag_leave), self);
+ gtk_widget_add_controller(btn, GTK_EVENT_CONTROLLER(tgt));
+
cw->chip = btn;
- gtk_flow_box_insert(GTK_FLOW_BOX(flow), btn, -1);
+
+ GtkWidget *sep = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_widget_add_css_class(sep, "chip-drop-line");
+ gtk_widget_set_size_request(sep, -1, 2);
+ gtk_widget_set_visible(sep, FALSE);
+ gtk_box_append(GTK_BOX(chip_box), sep);
+ g_object_set_data(G_OBJECT(btn), "drop-sep-before", sep);
+ if (i > 0) {
+ CategoryWidgets *prev_cw =
+ g_ptr_array_index(self->category_widgets, i - 1);
+ g_object_set_data(G_OBJECT(prev_cw->chip), "drop-sep-after", sep);
+ }
+
+ gtk_box_append(GTK_BOX(chip_box), btn);
+
+ if (i == self->category_widgets->len - 1) {
+ GtkWidget *tail = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_widget_add_css_class(tail, "chip-drop-line");
+ gtk_widget_set_size_request(tail, -1, 2);
+ gtk_widget_set_visible(tail, FALSE);
+ gtk_box_append(GTK_BOX(chip_box), tail);
+ g_object_set_data(G_OBJECT(btn), "drop-sep-after", tail);
+ }
}
self->category_bar = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
gtk_widget_add_css_class(GTK_WIDGET(self->category_bar), "category-bar");
- gtk_widget_set_size_request(GTK_WIDGET(self->category_bar), -1, 80);
GtkWidget *cat_scroll = gtk_scrolled_window_new();
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cat_scroll),
- GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
- gtk_scrolled_window_set_max_content_height(GTK_SCROLLED_WINDOW(cat_scroll),
- 80);
- gtk_scrolled_window_set_propagate_natural_height(
- GTK_SCROLLED_WINDOW(cat_scroll), TRUE);
- gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(cat_scroll), flow);
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_widget_set_vexpand(cat_scroll, TRUE);
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(cat_scroll), chip_box);
gtk_box_append(self->category_bar, cat_scroll);
- gtk_box_append(self->outer_box, GTK_WIDGET(self->category_bar));
+
+ self->pinned_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 2));
+ gtk_widget_add_css_class(GTK_WIDGET(self->pinned_box), "pinned-section");
+ gtk_box_append(self->category_bar, GTK_WIDGET(self->pinned_box));
+ rebuild_pinned_box(self);
+
+ gtk_paned_set_start_child(self->paned, GTK_WIDGET(self->category_bar));
+ gtk_widget_set_visible(self->sidebar_toggle, TRUE);
+ gtk_widget_set_visible(
+ GTK_WIDGET(self->category_bar),
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->sidebar_toggle)));
GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(
GTK_SCROLLED_WINDOW(self->kaomoji_scroll));
if (self->scroll_handler_id != 0)
@@ -683,6 +1261,11 @@ static GtkWidget *build_add_category_page(MoeMojiWindow *self) {
g_signal_connect(self->category_name_entry, "changed",
G_CALLBACK(on_category_name_changed), self);
+ self->category_error_label = gtk_label_new("");
+ gtk_widget_add_css_class(self->category_error_label, "error-label");
+ gtk_widget_set_visible(self->category_error_label, FALSE);
+ gtk_box_append(GTK_BOX(box), self->category_error_label);
+
self->category_save_button = gtk_button_new_with_label("Save");
gtk_widget_set_sensitive(self->category_save_button, FALSE);
gtk_widget_add_css_class(self->category_save_button, "suggested-action");
@@ -807,8 +1390,6 @@ static void copy_dir_recursive(const char *src, const char *dst) {
g_dir_close(dir);
}
-static void populate_manage_page(MoeMojiWindow *self);
-
static void on_manage_delete_emote_response(AdwAlertDialog *dialog,
GAsyncResult *res,
gpointer user_data) {
@@ -816,20 +1397,35 @@ static void on_manage_delete_emote_response(AdwAlertDialog *dialog,
const char *response = adw_alert_dialog_choose_finish(dialog, res);
if (g_strcmp0(response, "yes") == 0) {
const char *filepath = g_object_get_data(G_OBJECT(dialog), "emote-path");
+ const char *text = g_object_get_data(G_OBJECT(dialog), "emote-text");
g_unlink(filepath);
+ if (text && is_kaomoji_pinned(self, text)) {
+ g_auto(GStrv) pinned =
+ g_settings_get_strv(self->settings, "pinned-kaomojis");
+ GPtrArray *arr = g_ptr_array_new();
+ for (guint i = 0; pinned[i]; i++) {
+ if (g_strcmp0(pinned[i], text) != 0)
+ g_ptr_array_add(arr, pinned[i]);
+ }
+ g_ptr_array_add(arr, NULL);
+ g_settings_set_strv(self->settings, "pinned-kaomojis",
+ (const char *const *)arr->pdata);
+ g_ptr_array_free(arr, TRUE);
+ }
reload_categories(self);
- populate_manage_page(self);
}
}
-static void on_manage_delete_emote(GtkButton *button, gpointer user_data) {
+static void on_ctx_delete_emote(G_GNUC_UNUSED GSimpleAction *action,
+ G_GNUC_UNUSED GVariant *parameter,
+ gpointer user_data) {
MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
- const char *filepath = g_object_get_data(G_OBJECT(button), "emote-path");
- const char *emote_text = g_object_get_data(G_OBJECT(button), "emote-text");
+ const char *filepath = self->ctx_emote_path;
+ const char *emote_text = self->ctx_emote_text;
g_autofree char *body = NULL;
if (g_utf8_strlen(emote_text, -1) > 40) {
- gchar *end = g_utf8_offset_to_pointer(emote_text, 40);
+ char *end = g_utf8_offset_to_pointer(emote_text, 40);
g_autofree char *prefix = g_strndup(emote_text, end - emote_text);
body = g_strdup_printf("%s…", prefix);
} else {
@@ -844,6 +1440,8 @@ static void on_manage_delete_emote(GtkButton *button, gpointer user_data) {
adw_alert_dialog_set_close_response(confirm, "no");
g_object_set_data_full(G_OBJECT(confirm), "emote-path", g_strdup(filepath),
g_free);
+ g_object_set_data_full(G_OBJECT(confirm), "emote-text", g_strdup(emote_text),
+ g_free);
adw_alert_dialog_choose(confirm, GTK_WIDGET(self), NULL,
(GAsyncReadyCallback)on_manage_delete_emote_response,
@@ -859,14 +1457,45 @@ static void on_manage_delete_category_response(AdwAlertDialog *dialog,
const char *cat_path = g_object_get_data(G_OBJECT(dialog), "cat-path");
remove_dir_recursive(cat_path);
reload_categories(self);
- populate_manage_page(self);
+ }
+}
+
+static void on_rename_entry_changed(GtkEditable *editable, gpointer user_data) {
+ AdwAlertDialog *dialog = ADW_ALERT_DIALOG(user_data);
+ const char *text = gtk_editable_get_text(editable);
+ const char *original = g_object_get_data(G_OBJECT(dialog), "original-name");
+ g_autofree char *stripped = g_strstrip(g_strdup(text));
+ const char *error = NULL;
+ gboolean valid = TRUE;
+
+ if (stripped[0] == '\0') {
+ error = "Name cannot be empty";
+ valid = FALSE;
+ } else if (g_strcmp0(stripped, original) == 0) {
+ error = NULL;
+ valid = FALSE;
+ } else if (category_name_taken(stripped)) {
+ error = "A category with this name already exists";
+ valid = FALSE;
+ }
+
+ adw_alert_dialog_set_body(dialog, error ? error : "");
+ adw_alert_dialog_set_response_enabled(dialog, "rename", valid);
+}
+
+static void on_rename_entry_activate(G_GNUC_UNUSED GtkEntry *entry,
+ gpointer user_data) {
+ AdwAlertDialog *dialog = ADW_ALERT_DIALOG(user_data);
+ if (adw_alert_dialog_get_response_enabled(dialog, "rename")) {
+ g_signal_emit_by_name(dialog, "response", "rename");
+ adw_dialog_force_close(ADW_DIALOG(dialog));
}
}
static void on_rename_category_response(AdwAlertDialog *dialog,
- GAsyncResult *res, gpointer user_data) {
+ const char *response,
+ gpointer user_data) {
MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
- const char *response = adw_alert_dialog_choose_finish(dialog, res);
if (g_strcmp0(response, "rename") != 0)
return;
const char *cat_path = g_object_get_data(G_OBJECT(dialog), "cat-path");
@@ -878,14 +1507,29 @@ static void on_rename_category_response(AdwAlertDialog *dialog,
return;
g_autofree char *name_file = g_build_filename(cat_path, ".name", NULL);
g_file_set_contents(name_file, stripped, -1, NULL);
- reload_categories(self);
- populate_manage_page(self);
+ for (guint i = 0; i < self->category_widgets->len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(self->category_widgets, i);
+ if (g_strcmp0(cw->path, cat_path) == 0) {
+ g_free(cw->name);
+ cw->name = g_strdup(stripped);
+ gtk_label_set_text(GTK_LABEL(cw->header), stripped);
+ if (cw->chip) {
+ GtkWidget *chip_label = gtk_button_get_child(GTK_BUTTON(cw->chip));
+ gtk_label_set_text(GTK_LABEL(chip_label), stripped);
+ g_object_set_data_full(G_OBJECT(cw->chip), "cat-name",
+ g_strdup(stripped), g_free);
+ }
+ break;
+ }
+ }
}
-static void on_manage_rename_category(GtkButton *button, gpointer user_data) {
+static void on_ctx_rename_category(G_GNUC_UNUSED GSimpleAction *action,
+ G_GNUC_UNUSED GVariant *parameter,
+ gpointer user_data) {
MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
- const char *cat_path = g_object_get_data(G_OBJECT(button), "cat-path");
- const char *cat_name = g_object_get_data(G_OBJECT(button), "cat-name");
+ const char *cat_path = self->ctx_cat_path;
+ const char *cat_name = self->ctx_cat_name;
AdwAlertDialog *dialog =
ADW_ALERT_DIALOG(adw_alert_dialog_new("Rename Category", NULL));
@@ -895,23 +1539,33 @@ static void on_manage_rename_category(GtkButton *button, gpointer user_data) {
ADW_RESPONSE_SUGGESTED);
adw_alert_dialog_set_default_response(dialog, "rename");
adw_alert_dialog_set_close_response(dialog, "cancel");
+ adw_alert_dialog_set_response_enabled(dialog, "rename", FALSE);
GtkWidget *entry = gtk_entry_new();
gtk_editable_set_text(GTK_EDITABLE(entry), cat_name);
adw_alert_dialog_set_extra_child(dialog, entry);
-
+ g_signal_connect_swapped(dialog, "map", G_CALLBACK(gtk_widget_grab_focus),
+ entry);
+ g_signal_connect(entry, "activate", G_CALLBACK(on_rename_entry_activate),
+ dialog);
+ g_signal_connect(entry, "changed", G_CALLBACK(on_rename_entry_changed),
+ dialog);
g_object_set_data_full(G_OBJECT(dialog), "cat-path", g_strdup(cat_path),
g_free);
+ g_object_set_data_full(G_OBJECT(dialog), "original-name", g_strdup(cat_name),
+ g_free);
g_object_set_data(G_OBJECT(dialog), "name-entry", entry);
- adw_alert_dialog_choose(dialog, GTK_WIDGET(self), NULL,
- (GAsyncReadyCallback)on_rename_category_response,
- self);
+ g_signal_connect(dialog, "response", G_CALLBACK(on_rename_category_response),
+ self);
+ adw_alert_dialog_choose(dialog, GTK_WIDGET(self), NULL, NULL, NULL);
}
-static void on_manage_delete_category(GtkButton *button, gpointer user_data) {
+static void on_ctx_delete_category(G_GNUC_UNUSED GSimpleAction *action,
+ G_GNUC_UNUSED GVariant *parameter,
+ gpointer user_data) {
MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
- const char *cat_path = g_object_get_data(G_OBJECT(button), "cat-path");
- const char *cat_name = g_object_get_data(G_OBJECT(button), "cat-name");
+ const char *cat_path = self->ctx_cat_path;
+ const char *cat_name = self->ctx_cat_name;
g_autofree char *heading = g_strdup_printf("Delete \"%s\"?", cat_name);
AdwAlertDialog *confirm = ADW_ALERT_DIALOG(adw_alert_dialog_new(
@@ -929,223 +1583,6 @@ static void on_manage_delete_category(GtkButton *button, gpointer user_data) {
(GAsyncReadyCallback)on_manage_delete_category_response, self);
}
-static void populate_manage_page(MoeMojiWindow *self) {
- GtkWidget *manage_page =
- gtk_stack_get_child_by_name(self->view_stack, "manage");
- GtkWidget *content =
- g_object_get_data(G_OBJECT(manage_page), "manage-content");
-
- GtkWidget *child;
- while ((child = gtk_widget_get_first_child(content)) != NULL)
- gtk_box_remove(GTK_BOX(content), child);
-
- GPtrArray *entries = collect_all_categories();
-
- if (entries->len == 0) {
- GtkWidget *label = gtk_label_new("No categories to manage.");
- gtk_box_append(GTK_BOX(content), label);
- }
-
- for (guint i = 0; i < entries->len; i++) {
- char **pair = g_ptr_array_index(entries, i);
- g_autofree char *cat_path = g_build_filename(pair[0], pair[1], NULL);
- g_autofree char *display_name = get_category_display_name(cat_path);
-
- GtkWidget *cat_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
- gtk_widget_set_margin_top(cat_hbox, 8);
-
- GtkWidget *cat_label = gtk_label_new(display_name);
- gtk_widget_add_css_class(cat_label, "category-header");
- gtk_label_set_xalign(GTK_LABEL(cat_label), 0.0);
- gtk_widget_set_hexpand(cat_label, TRUE);
- gtk_box_append(GTK_BOX(cat_hbox), cat_label);
-
- GtkWidget *cat_rename_btn =
- gtk_button_new_from_icon_name("document-edit-symbolic");
- gtk_widget_add_css_class(cat_rename_btn, "manage-cat-rename");
- gtk_widget_add_css_class(cat_rename_btn, "circular");
- gtk_widget_set_valign(cat_rename_btn, GTK_ALIGN_CENTER);
- g_object_set_data_full(G_OBJECT(cat_rename_btn), "cat-path",
- g_strdup(cat_path), g_free);
- g_object_set_data_full(G_OBJECT(cat_rename_btn), "cat-name",
- g_strdup(display_name), g_free);
- g_signal_connect(cat_rename_btn, "clicked",
- G_CALLBACK(on_manage_rename_category), self);
- gtk_box_append(GTK_BOX(cat_hbox), cat_rename_btn);
-
- GtkWidget *cat_del_btn =
- gtk_button_new_from_icon_name("window-close-symbolic");
- gtk_widget_add_css_class(cat_del_btn, "manage-cat-delete");
- gtk_widget_add_css_class(cat_del_btn, "circular");
- gtk_widget_set_valign(cat_del_btn, GTK_ALIGN_CENTER);
- g_object_set_data_full(G_OBJECT(cat_del_btn), "cat-path",
- g_strdup(cat_path), g_free);
- g_object_set_data_full(G_OBJECT(cat_del_btn), "cat-name",
- g_strdup(display_name), g_free);
- g_signal_connect(cat_del_btn, "clicked",
- G_CALLBACK(on_manage_delete_category), self);
- gtk_box_append(GTK_BOX(cat_hbox), cat_del_btn);
-
- gtk_box_append(GTK_BOX(content), cat_hbox);
-
- GtkWidget *flow = gtk_flow_box_new();
- gtk_flow_box_set_homogeneous(GTK_FLOW_BOX(flow), FALSE);
- gtk_flow_box_set_min_children_per_line(GTK_FLOW_BOX(flow), 2);
- gtk_flow_box_set_max_children_per_line(GTK_FLOW_BOX(flow), 10);
- gtk_flow_box_set_selection_mode(GTK_FLOW_BOX(flow), GTK_SELECTION_NONE);
-
- GDir *dir = g_dir_open(cat_path, 0, NULL);
- if (dir) {
- GPtrArray *files = g_ptr_array_new_with_free_func(g_free);
- const char *filename;
- while ((filename = g_dir_read_name(dir)) != NULL) {
- if (g_str_has_suffix(filename, ".txt"))
- g_ptr_array_add(files, g_build_filename(cat_path, filename, NULL));
- }
- g_ptr_array_sort(files, compare_files_by_mtime);
-
- for (guint j = 0; j < files->len; j++) {
- const char *filepath = g_ptr_array_index(files, j);
- char *contents = NULL;
- if (g_file_get_contents(filepath, &contents, NULL, NULL)) {
- g_strchomp(contents);
- if (contents[0] != '\0') {
- GtkWidget *emote_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
- gtk_widget_add_css_class(emote_box, "manage-emote");
- gtk_widget_set_halign(emote_box, GTK_ALIGN_CENTER);
-
- const char *display_text = contents;
- g_autofree char *first_line = NULL;
- if (strchr(contents, '\n')) {
- const char *nl = strchr(contents, '\n');
- first_line = g_strndup(contents, nl - contents);
- display_text = first_line;
- }
-
- GtkWidget *emote_label = gtk_label_new(display_text);
- gtk_label_set_ellipsize(GTK_LABEL(emote_label),
- PANGO_ELLIPSIZE_END);
- gtk_label_set_max_width_chars(GTK_LABEL(emote_label), 20);
- gtk_box_append(GTK_BOX(emote_box), emote_label);
-
- GtkWidget *del_btn =
- gtk_button_new_from_icon_name("window-close-symbolic");
- gtk_widget_add_css_class(del_btn, "manage-delete");
- gtk_widget_add_css_class(del_btn, "circular");
- gtk_widget_set_halign(del_btn, GTK_ALIGN_CENTER);
- g_object_set_data_full(G_OBJECT(del_btn), "emote-path",
- g_strdup(filepath), g_free);
- g_object_set_data_full(G_OBJECT(del_btn), "emote-text",
- g_strdup(display_text), g_free);
- g_signal_connect(del_btn, "clicked",
- G_CALLBACK(on_manage_delete_emote), self);
- gtk_box_append(GTK_BOX(emote_box), del_btn);
-
- gtk_flow_box_insert(GTK_FLOW_BOX(flow), emote_box, -1);
- }
- g_free(contents);
- }
- }
- g_ptr_array_free(files, TRUE);
- g_dir_close(dir);
- }
-
- gtk_box_append(GTK_BOX(content), flow);
- }
- free_category_entries(entries);
-}
-
-static void on_manage_search_changed(GtkSearchEntry *entry,
- gpointer user_data) {
- GtkWidget *manage_page = GTK_WIDGET(user_data);
- const char *query = gtk_editable_get_text(GTK_EDITABLE(entry));
- if (query == NULL || query[0] == '\0')
- return;
-
- GtkWidget *content =
- g_object_get_data(G_OBJECT(manage_page), "manage-content");
- GtkWidget *scroll = g_object_get_data(G_OBJECT(manage_page), "manage-scroll");
-
- g_autofree char *query_lower = g_utf8_strdown(query, -1);
-
- for (GtkWidget *child = gtk_widget_get_first_child(content); child != NULL;
- child = gtk_widget_get_next_sibling(child)) {
- GtkWidget *first = gtk_widget_get_first_child(child);
- if (first == NULL || !GTK_IS_LABEL(first))
- continue;
- const char *label_text = gtk_label_get_text(GTK_LABEL(first));
- g_autofree char *name_lower = g_utf8_strdown(label_text, -1);
- if (strstr(name_lower, query_lower) != NULL) {
- graphene_point_t p;
- if (gtk_widget_compute_point(child, content, &GRAPHENE_POINT_INIT(0, 0),
- &p)) {
- GtkAdjustment *vadj =
- gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll));
- gtk_adjustment_set_value(vadj, p.y);
- }
- return;
- }
- }
-}
-
-static GtkWidget *build_manage_page(void) {
- GtkWidget *wrapper = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_vexpand(wrapper, TRUE);
-
- GtkWidget *clamp = adw_clamp_new();
- adw_clamp_set_maximum_size(ADW_CLAMP(clamp), 600);
- adw_clamp_set_tightening_threshold(ADW_CLAMP(clamp), 400);
- gtk_widget_set_vexpand(clamp, TRUE);
-
- GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_widget_add_css_class(box, "add-form");
- gtk_widget_set_vexpand(box, TRUE);
-
- GtkWidget *search = gtk_search_entry_new();
- gtk_widget_set_margin_start(search, 6);
- gtk_widget_set_margin_end(search, 6);
- gtk_widget_set_margin_top(search, 6);
- g_object_set(search, "placeholder-text", "Jump to category...", NULL);
- gtk_box_append(GTK_BOX(box), search);
-
- GtkWidget *scroll = gtk_scrolled_window_new();
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
- gtk_widget_set_vexpand(scroll, TRUE);
-
- GtkWidget *content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
- gtk_widget_set_margin_start(content, 6);
- gtk_widget_set_margin_end(content, 6);
- gtk_widget_set_margin_top(content, 6);
- gtk_widget_set_margin_bottom(content, 6);
-
- gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scroll), content);
- gtk_box_append(GTK_BOX(box), scroll);
- adw_clamp_set_child(ADW_CLAMP(clamp), box);
- gtk_box_append(GTK_BOX(wrapper), clamp);
-
- g_object_set_data(G_OBJECT(wrapper), "manage-content", content);
- g_object_set_data(G_OBJECT(wrapper), "manage-search", search);
- g_object_set_data(G_OBJECT(wrapper), "manage-scroll", scroll);
-
- g_signal_connect(search, "search-changed",
- G_CALLBACK(on_manage_search_changed), wrapper);
-
- return wrapper;
-}
-
-static void on_manage_activated(G_GNUC_UNUSED GSimpleAction *action,
- G_GNUC_UNUSED GVariant *parameter,
- gpointer user_data) {
- MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
- populate_manage_page(self);
- GtkWidget *manage_page =
- gtk_stack_get_child_by_name(self->view_stack, "manage");
- GtkWidget *search = g_object_get_data(G_OBJECT(manage_page), "manage-search");
- gtk_editable_set_text(GTK_EDITABLE(search), "");
- navigate_to(self, "manage", TRUE);
-}
-
static void on_export_save_ready(GObject *source, GAsyncResult *res,
G_GNUC_UNUSED gpointer user_data) {
GtkFileDialog *dialog = GTK_FILE_DIALOG(source);
@@ -1202,21 +1639,26 @@ static void on_export_save_ready(GObject *source, GAsyncResult *res,
remove_dir_recursive(tmpdir);
}
-static void on_export_activated(G_GNUC_UNUSED GSimpleAction *action,
- G_GNUC_UNUSED GVariant *parameter,
- gpointer user_data) {
- MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+static GtkFileDialog *new_targz_dialog(const char *title) {
GtkFileDialog *dialog = gtk_file_dialog_new();
- gtk_file_dialog_set_title(dialog, "Export Kaomojis");
- gtk_file_dialog_set_initial_name(dialog, "moemoji-export.tar.gz");
- GListStore *filters = g_list_store_new(GTK_TYPE_FILE_FILTER);
+ gtk_file_dialog_set_title(dialog, title);
GtkFileFilter *filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, "Tar archives (*.tar.gz)");
gtk_file_filter_add_pattern(filter, "*.tar.gz");
+ GListStore *filters = g_list_store_new(GTK_TYPE_FILE_FILTER);
g_list_store_append(filters, filter);
g_object_unref(filter);
gtk_file_dialog_set_filters(dialog, G_LIST_MODEL(filters));
g_object_unref(filters);
+ return dialog;
+}
+
+static void on_export_activated(G_GNUC_UNUSED GSimpleAction *action,
+ G_GNUC_UNUSED GVariant *parameter,
+ gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ GtkFileDialog *dialog = new_targz_dialog("Export Kaomojis");
+ gtk_file_dialog_set_initial_name(dialog, "moemoji-export.tar.gz");
gtk_file_dialog_save(dialog, GTK_WINDOW(self), NULL, on_export_save_ready,
self);
g_object_unref(dialog);
@@ -1290,16 +1732,7 @@ static void on_import_activated(G_GNUC_UNUSED GSimpleAction *action,
G_GNUC_UNUSED GVariant *parameter,
gpointer user_data) {
MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
- GtkFileDialog *dialog = gtk_file_dialog_new();
- gtk_file_dialog_set_title(dialog, "Import Kaomojis");
- GListStore *filters = g_list_store_new(GTK_TYPE_FILE_FILTER);
- GtkFileFilter *filter = gtk_file_filter_new();
- gtk_file_filter_set_name(filter, "Tar archives (*.tar.gz)");
- gtk_file_filter_add_pattern(filter, "*.tar.gz");
- g_list_store_append(filters, filter);
- g_object_unref(filter);
- gtk_file_dialog_set_filters(dialog, G_LIST_MODEL(filters));
- g_object_unref(filters);
+ GtkFileDialog *dialog = new_targz_dialog("Import Kaomojis");
gtk_file_dialog_open(dialog, GTK_WINDOW(self), NULL, on_import_open_ready,
self);
g_object_unref(dialog);
@@ -1322,15 +1755,54 @@ static void on_sort_order_changed(GSimpleAction *action, GVariant *parameter,
g_settings_set_string(self->settings, "category-sort", order);
current_sort_order = order;
update_sort_button_icon(self);
+ const char *empty[] = {NULL};
+ g_settings_set_strv(self->settings, "category-order", empty);
reload_categories(self);
+ save_category_order(self);
+}
+
+static void on_restore_default_order(G_GNUC_UNUSED GSimpleAction *action,
+ G_GNUC_UNUSED GVariant *parameter,
+ gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ g_settings_reset(self->settings, "category-order");
+ reload_categories(self);
+}
+
+static void on_sidebar_toggled(GtkToggleButton *toggle, gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ gboolean active = gtk_toggle_button_get_active(toggle);
+ GtkWidget *start = gtk_paned_get_start_child(self->paned);
+ if (start)
+ gtk_widget_set_visible(start, active);
+ gtk_button_set_icon_name(GTK_BUTTON(toggle),
+ active ? "pan-start-symbolic" : "pan-end-symbolic");
+}
+
+#define SIDEBAR_HIDE_WIDTH 450
+
+static void on_surface_layout(G_GNUC_UNUSED GdkSurface *surface, int width,
+ G_GNUC_UNUSED int height, gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(user_data);
+ if (width > 0 && width < SIDEBAR_HIDE_WIDTH)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self->sidebar_toggle),
+ FALSE);
+}
+
+static void on_window_realize(GtkWidget *widget,
+ G_GNUC_UNUSED gpointer user_data) {
+ MoeMojiWindow *self = MOEMOJI_WINDOW(widget);
+ GdkSurface *surface = gtk_native_get_surface(GTK_NATIVE(self));
+ if (surface)
+ g_signal_connect(surface, "layout", G_CALLBACK(on_surface_layout), self);
}
static void moemoji_window_class_init(MoeMojiWindowClass *klass) {
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
gtk_widget_class_set_template_from_resource(
widget_class, "/jp/angeltech/MoeMoji/moemoji-window.ui");
- gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow,
- wrapper_box);
+ gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow, paned);
+ gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow, right_pane);
gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow, outer_box);
gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow,
content_box);
@@ -1339,12 +1811,15 @@ static void moemoji_window_class_init(MoeMojiWindowClass *klass) {
gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow,
kaomoji_scroll);
gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow, view_stack);
+ gtk_widget_class_bind_template_child(widget_class, MoeMojiWindow,
+ toast_overlay);
}
static void moemoji_window_init(MoeMojiWindow *self) {
gtk_widget_init_template(GTK_WIDGET(self));
gtk_widget_add_css_class(GTK_WIDGET(self), "wallpaper-bg");
gtk_widget_add_css_class(GTK_WIDGET(self->content_box), "content-area");
+ gtk_paned_set_position(self->paned, 150);
GtkWidget *empty_titlebar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_visible(empty_titlebar, FALSE);
@@ -1352,10 +1827,19 @@ static void moemoji_window_init(MoeMojiWindow *self) {
self->header_bar = GTK_WIDGET(adw_header_bar_new());
gtk_widget_add_css_class(self->header_bar, "flat");
+ adw_header_bar_set_show_start_title_buttons(ADW_HEADER_BAR(self->header_bar),
+ FALSE);
adw_header_bar_set_show_end_title_buttons(ADW_HEADER_BAR(self->header_bar),
TRUE);
self->settings = g_settings_new("jp.angeltech.MoeMoji");
+ self->sidebar_toggle = GTK_WIDGET(gtk_toggle_button_new());
+ gtk_button_set_icon_name(GTK_BUTTON(self->sidebar_toggle),
+ "pan-start-symbolic");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self->sidebar_toggle), TRUE);
+ adw_header_bar_pack_start(ADW_HEADER_BAR(self->header_bar),
+ self->sidebar_toggle);
+
self->add_button = gtk_button_new_from_icon_name("list-add-symbolic");
adw_header_bar_pack_start(ADW_HEADER_BAR(self->header_bar), self->add_button);
@@ -1365,8 +1849,7 @@ static void moemoji_window_init(MoeMojiWindow *self) {
g_menu_append(sort_menu, "Alphabetically ↓", "win.sort-order::alpha-desc");
g_menu_append(sort_menu, "Modified ↑", "win.sort-order::modified-asc");
g_menu_append(sort_menu, "Modified ↓", "win.sort-order::modified-desc");
- g_menu_append(sort_menu, "Created ↑", "win.sort-order::created-asc");
- g_menu_append(sort_menu, "Created ↓", "win.sort-order::created-desc");
+ g_menu_append(sort_menu, "Default order", "win.restore-default-order");
gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(self->sort_button),
G_MENU_MODEL(sort_menu));
g_object_unref(sort_menu);
@@ -1380,6 +1863,12 @@ static void moemoji_window_init(MoeMojiWindow *self) {
g_signal_connect(sort_action, "change-state",
G_CALLBACK(on_sort_order_changed), self);
g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(sort_action));
+ GSimpleAction *restore_action =
+ g_simple_action_new("restore-default-order", NULL);
+ g_signal_connect(restore_action, "activate",
+ G_CALLBACK(on_restore_default_order), self);
+ g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(restore_action));
+ g_object_unref(restore_action);
current_sort_order =
g_variant_get_string(g_action_get_state(G_ACTION(sort_action)), NULL);
update_sort_button_icon(self);
@@ -1394,20 +1883,13 @@ static void moemoji_window_init(MoeMojiWindow *self) {
gtk_menu_button_set_icon_name(GTK_MENU_BUTTON(self->menu_button),
"open-menu-symbolic");
GMenu *primary_menu = g_menu_new();
- GMenu *sec1 = g_menu_new();
- g_menu_append(sec1, "Manage…", "win.manage");
- g_menu_append_section(primary_menu, NULL, G_MENU_MODEL(sec1));
- g_object_unref(sec1);
- GMenu *sec2 = g_menu_new();
- g_menu_append(sec2, "Export…", "win.export");
- g_menu_append(sec2, "Import…", "win.import");
- g_menu_append_section(primary_menu, NULL, G_MENU_MODEL(sec2));
- g_object_unref(sec2);
+ g_menu_append(primary_menu, "Export…", "win.export");
+ g_menu_append(primary_menu, "Import…", "win.import");
gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(self->menu_button),
G_MENU_MODEL(primary_menu));
g_object_unref(primary_menu);
adw_header_bar_pack_end(ADW_HEADER_BAR(self->header_bar), self->menu_button);
- gtk_box_prepend(self->wrapper_box, self->header_bar);
+ gtk_box_prepend(self->right_pane, self->header_bar);
self->category_widgets =
g_ptr_array_new_with_free_func(category_widgets_free);
self->active_chip_index = -1;
@@ -1424,11 +1906,36 @@ static void moemoji_window_init(MoeMojiWindow *self) {
g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(import_action));
g_object_unref(import_action);
- GSimpleAction *manage_action = g_simple_action_new("manage", NULL);
- g_signal_connect(manage_action, "activate", G_CALLBACK(on_manage_activated),
- self);
- g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(manage_action));
- g_object_unref(manage_action);
+ GSimpleAction *ctx_rename_cat =
+ g_simple_action_new("ctx-rename-category", NULL);
+ g_signal_connect(ctx_rename_cat, "activate",
+ G_CALLBACK(on_ctx_rename_category), self);
+ g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(ctx_rename_cat));
+ g_object_unref(ctx_rename_cat);
+
+ GSimpleAction *ctx_delete_cat =
+ g_simple_action_new("ctx-delete-category", NULL);
+ g_signal_connect(ctx_delete_cat, "activate",
+ G_CALLBACK(on_ctx_delete_category), self);
+ g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(ctx_delete_cat));
+ g_object_unref(ctx_delete_cat);
+
+ GSimpleAction *ctx_delete_emote =
+ g_simple_action_new("ctx-delete-emote", NULL);
+ g_signal_connect(ctx_delete_emote, "activate",
+ G_CALLBACK(on_ctx_delete_emote), self);
+ g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(ctx_delete_emote));
+ g_object_unref(ctx_delete_emote);
+
+ GSimpleAction *ctx_pin = g_simple_action_new("ctx-pin-emote", NULL);
+ g_signal_connect(ctx_pin, "activate", G_CALLBACK(on_ctx_pin_emote), self);
+ g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(ctx_pin));
+ g_object_unref(ctx_pin);
+
+ GSimpleAction *ctx_unpin = g_simple_action_new("ctx-unpin-emote", NULL);
+ g_signal_connect(ctx_unpin, "activate", G_CALLBACK(on_ctx_unpin_emote), self);
+ g_action_map_add_action(G_ACTION_MAP(self), G_ACTION(ctx_unpin));
+ g_object_unref(ctx_unpin);
g_signal_connect(self->add_button, "clicked", G_CALLBACK(on_add_clicked),
self);
@@ -1442,9 +1949,11 @@ static void moemoji_window_init(MoeMojiWindow *self) {
gtk_stack_add_named(self->view_stack, pick_page, "pick-category");
GtkWidget *entry_page = build_add_entry_page(self);
gtk_stack_add_named(self->view_stack, entry_page, "add-entry");
- GtkWidget *manage_page = build_manage_page();
- gtk_stack_add_named(self->view_stack, manage_page, "manage");
reload_categories(self);
+ g_signal_connect(self->sidebar_toggle, "toggled",
+ G_CALLBACK(on_sidebar_toggled), self);
+ g_signal_connect(self, "realize", G_CALLBACK(on_window_realize), NULL);
+ gtk_search_entry_set_key_capture_widget(self->search_entry, GTK_WIDGET(self));
g_signal_connect(self->search_entry, "search-changed",
G_CALLBACK(on_search_changed), self);
g_signal_connect(self->kaomoji_scroll, "map",
diff --git a/src/moemoji-window.h b/src/moemoji-window.h
index 81fcb6c..6207338 100644
--- a/src/moemoji-window.h
+++ b/src/moemoji-window.h
@@ -1,22 +1,25 @@
#pragma once
-#include
+#include
typedef struct {
GtkWidget *header;
GtkWidget *flow;
GtkWidget *chip;
char *name;
+ char *path;
} CategoryWidgets;
struct _MoeMojiWindow {
GtkApplicationWindow parent_instance;
- GtkBox *wrapper_box;
+ GtkPaned *paned;
+ GtkBox *right_pane;
GtkBox *outer_box;
GtkBox *content_box;
GtkSearchEntry *search_entry;
GtkWidget *header_bar;
GtkBox *category_bar;
+ GtkWidget *sidebar_toggle;
GtkWidget *kaomoji_scroll;
GPtrArray *category_widgets;
GtkWidget *bottom_spacer;
@@ -30,9 +33,16 @@ struct _MoeMojiWindow {
GtkEntry *category_name_entry;
GtkWidget *entry_text_view;
GtkWidget *category_save_button;
+ GtkWidget *category_error_label;
char *selected_category_dir;
gulong scroll_handler_id;
gulong page_size_handler_id;
+ char *ctx_cat_path;
+ char *ctx_cat_name;
+ char *ctx_emote_path;
+ char *ctx_emote_text;
+ GtkBox *pinned_box;
+ AdwToastOverlay *toast_overlay;
};
G_BEGIN_DECLS
diff --git a/src/moemoji-window.ui b/src/moemoji-window.ui
index e7cbd64..8e4510f 100644
--- a/src/moemoji-window.ui
+++ b/src/moemoji-window.ui
@@ -2,55 +2,80 @@
- 680
- 400
+ 800
+ 500
True
MoeMoji
-
-
+
-
+
diff --git a/src/style.css b/src/style.css
index f0b68ad..04cedff 100644
--- a/src/style.css
+++ b/src/style.css
@@ -6,7 +6,11 @@
.kaomoji-button label {
text-align: left;
- text-shadow: -1px -1px 2px rgba(102, 34, 74, 0.8), 1px -1px 0 rgba(102, 34, 74, 0.8), -1px 1px 0 rgba(102, 34, 74, 0.8), 1px 1px 0 rgba(102, 34, 74, 0.8);
+ text-shadow:
+ -1px -1px 0 rgba(0, 0, 0, 0.6),
+ 1px -1px 0 rgba(0, 0, 0, 0.6),
+ -1px 1px 0 rgba(0, 0, 0, 0.6),
+ 1px 1px 0 rgba(0, 0, 0, 0.6);
}
.kaomoji-wide {
@@ -46,9 +50,9 @@
}
.category-bar {
- background-color: rgba(0, 0, 0, 0.4);
- border-radius: 14px;
- padding: 8px;
+ border-radius: 0;
+ padding: 4px;
+ min-width: 140px;
}
.chip-active {
@@ -79,34 +83,34 @@
caret-color: white;
}
-.manage-emote {
- border: 1px solid rgba(255, 255, 255, 0.3);
- border-radius: 8px;
- padding: 6px 10px;
+.context-menu-popover contents {
+ padding: 4px;
}
-.manage-delete {
- min-width: 20px;
- min-height: 20px;
- padding: 2px;
- font-size: 10px;
- background-color: @destructive_bg_color;
- color: @destructive_fg_color;
+.error-label {
+ color: #ff6b6b;
+ font-size: 12px;
}
-.manage-cat-rename {
- min-width: 24px;
- min-height: 24px;
- padding: 2px;
- background-color: #c8a600;
- color: white;
+.context-active {
+ background-color: rgba(255, 255, 255, 0.15);
+ border-radius: 6px;
}
-.manage-cat-delete {
- min-width: 24px;
- min-height: 24px;
- padding: 2px;
- background-color: @destructive_bg_color;
- color: @destructive_fg_color;
+.chip-drop-line {
+ background-color: rgba(0, 0, 0, 0.6);
+ border-radius: 1px;
+}
+
+.pinned-header {
+ font-size: 11px;
+ font-weight: bold;
+ padding: 4px 8px 2px 8px;
+ opacity: 0.7;
+}
+
+.pinned-section {
+ margin-top: 4px;
+ border-top: 1px solid rgba(255, 255, 255, 0.15);
}
diff --git a/tests/test-moemoji.c b/tests/test-moemoji.c
index a57745a..915871d 100644
--- a/tests/test-moemoji.c
+++ b/tests/test-moemoji.c
@@ -266,8 +266,6 @@ static void test_window_stack_pages_exist(void) {
gtk_stack_get_child_by_name(test_self->view_stack, "pick-category"));
g_assert_nonnull(
gtk_stack_get_child_by_name(test_self->view_stack, "add-entry"));
- g_assert_nonnull(
- gtk_stack_get_child_by_name(test_self->view_stack, "manage"));
window_test_teardown();
}
@@ -499,29 +497,90 @@ static void test_category_name_validation(void) {
window_test_teardown();
}
-static void test_manage_search_entry(void) {
+static void test_toast_overlay_exists(void) {
window_test_setup();
- GtkWidget *page =
- gtk_stack_get_child_by_name(test_self->view_stack, "manage");
- g_assert_nonnull(page);
- GtkWidget *search = g_object_get_data(G_OBJECT(page), "manage-search");
- g_assert_nonnull(search);
- g_assert_true(GTK_IS_SEARCH_ENTRY(search));
+ g_assert_nonnull(test_self->toast_overlay);
+ g_assert_true(ADW_IS_TOAST_OVERLAY(test_self->toast_overlay));
window_test_teardown();
}
-static void test_manage_populated(void) {
+static void test_chip_ellipsize(void) {
window_test_setup();
- g_action_group_activate_action(G_ACTION_GROUP(test_self), "manage", NULL);
- GtkWidget *page =
- gtk_stack_get_child_by_name(test_self->view_stack, "manage");
- GtkWidget *content = g_object_get_data(G_OBJECT(page), "manage-content");
- g_assert_nonnull(content);
- g_assert_nonnull(gtk_widget_get_first_child(content));
+ for (guint i = 0; i < test_self->category_widgets->len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
+ GtkWidget *label = gtk_button_get_child(GTK_BUTTON(cw->chip));
+ g_assert_cmpint(gtk_label_get_ellipsize(GTK_LABEL(label)), ==,
+ PANGO_ELLIPSIZE_END);
+ }
window_test_teardown();
}
-static void test_manage_dupe_name_blocked(void) {
+static void test_chip_drop_separators(void) {
+ window_test_setup();
+ guint len = test_self->category_widgets->len;
+ for (guint i = 0; i < len; i++) {
+ CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
+ g_assert_nonnull(g_object_get_data(G_OBJECT(cw->chip), "drop-sep-before"));
+ if (i == len - 1)
+ g_assert_nonnull(g_object_get_data(G_OBJECT(cw->chip), "drop-sep-after"));
+ }
+ window_test_teardown();
+}
+
+static void test_sidebar_toggle_icon(void) {
+ window_test_setup();
+ const char *icon =
+ gtk_button_get_icon_name(GTK_BUTTON(test_self->sidebar_toggle));
+ g_assert_cmpstr(icon, ==, "pan-start-symbolic");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(test_self->sidebar_toggle),
+ FALSE);
+ icon = gtk_button_get_icon_name(GTK_BUTTON(test_self->sidebar_toggle));
+ g_assert_cmpstr(icon, ==, "pan-end-symbolic");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(test_self->sidebar_toggle),
+ TRUE);
+ icon = gtk_button_get_icon_name(GTK_BUTTON(test_self->sidebar_toggle));
+ g_assert_cmpstr(icon, ==, "pan-start-symbolic");
+ window_test_teardown();
+}
+
+static gboolean settings_has_pinned(GSettings *settings, const char *text) {
+ g_auto(GStrv) pinned = g_settings_get_strv(settings, "pinned-kaomojis");
+ for (guint i = 0; pinned[i]; i++) {
+ if (g_strcmp0(pinned[i], text) == 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void test_delete_unpins_emote(void) {
+ window_test_setup();
+
+ const char *pin[] = {"(^_^)", "other", NULL};
+ g_settings_set_strv(test_self->settings, "pinned-kaomojis", pin);
+ g_assert_true(settings_has_pinned(test_self->settings, "(^_^)"));
+
+ const char *text = "(^_^)";
+ g_auto(GStrv) pinned =
+ g_settings_get_strv(test_self->settings, "pinned-kaomojis");
+ GPtrArray *arr = g_ptr_array_new();
+ for (guint i = 0; pinned[i]; i++) {
+ if (g_strcmp0(pinned[i], text) != 0)
+ g_ptr_array_add(arr, pinned[i]);
+ }
+ g_ptr_array_add(arr, NULL);
+ g_settings_set_strv(test_self->settings, "pinned-kaomojis",
+ (const char *const *)arr->pdata);
+ g_ptr_array_free(arr, TRUE);
+
+ g_assert_false(settings_has_pinned(test_self->settings, "(^_^)"));
+ g_assert_true(settings_has_pinned(test_self->settings, "other"));
+
+ const char *empty[] = {NULL};
+ g_settings_set_strv(test_self->settings, "pinned-kaomojis", empty);
+ window_test_teardown();
+}
+
+static void test_dupe_name_blocked(void) {
window_test_setup();
g_assert_cmpuint(test_self->category_widgets->len, >, 0);
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, 0);
@@ -580,10 +639,12 @@ int main(int argc, char *argv[]) {
test_export_creates_archive);
g_test_add_func("/window/import-extracts-and-loads",
test_import_extracts_and_loads);
- g_test_add_func("/window/manage-search-entry", test_manage_search_entry);
- g_test_add_func("/window/manage-populated", test_manage_populated);
- g_test_add_func("/window/manage-dupe-name-blocked",
- test_manage_dupe_name_blocked);
+ g_test_add_func("/window/dupe-name-blocked", test_dupe_name_blocked);
+ g_test_add_func("/window/toast-overlay-exists", test_toast_overlay_exists);
+ g_test_add_func("/window/chip-ellipsize", test_chip_ellipsize);
+ g_test_add_func("/window/chip-drop-separators", test_chip_drop_separators);
+ g_test_add_func("/window/sidebar-toggle-icon", test_sidebar_toggle_icon);
+ g_test_add_func("/window/delete-unpins-emote", test_delete_unpins_emote);
}
return g_test_run();