Skip to content

Commit 9b5b1aa

Browse files
committed
Add main folder mode for in-place file organization
- Add new `main_folder` mode to organize files directly in target folder - New workflow treats output as main source with optional import folders - Add reindex behavior to reorganize files into continuous sequence - Add QStackedWidget for separate merge and main folder UI pages - Update all 13 locale files with new UI strings - Bump version to 1.0.4
1 parent e03fabf commit 9b5b1aa

18 files changed

Lines changed: 1982 additions & 1258 deletions

MainApp.py

Lines changed: 1632 additions & 1230 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ chmod +x ImageMerge-linux-x64.AppImage
7373

7474
### macOS
7575

76+
```bash
77+
brew tap TamKungZ/tap
78+
brew install --cask imagemerge
79+
```
80+
7681
- App bundle zip: `ImageMerge-macos-app-arm64.zip` or `ImageMerge-macos-app-x64.zip`
7782
- Binary zip: `ImageMerge-macos-binary-arm64.zip` or `ImageMerge-macos-binary-x64.zip`
7883
- Homebrew cask publishing workflow is configured (`imagemerge`)

Releases.md

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,32 @@
1+
Tag: v1.0.4
2+
Release title: v1.0.4 - Main Folder Mode + In-Place Reindex
3+
Release notes:
4+
## ImageMerge v1.0.4
5+
6+
Update focused on adding a workflow for organizing files directly inside the target folder.
7+
8+
### Highlights
9+
- Added new **Main folder mode** (`main_folder`) for in-place organization on the output folder
10+
- Main folder mode now treats the output folder as the primary source and can merge additional input folders into it
11+
- Improved reindex behavior so filenames are reorganized into a continuous sequence after processing
12+
- Existing files already named by ImageMerge pattern (for example `0001.png`) are preserved in ordering logic
13+
- New/mixed filename patterns are still handled by existing sort logic and merged into final sequence
14+
- CLI now supports `--mode main_folder`, and this mode can run without `--input`
15+
- Added UI and localization labels/descriptions for the new mode (EN/TH)
16+
17+
### License
18+
This project remains open-source under the **MIT License**.
19+
20+
21+
### What's New (Microsoft Store Update)
22+
- Added a dedicated **Main Folder page** to separate organizer workflow from merge workflow
23+
- Added optional **Import folders** section inside Main Folder page for selecting extra folders to merge in
24+
- Organizer now processes in this order: organize existing files in main folder first, then merge imports, then re-index final output
25+
- Expanded localization coverage for the new UI keys across all supported languages
26+
- Updated UI theme and button contrast for clearer visibility in grayscale styling
27+
28+
---
29+
130
Tag: v1.0.3
231
Release title: v1.0.3 - Multi-Channel Packaging + Store Automation
332
Release notes:
@@ -93,30 +122,30 @@ Tag: v1.0.0
93122
Release title: v1.0.0 - PySide6 UI + Nuitka Cross-Platform Build
94123
Release notes:
95124
## ImageMerge v1.0.0
96-
97-
Major update focused on UI modernization, packaging reliability, and release automation.
98-
99-
### Highlights
100-
- Migrated desktop UI to **PySide6**
101-
- Switched build system to **Nuitka**
102-
- Added native build support for:
103-
- **Windows** (PE `.exe`)
104-
- **Linux** (ELF binary)
105-
- **macOS** (Mach-O binary + `.app`)
106-
- Embedded translation system with in-app language selector (EN/TH)
107-
- Embedded app fonts at runtime
108-
- Added executable metadata support via `app_metadata.json`
109-
- Added GitHub Actions workflows:
110-
- Build test on every push
111-
- Auto-build + upload release assets on tag
112-
113-
### Build / Packaging Notes
114-
- Default CI build mode is `standalone` for reliability
115-
- Onefile mode can be enabled via environment variable when needed
116-
- Windows code signing is supported by providing PFX configuration in environment variables
117-
118-
### License
119-
This project is open-source under the **MIT License**.
120-
121-
### Checksums
125+
126+
Major update focused on UI modernization, packaging reliability, and release automation.
127+
128+
### Highlights
129+
- Migrated desktop UI to **PySide6**
130+
- Switched build system to **Nuitka**
131+
- Added native build support for:
132+
- **Windows** (PE `.exe`)
133+
- **Linux** (ELF binary)
134+
- **macOS** (Mach-O binary + `.app`)
135+
- Embedded translation system with in-app language selector (EN/TH)
136+
- Embedded app fonts at runtime
137+
- Added executable metadata support via `app_metadata.json`
138+
- Added GitHub Actions workflows:
139+
- Build test on every push
140+
- Auto-build + upload release assets on tag
141+
142+
### Build / Packaging Notes
143+
- Default CI build mode is `standalone` for reliability
144+
- Onefile mode can be enabled via environment variable when needed
145+
- Windows code signing is supported by providing PFX configuration in environment variables
146+
147+
### License
148+
This project is open-source under the **MIT License**.
149+
150+
### Checksums
122151
Release asset checksums can be added in a follow-up update for verification.

app_metadata.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
"company_name": "TamKungZ_",
44
"product_name": "ImageMerge",
55
"file_description": "Open-source image and video merge tool",
6-
"file_version": "1.0.3.0",
7-
"product_version": "1.0.3.0",
6+
"file_version": "1.0.4.0",
7+
"product_version": "1.0.4.0",
88
"copyright": "Copyright (c) 2026 TamKungZ_ (MIT License)",
99
"icon_ico": "assets/icon.ico",
1010
"icon_icns": "assets/icon.icns",

assets/imagemerge-icon-71.png

8.81 KB
Loading

embedded_locales.py

Lines changed: 144 additions & 0 deletions
Large diffs are not rendered by default.

locales/ar.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"section_input": "مجلدات الإدخال + البادئة",
99
"section_output": "مجلد الإخراج",
1010
"section_mode": "الوضع",
11+
"page_mode_merge": "صفحة الدمج",
12+
"page_mode_main_folder": "صفحة المجلد الرئيسي",
1113
"section_options": "الخيارات",
1214
"section_log": "السجل",
1315
"btn_add_folder": "إضافة مجلد",
@@ -22,12 +24,22 @@
2224
"mode_copy_keep": "نسخ فقط (الاحتفاظ بالملفات المصدر)",
2325
"mode_copy_delete": "نسخ ثم حذف الملفات المصدر",
2426
"mode_move": "نقل الملفات من الإدخال إلى الإخراج",
27+
"mode_main_folder": "وضع المجلد الرئيسي (تنظيم داخل نفس المجلد)",
2528
"mode_desc_copy_keep": "الاحتفاظ بالأصول في أمان",
2629
"mode_desc_copy_delete": "نسخ ثم حذف المصادر",
2730
"mode_desc_move": "لا يُحفظ أي نسخة",
31+
"mode_desc_main_folder": "استخدام مجلد الإخراج كمجلد رئيسي، وإعادة ترقيم الملفات الحالية ودمج الملفات الجديدة",
2832
"opt_clear_output": "مسح الوسائط الموجودة في الإخراج قبل البدء",
2933
"mode_note": "ملاحظات: يتم تخطي الملفات المكررة عند تطابق هاش الملف والامتداد. الأسماء مثل IMG_0072 تُرتَّب حسب الرقم أولاً. الأسماء من نوع UUID أو الهاش الطويل تُرتَّب حسب وقت الإنشاء.",
34+
"main_page_title": "منظّم المجلد الرئيسي",
35+
"main_page_desc": "استخدم هذه الصفحة عندما تريد تنظيم الملفات مباشرة داخل مجلد هدف واحد دون خلط إعدادات وضع الدمج.",
36+
"main_page_target": "المجلد الرئيسي",
37+
"main_page_import_section": "مجلدات اختيارية للاستيراد",
38+
"main_page_sources_hint": "قائمة الاستيراد: سيتم دمج {count} مجلد(ات) في المجلد الرئيسي.",
39+
"main_page_no_sources_hint": "لم يتم اختيار مجلدات للاستيراد. سيتم فقط تنظيم الوسائط الموجودة مسبقاً في المجلد الرئيسي.",
40+
"main_page_note": "ترتيب التنفيذ: تنظيم الملفات الموجودة في المجلد الرئيسي أولاً، ثم دمج المجلدات المحددة، ثم إعادة الترقيم النهائي للملفات.",
3041
"empty_no_source": "لم يتم إضافة مجلدات مصدر بعد",
42+
"empty_no_main_source": "لم يتم اختيار مجلدات للاستيراد",
3143
"status_processing": "جارٍ المعالجة...",
3244
"stat_added": "مُضاف",
3345
"stat_skipped": "مُتخطَّى",

locales/de.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"section_input": "Eingabeordner + Präfix",
99
"section_output": "Ausgabeordner",
1010
"section_mode": "Modus",
11+
"page_mode_merge": "Zusammenführen-Seite",
12+
"page_mode_main_folder": "Hauptordner-Seite",
1113
"section_options": "Optionen",
1214
"section_log": "Protokoll",
1315
"btn_add_folder": "Ordner hinzufügen",
@@ -22,12 +24,22 @@
2224
"mode_copy_keep": "Nur kopieren (Quelldateien behalten)",
2325
"mode_copy_delete": "Kopieren und Quelldateien löschen",
2426
"mode_move": "Dateien von Eingabe nach Ausgabe verschieben",
27+
"mode_main_folder": "Hauptordner-Modus (direkt im Ordner organisieren)",
2528
"mode_desc_copy_keep": "Originale sicher aufbewahren",
2629
"mode_desc_copy_delete": "Kopieren und dann Quellen löschen",
2730
"mode_desc_move": "Keine Kopie behalten",
31+
"mode_desc_main_folder": "Ausgabe als Hauptordner verwenden, bestehende Dateien neu indizieren und neue Dateien einfügen",
2832
"opt_clear_output": "Vorhandene Medien im Ausgabeordner vor dem Start löschen",
2933
"mode_note": "Hinweis: Doppelte Dateien werden übersprungen, wenn Hash und Erweiterung übereinstimmen. Namen wie IMG_0072 werden zuerst nach Nummer sortiert. UUID-artige und lange Hash-Namen werden nach Erstellungszeit sortiert.",
34+
"main_page_title": "Hauptordner-Organizer",
35+
"main_page_desc": "Diese Seite verwenden, wenn Dateien direkt in einem Zielordner organisiert werden sollen, ohne die Merge-Einstellungen zu mischen.",
36+
"main_page_target": "Hauptordner",
37+
"main_page_import_section": "Optionale Importordner",
38+
"main_page_sources_hint": "Importliste: {count} Ordner werden in den Hauptordner zusammengeführt.",
39+
"main_page_no_sources_hint": "Keine Importordner ausgewählt. Es werden nur Medien organisiert, die bereits im Hauptordner liegen.",
40+
"main_page_note": "Ablauf: Erst Dateien im Hauptordner organisieren, dann ausgewählte Importordner zusammenführen, anschließend finale Neuindizierung.",
3041
"empty_no_source": "Noch keine Quellordner hinzugefügt",
42+
"empty_no_main_source": "Keine Importordner ausgewählt",
3143
"status_processing": "Verarbeitung läuft...",
3244
"stat_added": "Hinzugefügt",
3345
"stat_skipped": "Übersprungen",

locales/en.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"section_input": "Input folders + prefix",
99
"section_output": "Output folder",
1010
"section_mode": "Mode",
11+
"page_mode_merge": "Merge page",
12+
"page_mode_main_folder": "Main folder page",
1113
"section_options": "Options",
1214
"section_log": "Log",
1315
"btn_add_folder": "Add folder",
@@ -22,12 +24,22 @@
2224
"mode_copy_keep": "Copy only (keep source files)",
2325
"mode_copy_delete": "Copy then delete source files",
2426
"mode_move": "Move files from input to output",
27+
"mode_main_folder": "Main folder mode (organize in place)",
2528
"mode_desc_copy_keep": "Keep originals safe",
2629
"mode_desc_copy_delete": "Copy then remove sources",
2730
"mode_desc_move": "No copy kept",
31+
"mode_desc_main_folder": "Use output as main folder, re-index existing files, and merge new files in",
2832
"opt_clear_output": "Clear existing media in output before starting",
2933
"mode_note": "Notes: Duplicate files are skipped when both file hash and extension match. Names like IMG_0072 are sorted by number first. UUID-like and long-hash names are sorted by creation time.",
34+
"main_page_title": "Main Folder Organizer",
35+
"main_page_desc": "Use this page when you want to organize files directly in one target folder without mixing with merge mode settings.",
36+
"main_page_target": "Main folder",
37+
"main_page_import_section": "Optional folders to import",
38+
"main_page_sources_hint": "Import list: {count} folder(s) will be merged into the main folder.",
39+
"main_page_no_sources_hint": "No import folders selected. This will only organize media already in the main folder.",
40+
"main_page_note": "Process order: organize files already in main folder first, then merge selected import folders, then re-index final output.",
3041
"empty_no_source": "No source folders added yet",
42+
"empty_no_main_source": "No import folders selected",
3143
"status_processing": "Processing...",
3244
"stat_added": "Added",
3345
"stat_skipped": "Skipped",

locales/es.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"section_input": "Carpetas de entrada + prefijo",
99
"section_output": "Carpeta de salida",
1010
"section_mode": "Modo",
11+
"page_mode_merge": "Página de fusión",
12+
"page_mode_main_folder": "Página de carpeta principal",
1113
"section_options": "Opciones",
1214
"section_log": "Registro",
1315
"btn_add_folder": "Agregar carpeta",
@@ -22,12 +24,22 @@
2224
"mode_copy_keep": "Solo copiar (conservar archivos fuente)",
2325
"mode_copy_delete": "Copiar y luego eliminar archivos fuente",
2426
"mode_move": "Mover archivos de entrada a salida",
27+
"mode_main_folder": "Modo carpeta principal (organizar en el mismo lugar)",
2528
"mode_desc_copy_keep": "Mantener originales seguros",
2629
"mode_desc_copy_delete": "Copiar y luego eliminar fuentes",
2730
"mode_desc_move": "Sin copia guardada",
31+
"mode_desc_main_folder": "Usar la salida como carpeta principal, reindexar archivos existentes y agregar archivos nuevos",
2832
"opt_clear_output": "Borrar medios existentes en la salida antes de iniciar",
2933
"mode_note": "Notas: Los archivos duplicados se omiten cuando coinciden el hash y la extensión. Los nombres como IMG_0072 se ordenan primero por número. Los nombres tipo UUID o hash largo se ordenan por fecha de creación.",
34+
"main_page_title": "Organizador de carpeta principal",
35+
"main_page_desc": "Usa esta página cuando quieras organizar archivos directamente en una sola carpeta objetivo sin mezclar ajustes del modo de fusión.",
36+
"main_page_target": "Carpeta principal",
37+
"main_page_import_section": "Carpetas opcionales para importar",
38+
"main_page_sources_hint": "Lista de importación: se fusionarán {count} carpeta(s) en la carpeta principal.",
39+
"main_page_no_sources_hint": "No hay carpetas de importación seleccionadas. Solo se organizarán los medios que ya están en la carpeta principal.",
40+
"main_page_note": "Orden del proceso: primero organizar los archivos de la carpeta principal, luego fusionar las carpetas seleccionadas y finalmente reindexar la salida.",
3041
"empty_no_source": "Aún no se han agregado carpetas fuente",
42+
"empty_no_main_source": "No hay carpetas de importación seleccionadas",
3143
"status_processing": "Procesando...",
3244
"stat_added": "Agregado",
3345
"stat_skipped": "Omitido",

0 commit comments

Comments
 (0)