From 015bb675d6eb177900c8ac94a6d35edc5ad90576 Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Wed, 9 May 2018 00:11:35 +0200 Subject: 9.9 --- Changelog.txt | 14 + .../Build/Help/html/daylight-saving-time.html | 11 +- FreeFileSync/Build/Languages/arabic.lng | 227 +++--- FreeFileSync/Build/Languages/bulgarian.lng | 243 +++--- FreeFileSync/Build/Languages/chinese_simple.lng | 259 +++---- .../Build/Languages/chinese_traditional.lng | 223 +++--- FreeFileSync/Build/Languages/croatian.lng | 217 +++--- FreeFileSync/Build/Languages/czech.lng | 223 +++--- FreeFileSync/Build/Languages/danish.lng | 219 +++--- FreeFileSync/Build/Languages/dutch.lng | 221 +++--- FreeFileSync/Build/Languages/english_uk.lng | 217 +++--- FreeFileSync/Build/Languages/finnish.lng | 215 +++--- FreeFileSync/Build/Languages/french.lng | 237 +++--- FreeFileSync/Build/Languages/german.lng | 59 +- FreeFileSync/Build/Languages/greek.lng | 217 +++--- FreeFileSync/Build/Languages/hebrew.lng | 213 +++--- FreeFileSync/Build/Languages/hindi.lng | 307 ++++---- FreeFileSync/Build/Languages/hungarian.lng | 217 +++--- FreeFileSync/Build/Languages/italian.lng | 217 +++--- FreeFileSync/Build/Languages/japanese.lng | 227 +++--- FreeFileSync/Build/Languages/korean.lng | 209 +++--- FreeFileSync/Build/Languages/lithuanian.lng | 221 +++--- FreeFileSync/Build/Languages/norwegian.lng | 217 +++--- FreeFileSync/Build/Languages/polish.lng | 218 +++--- FreeFileSync/Build/Languages/portuguese.lng | 213 +++--- FreeFileSync/Build/Languages/portuguese_br.lng | 227 +++--- FreeFileSync/Build/Languages/romanian.lng | 223 +++--- FreeFileSync/Build/Languages/russian.lng | 221 +++--- FreeFileSync/Build/Languages/slovak.lng | 219 +++--- FreeFileSync/Build/Languages/slovenian.lng | 153 ++-- FreeFileSync/Build/Languages/spanish.lng | 219 +++--- FreeFileSync/Build/Languages/swedish.lng | 213 +++--- FreeFileSync/Build/Languages/turkish.lng | 255 ++++--- FreeFileSync/Build/Languages/ukrainian.lng | 221 +++--- FreeFileSync/Build/Resources.zip | Bin 317363 -> 318587 bytes .../Source/RealTimeSync/folder_selector2.cpp | 7 +- FreeFileSync/Source/RealTimeSync/gui_generated.cpp | 24 +- FreeFileSync/Source/RealTimeSync/gui_generated.h | 2 +- FreeFileSync/Source/RealTimeSync/main_dlg.cpp | 150 ++-- FreeFileSync/Source/RealTimeSync/main_dlg.h | 7 +- FreeFileSync/Source/RealTimeSync/xml_proc.cpp | 10 +- FreeFileSync/Source/algorithm.cpp | 8 +- FreeFileSync/Source/application.cpp | 24 +- FreeFileSync/Source/comparison.cpp | 28 +- FreeFileSync/Source/file_hierarchy.cpp | 42 ++ FreeFileSync/Source/file_hierarchy.h | 7 +- FreeFileSync/Source/fs/abstract.h | 10 +- FreeFileSync/Source/fs/native.cpp | 2 +- FreeFileSync/Source/lib/binary.cpp | 1 + FreeFileSync/Source/lib/dir_exist_async.h | 3 +- FreeFileSync/Source/lib/error_log.h | 2 +- FreeFileSync/Source/lib/hard_filter.cpp | 2 +- FreeFileSync/Source/lib/hard_filter.h | 2 +- FreeFileSync/Source/lib/icon_buffer.cpp | 120 ++- FreeFileSync/Source/lib/icon_holder.h | 51 -- FreeFileSync/Source/lib/icon_loader.h | 12 +- FreeFileSync/Source/lib/localization.cpp | 21 +- FreeFileSync/Source/lib/parallel_scan.cpp | 195 ++--- FreeFileSync/Source/lib/parse_lng.h | 4 +- FreeFileSync/Source/lib/perf_check.cpp | 4 +- FreeFileSync/Source/lib/process_xml.cpp | 147 ++-- FreeFileSync/Source/lib/process_xml.h | 2 - FreeFileSync/Source/lib/soft_filter.h | 2 +- FreeFileSync/Source/lib/versioning.cpp | 3 +- FreeFileSync/Source/structures.cpp | 204 ++--- FreeFileSync/Source/structures.h | 85 ++- FreeFileSync/Source/synchronization.cpp | 8 +- FreeFileSync/Source/ui/batch_config.cpp | 11 +- FreeFileSync/Source/ui/batch_status_handler.cpp | 4 +- FreeFileSync/Source/ui/cfg_grid.cpp | 32 +- FreeFileSync/Source/ui/cfg_grid.h | 6 +- FreeFileSync/Source/ui/command_box.cpp | 3 +- FreeFileSync/Source/ui/file_grid.cpp | 99 +-- FreeFileSync/Source/ui/file_grid_attr.h | 10 +- FreeFileSync/Source/ui/file_view.cpp | 2 +- FreeFileSync/Source/ui/folder_history_box.cpp | 3 +- FreeFileSync/Source/ui/folder_pair.h | 77 +- FreeFileSync/Source/ui/folder_selector.cpp | 7 +- FreeFileSync/Source/ui/gui_generated.cpp | 832 +++++++++++---------- FreeFileSync/Source/ui/gui_generated.h | 151 ++-- FreeFileSync/Source/ui/gui_status_handler.cpp | 6 +- FreeFileSync/Source/ui/main_dlg.cpp | 522 +++++++------ FreeFileSync/Source/ui/main_dlg.h | 4 +- FreeFileSync/Source/ui/progress_indicator.cpp | 167 +++-- FreeFileSync/Source/ui/progress_indicator.h | 3 +- FreeFileSync/Source/ui/small_dlgs.cpp | 136 ++-- FreeFileSync/Source/ui/sync_cfg.cpp | 295 ++++---- FreeFileSync/Source/ui/sync_cfg.h | 34 +- FreeFileSync/Source/ui/tray_icon.cpp | 20 +- FreeFileSync/Source/ui/tray_icon.h | 2 +- FreeFileSync/Source/ui/tree_grid.cpp | 139 ++-- FreeFileSync/Source/ui/tree_grid.h | 23 +- FreeFileSync/Source/ui/tree_grid_attr.h | 12 +- FreeFileSync/Source/ui/triple_splitter.cpp | 53 +- FreeFileSync/Source/ui/triple_splitter.h | 3 +- FreeFileSync/Source/ui/version_check_impl.h | 2 +- FreeFileSync/Source/version/version.h | 2 +- wx+/bitmap_button.h | 3 +- wx+/choice_enum.h | 2 - wx+/dc.h | 21 + wx+/font_size.h | 1 + wx+/graph.cpp | 72 +- wx+/graph.h | 56 +- wx+/grid.cpp | 82 +- wx+/grid.h | 8 +- wx+/image_holder.h | 52 ++ wx+/image_resources.cpp | 258 ++++++- wx+/image_resources.h | 2 +- wx+/image_tools.cpp | 2 +- wx+/popup_dlg.cpp | 23 +- wx+/popup_dlg_generated.cpp | 5 +- wx+/popup_dlg_generated.h | 4 +- wx+/std_button_layout.h | 9 +- wx+/tooltip.cpp | 22 +- wx+/zlib_wrap.cpp | 4 +- zen/format_unit.cpp | 21 +- zen/format_unit.h | 26 +- zen/globals.h | 18 +- zen/guid.h | 2 +- zen/optional.h | 16 +- zen/perf.h | 7 + zen/process_priority.cpp | 2 + zen/scope_guard.h | 4 + zen/sys_error.h | 6 +- zen/thread.h | 13 +- zen/time.h | 6 +- zen/zstring.h | 1 + zenXml/zenxml/bind.h | 6 +- zenXml/zenxml/dom.h | 4 +- zenXml/zenxml/parser.h | 2 +- 130 files changed, 6033 insertions(+), 5588 deletions(-) delete mode 100755 FreeFileSync/Source/lib/icon_holder.h mode change 100644 => 100755 FreeFileSync/Source/ui/version_check_impl.h create mode 100755 wx+/image_holder.h diff --git a/Changelog.txt b/Changelog.txt index b5f6d52c..47476388 100755 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,17 @@ +FreeFileSync 9.9 [2018-03-09] +----------------------------- +High DPI display support +Allow automatic retry at configuration level +Show error handling settings during sync +Avoid libpng.so dependency (Linux) +Fixed undefined behavior closing paused progress dialog +Check if buggy DLLs are loaded into address space (Windows) +Fixed FTP parsing error for Windows CE device +Workaround VSS provider implementation bug +Respect macOS user settings for date and thousands separator +Updated translation files + + FreeFileSync 9.8 [2018-02-06] ----------------------------- New option to auto-close progress dialog diff --git a/FreeFileSync/Build/Help/html/daylight-saving-time.html b/FreeFileSync/Build/Help/html/daylight-saving-time.html index 148275e4..c627b45f 100755 --- a/FreeFileSync/Build/Help/html/daylight-saving-time.html +++ b/FreeFileSync/Build/Help/html/daylight-saving-time.html @@ -12,15 +12,16 @@

A common problem synchronization software has to handle is +-1 hour file time shifts after a Daylight Saving Time (DST) switch has - occurred. This can be observed, for example, when a FAT-formatted - volume is compared against an NTFS volume, like when synchronizing a local disk against a - USB memory stick. Files that previously appeared to be in sync are + occurred. This can be observed, for example, when a FAT32- or exFAT-formatted + volume (in the following called "FAT") is compared against an NTFS volume, + like when synchronizing a USB memory stick against a local disk. + Files that previously appeared to be in sync are now shown with a one hour modification time offset, although they have not been modified by the user or the operating system.

- The reason for this behavior lies in the way NTFS and FAT drives + The reason for this behavior lies in the way NTFS and FAT store file times: NTFS stores time in UTC format, while FAT uses local time.

@@ -36,7 +37,7 @@

For a detailed discussion about this issue see:
- http://www.codeproject.com/KB/datetime/dstbugs.aspx + https://www.codeproject.com/Articles/1144/Beating-the-Daylight-Savings-Time-bug

diff --git a/FreeFileSync/Build/Languages/arabic.lng b/FreeFileSync/Build/Languages/arabic.lng index db7feb3a..f77e5105 100755 --- a/FreeFileSync/Build/Languages/arabic.lng +++ b/FreeFileSync/Build/Languages/arabic.lng @@ -64,6 +64,9 @@ Syntax error خطأ في البنية +A left and a right directory path are expected after %x. + + Cannot find file %x. لا يمكن العثور على المجلد %x. @@ -115,6 +118,16 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. إذا تم تجاهل هذا الخطأ سيتم اعتبار المجلدات فارغة. يتم إنشاء المجلدات المفقودة تلقائيا عند الحاجة. +Comparison finished: + + + +1 item found +%x items found + + + + File %x has an invalid date. يحتوي الملف %x تاريخ غير صالح. @@ -175,9 +188,6 @@ Using non-default global settings: استخدام إعدادات عامة غير افتراضية: -Starting comparison -بدأ عملية المقارنة - A folder input field is empty. حقل إدخال خاص بمجلد فارغ. @@ -318,15 +328,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. تعذر نقل %x إلى سلة المحذوفات. +Cannot find %x. +لا يمكن العثور على %x. + Cannot open file %x. تعذر فتح الملف %x. Cannot find device %x. لا يمكن العثور على الجهاز %x. -Cannot find %x. -لا يمكن العثور على %x. - Type of item %x is not supported: نوع العنصر %x غير مدعوم: @@ -444,6 +454,9 @@ Actual: %y bytes Lock owner: صاحب القفل: +Detecting abandoned lock... +اكتشاف قفل مهمل... + 1 sec %x sec @@ -457,9 +470,6 @@ Actual: %y bytes %x ثانية -Detecting abandoned lock... -اكتشاف قفل مهمل... - Items processed: معالجة العناصر: @@ -472,8 +482,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. حدث خطأ أثناء تحليل الملف %x، الصف %y، و العمود %z. -Cannot set directory lock for %x. -تعذر إنشاء قفل للمسار %x. +Cannot set directory locks for the following folders: + 1 thread @@ -518,9 +528,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. اسم وحدة التخزين %x ليس جزءاُ من اسم الملف %y. -Stop requested: Waiting for current operation to finish... -طلب إحباط المهمة: في انتظار انتهاء المهمة الحالية... - Unable to create time stamp for versioning: تعذر إنشاء بصمة زمنية من أجل المفاضلة الزمنية: @@ -533,6 +540,9 @@ Actual: %y bytes Select a folder تحديد مجلد +&New +&جديد + &Open... &فتح... @@ -748,26 +758,23 @@ The command is triggered if: job name اسم المهمة -Show summary -إظهار الملخص - -Sleep -سكون +System: Sleep + -Shut down -إيقاف التشغيل +System: Shut down + -Synchronization stopped -توقفت عملية المزامنة +Cleaning up old log files... +جاري تنظيف ملفات المتابعة القديمة... Stopped توقف -Synchronization completed with errors -انتهاء عملية المزامنة مع وجود أخطء +Completed with errors + -Synchronization completed with warnings -انتهاء عملية المزامنة مع وجود تحذيرات +Completed with warnings + Warning تحذير @@ -775,15 +782,12 @@ The command is triggered if: Nothing to synchronize لا يوجد شيء للمزامنة -Synchronization completed successfully -تمت المزامنة بنجاح +Completed successfully + Executing command %x تنفيذ الأمر %x -Cleaning up old log files... -جاري تنظيف ملفات المتابعة القديمة... - You can switch to FreeFileSync's main window to resolve this issue. بإمكانك العودة إلى نافذة FreeFileSync الرئيسية لحل هذه المشكلة. @@ -799,18 +803,8 @@ The command is triggered if: Switching to FreeFileSync's main window العودة إلى نافذة FreeFileSync الرئيسية - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -إعادة المحاولة بعد 0 ثانية... -إعادة المحاولة بعد 1 ثانية واحدة... -إعادة المحاولة بعد 2 ثانيتين... -إعادة المحاولة بعد %x ثواني... -إعادة المحاولة بعد %x ثانية... -إعادة المحاولة بعد %x ثانية... - +Automatic retry + Ignore &all تجاهل &الكل @@ -821,6 +815,31 @@ The command is triggered if: Serious Error خطأ فادح +Last session +مصدر الجلسة + +Today +اليوم + + +1 day +%x days + + +0 يوم +1 يوم واحد +2 يومان +%x أيام +%x يوماً +%x يوم + + +Name +الاسم + +Last sync + + Folder المجلد @@ -884,9 +903,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. الرجاء تحديد مجلد على نظام الملفات المحلي، الشبكة أو جهاز MTP. -&New -&جديد - &Save &حفظ @@ -998,6 +1014,9 @@ The command is triggered if: Total bytes to copy إجمالي عدد الـ bytes التي سيتم نسخها +Arrange folder pair +ترتيب زوج المجلدات + Folder pair: زوج المجلدات: @@ -1090,11 +1109,14 @@ The command is triggered if: Naming convention: اصطلاح التسمية: -&Ignore errors -&تجاهل الأخطاء +Ignore errors + -Show pop-up on errors or warnings -إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات +Retry count: +تعداد محاولات الإعادة: + +Delay (in seconds): +التأخير (بالثواني): Run a command after synchronization: تشغيل أمر بعد المزامنة: @@ -1102,9 +1124,6 @@ The command is triggered if: OK موافق -Arrange folder pair -ترتيب زوج المجلدات - Enter your login details: أدخل تفاصيل تسجيل الدخول: @@ -1201,12 +1220,12 @@ The command is triggered if: Minimize to notification area تصغير إلى منطقة التنبيهات -Bytes copied: -Bytes المنسوخة: - When finished: عند الانتهاء: +Auto-close + + Close إغلاق @@ -1219,12 +1238,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x إنشاء ملف دفعي من أجل عمليات المزامنة غير المحضورة. للبدأ, انقر نقراً مزدوجاً على الملف أو المهمة المجدولة في منظم المهام: %x +Progress dialog: + + Run minimized تشغيل بوضع التصغير &Show error dialog &إظهار نافذة الأخطاء +Show pop-up on errors or warnings +إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات + &Cancel &إلغاء @@ -1273,14 +1298,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. نقل أذونات الملفات و المجلدات. -Automatic retry on error: -إعادة المحاولة بشكل تلقائي عند حصول خطأ: - -Retry count: -تعداد محاولات الإعادة: +Show hidden dialogs again +إظهار التنبهات و نوافذ الحوار المخفية -Delay (in seconds): -التأخير (بالثواني): +Show all permanently hidden dialogs and warning messages again +إعادة إظهار جميع التنبهات و نوافذ الحوار التي تم إخفاؤها Customize context menu: تخصيص القائمة المحلية: @@ -1288,12 +1310,6 @@ This guarantees a consistent state even in case of a serious error. Description الوصف -Show hidden dialogs again -إظهار التنبهات و نوافذ الحوار المخفية - -Show all permanently hidden dialogs and warning messages again -إعادة إظهار جميع التنبهات و نوافذ الحوار التي تم إخفاؤها - &Default الا&فتراضي @@ -1348,14 +1364,23 @@ This guarantees a consistent state even in case of a serious error. Activate offline تنشيط دون اتصال +Highlight configurations that have not been run for more than the following number of days: + + +Synchronization Settings +إعدادات المزامنة + +Access Online Storage + + Save as a Batch Job حفظ كمهمة دفعية Delete Items حذف العناصر -Copy items -نسخ العناصر +Copy Items + Options خيارات @@ -1366,6 +1391,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations + + &Options &خيارات @@ -1505,9 +1533,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... حدد المجال الزمني... -Last session -مصدر الجلسة - Folder Comparison and Synchronization مقارنة و مزامنة المجلد @@ -1526,8 +1551,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &لا تحفظ -Remove entry from list -إزالة المدخلة من القائمة +Hide configuration + + +Highlight... + Clear filter إزالة الفلاتر الحالية @@ -1607,6 +1635,9 @@ This guarantees a consistent state even in case of a serious error. Paused تم الإيقاف مؤقتاً +Stop requested... + + Initializing... التجهيز للبدأ... @@ -1616,9 +1647,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... مقارنة المحتوى... -Completed -انتهت العملية - Info معلومات @@ -1712,12 +1740,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side معلمات الجانب المعاكس -Show hidden dialogs and warning messages again? -إظهار التنبيهات و نوافذ الحوار المخفية مرة ثانية؟ - -&Show -&إظهار - Downloading update... جار تحميل التحديث... @@ -1742,18 +1764,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. تحديد قواعد المزامنة الخاصة بك. -Synchronization Settings -إعدادات المزامنة - Comparison المقارنة Synchronization المزامنة -Today -اليوم - This week هذا الأسبوع @@ -1823,9 +1839,6 @@ This guarantees a consistent state even in case of a serious error. Files ملفات -Name -الاسم - Percentage النسبة المئوية @@ -1945,19 +1958,6 @@ This guarantees a consistent state even in case of a serious error. %x ساعة - -1 day -%x days - - -0 يوم -1 يوم واحد -2 يومان -%x أيام -%x يوماً -%x يوم - - Cannot set privilege %x. لا يمكن تعيين امتيازات %x. @@ -2021,8 +2021,11 @@ This guarantees a consistent state even in case of a serious error. Desktop سطح المكتب -Start menu -قائمة إبدأ +Start Menu + + +Send To + Registering FreeFileSync file extensions جار تسجيل امتدادات الملفات لـ FreeFileSync @@ -2051,6 +2054,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. الرجاء اختيار نوع التثبيت المحلي أو اختيار مجلد آخر للتثبيت. -The silent installation mode is only available in the FreeFileSync Donation Edition. -وضع التثبيت الصامت متوفر فقط في FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. + diff --git a/FreeFileSync/Build/Languages/bulgarian.lng b/FreeFileSync/Build/Languages/bulgarian.lng index 2f34bbf0..4d30763f 100755 --- a/FreeFileSync/Build/Languages/bulgarian.lng +++ b/FreeFileSync/Build/Languages/bulgarian.lng @@ -7,11 +7,8 @@ n == 1 ? 0 : 1 -Cannot set directory locks for the following folders: - - Both sides have changed since last synchronization. -Двете страни са променени след последната синхронизация. +Двете страни променени след последната синхронизация. Cannot determine sync-direction: Не може да определи посоката на синхронизация: @@ -121,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Ако тази грешка се игнорира, папките се считат празни. Липсващи папки се създават автоматично при нужда. +Comparison finished: +Сравняването завърши: + + +1 item found +%x items found + + +1 елемент намерен +%x елемента намерени + + File %x has an invalid date. Файл %x има невалидна дата. @@ -181,9 +190,6 @@ Using non-default global settings: Използва нестандартни глобални настройки: -Starting comparison -Започва сравняване - A folder input field is empty. Полето за въведена папка е празно. @@ -324,15 +330,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. Не може да премести %x в кошчето. +Cannot find %x. +Не е намерен %x. + Cannot open file %x. Не може да отвори файл %x. Cannot find device %x. Не е намерено устройство %x. -Cannot find %x. -Не е намерен %x. - Type of item %x is not supported: Типа на елемент %x не се поддържа: @@ -438,6 +444,9 @@ Actual: %y bytes Lock owner: Притежател на заключването: +Detecting abandoned lock... +Открива изоставено заключване... + 1 sec %x sec @@ -447,9 +456,6 @@ Actual: %y bytes %x сек. -Detecting abandoned lock... -Открива изоставено заключване... - Items processed: Обработени елементи: @@ -462,6 +468,9 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. Грешка при анализ на файл %x, ред %y, колона %z. +Cannot set directory locks for the following folders: +Не може да заключи директориите за следните папки: + 1 thread %x threads @@ -484,7 +493,7 @@ Actual: %y bytes Покажи в Експлорера Open with default application -Отвори с подразбираното приложение +Отвори с приложение по подразбиране Browse directory Преглед на директорията @@ -501,9 +510,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. Името на тома %x не е част от пътя до файла %y. -Stop requested: Waiting for current operation to finish... -Заявка за стоп: изчаква завършване на текущата операция... - Unable to create time stamp for versioning: Не може да отбележи времето на версификация: @@ -516,6 +522,9 @@ Actual: %y bytes Select a folder Изберете папка +&New +&Нов + &Open... &Отвори... @@ -731,26 +740,23 @@ The command is triggered if: job name име на задачата -Show summary -Покажи резюме - -Sleep -Заспиване +System: Sleep +Система: Заспиване -Shut down -Изключване +System: Shut down +Система: Изключване -Synchronization stopped -Синхронизацията е спряна +Cleaning up old log files... +Изчиства старите протоколни файлове... Stopped Спряно -Synchronization completed with errors -Синхронизацията завърши с грешки +Completed with errors +Завърши с грешки -Synchronization completed with warnings -Синхронизацията завърши с предупреждения +Completed with warnings +Завърши с предупреждения Warning Предупреждение @@ -758,17 +764,14 @@ The command is triggered if: Nothing to synchronize Няма нищо за синхронизиране -Synchronization completed successfully -Синхронизацията завърши успешно +Completed successfully +Завърши успешно Executing command %x Изпълнява команда %x -Cleaning up old log files... -Изчиства старите log-файлове... - You can switch to FreeFileSync's main window to resolve this issue. -За решение на този проблем идете на главното меню на FreeFileSync. +За да решите този проблем идете в главното меню на FreeFileSync. &Don't show this warning again &Не показвай вече това предупреждение @@ -780,16 +783,10 @@ The command is triggered if: &Превключи Switching to FreeFileSync's main window -Иди на главното меню на FreeFileSync +Иди в главното меню на FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Автоматично повтаряне след 1 сек... -Автоматично повтаряне след %x сек... - +Automatic retry +Автоматично повтаряне Ignore &all Игнорирай &всички @@ -884,9 +881,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. Моля, изберете папка от локална файлова система, мрежа или MTP-устройство. -&New -&Нов - &Save &Запази @@ -921,7 +915,7 @@ The command is triggered if: &Намери... &Export file list... -&Експортирай файловия списък... +&Експортирай списъка с файлове... &Reset layout &Инициализирай изгледа @@ -930,10 +924,10 @@ The command is triggered if: &Инструменти &Check for updates now -&Провери за обновления веднага +&Провери за обновления сега Check &automatically once a week -Автоматично веднъж &седмично +Провери автоматично &ежеседмично Cancel Отказ @@ -951,7 +945,7 @@ The command is triggered if: Отнеми двойка папки Access online storage -Достъп до онлайн съхранение +Достъп до онлайн-запазване Swap sides Размени страните @@ -963,7 +957,7 @@ The command is triggered if: Търси: Match case -Точно съвпадение +Големи/малки букви New Нова @@ -998,6 +992,9 @@ The command is triggered if: Total bytes to copy Общо байтове за копиране +Arrange folder pair +Подреди двойката папки + Folder pair: Двойка папки: @@ -1062,7 +1059,7 @@ The command is triggered if: И&зчисти Detect moved files -Откриване на преместени файлове +Открий преместени файлове - Not supported by all file systems @@ -1076,7 +1073,7 @@ The command is triggered if: Delete files: -Изтриване на файлове: +Изтрий файлове: &Recycle bin &Кошче @@ -1090,11 +1087,14 @@ The command is triggered if: Naming convention: Конвенция за именуване: -&Ignore errors -&Игнорирай грешките +Ignore errors +Игнорирай грешките -Show pop-up on errors or warnings -Питай при грешки или предупреждения +Retry count: +Брой повторения: + +Delay (in seconds): +Задръжка (сек.): Run a command after synchronization: След синхронизация изпълни команда: @@ -1102,9 +1102,6 @@ The command is triggered if: OK ОК -Arrange folder pair -Подреди двойката папки - Enter your login details: Въведете входните си данни: @@ -1151,16 +1148,16 @@ The command is triggered if: Директория на сървъра: Performance improvements: -Подобряване на работата: +Подобряване на производителността: How to get best performance? -Как да се получи най-добра работа? +Как да се получи най-добра производителност? Connections for directory reading: Връзки за четене на папка: SFTP channels per connection: -SFTP-канали за една връзка: +SFTP-канали на връзка: Detect server limit Открий лимита на сървъра @@ -1172,7 +1169,7 @@ The command is triggered if: Изберете папка Start synchronization now? -Синхронизирай веднага? +Синхронизирай сега? Variant: Вариант: @@ -1201,11 +1198,11 @@ The command is triggered if: Minimize to notification area Минимизирай в известяващото поле -Bytes copied: -Копирани байтове: - When finished: -При завършване: +След завършване: + +Auto-close +Затвори автоматично Close Затвори @@ -1219,12 +1216,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Създай пакетен файл за автоматична синхронизация. За старт двукратно щракнете върху този файл или задайте планова задача: %x +Progress dialog: +Диалог за прогреса: + Run minimized -Изпълни в минимизиран вид +Изпълни минимизирано &Show error dialog &Покажи диалог за грешките +Show pop-up on errors or warnings +Питай при грешки или предупреждения + &Cancel &Отказ @@ -1241,7 +1244,7 @@ The command is triggered if: Ограничи максималния брой протоколни файлове How can I schedule a batch job? -Как да се планира пакетна задача? +Как да планирам пакетна задача? &Keep relative paths &Запази относителните пътища @@ -1258,7 +1261,7 @@ This guarantees a consistent state even in case of a serious error. Копирай във временен файл (*.ffs_tmp) преди презапис на целевия файл. -Това гарантира цялостност на файла дори в случай на сериозна грешка. +Това гарантира цялостност на файла и в случай на сериозна грешка. recommended @@ -1273,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. Прехвърли правата за достъп на файла и папката. -Automatic retry on error: -Автоматично повтаряне при грешка: - -Retry count: -Брой повторения: +Show hidden dialogs again +Покажи скритите диалози отново -Delay (in seconds): -Задръжка (сек.): +Show all permanently hidden dialogs and warning messages again +Покажи всички постоянно скрити диалози и предупреждения отново Customize context menu: Настрой контекстното меню: @@ -1288,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error. Description Описание -Show hidden dialogs again -Покажи скритите диалози отново - -Show all permanently hidden dialogs and warning messages again -Покажи всички постоянно скрити диалози и предупреждения отново - &Default &По подразбиране @@ -1304,7 +1298,7 @@ This guarantees a consistent state even in case of a serious error. Ако харесвате FreeFileSync: Support with a donation -Подкрепа с дарение +Подкрепете с дарение Donation details Подробности за дарение @@ -1325,10 +1319,10 @@ This guarantees a consistent state even in case of a serious error. Публикува се по лиценза GNU General Public License Many thanks for localization: -Благодарности за локализацията: +Благодарност за локализацията: Activate the FreeFileSync Donation Edition by one of the following methods: -Активирайте FreeFileSync-Дарителско-Издание по един от следните методи: +Активирайте дарителско издание на FreeFileSync по един от следните методи: 1. Activate via internet now: 1. Активиране по Интернет: @@ -1337,7 +1331,7 @@ This guarantees a consistent state even in case of a serious error. Активирайте онлайн 2. Retrieve an offline activation key from the following URL: -2. Вземете офлайн-активационен-код от следния адрес: +2. Вземете активационен код за офлайн от следния адрес: &Copy to clipboard &Копирайте в клипборда @@ -1351,26 +1345,32 @@ This guarantees a consistent state even in case of a serious error. Highlight configurations that have not been run for more than the following number of days: Маркирай конфигурациите, които не са изпълнявани в течение на повече от следния брой дни: +Synchronization Settings +Настройки на Синхронизация + +Access Online Storage +Достъп до Онлайн-Запазване + Save as a Batch Job -Запази като пакетна задача +Запази като Пакетна Задача Delete Items -Изтрий елементите +Изтрий Елементите -Copy items -Копирай елементите +Copy Items +Копирай Елементите Options Опции Select Time Span -Избор на времеви интервал +Избор на Интервал Време FreeFileSync Donation Edition -FreeFileSync-Дарителско-Издание +FreeFileSync Дарителско Издание Highlight Configurations -Маркирай конфигурациите +Маркирай Конфигурациите &Options &Опции @@ -1597,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error. Paused Пауза +Stop requested... +Заявка за стоп... + Initializing... Инициализация... @@ -1606,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... Сравнява съдържанието на файлове... -Completed -Готово - Info Информация @@ -1690,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side Параметри за срещуположната страна -Show hidden dialogs and warning messages again? -Да покажа ли скритите диалози и предупреждения отново? - -&Show -&Покажи - Downloading update... Сваляне на актуализация... @@ -1720,9 +1714,6 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. Създаване на собствени правила за синхронизация. -Synchronization Settings -Настройки за синхронизация - Comparison Сравняване @@ -1772,7 +1763,7 @@ This guarantees a consistent state even in case of a serious error. Добави времето към името на всеки файл On completion: -При завършване: +След завършване: On errors: При грешки: @@ -1814,16 +1805,16 @@ This guarantees a consistent state even in case of a serious error. Проверка за нова версия на програмата Auto-update now or download manually from the FreeFileSync home page? -Автоматично актуализиране веднага или ръчно сваляне от домашната страница на FreeFileSync? +Автоматично актуализиране сега или ръчно сваляне от домашната страница на FreeFileSync? &Auto-update -&Автоматично актуализиране +&Автоматично &Home page &Домашна страница Download now? -Свали веднага? +Свали сега? &Download &Сваляне @@ -1844,19 +1835,19 @@ This guarantees a consistent state even in case of a serious error. Инсталацията е регистрирана на различна операционна система. Failed to activate FreeFileSync Donation Edition. -Не може да активира FreeFileSync-Дарителско-Издание. +Неуспешно активиране на FreeFileSync Дарителско Издание. Incorrect activation key. -Неверен активационен код. +Невалиден активиращ код. Unable to register to receive system messages. -Невъзможна регистрация за получаване на системни съобщения. +Не се регистрира за получаване на системни съобщения. Cannot find system function %x. -Не е намерена системната функция %x. +Не намира системната функция %x. Unable to register device notifications for %x. -Не се регистрират съобщенията на устройство %x. +Не регистрира съобщенията на устройство %x. Cannot monitor directory %x. Не може да следи директория %x. @@ -1972,11 +1963,11 @@ This guarantees a consistent state even in case of a serious error. Desktop На десктопа -Start menu -В стартовото меню +Start Menu +Стартово Меню Send To -Изпрати до +Изпрати До Registering FreeFileSync file extensions Регистриране на файлови разширения за FreeFileSync @@ -1985,16 +1976,16 @@ This guarantees a consistent state even in case of a serious error. Де-регистриране на файлови разширения за FreeFileSync FreeFileSync Configuration -Конфигуриране на FreeFileSync +Конфигурация на FreeFileSync FreeFileSync Batch File -Пакетен файл на FreeFileSync +Пакетен Файл на FreeFileSync FreeFileSync Synchronization Database -Синхронизираща база данни на FreeFileSync +Синхронизираща База Данни на FreeFileSync RealTimeSync Configuration -Конфигуриране на RealTimeSync +Конфигурация на RealTimeSync Edit with FreeFileSync Редактиране с FreeFileSync @@ -2006,5 +1997,5 @@ This guarantees a consistent state even in case of a serious error. Моля, изберете локален тип инсталация или пък друга папка за инсталация. The %x installation option is only available in the FreeFileSync Donation Edition. -Опцията %x инсталиране е възможна само за FreeFileSync-ДарителскоИздание. +Опцията %x инсталиране е възможна само за FreeFileSync Дарителско Издание. diff --git a/FreeFileSync/Build/Languages/chinese_simple.lng b/FreeFileSync/Build/Languages/chinese_simple.lng index 4cf6efb4..03a647de 100755 --- a/FreeFileSync/Build/Languages/chinese_simple.lng +++ b/FreeFileSync/Build/Languages/chinese_simple.lng @@ -20,7 +20,7 @@ 考虑到当前设置,数据库入口不同步. Setting default synchronization directions: Old files will be overwritten with newer files. -设置默认的同步方向:旧文件会被新文件覆盖. +设置默认的同步方向: 旧文件会被新文件覆盖. Creating file %x 正在创建文件 %x @@ -64,6 +64,9 @@ Syntax error 语法错误 +A left and a right directory path are expected after %x. +在 %x 之后预期的是一个左边 和一个右边的目录路径. + Cannot find file %x. 无法找到文件 %x. @@ -77,7 +80,7 @@ 左边和右边指定了数量不相等的目录. The config file must not contain settings at directory pair level when directories are set via command line. -当目录通过命令行设定时配置文件必须不包含目录对级别的设置. +当目录通过命令行设定时, 配置文件必须不包含目录对级别的设置. Directories cannot be set for more than one configuration file. 无法为多于一个配置文件设置目录. @@ -107,13 +110,24 @@ 打开已选定的配置文件仅进行编辑而不执行. Path to an alternate GlobalSettings.xml file. -指向一个替代的GlobalSettings.xml文件的路径. +指向一个替代的 GlobalSettings.xml 文件的路径. Cannot find the following folders: 无法找到如下文件夹: If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. -如果这个错误被忽略文件夹将被认为是空的. 当有必要时丢失的文件夹将会被创建. +如果这个错误被忽略, 文件夹将被认为是空的. 当有必要时丢失的 文件夹将会被创建. + +Comparison finished: +比较已完成: + + +1 item found +%x items found + + +找到 %x 个项目 + File %x has an invalid date. 文件 %x 的日期非法. @@ -128,7 +142,7 @@ 大小: Content comparison was skipped for excluded files. -对于已排除的文件跳过内容比对. +对于已排除的文件跳过内容比较. Items differ in attributes only 项目仅是文件属性不同 @@ -175,9 +189,6 @@ Using non-default global settings: 使用非默认全局设置: -Starting comparison -正在开始比较 - A folder input field is empty. 有一个文件夹输入框为空. @@ -188,7 +199,7 @@ 排除: One base folder of a folder pair is contained in the other one. -文件夹对中的一个基础文件夹被另一个所包含. +文件夹对中的一个基础文件夹 被另一个所包含. The folder should be excluded from synchronization via filter. 此文件夹须使用过滤器从同步中排除. @@ -271,7 +282,7 @@ Actual: %y bytes 无法写入 %x 的权限. Operation not supported for different base folder types. -对于不同基础文件夹类型此操作不被支持. +对于不同基础文件夹类型 此操作不被支持. Cannot write file %x. 无法写入文件 %x . @@ -318,15 +329,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. 无法将 %x 移动到回收站. +Cannot find %x. +无法找到 %x. + Cannot open file %x. 无法打开文件 %x. Cannot find device %x. 无法找到设备 %x. -Cannot find %x. -无法找到 %x. - Type of item %x is not supported: 项目 %x 的类型不被支持: @@ -406,7 +417,7 @@ Actual: %y bytes 数据库文件已损坏: The database files do not yet contain information about the last synchronization. -此数据库文件并未包含有关最后同步的信息. +此数据库文件并未包含 有关最后同步的信息. Loading file %x... 正在加载文件 %x... @@ -429,6 +440,9 @@ Actual: %y bytes Lock owner: 锁定的所有者: +Detecting abandoned lock... +正在检测被遗弃的锁定... + 1 sec %x sec @@ -437,9 +451,6 @@ Actual: %y bytes %x 秒 -Detecting abandoned lock... -正在检测被遗弃的锁定... - Items processed: 已处理的项目: @@ -452,8 +463,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. 当分析文件 %x , 行 %y, 列 %z 时出错. -Cannot set directory lock for %x. -无法为 %x 设置目录锁定. +Cannot set directory locks for the following folders: +无法为如下文件夹设置 目录锁定: 1 thread @@ -485,7 +496,7 @@ Actual: %y bytes 无法访问卷影复制服务. Please run the 64-bit version of FreeFileSync to create shadow copies on this system. -请运行FreeFileSync的64位版本来在此系统上创建卷影. +请运行 FreeFileSync 的64位版本来在此系统上创建卷影. Cannot determine volume name for %x. 无法为 %x 确定卷名. @@ -493,9 +504,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. 卷名 %x 不是文件路径 %y 的一部分. -Stop requested: Waiting for current operation to finish... -停止请求: 等待当前操作完成... - Unable to create time stamp for versioning: 无法为历史版本创建时间戳: @@ -508,6 +516,9 @@ Actual: %y bytes Select a folder 选择一个文件夹 +&New +新建(&N) + &Open... 打开(&O)... @@ -560,7 +571,7 @@ Actual: %y bytes 空闲时间(秒): Idle time between last detected change and execution of command -最后检测到改变和命令执行之间的空闲时间 +最后检测到改变和 命令执行之间的空闲时间 Command line: 命令行: @@ -688,7 +699,7 @@ The command is triggered if: 如下项目有无法解决的冲突并将不会被同步: The following folders are significantly different. Please check that the correct folders are selected for synchronization. -如下的文件夹有显著不同. 请检查是否选择了正确的文件夹来进行同步. +如下的文件夹有显著不同. 请检查是否选择了正确 的文件夹来进行同步. Not enough free disk space available in: 没有足够的可用磁盘空间: @@ -697,10 +708,10 @@ The command is triggered if: 可用: Some files will be synchronized as part of multiple base folders. -某些文件将作为多个基础文件夹的一部分被同步. +某些文件将作为多个基础文件夹 的一部分被同步. To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -为了避免冲突, 请设置排除过滤器, 以便每个已更新的文件仅被一个基础文件夹所考虑. +为了避免冲突, 请设置排除过滤器, 以便每个已更新的文件 仅被一个基础文件夹所考虑. Versioning folder: 历史版本文件夹: @@ -709,7 +720,7 @@ The command is triggered if: 基础文件夹: The versioning folder is contained in a base folder. -历史版本文件夹被包含在一个基础文件夹中. +历史版本文件夹被包含 在一个基础文件夹中. Synchronizing folder pair: 正在同步成对的文件夹: @@ -723,26 +734,23 @@ The command is triggered if: job name 作业名称 -Show summary -显示摘要 - -Sleep -休眠 +System: Sleep +系统: 休眠 -Shut down -关机 +System: Shut down +系统: 关机 -Synchronization stopped -同步已停止 +Cleaning up old log files... +正在清理旧日志文件... Stopped 已停止 -Synchronization completed with errors -同步已完成但有错误 +Completed with errors +已完成但有错误 -Synchronization completed with warnings -同步已完成但有警告 +Completed with warnings +已完成但有警告 Warning 警告 @@ -750,15 +758,12 @@ The command is triggered if: Nothing to synchronize 没有什么可同步 -Synchronization completed successfully -同步成功完成 +Completed successfully +成功完成 Executing command %x 正在执行命令 %x -Cleaning up old log files... -正在清理旧日志文件... - You can switch to FreeFileSync's main window to resolve this issue. 你可以切换至 FreeFileSync 的主窗口来解决这个问题. @@ -774,13 +779,8 @@ The command is triggered if: Switching to FreeFileSync's main window 切换至 FreeFileSync 的主窗口 - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -在 %x 秒后自动重试... - +Automatic retry +自动重试 Ignore &all 忽略所有(&A) @@ -791,6 +791,26 @@ The command is triggered if: Serious Error 严重错误 +Last session +最后会话 + +Today +今天 + + +1 day +%x days + + +%x 天 + + +Name +文件名 + +Last sync +最后同步 + Folder 文件夹 @@ -854,9 +874,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. 请选择在本地文件系统, 网络或MTP设备上的文件夹. -&New -新建(&N) - &Save 保存(&S) @@ -968,6 +985,9 @@ The command is triggered if: Total bytes to copy 要复制的总字节数 +Arrange folder pair +排列文件夹对 + Folder pair: 文件夹对: @@ -1026,7 +1046,7 @@ The command is triggered if: 最大: Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair. -选择过滤器规则以将某些文件从同步中排除. 输入与相应的文件夹对相关的文件路径. +选择过滤器规则以将某些文件 从同步中排除. 输入与相应的文件夹对相关的 文件路径. C&lear 清除(&L) @@ -1060,11 +1080,14 @@ The command is triggered if: Naming convention: 命名规则: -&Ignore errors -忽略错误(&I) +Ignore errors +忽略错误 -Show pop-up on errors or warnings -在错误或警告时显示弹出对话框 +Retry count: +重试计数: + +Delay (in seconds): +延时 (秒): Run a command after synchronization: 同步之后运行一个命令: @@ -1072,9 +1095,6 @@ The command is triggered if: OK 确定 -Arrange folder pair -排列文件夹对 - Enter your login details: 输入你的登录详细资料: @@ -1171,12 +1191,12 @@ The command is triggered if: Minimize to notification area 最小化到系统托盘 -Bytes copied: -字节被复制: - When finished: 当完成时: +Auto-close +自动关闭 + Close 关闭 @@ -1189,12 +1209,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x 创建一个用于无人值守同步的批处理文件. 要开始, 双击这个文件或任务计划器中的计划调度: %x +Progress dialog: +进度对话框: + Run minimized 以最小化运行 &Show error dialog 显示错误对话框(&S) +Show pop-up on errors or warnings +在错误或警告时显示弹出对话框 + &Cancel 取消(&C) @@ -1226,7 +1252,7 @@ The command is triggered if: Copy to a temporary file (*.ffs_tmp) before overwriting target. This guarantees a consistent state even in case of a serious error. -在覆盖目标之前先复制到临时文件(*.ffs_tmp). 这样即使在发生严重错误的情况下也可以保证有一致的状态. +在覆盖目标之前先复制到临时文件(*.ffs_tmp). 这样即使在发生严重错误的情况下, 也可以保证有一致的状态. recommended 推荐 @@ -1240,14 +1266,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. 传输文件及文件夹的权限. -Automatic retry on error: -在出错时自动重试: - -Retry count: -重试计数: +Show hidden dialogs again +重新显示被隐藏的对话框 -Delay (in seconds): -延时 (秒): +Show all permanently hidden dialogs and warning messages again +重新显示所有被永久性隐藏的 对话框和警告信息 Customize context menu: 自定义右键菜单: @@ -1255,12 +1278,6 @@ This guarantees a consistent state even in case of a serious error. Description 描述 -Show hidden dialogs again -重新显示被隐藏的对话框 - -Show all permanently hidden dialogs and warning messages again -重新显示所有被永久性隐藏的对话框和警告信息 - &Default 默认(&D) @@ -1295,7 +1312,7 @@ This guarantees a consistent state even in case of a serious error. 非常感谢以下本地化翻译者: Activate the FreeFileSync Donation Edition by one of the following methods: -激活FreeFileSync捐赠版可用如下方式之一: +激活 FreeFileSync 捐赠版可用如下方式之一: 1. Activate via internet now: 1. 现在就通过互联网激活: @@ -1315,13 +1332,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline 离线激活 +Highlight configurations that have not been run for more than the following number of days: +突出显示那些超过如下天数 未运行的配置文件: + +Synchronization Settings +同步设置 + +Access Online Storage +访问在线存储 + Save as a Batch Job 保存为批处理作业 Delete Items 删除项目 -Copy items +Copy Items 复制项目 Options @@ -1333,6 +1359,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync捐赠版 +Highlight Configurations +突出显示配置文件 + &Options 选项(&O) @@ -1452,9 +1481,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... 选择时间跨度... -Last session -最后会话 - Folder Comparison and Synchronization 文件夹比较与同步 @@ -1473,8 +1499,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 不保存(&N) -Remove entry from list -从列表中移除此项 +Hide configuration +隐藏配置文件 + +Highlight... +突出显示... Clear filter 清除过滤器 @@ -1554,6 +1583,9 @@ This guarantees a consistent state even in case of a serious error. Paused 已暂停 +Stop requested... +已请求停止... + Initializing... 正在初始化... @@ -1563,9 +1595,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... 正在比较文件内容... -Completed -完成 - Info 信息 @@ -1644,12 +1673,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side 用于对侧的参数 -Show hidden dialogs and warning messages again? -是否要重新显示被隐藏的对话框和警告信息? - -&Show -显示(&S) - Downloading update... 正在下载更新... @@ -1666,7 +1689,7 @@ This guarantees a consistent state even in case of a serious error. 识别和传播两侧的变化. 删除, 移动和冲突会使用一个数据库来自动检测. Create a mirror backup of the left folder by adapting the right folder to match. -以适配右侧文件夹来匹配从而创建左侧文件夹的镜像备份. +以适配右侧文件夹来匹配, 从而创建左侧文件夹的镜像备份. Copy new and updated files to the right folder. 复制新的和已更新的文件到右侧文件夹. @@ -1674,18 +1697,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. 配置你自己的同步规则. -Synchronization Settings -同步设置 - Comparison 比较 Synchronization 同步 -Today -今天 - This week 本周 @@ -1755,9 +1772,6 @@ This guarantees a consistent state even in case of a serious error. Files 文件 -Name -文件名 - Percentage 百分比 @@ -1792,7 +1806,7 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync 已是最新. Cannot find current FreeFileSync version number online. A newer version is likely available. Check manually now? -无法在线找到当前FreeFileSync的版本号. 可能有新版本可用. 是否现在手动检测? +无法在线找到当前 FreeFileSync 的版本号. 可能有新版本可用. 是否现在手动检测? &Check 检查(&C) @@ -1867,14 +1881,6 @@ This guarantees a consistent state even in case of a serious error. %x 小时 - -1 day -%x days - - -%x 天 - - Cannot set privilege %x. 无法设置 %x 的特权. @@ -1938,9 +1944,12 @@ This guarantees a consistent state even in case of a serious error. Desktop 桌面 -Start menu +Start Menu 开始菜单 +Send To +发送到 + Registering FreeFileSync file extensions 注册 FreeFileSync 文件关联 @@ -1951,23 +1960,23 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync 配置 FreeFileSync Batch File -FreeFileSync批处理文件 +FreeFileSync 批处理文件 FreeFileSync Synchronization Database -FreeFileSync同步数据库 +FreeFileSync 同步数据库 RealTimeSync Configuration -RealTimeSync配置 +RealTimeSync 配置 Edit with FreeFileSync -使用FreeFileSync编辑 +使用 FreeFileSync 编辑 The FreeFileSync portable version cannot install into a subfolder of %x. -FreeFileSync便携版无法安装到 %x 的一个子目录. +FreeFileSync 便携版无法安装到 %x 的一个子目录. Please choose the local installation type or select a different folder for installation. -请选择本地安装类型或选择用于安装的不同文件夹. +请选择本地安装类型, 或选择用于安装的不同文件夹. -The silent installation mode is only available in the FreeFileSync Donation Edition. -静默安装模式仅在FreeFileSync捐赠版上有效. +The %x installation option is only available in the FreeFileSync Donation Edition. +安装选项 %x 只在 FreeFileSync 捐赠版有效. diff --git a/FreeFileSync/Build/Languages/chinese_traditional.lng b/FreeFileSync/Build/Languages/chinese_traditional.lng index ea48a8b1..defe3748 100755 --- a/FreeFileSync/Build/Languages/chinese_traditional.lng +++ b/FreeFileSync/Build/Languages/chinese_traditional.lng @@ -64,6 +64,9 @@ Syntax error 語法錯誤 +A left and a right directory path are expected after %x. +%x 之後應該有一個左邊和右邊目錄路徑。 + Cannot find file %x. 找不到檔案 %x。 @@ -115,6 +118,17 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. 如果忽略此錯誤的資料夾將視為空的。在需要時會自動建立缺少的資料夾。 +Comparison finished: +比對完成: + + +1 item found +%x items found + + +找到 %x 個項目。 + + File %x has an invalid date. 檔案 %x 的日期無效。 @@ -175,9 +189,6 @@ Using non-default global settings: 使用非預設全域設定: -Starting comparison -開始比對 - A folder input field is empty. 資料夾輸入欄位是空白。 @@ -318,15 +329,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. 無法將 %x 移動到資源回收筒。 +Cannot find %x. +找不到 %x。 + Cannot open file %x. 無法開啟檔案 %x。 Cannot find device %x. 找不到裝置 %x。 -Cannot find %x. -找不到 %x。 - Type of item %x is not supported: 項目類型 %x 不被支援: @@ -429,6 +440,9 @@ Actual: %y bytes Lock owner: 鎖定擁有者: +Detecting abandoned lock... +正在檢測被遺棄的鎖定… + 1 sec %x sec @@ -437,9 +451,6 @@ Actual: %y bytes %x 秒 -Detecting abandoned lock... -正在檢測被遺棄的鎖定… - Items processed: 已處理項目: @@ -452,8 +463,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. 解析 %x 檔案,第 %y 列,第 %z 行出現錯誤。 -Cannot set directory lock for %x. -無法對 %x 設定目錄鎖。 +Cannot set directory locks for the following folders: +無法為以下資料夾設定目錄鎖定: 1 thread @@ -493,9 +504,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. 磁碟機名稱 %x 不是檔案路徑 %y 的一部分。 -Stop requested: Waiting for current operation to finish... -停止請求:等待目前的操作結束… - Unable to create time stamp for versioning: 無法建立時間戳記的版本控制: @@ -508,6 +516,9 @@ Actual: %y bytes Select a folder 選擇一個資料夾 +&New +新增(&N) + &Open... 開啟(&O)… @@ -723,26 +734,23 @@ The command is triggered if: job name 工作名稱 -Show summary -顯示摘要 - -Sleep -睡眠 +System: Sleep +系統:睡眠 -Shut down -關機 +System: Shut down +系統:關機 -Synchronization stopped -同步已停止 +Cleaning up old log files... +清理舊日誌檔… Stopped 已停止 -Synchronization completed with errors -同步完成,但是有錯誤 +Completed with errors +已完成但有錯誤 -Synchronization completed with warnings -同步完成,但是出現警告 +Completed with warnings +已完成但有警告 Warning 警告 @@ -750,15 +758,12 @@ The command is triggered if: Nothing to synchronize 沒有東西可以同步 -Synchronization completed successfully -同步順利完成 +Completed successfully +成功完成 Executing command %x 執行命令 %x -Cleaning up old log files... -清理舊日誌檔… - You can switch to FreeFileSync's main window to resolve this issue. 您可以切換到FreeFileSync的主視窗來解決此問題。 @@ -774,13 +779,8 @@ The command is triggered if: Switching to FreeFileSync's main window 切換到FreeFileSync的主視窗 - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -在 %x 秒自動重試… - +Automatic retry +自動重試 Ignore &all 全部忽略(&A) @@ -791,6 +791,26 @@ The command is triggered if: Serious Error 嚴重錯誤 +Last session +上次連線 + +Today +今日 + + +1 day +%x days + + +%x 天 + + +Name +名稱 + +Last sync +上次同步 + Folder 資料夾 @@ -854,9 +874,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. 請選擇一個本機檔案系統、網路或MTP裝置上的資料夾。 -&New -新增(&N) - &Save 儲存(&S) @@ -968,6 +985,9 @@ The command is triggered if: Total bytes to copy 要複製的總資料量 +Arrange folder pair +排列配對資料夾 + Folder pair: 配對資料夾: @@ -1060,11 +1080,14 @@ The command is triggered if: Naming convention: 命名慣例: -&Ignore errors -忽略錯誤(&I) +Ignore errors +忽略錯誤 -Show pop-up on errors or warnings -錯誤或警告時顯示彈出視窗 +Retry count: +重試次數: + +Delay (in seconds): +延遲(以秒為單位): Run a command after synchronization: 同步後執行一個命令: @@ -1072,9 +1095,6 @@ The command is triggered if: OK 確定 -Arrange folder pair -排列配對資料夾 - Enter your login details: 請輸入您的登入資訊: @@ -1171,12 +1191,12 @@ The command is triggered if: Minimize to notification area 最小化到通知區域 -Bytes copied: -已複製的位元組: - When finished: 完成後: +Auto-close +自動關閉 + Close 關閉 @@ -1187,7 +1207,10 @@ The command is triggered if: 停止 Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x -建立一個批次檔,用於無人值守同步。若要開始,在此檔案點兩下,或安排在任務規劃中:%x +建立一個批次檔,用於無人值守同步。若要開始,在此檔案點兩下, 或安排在任務規劃中:%x + +Progress dialog: +進度對話框: Run minimized 最小化執行 @@ -1195,6 +1218,9 @@ The command is triggered if: &Show error dialog 顯示錯誤對話框(&S) +Show pop-up on errors or warnings +錯誤或警告時顯示彈出視窗 + &Cancel 取消(&C) @@ -1243,14 +1269,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. 傳輸檔案和資料夾的權限。 -Automatic retry on error: -錯誤時自動重試: - -Retry count: -重試次數: +Show hidden dialogs again +再次顯示隱藏的對話框 -Delay (in seconds): -延遲(以秒為單位): +Show all permanently hidden dialogs and warning messages again +再次顯示所有永久 隱藏的對話框和警告訊息 Customize context menu: 自訂內容功能表: @@ -1258,12 +1281,6 @@ This guarantees a consistent state even in case of a serious error. Description 描述 -Show hidden dialogs again -再次顯示隱藏的對話框 - -Show all permanently hidden dialogs and warning messages again -再次顯示所有永久隱藏的對話框和警告訊息 - &Default 預設(&D) @@ -1318,13 +1335,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline 離線啟動 +Highlight configurations that have not been run for more than the following number of days: +突顯未執行超過以下天數的配置: + +Synchronization Settings +同步設定 + +Access Online Storage +存取線上儲存空間 + Save as a Batch Job 另存為批次工作 Delete Items 刪除項目 -Copy items +Copy Items 複製項目 Options @@ -1336,6 +1362,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync贊助版 +Highlight Configurations +突顯配置 + &Options 選項(&O) @@ -1414,7 +1443,7 @@ This guarantees a consistent state even in case of a serious error. 設定方向: multiple selection -多選 +複選 Include via filter: 透過篩選器包含: @@ -1455,9 +1484,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... 選擇時間間隔… -Last session -最後連線 - Folder Comparison and Synchronization 資料夾比對和同步 @@ -1476,8 +1502,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 不儲存(&N) -Remove entry from list -從列表移除項目 +Hide configuration +隱藏配置 + +Highlight... +突顯... Clear filter 清除篩選器 @@ -1534,7 +1563,7 @@ This guarantees a consistent state even in case of a serious error. 篩選器 All files are in sync -所有檔案都在同步 +所有檔案都同步 Cannot find %x 找不到 %x @@ -1557,6 +1586,9 @@ This guarantees a consistent state even in case of a serious error. Paused 已暫停 +Stop requested... +停止請求... + Initializing... 正在初始化… @@ -1566,9 +1598,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... 正在比對内容… -Completed -已完成 - Info 訊息 @@ -1585,7 +1614,7 @@ This guarantees a consistent state even in case of a serious error. 日誌 Thank you, %x, for your donation and support! -%x,感謝您的贊助與支持! +%x, 感謝您的贊助與支持! Recommended range: 建議範圍: @@ -1647,17 +1676,11 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side 另一邊的參數 -Show hidden dialogs and warning messages again? -再次顯示隱藏的對話框和警告訊息? - -&Show -顯示(&S) - Downloading update... 正在下載更新… Identify equal files by comparing modification time and size. -透過檔案修改時間和大小比對來判斷相同檔案。 +透過檔案修改時間和大小比對 來判斷相同檔案。 Identify equal files by comparing the file content. 透過檔案內容比對來判斷相同檔案。 @@ -1666,10 +1689,10 @@ This guarantees a consistent state even in case of a serious error. 透過檔案大小比對來判斷相同檔案。 Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. -識別和傳播兩邊的變化。使用資料庫自動檢測刪除、移動和衝突。 +識別和傳遞兩邊的變化。 使用資料庫自動檢測刪除、移動和衝突。 Create a mirror backup of the left folder by adapting the right folder to match. -透過改寫於右邊的資料夾來匹配建立在左邊鏡像備份的資料夾。 +透過改寫於右邊的資料夾 來匹配建立在左邊鏡像備份的資料夾。 Copy new and updated files to the right folder. 將新的和已更新的檔案複製到右邊資料夾。 @@ -1677,18 +1700,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. 配置您自己的同步規則。 -Synchronization Settings -同步設定 - Comparison 比對 Synchronization 同步 -Today -今日 - This week 本週 @@ -1758,9 +1775,6 @@ This guarantees a consistent state even in case of a serious error. Files 檔案 -Name -名稱 - Percentage 百分比 @@ -1870,14 +1884,6 @@ This guarantees a consistent state even in case of a serious error. %x 小時 - -1 day -%x days - - -%x 天 - - Cannot set privilege %x. 無法設定 %x 的特權。 @@ -1941,9 +1947,12 @@ This guarantees a consistent state even in case of a serious error. Desktop 桌面 -Start menu +Start Menu 開始功能表 +Send To +傳送到 + Registering FreeFileSync file extensions 註冊FreeFileSync檔案關聯 @@ -1971,6 +1980,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. 請選擇本機安裝類型或選擇不同的安裝資料夾。 -The silent installation mode is only available in the FreeFileSync Donation Edition. -命令提示字元安裝模式僅在FreeFileSync贊助版才可使用。 +The %x installation option is only available in the FreeFileSync Donation Edition. +%x 安裝選項僅在FreeFileSync贊助版可用。 diff --git a/FreeFileSync/Build/Languages/croatian.lng b/FreeFileSync/Build/Languages/croatian.lng index c1be603f..7748df23 100755 --- a/FreeFileSync/Build/Languages/croatian.lng +++ b/FreeFileSync/Build/Languages/croatian.lng @@ -64,6 +64,9 @@ Syntax error Greška sintakse +A left and a right directory path are expected after %x. +Lijeva i desna putanja do mapa je očekivana nakon %x. + Cannot find file %x. Nije moguće pronaći datoteku %x. @@ -115,6 +118,19 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Ukoliko ignorirate ovu pogrešku zanemarene mape će se smatrati praznima.Prazne mape se izrade automatski kad bude potrebno. +Comparison finished: +Usporedba dovršena: + + +1 item found +%x items found + + +%x stavka pronađena +%x stavki pronađeno +%x stavki pronađeno + + File %x has an invalid date. Datoteka %x ima nevažeći datum. @@ -175,9 +191,6 @@ Using non-default global settings: Korištenje ne-standardnih global postavki: -Starting comparison -Pokretanje usporedbe - A folder input field is empty. Polje za odabir mape je prazno. @@ -318,15 +331,15 @@ Stvarno: %y bajta Unable to move %x to the recycle bin. Nije moguće premjestiti %x u koš za smeće. +Cannot find %x. +Nije moguće pronaći %x. + Cannot open file %x. Ne mogu otvoriti datoteku %x. Cannot find device %x. Nije moguće pronaći uređaj %x. -Cannot find %x. -Nije moguće pronaći %x. - Type of item %x is not supported: Vrsta stavke %x koji nije podržan: @@ -435,6 +448,9 @@ Stvarno: %y bajta Lock owner: Vlasnik ključa: +Detecting abandoned lock... +Pronalazim napušteni ključ... + 1 sec %x sec @@ -445,9 +461,6 @@ Stvarno: %y bajta %x sek -Detecting abandoned lock... -Pronalazim napušteni ključ... - Items processed: Obrađene stavke: @@ -460,8 +473,8 @@ Stvarno: %y bajta Error parsing file %x, row %y, column %z. Greška u analizi datoteke %x, red %y, stupac %z. -Cannot set directory lock for %x. -Ne mogu zaključiti mapu za %x. +Cannot set directory locks for the following folders: +Nije moguće zaključavanje slijedećih foldera: 1 thread @@ -503,9 +516,6 @@ Stvarno: %y bajta Volume name %x is not part of file path %y. Naziv spremnika %x nije dio putanje datotke %y. -Stop requested: Waiting for current operation to finish... -Zaustavljanje zatraženo: Čekam na dovršenje trenutnog zadatka... - Unable to create time stamp for versioning: Nije moguća izrada vremenske oznake za označavanje: @@ -518,6 +528,9 @@ Stvarno: %y bajta Select a folder Odaberite mapu +&New +&Novo + &Open... &Otvori... @@ -733,26 +746,23 @@ Naredba će biti pokrenuta ako se: job name Naziv zadatka -Show summary -Prikaži izvještaj +System: Sleep +Sistem: Spavanje -Sleep -U stanje pripravnosti +System: Shut down +Sistem: Isključivanje -Shut down -Isključi računalo - -Synchronization stopped -Sinkronizacija zaustavljena +Cleaning up old log files... +Čistim stare datoteke o izvješću... Stopped Zaustavljeno -Synchronization completed with errors -Sinkronizacija dovršena s greškama +Completed with errors +Dovršeno s pogreškama -Synchronization completed with warnings -Sinkronizacija dovršena s upozorenjima +Completed with warnings +Dovršeno s upozorenjima Warning Upozorenje @@ -760,15 +770,12 @@ Naredba će biti pokrenuta ako se: Nothing to synchronize Ništa za sinkronizirati -Synchronization completed successfully -Sinkronizacija uspješno dovršena +Completed successfully +Dovršeno uspješno Executing command %x Izvršavanje naredbe %x -Cleaning up old log files... -Čistim stare datoteke o izvješću... - You can switch to FreeFileSync's main window to resolve this issue. Možete prijeći na glavni prozor FreeFileSynca da bi rješili ovaj problem. @@ -784,15 +791,8 @@ Naredba će biti pokrenuta ako se: Switching to FreeFileSync's main window Prebacivanje na glavni prozor FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automatski pokušaj za %x sekundi... -Automatski pokušaj za %x sekunda... -Automatski pokušaj za %x sekundi... - +Automatic retry +Automatski pokušaj Ignore &all Ignoriraj &sve @@ -803,6 +803,28 @@ Naredba će biti pokrenuta ako se: Serious Error Ozbiljna Pogreška +Last session +Zadnja sesija + +Today +Danas + + +1 day +%x days + + +%x dan +%x dana +%x dana + + +Name +Naziv + +Last sync +Zadnja sinkr + Folder Mapa @@ -866,9 +888,6 @@ Naredba će biti pokrenuta ako se: Please select a folder on a local file system, network or an MTP device. Molimo odaberite mapu na lokalnom disku, mreži ili MTP uređaju. -&New -&Novo - &Save &Spremi @@ -980,6 +999,9 @@ Naredba će biti pokrenuta ako se: Total bytes to copy Ukupno bajta za kopirati +Arrange folder pair +Rasporedi par mapa + Folder pair: Par mapa: @@ -1072,11 +1094,14 @@ Naredba će biti pokrenuta ako se: Naming convention: Naziv pravila: -&Ignore errors -&Ignoriraj pogreške +Ignore errors +Zanemariti pogreške -Show pop-up on errors or warnings -Prikaži skočni prozor pri greškama i upozorenjima +Retry count: +Broj pokušaja: + +Delay (in seconds): +Odgoda (u sekundama) : Run a command after synchronization: Pokreni naredbu nakon sinkronizacije: @@ -1084,9 +1109,6 @@ Naredba će biti pokrenuta ako se: OK U redu -Arrange folder pair -Rasporedi par mapa - Enter your login details: Unesite podatke za logiranje: @@ -1183,12 +1205,12 @@ Naredba će biti pokrenuta ako se: Minimize to notification area Minimiziraj u područje obavjesti -Bytes copied: -Bajta kopirano: - When finished: Nakon završetka: +Auto-close +Auto-zatvaranje + Close Zatvori @@ -1201,12 +1223,18 @@ Naredba će biti pokrenuta ako se: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Stvaranje slijednih datoteka za sinkronizaciju bez nadzora. Da započnete, dvostruko-kliknite na ovu datoteku ili planirajte u planeru zadataka: %x +Progress dialog: +Prozor napretka: + Run minimized Pokreni minimizirano &Show error dialog &Prikaži pogreške +Show pop-up on errors or warnings +Prikaži skočni prozor pri greškama i upozorenjima + &Cancel &Odustani @@ -1255,14 +1283,11 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Transfer file and folder permissions. Prenesi dopuštenja za datoteke i mape. -Automatic retry on error: -Automatski pokušaj ponovo prilikom pogreške: - -Retry count: -Broj pokušaja: +Show hidden dialogs again +Prikaži skrivene prozore ponovno -Delay (in seconds): -Odgoda (u sekundama) : +Show all permanently hidden dialogs and warning messages again +Prikaži sve trajno skrivene prozore i poruke upozorenja ponovno Customize context menu: Prilagodite kontekstni izbornik: @@ -1270,12 +1295,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Description Opis -Show hidden dialogs again -Prikaži skrivene prozore ponovno - -Show all permanently hidden dialogs and warning messages again -Prikaži sve trajno skrivene prozore i poruke upozorenja ponovno - &Default &Zadano @@ -1330,13 +1349,22 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Activate offline Aktivacija offline +Highlight configurations that have not been run for more than the following number of days: +Istakni postavke koje nisu pokrenute više od broja dana: + +Synchronization Settings +Postavke Sinkronizacije + +Access Online Storage +Pristupi online pohrani + Save as a Batch Job Spremi kao slijedni zadatak Delete Items Izbriši stavke -Copy items +Copy Items Kopiraj stavke Options @@ -1348,6 +1376,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. FreeFileSync Donation Edition FreeFileSync Donatorska Verzija +Highlight Configurations +Istakni postavke + &Options &Opcije @@ -1475,9 +1506,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Select time span... Odaberite vremenski raspon... -Last session -Zadnja sesija - Folder Comparison and Synchronization Usporedba i sinkronizacija mapa @@ -1496,8 +1524,11 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Do&n't save &Nemoj spremiti -Remove entry from list -Ukloni stavku iz liste +Hide configuration +Sakrij postavke + +Highlight... +Istakni.... Clear filter Očisti filter @@ -1577,6 +1608,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Paused Pauzirano +Stop requested... +Zatražen prekid... + Initializing... Započinjem... @@ -1586,9 +1620,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Comparing content... Uspoređujem sadržaj... -Completed -Dovršeno - Info Info @@ -1673,12 +1704,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Parameters for opposite side Parametri za suprotnu stranu -Show hidden dialogs and warning messages again? -Prikazati skrivene prozore i poruke upozorenja ponovno? - -&Show -&Prikaži - Downloading update... Preuzimanje ažuriranja... @@ -1703,18 +1728,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Configure your own synchronization rules. Postavite vaša vlastita sinkronizacijska pravila. -Synchronization Settings -Postavke Sinkronizacije - Comparison Usporedba Synchronization Sinkronizacija -Today -Danas - This week Ovaj tjedan @@ -1784,9 +1803,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Files Datoteke -Name -Naziv - Percentage Postotak @@ -1900,16 +1916,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. %x sati - -1 day -%x days - - -%x dan -%x dana -%x dana - - Cannot set privilege %x. Ne mogu postaviti prava za %x. @@ -1973,9 +1979,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Desktop Radna površina -Start menu +Start Menu Start izbornik +Send To +Pošalji na + Registering FreeFileSync file extensions Registriram FreeFileSync ekstenziju @@ -2003,6 +2012,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Please choose the local installation type or select a different folder for installation. Molimo odaberite lokalnu instalaciju ili odaberite drugu mapu za instalaciju. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Skriveni instalacijski tip je dostupan samo u FreeFileSync Donatorskoj Verziji. +The %x installation option is only available in the FreeFileSync Donation Edition. +%x opcija instalacije je dostupna samo u FreeFileSync Donatorskoj verziji. diff --git a/FreeFileSync/Build/Languages/czech.lng b/FreeFileSync/Build/Languages/czech.lng index fb30d713..499fe4e3 100755 --- a/FreeFileSync/Build/Languages/czech.lng +++ b/FreeFileSync/Build/Languages/czech.lng @@ -64,6 +64,9 @@ Syntax error Chyba syntaxe +A left and a right directory path are expected after %x. +Je očekávané zadání parametru levého a pravého adresáře po %x. + Cannot find file %x. Nelze najít soubor %x. @@ -115,6 +118,19 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Pokud přeskočíte tuto chybu, složka bude považována za prázdnou. Chybějící složky pak budou automaticky vytvořeny. +Comparison finished: +Porovnání dokončeno: + + +1 item found +%x items found + + +1 položka nalezena +%x položky nalezeny +%x položek nalezeno + + File %x has an invalid date. Soubor %x má chybné datum. @@ -175,9 +191,6 @@ Using non-default global settings: Použití zvláštního nastavení: -Starting comparison -Začátek porovnávání - A folder input field is empty. Není zadána vstupní složka. @@ -318,15 +331,15 @@ Aktuálně: %y b Unable to move %x to the recycle bin. Není možné přesunout %x do Koše. +Cannot find %x. +Nelze najít %x. + Cannot open file %x. Nelze otevřít soubor %x. Cannot find device %x. Nelze nalézt zařízení %x. -Cannot find %x. -Nelze najít %x. - Type of item %x is not supported: Typ položky %x není podporován: @@ -435,6 +448,9 @@ Aktuálně: %y b Lock owner: Používá: +Detecting abandoned lock... +Prověřování uzamčení... + 1 sec %x sec @@ -445,9 +461,6 @@ Aktuálně: %y b %x sekund -Detecting abandoned lock... -Prověřování uzamčení... - Items processed: Zpracováno položek: @@ -460,8 +473,8 @@ Aktuálně: %y b Error parsing file %x, row %y, column %z. Chyba zpracování souboru %x: na řádku %y ve sloupci %z. -Cannot set directory lock for %x. -Nelze nastavit zámek adresáře %x. +Cannot set directory locks for the following folders: +Nelze uzamčít následující adresáře: 1 thread @@ -503,9 +516,6 @@ Aktuálně: %y b Volume name %x is not part of file path %y. Název disku %x není součástí cesty souboru %y. -Stop requested: Waiting for current operation to finish... -Zastavování: Čekání na dokončení právě probíhající operace... - Unable to create time stamp for versioning: Nelze vytvořit časové značky verzování: @@ -518,6 +528,9 @@ Aktuálně: %y b Select a folder Vyberte adresář +&New +&Nový + &Open... &Otevřít... @@ -733,26 +746,23 @@ Příkaz je spuštěn když: job name název úlohy -Show summary -Zobrazit souhrn +System: Sleep +Režim spánku počítače -Sleep -Režim spánku +System: Shut down +Vypnutí počítače -Shut down -Vypnout počítač - -Synchronization stopped -Synchronizace zastavena +Cleaning up old log files... +Odstraňování starých žurnálů... Stopped Zastaveno -Synchronization completed with errors -Synchronizace dokončena s chybami +Completed with errors +Dokončeno s chybou -Synchronization completed with warnings -Synchronizace dokončena s varováními +Completed with warnings +Dokončeno s varováním Warning Varování @@ -760,15 +770,12 @@ Příkaz je spuštěn když: Nothing to synchronize Není co synchronizovat -Synchronization completed successfully -Synchronizace dokončena úspěšně +Completed successfully +Úspěšně dokončeno Executing command %x Spuštění příkazu %x -Cleaning up old log files... -Odstraňování starých žurnálů... - You can switch to FreeFileSync's main window to resolve this issue. K odstranění tohoto problému se přepněte do hlavního okna FreeFileSync. @@ -784,15 +791,8 @@ Příkaz je spuštěn když: Switching to FreeFileSync's main window Přepínání do hlavního okna FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automaticky opakování za 1 sekundu... -Automaticky opakovat za %x sekundy... -Autoamticky opakovat za %x sekund... - +Automatic retry +Automatické opakování Ignore &all Přeskočit &vše @@ -803,6 +803,28 @@ Příkaz je spuštěn když: Serious Error Závažná chyba +Last session +Poslední sezení + +Today +Dnes + + +1 day +%x days + + +1 den +%x dny +%x dnů + + +Name +Název + +Last sync +Naposledy + Folder Složka @@ -866,9 +888,6 @@ Příkaz je spuštěn když: Please select a folder on a local file system, network or an MTP device. Prosím vyberte složku na místním souborovém systému, síti nebo multimediální zařízení. -&New -&Nový - &Save &Uložit @@ -933,7 +952,7 @@ Příkaz je spuštěn když: Odstranit dvojici adresářů Access online storage -Přístup k úložišti +Přístup k uložišti Swap sides Změna stran @@ -980,6 +999,9 @@ Příkaz je spuštěn když: Total bytes to copy Celkový objem dat +Arrange folder pair +Uspořádat složky + Folder pair: Dvojice složek: @@ -1072,11 +1094,14 @@ Příkaz je spuštěn když: Naming convention: Pojmenování: -&Ignore errors -&Přeskočit chyby +Ignore errors +Přeskočit chyby -Show pop-up on errors or warnings -Zobrazit hlášení při chybě nebo varování +Retry count: +Počet opakování: + +Delay (in seconds): +Prodleva (v sekundách): Run a command after synchronization: Po dokončení synchronizace spustit příkaz: @@ -1084,9 +1109,6 @@ Příkaz je spuštěn když: OK OK -Arrange folder pair -Uspořádat složky - Enter your login details: Zadejte přihlašovací údaje: @@ -1094,7 +1116,7 @@ Příkaz je spuštěn když: Typ spojení: Server name or IP address: -Jméno sevru nebo jeho IP adresa: +Jméno serveru nebo jeho IP adresa: Port: Port: @@ -1183,12 +1205,12 @@ Příkaz je spuštěn když: Minimize to notification area Minimalizovat do oznamovací oblasti -Bytes copied: -Zkopírováno dat: - When finished: Po dokončení: +Auto-close +Automatické zavření + Close Zavřít @@ -1196,17 +1218,23 @@ Příkaz je spuštěn když: &Pauza Stop -Ukončit +Ukončit aplikaci Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Vytvoří dávkový souboru pro automatickou synchronizaci. Ke spuštění dávky jednoduše poklikejte na vytvořený soubor nebo využijte plánovač úloh vašeho systému: %x +Progress dialog: +Zobrazení průběhu: + Run minimized Minimalizovat &Show error dialog Zobrazit chybové &okno +Show pop-up on errors or warnings +Zobrazit hlášení při chybě nebo varování + &Cancel &Zrušit @@ -1252,14 +1280,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. Přenést přístupová oprávnění souborů a složek. -Automatic retry on error: -Automaticky opakovat při chybě: - -Retry count: -Počet opakování: +Show hidden dialogs again +Znovu zobrazit skryté dialogy -Delay (in seconds): -Prodleva (v sekundách): +Show all permanently hidden dialogs and warning messages again +Zobrazit znovu všechny trvale skryté dialogy a varovná hlášení Customize context menu: Přizpůsobit kontextovou nabídku: @@ -1267,12 +1292,6 @@ This guarantees a consistent state even in case of a serious error. Description Popis -Show hidden dialogs again -Znovu zobrazit skryté dialogy - -Show all permanently hidden dialogs and warning messages again -Zobrazit znovu všechny trvale skryté dialogy a varovná hlášení - &Default &Předdefinované @@ -1327,13 +1346,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline Aktivace off-line +Highlight configurations that have not been run for more than the following number of days: +Zvýraznit položky, které nebyly spuštěny za poslední počet dní: + +Synchronization Settings +Nastavení synchronizace + +Access Online Storage +Online uložiště + Save as a Batch Job Uložit jako dávku Delete Items Smazané položky -Copy items +Copy Items Kopírované položky Options @@ -1345,6 +1373,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Zvýraznění položek + &Options Nastavení &programu @@ -1472,9 +1503,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... Zadejte časové rozmezí... -Last session -Poslední sezení - Folder Comparison and Synchronization porovnání a synchronizace složek @@ -1493,8 +1521,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Neukládat -Remove entry from list -Odstranit položku ze seznamu +Hide configuration +Skrýt položky + +Highlight... +Zvýraznit... Clear filter Vymazat filtr @@ -1574,6 +1605,9 @@ This guarantees a consistent state even in case of a serious error. Paused Pauza +Stop requested... +Zastavování... + Initializing... Inicializace... @@ -1583,9 +1617,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... Porovnávání obsahu... -Completed -Hotovo - Info Info @@ -1670,12 +1701,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side Parametry protistrany -Show hidden dialogs and warning messages again? -Zobrazit skryté dialogy a varovná hlášení? - -&Show -&Zobrazit - Downloading update... Stahování aktualizace... @@ -1700,18 +1725,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. Nastavení vlastních pravidel synchronizace. -Synchronization Settings -Nastavení synchronizace - Comparison Porovnání Synchronization Synchronizace -Today -Dnes - This week Tento týden @@ -1781,9 +1800,6 @@ This guarantees a consistent state even in case of a serious error. Files Soubory -Name -Název - Percentage Procentní podíl @@ -1897,16 +1913,6 @@ This guarantees a consistent state even in case of a serious error. %x hodin - -1 day -%x days - - -1 den -%x dny -%x dnů - - Cannot set privilege %x. Nelze nastavit práva pro %x. @@ -1970,9 +1976,12 @@ This guarantees a consistent state even in case of a serious error. Desktop Plocha -Start menu +Start Menu Nabídka Start +Send To +Odeslat + Registering FreeFileSync file extensions Zaregistrovat příponu souborů FreeFileSync @@ -2000,6 +2009,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. Prosím zvolte lokální typ instalace nebo vyberte jinou složku. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Tichá instalace je k dispozici pouze v předplacené verzi FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +%x instalace je k dispozici pouze v předplacené verzi FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/danish.lng b/FreeFileSync/Build/Languages/danish.lng index 4f08824c..a0822e1d 100755 --- a/FreeFileSync/Build/Languages/danish.lng +++ b/FreeFileSync/Build/Languages/danish.lng @@ -64,6 +64,9 @@ Syntax error Syntaksfejl +A left and a right directory path are expected after %x. +Venstre og højre mappesti forventes efter %x. + Cannot find file %x. Kan ikke finde filen %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Hvis denne fejl ignoreres, betragtes mapperne som tomme. Manglende mapper oprettes automatisk efter behov. +Comparison finished: +Sammenligning gennemført: + + +1 item found +%x items found + + +1 emne fundet +%x emner fundet + + File %x has an invalid date. Filen %x har en ugyldig dato. @@ -175,9 +190,6 @@ Using non-default global settings: Brug tilpassede overordnede indstillinger: -Starting comparison -Starter analyse - A folder input field is empty. Der er ikke valgt nogen mapper. @@ -318,15 +330,15 @@ Aktuel: %y byte Unable to move %x to the recycle bin. Kunne ikke flytte %x til papirkurv. +Cannot find %x. +Kan ikke finde %x. + Cannot open file %x. Filen %x kan ikke åbnes. Cannot find device %x. Kan ikke finde enheden %x. -Cannot find %x. -Kan ikke finde %x. - Type of item %x is not supported: Filtypen %x understøttes ikke: @@ -432,6 +444,9 @@ Aktuel: %y byte Lock owner: Låsens ejer: +Detecting abandoned lock... +Finder efterladt lås... + 1 sec %x sec @@ -441,9 +456,6 @@ Aktuel: %y byte %x sek -Detecting abandoned lock... -Finder efterladt lås... - Items processed: Emner behandlet: @@ -456,8 +468,8 @@ Aktuel: %y byte Error parsing file %x, row %y, column %z. Behandlingsfejl i filen %x, række %y, kolonne %z. -Cannot set directory lock for %x. -Kan ikke låse mappen %x. +Cannot set directory locks for the following folders: +Kan ikke sætte mappelåse for følgende mapper: 1 thread @@ -498,9 +510,6 @@ Aktuel: %y byte Volume name %x is not part of file path %y. Volumennavnet %x er ikke del af filstien %y. -Stop requested: Waiting for current operation to finish... -Afbrydelse: Venter på aktuel opgave afsluttes... - Unable to create time stamp for versioning: Kan ikke oprette tidsstempel til versionering: @@ -513,6 +522,9 @@ Aktuel: %y byte Select a folder Vælg en mappe +&New +&Ny + &Open... &Åben... @@ -728,26 +740,23 @@ Kommandoen udføres hvis: job name Jobnavn -Show summary -Resultat +System: Sleep +System: Slumre -Sleep -Slumre +System: Shut down +System: Luk -Shut down -Luk ned - -Synchronization stopped -Synkronisering afbrudt +Cleaning up old log files... +Fjerner gamle logfiler... Stopped Afbrudt -Synchronization completed with errors -Synkronisering gennemført med fejl +Completed with errors +Gennemført med fejl -Synchronization completed with warnings -Synkronisering gennemført med advarsel +Completed with warnings +Gennemført med advarsler Warning Advarsel @@ -755,15 +764,12 @@ Kommandoen udføres hvis: Nothing to synchronize Alt er synkroniseret -Synchronization completed successfully -Synkronisering gennemført +Completed successfully +Gennemført Executing command %x Kører kommandoen %x -Cleaning up old log files... -Fjerner gamle logfiler... - You can switch to FreeFileSync's main window to resolve this issue. Skift til FreeFileSyncs hovedvindue for at løse problemet. @@ -779,14 +785,8 @@ Kommandoen udføres hvis: Switching to FreeFileSync's main window Åbner FreeFileSyncs hovedvindue - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Prøver igen om 1 sekund... -Prøver igen om %x sekunder... - +Automatic retry +Forsøg automatisk igen Ignore &all Ignorer &alle @@ -797,6 +797,27 @@ Kommandoen udføres hvis: Serious Error Kritisk fejl +Last session +Sidste opgave + +Today +Idag + + +1 day +%x days + + +1 dag +%x dage + + +Name +Navn + +Last sync +Sidste synk + Folder Mappe @@ -860,9 +881,6 @@ Kommandoen udføres hvis: Please select a folder on a local file system, network or an MTP device. Vælg lokal mappe, netværksmappe eller mappe på MTP enhed. -&New -&Ny - &Save &Gem @@ -927,7 +945,7 @@ Kommandoen udføres hvis: Fjern mappepar Access online storage -Tilgå onlinelager +Åben onlinelager Swap sides Byt side @@ -974,6 +992,9 @@ Kommandoen udføres hvis: Total bytes to copy Antal bytes der kopieres +Arrange folder pair +Arrangér mappepar + Folder pair: Mappepar: @@ -1066,11 +1087,14 @@ Kommandoen udføres hvis: Naming convention: Navneregler: -&Ignore errors -&Ignorer fejl +Ignore errors +Ignorér fejl -Show pop-up on errors or warnings -Vis fejlbeskeder og advarsler +Retry count: +Antal forsøg: + +Delay (in seconds): +Forsinkelse (sek): Run a command after synchronization: Kør kommando efter synkronisering: @@ -1078,9 +1102,6 @@ Kommandoen udføres hvis: OK OK -Arrange folder pair -Arrangér mappepar - Enter your login details: Angiv login: @@ -1177,12 +1198,12 @@ Kommandoen udføres hvis: Minimize to notification area Minimér til uret -Bytes copied: -Kopierede byte: - When finished: Når gennemført: +Auto-close +Autoluk + Close Luk @@ -1195,12 +1216,18 @@ Kommandoen udføres hvis: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Opret batchfil til automatisk synkronisering. Start med dobbeltklik på filen eller planlæg via opgavestyring: %x +Progress dialog: +Fremskridt: + Run minimized Kør minimeret &Show error dialog &Vis fejlbesked +Show pop-up on errors or warnings +Vis fejlbeskeder og advarsler + &Cancel &Annuller @@ -1249,14 +1276,11 @@ Sikrer processen ved alvorlige fejl. Transfer file and folder permissions. Overfør fil og mappetilladelser. -Automatic retry on error: -Antal forsøg ved fejl: - -Retry count: -Antal forsøg: +Show hidden dialogs again +Gendan skjulte beskeder -Delay (in seconds): -Forsinkelse (sek): +Show all permanently hidden dialogs and warning messages again +Vis skjulte advarsler og beskeder igen Customize context menu: Tilpas kontekstmenu: @@ -1264,12 +1288,6 @@ Sikrer processen ved alvorlige fejl. Description Beskrivelse -Show hidden dialogs again -Gendan skjulte beskeder - -Show all permanently hidden dialogs and warning messages again -Vis skjulte advarsler og beskeder igen - &Default S&tandard @@ -1324,14 +1342,23 @@ Sikrer processen ved alvorlige fejl. Activate offline Aktivér offline +Highlight configurations that have not been run for more than the following number of days: +Fremhæv indstillinger der ikke er kørt i det følgende antal dage: + +Synchronization Settings +Synkroniseringsindstillinger + +Access Online Storage +Tilgå online lager + Save as a Batch Job Gem som batchfil Delete Items Slet emner -Copy items -Kopier emner +Copy Items +Kopiér emner Options Indstillinger @@ -1342,6 +1369,9 @@ Sikrer processen ved alvorlige fejl. FreeFileSync Donation Edition FreeFileSync donationsudgave +Highlight Configurations +Fremhæv indstillinger + &Options &Indstillinger @@ -1465,9 +1495,6 @@ Sikrer processen ved alvorlige fejl. Select time span... Vælg tidsinterval... -Last session -Sidste opgave - Folder Comparison and Synchronization Mappeanalyse og synkronisering @@ -1486,8 +1513,11 @@ Sikrer processen ved alvorlige fejl. Do&n't save &Gem ikke -Remove entry from list -Fjern fra liste +Hide configuration +Skjul indstillinger + +Highlight... +Fremhæv... Clear filter Ryd filter @@ -1567,6 +1597,9 @@ Sikrer processen ved alvorlige fejl. Paused Pauset +Stop requested... +Stop anmodning... + Initializing... Forbereder... @@ -1576,9 +1609,6 @@ Sikrer processen ved alvorlige fejl. Comparing content... Analyserer indhold... -Completed -Gennemført - Info Info @@ -1660,12 +1690,6 @@ Sikrer processen ved alvorlige fejl. Parameters for opposite side Modsatte sides parametre -Show hidden dialogs and warning messages again? -Vis skjulte advarsler og beskeder igen? - -&Show -&Vis - Downloading update... Henter opdatering... @@ -1690,18 +1714,12 @@ Sikrer processen ved alvorlige fejl. Configure your own synchronization rules. Opret dine egne synkroniseringsregler. -Synchronization Settings -Synkroniseringsindstillinger - Comparison Analyse Synchronization Synkronisering -Today -Idag - This week Denne uge @@ -1771,9 +1789,6 @@ Sikrer processen ved alvorlige fejl. Files Filer -Name -Navn - Percentage Procent @@ -1885,15 +1900,6 @@ Sikrer processen ved alvorlige fejl. %x timer - -1 day -%x days - - -1 dag -%x dage - - Cannot set privilege %x. Kan ikke sætte %x privilegier. @@ -1957,8 +1963,11 @@ Sikrer processen ved alvorlige fejl. Desktop På skrivebord -Start menu -I startmenu +Start Menu +Startmenu + +Send To +Send til Registering FreeFileSync file extensions Registrerer FreeFileSync filtyper @@ -1987,6 +1996,6 @@ Sikrer processen ved alvorlige fejl. Please choose the local installation type or select a different folder for installation. Installer normalt, eller vælg en anden mappe. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Baggrundsinstallation er kun mulig med FreeFileSync's donationsudgave. +The %x installation option is only available in the FreeFileSync Donation Edition. +Installationsmuligheden %x er kun mulig i FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/dutch.lng b/FreeFileSync/Build/Languages/dutch.lng index 4748ed36..99875a32 100755 --- a/FreeFileSync/Build/Languages/dutch.lng +++ b/FreeFileSync/Build/Languages/dutch.lng @@ -64,6 +64,9 @@ Syntax error Syntaxis fout +A left and a right directory path are expected after %x. +Een linker en een rechter mappad worden verwacht na %x. + Cannot find file %x. Kan bestand %x niet vinden. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Indien deze fout wordt genegeerd zullen de mappen als leeg beschouwd worden. Ontbrekende mappen worden automatisch aangemaakt indien nodig. +Comparison finished: +Vergelijking voltooid: + + +1 item found +%x items found + + +1 item gevonden +%x items gevonden + + File %x has an invalid date. Het bestand %x heeft een ongeldige datum. @@ -167,7 +182,7 @@ Uitvoeren met achtergrond prioriteit Lock directories during sync -Directories vergrendelen tijdens de synchronisatie +Mappen vergrendelen tijdens de synchronisatie Verify copied files Controleer de gekopieerde bestanden @@ -175,9 +190,6 @@ Using non-default global settings: Het gebruik van niet-standaard algemene instellingen: -Starting comparison -Start vergelijking - A folder input field is empty. Invoerveld van een map is leeg. @@ -318,15 +330,15 @@ Werkelijk: %y bytes Unable to move %x to the recycle bin. Niet in staat om %x naar de prullenbak te verplaatsen. +Cannot find %x. +Kan %x niet vinden. + Cannot open file %x. Het bestand %x kan niet geopend worden. Cannot find device %x. Kan apparaat %x niet vinden. -Cannot find %x. -Kan %x niet vinden. - Type of item %x is not supported: Dit itemtype %x wordt niet ondersteund: @@ -432,6 +444,9 @@ Werkelijk: %y bytes Lock owner: Vergrendel eigenaar: +Detecting abandoned lock... +Opsporen van verlaten vergrendeling... + 1 sec %x sec @@ -441,9 +456,6 @@ Werkelijk: %y bytes %x sec -Detecting abandoned lock... -Opsporen van verlaten vergrendeling... - Items processed: Items verwerkt: @@ -456,8 +468,8 @@ Werkelijk: %y bytes Error parsing file %x, row %y, column %z. Fout bij het analyseren van bestand %x, rij %y, kolom %z. -Cannot set directory lock for %x. -De mapvergrendeling voor %x kan niet ingesteld worden. +Cannot set directory locks for the following folders: +Kan map vergrendelingen niet instellen voor de volgende mappen: 1 thread @@ -498,9 +510,6 @@ Werkelijk: %y bytes Volume name %x is not part of file path %y. Volumenaam %x behoort niet tot bestandspad %y. -Stop requested: Waiting for current operation to finish... -Stoppen gevraagd: wachten totdat de huidige bewerking is voltooid... - Unable to create time stamp for versioning: Kan geen tijdstempel maken voor versiebeheer: @@ -513,6 +522,9 @@ Werkelijk: %y bytes Select a folder Selecteer een map +&New +&Nieuw + &Open... &Openen... @@ -588,7 +600,7 @@ De opdracht wordt geactiveerd als: Over Build: %x -Build: %x +Ontwikkeld: %x All files Alle bestanden @@ -728,26 +740,23 @@ De opdracht wordt geactiveerd als: job name taaknaam -Show summary -Toon samenvatting +System: Sleep +Systeem: Slaapstand -Sleep -Slaapstand +System: Shut down +Systeem: Uitschakelen -Shut down -Uitschakelen - -Synchronization stopped -Synchronisatie gestopt +Cleaning up old log files... +Opruimen oude logboekbestanden... Stopped Gestopt -Synchronization completed with errors -Synchronisatie met fouten voltooid +Completed with errors +Voltooid met fouten -Synchronization completed with warnings -Synchronisatie met waarschuwingen voltooid +Completed with warnings +Voltooid met waarschuwingen Warning Waarschuwing @@ -755,15 +764,12 @@ De opdracht wordt geactiveerd als: Nothing to synchronize Niets om te synchroniseren -Synchronization completed successfully -Synchronisatie succesvol voltooid +Completed successfully +Succesvol voltooid Executing command %x Opdracht %x uitvoeren -Cleaning up old log files... -Opruimen oude logboekbestanden... - You can switch to FreeFileSync's main window to resolve this issue. U kunt overschakelen naar het hoofdvenster van FreeFileSync om dit probleem op te lossen. @@ -779,14 +785,8 @@ De opdracht wordt geactiveerd als: Switching to FreeFileSync's main window Overschakelen naar het hoofdvenster van FreeFileSyncs - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automatisch opnieuw proberen in 1 seconde... -Automatisch opnieuw proberen in %x seconden... - +Automatic retry +Automatisch opnieuw proberen Ignore &all Negeer &alles @@ -797,6 +797,27 @@ De opdracht wordt geactiveerd als: Serious Error Ernstige fout +Last session +Laatste sessie + +Today +Vandaag + + +1 day +%x days + + +1 dag +%x dagen + + +Name +Naam + +Last sync +Laatste synchronisatie + Folder Map @@ -860,9 +881,6 @@ De opdracht wordt geactiveerd als: Please select a folder on a local file system, network or an MTP device. Selecteer een map op een lokaal bestandssysteem, netwerk of een MTP-apparaat. -&New -&Nieuw - &Save &Opslaan @@ -909,7 +927,7 @@ De opdracht wordt geactiveerd als: &Controleren op updates Check &automatically once a week -Controleer een keer per week &automatisch +Controleer eens per week &automatisch Cancel Annuleren @@ -974,6 +992,9 @@ De opdracht wordt geactiveerd als: Total bytes to copy Totaal aantal te kopiëren bytes +Arrange folder pair +Rangschik folder-paar + Folder pair: Map-paar: @@ -1066,11 +1087,14 @@ De opdracht wordt geactiveerd als: Naming convention: Naamgevingsconventie: -&Ignore errors -&Negeer fouten +Ignore errors +Negeer fouten -Show pop-up on errors or warnings -Toon pop-up bij fouten of waarschuwingen +Retry count: +Probeer opnieuw te tellen: + +Delay (in seconds): +Vertraging (in seconden): Run a command after synchronization: Voer een opdracht uit na de synchronisatie: @@ -1078,9 +1102,6 @@ De opdracht wordt geactiveerd als: OK OK -Arrange folder pair -Rangschik folder-paar - Enter your login details: Logingegevens invoeren: @@ -1177,12 +1198,12 @@ De opdracht wordt geactiveerd als: Minimize to notification area Minimaliseren naar systeemvak -Bytes copied: -Gekopieerde bytes: - When finished: Wanneer je gereed bent: +Auto-close +Automatisch sluiten + Close Sluiten @@ -1195,12 +1216,18 @@ De opdracht wordt geactiveerd als: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Maak een batch-bestand om zonder toezicht te synchroniseren. Om te starten, dubbelklik op het bestand of maak een opdracht in de taakplanner: %x +Progress dialog: +Voortgangsdialoog: + Run minimized Geminimaliseerd uitvoeren &Show error dialog &Toon foutdialoog +Show pop-up on errors or warnings +Toon pop-up bij fouten of waarschuwingen + &Cancel &Annuleer @@ -1249,14 +1276,11 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Transfer file and folder permissions. Overdracht van bestands- en mapmachtigingen. -Automatic retry on error: -Automatisch opnieuw proberen bij fouten: - -Retry count: -Probeer opnieuw te tellen: +Show hidden dialogs again +Verborgen dialoogvensters weergeven -Delay (in seconds): -Vertraging (in seconden): +Show all permanently hidden dialogs and warning messages again +Alle permanent verborgen dialogen en waarschuwingsberichten opnieuw weergeven Customize context menu: Contextmenu aanpassen: @@ -1264,12 +1288,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Description Beschrijving -Show hidden dialogs again -Verborgen dialoogvensters weergeven - -Show all permanently hidden dialogs and warning messages again -Alle permanent verborgen dialogen en waarschuwingsberichten opnieuw weergeven - &Default &Standaard @@ -1324,14 +1342,23 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Activate offline Activeer offline +Highlight configurations that have not been run for more than the following number of days: +Markeer configuraties die niet meer dan het volgende aantal dagen zijn uitgevoerd: + +Synchronization Settings +Synchronisatie-instellingen + +Access Online Storage +Toegang Online Opslag + Save as a Batch Job Opslaan als een batchverwerking Delete Items Items verwijderen -Copy items -Kopieer items +Copy Items +Items kopiëren Options Opties @@ -1342,6 +1369,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. FreeFileSync Donation Edition FreeFileSync donatie Editie +Highlight Configurations +Markeer Configuraties + &Options &Opties @@ -1465,9 +1495,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Select time span... Selecteer tijdsduur... -Last session -Laatste sessie - Folder Comparison and Synchronization Map vergelijken en synchroniseren @@ -1486,8 +1513,11 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Do&n't save &Niet opslaan -Remove entry from list -Vermelding verwijderen uit de lijst +Hide configuration +Verberg configuratie + +Highlight... +Markeer... Clear filter Filter wissen @@ -1567,6 +1597,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Paused Onderbroken +Stop requested... +Stop gevraagd... + Initializing... Initialiseren... @@ -1576,9 +1609,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Comparing content... Inhoud vergelijken... -Completed -Voltooid - Info Info @@ -1660,12 +1690,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Parameters for opposite side Parameters voor de andere kant -Show hidden dialogs and warning messages again? -Verborgen vensters en waarschuwingsberichten opnieuw weergeven? - -&Show -&Toon - Downloading update... Downloaden van update... @@ -1690,18 +1714,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Configure your own synchronization rules. Configureer uw eigen synchronisatie regels. -Synchronization Settings -Synchronisatie-instellingen - Comparison Vergelijking Synchronization Synchronisatie -Today -Vandaag - This week Deze week @@ -1771,9 +1789,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Files Bestanden -Name -Naam - Percentage Percentage @@ -1885,15 +1900,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. %x uren - -1 day -%x days - - -1 dag -%x dagen - - Cannot set privilege %x. Kan geen privileges %x instellen. @@ -1957,9 +1963,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Desktop Bureaublad -Start menu +Start Menu Startmenu +Send To +Verzenden Naar + Registering FreeFileSync file extensions Registeren van de FreeFileSync bestands-extensies @@ -1987,6 +1996,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Please choose the local installation type or select a different folder for installation. Kies voor een lokale installatie of selecteer een andere map voor de installatie. -The silent installation mode is only available in the FreeFileSync Donation Edition. -De stille installatie-modus is alleen beschikbaar in de FreeFileSync donatie editie. +The %x installation option is only available in the FreeFileSync Donation Edition. +De %x installatieoptie is alleen beschikbaar in de FreeFileSync Donatie-editie. diff --git a/FreeFileSync/Build/Languages/english_uk.lng b/FreeFileSync/Build/Languages/english_uk.lng index a926e1f4..1f3fcaf0 100755 --- a/FreeFileSync/Build/Languages/english_uk.lng +++ b/FreeFileSync/Build/Languages/english_uk.lng @@ -64,6 +64,9 @@ Syntax error Syntax error +A left and a right directory path are expected after %x. +A left and a right directory path are expected after %x. + Cannot find file %x. Cannot find file %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. +Comparison finished: +Comparison finished: + + +1 item found +%x items found + + +1 item found +%x items found + + File %x has an invalid date. File %x has an invalid date. @@ -175,9 +190,6 @@ Using non-default global settings: Using non-default global settings: -Starting comparison -Starting comparison - A folder input field is empty. A folder input field is empty. @@ -318,15 +330,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. Unable to move %x to the recycle bin. +Cannot find %x. +Cannot find %x. + Cannot open file %x. Cannot open file %x. Cannot find device %x. Cannot find device %x. -Cannot find %x. -Cannot find %x. - Type of item %x is not supported: Type of item %x is not supported: @@ -432,6 +444,9 @@ Actual: %y bytes Lock owner: Lock owner: +Detecting abandoned lock... +Detecting abandoned lock... + 1 sec %x sec @@ -441,9 +456,6 @@ Actual: %y bytes %x sec -Detecting abandoned lock... -Detecting abandoned lock... - Items processed: Elements processed: @@ -456,8 +468,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. Error parsing file %x, row %y, column %z. -Cannot set directory lock for %x. -Cannot set directory lock for %x. +Cannot set directory locks for the following folders: +Cannot set directory locks for the following folders: 1 thread @@ -498,9 +510,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. Volume name %x is not part of file path %y. -Stop requested: Waiting for current operation to finish... -Stop requested: Waiting for current operation to finish... - Unable to create time stamp for versioning: Unable to create time stamp for versioning: @@ -513,6 +522,9 @@ Actual: %y bytes Select a folder Select a folder +&New +&New + &Open... &Open... @@ -728,26 +740,23 @@ The command is triggered if: job name job name -Show summary -Show summary +System: Sleep +System: Sleep -Sleep -Sleep +System: Shut down +System: Shut down -Shut down -Shut down - -Synchronization stopped -Synchronisation stopped +Cleaning up old log files... +Cleaning up old log files... Stopped Stopped -Synchronization completed with errors -Synchronisation completed with errors +Completed with errors +Completed with errors -Synchronization completed with warnings -Synchronisation completed with warnings +Completed with warnings +Completed with warnings Warning Warning @@ -755,15 +764,12 @@ The command is triggered if: Nothing to synchronize Nothing to synchronise -Synchronization completed successfully -Synchronisation completed successfully +Completed successfully +Completed successfully Executing command %x Executing command %x -Cleaning up old log files... -Cleaning up old log files... - You can switch to FreeFileSync's main window to resolve this issue. You can switch to FreeFileSync's main window to resolve this issue. @@ -779,14 +785,8 @@ The command is triggered if: Switching to FreeFileSync's main window Switching to FreeFileSync's main window - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automatic retry in 1 second... -Automatic retry in %x seconds... - +Automatic retry +Automatic retry Ignore &all Ignore &all @@ -797,6 +797,27 @@ The command is triggered if: Serious Error Serious Error +Last session +Last session + +Today +Today + + +1 day +%x days + + +1 day +%x days + + +Name +Name + +Last sync +Last sync + Folder Folder @@ -860,9 +881,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. Please select a folder on a local file system, network or an MTP device. -&New -&New - &Save &Save @@ -974,6 +992,9 @@ The command is triggered if: Total bytes to copy Total bytes to copy +Arrange folder pair +Arrange folder pair + Folder pair: Folder pair: @@ -1066,11 +1087,14 @@ The command is triggered if: Naming convention: Naming convention: -&Ignore errors -&Ignore errors +Ignore errors +Ignore errors -Show pop-up on errors or warnings -Show pop-up on errors or warnings +Retry count: +Retry count: + +Delay (in seconds): +Delay (in seconds): Run a command after synchronization: Run a command after synchronization: @@ -1078,9 +1102,6 @@ The command is triggered if: OK OK -Arrange folder pair -Arrange folder pair - Enter your login details: Enter your login details: @@ -1177,12 +1198,12 @@ The command is triggered if: Minimize to notification area Minimise to notification area -Bytes copied: -Bytes copied: - When finished: When finished: +Auto-close +Auto-close + Close Close @@ -1195,12 +1216,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Create a batch file for unattended synchronisation. To start, double-click this file or schedule in a task planner: %x +Progress dialog: +Progress dialog: + Run minimized Run minimised &Show error dialog &Show error dialog +Show pop-up on errors or warnings +Show pop-up on errors or warnings + &Cancel &Cancel @@ -1249,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. Transfer file and folder permissions. -Automatic retry on error: -Automatic retry on error: - -Retry count: -Retry count: +Show hidden dialogs again +Show hidden dialogues again -Delay (in seconds): -Delay (in seconds): +Show all permanently hidden dialogs and warning messages again +Show all permanently hidden dialogues and warning messages again Customize context menu: Customise context menu: @@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error. Description Description -Show hidden dialogs again -Show hidden dialogues again - -Show all permanently hidden dialogs and warning messages again -Show all permanently hidden dialogues and warning messages again - &Default &Default @@ -1324,14 +1342,23 @@ This guarantees a consistent state even in case of a serious error. Activate offline Activate offline +Highlight configurations that have not been run for more than the following number of days: +Highlight configurations that have not been run for more than the following number of days: + +Synchronization Settings +Synchronisation Settings + +Access Online Storage +Access Online Storage + Save as a Batch Job Save as a Batch Job Delete Items Delete Items -Copy items -Copy items +Copy Items +Copy Items Options Options @@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Highlight Configurations + &Options &Options @@ -1465,9 +1495,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... Select time span... -Last session -Last session - Folder Comparison and Synchronization Folder Comparison and Synchronisation @@ -1486,8 +1513,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save Do&n't save -Remove entry from list -Remove entry from list +Hide configuration +Hide configuration + +Highlight... +Highlight... Clear filter Clear filter @@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error. Paused Paused +Stop requested... +Stop requested... + Initializing... Initialising... @@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... Comparing content... -Completed -Completed - Info Info @@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side Parameters for opposite side -Show hidden dialogs and warning messages again? -Show hidden dialogues and warning messages again? - -&Show -&Show - Downloading update... Downloading update... @@ -1690,18 +1714,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. Configure your own synchronisation rules. -Synchronization Settings -Synchronisation Settings - Comparison Comparison Synchronization Synchronisation -Today -Today - This week This week @@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error. Files Files -Name -Name - Percentage Percentage @@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error. %x hours - -1 day -%x days - - -1 day -%x days - - Cannot set privilege %x. Cannot set privilege %x. @@ -1957,8 +1963,11 @@ This guarantees a consistent state even in case of a serious error. Desktop Desktop -Start menu -Start menu +Start Menu +Start Menu + +Send To +Send To Registering FreeFileSync file extensions Registering FreeFileSync file extensions @@ -1987,6 +1996,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. Please choose the local installation type or select a different folder for installation. -The silent installation mode is only available in the FreeFileSync Donation Edition. -The silent installation mode is only available in the FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/finnish.lng b/FreeFileSync/Build/Languages/finnish.lng index a0c3b95e..dfdf1145 100755 --- a/FreeFileSync/Build/Languages/finnish.lng +++ b/FreeFileSync/Build/Languages/finnish.lng @@ -64,6 +64,9 @@ Syntax error Muotovirhe +A left and a right directory path are expected after %x. + + Cannot find file %x. Tiedosto %x ei löydy. @@ -115,6 +118,16 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Hakemistot luodaan tyhjinä jos virhe ohitetaan. Puuttuvat hakemistot luodaan tarvittaessa. +Comparison finished: + + + +1 item found +%x items found + + + + File %x has an invalid date. Tiedostolla %x on virheellinen päiväys. @@ -175,9 +188,6 @@ Using non-default global settings: Käytä mukautettuja yleisasetuksia: -Starting comparison -Vertailu alkaa - A folder input field is empty. Hakemiston syötekenttä on tyhjä. @@ -318,15 +328,15 @@ Todellinen: %y tavua Unable to move %x to the recycle bin. %x:n siirto Roskakoriin epäonnistui. +Cannot find %x. +%x ei löydy. + Cannot open file %x. Tiedosto %x ei aukea. Cannot find device %x. Laite %x ei löydy. -Cannot find %x. -%x ei löydy. - Type of item %x is not supported: Kohteen %x tyyppiä ei tueta: @@ -432,6 +442,9 @@ Todellinen: %y tavua Lock owner: Lukitsija: +Detecting abandoned lock... +Hylätyn lukituksen etsintä... + 1 sec %x sec @@ -441,9 +454,6 @@ Todellinen: %y tavua %x s -Detecting abandoned lock... -Hylätyn lukituksen etsintä... - Items processed: Osioita käsitelty: @@ -456,8 +466,8 @@ Todellinen: %y tavua Error parsing file %x, row %y, column %z. Jäsennysvirhe - tiedosto: %x, rivi: %y, sarake: %z. -Cannot set directory lock for %x. -Hakemiston %x lukitus ei onnistu. +Cannot set directory locks for the following folders: + 1 thread @@ -498,9 +508,6 @@ Todellinen: %y tavua Volume name %x is not part of file path %y. Asema %x ei esiinny tiedostopolussa %y. -Stop requested: Waiting for current operation to finish... -Keskeytyspyyntö: odotetaan tehtävän valmistumista... - Unable to create time stamp for versioning: Versionhallinnan aikaleimaa ei voida luoda: @@ -513,6 +520,9 @@ Todellinen: %y tavua Select a folder Valitse hakemisto +&New +&Uusi + &Open... &Avaa... @@ -728,26 +738,23 @@ Käsky suoritetaan jos: job name työnnimi -Show summary -Näytä yhteenveto +System: Sleep + -Sleep -Lepotila +System: Shut down + -Shut down -Sulje - -Synchronization stopped -Täsmäytys on pysäytetty +Cleaning up old log files... +Siivotaan vanhat lokitiedostot... Stopped Keskeytys -Synchronization completed with errors -Täsmäytys päättyi virheisiin +Completed with errors + -Synchronization completed with warnings -Täsmäytys päättyi varoituksin +Completed with warnings + Warning Varoitus @@ -755,15 +762,12 @@ Käsky suoritetaan jos: Nothing to synchronize Ei mitään täsmäytettävää -Synchronization completed successfully -Täsmäytys päättyi onnistuneesti +Completed successfully + Executing command %x Suorita komentua %x -Cleaning up old log files... -Siivotaan vanhat lokitiedostot... - You can switch to FreeFileSync's main window to resolve this issue. Voit siirtyä FreeFileSyncin pääikkunaan korjataksesi tämä virhe. @@ -779,14 +783,8 @@ Käsky suoritetaan jos: Switching to FreeFileSync's main window Vaihdetaan FreeFileSyncin pääikkunaan - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Uusi yritys 1 sekunnin kuluttua... -Uusi yritys %x sekunnin kuluttua... - +Automatic retry + Ignore &all Ohita &kaikki @@ -797,6 +795,27 @@ Käsky suoritetaan jos: Serious Error Vakava virhe +Last session +Viime istunto + +Today +Tänään + + +1 day +%x days + + +1 päivä +%x päivää + + +Name +Nimi + +Last sync + + Folder Hakemisto @@ -860,9 +879,6 @@ Käsky suoritetaan jos: Please select a folder on a local file system, network or an MTP device. Valitse kansio joka on paikallinen, verkossa tai MTP laitteella. -&New -&Uusi - &Save &Tallenna @@ -974,6 +990,9 @@ Käsky suoritetaan jos: Total bytes to copy Kopioitava määrä tavuja +Arrange folder pair +Järjestä hakemistoparit + Folder pair: Hakemistopari: @@ -1066,11 +1085,14 @@ Käsky suoritetaan jos: Naming convention: Nimeämiskäytäntö: -&Ignore errors -&Ohita virheet +Ignore errors + -Show pop-up on errors or warnings -Näytä ponnahdusikkuna virheiden tai varoituksien kohdalla +Retry count: +Uusintayrityksiä: + +Delay (in seconds): +Viive (sekunneissa): Run a command after synchronization: Suorita käsky kun täsmäytys on tehty: @@ -1078,9 +1100,6 @@ Käsky suoritetaan jos: OK Kyllä -Arrange folder pair -Järjestä hakemistoparit - Enter your login details: Anna kirjautumistietosi: @@ -1177,12 +1196,12 @@ Käsky suoritetaan jos: Minimize to notification area Pienennä ilmaisinalueelle -Bytes copied: -Kopioituja tavuja: - When finished: Kun valmis: +Auto-close + + Close Sulje @@ -1195,12 +1214,18 @@ Käsky suoritetaan jos: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Luo eräajotiedosto automaattista täsmäytystä varten. Käynnistä kaksoisnapsauttamalla tai ajasta tehtävä: %x +Progress dialog: + + Run minimized Suorita pienennettynä &Show error dialog &Näytä virheilmoitus +Show pop-up on errors or warnings +Näytä ponnahdusikkuna virheiden tai varoituksien kohdalla + &Cancel &Peruuta @@ -1249,14 +1274,11 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Transfer file and folder permissions. Siirrä tiedostojen ja hakemistojen käyttöoikeudet. -Automatic retry on error: -Automaattinen uusintayritys, kun virhe sattuu: - -Retry count: -Uusintayrityksiä: +Show hidden dialogs again +Näytä piiloitetut valintaikkunat uudestaan -Delay (in seconds): -Viive (sekunneissa): +Show all permanently hidden dialogs and warning messages again +Näytä pysyvästi piiloitetut valintaikkunat ja varoitukset uudestaan Customize context menu: Muokkaa pikavalikkoa: @@ -1264,12 +1286,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Description Kuvaus -Show hidden dialogs again -Näytä piiloitetut valintaikkunat uudestaan - -Show all permanently hidden dialogs and warning messages again -Näytä pysyvästi piiloitetut valintaikkunat ja varoitukset uudestaan - &Default &Oletus @@ -1324,14 +1340,23 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Activate offline Aktivoi yhteyttä +Highlight configurations that have not been run for more than the following number of days: + + +Synchronization Settings +Täsmäyksen asetukset + +Access Online Storage + + Save as a Batch Job Tallenna eräajona> Delete Items Poista kohteet -Copy items -Monista kohteet +Copy Items + Options Asetukset @@ -1342,6 +1367,9 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. FreeFileSync Donation Edition FreeFileSync Lahjoittajan versio +Highlight Configurations + + &Options &Asetukset @@ -1465,9 +1493,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Select time span... Valitse aikajana... -Last session -Viime istunto - Folder Comparison and Synchronization Hakemistojen vertailu ja täsmäytys @@ -1486,8 +1511,11 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Do&n't save Äl&ä tallenna -Remove entry from list -Poista valittu määrittely listalta +Hide configuration + + +Highlight... + Clear filter Nollaa suodin @@ -1567,6 +1595,9 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Paused Pysäytetty +Stop requested... + + Initializing... Alustetaan... @@ -1576,9 +1607,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Comparing content... Sisältöä vertaillaan... -Completed -Valmis - Info Info @@ -1660,12 +1688,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Parameters for opposite side Toisen puolen parametrit -Show hidden dialogs and warning messages again? -Näytetäänkö piiloitetut valintaikkunat ja varoitukset uudestaan? - -&Show -&Näytä - Downloading update... Ladataan päivitystä... @@ -1690,18 +1712,12 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Configure your own synchronization rules. Määritä omat täsmäytyssäännöt. -Synchronization Settings -Täsmäyksen asetukset - Comparison Vertailu Synchronization Täsmäytys -Today -Tänään - This week Tällä viikolla @@ -1771,9 +1787,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Files Tiedostot -Name -Nimi - Percentage Prosenttia @@ -1885,15 +1898,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. %x tuntia - -1 day -%x days - - -1 päivä -%x päivää - - Cannot set privilege %x. Oikeutta %x ei voitu asettaa. @@ -1957,8 +1961,11 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Desktop Työpöydälle -Start menu -Käynnistä-valikkoon +Start Menu + + +Send To + Registering FreeFileSync file extensions Liitään FreeFileSync tiedostotunnisteet @@ -1987,6 +1994,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi. Please choose the local installation type or select a different folder for installation. Valitse paikallinen asennus tai vaihda asennushakemistoa. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Häiveasennus toimii vain FreeFileSyncin Lahjoittajan versiossa. +The %x installation option is only available in the FreeFileSync Donation Edition. + diff --git a/FreeFileSync/Build/Languages/french.lng b/FreeFileSync/Build/Languages/french.lng index 625ea7c2..67627ec3 100755 --- a/FreeFileSync/Build/Languages/french.lng +++ b/FreeFileSync/Build/Languages/french.lng @@ -64,6 +64,9 @@ Syntax error Erreur de syntaxe +A left and a right directory path are expected after %x. +Un répertoire gauche et un répertoire droit sont requis après %x. + Cannot find file %x. Impossible de trouver le fichier %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Si cette erreur est ignorée, les dossiers seront considérés comme vides. Les dossiers manquants seront automatiquement créés si nécessaire. +Comparison finished: +Comparaison terminée : + + +1 item found +%x items found + + +%x élément trouvé +%x éléments trouvés + + File %x has an invalid date. Le fichier %x a une date invalide. @@ -143,7 +158,7 @@ Génération de la liste des fichiers... Fail-safe file copy -Copie de fichiers sécurisés +Copie de fichiers sécurisée Enabled Activé @@ -175,9 +190,6 @@ Using non-default global settings: Utilisation des paramètres globaux particuliers : -Starting comparison -Comparaison en cours - A folder input field is empty. Un champ dossier est vide. @@ -318,15 +330,15 @@ Trouvé : %y octets Unable to move %x to the recycle bin. Impossible de déplacer %x dans la Corbeille. +Cannot find %x. +Impossible de trouver %x. + Cannot open file %x. Impossible d'ouvrir le fichier %x. Cannot find device %x. Impossible de trouver le périphérique %x. -Cannot find %x. -Impossible de trouver %x. - Type of item %x is not supported: Le type de l'élément %x n'est pas accepté : @@ -432,6 +444,9 @@ Trouvé : %y octets Lock owner: Propriétaire du verrou : +Detecting abandoned lock... +Détection de verrouillage abandonné ... + 1 sec %x sec @@ -441,9 +456,6 @@ Trouvé : %y octets %x sec -Detecting abandoned lock... -Détection de verrouillage abandonné ... - Items processed: Élements traités : @@ -456,8 +468,8 @@ Trouvé : %y octets Error parsing file %x, row %y, column %z. Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z. -Cannot set directory lock for %x. -Impossible de verrouiller le dossier %x. +Cannot set directory locks for the following folders: +Impossible de verrouiller les répertoires des dossiers suivants : 1 thread @@ -498,9 +510,6 @@ Trouvé : %y octets Volume name %x is not part of file path %y. Le nom de volume %x ne fait pas partie du chemin %y. -Stop requested: Waiting for current operation to finish... -Arrêt demandé : En attente de la fin de l'opération en cours ... - Unable to create time stamp for versioning: Impossible de générer l'horodatage pour la gestion des versions : @@ -513,6 +522,9 @@ Trouvé : %y octets Select a folder Choisissez un dossier +&New +&Nouveau + &Open... &Ouvrir... @@ -529,7 +541,7 @@ Trouvé : %y octets &Afficher l'aide &About -A &Propos de +&A propos de &Help &Aide @@ -728,26 +740,23 @@ La commande est déclenchée si : job name nom du job -Show summary -Afficher le résumé +System: Sleep +Système : Mise en veille -Sleep -Mise en veille +System: Shut down +Sustème : Arrêt -Shut down -Arrêt - -Synchronization stopped -Synchronisation arrêtée +Cleaning up old log files... +Nettoyage des anciens fichiers log ... Stopped Arrêté -Synchronization completed with errors -Synchronisation terminée avec des erreurs +Completed with errors +Terminé avec erreurs -Synchronization completed with warnings -Synchronisation terminée avec des avertissements +Completed with warnings +Terminé avec observations Warning Attention @@ -755,15 +764,12 @@ La commande est déclenchée si : Nothing to synchronize Rien à synchroniser -Synchronization completed successfully -Synchronisation terminée sans erreur +Completed successfully +Terminé avec succès Executing command %x Exécution de la commande %x -Cleaning up old log files... -Nettoyage des anciens fichiers log ... - You can switch to FreeFileSync's main window to resolve this issue. Vous pouvez basculer vers la fenêtre principale de FreeFileSync pour résoudre ce problème. @@ -779,14 +785,8 @@ La commande est déclenchée si : Switching to FreeFileSync's main window Basculer vers la fenêtre principale de FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Nouvel essai dans %x seconde ... -Nouvel essai dans %x secondes ... - +Automatic retry +Réessayer automatiquement Ignore &all &Tout ignorer @@ -797,6 +797,27 @@ La commande est déclenchée si : Serious Error Erreur Grave +Last session +Dernière session + +Today +Aujourd'hui + + +1 day +%x days + + +%x jour +%x jours + + +Name +Nom + +Last sync +Dernière synchro + Folder Dossier @@ -860,9 +881,6 @@ La commande est déclenchée si : Please select a folder on a local file system, network or an MTP device. Veuillez choisir un dossier local, en réseau ou un périphérique MTP. -&New -&Nouveau - &Save &Sauvegarder @@ -974,6 +992,9 @@ La commande est déclenchée si : Total bytes to copy Nombre total d'octets à copier +Arrange folder pair +Coordonne la paire de dossiers + Folder pair: Paire de dossiers : @@ -1066,11 +1087,14 @@ La commande est déclenchée si : Naming convention: Convention de nommage : -&Ignore errors -&Ignorer les erreurs +Ignore errors +Ignorer les erreurs -Show pop-up on errors or warnings -Montrer les avertissements et les messages d'erreur +Retry count: +Nombre de tentatives : + +Delay (in seconds): +Délai (en secondes) : Run a command after synchronization: Exécuter une commande après la synchronisation : @@ -1078,9 +1102,6 @@ La commande est déclenchée si : OK OK -Arrange folder pair -Coordonne la paire de dossiers - Enter your login details: Entrez vos identifiants : @@ -1121,7 +1142,7 @@ La commande est déclenchée si : Fichier clé personnel : &Show password -&Affiche le mot de passe +&Afficher le mot de passe Directory on server: Répertoire sur le serveur : @@ -1133,7 +1154,7 @@ La commande est déclenchée si : Comment améliorer les performances ? Connections for directory reading: -connexions pour la lecture des répertoires : +Connexions pour la lecture des répertoires : SFTP channels per connection: Ports SFTP par connexion : @@ -1142,10 +1163,10 @@ La commande est déclenchée si : Détection des limites du serveur Select a directory on the server: -Sélectionner un répertoire sur le serveur : +Choisir un répertoire sur le serveur : Select Folder -Sélectionner un Dossier +Choisir un Dossier Start synchronization now? Démarrer la synchronisation maintenant ? @@ -1177,12 +1198,12 @@ La commande est déclenchée si : Minimize to notification area Réduction à la zone de notification -Bytes copied: -Octets copiés : - When finished: A la fin : +Auto-close +Fermeture automatique + Close Fermer @@ -1195,12 +1216,18 @@ La commande est déclenchée si : Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Créer un fichier batch pour une synchronisation non assitée. Pour démarrer, double-cliquez sur ce fichier ou planifiez-le dans le gestionnaire des tâches : %x +Progress dialog: +Fenêtre de progression: + Run minimized Exécution fenêtre réduite &Show error dialog &Afficher la boîte de dialogue d'erreur +Show pop-up on errors or warnings +Montrer les avertissements et les messages d'erreur + &Cancel &Annuler @@ -1249,14 +1276,11 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Transfer file and folder permissions. Transfert des autorisations des fichiers et dossiers. -Automatic retry on error: -Nouvelle tentative automatique en cas d'erreur : - -Retry count: -Nombre de tentatives : +Show hidden dialogs again +Réafficher les boîtes de dialogue masquées -Delay (in seconds): -Délai (en secondes) : +Show all permanently hidden dialogs and warning messages again +Réafficher en permanence les boîtes de dialogue et les avertissements Customize context menu: Personnaliser le menu contextuel : @@ -1264,12 +1288,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Description Description -Show hidden dialogs again -Réafficher les boîtes de dialogue masquées - -Show all permanently hidden dialogs and warning messages again -Réafficher en permanence les boîtes de dialogue et les avertissements - &Default &Défaut @@ -1324,24 +1342,36 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Activate offline Activez hors ligne +Highlight configurations that have not been run for more than the following number of days: +Signaler les configurations non exécutées depuis le nombre de jours suivant : + +Synchronization Settings +Configuration de la Synchronisation + +Access Online Storage +Accéder au stockage en ligne + Save as a Batch Job Enregistrer en tant que Fichier de Commandes Delete Items Supprimer les Éléments -Copy items -Copier les éléments +Copy Items +Copier les Éléménts Options Options Select Time Span -Sélection de l'Intervalle de Temps +Choix de l'Intervalle de Temps FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Signaler les configurations + &Options &Options @@ -1465,9 +1495,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Select time span... Choisir un intervalle de temps ... -Last session -Dernière session - Folder Comparison and Synchronization Comparaison de dossiers et Synchronisation @@ -1486,8 +1513,11 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Do&n't save &Ne pas Sauvegarder -Remove entry from list -Enlever un élément de la liste +Hide configuration +Masquer la configuration + +Highlight... +Signaler ... Clear filter Effacer les filtres @@ -1567,6 +1597,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Paused En pause +Stop requested... +Arrêt demandé ... + Initializing... Initialisation ... @@ -1576,9 +1609,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Comparing content... Comparaison du contenu ... -Completed -Terminé - Info Info @@ -1604,7 +1634,7 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Mot de passe : Key password: -Mot de passe clé : +Clé du mot de passe : Please enter a file path. Veuillez entrer un chemin d'accès. @@ -1660,12 +1690,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Parameters for opposite side Paramètres du côté opposé. -Show hidden dialogs and warning messages again? -Voulez-vous réafficher les boîtes de dialogues et les avertissements ? - -&Show -&Afficher - Downloading update... Téléchargement de la mise à jour ... @@ -1690,18 +1714,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Configure your own synchronization rules. Paramétrage de vos règles de synchronisation. -Synchronization Settings -Configuration de la Synchronisation - Comparison Comparaison Synchronization Synchronisation -Today -Aujourd'hui - This week Cette semaine @@ -1748,7 +1766,7 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. A la fin : On errors: -En cas d'ereur : +En cas d'erreur : On success: En cas de succès : @@ -1771,9 +1789,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Files Fichiers -Name -Nom - Percentage Pourcentage @@ -1885,15 +1900,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. %x heures - -1 day -%x days - - -%x jour -%x jours - - Cannot set privilege %x. Impossible de fixer le privilège %x. @@ -1907,7 +1913,7 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Impossible d'arrêter le système. Checking recycle bin failed for folder %x. -Echec de la vérification de la Corbeille pour le dossier %x. +Échec de la vérification de la Corbeille pour le dossier %x. The following XML elements could not be read: Les éléments XML suivants ne peuvent être lus : @@ -1957,8 +1963,11 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Desktop le Bureau -Start menu -le menu Démarrer +Start Menu +Menu de démarrage + +Send To +Envoyer vers Registering FreeFileSync file extensions Enregistrement des extensions de fichier FreeFileSync @@ -1987,6 +1996,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Please choose the local installation type or select a different folder for installation. Veuillez choisir le type d'installation locale ou sélectionner un autre dossier pour cette installation. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Le mode d'installation silencieuse n'est valable qu'en FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +L'option d'installation %x n'est disponible que dans FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/german.lng b/FreeFileSync/Build/Languages/german.lng index 1a0b13f9..b993aab4 100755 --- a/FreeFileSync/Build/Languages/german.lng +++ b/FreeFileSync/Build/Languages/german.lng @@ -764,8 +764,8 @@ Die Befehlszeile wird ausgelöst, wenn: Nothing to synchronize Es gibt nichts zu synchronisieren -Completed -Fertig +Completed successfully +Erfolgreich abgeschlossen Executing command %x Führe Befehl aus: %x @@ -992,6 +992,9 @@ Die Befehlszeile wird ausgelöst, wenn: Total bytes to copy Gesamtmenge der zu kopierenden Daten +Arrange folder pair +Ordnerpaar anordnen + Folder pair: Ordnerpaar: @@ -1084,11 +1087,14 @@ Die Befehlszeile wird ausgelöst, wenn: Naming convention: Namenskonvention: -&Ignore errors -&Fehler ignorieren +Ignore errors +Fehler ignorieren -Show pop-up on errors or warnings -Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen +Retry count: +Wiederholungen: + +Delay (in seconds): +Verzögerung (in Sekunden): Run a command after synchronization: Befehl nach Synchronisation ausführen: @@ -1096,9 +1102,6 @@ Die Befehlszeile wird ausgelöst, wenn: OK OK -Arrange folder pair -Ordnerpaar anordnen - Enter your login details: Anmeldedaten eingeben: @@ -1195,13 +1198,10 @@ Die Befehlszeile wird ausgelöst, wenn: Minimize to notification area In das Benachrichtigungsfeld minimieren -Bytes copied: -Kopierte Datenmenge: - When finished: Am Ende: -Auto-Close +Auto-close Automatisch schließen Close @@ -1225,6 +1225,9 @@ Die Befehlszeile wird ausgelöst, wenn: &Show error dialog &Zeige Fehlerdialog +Show pop-up on errors or warnings +Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen + &Cancel &Abbrechen @@ -1273,14 +1276,11 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert. Transfer file and folder permissions. Übertrage Datei- und Ordnerberechtigungen. -Automatic retry on error: -Automatische Wiederholung bei Fehlern: - -Retry count: -Wiederholungen: +Show hidden dialogs again +Versteckte Fenster wieder zeigen -Delay (in seconds): -Verzögerung (in Sekunden): +Show all permanently hidden dialogs and warning messages again +Alle dauerhaft versteckten Fenster und Warnmeldungen wieder anzeigen Customize context menu: Kontextmenü anpassen: @@ -1288,12 +1288,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert. Description Beschreibung -Show hidden dialogs again -Versteckte Fenster wieder zeigen - -Show all permanently hidden dialogs and warning messages again -Alle dauerhaft versteckten Fenster und Warnmeldungen wieder anzeigen - &Default &Standard @@ -1351,13 +1345,19 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert. Highlight configurations that have not been run for more than the following number of days: Konfigurationen hervorheben, die seit mehr als die folgende Anzahl an Tagen nicht mehr ausgeführt wurden: +Synchronization Settings +Synchronisationseinstellungen + +Access Online Storage +Auf Onlinespeicher zugreifen + Save as a Batch Job Als Batchauftrag speichern Delete Items Elemente löschen -Copy items +Copy Items Elemente kopieren Options @@ -1714,9 +1714,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert. Configure your own synchronization rules. Eigene Synchronisationsregeln definieren. -Synchronization Settings -Synchronisationseinstellungen - Comparison Vergleich @@ -1966,7 +1963,7 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert. Desktop Desktop -Start menu +Start Menu Startmenü Send To diff --git a/FreeFileSync/Build/Languages/greek.lng b/FreeFileSync/Build/Languages/greek.lng index d3565f61..d611c0df 100755 --- a/FreeFileSync/Build/Languages/greek.lng +++ b/FreeFileSync/Build/Languages/greek.lng @@ -59,11 +59,14 @@ Παρουσιάστηκε μια εξαίρεση A directory path is expected after %x. -Αναμένεται μια διαδρομή υποκαταλόγου μετά το %x. +Μετά το %x αναμένεται μια διαδρομή υποκαταλόγου. Syntax error Σφάλμα σύνταξης +A left and a right directory path are expected after %x. +Μετά το %x αναμένονται μια διαδρομή υποκαταλόγου αριστερά και μια δεξιά. + Cannot find file %x. Το αρχείο %x δεν μπορεί να βρεθεί. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Εάν αγνοηθεί αυτό το σφάλμα, οι φάκελοι θα θεωρηθούν κενοί. Φάκελοι που λείπουν θα δημιουργηθούν αυτόματα, όταν χρειαστούν. +Comparison finished: +Η σύγκριση ολοκληρώθηκε: + + +1 item found +%x items found + + +βρέθηκε 1 στοιχείο +βρέθηκαν %x στοιχεία + + File %x has an invalid date. Το αρχείο %x δεν έχει έγκυρη ημερομηνία. @@ -175,9 +190,6 @@ Using non-default global settings: Χρήση μη-προεπιλεγμένων γενικών ρυθμίσεων: -Starting comparison -Έναρξη της σύγκρισης - A folder input field is empty. Ένα πεδίο εισαγωγής φακέλων είναι άδειο. @@ -318,15 +330,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. Δεν ήταν δυνατή η μεταφορά του %x στον κάδο ανακύκλωσης. +Cannot find %x. +Το %x δεν μπορεί να βρεθεί. + Cannot open file %x. Δεν είναι δυνατό το άνοιγμα του αρχείου %x. Cannot find device %x. Η συσκευή %x δεν μπορεί να βρεθεί. -Cannot find %x. -Το %x δεν μπορεί να βρεθεί. - Type of item %x is not supported: Ο τύπος του στοιχείου %x δεν υποστηρίζεται: @@ -432,6 +444,9 @@ Actual: %y bytes Lock owner: Ιδιοκτήτης κλειδώματος: +Detecting abandoned lock... +Ανίχνευση κλειδώματος που εγκαταλείφθηκε... + 1 sec %x sec @@ -441,9 +456,6 @@ Actual: %y bytes %x δ/λεπτα -Detecting abandoned lock... -Ανίχνευση κλειδώματος που εγκαταλείφθηκε... - Items processed: Επεξεργάστηκαν στοιχεία: @@ -456,8 +468,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. Σφάλμα κατά την ανάλυση του αρχείου %x, γραμμή %y, στήλη %z. -Cannot set directory lock for %x. -Ο υποκατάλογος για το %x δεν μπορεί να κλειδωθεί. +Cannot set directory locks for the following folders: +Δεν μπορούν να κλειδωθούν οι ακόλουθοι υποκατάλογοι: 1 thread @@ -498,9 +510,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. Το όνομα τόμου %x δεν είναι μέρος της διαδρομής %y. -Stop requested: Waiting for current operation to finish... -Αίτημα για διακοπή: Αναμονή για την ολοκλήρωση της τρέχουσας εργασίας... - Unable to create time stamp for versioning: Δεν ήταν δυνατή η δημιουργία χρονικής σήμανσης για τη διατήρηση παλιών εκδόσεων: @@ -513,6 +522,9 @@ Actual: %y bytes Select a folder Επιλογή φακέλου +&New +&Δημιουργία + &Open... Ά&νοιγμα... @@ -728,26 +740,23 @@ The command is triggered if: job name όνομα ενέργειας -Show summary -Εμφάνιση σύνοψης +System: Sleep +Σύστημα: Αναστολή λειτουργίας -Sleep -Αναστολή λειτουργίας +System: Shut down +Σύστημα: Τερματισμός λειτουργίας -Shut down -Τερματισμός λειτουργίας - -Synchronization stopped -Διακοπή του συγχρονισμού +Cleaning up old log files... +Καθαρισμός των παλιών αρχείων καταγραφής... Stopped Διακοπή -Synchronization completed with errors -Ο συγχρονισμός ολοκληρώθηκε με σφάλματα +Completed with errors +Ολοκληρώθηκε με σφάλματα -Synchronization completed with warnings -Ο συγχρονισμός ολοκληρώθηκε με προειδοποιήσεις +Completed with warnings +Ολοκληρώθηκε με προειδοποιήσεις Warning Προειδοποίηση @@ -755,15 +764,12 @@ The command is triggered if: Nothing to synchronize Δεν υπάρχει τίποτα προς συγχρονισμό -Synchronization completed successfully -Ο συγχρονισμός ολοκληρώθηκε επιτυχώς +Completed successfully +Ολοκληρώθηκε επιτυχώς Executing command %x Εκτέλεση εντολής %x -Cleaning up old log files... -Καθαρισμός των παλιών αρχείων καταγραφής... - You can switch to FreeFileSync's main window to resolve this issue. Μπορείτε να επιστρέψετε στο κύριο παράθυρο του FreeFileSync για να επιλύσετε αυτό το θέμα. @@ -779,14 +785,8 @@ The command is triggered if: Switching to FreeFileSync's main window Επιστροφή στο κύριο παράθυρο του FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Αυτόματη επανάληψη σε 1 δευτερόλεπτο... -Αυτόματη επανάληψη σε %x δευτερόλεπτα... - +Automatic retry +Αυτόματη επανάληψη Ignore &all Παράβλεψη ό&λων @@ -797,6 +797,27 @@ The command is triggered if: Serious Error Σοβαρό Σφάλμα +Last session +Τελευταία χρήση + +Today +Σήμερα + + +1 day +%x days + + +1 μέρα +%x μέρες + + +Name +Όνομα + +Last sync +Τελ. συγχρ. + Folder Φάκελος @@ -860,9 +881,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. Παρακαλούμε επιλέξτε ένα φάκελο σε ένα τοπικό σύστημα αρχείων, σε ένα δίκτυο ή σε μια συσκευή MTP. -&New -&Δημιουργία - &Save &Αποθήκευση @@ -974,6 +992,9 @@ The command is triggered if: Total bytes to copy Συνολικός αριθμός bytes προς αντιγραφή +Arrange folder pair +Οργάνωση του ζεύγους φακέλων: + Folder pair: Ζεύγος φακέλων: @@ -1066,11 +1087,14 @@ The command is triggered if: Naming convention: Κανόνας ονοματοθεσίας: -&Ignore errors -&Παράβλεψη σφαλμάτων +Ignore errors +Αγνόηση σφαλμάτων -Show pop-up on errors or warnings -Εμφάνιση αναδυόμενου παράθυρου σε σφάλματα ή προειδοποιήσεις +Retry count: +Αριθμός προσπαθειών: + +Delay (in seconds): +Καθυστέρηση (σε δευτερόλεπτα): Run a command after synchronization: Εκτέλεση εντολής μετά το συγχρονισμό: @@ -1078,9 +1102,6 @@ The command is triggered if: OK OK -Arrange folder pair -Οργάνωση του ζεύγους φακέλων: - Enter your login details: Εισάγετε τις λεπτομέρεις της σύνδεσης: @@ -1177,12 +1198,12 @@ The command is triggered if: Minimize to notification area Ελαχιστοποίηση στην περιοχή ειδοποιήσεων -Bytes copied: -Bytes που αντιγράφτηκαν: - When finished: Μετά την ολοκλήρωση: +Auto-close +Αυτόματο κλείσιμο + Close Κλείσιμο @@ -1195,12 +1216,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Δημιουργία ενός αρχείου δέσμης για αυτόματο συγχρονισμό. Για να ξεκινήσετε, κάντε διπλό κλικ σε αυτό το αρχείο ή ενσωματώστε το σε ένα χρονοδιάγραμμα εργασιών: %x +Progress dialog: +Εμφάνιση προόδου: + Run minimized Εκκίνηση σε ελαχιστοποιημένο παράθυρο &Show error dialog Εμ&φάνιση ειδοποιήσεων σφαλμάτων +Show pop-up on errors or warnings +Εμφάνιση αναδυόμενου παράθυρου σε σφάλματα ή προειδοποιήσεις + &Cancel Α&κύρωση @@ -1249,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. Μεταφορά των δικαιωμάτων πρόσβασης αρχείων και φακέλων. -Automatic retry on error: -Αυτόματη επανάληψη σε περίπτωση σφάλματος: - -Retry count: -Αριθμός προσπαθειών: +Show hidden dialogs again +Επανεμφάνιση των κρυμμένων ειδοποιήσεων -Delay (in seconds): -Καθυστέρηση (σε δευτερόλεπτα): +Show all permanently hidden dialogs and warning messages again +Επανεμφάνιση όλων των μόνιμα κρυμμένων ειδοποιήσεων και προειδοποιητικών μηνυμάτων Customize context menu: Προσαρμογή μενού περιβάλλοντος: @@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error. Description Περιγραφή -Show hidden dialogs again -Επανεμφάνιση των κρυμμένων ειδοποιήσεων - -Show all permanently hidden dialogs and warning messages again -Επανεμφάνιση όλων των μόνιμα κρυμμένων ειδοποιήσεων και προειδοποιητικών μηνυμάτων - &Default &Προεπιλογή @@ -1324,13 +1342,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline Ενεργοποίηση χωρίς σύνδεση +Highlight configurations that have not been run for more than the following number of days: +Επισήμανση παραμέτρων συγχρονισμού που δεν έχουν εκτελεστεί για μεγαλύτερο από τον ακόλουθο αριθμό ημερών: + +Synchronization Settings +Ρυθμίσεις συγχρονισμού + +Access Online Storage +Πρόσβαση στο χώρο αποθήκευσης online + Save as a Batch Job Αποθήκευση ως Δέσμη Ενεργειών Delete Items Διαγραφή Στοιχείων -Copy items +Copy Items Αντιγραφή Στοιχείων Options @@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition Έκδοση Δωρητή του FreeFileSync +Highlight Configurations +Επισήμανση Παραμέτρων + &Options &Επιλογές @@ -1465,9 +1495,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... Επιλέξτε το χρονικό εύρος... -Last session -Τελευταία χρήση - Folder Comparison and Synchronization Σύγκριση Φακέλων και Συγχρονισμός @@ -1486,8 +1513,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save Να &μην αποθηκευθούν -Remove entry from list -Αφαίρεση καταχώρησης από τον κατάλογο +Hide configuration +Απόκρυψη παραμέτρων συγχρονισμού + +Highlight... +Επισήμανση... Clear filter Καθαρισμός φίλτρου @@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error. Paused Σε παύση +Stop requested... +Αίτημα για διακοπή... + Initializing... Αρχικοποίηση... @@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... Σύγκριση του περιεχομένου... -Completed -Ολοκληρώθηκε - Info Πληροφορίες @@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side Παράμετροι για την απέναντι πλευρά -Show hidden dialogs and warning messages again? -Να εμφανίζονται οι κρυμμένες ειδοποιήσεις και προειδοποιητικά μηνύματα; - -&Show -&Εμφάνιση - Downloading update... Λήψη ενημέρωσης... @@ -1690,18 +1714,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. Ορίστε τους δικούς σας κανόνες συγχρονισμού. -Synchronization Settings -Ρυθμίσεις συγχρονισμού - Comparison Σύγκριση Synchronization Συγχρονισμός -Today -Σήμερα - This week Αυτήν την εβδομάδα @@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error. Files Αρχεία -Name -Όνομα - Percentage Ποσοστό @@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error. %x ώρες - -1 day -%x days - - -1 μέρα -%x μέρες - - Cannot set privilege %x. Τα δικαιώματα %x δεν μπορούν να οριστούν. @@ -1957,8 +1963,11 @@ This guarantees a consistent state even in case of a serious error. Desktop Επιφάνεια εργασίας -Start menu -Μενού έναρξης +Start Menu +Μενού "Έναρξη" + +Send To +Αποστολή Προς Registering FreeFileSync file extensions Καταχώρηση των επεκτάσεων των αρχείων του FreeFileSync @@ -1987,6 +1996,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. Παρακαλούμε επιλέξτε την τοπική εγκατάσταση ή επιλέξτε έναν διαφορετικό φάκελο για εγκατάσταση. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Η λειτουργία σιωπηρής εγκατάστασης είναι διαθέσιμη μόνο στην Έκδοση Δωρητή FreeFileSync. +The %x installation option is only available in the FreeFileSync Donation Edition. +Η επιλογή εγκατάστασης %x είναι διαθέσιμη μόνο στην Έκδοση Δωρητή του FreeFileSync. diff --git a/FreeFileSync/Build/Languages/hebrew.lng b/FreeFileSync/Build/Languages/hebrew.lng index 9ae0aab3..a8157cc9 100755 --- a/FreeFileSync/Build/Languages/hebrew.lng +++ b/FreeFileSync/Build/Languages/hebrew.lng @@ -64,6 +64,9 @@ Syntax error שגיאת תחביר +A left and a right directory path are expected after %x. +נתיב מחיצה שמאלי וימני נדרשים לאחר %x. + Cannot find file %x. לא מוצא קובץ %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. אם תתעלם משגיאה זו התיקיות יחשבו כריקות. תיקיות חסרות נוצרות באופן אוטומטי כאשר נדרש. +Comparison finished: +ההשוואה הסתיימה: + + +1 item found +%x items found + + +פריט 1 נמצא +%x פריטים נמצאו + + File %x has an invalid date. קובץ %x מכיל תאריך שגוי. @@ -175,9 +190,6 @@ Using non-default global settings: משתמש בהגדרות כלליות שאינן ברירת מחדל: -Starting comparison -מתחיל השוואה - A folder input field is empty. שדה קלט תיקייה ריק. @@ -318,15 +330,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. לא יכול להעביר את %x לסל המחזור. +Cannot find %x. +לא מוצא %x. + Cannot open file %x. לא יכול לפתוח קובץ %x. Cannot find device %x. לא מוצא התקן %x. -Cannot find %x. -לא מוצא %x. - Type of item %x is not supported: סוג של פריט %x אינו נתמך: @@ -432,6 +444,9 @@ Actual: %y bytes Lock owner: בעלים נעול: +Detecting abandoned lock... +מגלה נעילה נטושה... + 1 sec %x sec @@ -441,9 +456,6 @@ Actual: %y bytes %x שניות -Detecting abandoned lock... -מגלה נעילה נטושה... - Items processed: אלמנטים עובדו: @@ -456,8 +468,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. שגיאה בפענוח קובץ %x, שורה %y, טור %z. -Cannot set directory lock for %x. -לא ניתן לנעול מחיצה עבור %x. +Cannot set directory locks for the following folders: +אין אפשרות להגדיר נעילות מחיצה עבור התיקיות הבאות: 1 thread @@ -498,9 +510,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. כרך בשם %x אינו חלק של נתיב קובץ %y. -Stop requested: Waiting for current operation to finish... -עצירה התבקשה: מחכה שפעולה נוכחית תסתיים... - Unable to create time stamp for versioning: לא ניתן ליצור תג זמן לגרסאות: @@ -513,6 +522,9 @@ Actual: %y bytes Select a folder בחר תיקייה +&New +&חדש + &Open... &פתח... @@ -728,26 +740,23 @@ The command is triggered if: job name שם משימה -Show summary -הצג תקציר +System: Sleep +מערכת: שינה -Sleep -שינה +System: Shut down +מערכת: כיבוי -Shut down -כבה מחשב - -Synchronization stopped -סנכרון הופסק +Cleaning up old log files... +מנקה קבצי יומן ישנים... Stopped נעצר -Synchronization completed with errors -סנכרון הושלם עם שגיאות +Completed with errors +הסתיים עם שגיאות -Synchronization completed with warnings -סנכרון הסתיים עם אזהרות +Completed with warnings +הסתיים עם אזהרות Warning אזהרה @@ -755,15 +764,12 @@ The command is triggered if: Nothing to synchronize אין מה לסנכרן -Synchronization completed successfully -סנכרון הסתיים בהצלחה +Completed successfully +הסתיים בהצלחה Executing command %x מבצע פקודה %x -Cleaning up old log files... -מנקה קבצי יומן ישנים... - You can switch to FreeFileSync's main window to resolve this issue. ניתן לעבור לחלון הראשי של FreeFileSync כדי לפתור את הסוגיה הזו. @@ -779,14 +785,8 @@ The command is triggered if: Switching to FreeFileSync's main window מעבר אל החלון הראשי של FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -נסיון מחדש אוטומטי בתוך שניה 1... -נסיון מחדש אוטומטי בתוך %x שניות... - +Automatic retry +נסיון חוזר באופן אוטומטי Ignore &all התעלם &מהכל @@ -797,6 +797,27 @@ The command is triggered if: Serious Error שגיאה חמורה +Last session +פעילות אחרונה + +Today +היום + + +1 day +%x days + + +1 יום +%x ימים + + +Name +שם + +Last sync +סינכרון אחרון + Folder תיקייה @@ -860,9 +881,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. אנא בחר תיקייה במערכת הקבצים המקומית, ברשת או בהתקן MTP. -&New -&חדש - &Save &שמור @@ -974,6 +992,9 @@ The command is triggered if: Total bytes to copy סה"כ בתים להעתיק +Arrange folder pair +סדר זוג תיקיות + Folder pair: זוג תיקיות: @@ -1066,11 +1087,14 @@ The command is triggered if: Naming convention: מוסכמות לקביעת שמות: -&Ignore errors -&התעלם משגיאות +Ignore errors +התעלם משגיאות -Show pop-up on errors or warnings -הראה חלונות מוקפצים עבור שגיאות או אזהרות +Retry count: +מונה נסיונות חוזרים: + +Delay (in seconds): +השהייה (בשניות): Run a command after synchronization: הרץ פקודה לאחר סינכרון: @@ -1078,9 +1102,6 @@ The command is triggered if: OK אשר -Arrange folder pair -סדר זוג תיקיות - Enter your login details: הזן את פרטי הגישה שלך: @@ -1177,12 +1198,12 @@ The command is triggered if: Minimize to notification area הקטן לאיזור ההתרעות -Bytes copied: -בתים שהועתקו: - When finished: לאחר הסיום: +Auto-close +סגירה באופן אוטומטי + Close סגור @@ -1195,12 +1216,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x צור קובץ אצווה לסינכרון ללא התערבות מפעיל. כדי להפעיל, הקלק הקלקה כפולה על הקובץ או תזמן במתכנן המשימות: %x +Progress dialog: +דושיח התקדמות: + Run minimized הרץ ממוזער &Show error dialog &הצג דו-שיח שגיאה +Show pop-up on errors or warnings +הראה חלונות מוקפצים עבור שגיאות או אזהרות + &Cancel &ביטול @@ -1249,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. הרשאות העברת קובץ ותיקייה. -Automatic retry on error: -נסיון חוזר אוטומטי במקרה שגיאה: - -Retry count: -מונה נסיונות חוזרים: +Show hidden dialogs again +הראה שוב דיאלוגים נסתרים -Delay (in seconds): -השהייה (בשניות): +Show all permanently hidden dialogs and warning messages again +הראה שוב את כל הדיאלוגים והודאות האזהרה המוסתרים באופן קבוע Customize context menu: התאמה אישית של תפריט הקשר: @@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error. Description תאור -Show hidden dialogs again -הראה שוב דיאלוגים נסתרים - -Show all permanently hidden dialogs and warning messages again -הראה שוב את כל הדיאלוגים והודאות האזהרה המוסתרים באופן קבוע - &Default &ברירת מחדל @@ -1324,13 +1342,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline הפעלה בלתי מקוונת +Highlight configurations that have not been run for more than the following number of days: +הדגש תצורות שלא הופעלו למשך יותר ממספר הימים הבא: + +Synchronization Settings +הגדרות סנכרון + +Access Online Storage +גישה לאחסון מקוון + Save as a Batch Job שמור כמשימת אצווה Delete Items מחק פריטים -Copy items +Copy Items העתק פריטים Options @@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition מהדורת תרומות של FreeFileSync +Highlight Configurations +הדגש תצורות + &Options &אפשרויות @@ -1465,9 +1495,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... בחר תחום זמן... -Last session -פעילות אחרונה - Folder Comparison and Synchronization סנכרון קבצים ותיקיות @@ -1486,8 +1513,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save אל &תשמור -Remove entry from list -הסר פריט מרשימה +Hide configuration +הסתר תצורה + +Highlight... +הדגש... Clear filter נקה מסנן @@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error. Paused עצור +Stop requested... +עצור בקשה... + Initializing... מאתחל ... @@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... משווה תכולה... -Completed -הושלם - Info מידע @@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side פרמטרים עבור צד נגדי -Show hidden dialogs and warning messages again? -להראות שוב את הדיאלוגים והודעות האזהרה המוסתרים? - -&Show -&הראה - Downloading update... מוריד עדכון... @@ -1690,18 +1714,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. סדר את כללי הסנכרון שלך. -Synchronization Settings -הגדרות סנכרון - Comparison השוואה Synchronization סינכרון -Today -היום - This week בשבוע הנוכחי @@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error. Files קבצים -Name -שם - Percentage אחוז @@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error. %x שעות - -1 day -%x days - - -1 יום -%x ימים - - Cannot set privilege %x. לא יכול להגדיר זבות %x. @@ -1957,9 +1963,12 @@ This guarantees a consistent state even in case of a serious error. Desktop שולחן עבודה -Start menu +Start Menu תפריט התחל +Send To +שלח אל + Registering FreeFileSync file extensions רושם את סיומות הקבצים של FreeFileSync. @@ -1987,6 +1996,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. בבקשה בחר התקנה מקומית או בחר תיקייה אחרת להתקנה. -The silent installation mode is only available in the FreeFileSync Donation Edition. -התקנה שקטה אפשרית רק במהדורת התרומות של FreeFileSync. +The %x installation option is only available in the FreeFileSync Donation Edition. +אפשרת התקנה %x זמינה רק במהדורת תרומות של FreeFileSync. diff --git a/FreeFileSync/Build/Languages/hindi.lng b/FreeFileSync/Build/Languages/hindi.lng index f15e5522..be7a4d4a 100755 --- a/FreeFileSync/Build/Languages/hindi.lng +++ b/FreeFileSync/Build/Languages/hindi.lng @@ -26,7 +26,7 @@ फ़ाइल %x बनाई जा रही है Creating folder %x -फ़ोल्डर %x बनाया हा रहा है +निर्देशिका %x बनायी जा रही है Creating symbolic link %x प्रतीकात्मक कड़ी %x बनाया जा रहा है @@ -35,7 +35,7 @@ %x फ़ाइल को रीसायकल बिन में ले जाया जा रहा है Moving folder %x to the recycle bin -%x फ़ोल्डर को रीसायकल बिन में ले जाया जा रहा है +%x निर्देशिका को रीसायकल बिन में ले जाया जा रहा है Moving symbolic link %x to the recycle bin %x प्रतीकात्मक कड़ी को रीसायकल बिन में ले जाया जा रहा है @@ -44,13 +44,13 @@ %x फ़ाइल हटाया जा रहा है Deleting folder %x -%x फ़ोल्डर हटाया जा रहा है +%x निर्देशिका हटाया जा रहा है Deleting symbolic link %x %x प्रतीकात्मक कड़ी हटाया जा रहा है Checking recycle bin availability for folder %x... -%x फ़ोल्डर के लिए रीसायकल बिन की उपलब्धता की जाँच हो रही है... +%x निर्देशिका के लिए रीसायकल बिन की उपलब्धता की जाँच हो रही है... The recycle bin is not supported by the following folders. Deleted or overwritten files will not be able to be restored: रीसायकल बिन निम्न फ़ोलडर्स द्वारा समर्थित नहीं है। हटायी गई या अधिलेखित फ़ाइल्स पुनर्स्थापित नहीं होगी: @@ -59,11 +59,14 @@ कोई अपवाद हुआ A directory path is expected after %x. -%x के बाद कोई फ़ोल्डर पथ अपेक्षित है। +%x के बाद कोई निर्देशिका पथ अपेक्षित है। Syntax error वाक्य-विन्यास त्रुटि +A left and a right directory path are expected after %x. +%x के बाद कोई दाया और कोई बाया निर्देशिका पथ अपेक्षित है। + Cannot find file %x. फ़ाइल %x नहीं मिली। @@ -113,7 +116,19 @@ निम्न फ़ोलडर्स नहीं मिले: If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. -इस त्रुटि को अनदेखा कर दिया जाता है तो फ़ोल्डरों को खाली माना जाएगा। अनुपस्थित फ़ोलडर्स आवश्यकता होने पर स्वचालित रूप से बनाए जाते हैं। +इस त्रुटि को अनदेखा कर दिया जाता है तो निर्देशिकाओं को खाली माना जाएगा। अनुपस्थित फ़ोलडर्स आवश्यकता होने पर स्वचालित रूप से बनाए जाते हैं। + +Comparison finished: +तुलना पूर्ण हुई: + + +1 item found +%x items found + + +1 आइटम मिला +%x आइटम्स मिले + File %x has an invalid date. %x फ़ाइल का दिनांक अवैध है। @@ -161,7 +176,7 @@ फ़ाइल समय टॉलरेंस (छूट) Folder access timeout -फ़ोल्डर पहुँच काल समापन +निर्देशिका पहुँच काल समापन Run with background priority पृष्ठभूमि प्राथमिकता के साथ चलाएँ @@ -175,23 +190,20 @@ Using non-default global settings: गैर-डिफ़ॉल्ट वैश्विक सेटिंग्स प्रयोग करें: -Starting comparison -तुलना शुरू हो रही है - A folder input field is empty. -कोई फ़ोल्डर इनपुट प्रविष्टि खाली है। +कोई निर्देशिका इनपुट प्रविष्टि खाली है। The corresponding folder will be considered as empty. -तद्नुरूप फ़ोल्डर को खाली माना जाएगा। +तद्नुरूप निर्देशिका को खाली माना जाएगा। Exclude: वर्जित करें: One base folder of a folder pair is contained in the other one. -फ़ोल्डर जोड़ी में से एक आधार फ़ोल्डर दूसरे में निहित है। +निर्देशिका जोड़ी में से एक आधार निर्देशिका दूसरे में निहित है। The folder should be excluded from synchronization via filter. -फ़ोल्डर को सिंक्रनाइज़ेशन से फ़िल्टर द्वारा अपवर्जित किया जाना चाहिए। +निर्देशिका को सिंक्रनाइज़ेशन से फ़िल्टर द्वारा अपवर्जित किया जाना चाहिए। Calculating sync directions... सिंक्रनाइज़ेशन दिशा का परिकलन हो रहा है... @@ -271,7 +283,7 @@ Actual: %y bytes %x की अनुमतियां लिख नहीं सकते। Operation not supported for different base folder types. -भिन्न आधार फ़ोल्डर प्रकारों के लिए कार्यवाई समर्थित नहीं। +भिन्न आधार निर्देशिका प्रकारों के लिए कार्यवाई समर्थित नहीं। Cannot write file %x. फ़ाइल %x लिखने में असमर्थ। @@ -318,15 +330,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. %x को रीसायकल बिन ले जाने में असमर्थ। +Cannot find %x. +%x नहीं मिला। + Cannot open file %x. %x फ़ाइल को खोलने में असमर्थ। Cannot find device %x. डिवाइस %x नहीं मिला। -Cannot find %x. -%x नहीं मिला। - Type of item %x is not supported: %x प्रकार का आइटम समर्थित नहीं है: @@ -418,20 +430,23 @@ Actual: %y bytes फ़ाइल %x सहेजी जा रही है... Searching for folder %x... -फ़ोल्डर %x की खोज हो रही है... +निर्देशिका %x की खोज हो रही है... Timeout while searching for folder %x. -फ़ोल्डर %x की खोज करते हुए काल समाप्त हआ। +निर्देशिका %x की खोज करते हुए काल समाप्त हआ। Cannot get process information. प्रक्रिया जानकारी प्राप्त करने में असमर्थ। Waiting while directory is locked: -प्रतीक्षारत जब कि फ़ोल्डर अवरोधित है: +प्रतीक्षारत जब कि निर्देशिका अवरोधित है: Lock owner: स्वामी अवरोध करें: +Detecting abandoned lock... +अपसर्जित अवरोध पता लगाया जा रहा है... + 1 sec %x sec @@ -441,9 +456,6 @@ Actual: %y bytes %x सेकंड्स -Detecting abandoned lock... -अपसर्जित अवरोध पता लगाया जा रहा है... - Items processed: संसाधित आइटम्स: @@ -456,8 +468,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. फ़ाइल %x, पंक्ति %y, स्तंभ %z पदच्छेदन में त्रुटि। -Cannot set directory lock for %x. -%x के लिए निर्देशिका अवरोध सेट नहीं कर सकते। +Cannot set directory locks for the following folders: +निम्न निर्देशिकाओं के लिए निर्देशिका अवरोध सेट नहीं कर सकते: 1 thread @@ -498,9 +510,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. %x वॉल्यूम नाम %y फ़ाइल पथ का हिस्सा नहीं है। -Stop requested: Waiting for current operation to finish... -रोकने का अनुरोध हुआ: वर्तमान कार्यवाई पूर्ण होने की प्रतीक्षा में... - Unable to create time stamp for versioning: संस्करण के लिए समय मोहर बनाने में असमर्थ: @@ -508,10 +517,13 @@ Actual: %y bytes ड्रॅग एण्ड ड्रॉप Cannot find folder %x. -फ़ोल्डर %x नहीं मिला। +निर्देशिका %x नहीं मिला। Select a folder -फ़ोल्डर चुनें +निर्देशिका चुनें + +&New +नया (&N) &Open... खोलें (&O)... @@ -553,10 +565,10 @@ Actual: %y bytes इन फ़ोलडर्स की निगरानी होगी: Add folder -फ़ोल्डर जोडें +निर्देशिका जोडें Remove folder -फ़ोल्डर निकालें +निर्देशिका निकालें Browse ब्राउज़ @@ -645,7 +657,7 @@ The command is triggered if: फ़ाइल %x को %y यहाँ ले जाया जा रहा है Moving folder %x to %y -फ़ोल्डर %x को %y यहाँ ले जाया जा रहा है +निर्देशिका %x को %y यहाँ ले जाया जा रहा है Moving symbolic link %x to %y प्रतीकात्मक कड़ी %x को %y यहाँ ले जाया जा रहा है @@ -678,22 +690,22 @@ The command is triggered if: %x के लिए वॉल्यूम शॅडो प्रतिलिपि बनाई जा रही है... Target folder %x already existing. -गंतव्य फ़ोल्डर %x पहले से ही विद्यमान। +गंतव्य निर्देशिका %x पहले से ही विद्यमान। Target folder input field must not be empty. -गंतव्य फ़ोल्डर प्रविष्टि खाली नहीं हो सकती। +गंतव्य निर्देशिका प्रविष्टि खाली नहीं हो सकती। Source folder %x not found. -स्रोत फ़ोल्डर %x नहीं मिला। +स्रोत निर्देशिका %x नहीं मिला। Please enter a target folder for versioning. -कृपया संस्करण करने के लिए गंतव्य फ़ोल्डर प्रविष्ट करें। +कृपया संस्करण करने के लिए गंतव्य निर्देशिका प्रविष्ट करें। The following items have unresolved conflicts and will not be synchronized: निम्न आइटम्स में हल नहीं किये गए विरोध हैं और वे सिंक्रनाइज़ नहीं होंगे: The following folders are significantly different. Please check that the correct folders are selected for synchronization. -निम्न फ़ोल्डर्स उल्लेखनीय रूप से भिन्न हैं। कृपया सुनिश्चित करें की सिंक्रनाइज़ेशन के लिए चुने फ़ोल्डर्स उचित हैं। +निम्न निर्देशिकाएँ उल्लेखनीय रूप से भिन्न हैं। कृपया सुनिश्चित करें की सिंक्रनाइज़ेशन के लिए चुनी निर्देशिकाएँ उचित हैं। Not enough free disk space available in: यहाँ पर्याप्त खाली डिस्क जगह उपलब्ध नहीं: @@ -702,22 +714,22 @@ The command is triggered if: उपलब्ध: Some files will be synchronized as part of multiple base folders. -कुछ फ़ाइल्स को एकाधिक आधार फ़ोल्डर्स के भाग के रूप में सिंक्रनाइज़ किया जाएगा। +कुछ फ़ाइल्स को एकाधिक आधार निर्देशिकाओं के भाग के रूप में सिंक्रनाइज़ किया जाएगा। To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -विरोधों से बचने के लिए अपवर्जित फ़िल्टर्स सेट करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक ही आधार फ़ोल्डर से मानी जाएगी। +विरोधों से बचने के लिए अपवर्जित फ़िल्टर्स सेट करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक ही आधार निर्देशिका से मानी जाएगी। Versioning folder: -संस्करण फ़ोल्डर: +संस्करण निर्देशिका: Base folder: -आधार फ़ोल्डर: +आधार निर्देशिका: The versioning folder is contained in a base folder. -संस्करण फ़ोल्डर आधार फ़ोल्डर में निहित है। +संस्करण निर्देशिका आधार निर्देशिका में निहित है। Synchronizing folder pair: -यह फ़ोल्डर जोडा सिंक्रनाइज़ हो रहा है: +यह निर्देशिका जोडा सिंक्रनाइज़ हो रहा है: Generating database... डेटाबेस बनाया जा रहा है... @@ -728,26 +740,23 @@ The command is triggered if: job name कार्य नाम -Show summary -सारांश दिखाएं +System: Sleep +सिस्टम: स्लीप -Sleep -स्लीप +System: Shut down +सिस्टम: बंद करें -Shut down -बंद करें - -Synchronization stopped -सिंक्रनाइज़ेशन बंद कर दिया गया +Cleaning up old log files... +पुराने लॉग फ़ाइल्स की सफाई हो रही है... Stopped रुका -Synchronization completed with errors -सिंक्रनाइज़ेशन त्रुटियों सहित पूरा हुआ +Completed with errors +त्रुटियों सहित पूर्ण हुआ -Synchronization completed with warnings -सिंक्रनाइज़ेशन चेतावनियों सहित पूरा हुआ +Completed with warnings +चेतावनियों सहित पूर्ण हुआ Warning चेतावनी @@ -755,15 +764,12 @@ The command is triggered if: Nothing to synchronize सिंक्रनाइज़ करने के लिए कुछ नहीं -Synchronization completed successfully -सिंक्रनाइज़ेशन सफलतापूर्वक पूरा हुआ +Completed successfully +सफलतापूर्वक पूर्ण हुआ Executing command %x कार्यान्वित आदेश %x -Cleaning up old log files... -पुराने लॉग फ़ाइल्स की सफाई हो रही है... - You can switch to FreeFileSync's main window to resolve this issue. इस समस्या को हल करने के लिए आप FreeFileSync के मुख्य विंडो में जा सकते हैं। @@ -779,14 +785,8 @@ The command is triggered if: Switching to FreeFileSync's main window FreeFileSync के मुख्य विंडो में जाएं - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -स्वचालित पुनःप्रयास 1 सेकंड में... -स्वचालित पुनःप्रयास %x सेकंड में... - +Automatic retry +स्वचालित पुनःप्रयास Ignore &all सभी अनदेखा करें (&a) @@ -797,8 +797,29 @@ The command is triggered if: Serious Error गंभीर त्रुटि +Last session +पिछला सत्र + +Today +आज + + +1 day +%x days + + +1 दिन +%x दिन + + +Name +नाम + +Last sync +पिछला सिंक + Folder -फ़ोल्डर +निर्देशिका Symlink सिमलिंक @@ -860,9 +881,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. स्थानीय फ़ाइल सिस्टम, नेटवर्क या MTP डिव्हाइस पर कोई निर्देशिका चुनें। -&New -नया (&N) - &Save सहेजें (&S) @@ -921,10 +939,10 @@ The command is triggered if: सिंक्रनाइज़ Add folder pair -फ़ोल्डर जोडा जोडें +निर्देशिका जोडा जोडें Remove folder pair -फ़ोल्डर जोडा निकालें +निर्देशिका जोडा निकालें Access online storage ऑनलाइन संग्रहण पहुँच प्राप्त करें @@ -974,8 +992,11 @@ The command is triggered if: Total bytes to copy कॉपी करने के लिए कुल बाइट्स +Arrange folder pair +निर्देशिका जोडा व्यवस्थित करें + Folder pair: -फ़ोल्डर जोडा: +निर्देशिका जोडा: Main settings: मुख्य सेटिंग्स: @@ -1032,7 +1053,7 @@ The command is triggered if: अधिकतम: Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair. -सिंक्रनाइज़ेशन से कुछ फ़ाइल्स को वर्जित करने के लिए फ़िल्टर नियमों का चयन करें। फ़ाइल पथों को उनके तद्नुरूप फ़ोल्डर जोडों के सापेक्ष प्रविष्ट करें। +सिंक्रनाइज़ेशन से कुछ फ़ाइल्स को वर्जित करने के लिए फ़िल्टर नियमों का चयन करें। फ़ाइल पथों को उनके तद्नुरूप निर्देशिका जोडों के सापेक्ष प्रविष्ट करें। C&lear हटाएं (&l) @@ -1066,11 +1087,14 @@ The command is triggered if: Naming convention: नामकरण नीति: -&Ignore errors -त्रुटियों को अनदेखा करें (&I) +Ignore errors +त्रुटियों को अनदेखा करें -Show pop-up on errors or warnings -त्रुटियों या चेतावनियों पर पॉप-अप दिखाएं +Retry count: +पुनः प्रयास गणनांक: + +Delay (in seconds): +विलंब (सेकंड में): Run a command after synchronization: सिंक्रनाइज़ेशन के बाद कोई आदेश चलाएँ: @@ -1078,9 +1102,6 @@ The command is triggered if: OK ठीक -Arrange folder pair -फ़ोल्डर जोडा व्यवस्थित करें - Enter your login details: अपना लॉगिन विवरण प्रविष्ट करें: @@ -1145,7 +1166,7 @@ The command is triggered if: सर्वर पर कोई निर्देशिका चुनें: Select Folder -फ़ोल्डर चुनें +निर्देशिका चुनें Start synchronization now? अब सिंक्रनाइज़ेशन शुरू करें? @@ -1177,12 +1198,12 @@ The command is triggered if: Minimize to notification area सूचना क्षेत्र में मिनिमाइज़ करें -Bytes copied: -बाइट प्रतिलिपित: - When finished: समाप्त होने पर: +Auto-close +स्वचालित-बंद + Close बंद करें @@ -1195,12 +1216,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x उपस्थिति निरपेक्ष सिंक्रनाइज़ेशन के लिए बॅच फ़ाइल बनाएं। शुरू करने के लिए, किसी कार्य योजनाकार में यह फ़ाइल या अनुसूची डबल क्लिक करें: %x +Progress dialog: +प्रगति संवाद बॉक्स: + Run minimized छोटा (मिनिमाइज़) कर के चलाएँ &Show error dialog त्रुटी संवाद बॉक्स दिखाएँ (&S) +Show pop-up on errors or warnings +त्रुटियों या चेतावनियों पर पॉप-अप दिखाएं + &Cancel रद्द करें (&C) @@ -1247,16 +1274,13 @@ This guarantees a consistent state even in case of a serious error. व्यवस्थापक विशेषाधिकार आवश्यक Transfer file and folder permissions. -फ़ाइल और फ़ोल्डर अनुमतियाँ स्थानांतर करें। - -Automatic retry on error: -त्रुटि पर स्वचालित पुनः प्रयास करें: +फ़ाइल और निर्देशिका अनुमतियाँ स्थानांतर करें। -Retry count: -पुनः प्रयास गणनांक: +Show hidden dialogs again +छिपाये संवाद बक्से फिर से देखाएं -Delay (in seconds): -विलंब (सेकंड में): +Show all permanently hidden dialogs and warning messages again +स्थायी रूप से छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं Customize context menu: प्रासंगिक मेनू अनुकूलित करें: @@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error. Description विवरण -Show hidden dialogs again -छिपाये संवाद बक्से फिर से देखाएं - -Show all permanently hidden dialogs and warning messages again -स्थायी रूप से छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं - &Default डिफ़ॉल्ट (&D) @@ -1324,13 +1342,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline ऑफ़लाइन सक्रिय करें +Highlight configurations that have not been run for more than the following number of days: +निम्न दिनों से अधिक समय तक ना चलाए गए कॉन्फ़िगरेशन्स को हाइलाइट करें: + +Synchronization Settings +सिंक्रनाइज़ेशन सेटिंग्स + +Access Online Storage +ऑनलाइन संग्रहण पहुँच प्राप्त करें + Save as a Batch Job बॅच जॉब के रूप में सहेजें Delete Items आइटम हटाएं -Copy items +Copy Items आइटम्स प्रतिलिपित करें Options @@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync दान संस्‍करण +Highlight Configurations +कॉन्फ़िगरेशन्स हाइलाइट करें + &Options विकल्प (&O) @@ -1349,7 +1379,7 @@ This guarantees a consistent state even in case of a serious error. मुख्य पट्टी Folder Pairs -फ़ोल्डर जोडें +निर्देशिका जोडें Find ढूंढें @@ -1465,11 +1495,8 @@ This guarantees a consistent state even in case of a serious error. Select time span... समय अवधि चुनें... -Last session -पिछला सत्र - Folder Comparison and Synchronization -फ़ोल्डर तुलना और सिंक्रनाइज़ेशन +निर्देशिका तुलना और सिंक्रनाइज़ेशन Configuration saved सहेजा कॉन्फ़िगरेशन @@ -1486,8 +1513,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save नहीं सहेजें (&n) -Remove entry from list -सूचि से प्रविष्टि निकालें +Hide configuration +कॉन्फ़िगरेशन छुपाएँ + +Highlight... +हाइलाइट... Clear filter फ़िल्टर हटाएं @@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error. Paused ठहरा +Stop requested... +अनुरोधित को रोकें... + Initializing... प्रारंभ हो रहा है... @@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... सामग्री की तुलना हो रही है... -Completed -पूर्ण हुआ - Info जानकारी @@ -1649,7 +1679,7 @@ This guarantees a consistent state even in case of a serious error. बाह्य अनुप्रयोगों को प्रसंग मेनू में एकीकृत करें। निम्न मैक्रोज़ उपलब्ध हैं: Full file or folder path -पूर्ण फाइल या फ़ोल्डर पथ +पूर्ण फाइल या निर्देशिका पथ Parent folder path पैरेंट फ़ोल्‍डर पथ @@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side दूसरी तरफ़ के पैरामीटर्स -Show hidden dialogs and warning messages again? -छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं? - -&Show -दिखाएं (&S) - Downloading update... अद्यतन डाउनलोड हो रहा है... @@ -1682,26 +1706,20 @@ This guarantees a consistent state even in case of a serious error. दोनों तरफ़ के परिवर्तन पहचानें और प्रसारित करें। हटाए गए, ले जाए गए और विरोधों का स्वचालित रूप से डेटाबेस के उपयोग से पता लगाया जाता है। Create a mirror backup of the left folder by adapting the right folder to match. -मिलाए जाने वाले दाए फ़ोल्डर के अनुकूल बाए फ़ोल्डर का प्रतिबिंबित बैकअप बनाएं। +मिलाए जाने वाले दाए निर्देशिका के अनुकूल बाए निर्देशिका का प्रतिबिंबित बैकअप बनाएं। Copy new and updated files to the right folder. -नए और अद्यतित फ़ाइल्स दाए फ़ोल्डर में प्रतिलिपित करें। +नए और अद्यतित फ़ाइल्स दाए निर्देशिका में प्रतिलिपित करें। Configure your own synchronization rules. अपने खुद के सिंक्रनाइज़ेशन नियम कॉन्फ़िगर करें। -Synchronization Settings -सिंक्रनाइज़ेशन सेटिंग्स - Comparison तुलना Synchronization सिंक्रनाइज़ेशन -Today -आज - This week इस सप्ताह @@ -1730,7 +1748,7 @@ This guarantees a consistent state even in case of a serious error. फ़ाइल्स को स्थाई रूप से हटाया और आधिलेखित करें Move files to a user-defined folder -फ़ाइल्स उपयोगकर्ता-परिभाषित फ़ोल्डर में ले जाएं +फ़ाइल्स उपयोगकर्ता-परिभाषित निर्देशिका में ले जाएं Replace बदलें @@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error. Files फ़ाइल्स -Name -नाम - Percentage प्रतिशत @@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error. %x घंटे - -1 day -%x days - - -1 दिन -%x दिन - - Cannot set privilege %x. विशेषाधिकार %x सेट नहीं कर सकते। @@ -1907,7 +1913,7 @@ This guarantees a consistent state even in case of a serious error. सिस्टम को बंद करने में असमर्थ। Checking recycle bin failed for folder %x. -फ़ोल्डर %x के लिए रीसायकल बिन की जाँच विफल। +निर्देशिका %x के लिए रीसायकल बिन की जाँच विफल। The following XML elements could not be read: निम्न XML तत्वों को पढा नहीं जा सका: @@ -1957,9 +1963,12 @@ This guarantees a consistent state even in case of a serious error. Desktop डेस्कटॉप -Start menu +Start Menu प्रारंभ मेनू +Send To +इन्हें भेजें + Registering FreeFileSync file extensions FreeFileSync फ़ाइल एक्सटेंशंस पंजिकृत हो रहे हैं @@ -1982,11 +1991,11 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync के साथ संपादित करें The FreeFileSync portable version cannot install into a subfolder of %x. -FreeFileSync पोर्टेबल संस्करण %x के उप-फ़ोल्डर में स्थापित नहीं किया जा सकता। +FreeFileSync पोर्टेबल संस्करण %x के उप-निर्देशिका में स्थापित नहीं किया जा सकता। Please choose the local installation type or select a different folder for installation. -स्थापना के लिए कृपया स्थानीय स्थापना प्रकार चयन करें या कोई और फ़ोल्डर चुनें। +स्थापना के लिए कृपया स्थानीय स्थापना प्रकार चयन करें या कोई और निर्देशिका चुनें। -The silent installation mode is only available in the FreeFileSync Donation Edition. -अपरिचालित स्थापना केवल FreeFileSync दान संस्‍करण में ही उपलब्ध है। +The %x installation option is only available in the FreeFileSync Donation Edition. +%x स्थापना विकल्प केवल FreeFileSync दान संस्‍करण में ही उपलब्ध है। diff --git a/FreeFileSync/Build/Languages/hungarian.lng b/FreeFileSync/Build/Languages/hungarian.lng index 2f28d3e3..307ff95e 100755 --- a/FreeFileSync/Build/Languages/hungarian.lng +++ b/FreeFileSync/Build/Languages/hungarian.lng @@ -64,6 +64,9 @@ Syntax error Szintaktikai hiba +A left and a right directory path are expected after %x. +Egy bal és egy jobb oldali könyvtár-útvonalra van szükség %x után. + Cannot find file %x. Nem található a %x állomány. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Ha ezt a hibát figyelmen kívül hagyja, a könytárakat üresnek tekinti a program. A hiányzó könyvtárakat automatikusan létrehozza, amikor szükséges. +Comparison finished: +Az összehasonlítás befejeződött: + + +1 item found +%x items found + + +1 tételt találtam +%x tételt találtam + + File %x has an invalid date. %x állomány dátuma érvénytelen. @@ -175,9 +190,6 @@ Using non-default global settings: Nem az alapértelmezett általános beállítások használata: -Starting comparison -Összehasonlítás megkezdése - A folder input field is empty. A könyvtár beviteli mező üres. @@ -318,15 +330,15 @@ Tényleges: %y bájt Unable to move %x to the recycle bin. %x nem helyezhető Lomtárba. +Cannot find %x. +%x nem található. + Cannot open file %x. %x állomány nem nyitható meg. Cannot find device %x. %x eszköz nem található. -Cannot find %x. -%x nem található. - Type of item %x is not supported: %x elem típusa nem támogatott: @@ -432,6 +444,9 @@ Tényleges: %y bájt Lock owner: Zárolás gazdája: +Detecting abandoned lock... +Elhagyott zárolást érzékel... + 1 sec %x sec @@ -441,9 +456,6 @@ Tényleges: %y bájt %x mp -Detecting abandoned lock... -Elhagyott zárolást érzékel... - Items processed: Feldolgozott elemek száma: @@ -456,8 +468,8 @@ Tényleges: %y bájt Error parsing file %x, row %y, column %z. Hiba történt a feldolgozás közben: %x állomány, %y sor, %z oszlop. -Cannot set directory lock for %x. -%x könyvtár zárolása sikertelen. +Cannot set directory locks for the following folders: +Nem lehet beállítani a könyvtárak lockolását a következő könyvtárakhoz: 1 thread @@ -498,9 +510,6 @@ Tényleges: %y bájt Volume name %x is not part of file path %y. %x kötet-név nem része a(z) %y állomány elérési útvonalának. -Stop requested: Waiting for current operation to finish... -Leállást igényeltek: várakozás a jelenlegi művelet befejezésére... - Unable to create time stamp for versioning: Nem képes időbélyegzés létrehozására a verzióképzéshez: @@ -513,6 +522,9 @@ Tényleges: %y bájt Select a folder Könyvtárat kiválaszt +&New +&Új + &Open... &Megnyitás... @@ -728,26 +740,23 @@ A parancs végrehajtódik, ha: job name feladat neve -Show summary -Mutasd az összegzést +System: Sleep +Rendszer: alvási állapotban -Sleep -Alvó állapot +System: Shut down +Rendszer: Leállítva -Shut down -Leállítja a gépet - -Synchronization stopped -Szinkronizálás leállítva +Cleaning up old log files... +Régi log állományok törlése... Stopped Leállítva -Synchronization completed with errors -A szinkronizálás hibákkal fejeződött be +Completed with errors +Hibák mellett végrehajtva -Synchronization completed with warnings -A szinkronizálás figyelmeztetések mellett fejeződött be. +Completed with warnings +Figyelmeztetések mellett végrehajtva Warning Figyelmeztetés @@ -755,15 +764,12 @@ A parancs végrehajtódik, ha: Nothing to synchronize Nincs mit szinkronizálni -Synchronization completed successfully -A szinkronizálás sikeresen befejeződött +Completed successfully +Sikeresen végrehajtva Executing command %x %x parancs végrehajtása -Cleaning up old log files... -Régi log állományok törlése... - You can switch to FreeFileSync's main window to resolve this issue. E jelenség megoldásához kapcsoljon át a FreeFileSync fő ablakába. @@ -779,14 +785,8 @@ A parancs végrehajtódik, ha: Switching to FreeFileSync's main window Átkapcsolás a FreeFileSync fő ablakába - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Ismételt próbálkozás 1 másodperc múlva... -Ismételt próbálkozás %x másodperc múlva... - +Automatic retry +Automatikusan újrapróbálja Ignore &all &Mindent kihagy @@ -797,6 +797,27 @@ A parancs végrehajtódik, ha: Serious Error Komoly hiba +Last session +Utolsó munkamenet + +Today +Mai + + +1 day +%x days + + +1 nap +%x nap + + +Name +Név + +Last sync +Legutóbbi szinkronizálás + Folder Könyvtár @@ -860,9 +881,6 @@ A parancs végrehajtódik, ha: Please select a folder on a local file system, network or an MTP device. Kérem válasszon egy könyvtárat a helyi fájlrendszerben, a hálózaton vagy egy MTP eszközön. -&New -&Új - &Save &Ment @@ -974,6 +992,9 @@ A parancs végrehajtódik, ha: Total bytes to copy Összesen másolandó bájtok +Arrange folder pair +Kezelje a könyvtár-párt + Folder pair: Könyvtár-pár: @@ -1066,11 +1087,14 @@ A parancs végrehajtódik, ha: Naming convention: Elnevezési megállapodás: -&Ignore errors -F&igyelmen kívül hagyja a hibákat +Ignore errors +Hagyja figyelmen kívül a hibákat -Show pop-up on errors or warnings -Hiba vagy figyelmeztetés esetén mutasson párbeszédablakot +Retry count: +Visszatérések száma: + +Delay (in seconds): +Késés (másodpercben): Run a command after synchronization: Futtasson egy parancsot a szinkronizálás után: @@ -1078,9 +1102,6 @@ A parancs végrehajtódik, ha: OK OK -Arrange folder pair -Kezelje a könyvtár-párt - Enter your login details: Adja meg a bejelentkezési adatait: @@ -1177,12 +1198,12 @@ A parancs végrehajtódik, ha: Minimize to notification area Minimalizálja a figyelmeztetési területre -Bytes copied: -Másolt bitek száma: - When finished: Ha befejezte: +Auto-close +Automatikusan bezár + Close Bezár @@ -1195,11 +1216,17 @@ A parancs végrehajtódik, ha: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Készítsen egy parancsállományt a felügyelet nélküli szinkronizáláshoz. Az indításhoz kattintson kétszer erre az állományra vagy ütemezze a feladat-tervezőben: %x +Progress dialog: +Előrehaladási üzenet: + Run minimized Minimalizálva fusson &Show error dialog -&Mutassa a hiba párbeszédablakot +&Mutassa a hiba üzenetet + +Show pop-up on errors or warnings +Hiba vagy figyelmeztetés esetén mutasson párbeszédablakot &Cancel &Elvet @@ -1249,14 +1276,11 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Transfer file and folder permissions. Vigye át az állomány- és könyvtár-jogosultságokat. -Automatic retry on error: -Automatikus visszatérés a következő hibánál: - -Retry count: -Visszatérések száma: +Show hidden dialogs again +Mutassa ismét a rejtett párbeszédablakokat? -Delay (in seconds): -Késés (másodpercben): +Show all permanently hidden dialogs and warning messages again +Mutassa újra az összes ideiglenesen rejtett párbeszédablakot és figyelmeztetést Customize context menu: Környezeti menü testreszabása: @@ -1264,12 +1288,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Description Leírás -Show hidden dialogs again -Mutassa ismét a rejtett párbeszédablakokat? - -Show all permanently hidden dialogs and warning messages again -Mutassa újra az összes ideiglenesen rejtett párbeszédablakot és figyelmeztetést - &Default &Alapértelmezett @@ -1324,13 +1342,22 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Activate offline Aktiváljon online módon +Highlight configurations that have not been run for more than the following number of days: +Jelölje ki azokat a beállításokat, amelyek nem futottak legalább a következő számú napja: + +Synchronization Settings +Szinkronizálási beállítások + +Access Online Storage +Érje el a online tárolót + Save as a Batch Job Mentse mint egy kötegelt (batch) feladatot Delete Items Törölje az elemeket -Copy items +Copy Items Másolja az elemeket Options @@ -1342,6 +1369,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. FreeFileSync Donation Edition FreeFileSync Támogatói kiadás +Highlight Configurations +Jelölje ki a beállításokat + &Options &Beállítások @@ -1465,9 +1495,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Select time span... Időintervallum kiválasztása... -Last session -Utolsó munkamenet - Folder Comparison and Synchronization Könyvtár összehasonlítás és szinkronizálás @@ -1486,8 +1513,11 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Do&n't save &ne mentse -Remove entry from list -Törölje a bejegyzést a listáról +Hide configuration +Rejtse el a beállítást + +Highlight... +Emelje ki... Clear filter Törölje a szűrőt @@ -1567,6 +1597,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Paused Megállítva +Stop requested... +Leállítás szükséges... + Initializing... Inicializálás... @@ -1576,9 +1609,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Comparing content... Tartalom összehasonlítása... -Completed -Befejeződött - Info Információ @@ -1660,12 +1690,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Parameters for opposite side Paraméterek az ellenkező oldalhoz -Show hidden dialogs and warning messages again? -Mutassa újra a rejtett párbeszédablakokat és figyelmeztetéseket - -&Show -&Mutat - Downloading update... Frissítés letöltése... @@ -1690,18 +1714,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Configure your own synchronization rules. Állítsa be a saját szinkronizálási szabályait. -Synchronization Settings -Szinkronizálási beállítások - Comparison Összehasonlítás Synchronization Szinkronizálás -Today -Mai - This week E heti @@ -1771,9 +1789,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Files Állományok -Name -Név - Percentage Százalék @@ -1885,15 +1900,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. %x óra - -1 day -%x days - - -1 nap -%x nap - - Cannot set privilege %x. %x privilégium nem állítható be. @@ -1957,8 +1963,11 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Desktop Asztalon -Start menu -Start menü +Start Menu +Nyitó menü + +Send To +Címzett Registering FreeFileSync file extensions A FreeFileSync állomány-kiterjesztéseinek regisztrálása @@ -1987,6 +1996,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Please choose the local installation type or select a different folder for installation. Válassza a helyi telepítési módot vagy válasszon másik könytárat a telepítéshez. -The silent installation mode is only available in the FreeFileSync Donation Edition. -A csendes telepítési mód csak a FreeFileSync támogatói kiadásában elérhető. +The %x installation option is only available in the FreeFileSync Donation Edition. +%x telepítési opció csak a FreeFileSync adományozói kiadásában érhető el. diff --git a/FreeFileSync/Build/Languages/italian.lng b/FreeFileSync/Build/Languages/italian.lng index eebfcd49..707c244f 100755 --- a/FreeFileSync/Build/Languages/italian.lng +++ b/FreeFileSync/Build/Languages/italian.lng @@ -64,6 +64,9 @@ Syntax error Errore di sintassi +A left and a right directory path are expected after %x. +Sono previsti un percorso di directory sinistro e destro dopo %x. + Cannot find file %x. Impossibile trovare il file %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Se questo errore viene ignorato le cartelle saranno considerate vuote. Cartelle mancanti vengono create automaticamente quando necessario. +Comparison finished: +Confronto terminato: + + +1 item found +%x items found + + +1 oggetto trovato +%x elementi trovati + + File %x has an invalid date. Il file %x ha una data non valida. @@ -175,9 +190,6 @@ Using non-default global settings: Utilizzo delle impostazioni globali non predefinite: -Starting comparison -Inizio confronto - A folder input field is empty. Un campo di input cartella è vuoto. @@ -318,15 +330,15 @@ Attuale: %y byte Unable to move %x to the recycle bin. Impossibile spostare %x nel cestino. +Cannot find %x. +Impossibile trovare %x. + Cannot open file %x. Impossibile aprire il file %x. Cannot find device %x. Impossibile trovare dispositivo %x. -Cannot find %x. -Impossibile trovare %x. - Type of item %x is not supported: Il tipo di oggetto %x non è supportato: @@ -432,6 +444,9 @@ Attuale: %y byte Lock owner: Bloccare il proprietario: +Detecting abandoned lock... +Rilevamento blocco abbandonato ... + 1 sec %x sec @@ -441,9 +456,6 @@ Attuale: %y byte %x sec -Detecting abandoned lock... -Rilevamento blocco abbandonato ... - Items processed: Oggetti processati: @@ -456,8 +468,8 @@ Attuale: %y byte Error parsing file %x, row %y, column %z. Errore nel parsing del file %x, riga %y, colonna %z. -Cannot set directory lock for %x. -Impossibile impostare il blocco cartella per %x. +Cannot set directory locks for the following folders: +Impossibile impostare i blocchi di directory per le seguenti cartelle: 1 thread @@ -498,9 +510,6 @@ Attuale: %y byte Volume name %x is not part of file path %y. Nome volume %x non fa parte del percorso del file %y. -Stop requested: Waiting for current operation to finish... -Bloccata richiesta: Aspettare la fine dell'operazione in corso ... - Unable to create time stamp for versioning: Impossibile creare l'impronta per il controllo delle versioni: @@ -513,6 +522,9 @@ Attuale: %y byte Select a folder Seleziona una cartella +&New +&Nuovo + &Open... &Apri... @@ -728,26 +740,23 @@ Il comando è attivato se: job name nome del lavoro -Show summary -Mostra il riepilogo +System: Sleep +Sistema: In Sonno -Sleep -Sospendi +System: Shut down +Sistema: Spento -Shut down -Arresta - -Synchronization stopped -Sincronizzazione fermata +Cleaning up old log files... +Pulizia vecchi file di log ... Stopped Arrestato -Synchronization completed with errors -Sincronizzazione completata con errori +Completed with errors +Completato con errori -Synchronization completed with warnings -Sincronizzazione completata con avvisi +Completed with warnings +Completato con avvisi Warning Attenzione @@ -755,15 +764,12 @@ Il comando è attivato se: Nothing to synchronize Non c'è nulla da sincronizzare -Synchronization completed successfully -Sincronizzazione completata con successo +Completed successfully +Completato con successo Executing command %x Esecuzione del comando %x -Cleaning up old log files... -Pulizia vecchi file di log ... - You can switch to FreeFileSync's main window to resolve this issue. È possibile passare alla finestra principale di FreeFileSync per risolvere questo problema. @@ -779,14 +785,8 @@ Il comando è attivato se: Switching to FreeFileSync's main window Passaggio alla finestra principale di FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Riprova Automatica in 1 secondo... -Riprova Automatica in %x secondi... - +Automatic retry +Riprova automaticamente Ignore &all Ignora &tutto @@ -797,6 +797,27 @@ Il comando è attivato se: Serious Error Errore Grave +Last session +Ultima sessione + +Today +Oggi + + +1 day +%x days + + +1 giorno +%x giorni + + +Name +Nome + +Last sync +Ultima sincronizzazione + Folder Cartella @@ -860,9 +881,6 @@ Il comando è attivato se: Please select a folder on a local file system, network or an MTP device. Si prega di selezionare una cartella su un file system locale, di rete o un dispositivo MTP. -&New -&Nuovo - &Save &Salva @@ -974,6 +992,9 @@ Il comando è attivato se: Total bytes to copy Bytes totali da copiare +Arrange folder pair +Disporre coppia di cartelle + Folder pair: Coppia di cartelle: @@ -1066,11 +1087,14 @@ Il comando è attivato se: Naming convention: Modalità di rinomina: -&Ignore errors -&Ignora errori +Ignore errors +Ignora errori -Show pop-up on errors or warnings -Mostra pop-up di errore o avviso +Retry count: +Riprova conteggio: + +Delay (in seconds): +Ritardo (in secondi): Run a command after synchronization: Esegui un comando dopo la sincronizzazione: @@ -1078,9 +1102,6 @@ Il comando è attivato se: OK OK -Arrange folder pair -Disporre coppia di cartelle - Enter your login details: Inserisci i tuoi dati d'accesso: @@ -1177,12 +1198,12 @@ Il comando è attivato se: Minimize to notification area Ridurre al minimo l'area di notifica -Bytes copied: -Byte copiati: - When finished: Al termine: +Auto-close +Chiusura automatica + Close Chiudi @@ -1195,12 +1216,18 @@ Il comando è attivato se: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Creare un file batch per la sincronizzazione automatica. Per iniziare, fare doppio clic su questo file o programmarlo in un pianificatore di compiti: %x +Progress dialog: +Finestra di avanzamento: + Run minimized Esegui minimizzato &Show error dialog &Mostra la finestra di errore +Show pop-up on errors or warnings +Mostra pop-up di errore o avviso + &Cancel &Cancella @@ -1249,14 +1276,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Transfer file and folder permissions. Trasferimento autorizzazioni di file e cartelle. -Automatic retry on error: -Tentativo Automatico in caso di errore: - -Retry count: -Riprova conteggio: +Show hidden dialogs again +Mostra di nuovo le finestre di dialogo nascoste -Delay (in seconds): -Ritardo (in secondi): +Show all permanently hidden dialogs and warning messages again +Mostra di nuovo tutti i dialoghi nascosti in modo permanente e i messaggi di allarme Customize context menu: Personalizzare menu contestuale: @@ -1264,12 +1288,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Description Descrizione -Show hidden dialogs again -Mostra di nuovo le finestre di dialogo nascoste - -Show all permanently hidden dialogs and warning messages again -Mostra di nuovo tutti i dialoghi nascosti in modo permanente e i messaggi di allarme - &Default &Predefinito @@ -1324,14 +1342,23 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Activate offline Attiva offline +Highlight configurations that have not been run for more than the following number of days: +Evidenzia le configurazioni che non sono state eseguite per più del seguente numero di giorni: + +Synchronization Settings +Impostazioni di Sincronizzazione + +Access Online Storage +Accedi all'archiviazione online + Save as a Batch Job Salva come Lavoro Batch Delete Items Elimina Elementi -Copy items -Copia elementi +Copy Items +Copia articoli Options Opzioni @@ -1342,6 +1369,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Evidenzia le configurazioni + &Options &Opzioni @@ -1465,9 +1495,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Select time span... Seleziona intervallo di tempo... -Last session -Ultima sessione - Folder Comparison and Synchronization Comparazione delle Cartelle e Sincronizzazione @@ -1486,8 +1513,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Do&n't save No&n salvare -Remove entry from list -Togliere voce dalla lista +Hide configuration +Nascondi configurazione + +Highlight... +Evidenziare... Clear filter Eliminare filtro @@ -1567,6 +1597,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Paused In pausa +Stop requested... +Stop richiesto ... + Initializing... Inizializzazione... @@ -1576,9 +1609,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Comparing content... Comparazione del contenuto... -Completed -Completato - Info Info @@ -1660,12 +1690,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Parameters for opposite side Parametri per lato opposto -Show hidden dialogs and warning messages again? -Mostra di nuovo dialoghi nascosti e messaggi di avviso? - -&Show -&Mostra - Downloading update... Download aggiornamento... @@ -1690,18 +1714,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Configure your own synchronization rules. Configura le tue regole di sincronizzazione. -Synchronization Settings -Impostazioni di Sincronizzazione - Comparison Confronto Synchronization Sincronizzazione -Today -Oggi - This week Questa settimana @@ -1771,9 +1789,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Files File -Name -Nome - Percentage Percentuale @@ -1885,15 +1900,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. %x ore - -1 day -%x days - - -1 giorno -%x giorni - - Cannot set privilege %x. Impossibile impostare privilegi %x. @@ -1957,8 +1963,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Desktop Desktop -Start menu -Menù Avvio +Start Menu +Menu iniziale + +Send To +Inviare a Registering FreeFileSync file extensions Registra estensioni file FreeFileSync @@ -1987,6 +1996,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Please choose the local installation type or select a different folder for installation. Scegliere il tipo di installazione locale o selezionare una cartella diversa per l'installazione. -The silent installation mode is only available in the FreeFileSync Donation Edition. -La modalità di installazione silenziosa è disponibile solo nella FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +L'opzione di installazione %x è disponibile solo nell'edizione di donazione FreeFileSync. diff --git a/FreeFileSync/Build/Languages/japanese.lng b/FreeFileSync/Build/Languages/japanese.lng index 0347da63..cbbc32ac 100755 --- a/FreeFileSync/Build/Languages/japanese.lng +++ b/FreeFileSync/Build/Languages/japanese.lng @@ -59,11 +59,14 @@ 例外が発生しました A directory path is expected after %x. -%x の後にはディレクトリ・パスが必要です. +%x の後にはディレクトリ パスが必要です. Syntax error 構文エラー +A left and a right directory path are expected after %x. +%x の後に左右のディレクトリ パスが必要です. + Cannot find file %x. ファイル %x がみつかりません. @@ -115,6 +118,17 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. このエラーを無視した場合、空のフォルダが考慮され、必要に応じて不足しているフォルダが自動的に生成されます. +Comparison finished: +比較が完了: + + +1 item found +%x items found + + +%x 項目を検出 + + File %x has an invalid date. ファイル %x の日付は無効なものです. @@ -175,9 +189,6 @@ Using non-default global settings: 非デフォルトのグローバル設定を使用: -Starting comparison -比較処理を開始中 - A folder input field is empty. フォルダ入力欄が空白です. @@ -318,15 +329,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. %x をゴミ箱に移動できません. +Cannot find %x. +%x がみつかりません. + Cannot open file %x. ファイル %x を開けません. Cannot find device %x. デバイス %x がみつかりません. -Cannot find %x. -%x がみつかりません. - Type of item %x is not supported: 項目 %x には対応していません: @@ -429,6 +440,9 @@ Actual: %y bytes Lock owner: ロック所有者: +Detecting abandoned lock... +放棄されたロックを検出中... + 1 sec %x sec @@ -437,9 +451,6 @@ Actual: %y bytes %x 秒 -Detecting abandoned lock... -放棄されたロックを検出中... - Items processed: 処理された要素: @@ -452,8 +463,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. ファイル %x の構文解析エラー, 行 %y, 列 %z. -Cannot set directory lock for %x. -%x のディレクトリロックができません. +Cannot set directory locks for the following folders: +次のフォルダにあるディレクトリはロックできません: 1 thread @@ -493,9 +504,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. ボリューム名 %x は、ファイルパス %y の一部ではありません. -Stop requested: Waiting for current operation to finish... -停止の要求: 現在の操作が完了するのを待機しています... - Unable to create time stamp for versioning: バージョン管理のタイムスタンプを作成できません: @@ -508,6 +516,9 @@ Actual: %y bytes Select a folder フォルダを選択 +&New +新規(&N) + &Open... 開く(&O)... @@ -723,26 +734,23 @@ The command is triggered if: job name ジョブ名 -Show summary -概要を表示 +System: Sleep +システム: スリープ -Sleep -スリープ +System: Shut down +システム: シャットダウン -Shut down -シャットダウン - -Synchronization stopped -同期処理を停止 +Cleaning up old log files... +古いログファイルをクリーン... Stopped 停止 -Synchronization completed with errors -同期処理はエラーで終了しています +Completed with errors +エラーで終了 -Synchronization completed with warnings -同期処理は警告で終了しています +Completed with warnings +警告で終了 Warning 警告 @@ -750,15 +758,12 @@ The command is triggered if: Nothing to synchronize 同期対象がありません -Synchronization completed successfully -同期処理はすべてが正常に完了しました +Completed successfully +正常に完了しました Executing command %x コマンド %x を実行中 -Cleaning up old log files... -古いログファイルをクリーン... - You can switch to FreeFileSync's main window to resolve this issue. FreeFileSync のメインウィンドウを切り替えることでこの問題を解決. @@ -774,13 +779,8 @@ The command is triggered if: Switching to FreeFileSync's main window FreeFileSync メインウィンドウの切り替え - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -%x 秒後に自動的に再試行... - +Automatic retry +自動的に再試行 Ignore &all すべて無視(&A) @@ -791,6 +791,26 @@ The command is triggered if: Serious Error 重大なエラー +Last session +最後のセッション + +Today +今日 + + +1 day +%x days + + +%x 日 + + +Name +名前 + +Last sync +前回の同期 + Folder フォルダ @@ -854,9 +874,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. ローカルファイルシステム、ネットワークまたは MTP デバイス上のフォルダを選択. -&New -新規(&N) - &Save 保存(&S) @@ -968,6 +985,9 @@ The command is triggered if: Total bytes to copy コピーの合計バイト +Arrange folder pair +フォルダ ペアの配置 + Folder pair: フォルダ ペア: @@ -1026,7 +1046,7 @@ The command is triggered if: 最大: Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair. -同期処理から特定のファイルを除外するためのフィルター規則を選択、対応するそれらフォルダ ペアからの相対ファイルパスを入力します. +同期処理から特定のファイルを除外するためのフィルター規則を選択、 対応するそれらフォルダ ペアを基準にしたファイルパスを入力します. C&lear クリア(&L) @@ -1060,11 +1080,14 @@ The command is triggered if: Naming convention: 命名規則: -&Ignore errors -エラーを無視(&I) +Ignore errors +エラーを無視 -Show pop-up on errors or warnings -エラーと警告をポップアップで表示 +Retry count: +再試行回数: + +Delay (in seconds): +遅延 (秒で指定): Run a command after synchronization: 同期処理後に実行するコマンド: @@ -1072,9 +1095,6 @@ The command is triggered if: OK OK -Arrange folder pair -フォルダ ペアの配置 - Enter your login details: ログインの詳細を入力: @@ -1171,12 +1191,12 @@ The command is triggered if: Minimize to notification area 通知領域に最小化 -Bytes copied: -バイトをコピー済: - When finished: 完了後: +Auto-close +自動的に閉じる + Close 閉じる @@ -1189,12 +1209,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x 無人で同期を行う為のバッチファイルを作成 - このファイルか、タスクプランナーからスケジュールをダブルクリックすることで開始: %x +Progress dialog: +進捗ダイアログ: + Run minimized 最小化で起動 &Show error dialog エラーダイアログを表示(&S) +Show pop-up on errors or warnings +エラーと警告をポップアップで表示 + &Cancel キャンセル(&C) @@ -1243,14 +1269,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. ファイルとフォルダのパーミッションを転送します. -Automatic retry on error: -エラー時の自動再試行: - -Retry count: -再試行回数: +Show hidden dialogs again +非表示のダイアログを再表示 -Delay (in seconds): -遅延 (秒で指定): +Show all permanently hidden dialogs and warning messages again +非表示にしたすべてのダイアログと警告メッセージを再表示 Customize context menu: コンテキストメニューのカスタマイズ: @@ -1258,12 +1281,6 @@ This guarantees a consistent state even in case of a serious error. Description 説明 -Show hidden dialogs again -非表示のダイアログを再表示 - -Show all permanently hidden dialogs and warning messages again -非表示にしたすべてのダイアログと警告メッセージを再表示 - &Default デフォルト(&D) @@ -1318,13 +1335,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline オフライン アクティベート +Highlight configurations that have not been run for more than the following number of days: +指定した日数を超えて実行されていない構成を強調表示する: + +Synchronization Settings +同期の設定 + +Access Online Storage +オンラインストレージにアクセス + Save as a Batch Job 一括ジョブを保存 Delete Items 項目の削除 -Copy items +Copy Items 項目のコピー Options @@ -1336,6 +1362,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync 寄付版 +Highlight Configurations +構成の強調表示 + &Options 設定(&O) @@ -1455,9 +1484,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... タイムスパンを選択... -Last session -最後のセッション - Folder Comparison and Synchronization フォルダの比較と同期 @@ -1476,8 +1502,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 保存しない(&N) -Remove entry from list -一覧からエントリを除去 +Hide configuration +構成を隠す + +Highlight... +強調表示... Clear filter フィルタをクリア @@ -1557,6 +1586,9 @@ This guarantees a consistent state even in case of a serious error. Paused 一時停止中 +Stop requested... +リクエストの中止... + Initializing... 初期化中... @@ -1566,9 +1598,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... 内容を比較中... -Completed -完了しました! - Info 情報 @@ -1636,7 +1665,7 @@ This guarantees a consistent state even in case of a serious error. 外部のアプリケーションをコンテキストメニューに統合、以下のマクロが利用できます: Full file or folder path -ファイル、フォルダの完全な名前 +ファイルまたはフォルダの完全パス Parent folder path 親フォルダのパス @@ -1647,48 +1676,36 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side 反対側のパラメータ -Show hidden dialogs and warning messages again? -非表示のダイアログと警告を再表示しますか? - -&Show -表示(&S) - Downloading update... アップデートをダウンロード中... Identify equal files by comparing modification time and size. -更新時刻とサイズを比較して、同一ファイルを識別します. +更新時刻とサイズの比較を行い 同一ファイルを識別します. Identify equal files by comparing the file content. -ファイルの内容を比較して、同一ファイルを識別します. +ファイル内容の比較を行い 同一ファイルを識別します. Identify equal files by comparing their file size. -ファイルのサイズを比較して、同一ファイルを識別します. +ファイルサイズの比較を行い 同一ファイルを識別します. Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. -変更箇所を識別して両側に変更を反映します。データベースを使用することで、削除/移動/競合などは自動的に検出されます. +変更箇所を識別して両側に変更を反映します。 データベースを使用することで、削除や移動 競合等は自動的に検出されます. Create a mirror backup of the left folder by adapting the right folder to match. -右側フォルダにマッチングを適合することで、左側フォルダのミラーリングバックアップを作成します. +右側フォルダを一致することにより 左側フォルダのミラーリング バックアップを作成します. Copy new and updated files to the right folder. -新しい、または更新されたファイルを右側フォルダにコピーします. +更新されたファイルを右側フォルダにコピー. Configure your own synchronization rules. あなたが使用する同期規則を設定します. -Synchronization Settings -同期の設定 - Comparison 比較 Synchronization 同期 -Today -今日 - This week 今週 @@ -1758,9 +1775,6 @@ This guarantees a consistent state even in case of a serious error. Files ファイル -Name -名前 - Percentage パーセント @@ -1870,14 +1884,6 @@ This guarantees a consistent state even in case of a serious error. %x 時間 - -1 day -%x days - - -%x 日 - - Cannot set privilege %x. %x の特権をセットできません. @@ -1941,9 +1947,12 @@ This guarantees a consistent state even in case of a serious error. Desktop デスクトップ -Start menu +Start Menu スタートメニュー +Send To +送る + Registering FreeFileSync file extensions FreeFileSync ファイル拡張子を登録中 @@ -1971,6 +1980,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. ローカル インストールを選択するか、別のインストール先を選択してください. -The silent installation mode is only available in the FreeFileSync Donation Edition. -サイレント インストール モードは、FreeFileSync 寄付版でのみ使用できます. +The %x installation option is only available in the FreeFileSync Donation Edition. +インストール オプション %x は、FreeFileSync 寄付版でのみ利用可能です. diff --git a/FreeFileSync/Build/Languages/korean.lng b/FreeFileSync/Build/Languages/korean.lng index 6e0191b8..b12f0763 100755 --- a/FreeFileSync/Build/Languages/korean.lng +++ b/FreeFileSync/Build/Languages/korean.lng @@ -64,6 +64,9 @@ Syntax error 구문 오류 +A left and a right directory path are expected after %x. +%x 다음에 좌측 및 우측 디렉토리 경로가 필요합니다. + Cannot find file %x. 파일 %x을(를) 찾을 수 없습니다. @@ -115,6 +118,17 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. 이 오류를 무시하면 폴더는 비어 있는 것으로 간주됩니다. 없는 폴더는 필요한 경우 자동 생성됩니다. +Comparison finished: +비교 완료: + + +1 item found +%x items found + + +%x개 항목 발견 + + File %x has an invalid date. 파일 %x 의 날짜가 유효하지 않습니다. @@ -175,9 +189,6 @@ Using non-default global settings: 기본이 아닌 전역설정 사용: -Starting comparison -비교 시작 - A folder input field is empty. 폴더 입력 필드 하나가 비어 있습니다. @@ -318,15 +329,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. 휴지통으로 %x을(를) 이동할 수 없습니다. +Cannot find %x. +%x을(를) 찾을 수 없습니다. + Cannot open file %x. 파일 %x을(를) 열 수 없습니다. Cannot find device %x. 장치 %x을(를) 찾을 수 없습니다. -Cannot find %x. -%x을(를) 찾을 수 없습니다. - Type of item %x is not supported: 항목 %x의 형식은 지원되지 않습니다: @@ -429,6 +440,9 @@ Actual: %y bytes Lock owner: 잠금 권한자: +Detecting abandoned lock... +방치된 잠금 탐색 중... + 1 sec %x sec @@ -437,9 +451,6 @@ Actual: %y bytes %x초 -Detecting abandoned lock... -방치된 잠금 탐색 중... - Items processed: 처리된 항목: @@ -452,8 +463,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. 분석 오류 - 파일: %x; 행: %y; 열: %z. -Cannot set directory lock for %x. -%x 에 대한 디렉터리 잠금을 설정할 수 없습니다. +Cannot set directory locks for the following folders: +다음 폴더의 디렉터리 잠금을 설정할 수 없습니다: 1 thread @@ -493,9 +504,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. 볼륨 이름 %x은(는) 파일 경로 %y의 일부가 아닙니다. -Stop requested: Waiting for current operation to finish... -사용자에 의한 작업 중단: 현재 작업 종료 대기 중... - Unable to create time stamp for versioning: 버전 관리를 위한 타임 스탬프 생성 불가: @@ -508,6 +516,9 @@ Actual: %y bytes Select a folder 폴더 선택 +&New +새로 만들기(&N) + &Open... 열기(&O)... @@ -723,26 +734,23 @@ The command is triggered if: job name 작업 이름 -Show summary -요약 표시 +System: Sleep +시스템: 절전 -Sleep -절전 +System: Shut down +시스템: 종료 -Shut down -종료 - -Synchronization stopped -동기화 중단 +Cleaning up old log files... +이전 로그 파일 정리 중... Stopped 중단 -Synchronization completed with errors -동기화가 완료되긴 했으나, 오류가 있습니다 +Completed with errors +오류와 함께 완료됨 -Synchronization completed with warnings -경고 메세지와 함께 동기화 완료 +Completed with warnings +경고와 함께 완료됨 Warning 경고 @@ -750,15 +758,12 @@ The command is triggered if: Nothing to synchronize 동기화 할 항목이 없습니다 -Synchronization completed successfully -동기화가 성공적으로 완료 됐습니다 +Completed successfully +성공적으로 완료됨 Executing command %x %x 명령 실행 중 -Cleaning up old log files... -이전 로그 파일 정리 중... - You can switch to FreeFileSync's main window to resolve this issue. 이 문제는 FreeFileSync 기본 창으로 전환해서 해결 가능합니다. @@ -774,13 +779,8 @@ The command is triggered if: Switching to FreeFileSync's main window FreeFileSync 기본 창으로 전환 중 - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -%x초 이내에 자동 재시도... - +Automatic retry +자동 재시도 Ignore &all 전체 무시(&a) @@ -791,6 +791,26 @@ The command is triggered if: Serious Error 심각한 오류 +Last session +마지막 세션 + +Today +오늘 + + +1 day +%x days + + +%x일 + + +Name +이름 + +Last sync +마지막 동기화 + Folder 폴더 @@ -854,9 +874,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. 로컬 파일 시스템, 네트워크 또는 MTP 장치에서의 폴더 하나를 선택하십시오. -&New -새로 만들기(&N) - &Save 저장(&S) @@ -968,6 +985,9 @@ The command is triggered if: Total bytes to copy 복사할 전체 바이트 크기 +Arrange folder pair +폴더 페어 정렬 + Folder pair: 폴더 페어: @@ -1060,11 +1080,14 @@ The command is triggered if: Naming convention: 이름 지정: -&Ignore errors -오류 무시(&I) +Ignore errors +오류 무시 -Show pop-up on errors or warnings -오류 또는 경고에 대한 팝업 보이기 +Retry count: +재시도 횟수: + +Delay (in seconds): +지연 (초 단위): Run a command after synchronization: 동기화 이후 명령 실행: @@ -1072,9 +1095,6 @@ The command is triggered if: OK 확인 -Arrange folder pair -폴더 페어 정렬 - Enter your login details: 귀하의 로그인 정보 입력: @@ -1171,12 +1191,12 @@ The command is triggered if: Minimize to notification area 알림 영역으로 최소화 -Bytes copied: -복사된 바이트: - When finished: 완료 시: +Auto-close +자동 닫기 + Close 닫기 @@ -1189,12 +1209,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x 직접 지켜보지 않는 자동 동기화의 경우, 배치 파일을 만듭니다. 시작하려면 파일을 더블 클릭하거나 작업 플래너에서 일정을 만드십시오: %x +Progress dialog: +진행 대화 상자: + Run minimized 최소화 실행 &Show error dialog 오류 대화 상자 표시(&S) +Show pop-up on errors or warnings +오류 또는 경고에 대한 팝업 보이기 + &Cancel 취소(&C) @@ -1243,14 +1269,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. 파일 및 폴더 권한 전송. -Automatic retry on error: -오류 발생 시 자동 재시도: - -Retry count: -재시도 횟수: +Show hidden dialogs again +숨겨진 대화창 다시 보이기 -Delay (in seconds): -지연 (초 단위): +Show all permanently hidden dialogs and warning messages again +영구적으로 숨겨진 모든 대화창 및 경고 메세지 다시 보이기 Customize context menu: 컨텍스트 메뉴 커스터마이즈 (사용자 정의): @@ -1258,12 +1281,6 @@ This guarantees a consistent state even in case of a serious error. Description 설명 -Show hidden dialogs again -숨겨진 대화창 다시 보이기 - -Show all permanently hidden dialogs and warning messages again -영구적으로 숨겨진 모든 대화창 및 경고 메세지 다시 보이기 - &Default 기본 설정/값(&D) @@ -1318,13 +1335,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline 오프라인 활성화 +Highlight configurations that have not been run for more than the following number of days: +다음 일 수보다 오래 실행되지 않은 구성을 강조 표시: + +Synchronization Settings +동기화 설정 + +Access Online Storage +온라인 저장소 액세스 + Save as a Batch Job 일괄 작업으로 저장 Delete Items 항목 삭제 -Copy items +Copy Items 항목 복사 Options @@ -1336,6 +1362,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync 유료 버전 +Highlight Configurations +강조 표시 구성 + &Options 옵션(&O) @@ -1455,9 +1484,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... 시간간격(타임스팬) 선택... -Last session -마지막 세션 - Folder Comparison and Synchronization 폴더 비교 및 동기화 @@ -1476,8 +1502,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 저장 안 함(&n) -Remove entry from list -목록에서 입력항목 제거 +Hide configuration +구성 숨기기 + +Highlight... +강조 표시... Clear filter 필터 제거 @@ -1557,6 +1586,9 @@ This guarantees a consistent state even in case of a serious error. Paused 일시정지 중 +Stop requested... +중단 요청... + Initializing... 초기화 작업 중... @@ -1566,9 +1598,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... 내용 비교 중... -Completed -완료 - Info 정보 @@ -1647,12 +1676,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side 반대 측에 대한 매개 변수 -Show hidden dialogs and warning messages again? -숨겨진 모든 대화창 및 경고 메세지를 다시 보시겠습니까? - -&Show -표시/보이기(&S) - Downloading update... 업데이트 다운로드 중... @@ -1677,18 +1700,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. 개인 동기화 규칙을 설정합니다. -Synchronization Settings -동기화 설정 - Comparison 비 교 Synchronization 동 기 화 -Today -오늘 - This week 이번 주 @@ -1758,9 +1775,6 @@ This guarantees a consistent state even in case of a serious error. Files 파일 -Name -이름 - Percentage 퍼센티지(%) @@ -1870,14 +1884,6 @@ This guarantees a consistent state even in case of a serious error. %x시간 - -1 day -%x days - - -%x일 - - Cannot set privilege %x. 권한 %x을(를) 설정할 수 없습니다. @@ -1941,9 +1947,12 @@ This guarantees a consistent state even in case of a serious error. Desktop 바탕화면 -Start menu +Start Menu 시작 메뉴 +Send To +보내기 + Registering FreeFileSync file extensions FreeFileSync 파일 확장자 등록 중 @@ -1971,6 +1980,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. 로컬 설치 유형을 선택하거나 설치할 다른 폴더를 선택하십시오. -The silent installation mode is only available in the FreeFileSync Donation Edition. -자동 설치 모드는 FreeFileSync 유료 버전에서만 사용 가능합니다. +The %x installation option is only available in the FreeFileSync Donation Edition. +%x 설치 옵션은 FreeFileSync 유료 버전에서만 사용 가능합니다. diff --git a/FreeFileSync/Build/Languages/lithuanian.lng b/FreeFileSync/Build/Languages/lithuanian.lng index 6e8b1ed5..97c435fe 100755 --- a/FreeFileSync/Build/Languages/lithuanian.lng +++ b/FreeFileSync/Build/Languages/lithuanian.lng @@ -64,6 +64,9 @@ Syntax error Sintaksės klaida +A left and a right directory path are expected after %x. +Keliai į kairį ir dešinį katalogus turėtų buti po %x. + Cannot find file %x. Negalima surasti failo %x. @@ -115,6 +118,19 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Jei nebus paisoma šios klaidos, aplankams bus laikomas tusčiu. Trūkstami aplankai sukuriami automatiškai. +Comparison finished: +Palyginimas pabaigtas: + + +1 item found +%x items found + + +Surastas %x elementas +%x elementai surasti +%x elementų surasta + + File %x has an invalid date. Failas %x turi netinkamą datą. @@ -175,9 +191,6 @@ Using non-default global settings: Naudoti nepradinius globalius parametrus: -Starting comparison -Pradedamas palyginimas - A folder input field is empty. Aplanko įvesties laukas yra tuščias. @@ -318,15 +331,15 @@ Esamas: %y baitai Unable to move %x to the recycle bin. %x į šiukšliadėžę perkelti nepavyko. +Cannot find %x. +Negalima surasti %x. + Cannot open file %x. %x failo nepavyko atidaryti. Cannot find device %x. Negalima surasti įrenginio %x. -Cannot find %x. -Negalima surasti %x. - Type of item %x is not supported: Elemento tipas %x nepalaikomas: @@ -435,6 +448,9 @@ Esamas: %y baitai Lock owner: Užrakto savininkas: +Detecting abandoned lock... +Aptiktas paliktas užraktas... + 1 sec %x sec @@ -445,9 +461,6 @@ Esamas: %y baitai %x sekundžių -Detecting abandoned lock... -Aptiktas paliktas užraktas... - Items processed: Elementų apdorota: @@ -460,8 +473,8 @@ Esamas: %y baitai Error parsing file %x, row %y, column %z. Klaida trinant failą %x, eilė %y, stulpelis %z. -Cannot set directory lock for %x. -Nepavyksta nustatyti katalogo užrakto %x. +Cannot set directory locks for the following folders: +Negalima užrakinti šiuos aplankus kataloge: 1 thread @@ -503,9 +516,6 @@ Esamas: %y baitai Volume name %x is not part of file path %y. Vietos vardas %x nėra failo kelio %y dalis. -Stop requested: Waiting for current operation to finish... -Stabdymo užklausa: Laukiama, kol pasibaigs einamasis procesas... - Unable to create time stamp for versioning: Nepavyko sukurti versijos laiko žymą: @@ -518,6 +528,9 @@ Esamas: %y baitai Select a folder Pažymėti aplanką +&New +&Naujas + &Open... &Atversti... @@ -733,26 +746,23 @@ Komanda inicijuojama jei: job name Užduoties pavadinimas -Show summary -Rodyti suvestinę +System: Sleep +Sistema: Miegoti -Sleep -Miego režimas +System: Shut down +Sistema: Išjungti -Shut down -Išjungti kompiuterį - -Synchronization stopped -Suvienodinimas sustabdytas +Cleaning up old log files... +Išvalomi seni žurnalo įrašai... Stopped Sustabdyta -Synchronization completed with errors -Suvienodinimas baigtas su klaidomis +Completed with errors +Užbaigtas su klaidomis -Synchronization completed with warnings -Suvienodinimas baigtas su perspėjimais +Completed with warnings +Užbaigtas su perspėjimais Warning Perspėjimas @@ -760,15 +770,12 @@ Komanda inicijuojama jei: Nothing to synchronize Nėra ko suvienodinti -Synchronization completed successfully -Suvienodinimas sėkmingai baigtas +Completed successfully +Sėkmingai užbaigtas Executing command %x Vykdyti komandą %x -Cleaning up old log files... -Išvalomi seni žurnalo įrašai... - You can switch to FreeFileSync's main window to resolve this issue. Sprendžiant šią problemą, galite persijungti i FreeFileSync pagrindinį langą. @@ -784,15 +791,8 @@ Komanda inicijuojama jei: Switching to FreeFileSync's main window Perjungti į FreeFileSync pagrindinį langą - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automatinis pakartojimas po %x sekundės... -Automatinis pakartojimas po %x sekundžių... -Automatinis pakartojimas po %x sekundžių... - +Automatic retry +Automatinis paleidimas iš naujo Ignore &all Ignoruoti &visus @@ -803,6 +803,28 @@ Komanda inicijuojama jei: Serious Error Rimta klaida +Last session +Paskutinė sesija + +Today +Šiandien + + +1 day +%x days + + +%x diena +%x dienos +%x dienų + + +Name +Pavadinimas + +Last sync +Vėliausias + Folder Aplankas @@ -866,9 +888,6 @@ Komanda inicijuojama jei: Please select a folder on a local file system, network or an MTP device. Prašome pasirinkti aplanką vietinėje failų sistemoje, tinkle arba MTP įrenginyje. -&New -&Naujas - &Save &Išsaugoti @@ -980,6 +999,9 @@ Komanda inicijuojama jei: Total bytes to copy Viso baitų kopijuoti +Arrange folder pair +Sulygiuoti pagal aplanko porą + Folder pair: Aplanko pora: @@ -1072,11 +1094,14 @@ Komanda inicijuojama jei: Naming convention: Pavadinimų taisyklės: -&Ignore errors -&Ignoruoti klaidas +Ignore errors +Ignoruoti klaidas -Show pop-up on errors or warnings -Rodyti pranešimą esant klaidoms ar perspėjimams +Retry count: +Skaičiuoti is naujo: + +Delay (in seconds): +Uždelsimas (sekundėmis): Run a command after synchronization: Po sinchronizavimo vykdyti komandą: @@ -1084,9 +1109,6 @@ Komanda inicijuojama jei: OK Gerai -Arrange folder pair -Sulygiuoti pagal aplanko porą - Enter your login details: Įveskite išsamią prisijungimo informaciją: @@ -1183,12 +1205,12 @@ Komanda inicijuojama jei: Minimize to notification area Nuleisti į apačią dešinėje -Bytes copied: -Nukopijuota baitų: - When finished: Kai pabaigta: +Auto-close +Automatiškai uždaryti + Close Uždaryti @@ -1201,12 +1223,18 @@ Komanda inicijuojama jei: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Sukurti paleidimo failą suvienodinimui be priežiūros. Norint jį paleisti reikia paspausti and failo du kartus pele arba nustatyti su užduočių planuotoju: %x +Progress dialog: +Eiga: + Run minimized Vykdyti sumažinus &Show error dialog &Rodyti klaidų dialogą +Show pop-up on errors or warnings +Rodyti pranešimą esant klaidoms ar perspėjimams + &Cancel &Uždaryti @@ -1255,14 +1283,11 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Transfer file and folder permissions. Failų ir aplankų perkėlimo leidimai. -Automatic retry on error: -Automatinis pakartojimas klaidos atveju: - -Retry count: -Skaičiuoti is naujo: +Show hidden dialogs again +Vėl rodyti paslėptus dialogo langus -Delay (in seconds): -Uždelsimas (sekundėmis): +Show all permanently hidden dialogs and warning messages again +Vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus Customize context menu: Pagrindinio meniu pasirinkimai: @@ -1270,12 +1295,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Description Apibūdinimas -Show hidden dialogs again -Vėl rodyti paslėptus dialogo langus - -Show all permanently hidden dialogs and warning messages again -Vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus - &Default &Numatyta @@ -1330,14 +1349,23 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Activate offline Aktyvuoti neprisijungus +Highlight configurations that have not been run for more than the following number of days: +Paryškinti parametrus kurie nebuvo vykdomi daugiau nei dienų: + +Synchronization Settings +Suvienodinimo parametrai + +Access Online Storage +Pasiekti Suagyklą Internete + Save as a Batch Job Išsuagoti kaip paketinį failą Delete Items Pašalinti elementai -Copy items -Kopijuoti elementus +Copy Items +Kopijuoti Elementus Options Parinktys @@ -1348,6 +1376,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. FreeFileSync Donation Edition FreeFileSync Donoro Versija +Highlight Configurations +Pažymėti Nustatymus + &Options &Parinktys @@ -1475,9 +1506,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Select time span... Pasirinkti laiko tarpą... -Last session -Paskutinė sesija - Folder Comparison and Synchronization Aplankų Palyginimas ir Suvienodinimas @@ -1496,8 +1524,11 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Do&n't save &Nesaugoti -Remove entry from list -Pašalinti įrašą iš sarašo +Hide configuration +Paslėpti nustatymus + +Highlight... +Pažymėti... Clear filter Panaikinti filtrą @@ -1577,6 +1608,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Paused Pristabdyta +Stop requested... +Stabdomas užklausimas... + Initializing... Pradedama... @@ -1586,9 +1620,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Comparing content... Palyginimo turinys... -Completed -Baigta - Info Informacija @@ -1673,12 +1704,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Parameters for opposite side Parametrai priešingai pusei -Show hidden dialogs and warning messages again? -Ar vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus? - -&Show -&Rodyti - Downloading update... Siunčiamas atanujinimas... @@ -1703,18 +1728,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Configure your own synchronization rules. Nustatyti Jūsų pačių suvienodinimo taisykles. -Synchronization Settings -Suvienodinimo parametrai - Comparison Palyginimas Synchronization Suvienodinimas -Today -Šiandien - This week Ši savaitė @@ -1784,9 +1803,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Files Failai -Name -Pavadinimas - Percentage Procentai @@ -1900,16 +1916,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. %x valandų - -1 day -%x days - - -%x diena -%x dienos -%x dienų - - Cannot set privilege %x. Nepavyksta nustatyti privilegijos %x. @@ -1973,8 +1979,11 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Desktop Darbalaukis -Start menu -Pradėti meniu +Start Menu +Pradžios Meniu + +Send To +Siųsti Į Registering FreeFileSync file extensions Registruojami FreeFileSync failų plėtiniai @@ -2003,6 +2012,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Please choose the local installation type or select a different folder for installation. Prašome pasirinkti vietinio įdiegimo metodą arba pakeiskite aplaką. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Tylusis įdiegimo rėžimas galimas tik tai FreeFileSync Donoro Versijoje. +The %x installation option is only available in the FreeFileSync Donation Edition. +%x įdiegiamoji parinktis yra tiktai FreeFileSync Donoro Versijoje. diff --git a/FreeFileSync/Build/Languages/norwegian.lng b/FreeFileSync/Build/Languages/norwegian.lng index 8fd5f8e0..f7829a75 100755 --- a/FreeFileSync/Build/Languages/norwegian.lng +++ b/FreeFileSync/Build/Languages/norwegian.lng @@ -64,6 +64,9 @@ Syntax error Syntaksfeil +A left and a right directory path are expected after %x. +En venstre og en høyre katalogbane forventes etter %x. + Cannot find file %x. Kan ikke finne filen %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Hvis denne feilen blir ignorert vil mappene bli vurdert som tomme. Manglende mapper opprettes automatisk ved behov. +Comparison finished: +Sammenligning ferdig: + + +1 item found +%x items found + + +1 punkt funnet +%x punkter funnet + + File %x has an invalid date. Filen %x har en ugyldig dato. @@ -175,9 +190,6 @@ Using non-default global settings: Bruk av ikke-standard globale innstillinger: -Starting comparison -Starter sammenligning - A folder input field is empty. Der er ikke skrevet inn noe mappenavn. @@ -318,15 +330,15 @@ Faktisk: %y bytes Unable to move %x to the recycle bin. Kunne ikke flytte %x til papirkurven. +Cannot find %x. +Kan ikke finne %x. + Cannot open file %x. Kan ikke åpne filen %x. Cannot find device %x. Kan ikke finne enhet %x. -Cannot find %x. -Kan ikke finne %x. - Type of item %x is not supported: Elementtypen %x støttes ikke: @@ -432,6 +444,9 @@ Faktisk: %y bytes Lock owner: Lås eier: +Detecting abandoned lock... +Finner etterlatt lås... + 1 sec %x sec @@ -441,9 +456,6 @@ Faktisk: %y bytes %x sek -Detecting abandoned lock... -Finner etterlatt lås... - Items processed: Elementer behandlet: @@ -456,8 +468,8 @@ Faktisk: %y bytes Error parsing file %x, row %y, column %z. Behandlingsfeil i filen %x, rad %y, kolonne %z. -Cannot set directory lock for %x. -Kan ikke låse katalogen %x. +Cannot set directory locks for the following folders: +Kan ikke angi kataloglås for følgende mapper: 1 thread @@ -498,9 +510,6 @@ Faktisk: %y bytes Volume name %x is not part of file path %y. Volumnavnet %x er ikke en del av filstien %y. -Stop requested: Waiting for current operation to finish... -Avbryter: Venter til aktuell oppgave avsluttes... - Unable to create time stamp for versioning: Kan ikke opprette tidsstempel til versjonen: @@ -513,6 +522,9 @@ Faktisk: %y bytes Select a folder Velg en mappe +&New +&Ny + &Open... &Åpne... @@ -728,26 +740,23 @@ Kommandoen utføres hvis: job name jobbnavn -Show summary -Vis sammendrag +System: Sleep +System: Sov -Sleep -Hvilemodus +System: Shut down +System: Avslutt -Shut down -Avslutt - -Synchronization stopped -Synkroniseringen stoppet +Cleaning up old log files... +Fjerner gamle loggfiler... Stopped Stoppet -Synchronization completed with errors -Synkronisering gjennomført med feil +Completed with errors +Avsluttet med feil -Synchronization completed with warnings -Synkronisering gjennomført med advarsler +Completed with warnings +Avsluttet med advarsler Warning Advarsel @@ -755,15 +764,12 @@ Kommandoen utføres hvis: Nothing to synchronize Alt er synkronisert -Synchronization completed successfully -Synkronisering gjennomført uten feil +Completed successfully +Fullførte feilfritt Executing command %x Utfør kommandoen %x -Cleaning up old log files... -Fjerner gamle loggfiler... - You can switch to FreeFileSync's main window to resolve this issue. Du kan skifte til FreeFileSync's hovedvindu for at løse dette problemet. @@ -779,14 +785,8 @@ Kommandoen utføres hvis: Switching to FreeFileSync's main window Skifter til FreeFileSync's hovedvindu - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Prøver igjen om 1 sekund... -Prøver igjen om %x sekunder... - +Automatic retry +Prøv igjen automatisk Ignore &all Ignorer &alt @@ -797,6 +797,27 @@ Kommandoen utføres hvis: Serious Error Kritisk feil +Last session +Siste oppgave + +Today +I dag + + +1 day +%x days + + +1 dag +%x dager + + +Name +Navn + +Last sync +Sist synkronisert + Folder Mappe @@ -860,9 +881,6 @@ Kommandoen utføres hvis: Please select a folder on a local file system, network or an MTP device. Velg en mappe på lokalt filsystem, nettverk eller på en MTP-enhet. -&New -&Ny - &Save &Lagre @@ -974,6 +992,9 @@ Kommandoen utføres hvis: Total bytes to copy Antall bytes som kopieres +Arrange folder pair +Ordne mappepar + Folder pair: Mappepar: @@ -1066,11 +1087,14 @@ Kommandoen utføres hvis: Naming convention: Navne-regler: -&Ignore errors -&Ignorer feil +Ignore errors +Ignorér feil -Show pop-up on errors or warnings -Vis feilmeldinger og advarsler +Retry count: +Antall forsøk: + +Delay (in seconds): +Forsinkelse (i sekunder): Run a command after synchronization: Kjør en kommando etter synkronisering: @@ -1078,9 +1102,6 @@ Kommandoen utføres hvis: OK OK -Arrange folder pair -Ordne mappepar - Enter your login details: Skriv inn dine innloggingsdetaljer: @@ -1177,12 +1198,12 @@ Kommandoen utføres hvis: Minimize to notification area Minimér til status-feltet -Bytes copied: -Byte kopiert: - When finished: Når ferdig: +Auto-close +Auto-lukk + Close Lukk @@ -1195,12 +1216,18 @@ Kommandoen utføres hvis: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Lag en batchfil til automatisk synkronisering. Start ved å dobbeltklikke på filen eller planlegg via oppgaveplanlegger: %x +Progress dialog: +Fremdriftsdialog: + Run minimized Kjør minimert &Show error dialog & Vis feildialogboksen +Show pop-up on errors or warnings +Vis feilmeldinger og advarsler + &Cancel &Avbryt @@ -1249,14 +1276,11 @@ Sikrer prosessen ved alvorlige feil. Transfer file and folder permissions. Overfør fil- og mappe-tillatelser. -Automatic retry on error: -Gjør automatisk nytt forsøk ved feil: - -Retry count: -Antall forsøk: +Show hidden dialogs again +Vis skjulte vinduer igjen -Delay (in seconds): -Forsinkelse (i sekunder): +Show all permanently hidden dialogs and warning messages again +Vis alle skjulte vinduer og advarsler igjen Customize context menu: Tilpass kontekst-meny: @@ -1264,12 +1288,6 @@ Sikrer prosessen ved alvorlige feil. Description Beskrivelse -Show hidden dialogs again -Vis skjulte vinduer igjen - -Show all permanently hidden dialogs and warning messages again -Vis alle skjulte vinduer og advarsler igjen - &Default &Standard @@ -1324,14 +1342,23 @@ Sikrer prosessen ved alvorlige feil. Activate offline Aktivér frakoplet +Highlight configurations that have not been run for more than the following number of days: +Uthev konfigurasjoner som ikke har blitt kjørt for mer enn følgende antall dager: + +Synchronization Settings +Synkroniserings-innstillinger + +Access Online Storage +Få tilgang til nettverkslagring + Save as a Batch Job Lagre som en batchjobb Delete Items Slett elementene -Copy items -Kopier elementene +Copy Items +Kopiér elementer Options Valg @@ -1342,6 +1369,9 @@ Sikrer prosessen ved alvorlige feil. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Uthev konfigurasjoner + &Options &Valg @@ -1465,9 +1495,6 @@ Sikrer prosessen ved alvorlige feil. Select time span... Velg tidsinterval... -Last session -Siste oppgave - Folder Comparison and Synchronization Mappe-sammenligning og synkronisering @@ -1486,8 +1513,11 @@ Sikrer prosessen ved alvorlige feil. Do&n't save &Ikke lagre -Remove entry from list -Fjern valget fra listen +Hide configuration +Skjul konfigurasjoner + +Highlight... +Uthev... Clear filter Slett filter @@ -1567,6 +1597,9 @@ Sikrer prosessen ved alvorlige feil. Paused Pauset +Stop requested... +Stopp forespurt... + Initializing... Forbereder... @@ -1576,9 +1609,6 @@ Sikrer prosessen ved alvorlige feil. Comparing content... Sammenligner innhold... -Completed -Gjennomført - Info Info @@ -1660,12 +1690,6 @@ Sikrer prosessen ved alvorlige feil. Parameters for opposite side Parametere for motsatt side -Show hidden dialogs and warning messages again? -Vis gjemte vinduer og advarsler igjen? - -&Show -&Vis - Downloading update... Laster ned oppdatering... @@ -1690,18 +1714,12 @@ Sikrer prosessen ved alvorlige feil. Configure your own synchronization rules. Opprett dine egne synkroniseringsregler. -Synchronization Settings -Synkroniserings-innstillinger - Comparison Sammenligning Synchronization Synkronisering -Today -I dag - This week Denne uke @@ -1771,9 +1789,6 @@ Sikrer prosessen ved alvorlige feil. Files Filer -Name -Navn - Percentage Prosent @@ -1885,15 +1900,6 @@ Sikrer prosessen ved alvorlige feil. %x timer - -1 day -%x days - - -1 dag -%x dager - - Cannot set privilege %x. Kan ikke sette privilegier %x. @@ -1957,8 +1963,11 @@ Sikrer prosessen ved alvorlige feil. Desktop Skrivebord -Start menu -Startmeny +Start Menu +Start-meny + +Send To +Send til Registering FreeFileSync file extensions Registrerer FreeFileSync's filendelser @@ -1987,6 +1996,6 @@ Sikrer prosessen ved alvorlige feil. Please choose the local installation type or select a different folder for installation. Velg den lokale installasjonstype eller velge en annen mappe for installasjon. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Den tause installasjonsmodus er bare tilgjengelig i FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +Installasjonsalternativet %x er bare tilgjengelig i FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/polish.lng b/FreeFileSync/Build/Languages/polish.lng index 6ba18981..077c5115 100755 --- a/FreeFileSync/Build/Languages/polish.lng +++ b/FreeFileSync/Build/Languages/polish.lng @@ -64,6 +64,9 @@ Syntax error Błąd składni +A left and a right directory path are expected after %x. + + Cannot find file %x. Nie można odnaleźć pliku %x. @@ -115,6 +118,16 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Jeżeli ten błąd zostanie zignorowany, katalogi zostaną uznane za puste. Brakujące katalogi będą w razie potrzeby utworzone automatycznie. +Comparison finished: + + + +1 item found +%x items found + + + + File %x has an invalid date. Plik %x ma nieprawidłową datę. @@ -175,9 +188,6 @@ Using non-default global settings: Wykorzystane niestandardowe ustawienia globalne: -Starting comparison -Kompresowanie - A folder input field is empty. Pole katalog źródłowy jest puste. @@ -318,15 +328,15 @@ Przesłany: %y bajtów Unable to move %x to the recycle bin. Nie można przenieść %x do kosza. +Cannot find %x. +Nie można odnaleźć %x. + Cannot open file %x. Nie można otworzyć pliku %x. Cannot find device %x. Nie można odnaleźć urządzenia %x. -Cannot find %x. -Nie można odnaleźć %x. - Type of item %x is not supported: Element typu %x nie jest wspierany: @@ -435,6 +445,9 @@ Przesłany: %y bajtów Lock owner: Właściciel blokady: +Detecting abandoned lock... +Wykrywanie nieaktywnej blokady... + 1 sec %x sec @@ -445,9 +458,6 @@ Przesłany: %y bajtów %x sekund -Detecting abandoned lock... -Wykrywanie nieaktywnej blokady... - Items processed: Przetworzone elementy: @@ -460,8 +470,8 @@ Przesłany: %y bajtów Error parsing file %x, row %y, column %z. Błąd podczas parsowania pliku %x, rząd %y, kolumna %z. -Cannot set directory lock for %x. -Nie można utworzyć blokady dla katalogu %x. +Cannot set directory locks for the following folders: + 1 thread @@ -503,9 +513,6 @@ Przesłany: %y bajtów Volume name %x is not part of file path %y. Nazwa zasobu %x ni jest częścią ścieżki %y. -Stop requested: Waiting for current operation to finish... -Przerwanie: Oczekiwanie na zakończenie aktualnej operacji... - Unable to create time stamp for versioning: Nie można utworzyć znacznika czasu: @@ -518,6 +525,9 @@ Przesłany: %y bajtów Select a folder Wybierz katalog +&New +&Nowy + &Open... &Otwórz... @@ -733,26 +743,23 @@ Komenda jest wykonywana gdy: job name nazwa zadania -Show summary -Pokaż podsumowanie +System: Sleep + -Sleep -Stan uśpienia +System: Shut down + -Shut down -Wyłącz komputer - -Synchronization stopped -Synchronizacja przerwana +Cleaning up old log files... +Usuwanie starych plików logów... Stopped Zatrzymana -Synchronization completed with errors -Synchronizacja zakończona z błędami +Completed with errors + -Synchronization completed with warnings -Synchronizacja zakończona z ostrzeżeniami +Completed with warnings + Warning Ostrzeżenie @@ -760,15 +767,12 @@ Komenda jest wykonywana gdy: Nothing to synchronize Brak plików do synchronizacji -Synchronization completed successfully -Synchronizacja zakończona pomyślnie +Completed successfully + Executing command %x Wykonywanie polecenia %x -Cleaning up old log files... -Usuwanie starych plików logów... - You can switch to FreeFileSync's main window to resolve this issue. Możesz przejść do głównego okna FreeFileSync abe rozwiązać ten problem. @@ -784,15 +788,8 @@ Komenda jest wykonywana gdy: Switching to FreeFileSync's main window Przejdź do głównego okna FreeFileSync. - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automatyczne ponowienie za 1 sekundę... -Automatyczne ponowienie za %x sekundy... -Automatyczne ponowienie za %x sekund... - +Automatic retry + Ignore &all Ignoruj &wszystkie @@ -803,6 +800,28 @@ Komenda jest wykonywana gdy: Serious Error Poważny błąd +Last session +Ostatnia sesja + +Today +Dzisiaj + + +1 day +%x days + + +1 dzień +%x dni +%x dni + + +Name +Nazwa + +Last sync + + Folder Katalog @@ -866,9 +885,6 @@ Komenda jest wykonywana gdy: Please select a folder on a local file system, network or an MTP device. Okreś katalog lokalny, sieciowy bądź urządzenie MTP. -&New -&Nowy - &Save &Zapisz @@ -980,6 +996,9 @@ Komenda jest wykonywana gdy: Total bytes to copy Całkowity rozmiar do skopiowania +Arrange folder pair +Uporządkuj parę katalogów + Folder pair: Para folderów: @@ -1072,11 +1091,14 @@ Komenda jest wykonywana gdy: Naming convention: Konwencja nazewnictwa: -&Ignore errors -&Ignoruj błędy +Ignore errors + -Show pop-up on errors or warnings -Pokazuj okna pop-up dla błędów i ostrzeżeń +Retry count: +Liczba prób: + +Delay (in seconds): +Opóźnienie (w sekundach): Run a command after synchronization: Uruchom komendę po zakończonej synchronizacji: @@ -1084,9 +1106,6 @@ Komenda jest wykonywana gdy: OK OK -Arrange folder pair -Uporządkuj parę katalogów - Enter your login details: Wprowadź dane do logowania: @@ -1183,12 +1202,12 @@ Komenda jest wykonywana gdy: Minimize to notification area Minimalizuj do obszaru powiadomień -Bytes copied: -Skopiowano bajtów: - When finished: Gdy zakończono: +Auto-close + + Close Zamknij @@ -1201,12 +1220,18 @@ Komenda jest wykonywana gdy: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Utwórz plik wsadowy do zautomatyzowania procesu synchronizacji. Aby rozpocząć, klknij dwa razy plik lub zaplanuj zadanie w harmonogramie zadań: %x +Progress dialog: + + Run minimized Uruchom zminimalizowane &Show error dialog &Pokaż powiadomienie z błędem +Show pop-up on errors or warnings +Pokazuj okna pop-up dla błędów i ostrzeżeń + &Cancel &Anuluj @@ -1255,14 +1280,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Transfer file and folder permissions. kopiuj uprawnienia plików i katalogów. -Automatic retry on error: -Automatyczne ponowienie operacji podczas błędu: - -Retry count: -Liczba prób: +Show hidden dialogs again +Przywróć ukryte dialogi -Delay (in seconds): -Opóźnienie (w sekundach): +Show all permanently hidden dialogs and warning messages again +Przywróć wszystkie, stale ukryte dialogi i powiadomienia Customize context menu: Dostosuj menu kontekstowe: @@ -1270,12 +1292,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Description Opis -Show hidden dialogs again -Przywróć ukryte dialogi - -Show all permanently hidden dialogs and warning messages again -Przywróć wszystkie, stale ukryte dialogi i powiadomienia - &Default &Domyślne @@ -1330,14 +1346,23 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Activate offline Aktywuj offline +Highlight configurations that have not been run for more than the following number of days: + + +Synchronization Settings +Ustawienia synchronizacji + +Access Online Storage + + Save as a Batch Job Zapisz jako plik wsadowy. Delete Items Usuń elementy -Copy items -Kopiuj element +Copy Items + Options Opcje @@ -1348,6 +1373,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations + + &Options &Opcje @@ -1475,9 +1503,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Select time span... Określ przedział czasowy... -Last session -Ostatnia sesja - Folder Comparison and Synchronization Porównywanie i Synchronizacja folderów @@ -1496,8 +1521,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Do&n't save &Nie zapisuj -Remove entry from list -Usuń wpis z listy +Hide configuration + + +Highlight... + Clear filter Wyczyść filtr @@ -1577,6 +1605,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Paused Pauza +Stop requested... + + Initializing... Inicjalizacja... @@ -1586,9 +1617,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Comparing content... Porównywanie zawartości... -Completed -Zakończono - Info Info @@ -1673,12 +1701,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Parameters for opposite side Parametry dla strony przeciwnej -Show hidden dialogs and warning messages again? -Przywrócić ukryte dialogi i powiadomienia? - -&Show -&Przywróć - Downloading update... Pobieranie aktualizacji... @@ -1703,18 +1725,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Configure your own synchronization rules. Skonfiguruj swoje własne reguły synchronizacji. -Synchronization Settings -Ustawienia synchronizacji - Comparison Porównanie Synchronization Synchronizacja -Today -Dzisiaj - This week W tym tygodniu @@ -1784,9 +1800,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Files Pliki -Name -Nazwa - Percentage Procentowo @@ -1900,16 +1913,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp %x godzin - -1 day -%x days - - -1 dzień -%x dni -%x dni - - Cannot set privilege %x. Nie można ustawić uprawnień %x. @@ -1973,8 +1976,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Desktop Na Pulpicie -Start menu -Menu Start +Start Menu + + +Send To + Registering FreeFileSync file extensions Rejestrowanie rozszerzeń plików FreeFileSync @@ -2003,6 +2009,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Please choose the local installation type or select a different folder for installation. Wybierz lokalny typ instalacji lub określ inny katalog. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Konsolowy tryb instalacji dostępny jest tylko w wersji FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. + diff --git a/FreeFileSync/Build/Languages/portuguese.lng b/FreeFileSync/Build/Languages/portuguese.lng index fc969793..493c0a0b 100755 --- a/FreeFileSync/Build/Languages/portuguese.lng +++ b/FreeFileSync/Build/Languages/portuguese.lng @@ -64,6 +64,9 @@ Syntax error Erro de sintaxe +A left and a right directory path are expected after %x. +É esperado um caminho de directório esquerdo e direito após %x. + Cannot find file %x. Não é possível encontrar o ficheiro %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Se este erro é ignorado as pastas serão consideradas vazias. Pastas ausentes são criados automaticamente quando necessário. +Comparison finished: +Comparação terminada: + + +1 item found +%x items found + + +1 item encontrado +%x itens encontrados + + File %x has an invalid date. Ficheiro %x tem data inválida. @@ -175,9 +190,6 @@ Using non-default global settings: Usando definições globais não predefinidas: -Starting comparison -A iniciar a comparação - A folder input field is empty. Um dos campos de directório para comparar está vazio. @@ -318,15 +330,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. Não é possível mover %x para a reciclagem. +Cannot find %x. +Não é possível encontrar %x. + Cannot open file %x. Não é possível abrir o ficheiro %x. Cannot find device %x. Não é possível encontrar o dispositivo %x. -Cannot find %x. -Não é possível encontrar %x. - Type of item %x is not supported: Tipo de item %x não é suportado: @@ -432,6 +444,9 @@ Actual: %y bytes Lock owner: Dono do bloqueio: +Detecting abandoned lock... +Detectado bloqueio abandonado... + 1 sec %x sec @@ -441,9 +456,6 @@ Actual: %y bytes %x segs -Detecting abandoned lock... -Detectado bloqueio abandonado... - Items processed: Elementos processados: @@ -456,8 +468,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. Erro ao analisar ficheiro %x, linha %y, coluna %z. -Cannot set directory lock for %x. -Não é possível colocar o bloqueio de directório para %x. +Cannot set directory locks for the following folders: +Incapaz de definir bloqueios de directórios para as seguintes pastas: 1 thread @@ -498,9 +510,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. Nome de volume %x não faz parte do caminho do ficheiro %y. -Stop requested: Waiting for current operation to finish... -Paragem solicitada: À espera que termine a operação actual... - Unable to create time stamp for versioning: Não é possível criar data/hora para controlo de versões: @@ -513,6 +522,9 @@ Actual: %y bytes Select a folder Seleccione uma pasta +&New +&Novo + &Open... &Abrir... @@ -717,7 +729,7 @@ O comando é executado se: A pasta de versão está contida em uma pasta base. Synchronizing folder pair: -A cincronizar o par de pastas: +A sincronizar o par de pastas: Generating database... A gerar base de dados... @@ -728,26 +740,23 @@ O comando é executado se: job name nome da tarefa -Show summary -Mostrar resumo - -Sleep +System: Sleep Suspender -Shut down +System: Shut down Desligar -Synchronization stopped -Sincronização parada +Cleaning up old log files... +A limpar ficheiros de log antigos... Stopped Parado -Synchronization completed with errors -Sincronização completa com erros +Completed with errors +Concluído com erros -Synchronization completed with warnings -Sincronização completa com avisos +Completed with warnings +Concluído com avisos Warning Atenção @@ -755,15 +764,12 @@ O comando é executado se: Nothing to synchronize Nada a sincronizar -Synchronization completed successfully -Sincronização completa com sucesso +Completed successfully +Concluído com sucesso Executing command %x A executar comando %x -Cleaning up old log files... -A limpar ficheiros de log antigos... - You can switch to FreeFileSync's main window to resolve this issue. Pode mudar para a janela principal do FreeFileSync para resolver este problema. @@ -779,14 +785,8 @@ O comando é executado se: Switching to FreeFileSync's main window A mudar para a janela principal do FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Repetir automaticamente dentro de 1 segundo... -Repetir automaticamente dentro de %x segundos... - +Automatic retry +Repetir automático Ignore &all Ignorar &todos @@ -797,6 +797,27 @@ O comando é executado se: Serious Error Erro Grave +Last session +Última Sessão + +Today +Hoje + + +1 day +%x days + + +1 dia +%x dias + + +Name +Nome + +Last sync +Última sincronia + Folder Pasta @@ -860,9 +881,6 @@ O comando é executado se: Please select a folder on a local file system, network or an MTP device. Seleccione a pasta no sistema de ficheiros local, rede ou dispositivo MTP. -&New -&Novo - &Save G&uardar @@ -974,6 +992,9 @@ O comando é executado se: Total bytes to copy Total em bytes a copiar +Arrange folder pair +Organizar par da pasta + Folder pair: Par da pasta: @@ -1066,11 +1087,14 @@ O comando é executado se: Naming convention: Convenção de nomes: -&Ignore errors -&Ignorar erros +Ignore errors +Ignorar erros -Show pop-up on errors or warnings -Mostrar popup em caso de erros ou avisos +Retry count: +Nº de tentativas: + +Delay (in seconds): +Atraso (em segundos): Run a command after synchronization: Executar um comando após a sincronização: @@ -1078,9 +1102,6 @@ O comando é executado se: OK OK -Arrange folder pair -Organizar par da pasta - Enter your login details: Entre os detalhes do login: @@ -1177,12 +1198,12 @@ O comando é executado se: Minimize to notification area Minimizar para a área de notificação -Bytes copied: -Bytes copiados: - When finished: Quando concluído: +Auto-close +Fechar quando feito + Close Fechar @@ -1195,12 +1216,18 @@ O comando é executado se: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Criar ficheiro batch para sincronização automática. Para iniciar, fazer duplo clique no ficheiro ou acrescentar ao planeador de tarefas: %x +Progress dialog: +Diálogo de progresso: + Run minimized Correr minimizado &Show error dialog Mo&strar diálogo de erro +Show pop-up on errors or warnings +Mostrar popup em caso de erros ou avisos + &Cancel &Cancelar @@ -1249,14 +1276,11 @@ Isto garante um estado consistente mesmo em caso de falha grave. Transfer file and folder permissions. Transferir permissões de pasta e ficheiro. -Automatic retry on error: -Repetir automaticamente em caso de erro: - -Retry count: -Nº de tentativas: +Show hidden dialogs again +Mostrar diálogos ocultos novamente -Delay (in seconds): -Atraso (em segundos): +Show all permanently hidden dialogs and warning messages again +Mostrar todos os diálogos escondidos permanentemente e mensagens de aviso novamente Customize context menu: Personalizar menu de contexto: @@ -1264,12 +1288,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. Description Descrição -Show hidden dialogs again -Mostrar diálogos ocultos novamente - -Show all permanently hidden dialogs and warning messages again -Mostrar todos os diálogos escondidos permanentemente e mensagens de aviso novamente - &Default &Config. Iniciais @@ -1324,14 +1342,23 @@ Isto garante um estado consistente mesmo em caso de falha grave. Activate offline Activar offline +Highlight configurations that have not been run for more than the following number of days: +Realce configurações que não foram executadas pelo seguinte número de dias: + +Synchronization Settings +Definições de Sincronização + +Access Online Storage +Acessar Armazenamento Online + Save as a Batch Job Salvar como Tarefa em Lote Delete Items Eliminar Itens -Copy items -Copiar elementos +Copy Items +Copiar Itens Options Opções @@ -1342,6 +1369,9 @@ Isto garante um estado consistente mesmo em caso de falha grave. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Realçar Configurações + &Options &Opções @@ -1465,9 +1495,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. Select time span... Seleccione o intervalo de tempo... -Last session -Última Sessão - Folder Comparison and Synchronization Comparação e Sincronização de Pastas @@ -1486,8 +1513,11 @@ Isto garante um estado consistente mesmo em caso de falha grave. Do&n't save Não g&uardar -Remove entry from list -Remover entrada da lista +Hide configuration +Ocultar configuração + +Highlight... +Realçar... Clear filter Limpar filtro @@ -1567,6 +1597,9 @@ Isto garante um estado consistente mesmo em caso de falha grave. Paused Em pausa +Stop requested... +Parar pedido... + Initializing... A iniciar... @@ -1576,9 +1609,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. Comparing content... A comparar... -Completed -Terminado - Info Info @@ -1660,12 +1690,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. Parameters for opposite side Parâmetros do lado oposto -Show hidden dialogs and warning messages again? -Mostrar diálogos ocultos e mensagens de erro novamente? - -&Show -&Mostrar - Downloading update... A descarregar actualização... @@ -1690,18 +1714,12 @@ Isto garante um estado consistente mesmo em caso de falha grave. Configure your own synchronization rules. Configure as suas regras de sincronização. -Synchronization Settings -Definições de Sincronização - Comparison Comparação Synchronization Sincronização -Today -Hoje - This week Esta semana @@ -1771,9 +1789,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. Files Ficheiros -Name -Nome - Percentage Percentagem @@ -1885,15 +1900,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. %x horas - -1 day -%x days - - -1 dia -%x dias - - Cannot set privilege %x. Não é possível definir o privilégio %x. @@ -1957,9 +1963,12 @@ Isto garante um estado consistente mesmo em caso de falha grave. Desktop Área de trabalho -Start menu +Start Menu Menu Iniciar +Send To +Enviar para + Registering FreeFileSync file extensions A registar as extensões do FreeFileSync @@ -1987,6 +1996,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. Please choose the local installation type or select a different folder for installation. Por favor, escolha o tipo do local de instalação ou seleccione uma pasta diferente para instalar. -The silent installation mode is only available in the FreeFileSync Donation Edition. -A instalação silenciosa somente está disponível no FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +A opção de instalação %x está disponível somente no FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/portuguese_br.lng b/FreeFileSync/Build/Languages/portuguese_br.lng index 1b80e8d1..8639ec65 100755 --- a/FreeFileSync/Build/Languages/portuguese_br.lng +++ b/FreeFileSync/Build/Languages/portuguese_br.lng @@ -64,6 +64,9 @@ Syntax error Erro de sintaxe +A left and a right directory path are expected after %x. +Um caminho de diretório esquerdo e um direito são esperados após %x. + Cannot find file %x. Não é possível encontrar o arquivo %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Se o erro for ignorado, as pastas serão consideradas vazias. Pastas não encontradas serão criadas automaticamentes quando necessário. +Comparison finished: +Comparação finalizada: + + +1 item found +%x items found + + +1 item encontrado +%x itens encontrados + + File %x has an invalid date. O arquivo %x tem uma data inválida. @@ -175,9 +190,6 @@ Using non-default global settings: Usando configurações globais não predefinidas: -Starting comparison -Iniciando comparação - A folder input field is empty. Um campo de entrada de pasta está vazio. @@ -318,15 +330,15 @@ Atual: %y bytes Unable to move %x to the recycle bin. Não é possível mover %x para a Lixeira. +Cannot find %x. +Não é possível encontrar %x. + Cannot open file %x. Não é possível abrir o arquivo %x. Cannot find device %x. Não é possível encontrar o dispositivo %x. -Cannot find %x. -Não é possível encontrar %x. - Type of item %x is not supported: Tipo de item %x não é suportado: @@ -432,6 +444,9 @@ Atual: %y bytes Lock owner: Proprietário de bloqueio: +Detecting abandoned lock... +Detectando bloqueamento abandonado... + 1 sec %x sec @@ -441,9 +456,6 @@ Atual: %y bytes %x s -Detecting abandoned lock... -Detectando bloqueamento abandonado... - Items processed: Elementos processados: @@ -456,8 +468,8 @@ Atual: %y bytes Error parsing file %x, row %y, column %z. Erro analisando o arquivo %x, linha %y, coluna %z. -Cannot set directory lock for %x. -Não é possível bloquear o diretório %x. +Cannot set directory locks for the following folders: +Não é possível estabelecer bloqueio de diretório para as seguintes pastas: 1 thread @@ -498,9 +510,6 @@ Atual: %y bytes Volume name %x is not part of file path %y. O nome do volume %x não faz parte do caminho do arquivo %y. -Stop requested: Waiting for current operation to finish... -Interromper solicitado: Aguardando operação ser finalizada... - Unable to create time stamp for versioning: Não é possível criar a estampa de tempo para o controle de versões: @@ -513,6 +522,9 @@ Atual: %y bytes Select a folder Selecionar uma pasta +&New +&Novo + &Open... &Abrir... @@ -728,26 +740,23 @@ O comando é disparado se: job name nome da tarefa -Show summary -Mostrar resumo +System: Sleep +Sistema: Suspender -Sleep -Suspender +System: Shut down +Sistema: Desligar -Shut down -Desligar - -Synchronization stopped -Sincronização interrompida +Cleaning up old log files... +Limpando arquivo de log antigo... Stopped Interrompido -Synchronization completed with errors -Sincronização finalizada com erros +Completed with errors +Concluído com erros -Synchronization completed with warnings -Sincronização finalizada com avisos +Completed with warnings +Concluído com avisos Warning Aviso @@ -755,15 +764,12 @@ O comando é disparado se: Nothing to synchronize Nada para sincronizar -Synchronization completed successfully -Sincronização finalizada com êxito +Completed successfully +Concluído com sucesso Executing command %x Executando comando %x -Cleaning up old log files... -Limpando arquivo de log antigo... - You can switch to FreeFileSync's main window to resolve this issue. Você pode alternar para a janela principal do FreeFileSync para resolver este problema. @@ -779,14 +785,8 @@ O comando é disparado se: Switching to FreeFileSync's main window Alternando para a janela principal do FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Nova tentativa em 1 segundo... -Nova tentativa em %x segundos... - +Automatic retry +Nova tentativa automática Ignore &all Ignorar &todos @@ -797,6 +797,27 @@ O comando é disparado se: Serious Error Erro Grave +Last session +Última sessão + +Today +Hoje + + +1 day +%x days + + +1 dia +%x dias + + +Name +Nome + +Last sync +Últ. Sinc. + Folder Pasta @@ -860,9 +881,6 @@ O comando é disparado se: Please select a folder on a local file system, network or an MTP device. Selecione uma pasta em um sistema de arquivos local, de rede ou de um dispositivo MTP. -&New -&Novo - &Save &Salvar @@ -927,7 +945,7 @@ O comando é disparado se: Remover par de pastas Access online storage -Acessar armazenamento on-line +Acessar armazenamento online Swap sides Trocar lados @@ -974,6 +992,9 @@ O comando é disparado se: Total bytes to copy Bytes totais a serem copiados +Arrange folder pair +Organizar par de pastas + Folder pair: Par de pastas: @@ -1066,11 +1087,14 @@ O comando é disparado se: Naming convention: Convenção de nomenclatura: -&Ignore errors -&Ignorar erros +Ignore errors +Ignorar erros -Show pop-up on errors or warnings -Mostrar pop-up em caso de erros ou avisos +Retry count: +Número de tentativas: + +Delay (in seconds): +Atraso (em segundos): Run a command after synchronization: Executar um comando após a sincronização: @@ -1078,9 +1102,6 @@ O comando é disparado se: OK OK -Arrange folder pair -Organizar par de pastas - Enter your login details: Entre com seus dados de login: @@ -1177,12 +1198,12 @@ O comando é disparado se: Minimize to notification area Minimizar para a área de notificação -Bytes copied: -Bytes copiados: - When finished: Quando concluído: +Auto-close +Fechamento automático + Close Fechar @@ -1195,12 +1216,18 @@ O comando é disparado se: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Criar um arquivo de tarefa em lotes para sincronização desatendida. Para iniciar, dê um clique duplo neste arquivo ou insira no agendador de tarefas: %x +Progress dialog: +Caixa de diálogo de progresso: + Run minimized Executar minimizado &Show error dialog &Mostrar caixa de diálogo de erro +Show pop-up on errors or warnings +Mostrar pop-up em caso de erros ou avisos + &Cancel &Cancelar @@ -1249,14 +1276,11 @@ Isto garante um estado consistente mesmo em caso de erro grave. Transfer file and folder permissions. Transferir permissões de arquivos e pastas. -Automatic retry on error: -Nova tentativa em caso de erro: - -Retry count: -Número de tentativas: +Show hidden dialogs again +Mostrar caixas de diálogo ocultadas -Delay (in seconds): -Atraso (em segundos): +Show all permanently hidden dialogs and warning messages again +Mostrar todos as caixas de diálogo e mensagens de aviso permanentemente ocultadas Customize context menu: Personalizar menu de contexto: @@ -1264,12 +1288,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. Description Descrição -Show hidden dialogs again -Mostrar caixas de diálogo ocultadas - -Show all permanently hidden dialogs and warning messages again -Mostrar todos as caixas de diálogo e mensagens de aviso permanentemente ocultadas - &Default &Config. Padrão @@ -1280,7 +1298,7 @@ Isto garante um estado consistente mesmo em caso de erro grave. Se você gosta do FreeFileSync: Support with a donation -Apoie com uma doação. +Apoie com uma doação Donation details Detalhes da doação @@ -1298,7 +1316,7 @@ Isto garante um estado consistente mesmo em caso de erro grave. E-mail Published under the GNU General Public License -Publicado sobre a GNU General Public License +Publicado sob a GNU General Public License Many thanks for localization: Pela tradução, um agradecimento a: @@ -1310,7 +1328,7 @@ Isto garante um estado consistente mesmo em caso de erro grave. 1. Ativar pela internet agora: Activate online -Ativar on-line +Ativar online 2. Retrieve an offline activation key from the following URL: 2. Recuperar uma chave de ativação off-line a partir da seguinte URL: @@ -1324,14 +1342,23 @@ Isto garante um estado consistente mesmo em caso de erro grave. Activate offline Ativar off-line +Highlight configurations that have not been run for more than the following number of days: +Realçar configurações que não foram executadas a mais do seguinte número de dias: + +Synchronization Settings +Configurações de Sincronização + +Access Online Storage +Acessar Armazenamento Online + Save as a Batch Job Salvar como um Trabalho em Lotes Delete Items Excluir Itens -Copy items -Copiar itens +Copy Items +Copiar Itens Options Opções @@ -1342,6 +1369,9 @@ Isto garante um estado consistente mesmo em caso de erro grave. FreeFileSync Donation Edition FreeFileSync Edição do Doador +Highlight Configurations +Realçar Configurações + &Options &Opções @@ -1373,7 +1403,7 @@ Isto garante um estado consistente mesmo em caso de erro grave. FreeFileSync %x está disponível! Installation files are corrupted. Please reinstall FreeFileSync. -Os arquivos de instalação estão corrompidos. Por favor reinstale o FreeFileSync. +Os arquivos de instalação estão corrompidos. Por favor, reinstale o FreeFileSync. Local path not available for %x. Caminho local não disponível para %x. @@ -1442,7 +1472,7 @@ Isto garante um estado consistente mesmo em caso de erro grave. &Copiar para... &Delete -&Exluir +&Excluir Include all Incluir todos @@ -1465,9 +1495,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. Select time span... Selecionar intervalo de tempo... -Last session -Última sessão - Folder Comparison and Synchronization Comparação e Sincronização de Pastas @@ -1486,8 +1513,11 @@ Isto garante um estado consistente mesmo em caso de erro grave. Do&n't save &Não salvar -Remove entry from list -Remover entrada da lista +Hide configuration +Ocultar configuração + +Highlight... +Realçar... Clear filter Limpar filtro @@ -1567,6 +1597,9 @@ Isto garante um estado consistente mesmo em caso de erro grave. Paused Pausado +Stop requested... +Parada solicitada... + Initializing... Inicializando... @@ -1576,9 +1609,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. Comparing content... Comparando conteúdo... -Completed -Finalizado - Info Informações @@ -1660,12 +1690,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. Parameters for opposite side Parâmetros para o lado oposto -Show hidden dialogs and warning messages again? -Mostrar caixas de diálogo e mensagens de aviso ocultadas novamente? - -&Show -&Mostrar - Downloading update... Baixando atualização... @@ -1690,18 +1714,12 @@ Isto garante um estado consistente mesmo em caso de erro grave. Configure your own synchronization rules. Configure as suas próprias regras de sincronização. -Synchronization Settings -Configurações de Sincronização - Comparison Comparação Synchronization Sincronização -Today -Hoje - This week Esta semana @@ -1771,9 +1789,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. Files Arquivos -Name -Nome - Percentage Percentual @@ -1885,15 +1900,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. %x horas - -1 day -%x days - - -1 dia -%x dias - - Cannot set privilege %x. Não é possível estabelecer o privilégio %x. @@ -1957,9 +1963,12 @@ Isto garante um estado consistente mesmo em caso de erro grave. Desktop Área de trabalho -Start menu +Start Menu Menu Iniciar +Send To +Enviar para + Registering FreeFileSync file extensions Registrando as extensões de arquivos do FreeFileSync @@ -1987,6 +1996,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. Please choose the local installation type or select a different folder for installation. Escolha o tipo de instalação local ou selecione uma pasta diferente para instalação. -The silent installation mode is only available in the FreeFileSync Donation Edition. -O modo silencioso de instalação está disponível apenas no FreeFileSync Edição do Doador. +The %x installation option is only available in the FreeFileSync Donation Edition. +A opção de instalação %x está disponível apenas na Edição do Doador do FreeFileSync. diff --git a/FreeFileSync/Build/Languages/romanian.lng b/FreeFileSync/Build/Languages/romanian.lng index 210ca459..aa9255ec 100755 --- a/FreeFileSync/Build/Languages/romanian.lng +++ b/FreeFileSync/Build/Languages/romanian.lng @@ -64,6 +64,9 @@ Syntax error Eroare de sintaxă +A left and a right directory path are expected after %x. +O cale pentru dosarul stîng și cel drept e așteptată după %x. + Cannot find file %x. Nu pot găsi fila %x. @@ -115,6 +118,19 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Dacă această eroare este ignorată, dosarele lipsă vor fi considerate goale. Dosarele lipsă vor fi create automat la nevoie. +Comparison finished: +Comparare terminată: + + +1 item found +%x items found + + +1 element găsit +%x elemente găsite +%x de elemente găsite + + File %x has an invalid date. Fila %x are o dată nevalidă. @@ -175,9 +191,6 @@ Using non-default global settings: Folosirea de setări globale non-implicite: -Starting comparison -Pornesc compararea - A folder input field is empty. Un cîmp de introducere a dosarului este gol. @@ -318,15 +331,15 @@ Actuală: %y baiți Unable to move %x to the recycle bin. Nu pot muta %x în Reciclator. +Cannot find %x. +Nu pot găsi %x. + Cannot open file %x. Nu pot deschide fila %x. Cannot find device %x. Nu pot găsi dispozitivul %x. -Cannot find %x. -Nu pot găsi %x. - Type of item %x is not supported: Tipul de element %x nu e suportat: @@ -435,6 +448,9 @@ Actuală: %y baiți Lock owner: Zăvorăște proprietarul: +Detecting abandoned lock... +Detectez zăvorîrea [lock] abandonată... + 1 sec %x sec @@ -445,9 +461,6 @@ Actuală: %y baiți %x de sec -Detecting abandoned lock... -Detectez zăvorîrea [lock] abandonată... - Items processed: Elemente Procesate: @@ -460,8 +473,8 @@ Actuală: %y baiți Error parsing file %x, row %y, column %z. Eroare la parsarea filei %x, rîndul %y, coloana %z. -Cannot set directory lock for %x. -Nu pot face zăvorîrea dosarului %x. +Cannot set directory locks for the following folders: +Nu pot seta zăvorîrea [lock] pentru dosarele următoare: 1 thread @@ -503,9 +516,6 @@ Actuală: %y baiți Volume name %x is not part of file path %y. Numele volumului %x nu face parte din calea filei %y. -Stop requested: Waiting for current operation to finish... -Oprire solicitată: Aștept terminarea operației în curs... - Unable to create time stamp for versioning: Nu pot crea marcajul de timp pentru versionare: @@ -518,6 +528,9 @@ Actuală: %y baiți Select a folder Selectează un Dosar +&New +Configurație &Nouă + &Open... &Deschide... @@ -733,26 +746,23 @@ Comanda este declanșată dacă: job name numele sarcinii -Show summary -Arată sumarul (rezumatul) +System: Sleep +Sistem: Pune în Repaus [Sleep] -Sleep -Pune în repaus [sleep] +System: Shut down +Sistem: Închide PC-ul [Shut down] -Shut down -Închide PC-ul [Shut down] - -Synchronization stopped -Sincronizare oprită +Cleaning up old log files... +Curăț filele de jurnalizare vechi... Stopped Oprită -Synchronization completed with errors -Sincronizare terminată cu erori +Completed with errors +Realizată cu erori -Synchronization completed with warnings -Sincronizare realizată, dar cu avertismente +Completed with warnings +Realizată cu atenționări Warning Atenție @@ -760,15 +770,12 @@ Comanda este declanșată dacă: Nothing to synchronize Nu e nimic de sincronizat -Synchronization completed successfully -Sincronizare realizată cu succes +Completed successfully +Realizată cu succes Executing command %x Execut comanda %x -Cleaning up old log files... -Curăț filele de jurnalizare vechi... - You can switch to FreeFileSync's main window to resolve this issue. Poți comuta la fereastra principală FreeFileSync pentru a rezolva această problemă. @@ -784,15 +791,8 @@ Comanda este declanșată dacă: Switching to FreeFileSync's main window Comut la fereastra principală FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Reîncercare automată în 1 secundă... -Reîncercare automată în %x secunde... -Reîncercare automată în %x de secunde... - +Automatic retry +Reîncearcă Automat Ignore &all Ignoră &Tot @@ -803,6 +803,28 @@ Comanda este declanșată dacă: Serious Error Eroare Serioasă +Last session +Ultima Sesiune + +Today +Azi + + +1 day +%x days + + +1 zi +%x zile +%x de zile + + +Name +Nume + +Last sync +Ultima Sincr. + Folder Dosar @@ -813,7 +835,7 @@ Comanda este declanșată dacă: Cale Completă Relative path -Calea Relativă +Cale Relativă Item name Numele Elementului @@ -866,9 +888,6 @@ Comanda este declanșată dacă: Please select a folder on a local file system, network or an MTP device. Selectează un dosar de pe un sistem de file local, din rețea sau de pe un dispozitiv MTP (dispozitiv media portabil). -&New -Configurație &Nouă - &Save &Salvează @@ -980,6 +999,9 @@ Comanda este declanșată dacă: Total bytes to copy Numărul total de baiți copiați +Arrange folder pair +Aranjează perechea de dosare + Folder pair: Perechea de Dosare: @@ -1072,11 +1094,14 @@ Comanda este declanșată dacă: Naming convention: Convenție de numire: -&Ignore errors -&Ignoră Erorile +Ignore errors +Ignoră erorile -Show pop-up on errors or warnings -În caz de erori sau avertizări este arătată o fereastră popîc [popup] +Retry count: +Numărul reîncercărilor: + +Delay (in seconds): +Întîrziere (în secunde): Run a command after synchronization: Rulează o comandă după sincronizare: @@ -1084,9 +1109,6 @@ Comanda este declanșată dacă: OK OK -Arrange folder pair -Aranjează perechea de dosare - Enter your login details: Introdu detaliile de logare: @@ -1183,12 +1205,12 @@ Comanda este declanșată dacă: Minimize to notification area Minimizează în aria de notificare (sertar) -Bytes copied: -Baiți copiați: - When finished: La terminare: +Auto-close +Închide Automat + Close Închide @@ -1201,12 +1223,18 @@ Comanda este declanșată dacă: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Creează o filă set [batch file] pentru sincronizarea neasistată. Pentru efectuarea sincronizării, dublu-clichează această filă sau programează rularea ei folosind un Planificator de Sarcini [Task Scheduler]: %x +Progress dialog: +Dialogul Progresului: + Run minimized Rulează minimizat &Show error dialog Arată dialo&gul erorilor +Show pop-up on errors or warnings +În caz de erori sau avertizări este arătată o fereastră popîc [popup] + &Cancel &Anulează @@ -1255,14 +1283,11 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Transfer file and folder permissions. Sînt transferate și permisiunile de accesare NTFS ale filelor și dosarelor (Atenție: doar pentru utilizatorii avansați!). -Automatic retry on error: -Reîncearcă automat în caz de eroare: - -Retry count: -Numărul reîncercărilor: +Show hidden dialogs again +Arată din nou dialogurile ascunse -Delay (in seconds): -Întîrziere (în secunde): +Show all permanently hidden dialogs and warning messages again +Sînt arătate din nou dialogurile și mesajele de eroare care au fost ascunse permanent Customize context menu: Personalizează meniul contextual: @@ -1270,12 +1295,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Description Descriere -Show hidden dialogs again -Arată din nou dialogurile ascunse - -Show all permanently hidden dialogs and warning messages again -Sînt arătate din nou dialogurile și mesajele de eroare care au fost ascunse permanent - &Default Coloanele &Implicite @@ -1330,13 +1349,22 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Activate offline Activează neconectat [offline] +Highlight configurations that have not been run for more than the following number of days: +Evidențiază configurațiile care n-au fost rulate de mai multă vreme decît numărul de zile următor: + +Synchronization Settings +Setările Sincronizării + +Access Online Storage +Accesează Stocarea pe Internet + Save as a Batch Job Salvează ca Sarcină Set Delete Items Șterge Elementele -Copy items +Copy Items Copiază Elementele Options @@ -1348,6 +1376,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției FreeFileSync Donation Edition FreeFileSync Ediție pentru Donatori +Highlight Configurations +Evidențiază Configurațiile + &Options &Opțiuni @@ -1473,10 +1504,7 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Mari Select time span... -Selectează intervalul de timp... - -Last session -Ultima Sesiune +Selectează Intervalul de Timp... Folder Comparison and Synchronization Comparare și Sincronizare de Dosare @@ -1496,8 +1524,11 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Do&n't save &Nu salva -Remove entry from list -Înlătură intrarea din listă +Hide configuration +Ascunde Configurația + +Highlight... +Evidențiază... Clear filter Curăță Filtrul @@ -1577,6 +1608,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Paused Sincronizare Pauzată +Stop requested... +Oprire cerută... + Initializing... Inițializez... @@ -1586,9 +1620,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Comparing content... Compar conținutul... -Completed -Sincronizare Terminată - Info Informații @@ -1673,12 +1704,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Parameters for opposite side Parametrii pentru partea opusă -Show hidden dialogs and warning messages again? -Arăt din nou dialogurile și mesajele de eroare ascunse? - -&Show -&Arată - Downloading update... Descarc actualizarea... @@ -1703,18 +1728,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Configure your own synchronization rules. Reguli de sincronizare definite de utilizator pentru fiecare situație. -Synchronization Settings -Setările Sincronizării - Comparison Comparare Synchronization Sincronizare -Today -Azi - This week Săptămîna asta @@ -1784,9 +1803,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Files File -Name -Nume - Percentage Procent @@ -1900,16 +1916,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției %x de ore - -1 day -%x days - - -1 zi -%x zile -%x de zile - - Cannot set privilege %x. Nu pot seta privilegiul %x. @@ -1973,8 +1979,11 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Desktop Birou [Desktop] -Start menu -Meniul de Start +Start Menu +Meniu de Start [Start Menu] + +Send To +Trimite La [Send To] Registering FreeFileSync file extensions Înregistrez extensiile de file FreeFileSync @@ -2003,6 +2012,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Please choose the local installation type or select a different folder for installation. Alege instalarea locală sau selectează un dosar diferit pentru instalare. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Modul de instalare silențios e disponibil doar pentru FreeFileSync Ediția pentru Donatori. +The %x installation option is only available in the FreeFileSync Donation Edition. +Opțiunea de instalare %x e disponibilă doar pentru FreeFileSync Ediția pentru Donatori. diff --git a/FreeFileSync/Build/Languages/russian.lng b/FreeFileSync/Build/Languages/russian.lng index 5208d558..4273a175 100755 --- a/FreeFileSync/Build/Languages/russian.lng +++ b/FreeFileSync/Build/Languages/russian.lng @@ -64,6 +64,9 @@ Syntax error Синтаксическая ошибка +A left and a right directory path are expected after %x. +Левый и правый пути папок ожидаются после %x. + Cannot find file %x. Невозможно найти файл %x. @@ -115,6 +118,19 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Если эта ошибка будет проигнорирована, то папки выше будут рассматриваться как пустые. Недостающие папки создаются автоматически, когда это необходимо. +Comparison finished: +Сравнение окончено: + + +1 item found +%x items found + + +%x элемент найден +%x элемента найдено +%x элементов найдено + + File %x has an invalid date. Файл %x имеет недействительную дату. @@ -175,9 +191,6 @@ Using non-default global settings: Использование нестандартных глобальных настроек: -Starting comparison -Начать сравнение - A folder input field is empty. Поле ввода папки пустое. @@ -318,15 +331,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. Невозможно переместить %x в "Корзину". +Cannot find %x. +Невозможно найти %x. + Cannot open file %x. Невозможно открыть файл %x. Cannot find device %x. Невозможно найти устройство %x. -Cannot find %x. -Невозможно найти %x. - Type of item %x is not supported: Тип элемента %x не поддерживается: @@ -435,6 +448,9 @@ Actual: %y bytes Lock owner: Источник блокировки: +Detecting abandoned lock... +Обнаружение заброшенной блокировки... + 1 sec %x sec @@ -445,9 +461,6 @@ Actual: %y bytes %x секунд -Detecting abandoned lock... -Обнаружение заброшенной блокировки... - Items processed: Элементов обработано: @@ -460,8 +473,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. Ошибка при разборе файла %x, строка %y, колонка %z. -Cannot set directory lock for %x. -Невозможно установить блокировку папки для %x. +Cannot set directory locks for the following folders: +Невозможно установить блокировки для следующих папок: 1 thread @@ -503,9 +516,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. Имя тома %x не является частью имени файла %y. -Stop requested: Waiting for current operation to finish... -Запрошена остановка: Ожидайте, пока текущая операция завершится... - Unable to create time stamp for versioning: Невозможно создать отметку времени для архивирования файлов: @@ -518,6 +528,9 @@ Actual: %y bytes Select a folder Выбрать папку +&New +&Новая + &Open... &Открыть... @@ -733,26 +746,23 @@ The command is triggered if: job name название -Show summary -Показать статистику +System: Sleep +Система: Спящий режим -Sleep -Спящий режим +System: Shut down +Система: Завершение работы -Shut down -Завершение работы - -Synchronization stopped -Синхронизация остановлена +Cleaning up old log files... +Очистка старых лог-файлов (журналов)... Stopped Остановлено -Synchronization completed with errors -Синхронизация завершена. В процессе синхронизации возникли ошибки +Completed with errors +Выполнено с ошибками -Synchronization completed with warnings -Синхронизация завершена. В процессе синхронизации возникли проблемы +Completed with warnings +Выполнено с предупреждениями Warning Внимание @@ -760,15 +770,12 @@ The command is triggered if: Nothing to synchronize Ничего нет для синхронизации -Synchronization completed successfully -Синхронизация завершена успешно +Completed successfully +Выполнено успешно Executing command %x Выполнение команды %x -Cleaning up old log files... -Очистка старых лог-файлов (журналов)... - You can switch to FreeFileSync's main window to resolve this issue. Вы можете переключиться на главное окно FreeFileSync для решения этой проблемы. @@ -784,15 +791,8 @@ The command is triggered if: Switching to FreeFileSync's main window Переключение на главное окно FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Автоматически повторить через %x секунду... -Автоматически повторить через %x секунды... -Автоматически повторить через %x секунд... - +Automatic retry +Автоматический повтор Ignore &all Игнорировать &все @@ -803,6 +803,28 @@ The command is triggered if: Serious Error Серьезная ошибка +Last session +Последняя сессия + +Today +сегодня + + +1 day +%x days + + +%x день +%x дня +%x дней + + +Name +Имя + +Last sync +Последняя синхронизация + Folder Папка @@ -866,9 +888,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. Пожалуйста, выберите папку в локальной файловой системе, сети или MTP устройстве. -&New -&Новая - &Save &Сохранить @@ -980,6 +999,9 @@ The command is triggered if: Total bytes to copy Всего байт для копирования +Arrange folder pair +Упорядочить пару папок + Folder pair: Пара папок: @@ -1072,11 +1094,14 @@ The command is triggered if: Naming convention: Условие переименования: -&Ignore errors -&Игнорировать ошибки +Ignore errors +Игнорировать ошибки -Show pop-up on errors or warnings -Показывать всплывающие окна при ошибках и предупреждениях +Retry count: +Число повторений: + +Delay (in seconds): +Задержка (в секундах): Run a command after synchronization: Запустить команду после синхронизации: @@ -1084,9 +1109,6 @@ The command is triggered if: OK OK -Arrange folder pair -Упорядочить пару папок - Enter your login details: Введите свои данные для входа: @@ -1183,12 +1205,12 @@ The command is triggered if: Minimize to notification area Свернуть в область уведомлений -Bytes copied: -Данных скопировано: - When finished: По завершении: +Auto-close +Автоматически закрыть + Close Закрыть @@ -1201,12 +1223,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Создать файл пакетного задания для автоматической синхронизации. Для запуска дважды кликните этот файл или запланируйте в планировщике задач: %x +Progress dialog: +Окно прогресса: + Run minimized Запустить свернутым &Show error dialog &Показать окно ошибки +Show pop-up on errors or warnings +Показывать всплывающие окна при ошибках и предупреждениях + &Cancel &Остановить @@ -1255,14 +1283,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. Передача прав доступа к файлам/папкам. -Automatic retry on error: -Автоматическое повторение при ошибках: - -Retry count: -Число повторений: +Show hidden dialogs again +Показать скрытые окна снова -Delay (in seconds): -Задержка (в секундах): +Show all permanently hidden dialogs and warning messages again +Показать все скрытые окна и сообщения с предупреждениями снова Customize context menu: Кастомизация контекстного меню: @@ -1270,12 +1295,6 @@ This guarantees a consistent state even in case of a serious error. Description Описание -Show hidden dialogs again -Показать скрытые окна снова - -Show all permanently hidden dialogs and warning messages again -Показать все скрытые окна и сообщения с предупреждениями снова - &Default &По умолчанию @@ -1330,13 +1349,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline Активировать в офлайн режиме +Highlight configurations that have not been run for more than the following number of days: +Выделить конфигурации, которые не запускались больше указанного количества дней: + +Synchronization Settings +Настройки синхронизации + +Access Online Storage +Доступ к онлайн-хранилищу + Save as a Batch Job -Сохранить как пакетное задание +Сохранение пакетного задания Delete Items Удаление элементов -Copy items +Copy Items Копирование элементов Options @@ -1348,6 +1376,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition Платная версия FreeFileSync +Highlight Configurations +Выделение конфигураций + &Options &Настройки @@ -1475,9 +1506,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... Выберите промежуток времени... -Last session -Последняя сессия - Folder Comparison and Synchronization Сравнение и синхронизация @@ -1496,8 +1524,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Не сохранять -Remove entry from list -Удалить запись из листа +Hide configuration +Удалить конфигурацию из списка + +Highlight... +Выделить... Clear filter Очистить фильтр @@ -1577,6 +1608,9 @@ This guarantees a consistent state even in case of a serious error. Paused Пауза +Stop requested... +Запрошена остановка... + Initializing... Инициализация... @@ -1586,9 +1620,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... Сравнение содержания... -Completed -Завершено - Info Информация @@ -1673,12 +1704,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side Параметры для противоположной стороны -Show hidden dialogs and warning messages again? -Показать скрытые окна и сообщения с предупреждениями снова? - -&Show -&Показать - Downloading update... Загрузка обновления... @@ -1703,18 +1728,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. Настроить свои собственные правила синхронизации. -Synchronization Settings -Настройки синхронизации - Comparison Сравнение Synchronization Синхронизация -Today -сегодня - This week на этой неделе @@ -1784,9 +1803,6 @@ This guarantees a consistent state even in case of a serious error. Files Файлы -Name -Имя - Percentage Проценты @@ -1900,16 +1916,6 @@ This guarantees a consistent state even in case of a serious error. %x часов - -1 day -%x days - - -%x день -%x дня -%x дней - - Cannot set privilege %x. Невозможно установить привилегии %x. @@ -1973,8 +1979,11 @@ This guarantees a consistent state even in case of a serious error. Desktop на рабочем столе -Start menu -в меню Пуск +Start Menu +Начальное меню + +Send To +Отправить Registering FreeFileSync file extensions Регистрация расширений файлов FreeFileSync @@ -2003,6 +2012,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. Пожалуйста, выберите локальный тип установки или выберите другую папку для установки. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Режим автоматической установки доступен только в платной версии FreeFileSync. +The %x installation option is only available in the FreeFileSync Donation Edition. +%x опция установки доступна только в платной версии FreeFileSync. diff --git a/FreeFileSync/Build/Languages/slovak.lng b/FreeFileSync/Build/Languages/slovak.lng index 9a5489ab..8ff29202 100755 --- a/FreeFileSync/Build/Languages/slovak.lng +++ b/FreeFileSync/Build/Languages/slovak.lng @@ -64,6 +64,9 @@ Syntax error Chyba syntaxu +A left and a right directory path are expected after %x. +Bude očakávaná pravá a ľavá adresárová cesta po %x. + Cannot find file %x. Nie je možné nájsť súbor %x. @@ -115,6 +118,19 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Ak bude táto chyba ignorovaná, budú tieto priečinky považované za prázdne. +Comparison finished: +Dokončilo sa porovnávanie: + + +1 item found +%x items found + + +Nájdená 1 položka +Nájdené %x položky +Nájdených %x položiek + + File %x has an invalid date. Súbor %x má chybný dátum. @@ -175,9 +191,6 @@ Using non-default global settings: Použiť ne-predvolené globálne nastavenia: -Starting comparison -Spustiť porovnávania - A folder input field is empty. Nie je zadaná vstupný priečinok. @@ -318,15 +331,15 @@ Aktuálne: %y b Unable to move %x to the recycle bin. Nie je možné presunúť %x do Koša. +Cannot find %x. +Nie je možné nájsť %x. + Cannot open file %x. Nie je možné otvoriť súbor %x. Cannot find device %x. Nie je možné nájsť zariadenie %x. -Cannot find %x. -Nie je možné nájsť %x. - Type of item %x is not supported: Typ položky %x nie je podporovaný: @@ -435,6 +448,9 @@ Aktuálne: %y b Lock owner: Vlastník uzamknutia: +Detecting abandoned lock... +Preverovanie uzamknutia... + 1 sec %x sec @@ -445,9 +461,6 @@ Aktuálne: %y b %x sekúnd -Detecting abandoned lock... -Preverovanie uzamknutia... - Items processed: Spracovaných položiek: @@ -460,8 +473,8 @@ Aktuálne: %y b Error parsing file %x, row %y, column %z. Chyba spracovania súboru %x: na riadku %y v stĺpci %z. -Cannot set directory lock for %x. -Nie je možné nastaviť zámok adresára %x. +Cannot set directory locks for the following folders: +Nie je možné nastaviť uzamknutie adresárov pre nasledujúce priečinky: 1 thread @@ -503,9 +516,6 @@ Aktuálne: %y b Volume name %x is not part of file path %y. Názov disku %x nie je súčásťou cesty súboru %y. -Stop requested: Waiting for current operation to finish... -Zastavovanie: Čakanie na dokončenie práve prebiehajúcej operácie... - Unable to create time stamp for versioning: Nie je možné vytvoriť časovú značku verzovania: @@ -518,6 +528,9 @@ Aktuálne: %y b Select a folder Vyberte priečinok +&New +&Nový + &Open... &Otvoriť... @@ -733,26 +746,23 @@ Príkaz bude spustení ak: job name názov úlohy -Show summary -Zobraziť súhrn +System: Sleep +Systém: Uspať -Sleep -Uspať +System: Shut down +Systém: Vypnúť -Shut down -Vypnúť počítač - -Synchronization stopped -Synchronizácia je zastavená +Cleaning up old log files... +Odstráňovanie starých log súborov... Stopped Zastavené -Synchronization completed with errors -Synchronizácia dokončena s chybami +Completed with errors +Ukončené s chybami -Synchronization completed with warnings -Synchronizácia dokončena s varovaním +Completed with warnings +Ukončené s varovaniami Warning Varovanie @@ -760,15 +770,12 @@ Príkaz bude spustení ak: Nothing to synchronize Nie je čo synchronizovať -Synchronization completed successfully -Synchronizácia je úspešne dokončená +Completed successfully +Dokončenie bolo úspešné Executing command %x Spúšťací príkaz %x -Cleaning up old log files... -Odstráňovanie starých log súborov... - You can switch to FreeFileSync's main window to resolve this issue. K odstráneniu tohoto problému sa môžete prepnúť do hlavného okna FreeFileSync. @@ -784,15 +791,8 @@ Príkaz bude spustení ak: Switching to FreeFileSync's main window Prepínanie do hlavného okna FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automatické opakovanie za 1 sekundu... -Automaticky opakovať za %x sekundy... -Autoamticky opakovať za %x sekúnd... - +Automatic retry +Automatické opakovanie Ignore &all Ignorovať &všetky @@ -803,6 +803,28 @@ Príkaz bude spustení ak: Serious Error Závažná chyba +Last session +Posledné sedenie + +Today +Dnes + + +1 day +%x days + + +1 deň +%x dni +%x dní + + +Name +Názov + +Last sync +Posledná synchronizácia + Folder Priečinok @@ -866,9 +888,6 @@ Príkaz bude spustení ak: Please select a folder on a local file system, network or an MTP device. Prosím vyberte priečinok v lokálnom súborovom systéme, sieti alebo multimediálnom zariadení. -&New -&Nový - &Save &Uložiť @@ -933,7 +952,7 @@ Príkaz bude spustení ak: Odstrániť dvojicu priečinkov Access online storage -Prístup k online úložištiu +Prístup k online úložisku Swap sides Zámena strán @@ -980,6 +999,9 @@ Príkaz bude spustení ak: Total bytes to copy Celkový objem kopírovaných údajov +Arrange folder pair +Usporiadať dvojicu priečinkov + Folder pair: Dvojica priečinkov: @@ -1072,11 +1094,14 @@ Príkaz bude spustení ak: Naming convention: Pomenovanie: -&Ignore errors -&Ignorovať chyby +Ignore errors +Ignorovať chyby -Show pop-up on errors or warnings -Zobraziť hlásenie pri chybe alebo varovaní +Retry count: +Počet opakovaní: + +Delay (in seconds): +Oneskorenie (v sekundách): Run a command after synchronization: Spustiť príkaz po synchronizácií: @@ -1084,9 +1109,6 @@ Príkaz bude spustení ak: OK OK -Arrange folder pair -Usporiadať dvojicu priečinkov - Enter your login details: Zadajte prihlasovacie údaje: @@ -1183,12 +1205,12 @@ Príkaz bude spustení ak: Minimize to notification area Minimalizovať do oznamovacej oblasti -Bytes copied: -Skopírovaných údajov: - When finished: Po dokončení: +Auto-close +Automaticky zavrieť + Close Zavrieť @@ -1201,12 +1223,18 @@ Príkaz bude spustení ak: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Vytvorí dávkový súbor pre automatickú synchronizáciu. Ku spusteniu dávky jednoducho pokliknite na vytvorený súbor alebo využite plánovač úloh vašeho systému: %x +Progress dialog: +Dialóg procesu: + Run minimized Spustiť minimalizované &Show error dialog &Zobraziť chybový dialóg +Show pop-up on errors or warnings +Zobraziť hlásenie pri chybe alebo varovaní + &Cancel &Zrušiť @@ -1252,14 +1280,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. Preniesť prístupové oprávnenie súborov a priečinkov. -Automatic retry on error: -Automaticky opakovať pri chybe: - -Retry count: -Počet opakovaní: +Show hidden dialogs again +Znovu zobraziť skryté dialógy -Delay (in seconds): -Oneskorenie (v sekundách): +Show all permanently hidden dialogs and warning messages again +Zobraziť znovu všetky trvale skryté dialógy a varovné hlásenia Customize context menu: Prispôsobiť kontextovú ponuku: @@ -1267,12 +1292,6 @@ This guarantees a consistent state even in case of a serious error. Description Popis -Show hidden dialogs again -Znovu zobraziť skryté dialógy - -Show all permanently hidden dialogs and warning messages again -Zobraziť znovu všetky trvale skryté dialógy a varovné hlásenia - &Default &Predvolené @@ -1327,13 +1346,22 @@ This guarantees a consistent state even in case of a serious error. Activate offline Aktivovať offline +Highlight configurations that have not been run for more than the following number of days: +Zvýrazniť konfigurácie, ktoré neboli vykonané viac ako nasledujúci počet dní: + +Synchronization Settings +Nastavenia synchronizácie + +Access Online Storage +Prístup k Online Storage + Save as a Batch Job Uložiť ako Batch Job Delete Items Zmazať položky -Copy items +Copy Items Kopírovať položky Options @@ -1345,6 +1373,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Zvýrazniť konfigurácie + &Options Nastavenie &programu @@ -1472,9 +1503,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... Zadajte časové rozmedzie... -Last session -Posledné sedenie - Folder Comparison and Synchronization Porovnanie a synchronizácia priečinkov @@ -1493,8 +1521,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Neukladať -Remove entry from list -Odstrániť položku zo zoznamu +Hide configuration +Skryť konfiguráciu + +Highlight... +Zvýrazniť... Clear filter Vymazať filter @@ -1574,6 +1605,9 @@ This guarantees a consistent state even in case of a serious error. Paused Pauza +Stop requested... +Zastavenie požiadavky... + Initializing... Inicializácia... @@ -1583,9 +1617,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... Porovnávanie obsahu... -Completed -Hotovo - Info Info @@ -1670,12 +1701,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side Parametre pre protiľahlú stranu -Show hidden dialogs and warning messages again? -Zobraziť skryté dialógy a varovné hlásenia? - -&Show -&Zobraziť - Downloading update... Sťahovanie aktualizácie... @@ -1700,18 +1725,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. Nastavenie vlastných pravidiel synchronizácie. -Synchronization Settings -Nastavenia synchronizácie - Comparison Porovnanie Synchronization Synchronizácia -Today -Dnes - This week Tento týždeň @@ -1781,9 +1800,6 @@ This guarantees a consistent state even in case of a serious error. Files Súbory -Name -Názov - Percentage Percentný podiel @@ -1897,16 +1913,6 @@ This guarantees a consistent state even in case of a serious error. %x hodín - -1 day -%x days - - -1 deň -%x dni -%x dní - - Cannot set privilege %x. Nie je možné nastaviť práva pre %x. @@ -1970,9 +1976,12 @@ This guarantees a consistent state even in case of a serious error. Desktop Plocha -Start menu +Start Menu Ponuka Štart +Send To +Odoslať kam + Registering FreeFileSync file extensions Zaregistrovať príponu súborov FreeFileSync @@ -2000,6 +2009,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. Prosím zvoľte lokálny typ inštalácie alebo vyberte iný priečinok pre inštaláciu. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Mód tichej inštalácie je možný iba v FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +Inštalačná možnosť %x je dostupná iba pri FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/slovenian.lng b/FreeFileSync/Build/Languages/slovenian.lng index 81d99194..b958ef19 100755 --- a/FreeFileSync/Build/Languages/slovenian.lng +++ b/FreeFileSync/Build/Languages/slovenian.lng @@ -118,6 +118,20 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. V primeru prezrtja te napake bo mapa smatrana kot prazna. Manjkajoče mape se po potrebi ustvarijo samodejno. +Comparison finished: +Primerjava je končana: + + +1 item found +%x items found + + +%x najdena postavka +%x najdeni postavki +%x najdene postavke +%x najdenih postavk + + File %x has an invalid date. Datoteka %x ima neveljaven datum. @@ -178,9 +192,6 @@ Using non-default global settings: Uporabljam neprivzete globalne nastavitve: -Starting comparison -Začenjam primerjavo - A folder input field is empty. Polje za vnos mape je prazno. @@ -321,15 +332,15 @@ Dejansko: %y bajtov Unable to move %x to the recycle bin. Ne morem premakniti %x v koš. +Cannot find %x. +Ne najdem %x. + Cannot open file %x. Ne morem odpreti datoteke %x. Cannot find device %x. Ne najdem naprave %x. -Cannot find %x. -Ne najdem %x. - Type of item %x is not supported: Vrsta postavke %x ni podprta: @@ -441,6 +452,9 @@ Dejansko: %y bajtov Lock owner: Lastnik zaklepa: +Detecting abandoned lock... +Zaznavanje opuščenega zaklepa... + 1 sec %x sec @@ -452,9 +466,6 @@ Dejansko: %y bajtov %x sek -Detecting abandoned lock... -Zaznavanje opuščenega zaklepa... - Items processed: Obdelanih postavk: @@ -511,9 +522,6 @@ Dejansko: %y bajtov Volume name %x is not part of file path %y. Ime nosilca %x ni del poti datoteke %y. -Stop requested: Waiting for current operation to finish... -Zahteva za ustavitev: čakam da se trenutni proces zaključi... - Unable to create time stamp for versioning: Časovnega žiga za oznčitev ni bilo mogoče ustvariti: @@ -526,6 +534,9 @@ Dejansko: %y bajtov Select a folder Izberite imenik +&New +&Nova + &Open... &Odpri... @@ -601,7 +612,7 @@ Ukaz se sproži če: Vizitka Build: %x -Grsdnja: %x +Gradnja: %x All files Vse datoteke @@ -741,26 +752,23 @@ Ukaz se sproži če: job name naziv opravila -Show summary -Pokaži povzetek +System: Sleep +Sistem: Spanje -Sleep -Spanje +System: Shut down +Sistem: Izključi računalnik -Shut down -Izključi računalnik - -Synchronization stopped -Sinhnorizacija zaustavljena +Cleaning up old log files... +Čiščenje starih datotek dnevnika... Stopped Ustavljeno -Synchronization completed with errors -Sinhronizacija dokončana z napakami +Completed with errors +Dokončano z napakami -Synchronization completed with warnings -Sinhronizacija dokončana z opozorili +Completed with warnings +Dokončano z opozorili Warning Opozorilo @@ -768,15 +776,12 @@ Ukaz se sproži če: Nothing to synchronize Nič za sinhroniziranje -Synchronization completed successfully -Sinhronizacija je uspešno končana +Completed successfully +Uspešno končano Executing command %x Izvedba ukaza %x -Cleaning up old log files... -Čiščenje starih datotek dnevnika... - You can switch to FreeFileSync's main window to resolve this issue. Če želite odpraviti to težavo, lahko preklopite na glavno okno FreeFileSync. @@ -792,16 +797,8 @@ Ukaz se sproži če: Switching to FreeFileSync's main window Preklop na glavno okno FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Samodejni poskus znova čez %x sekundo... -Samodejni poskus znova čez %x sekundi... -Samodejni poskus znova čez %x sekunde... -Samodejni poskus znova čez %x sekund... - +Automatic retry +Samodejno poskusi znova Ignore &all Prezri &vse @@ -898,9 +895,6 @@ Ukaz se sproži če: Please select a folder on a local file system, network or an MTP device. Prosim izberite mapo na lokalnem datotečnem sistemu, mreži ali na MTP napravi. -&New -&Nova - &Save &Shrani @@ -1012,6 +1006,9 @@ Ukaz se sproži če: Total bytes to copy Skupno bajtov za kopiranje +Arrange folder pair +Uredi pare map + Folder pair: Par map: @@ -1104,11 +1101,14 @@ Ukaz se sproži če: Naming convention: Imenovanje konvencije: -&Ignore errors -&Prezri napake +Ignore errors +Prezri napake -Show pop-up on errors or warnings -Pokaži pojavna okna napak ali opozoril +Retry count: +Število poskusov: + +Delay (in seconds): +Zakasnitev (v sekundah): Run a command after synchronization: Zaženi ukaz po sinhronizaciji: @@ -1116,9 +1116,6 @@ Ukaz se sproži če: OK V redu -Arrange folder pair -Uredi pare map - Enter your login details: Vnestite podatke za prijavo: @@ -1215,12 +1212,12 @@ Ukaz se sproži če: Minimize to notification area Pomanjšaj v območje obvestil -Bytes copied: -Prepisanih bajtov: - When finished: Po zaključku: +Auto-close +Samodejno zapri + Close Zapri @@ -1233,12 +1230,18 @@ Ukaz se sproži če: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Ustvari paketno datoteko za nenadzorovano sinhronizacijo. Za začetek dvokliknite to datoteko ali določite v načrtovalniku nalog: %x +Progress dialog: +Okno napredka: + Run minimized Zaženi minimirano &Show error dialog &Prikaži pogovorno okno napak +Show pop-up on errors or warnings +Pokaži pojavna okna napak ali opozoril + &Cancel &Prekliči @@ -1287,14 +1290,11 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Transfer file and folder permissions. Prenesi dovoljenja za datoteke in mape. -Automatic retry on error: -Ob napaki samodejo poskusi znova: - -Retry count: -Število poiskusov: +Show hidden dialogs again +Ponovno prikaži skrita pogovorna okna -Delay (in seconds): -Zakasnitev (v sekundah): +Show all permanently hidden dialogs and warning messages again +Prikaži vsa trajno skrita pogovorna okna in opozorilna sporočila Customize context menu: Prilagodi kontekstni meni: @@ -1302,12 +1302,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Description Opis -Show hidden dialogs again -Ponovno prikaži skrita pogovorna okna - -Show all permanently hidden dialogs and warning messages again -Prikaži vsa trajno skrita pogovorna okna in opozorilna sporočila - &Default &Privzeto @@ -1365,13 +1359,19 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Highlight configurations that have not been run for more than the following number of days: Označite konfiguracije, ki se ne izvajajo več kot naslednje število dni: +Synchronization Settings +Nastavitve sinhnorizacije + +Access Online Storage +Dostop do spletne shrambe + Save as a Batch Job Shrani kot paketno opravilo Delete Items Izbriši postavke -Copy items +Copy Items Kopiraj postavke Options @@ -1619,6 +1619,9 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Paused Začasno ustavljeno +Stop requested... +Ustavi zahtevano... + Initializing... Inicializiram... @@ -1628,9 +1631,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Comparing content... Primerjam vsebino... -Completed -Zaključeno - Info Info @@ -1718,12 +1718,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Parameters for opposite side Parametri za nasprotno stran -Show hidden dialogs and warning messages again? -Ponovno prikažem skrita pogovorna okna in opozorilna sporočila? - -&Show -&Prikaži - Downloading update... Prenašam posodobitve... @@ -1748,9 +1742,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Configure your own synchronization rules. Konfigurirajte vaša lastna sinhronizacijska pravila. -Synchronization Settings -Nastavitve sinhnorizacije - Comparison Primerjava @@ -2004,7 +1995,7 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Desktop Namizje -Start menu +Start Menu Meni Start Send To diff --git a/FreeFileSync/Build/Languages/spanish.lng b/FreeFileSync/Build/Languages/spanish.lng index a6c0ff4c..d440e564 100755 --- a/FreeFileSync/Build/Languages/spanish.lng +++ b/FreeFileSync/Build/Languages/spanish.lng @@ -64,6 +64,9 @@ Syntax error Error de sintaxis +A left and a right directory path are expected after %x. +Se esperan dos rutas de directorio izquierdo y derecho después de %x. + Cannot find file %x. No se encuentra el archivo %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Si ignora este error, las carpetas se consideran vacías. Las carpetas que faltan son creadas automáticamente si es necesario. +Comparison finished: +Comparación finalizada: + + +1 item found +%x items found + + +1 elemento encontrado +%x elementos encontrados + + File %x has an invalid date. El archivo %x tiene una fecha inválida. @@ -175,9 +190,6 @@ Using non-default global settings: Uso de configuración global no predeterminada: -Starting comparison -Iniciando la comparación - A folder input field is empty. Un campo de entrada de la carpeta está vacío. @@ -318,15 +330,15 @@ Reales: %y bytes Unable to move %x to the recycle bin. No es posible mover %x a la papelera de reciclaje. +Cannot find %x. +No se encuentra %x. + Cannot open file %x. No se puede abrir el archivo %x. Cannot find device %x. No se encuentra el dispositivo %x. -Cannot find %x. -No se encuentra %x. - Type of item %x is not supported: El tipo de objeto %x no esta soportado: @@ -432,6 +444,9 @@ Reales: %y bytes Lock owner: Bloquear propietario: +Detecting abandoned lock... +Detección de bloqueo abandonado... + 1 sec %x sec @@ -441,9 +456,6 @@ Reales: %y bytes %x seg. -Detecting abandoned lock... -Detección de bloqueo abandonado... - Items processed: Elementos procesados: @@ -456,8 +468,8 @@ Reales: %y bytes Error parsing file %x, row %y, column %z. Error analizando archivo %x, fila %y, columna %z. -Cannot set directory lock for %x. -No se pudo bloquear el directorio %x. +Cannot set directory locks for the following folders: +No se pudieron bloquear directorios para las carpetas siguientes: 1 thread @@ -498,9 +510,6 @@ Reales: %y bytes Volume name %x is not part of file path %y. El nombre de volumen %x no es parte de la ruta de archivo %y. -Stop requested: Waiting for current operation to finish... -Detención solicitada: esperando a que la operación actual finalice... - Unable to create time stamp for versioning: No es posible crear la fecha y hora para el versionado: @@ -513,6 +522,9 @@ Reales: %y bytes Select a folder Seleccione una carpeta +&New +&Nuevo + &Open... &Abrir... @@ -728,26 +740,23 @@ El comando es disparado si: job name nombre de tarea -Show summary -Mostrar recapitulativo +System: Sleep +Sistema: suspender -Sleep -Suspender +System: Shut down +Sistema: apagar -Shut down -Apagar - -Synchronization stopped -Sincronización detenida +Cleaning up old log files... +Limpiando antiguos archivos de registro... Stopped Detenido -Synchronization completed with errors -Sincronización completada con errores +Completed with errors +Completado con errores -Synchronization completed with warnings -Sincronización completada con avisos +Completed with warnings +Completado con avisos Warning Atención @@ -755,15 +764,12 @@ El comando es disparado si: Nothing to synchronize Nada que sincronizar -Synchronization completed successfully -Sincronización completada satisfactoriamente +Completed successfully +Completado con éxito Executing command %x Ejecución del comando %x -Cleaning up old log files... -Limpiando antiguos archivos de registro... - You can switch to FreeFileSync's main window to resolve this issue. Puede cambiar a la ventana principal de FreeFileSync para resolver este problema. @@ -779,14 +785,8 @@ El comando es disparado si: Switching to FreeFileSync's main window Cambiar a la ventana principal de FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Reintento automático en 1 segundo... -Reintento automático en %x segundos... - +Automatic retry +Reintento automático Ignore &all Ignorar &todo @@ -797,6 +797,27 @@ El comando es disparado si: Serious Error Error grave +Last session +Última sesión + +Today +Hoy + + +1 day +%x days + + +1 día +%x días + + +Name +Nombre + +Last sync +Última sincronización + Folder Carpeta @@ -860,9 +881,6 @@ El comando es disparado si: Please select a folder on a local file system, network or an MTP device. Seleccione otra carpeta del systema de archivos local, en red o en un dispositivo MTP. -&New -&Nuevo - &Save &Guardar @@ -974,6 +992,9 @@ El comando es disparado si: Total bytes to copy Total de bytes a copiar +Arrange folder pair +Reorganizar pares de carpetas + Folder pair: Par de carpetas: @@ -1066,11 +1087,14 @@ El comando es disparado si: Naming convention: Convención de nombre: -&Ignore errors -&Ignorar errores +Ignore errors +Ignorar errores -Show pop-up on errors or warnings -Mostrar ventana emergente de errores o avisos +Retry count: +Cuenta de reintentos: + +Delay (in seconds): +Retardo (en segundos): Run a command after synchronization: Ejecutar un comando tras la sincronización: @@ -1078,9 +1102,6 @@ El comando es disparado si: OK OK -Arrange folder pair -Reorganizar pares de carpetas - Enter your login details: Escriba sus datos de conexión: @@ -1177,12 +1198,12 @@ El comando es disparado si: Minimize to notification area Minimizar en el área de notificación -Bytes copied: -Bytes copiados: - When finished: Tras finalizar: +Auto-close +Cierre automático + Close Cerrar @@ -1195,12 +1216,18 @@ El comando es disparado si: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Crear tarea por lotes para sincronización desatendida. Para iniciar, haga doble clic en este archivo o prográmelo en el planificador de tareas : %x +Progress dialog: +Diálogo de progreso: + Run minimized Ejecutar minimizado &Show error dialog Mo&strar diálogo de error +Show pop-up on errors or warnings +Mostrar ventana emergente de errores o avisos + &Cancel &Cancelar @@ -1249,14 +1276,11 @@ Esto garantiza un estado coherente incluso en caso de error grave. Transfer file and folder permissions. Transferir permisos de archivos y carpetas. -Automatic retry on error: -Retardo automático en caso de error : - -Retry count: -Cuenta de reintentos: +Show hidden dialogs again +Volver a mostrar los diálogos ocultos -Delay (in seconds): -Retardo (en segundos): +Show all permanently hidden dialogs and warning messages again +Volver a mostrar todos los diálogos y mensajes de advertencia que fueron permanentemente ocultados Customize context menu: Personalizar menú contextual : @@ -1264,12 +1288,6 @@ Esto garantiza un estado coherente incluso en caso de error grave. Description Descripción -Show hidden dialogs again -Volver a mostrar los diálogos ocultos - -Show all permanently hidden dialogs and warning messages again -Volver a mostrar todos los diálogos y mensajes de advertencia que fueron permanentemente ocultados - &Default &Configuración predeterminada @@ -1280,7 +1298,7 @@ Esto garantiza un estado coherente incluso en caso de error grave. Si te resulta útil FreeFileSync: Support with a donation -¿Contribuye con tu donación! +¡Contribuye con una donación! Donation details Detalles para donación @@ -1324,13 +1342,22 @@ Esto garantiza un estado coherente incluso en caso de error grave. Activate offline Activar sin conexión +Highlight configurations that have not been run for more than the following number of days: +Resaltar las configuraciones no utilizadas desde hace más del número de días: + +Synchronization Settings +Opciones de sincronización + +Access Online Storage +Acceder a almacenamiento en línea + Save as a Batch Job Guardar como una tarea por lotes Delete Items Eliminar elementos -Copy items +Copy Items Copiar elementos Options @@ -1342,6 +1369,9 @@ Esto garantiza un estado coherente incluso en caso de error grave. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Resaltar configuraciones + &Options &Opciones @@ -1465,9 +1495,6 @@ Esto garantiza un estado coherente incluso en caso de error grave. Select time span... Seleccionar duración... -Last session -Última sesión - Folder Comparison and Synchronization Comparación y sincronización de carpetas @@ -1486,8 +1513,11 @@ Esto garantiza un estado coherente incluso en caso de error grave. Do&n't save &No guardar -Remove entry from list -Retirar la entrada de la lista +Hide configuration +Ocultar configuración + +Highlight... +Resaltar... Clear filter Borrar filtro @@ -1567,6 +1597,9 @@ Esto garantiza un estado coherente incluso en caso de error grave. Paused Pausado +Stop requested... +Detención solicitada... + Initializing... Inicializando... @@ -1576,9 +1609,6 @@ Esto garantiza un estado coherente incluso en caso de error grave. Comparing content... Comparando contenido... -Completed -Terminado - Info Info @@ -1660,12 +1690,6 @@ Esto garantiza un estado coherente incluso en caso de error grave. Parameters for opposite side Parámetros del lado opuesto -Show hidden dialogs and warning messages again? -¿Volver a mostrar los diálogos ocultos y las advertencias? - -&Show -Mo&strar - Downloading update... Descargando actualización... @@ -1690,18 +1714,12 @@ Esto garantiza un estado coherente incluso en caso de error grave. Configure your own synchronization rules. Configurar reglas de sincronización personalizadas. -Synchronization Settings -Opciones de sincronización - Comparison Comparación Synchronization Sincronización -Today -Hoy - This week Esta semana @@ -1771,9 +1789,6 @@ Esto garantiza un estado coherente incluso en caso de error grave. Files Archivos -Name -Nombre - Percentage Porcentaje @@ -1885,15 +1900,6 @@ Esto garantiza un estado coherente incluso en caso de error grave. %x horas - -1 day -%x days - - -1 día -%x días - - Cannot set privilege %x. No se puede asignar el privilegio %x. @@ -1957,9 +1963,12 @@ Esto garantiza un estado coherente incluso en caso de error grave. Desktop Escritorio -Start menu +Start Menu Menú Inicio +Send To +Enviar a + Registering FreeFileSync file extensions Registrando las extensiones de archivo de FreeFileSync @@ -1976,17 +1985,17 @@ Esto garantiza un estado coherente incluso en caso de error grave. Base de datos de sincronización de FreeFileSync RealTimeSync Configuration -Configuration de RealTimeSync +Configuración de RealTimeSync Edit with FreeFileSync Modificar con FreeFileSync The FreeFileSync portable version cannot install into a subfolder of %x. -No se puede instalar la version portátil de FreeFileSync en una subcarpeta de %x. +No se puede instalar la versión portátil de FreeFileSync en una subcarpeta de %x. Please choose the local installation type or select a different folder for installation. Elija el tipo de instalación local o seleccione otra carpeta de instalación. -The silent installation mode is only available in the FreeFileSync Donation Edition. -El modo de instalación silenciosa sólo está disponible para FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +La opción %x de instalación sólo está disponible para la versión FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/swedish.lng b/FreeFileSync/Build/Languages/swedish.lng index 87f17c27..6963e231 100755 --- a/FreeFileSync/Build/Languages/swedish.lng +++ b/FreeFileSync/Build/Languages/swedish.lng @@ -64,6 +64,9 @@ Syntax error Syntaxfel +A left and a right directory path are expected after %x. +En vänster och en höger mappsökväg förväntas efter %x. + Cannot find file %x. Kan inte hitta filen %x. @@ -115,6 +118,18 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Om detta fel ignoreras, kommer mapparna att betraktas som tomma. Saknade mappar skapas automatiskt vid behov. +Comparison finished: +Jämförelse slutförd: + + +1 item found +%x items found + + +1 objekt hittat +%x objekt hittade + + File %x has an invalid date. Filen %x har ett ogiltigt datum. @@ -175,9 +190,6 @@ Using non-default global settings: Använder icke-standard globala inställningar: -Starting comparison -Startar jämförelse - A folder input field is empty. Ett inmatningsfält är tomt. @@ -318,15 +330,15 @@ Aktuell: %y byte Unable to move %x to the recycle bin. Kan inte att flytta %x till papperskorgen. +Cannot find %x. +Kan inte hitta %x. + Cannot open file %x. Kan inte öppna %x. Cannot find device %x. Kan inte hitta enheten %x. -Cannot find %x. -Kan inte hitta %x. - Type of item %x is not supported: Objekttyp %x stöds ej: @@ -432,6 +444,9 @@ Aktuell: %y byte Lock owner: Låsägare: +Detecting abandoned lock... +Söker övergivna lås... + 1 sec %x sec @@ -441,9 +456,6 @@ Aktuell: %y byte %x sek -Detecting abandoned lock... -Söker övergivna lås... - Items processed: Processade poster: @@ -456,8 +468,8 @@ Aktuell: %y byte Error parsing file %x, row %y, column %z. Tolkningsfel på filen %x, rad %y, kolumn %z. -Cannot set directory lock for %x. -Kan inte låsa %x. +Cannot set directory locks for the following folders: +Kan inte ange mapplås för följanda mappar: 1 thread @@ -498,9 +510,6 @@ Aktuell: %y byte Volume name %x is not part of file path %y. Volymnamnet %x är inte en del av sökvägen %y. -Stop requested: Waiting for current operation to finish... -Stopp begärt: Väntar på att aktuell åtgärd skall slutföras... - Unable to create time stamp for versioning: Kunde inte skapa tidsstämpel för versionshantering: @@ -513,6 +522,9 @@ Aktuell: %y byte Select a folder Välj en mapp +&New +&Nytt + &Open... &Öppna... @@ -728,26 +740,23 @@ Kommandot triggas om: job name åtgärdsnamn -Show summary -Visa sammandrag +System: Sleep +System: Viloläge -Sleep -Strömsparläge +System: Shut down +System: Stäng av -Shut down -Stäng av datorn - -Synchronization stopped -Synkroniseringen stoppad +Cleaning up old log files... +Rensar ut gamla loggfiler... Stopped Stoppad -Synchronization completed with errors -Synkronisering slutförd med fel +Completed with errors +Slutförd med fel -Synchronization completed with warnings -Synkronisering slutförd med varningar +Completed with warnings +Slutförd med varningar Warning Varning @@ -755,15 +764,12 @@ Kommandot triggas om: Nothing to synchronize Det finns inget att synkronisera -Synchronization completed successfully -Synkronisering slutförd +Completed successfully +Korrekt slutförd Executing command %x Kör kommandot %x -Cleaning up old log files... -Rensar ut gamla loggfiler... - You can switch to FreeFileSync's main window to resolve this issue. Du kan växla till FreeFileSyncs programfönster för att lösa problemet. @@ -779,14 +785,8 @@ Kommandot triggas om: Switching to FreeFileSync's main window Växla till FreeFileSyncs programfönster - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Automatiskt återförsök om 1 sekund... -Automatiskt återförsök om %x sekunder... - +Automatic retry +Automatiskt återförsök Ignore &all Ignorera &fel @@ -797,6 +797,27 @@ Kommandot triggas om: Serious Error Allvarligt fel +Last session +Senaste session + +Today +Idag + + +1 day +%x days + + +1 dag +%x dagar + + +Name +Namn + +Last sync +Senaste synkronisering + Folder Mapp @@ -860,9 +881,6 @@ Kommandot triggas om: Please select a folder on a local file system, network or an MTP device. Välj en mapp på i ett lokalt filsystem, nätverk eller en MTP-enhet. -&New -&Nytt - &Save &Spara @@ -974,6 +992,9 @@ Kommandot triggas om: Total bytes to copy Byte att kopiera +Arrange folder pair +Arrangera katalogpar + Folder pair: Katalogpar: @@ -1066,11 +1087,14 @@ Kommandot triggas om: Naming convention: Regler för namngivning: -&Ignore errors -&Ignorera fel +Ignore errors +Ignorera fel -Show pop-up on errors or warnings -Visa popup vid fel och varningar +Retry count: +Antal försök: + +Delay (in seconds): +Fördröjning (i sekunder): Run a command after synchronization: Kör ett kommando efter synkronisering: @@ -1078,9 +1102,6 @@ Kommandot triggas om: OK OK -Arrange folder pair -Arrangera katalogpar - Enter your login details: Ange dina inloggningsuppgifter: @@ -1177,12 +1198,12 @@ Kommandot triggas om: Minimize to notification area Minimera till meddelandefältet -Bytes copied: -Kopierade byte: - When finished: Vid slutfört: +Auto-close +Stäng automatiskt + Close Stäng @@ -1195,12 +1216,18 @@ Kommandot triggas om: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Skapa en batch-fil för obevakad synkronisering. Dubbelklicka på filen för att starta den, eller schemalägg i en åtgärdshanterare: %x +Progress dialog: +Förloppsdialog: + Run minimized Kör minimerad &Show error dialog &Visa feldialog +Show pop-up on errors or warnings +Visa popup vid fel och varningar + &Cancel &Avbryt @@ -1249,14 +1276,11 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Transfer file and folder permissions. Överför behörighetsinställningar. -Automatic retry on error: -Automatiska återförsök vid fel: - -Retry count: -Antal försök: +Show hidden dialogs again +Visa dolda dialoger igen -Delay (in seconds): -Fördröjning (i sekunder): +Show all permanently hidden dialogs and warning messages again +Visa alla permanent dolda dialoger och varningsmeddelanden igen Customize context menu: Anpassad kontextmeny: @@ -1264,12 +1288,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Description Beskrivning -Show hidden dialogs again -Visa dolda dialoger igen - -Show all permanently hidden dialogs and warning messages again -Visa alla permanent dolda dialoger och varningsmeddelanden igen - &Default &Standard @@ -1324,13 +1342,22 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Activate offline Aktivera offline +Highlight configurations that have not been run for more than the following number of days: +Färgmarkera konfigurationer som inte har körts på mer än följande antal dagar: + +Synchronization Settings +Synkroniseringsinställningar + +Access Online Storage +Anslut online-lagring + Save as a Batch Job Spara som batch-fil Delete Items Ta bort objekt -Copy items +Copy Items Kopiera objekt Options @@ -1342,6 +1369,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Färgmarkera konfigurationer + &Options &Alternativ @@ -1465,9 +1495,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Select time span... Välj tidsintervall... -Last session -Senaste session - Folder Comparison and Synchronization Mappjämförelse och synkronisering @@ -1486,8 +1513,11 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Do&n't save Spara &inte -Remove entry from list -Ta bort post från listan +Hide configuration +Dölj konfigurationen + +Highlight... +Färgmarkera... Clear filter Rensa filter @@ -1567,6 +1597,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Paused Pausad +Stop requested... +Stopp begärt... + Initializing... Initierar... @@ -1576,9 +1609,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Comparing content... Jämför innehåll... -Completed -Slutförd - Info Info @@ -1660,12 +1690,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Parameters for opposite side Parametrar för motstående sida -Show hidden dialogs and warning messages again? -Vill du visa dolda dialoger och varningsmeddelanden igen? - -&Show -&Visa - Downloading update... Laddar ner uppdatering... @@ -1690,18 +1714,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Configure your own synchronization rules. Konfigurera dina egna synkroniseringsregler. -Synchronization Settings -Synkroniseringsinställningar - Comparison Jämförelse Synchronization Synkronisering -Today -Idag - This week Denna veckan @@ -1771,9 +1789,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Files Filer -Name -Namn - Percentage Procent @@ -1885,15 +1900,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. %x timmar - -1 day -%x days - - -1 dag -%x dagar - - Cannot set privilege %x. Kan inte att ange behörigheten %x. @@ -1957,9 +1963,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Desktop Skrivbord -Start menu +Start Menu Startmeny +Send To +Skicka till + Registering FreeFileSync file extensions Registrerar filformat för FreeFileSync @@ -1987,6 +1996,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Please choose the local installation type or select a different folder for installation. Välj lokal installationstyp eller välj en annan mapp för installationen. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Tyst installationsläge är endast tillgängligt i FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +Installationsalternativet %x är endast tillgängligt i FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Languages/turkish.lng b/FreeFileSync/Build/Languages/turkish.lng index 5afdd52e..8a87fc93 100755 --- a/FreeFileSync/Build/Languages/turkish.lng +++ b/FreeFileSync/Build/Languages/turkish.lng @@ -64,11 +64,14 @@ Syntax error Yazım hatası +A left and a right directory path are expected after %x. +%x ardından sol ve sağ klasör belirtilmelidir. + Cannot find file %x. %x dosyası bulunamadı. Error -Hata +Sorun File %x does not contain a valid configuration. %x dosyası geçerli yapılandırma bilgilerini içermiyor. @@ -77,7 +80,7 @@ Sağdan ve soldan seçilen klasör sayısı aynı değil. The config file must not contain settings at directory pair level when directories are set via command line. -Klasörler komut satırından seçildiği zaman, ayar dosyasında klasör çifti düzeyinde ayarlar bulunmamalıdır. +Klasörler komut satırından seçildiği zaman, yapılandırma dosyasında klasör çifti düzeyinde ayarlar bulunmamalıdır. Directories cannot be set for more than one configuration file. Klasörler birden fazla yapılandırma dosyasında kullanılamaz. @@ -89,19 +92,19 @@ Yazım: config files: -ayar dosyaları: +yapılandırma dosyaları: directory klasör global config file: -genel ayar dosyası: +genel yapılandırma dosyası: Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files. FreeFileSync .ffs_gui ya da .ffs_batch yapılandırma dosyalarının sayısı. Any number of alternative directory pairs for at most one config file. -En fazla bir ayar dosyası için herhangi bir sayıda alternatif klasör çifti. +En fazla bir yapılandırma dosyası için herhangi bir sayıda alternatif klasör çifti. Open the selected configuration for editing only without executing it. Seçilmiş yapılandırmayı yürütmeden yalnız düzenlemek için açar. @@ -113,7 +116,19 @@ Aşağıdaki klasörler bulunamadı: If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. -Bu sorun yoksayılırsa klasörler boş olarak kabul edilir. Eksik klasörler gerek duyulduğunda otomatik olarak oluşturulur. +Bu sorun yok sayılırsa klasörler boş olarak kabul edilir. Eksik klasörler gerek duyulduğunda otomatik olarak oluşturulur. + +Comparison finished: +Karşılaştırma tamamlandı: + + +1 item found +%x items found + + +1 öge bulundu +%x öge bulundu + File %x has an invalid date. %x dosyasının tarihi geçersiz. @@ -143,7 +158,7 @@ Dosya listesi oluşturuluyor... Fail-safe file copy -Dosyalar Hatasız Kopyalansın +Dosyalar Sorunsuz Kopyalansın Enabled Etkin @@ -158,7 +173,7 @@ Dosya Erişim İzinleri de Kopyalansın File time tolerance -Yoksayılacak dosya zamanı farkı +Yok sayılacak dosya zamanı farkı Folder access timeout Klasör erişimi zaman aşımı @@ -175,9 +190,6 @@ Using non-default global settings: Varsayılan olmayan genel ayarlar kullanılıyor: -Starting comparison -Karşılaştırmaya başlanıyor - A folder input field is empty. Bir klasör giriş alanı boş. @@ -318,15 +330,15 @@ Gerçekleşen: %y bayt Unable to move %x to the recycle bin. %x geri dönüşüm kutusuna atılamadı. +Cannot find %x. +%x bulunamadı. + Cannot open file %x. %x dosyası açılamadı. Cannot find device %x. %x aygıtı bulunamadı. -Cannot find %x. -%x bulunamadı. - Type of item %x is not supported: %x ögesi türü desteklenmiyor: @@ -432,6 +444,9 @@ Gerçekleşen: %y bayt Lock owner: Kilitleyen: +Detecting abandoned lock... +Kaldırılmış kilit algılanıyor... + 1 sec %x sec @@ -441,9 +456,6 @@ Gerçekleşen: %y bayt %x saniye -Detecting abandoned lock... -Kaldırılmış kilit algılanıyor... - Items processed: İşlenen öge: @@ -454,10 +466,10 @@ Gerçekleşen: %y bayt Toplam süre: Error parsing file %x, row %y, column %z. -%x dosyası işlenirken hata, satır %y, sütun %z. +%x dosyası işlenirken sorun çıktı, satır %y, sütun %z. -Cannot set directory lock for %x. -%x için klasör kilidi uygulanamadı. +Cannot set directory locks for the following folders: +Şu klasörler kilitlenemedi: 1 thread @@ -498,9 +510,6 @@ Gerçekleşen: %y bayt Volume name %x is not part of file path %y. %x birim adı %y dosya yolunun bir parçası değil. -Stop requested: Waiting for current operation to finish... -Durdurma istendi: Yürürlükteki işlemin bitmesi bekleniyor... - Unable to create time stamp for versioning: Sürümlendirme için zaman damgası oluşturulamadı: @@ -513,6 +522,9 @@ Gerçekleşen: %y bayt Select a folder Bir klasör seçin +&New +&Yeni + &Open... &Aç... @@ -672,7 +684,7 @@ Komut şu durumlarda yürütülür: %x ve %y farklı içeriklere sahip. Data verification error: -Veri doğrulama hatası: +Veri doğrulama sorunu: Creating a Volume Shadow Copy for %x... %x için Birim Gölge Hizmeti oluşturuluyor... @@ -728,26 +740,23 @@ Komut şu durumlarda yürütülür: job name iş adı -Show summary -Özet Görüntülensin +System: Sleep +Sistem: Uyku -Sleep -Bilgisayar Uykuya Dalsın +System: Shut down +Sistem: Kapat -Shut down -Bilgisayar Kapatılsın - -Synchronization stopped -Eşitleme durduruldu +Cleaning up old log files... +Eski günlük dosyaları temizleniyor... Stopped Durduruldu -Synchronization completed with errors -Eşitleme bazı hatalarla tamamlandı +Completed with errors +Sorunlar ile tamamlandı -Synchronization completed with warnings -Eşitleme bazı uyarılar ile tamamlandı +Completed with warnings +Uyarılar ile tamamlandı Warning Uyarı @@ -755,15 +764,12 @@ Komut şu durumlarda yürütülür: Nothing to synchronize Eşitlenecek bir şey yok -Synchronization completed successfully -Eşitleme tamamlandı +Completed successfully +Tamamlandı Executing command %x %x komutu yürütülüyor -Cleaning up old log files... -Eski günlük dosyaları temizleniyor... - You can switch to FreeFileSync's main window to resolve this issue. Bu sorunu çözmek için FreeFileSync ana penceresine geçebilirsiniz. @@ -771,7 +777,7 @@ Komut şu durumlarda yürütülür: Bu &uyarı bir daha görüntülenmesin &Ignore -&Yoksay +&Yok Say &Switch &Değiştir @@ -779,14 +785,8 @@ Komut şu durumlarda yürütülür: Switching to FreeFileSync's main window FreeFileSync ana penceresine geçiliyor - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -1 saniye içinde yeniden denenecek... -%x saniye içinde yeniden denenecek... - +Automatic retry +Otomatik yeniden denensin Ignore &all Tümünü Yok S&ay @@ -795,7 +795,28 @@ Komut şu durumlarda yürütülür: İşlem yeniden deneniyor... Serious Error -Ciddi Hata +Ciddi Sorun + +Last session +Önceki oturum + +Today +Bugün + + +1 day +%x days + + +1 gün +%x gün + + +Name +Ad + +Last sync +Son eşitleme Folder Klasör @@ -822,7 +843,7 @@ Komut şu durumlarda yürütülür: Uzantı Category -Öge Tipi +Öge Türü Action İşlem @@ -860,9 +881,6 @@ Komut şu durumlarda yürütülür: Please select a folder on a local file system, network or an MTP device. Lütfen yerel dosya sistemi, ağ ya da MTP aygıtı üzerinde bulunan bir klasör seçin. -&New -&Yeni - &Save &Kaydet @@ -974,6 +992,9 @@ Komut şu durumlarda yürütülür: Total bytes to copy Toplam kopyalanacak bayt +Arrange folder pair +Klasör çiftini belirleyin + Folder pair: Klasör Çifti: @@ -984,7 +1005,7 @@ Komut şu durumlarda yürütülür: Yerel Ayarlar Kullanılsın: Select a variant: -İşlem Tipini Seçin: +İşlem Türünü Seçin: Include &symbolic links: &Sembolik Bağlantılar Katılsın: @@ -999,10 +1020,10 @@ Komut şu durumlarda yürütülür: Ayrıntılı Bilgiler &Ignore time shift [hh:mm] -&Yoksayılacak Zaman Farkı [ss:dd] +&Yok Sayılacak Zaman Farkı [ss:dd] List of file time offsets to ignore -Zaman farkı yoksayılacak dosyaların listesi +Zaman farkı yok sayılacak dosyaların listesi Example: Örnek: @@ -1066,11 +1087,14 @@ Komut şu durumlarda yürütülür: Naming convention: Adlandırma Kuralı: -&Ignore errors -&Hatalar yok sayılsın +Ignore errors +Sorunlar yok sayılsın -Show pop-up on errors or warnings -Hata ya da uyarılar açılır pencerede görüntülenir +Retry count: +Deneme Sayısı: + +Delay (in seconds): +Bekleme (saniye): Run a command after synchronization: Eşitleme sonrası yürütülecek komut: @@ -1078,9 +1102,6 @@ Komut şu durumlarda yürütülür: OK Tamam -Arrange folder pair -Klasör çiftini belirleyin - Enter your login details: Oturum açma ayrıntılarınızı yazın: @@ -1151,7 +1172,7 @@ Komut şu durumlarda yürütülür: Eşitleme başlatılsın mı? Variant: -İşlem Tipi: +İşlem Türü: &Don't show this dialog again Bu pencere bir daha &görüntülenmesin @@ -1177,12 +1198,12 @@ Komut şu durumlarda yürütülür: Minimize to notification area Bildirim alanına küçült -Bytes copied: -Kopyalanan bayt: - When finished: Tamamlandığında: +Auto-close +Otomatik kapat + Close Kapat @@ -1195,17 +1216,23 @@ Komut şu durumlarda yürütülür: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Eşitleme işleminin hiç bir soru sorulmadan yapılması için bir toplu iş dosyası oluşturun. İşlemi başlatmak için bu dosyaya çift tıklayın ya da bir görev zamanlayıcıya şu şekilde ekleyin: %x +Progress dialog: +İlerleme penceresi: + Run minimized Küçültülmüş Çalıştırılsın &Show error dialog -Hata &penceresi görüntülensin +Sorun &penceresi görüntülensin + +Show pop-up on errors or warnings +Sorun ya da uyarılar açılır pencerede görüntülenir &Cancel İ&ptal edilsin Stop synchronization at first error -Oluşacak ilk hatada eşitleme durdurulsun +Çıkan ilk sorunda eşitleme durdurulsun Save log: İşlem Günlüğü Kaydedilsin: @@ -1234,7 +1261,7 @@ This guarantees a consistent state even in case of a serious error. Dosyalar önce geçici dosyaya kopyalanıp (*.ffs_tmp) sonra yeniden adlandırılır. -Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak yapılmasını sağlar. +Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak yapılmasını sağlar. recommended @@ -1249,14 +1276,11 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Transfer file and folder permissions. Dosya ve klasör izinleri de aktarılır. -Automatic retry on error: -Hata Durumunda Yeniden Deneme: - -Retry count: -Deneme Sayısı: +Show hidden dialogs again +Gizlenmiş Pencereleri Yeniden Görüntüle -Delay (in seconds): -Bekleme (saniye): +Show all permanently hidden dialogs and warning messages again +Kalıcı olarak gizlenmiş tüm ileti ve uyarılar yeniden görüntülenir Customize context menu: Sağ Tık Menüsü Uyarlamaları: @@ -1264,12 +1288,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Description Açıklama -Show hidden dialogs again -Gizlenmiş Pencereleri Yeniden Görüntüle - -Show all permanently hidden dialogs and warning messages again -Kalıcı olarak gizlenmiş tüm ileti ve uyarılar yeniden görüntülenir - &Default &Varsayılan @@ -1324,13 +1342,22 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Activate offline Çevrimdışı Etkinleştir +Highlight configurations that have not been run for more than the following number of days: +Şu kadar gündür çalıştırılmayan yapılandırmalar vurgulansın: + +Synchronization Settings +Eşitleme Ayarları + +Access Online Storage +Çevrimiçi Depolama Erişimi + Save as a Batch Job Toplu İş Olarak Kaydet Delete Items Ögeleri Sil -Copy items +Copy Items Ögeleri Kopyala Options @@ -1342,6 +1369,9 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Yapılandırmalar Vurgulansın + &Options &Ayarlar @@ -1465,9 +1495,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Select time span... Zaman aralığını seçin... -Last session -Önceki oturum - Folder Comparison and Synchronization Klasör Karşılaştırma ve Eşitleme @@ -1486,8 +1513,11 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Do&n't save Kaydedilmesi&n -Remove entry from list -Kaydı Listeden Sil +Hide configuration +Yapılandırma gizlensin + +Highlight... +Vurgula... Clear filter Süzgeci Temizle @@ -1567,6 +1597,9 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Paused Duraklatıldı +Stop requested... +Durdurulması istendi... + Initializing... Başlatılıyor... @@ -1576,9 +1609,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Comparing content... İçerik karşılaştırılıyor... -Completed -Tamamlandı - Info Bilgi @@ -1660,12 +1690,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Parameters for opposite side Diğer tarafın parametreleri -Show hidden dialogs and warning messages again? -Gizlenmiş ileti ve uyarılar yeniden görüntülensin mi? - -&Show -&Görüntülensin - Downloading update... Güncelleme indiriliyor... @@ -1688,10 +1712,7 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Sol taraftaki yeni ya da güncellenmiş dosyalar sağ tarafa kopyalanır. Configure your own synchronization rules. -Eşitleme kuralları kullanıcının isteğine göre belirlenir. - -Synchronization Settings -Eşitleme Ayarları +Eşitleme kuralları kullanıcının isteğine göre yapılandırılır. Comparison Karşılaştırma @@ -1699,9 +1720,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Synchronization Eşitleme -Today -Bugün - This week Bu hafta @@ -1771,9 +1789,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Files Dosyalar -Name -Ad - Percentage Yüzde @@ -1885,15 +1900,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya %x saat - -1 day -%x days - - -1 gün -%x gün - - Cannot set privilege %x. %x izni verilemedi. @@ -1957,9 +1963,12 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Desktop Masaüstü -Start menu +Start Menu Başlat Menüsü +Send To +Gönder + Registering FreeFileSync file extensions FreeFileSync dosya uzantıları kayıt defterine ekleniyor @@ -1987,6 +1996,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya Please choose the local installation type or select a different folder for installation. Kurulum için farklı bir klasör ya da yerel kurulum türünü seçin. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Sessiz kurulum kipi yalnız FreeFileSync Donation Edition sürümünde bulunur. +The %x installation option is only available in the FreeFileSync Donation Edition. +%x kurulumu yalnız FreeFileSync Donation Sürümü ile yapılabilir. diff --git a/FreeFileSync/Build/Languages/ukrainian.lng b/FreeFileSync/Build/Languages/ukrainian.lng index 7de37ffe..855507d3 100755 --- a/FreeFileSync/Build/Languages/ukrainian.lng +++ b/FreeFileSync/Build/Languages/ukrainian.lng @@ -64,6 +64,9 @@ Syntax error Синтаксична помилка +A left and a right directory path are expected after %x. +Шлях до каталогу ліворуч і праворуч очікується після %x. + Cannot find file %x. Неможливо знайти файл %x. @@ -115,6 +118,19 @@ If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed. Якщо цю помилку буде проігноровано папки будуть вважатися порожніми. Відсутні папки створюються автоматично, коли це необхідно. +Comparison finished: +Порівняння завершено: + + +1 item found +%x items found + + +Знайдено %x элемент +Знайдено %x элементи +Знайдено %x элементів + + File %x has an invalid date. Файл %x має неіснуючу дату. @@ -175,9 +191,6 @@ Using non-default global settings: Використовувати глобальні налаштування не за замовчуванням: -Starting comparison -Запустити порівняння - A folder input field is empty. Порожнє поле папки. @@ -318,15 +331,15 @@ Actual: %y bytes Unable to move %x to the recycle bin. Не вдається перемістити %x до корзини. +Cannot find %x. +Не вдається знайти %x. + Cannot open file %x. Не вдається відкрити файл %x. Cannot find device %x. Не вдається знайти пристрій %x. -Cannot find %x. -Не вдається знайти %x. - Type of item %x is not supported: Тип елемента %x не підтримується: @@ -435,6 +448,9 @@ Actual: %y bytes Lock owner: Власник блокування: +Detecting abandoned lock... +Виявлено покинуте блокування... + 1 sec %x sec @@ -445,9 +461,6 @@ Actual: %y bytes %x сек -Detecting abandoned lock... -Виявлено покинуте блокування... - Items processed: Елементів оброблено: @@ -460,8 +473,8 @@ Actual: %y bytes Error parsing file %x, row %y, column %z. Помилка розбору файлу %x, рядок %y, колонка %z. -Cannot set directory lock for %x. -Не вдається встановити блокування папки %x. +Cannot set directory locks for the following folders: +Неможливо встановити блокування каталогів для таких папок: 1 thread @@ -503,9 +516,6 @@ Actual: %y bytes Volume name %x is not part of file path %y. Ім'я тому %x не є частиною шляху до файлу %y. -Stop requested: Waiting for current operation to finish... -Запит зупинки: очікування завершення поточної операції... - Unable to create time stamp for versioning: Не вдається створити часової мітки для версій: @@ -518,6 +528,9 @@ Actual: %y bytes Select a folder Вибрати папку +&New +&Створити + &Open... &Відкрити... @@ -733,26 +746,23 @@ The command is triggered if: job name назва завдання -Show summary -Показати підсумки +System: Sleep +Система: Сон -Sleep -Перейти в режим сну +System: Shut down +Система: Завершення роботи -Shut down -Вимкнути комп'ютер - -Synchronization stopped -Синхронізацію зупинено +Cleaning up old log files... +Очистка старих журналів... Stopped Зупинено -Synchronization completed with errors -Синхронізація закінчилася з помилками +Completed with errors +Завершено з помилками -Synchronization completed with warnings -Синхронізація завершена з попередженнями +Completed with warnings +Завершено з попередженнями Warning Увага @@ -760,15 +770,12 @@ The command is triggered if: Nothing to synchronize Нічого синхронізувати -Synchronization completed successfully -Синхронізація успішно завершена +Completed successfully +Завершено успішно Executing command %x Виконати команду %x -Cleaning up old log files... -Очистка старих журналів... - You can switch to FreeFileSync's main window to resolve this issue. Ви можете перейти до головного вікна FreeFileSync щоб вирішити це питання. @@ -784,15 +791,8 @@ The command is triggered if: Switching to FreeFileSync's main window Перехід до головного вікна FreeFileSync - -Automatic retry in 1 second... -Automatic retry in %x seconds... - - -Автоматичний повтор за %x секунду... -Автоматичний повтор за %x секунди... -Автоматичний повтор за %x секунд... - +Automatic retry +Автоматична повторна спроба Ignore &all Ігнорувати &усі @@ -803,6 +803,28 @@ The command is triggered if: Serious Error Серйозна помилка +Last session +Остання сесія + +Today +Сьогодні + + +1 day +%x days + + +%x день +%x дні +%x днів + + +Name +Назва + +Last sync +Остання синхронізація + Folder Папка @@ -866,9 +888,6 @@ The command is triggered if: Please select a folder on a local file system, network or an MTP device. Будь ласка, виберіть папку на локальній файловій системі, в мережі чи на MTP пристрої. -&New -&Створити - &Save &Зберегти @@ -980,6 +999,9 @@ The command is triggered if: Total bytes to copy Всього скопіювати байтів +Arrange folder pair +Упорядкувати пару папок + Folder pair: Пара папок: @@ -1072,11 +1094,14 @@ The command is triggered if: Naming convention: Метод іменування: -&Ignore errors -&Ігнорувати помилки +Ignore errors +Ігнорувати помилки -Show pop-up on errors or warnings -Показувати виринаючі вікна при помилках та попередженнях +Retry count: +Кількість спроб: + +Delay (in seconds): +Затримка (секунд): Run a command after synchronization: Виконати команду після синхронізації: @@ -1084,9 +1109,6 @@ The command is triggered if: OK OK -Arrange folder pair -Упорядкувати пару папок - Enter your login details: Введіть Ваші параметри входу: @@ -1183,12 +1205,12 @@ The command is triggered if: Minimize to notification area Згорнути в область повідомлень -Bytes copied: -Байт скопійовано: - When finished: Після завершення: +Auto-close +Автозавершення + Close Закрити @@ -1201,12 +1223,18 @@ The command is triggered if: Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x Створити пакетний файл для автоматичної синхронізації. Щоб запустити двічі клацніть цей файл або заплануйте в планувальнику завдань: %x +Progress dialog: +Діалог прогресу: + Run minimized Запустити згорнутим &Show error dialog &Показати діалог з помилками +Show pop-up on errors or warnings +Показувати виринаючі вікна при помилках та попередженнях + &Cancel &Відмінити @@ -1255,14 +1283,11 @@ This guarantees a consistent state even in case of a serious error. Transfer file and folder permissions. Перенести права доступу файлів і папок. -Automatic retry on error: -Автоматичний повтор при помилці: - -Retry count: -Кількість спроб: +Show hidden dialogs again +Показати сховані діалоги знову -Delay (in seconds): -Затримка (секунд): +Show all permanently hidden dialogs and warning messages again +Показати всі сховані діалоги і повідомлення з попередженнями знову Customize context menu: Налаштування контекстного меню: @@ -1270,12 +1295,6 @@ This guarantees a consistent state even in case of a serious error. Description Опис -Show hidden dialogs again -Показати сховані діалоги знову - -Show all permanently hidden dialogs and warning messages again -Показати всі сховані діалоги і повідомлення з попередженнями знову - &Default &За замовчуванням @@ -1330,14 +1349,23 @@ This guarantees a consistent state even in case of a serious error. Activate offline Активувати offline +Highlight configurations that have not been run for more than the following number of days: +Виділити конфігурації що не запускались більше ніж наступну кількість днів: + +Synchronization Settings +Налаштування Синхронізації + +Access Online Storage +Доступ до Online Сховища + Save as a Batch Job Зберегти як Пакетне Завдання Delete Items Вилучити Елементи -Copy items -Копіювати елементи +Copy Items +Копіювати Елементи Options Опції @@ -1348,6 +1376,9 @@ This guarantees a consistent state even in case of a serious error. FreeFileSync Donation Edition FreeFileSync Donation Edition +Highlight Configurations +Налаштування виділення + &Options &Опції @@ -1475,9 +1506,6 @@ This guarantees a consistent state even in case of a serious error. Select time span... Виберіть інтервал часу... -Last session -Остання сесія - Folder Comparison and Synchronization Порівнювання та Синхронізація папок @@ -1496,8 +1524,11 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Не зберігати -Remove entry from list -Видалити запис зі списку +Hide configuration +Сховати конфігурацію + +Highlight... +Виділити... Clear filter Очистити фільтр @@ -1577,6 +1608,9 @@ This guarantees a consistent state even in case of a serious error. Paused Призупинено +Stop requested... +Зупинити запит... + Initializing... Ініціалізація... @@ -1586,9 +1620,6 @@ This guarantees a consistent state even in case of a serious error. Comparing content... Порівнювання вмісту... -Completed -Завершено - Info Інформація @@ -1673,12 +1704,6 @@ This guarantees a consistent state even in case of a serious error. Parameters for opposite side Параметри для протилежної сторони: -Show hidden dialogs and warning messages again? -Показати сховані діалоги і попереджувальні повідомлення знову? - -&Show -&Показати - Downloading update... Завантажується оновлення... @@ -1703,18 +1728,12 @@ This guarantees a consistent state even in case of a serious error. Configure your own synchronization rules. Налаштувати власні правила синхронізації. -Synchronization Settings -Налаштування Синхронізації - Comparison Порівняння Synchronization Синхронізація -Today -Сьогодні - This week Цього тижня @@ -1784,9 +1803,6 @@ This guarantees a consistent state even in case of a serious error. Files Файли -Name -Назва - Percentage Проценти @@ -1900,16 +1916,6 @@ This guarantees a consistent state even in case of a serious error. %x годин - -1 day -%x days - - -%x день -%x дні -%x днів - - Cannot set privilege %x. Не вдається встановити привілеї %x. @@ -1973,8 +1979,11 @@ This guarantees a consistent state even in case of a serious error. Desktop Робочий стіл -Start menu -Меню Пуск +Start Menu +Меню "Пуск" + +Send To +Відправити Registering FreeFileSync file extensions Реєстрація розширень файлів FreeFileSync @@ -2003,6 +2012,6 @@ This guarantees a consistent state even in case of a serious error. Please choose the local installation type or select a different folder for installation. Будь ласка, виберіть локальний тип інсталяції чи іншу папку для встановлення. -The silent installation mode is only available in the FreeFileSync Donation Edition. -Режим автоматичного встановлення доступний тільки у FreeFileSync Donation Edition. +The %x installation option is only available in the FreeFileSync Donation Edition. +Варіант установки %x доступний тільки у FreeFileSync Donation Edition. diff --git a/FreeFileSync/Build/Resources.zip b/FreeFileSync/Build/Resources.zip index c0c2c2ed..28e925b0 100755 Binary files a/FreeFileSync/Build/Resources.zip and b/FreeFileSync/Build/Resources.zip differ diff --git a/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp b/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp index f83eebb7..64d582dc 100755 --- a/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp +++ b/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp @@ -21,6 +21,9 @@ using namespace rts; namespace { +const std::chrono::milliseconds FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX(200); + + void setFolderPath(const Zstring& dirpath, wxTextCtrl* txtCtrl, wxWindow& tooltipWnd, wxStaticText* staticText) //pointers are optional { if (txtCtrl) @@ -74,7 +77,7 @@ FolderSelector2::~FolderSelector2() void FolderSelector2::onMouseWheel(wxMouseEvent& event) { - //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. explorer + //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. Explorer //additionally this will delete manual entries, although all the users wanted is scroll the parent window! //redirect to parent scrolled window! @@ -130,7 +133,7 @@ void FolderSelector2::onSelectDir(wxCommandEvent& event) { auto ft = runAsync([folderPath] { return dirAvailable(folderPath); }); - if (ft.wait_for(std::chrono::milliseconds(200)) == std::future_status::ready && ft.get()) //potentially slow network access: wait 200ms at most + if (ft.wait_for(FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX) == std::future_status::ready && ft.get()) //potentially slow network access: wait 200ms at most defaultFolderPath = folderPath; } } diff --git a/FreeFileSync/Source/RealTimeSync/gui_generated.cpp b/FreeFileSync/Source/RealTimeSync/gui_generated.cpp index 0f62f821..85b74527 100755 --- a/FreeFileSync/Source/RealTimeSync/gui_generated.cpp +++ b/FreeFileSync/Source/RealTimeSync/gui_generated.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2017) +// C++ code generated with wxFormBuilder (version Jan 23 2018) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -131,32 +131,32 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr wxBoxSizer* bSizer20; bSizer20 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonAddFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); + m_bpButtonAddFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonAddFolder->SetToolTip( _("Add folder") ); - bSizer20->Add( m_bpButtonAddFolder, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer20->Add( m_bpButtonAddFolder, 0, wxEXPAND, 5 ); - m_bpButtonRemoveTopFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); + m_bpButtonRemoveTopFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonRemoveTopFolder->SetToolTip( _("Remove folder") ); - bSizer20->Add( m_bpButtonRemoveTopFolder, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer20->Add( m_bpButtonRemoveTopFolder, 0, wxEXPAND, 5 ); - fgSizer1->Add( bSizer20, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer1->Add( bSizer20, 0, wxEXPAND, 5 ); wxBoxSizer* bSizer19; bSizer19 = new wxBoxSizer( wxHORIZONTAL ); - m_txtCtrlDirectoryMain = new wxTextCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 300, -1 ), 0 ); + m_txtCtrlDirectoryMain = new wxTextCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer19->Add( m_txtCtrlDirectoryMain, 1, wxALIGN_CENTER_VERTICAL, 5 ); m_buttonSelectFolderMain = new wxButton( m_panelMainFolder, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonSelectFolderMain->SetToolTip( _("Select a folder") ); - bSizer19->Add( m_buttonSelectFolderMain, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer19->Add( m_buttonSelectFolderMain, 0, wxEXPAND, 5 ); - fgSizer1->Add( bSizer19, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer1->Add( bSizer19, 0, wxEXPAND, 5 ); m_panelMainFolder->SetSizer( fgSizer1 ); @@ -261,10 +261,10 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint wxBoxSizer* bSizer114; bSizer114 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonRemoveFolder = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); + m_bpButtonRemoveFolder = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonRemoveFolder->SetToolTip( _("Remove folder") ); - bSizer114->Add( m_bpButtonRemoveFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer114->Add( m_bpButtonRemoveFolder, 0, wxEXPAND, 5 ); m_txtCtrlDirectory = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); bSizer114->Add( m_txtCtrlDirectory, 1, wxALIGN_CENTER_VERTICAL, 5 ); @@ -272,7 +272,7 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint m_buttonSelectFolder = new wxButton( this, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonSelectFolder->SetToolTip( _("Select a folder") ); - bSizer114->Add( m_buttonSelectFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer114->Add( m_buttonSelectFolder, 0, wxEXPAND, 5 ); this->SetSizer( bSizer114 ); diff --git a/FreeFileSync/Source/RealTimeSync/gui_generated.h b/FreeFileSync/Source/RealTimeSync/gui_generated.h index 773d8c5a..eaead163 100755 --- a/FreeFileSync/Source/RealTimeSync/gui_generated.h +++ b/FreeFileSync/Source/RealTimeSync/gui_generated.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2017) +// C++ code generated with wxFormBuilder (version Jan 23 2018) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! diff --git a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp index c6093389..3f009a1a 100755 --- a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp +++ b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp @@ -30,6 +30,9 @@ using namespace rts; namespace { + static const size_t MAX_ADD_FOLDERS = 6; + + } @@ -38,7 +41,10 @@ class rts::DirectoryPanel : public FolderGenerated public: DirectoryPanel(wxWindow* parent) : FolderGenerated(parent), - folderSelector_(*this, *m_buttonSelectFolder, *m_txtCtrlDirectory, nullptr /*staticText*/) {} + folderSelector_(*this, *m_buttonSelectFolder, *m_txtCtrlDirectory, nullptr /*staticText*/) + { + m_bpButtonRemoveFolder->SetBitmapLabel(getResourceImage(L"item_remove")); + } void setPath(const Zstring& dirpath) { folderSelector_.setPath(dirpath); } Zstring getPath() const { return folderSelector_.getPath(); } @@ -63,18 +69,22 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName) setRelativeFontSize(*m_buttonStart, 1.5); + m_txtCtrlDirectoryMain->SetMinSize(wxSize(fastFromDIP(300), -1)); + + m_spinCtrlDelay->SetMinSize(wxSize(fastFromDIP(70), -1)); //Hack: set size (why does wxWindow::Size() not work?) + m_bpButtonRemoveTopFolder->Hide(); m_panelMainFolder->Layout(); m_bpButtonAddFolder ->SetBitmapLabel(getResourceImage(L"item_add")); m_bpButtonRemoveTopFolder->SetBitmapLabel(getResourceImage(L"item_remove")); - setBitmapTextLabel(*m_buttonStart, getResourceImage(L"startRts").ConvertToImage(), m_buttonStart->GetLabel(), 5, 8); + setBitmapTextLabel(*m_buttonStart, getResourceImage(L"startRts").ConvertToImage(), m_buttonStart->GetLabel(), fastFromDIP(5), fastFromDIP(8)); //register key event Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnKeyPressed), nullptr, this); //prepare drag & drop - dirpathFirst = std::make_unique(*m_panelMainFolder, *m_buttonSelectFolderMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath); + firstFolderPanel_ = std::make_unique(*m_panelMainFolder, *m_buttonSelectFolderMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath); //--------------------------- load config values ------------------------------------ XmlRealConfig newConfig; @@ -308,29 +318,26 @@ void MainDialog::onFilesDropped(FileDropEvent& event) { const auto& filePaths = event.getPaths(); if (!filePaths.empty()) - loadConfig(utfTo(filePaths[0])); + loadConfig(filePaths[0]); } void MainDialog::setConfiguration(const XmlRealConfig& cfg) { - //clear existing folders - dirpathFirst->setPath(Zstring()); - clearAddFolders(); - if (!cfg.directories.empty()) - { - //fill top folder - dirpathFirst->setPath(*cfg.directories.begin()); + const Zstring& firstFolderPath = cfg.directories.empty() ? Zstring() : cfg.directories[0]; + const std::vector addFolderPaths = cfg.directories.empty() ? std::vector() : + std::vector(cfg.directories.begin() + 1, cfg.directories.end()); - //fill additional folders - addFolder(std::vector(cfg.directories.begin() + 1, cfg.directories.end())); - } + firstFolderPanel_->setPath(firstFolderPath); + + bSizerFolders->Clear(true); + additionalFolderPanels_.clear(); + + insertAddFolder(addFolderPaths, 0); - //fill commandline m_textCtrlCommand->SetValue(utfTo(cfg.commandline)); - //set delay m_spinCtrlDelay->SetValue(static_cast(cfg.delay)); } @@ -339,9 +346,10 @@ XmlRealConfig MainDialog::getConfiguration() { XmlRealConfig output; - output.directories.push_back(utfTo(dirpathFirst->getPath())); - for (const DirectoryPanel* dne : dirpathsExtra) - output.directories.push_back(utfTo(dne->getPath())); + output.directories.push_back(firstFolderPanel_->getPath()); + + for (const DirectoryPanel* dp : additionalFolderPanels_) + output.directories.push_back(dp->getPath()); output.commandline = utfTo(m_textCtrlCommand->GetValue()); output.delay = m_spinCtrlDelay->GetValue(); @@ -352,26 +360,25 @@ XmlRealConfig MainDialog::getConfiguration() void MainDialog::OnAddFolder(wxCommandEvent& event) { - const Zstring topFolder = utfTo(dirpathFirst->getPath()); - //clear existing top folder first - dirpathFirst->setPath(Zstring()); + const Zstring topFolder = firstFolderPanel_->getPath(); - std::vector newFolders; - newFolders.push_back(topFolder); + //clear existing top folder first + firstFolderPanel_->setPath(Zstring()); - addFolder(newFolders, true); //add pair in front of additonal pairs + insertAddFolder({ topFolder }, 0); } void MainDialog::OnRemoveFolder(wxCommandEvent& event) { + //find folder pair originating the event const wxObject* const eventObj = event.GetEventObject(); - for (auto it = dirpathsExtra.begin(); it != dirpathsExtra.end(); ++it) + for (auto it = additionalFolderPanels_.begin(); it != additionalFolderPanels_.end(); ++it) if (eventObj == static_cast((*it)->m_bpButtonRemoveFolder)) { - removeAddFolder(it - dirpathsExtra.begin()); + removeAddFolder(it - additionalFolderPanels_.begin()); return; } } @@ -379,75 +386,61 @@ void MainDialog::OnRemoveFolder(wxCommandEvent& event) void MainDialog::OnRemoveTopFolder(wxCommandEvent& event) { - if (dirpathsExtra.size() > 0) + + if (!additionalFolderPanels_.empty()) { - dirpathFirst->setPath(dirpathsExtra[0]->getPath()); + firstFolderPanel_->setPath(additionalFolderPanels_[0]->getPath()); removeAddFolder(0); //remove first of additional folders } } - static const size_t MAX_ADD_FOLDERS = 6; - - -void MainDialog::addFolder(const std::vector& newFolders, bool addFront) +void MainDialog::insertAddFolder(const std::vector& newFolders, size_t pos) { - if (newFolders.size() == 0) - return; + assert(pos <= additionalFolderPanels_.size() && additionalFolderPanels_.size() == bSizerFolders->GetItemCount()); + pos = std::min(pos, additionalFolderPanels_.size()); - - int folderHeight = 0; - for (const Zstring& dirpath : newFolders) + for (size_t i = 0; i < newFolders.size(); ++i) { //add new folder pair DirectoryPanel* newFolder = new DirectoryPanel(m_scrolledWinFolders); - newFolder->m_bpButtonRemoveFolder->SetBitmapLabel(getResourceImage(L"item_remove")); - //get size of scrolled window - folderHeight = newFolder->GetSize().GetHeight(); - - if (addFront) - { - bSizerFolders->Insert(0, newFolder, 0, wxEXPAND, 5); - dirpathsExtra.insert(dirpathsExtra.begin(), newFolder); - } - else - { - bSizerFolders->Add(newFolder, 0, wxEXPAND, 5); - dirpathsExtra.push_back(newFolder); - } + bSizerFolders->Insert(pos + i, newFolder, 0, wxEXPAND); + additionalFolderPanels_.insert(additionalFolderPanels_.begin() + pos + i, newFolder); //register events newFolder->m_bpButtonRemoveFolder->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolder), nullptr, this ); - //insert directory name - newFolder->setPath(dirpath); + //make sure panel has proper default height + newFolder->GetSizer()->SetSizeHints(newFolder); //~=Fit() + SetMinSize() + + newFolder->setPath(newFolders[i]); } //set size of scrolled window - const size_t additionalRows = std::min(dirpathsExtra.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown - m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * static_cast(additionalRows))); + const int folderHeight = additionalFolderPanels_.empty() ? 0 : additionalFolderPanels_[0]->GetSize().GetHeight(); + const size_t visibleRows = std::min(additionalFolderPanels_.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown + + m_scrolledWinFolders->SetMinSize(wxSize(-1, folderHeight * static_cast(visibleRows))); //adapt delete top folder pair button - m_bpButtonRemoveTopFolder->Show(); + m_bpButtonRemoveTopFolder->Show(!additionalFolderPanels_.empty()); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() - Layout(); + Refresh(); //remove a little flicker near the start button } void MainDialog::removeAddFolder(size_t pos) { - - if (pos < dirpathsExtra.size()) + if (pos < additionalFolderPanels_.size()) { //remove folder pairs from window - DirectoryPanel* pairToDelete = dirpathsExtra[pos]; - const int folderHeight = pairToDelete->GetSize().GetHeight(); + DirectoryPanel* pairToDelete = additionalFolderPanels_[pos]; bSizerFolders->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually - dirpathsExtra.erase(dirpathsExtra.begin() + pos); //remove last element in vector + additionalFolderPanels_.erase(additionalFolderPanels_.begin() + pos); //remove last element in vector //more (non-portable) wxWidgets bullshit: on OS X wxWindow::Destroy() screws up and calls "operator delete" directly rather than //the deferred deletion it is expected to do (and which is implemented correctly on Windows and Linux) //http://bb10.com/python-wxpython-devel/2012-09/msg00004.html @@ -455,35 +448,16 @@ void MainDialog::removeAddFolder(size_t pos) guiQueue_.processAsync([] {}, [pairToDelete] { pairToDelete->Destroy(); }); //set size of scrolled window - const size_t additionalRows = std::min(dirpathsExtra.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown - m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * static_cast(additionalRows))); + const int folderHeight = additionalFolderPanels_.empty() ? 0 : additionalFolderPanels_[0]->GetSize().GetHeight(); + const size_t visibleRows = std::min(additionalFolderPanels_.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown + + m_scrolledWinFolders->SetMinSize(wxSize(-1, folderHeight * static_cast(visibleRows))); //adapt delete top folder pair button - if (dirpathsExtra.size() == 0) - { - m_bpButtonRemoveTopFolder->Hide(); - m_panelMainFolder->Layout(); - } + m_bpButtonRemoveTopFolder->Show(!additionalFolderPanels_.empty()); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() - Layout(); + Refresh(); //remove a little flicker near the start button } } - - -void MainDialog::clearAddFolders() -{ - - bSizerFolders->Clear(true); - dirpathsExtra.clear(); - - m_scrolledWinFolders->SetMinSize(wxSize(-1, 0)); - - m_bpButtonRemoveTopFolder->Hide(); - m_panelMainFolder->Layout(); - - GetSizer()->SetSizeHints(this); //~=Fit() - Layout(); - Refresh(); //remove a little flicker near the start button -} diff --git a/FreeFileSync/Source/RealTimeSync/main_dlg.h b/FreeFileSync/Source/RealTimeSync/main_dlg.h index cecf26c8..bc2eaacb 100755 --- a/FreeFileSync/Source/RealTimeSync/main_dlg.h +++ b/FreeFileSync/Source/RealTimeSync/main_dlg.h @@ -54,12 +54,11 @@ private: XmlRealConfig getConfiguration(); void setLastUsedConfig(const Zstring& filepath); - void addFolder(const std::vector& newFolders, bool addFront = false); + void insertAddFolder(const std::vector& newFolders, size_t pos); void removeAddFolder(size_t pos); - void clearAddFolders(); - std::unique_ptr dirpathFirst; - std::vector dirpathsExtra; //additional pairs to the standard pair + std::unique_ptr firstFolderPanel_; + std::vector additionalFolderPanels_; //additional pairs to the standard pair const Zstring lastRunConfigPath_; diff --git a/FreeFileSync/Source/RealTimeSync/xml_proc.cpp b/FreeFileSync/Source/RealTimeSync/xml_proc.cpp index 0cf23407..9d022b5d 100755 --- a/FreeFileSync/Source/RealTimeSync/xml_proc.cpp +++ b/FreeFileSync/Source/RealTimeSync/xml_proc.cpp @@ -88,14 +88,14 @@ XmlRealConfig convertBatchToReal(const fff::XmlBatchConfig& batchCfg, const Zstr std::set uniqueFolders; //add main folders - uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseLeft_); - uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseRight_); + uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseLeft); + uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseRight); //additional folders - for (const fff::FolderPairEnh& fp : batchCfg.mainCfg.additionalPairs) + for (const fff::LocalPairConfig& lpc : batchCfg.mainCfg.additionalPairs) { - uniqueFolders.insert(fp.folderPathPhraseLeft_); - uniqueFolders.insert(fp.folderPathPhraseRight_); + uniqueFolders.insert(lpc.folderPathPhraseLeft); + uniqueFolders.insert(lpc.folderPathPhraseRight); } erase_if(uniqueFolders, [](const Zstring& str) { return trimCpy(str).empty(); }); diff --git a/FreeFileSync/Source/algorithm.cpp b/FreeFileSync/Source/algorithm.cpp index 2316cd27..faab26af 100755 --- a/FreeFileSync/Source/algorithm.cpp +++ b/FreeFileSync/Source/algorithm.cpp @@ -658,15 +658,15 @@ private: std::vector fff::extractDirectionCfg(const MainConfiguration& mainCfg) { //merge first and additional pairs - std::vector allPairs; + std::vector allPairs; allPairs.push_back(mainCfg.firstPair); allPairs.insert(allPairs.end(), mainCfg.additionalPairs.begin(), //add additional pairs mainCfg.additionalPairs.end()); std::vector output; - for (const FolderPairEnh& fp : allPairs) - output.push_back(fp.altSyncConfig.get() ? fp.altSyncConfig->directionCfg : mainCfg.syncCfg.directionCfg); + for (const LocalPairConfig& lpc : allPairs) + output.push_back(lpc.localSyncCfg ? lpc.localSyncCfg->directionCfg : mainCfg.syncCfg.directionCfg); return output; } @@ -1034,7 +1034,7 @@ void fff::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& m throw std::logic_error("Contract violation! " + std::string(__FILE__) + ":" + numberTo(__LINE__)); //merge first and additional pairs - std::vector allPairs; + std::vector allPairs; allPairs.push_back(mainCfg.firstPair); allPairs.insert(allPairs.end(), mainCfg.additionalPairs.begin(), //add additional pairs diff --git a/FreeFileSync/Source/application.cpp b/FreeFileSync/Source/application.cpp index 0c6a4382..5a6e717a 100755 --- a/FreeFileSync/Source/application.cpp +++ b/FreeFileSync/Source/application.cpp @@ -49,12 +49,14 @@ const wxEventType EVENT_ENTER_EVENT_LOOP = wxNewEventType(); //################################################################################################################## + bool Application::OnInit() { //do not call wxApp::OnInit() to avoid using wxWidgets command line parser ::gtk_init(nullptr, nullptr); - ::gtk_rc_parse((getResourceDirPf() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons + //::gtk_rc_parse((getResourceDirPf() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons + //=> looks bad on Suse Linux! //Windows User Experience Interaction Guidelines: tool tips should have 5s timeout, info tips no timeout => compromise: wxToolTip::Enable(true); //yawn, a wxWidgets screw-up: wxToolTip::SetAutoPop is no-op if global tooltip window is not yet constructed: wxToolTip::Enable creates it @@ -62,7 +64,7 @@ bool Application::OnInit() SetAppName(L"FreeFileSync"); //if not set, the default is the executable's name! - initResourceImages(getResourceDirPf() + Zstr("Resources.zip")); + initResourceImages(getResourceDirPf() + Zstr("Resources.zip")); //parallel xBRZ-scaling! => run as early as possible try { @@ -322,11 +324,11 @@ void Application::launch(const std::vector& commandArgs) } //---------------------------------------------------------------------------------------------------- - auto hasNonDefaultConfig = [](const FolderPairEnh& fp) + auto hasNonDefaultConfig = [](const LocalPairConfig& lpc) { - return !(fp == FolderPairEnh(fp.folderPathPhraseLeft_, - fp.folderPathPhraseRight_, - nullptr, nullptr, FilterConfig())); + return lpc != LocalPairConfig(lpc.folderPathPhraseLeft, + lpc.folderPathPhraseRight, + NoValue(), NoValue(), FilterConfig()); }; auto replaceDirectories = [&](MainConfiguration& mainCfg) @@ -344,12 +346,12 @@ void Application::launch(const std::vector& commandArgs) for (size_t i = 0; i < dirPathPhrasePairs.size(); ++i) if (i == 0) { - mainCfg.firstPair.folderPathPhraseLeft_ = dirPathPhrasePairs[0].first; - mainCfg.firstPair.folderPathPhraseRight_ = dirPathPhrasePairs[0].second; + mainCfg.firstPair.folderPathPhraseLeft = dirPathPhrasePairs[0].first; + mainCfg.firstPair.folderPathPhraseRight = dirPathPhrasePairs[0].second; } else mainCfg.additionalPairs.emplace_back(dirPathPhrasePairs[i].first, dirPathPhrasePairs[i].second, - nullptr, nullptr, FilterConfig()); + NoValue(), NoValue(), FilterConfig()); } return true; }; @@ -556,8 +558,8 @@ void runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& bat globalCfg.lastSyncsLogFileSizeMax, batchCfg.mainCfg.ignoreErrors, batchCfg.batchExCfg.batchErrorDialog, - globalCfg.automaticRetryCount, - globalCfg.automaticRetryDelay, + batchCfg.mainCfg.automaticRetryCount, + batchCfg.mainCfg.automaticRetryDelay, returnCode, batchCfg.mainCfg.postSyncCommand, batchCfg.mainCfg.postSyncCondition, diff --git a/FreeFileSync/Source/comparison.cpp b/FreeFileSync/Source/comparison.cpp index ca7c6d03..61001120 100755 --- a/FreeFileSync/Source/comparison.cpp +++ b/FreeFileSync/Source/comparison.cpp @@ -22,21 +22,21 @@ using namespace fff; std::vector fff::extractCompareCfg(const MainConfiguration& mainCfg) { //merge first and additional pairs - std::vector allPairs = { mainCfg.firstPair }; + std::vector allPairs = { mainCfg.firstPair }; append(allPairs, mainCfg.additionalPairs); std::vector output; std::transform(allPairs.begin(), allPairs.end(), std::back_inserter(output), - [&](const FolderPairEnh& enhPair) -> FolderPairCfg + [&](const LocalPairConfig& lpc) -> FolderPairCfg { - return FolderPairCfg(enhPair.folderPathPhraseLeft_, enhPair.folderPathPhraseRight_, - enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->compareVar : mainCfg.cmpConfig.compareVar, - enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->handleSymlinks : mainCfg.cmpConfig.handleSymlinks, - enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->ignoreTimeShiftMinutes : mainCfg.cmpConfig.ignoreTimeShiftMinutes, + return FolderPairCfg(lpc.folderPathPhraseLeft, lpc.folderPathPhraseRight, + lpc.localCmpCfg ? lpc.localCmpCfg->compareVar : mainCfg.cmpConfig.compareVar, + lpc.localCmpCfg ? lpc.localCmpCfg->handleSymlinks : mainCfg.cmpConfig.handleSymlinks, + lpc.localCmpCfg ? lpc.localCmpCfg->ignoreTimeShiftMinutes : mainCfg.cmpConfig.ignoreTimeShiftMinutes, - normalizeFilters(mainCfg.globalFilter, enhPair.localFilter), + normalizeFilters(mainCfg.globalFilter, lpc.localFilter), - enhPair.altSyncConfig.get() ? enhPair.altSyncConfig->directionCfg : mainCfg.syncCfg.directionCfg); + lpc.localSyncCfg ? lpc.localSyncCfg->directionCfg : mainCfg.syncCfg.directionCfg); }); return output; } @@ -505,8 +505,8 @@ public: std::vector& undefinedFilesOut, std::vector& undefinedSymlinksOut) : failedItemReads_(failedItemReads), - undefinedFiles(undefinedFilesOut), - undefinedSymlinks(undefinedSymlinksOut) {} + undefinedFiles_(undefinedFilesOut), + undefinedSymlinks_(undefinedSymlinksOut) {} void execute(const FolderContainer& lhs, const FolderContainer& rhs, ContainerObject& output) { @@ -526,8 +526,8 @@ private: const std::wstring* checkFailedRead(FileSystemObject& fsObj, const std::wstring* errorMsg); const std::map& failedItemReads_; //base-relative paths or empty if read-error for whole base directory - std::vector& undefinedFiles; - std::vector& undefinedSymlinks; + std::vector& undefinedFiles_; + std::vector& undefinedSymlinks_; }; @@ -631,7 +631,7 @@ void MergeSides::mergeTwoSides(const FolderContainer& lhs, const FolderContainer fileRight.first, fileRight.second); if (!checkFailedRead(newItem, errorMsg)) - undefinedFiles.push_back(&newItem); + undefinedFiles_.push_back(&newItem); static_assert(IsSameType>::value, ""); //ContainerObject::addSubFile() must NOT invalidate references used in "undefinedFiles"! }); @@ -650,7 +650,7 @@ void MergeSides::mergeTwoSides(const FolderContainer& lhs, const FolderContainer symlinkRight.first, symlinkRight.second); if (!checkFailedRead(newItem, errorMsg)) - undefinedSymlinks.push_back(&newItem); + undefinedSymlinks_.push_back(&newItem); }); //----------------------------------------------------------------------------------------------- diff --git a/FreeFileSync/Source/file_hierarchy.cpp b/FreeFileSync/Source/file_hierarchy.cpp index bc6db6d6..7ef11e37 100755 --- a/FreeFileSync/Source/file_hierarchy.cpp +++ b/FreeFileSync/Source/file_hierarchy.cpp @@ -15,6 +15,48 @@ using namespace fff; +std::wstring fff::getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR) +{ + Zstring commonTrail; + AbstractPath tmpPathL = itemPathL; + AbstractPath tmpPathR = itemPathR; + for (;;) + { + Opt parentPathL = AFS::getParentFolderPath(tmpPathL); + Opt parentPathR = AFS::getParentFolderPath(tmpPathR); + if (!parentPathL || !parentPathR) + break; + + const Zstring itemNameL = AFS::getItemName(tmpPathL); + const Zstring itemNameR = AFS::getItemName(tmpPathR); + if (!strEqual(itemNameL, itemNameR, CmpNaturalSort())) //let's compare case-insensitively even on Linux! + break; + + tmpPathL = *parentPathL; + tmpPathR = *parentPathR; + + commonTrail = AFS::appendPaths(itemNameL, commonTrail, FILE_NAME_SEPARATOR); + } + if (!commonTrail.empty()) + return utfTo(commonTrail); + + auto getLastComponent = [](const AbstractPath& itemPath) + { + if (!AFS::getParentFolderPath(itemPath)) //= device root + return AFS::getDisplayPath(itemPath); + return utfTo(AFS::getItemName(itemPath)); + }; + + if (AFS::isNullPath(itemPathL)) + return getLastComponent(itemPathR); + else if (AFS::isNullPath(itemPathR)) + return getLastComponent(itemPathL); + else + return getLastComponent(itemPathL) + SPACED_DASH + + getLastComponent(itemPathR); +} + + void ContainerObject::removeEmptyRec() { bool emptyExisting = false; diff --git a/FreeFileSync/Source/file_hierarchy.h b/FreeFileSync/Source/file_hierarchy.h index d6a7c6fc..f25d7684 100755 --- a/FreeFileSync/Source/file_hierarchy.h +++ b/FreeFileSync/Source/file_hierarchy.h @@ -102,6 +102,10 @@ struct SelectParam //------------------------------------------------------------------ +std::wstring getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR); + +//------------------------------------------------------------------ + struct FolderContainer { //------------------------------------------------------------------ @@ -381,6 +385,8 @@ struct FSObjectVisitor }; + + //inherit from this class to allow safe random access by id instead of unsafe raw pointer //allow for similar semantics like std::weak_ptr without having to use std::shared_ptr template @@ -413,7 +419,6 @@ private: static std::unordered_set inst; return inst; //external linkage (even in header file!) } - }; //------------------------------------------------------------------ diff --git a/FreeFileSync/Source/fs/abstract.h b/FreeFileSync/Source/fs/abstract.h index 4899f32a..233d4faa 100755 --- a/FreeFileSync/Source/fs/abstract.h +++ b/FreeFileSync/Source/fs/abstract.h @@ -12,7 +12,7 @@ #include #include #include //InputStream/OutputStream support buffered stream concept -#include "../lib/icon_holder.h" +#include //NOT a wxWidgets dependency! namespace fff @@ -119,8 +119,8 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t static std::string getSymlinkBinaryContent(const AbstractPath& ap) { return ap.afs->getSymlinkBinaryContent(ap.afsPath); } //throw FileError //---------------------------------------------------------------------------------------------------------------- //noexcept; optional return value: - static ImageHolder getFileIcon (const AbstractPath& ap, int pixelSize) { return ap.afs->getFileIcon (ap.afsPath, pixelSize); } - static ImageHolder getThumbnailImage(const AbstractPath& ap, int pixelSize) { return ap.afs->getThumbnailImage(ap.afsPath, pixelSize); } + static zen::ImageHolder getFileIcon (const AbstractPath& ap, int pixelSize) { return ap.afs->getFileIcon (ap.afsPath, pixelSize); } + static zen::ImageHolder getThumbnailImage(const AbstractPath& ap, int pixelSize) { return ap.afs->getThumbnailImage(ap.afsPath, pixelSize); } static void connectNetworkFolder(const AbstractPath& ap, bool allowUserInteraction) { return ap.afs->connectNetworkFolder(ap.afsPath, allowUserInteraction); } //throw FileError //---------------------------------------------------------------------------------------------------------------- @@ -368,8 +368,8 @@ private: virtual void copySymlinkForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget, bool copyFilePermissions) const = 0; //throw FileError //---------------------------------------------------------------------------------------------------------------- - virtual ImageHolder getFileIcon (const AfsPath& afsPath, int pixelSize) const = 0; //noexcept; optional return value - virtual ImageHolder getThumbnailImage(const AfsPath& afsPath, int pixelSize) const = 0; // + virtual zen::ImageHolder getFileIcon (const AfsPath& afsPath, int pixelSize) const = 0; //noexcept; optional return value + virtual zen::ImageHolder getThumbnailImage(const AfsPath& afsPath, int pixelSize) const = 0; // virtual void connectNetworkFolder(const AfsPath& afsPath, bool allowUserInteraction) const = 0; //throw FileError //---------------------------------------------------------------------------------------------------------------- diff --git a/FreeFileSync/Source/fs/native.cpp b/FreeFileSync/Source/fs/native.cpp index 98a7becc..5ea0c9bb 100755 --- a/FreeFileSync/Source/fs/native.cpp +++ b/FreeFileSync/Source/fs/native.cpp @@ -446,7 +446,7 @@ private: //target existing: undefined behavior! (fail/overwrite/auto-rename) => Native will fail and give a clear error message void renameItemForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget) const override //throw FileError, ErrorDifferentVolume { - //perf test: detecting different volumes by path is ~30 times faster than having MoveFileEx fail with ERROR_NOT_SAME_DEVICE (6s vs 190s) + //perf test: detecting different volumes by path is ~30 times faster than having MoveFileEx fail with ERROR_NOT_SAME_DEVICE (6µs vs 190µs) //=> maybe we can even save some actual I/O in some cases? if (compareDeviceRootSameAfsType(getAfs(apTarget)) != 0) throw ErrorDifferentVolume(replaceCpy(replaceCpy(_("Cannot move file %x to %y."), diff --git a/FreeFileSync/Source/lib/binary.cpp b/FreeFileSync/Source/lib/binary.cpp index e4ac6fc3..bfa5cb97 100755 --- a/FreeFileSync/Source/lib/binary.cpp +++ b/FreeFileSync/Source/lib/binary.cpp @@ -12,6 +12,7 @@ using namespace zen; using namespace fff; using AFS = AbstractFileSystem; + namespace { /* diff --git a/FreeFileSync/Source/lib/dir_exist_async.h b/FreeFileSync/Source/lib/dir_exist_async.h index e61cdc41..ea518316 100755 --- a/FreeFileSync/Source/lib/dir_exist_async.h +++ b/FreeFileSync/Source/lib/dir_exist_async.h @@ -30,7 +30,8 @@ struct FolderStatus std::map failedChecks; }; -FolderStatus getFolderStatusNonBlocking(const std::set& folderPaths, int folderAccessTimeout, bool allowUserInteraction, ProcessCallback& procCallback) +FolderStatus getFolderStatusNonBlocking(const std::set& folderPaths, int folderAccessTimeout, + bool allowUserInteraction, ProcessCallback& procCallback) { using namespace zen; diff --git a/FreeFileSync/Source/lib/error_log.h b/FreeFileSync/Source/lib/error_log.h index 062c8fbb..022bf836 100755 --- a/FreeFileSync/Source/lib/error_log.h +++ b/FreeFileSync/Source/lib/error_log.h @@ -33,7 +33,7 @@ void logFatalError(const std::string& msg) //noexcept using namespace zen; assert(false); //this is stuff we like to debug - const std::string logEntry = "[" + formatTime(FORMAT_DATE) + " "+ formatTime(FORMAT_TIME) + "] " + msg; + const std::string logEntry = "[" + formatTime(FORMAT_DATE) + " " + formatTime(FORMAT_TIME) + "] " + msg; try { saveBinContainer(getConfigDirPathPf() + Zstr("LastError.log"), logEntry, nullptr /*notifyUnbufferedIO*/); //throw FileError diff --git a/FreeFileSync/Source/lib/hard_filter.cpp b/FreeFileSync/Source/lib/hard_filter.cpp index 0f8ebeea..a24dc65f 100755 --- a/FreeFileSync/Source/lib/hard_filter.cpp +++ b/FreeFileSync/Source/lib/hard_filter.cpp @@ -275,7 +275,7 @@ bool NameFilter::passFileFilter(const Zstring& relFilePath) const bool NameFilter::passDirFilter(const Zstring& relDirPath, bool* childItemMightMatch) const { assert(!startsWith(relDirPath, FILE_NAME_SEPARATOR)); - assert(!childItemMightMatch || *childItemMightMatch == true); //check correct usage + assert(!childItemMightMatch || *childItemMightMatch); //check correct usage const Zstring& pathFmt = relDirPath; //nothing to do here diff --git a/FreeFileSync/Source/lib/hard_filter.h b/FreeFileSync/Source/lib/hard_filter.h index 4f6acb56..0f312ea6 100755 --- a/FreeFileSync/Source/lib/hard_filter.h +++ b/FreeFileSync/Source/lib/hard_filter.h @@ -126,7 +126,7 @@ const Zchar FILTER_ITEM_SEPARATOR = Zstr('|'); inline bool NullFilter::passDirFilter(const Zstring& relDirPath, bool* childItemMightMatch) const { - assert(!childItemMightMatch || *childItemMightMatch == true); //check correct usage + assert(!childItemMightMatch || *childItemMightMatch); //check correct usage return true; } diff --git a/FreeFileSync/Source/lib/icon_buffer.cpp b/FreeFileSync/Source/lib/icon_buffer.cpp index 650bbb55..7efe713c 100755 --- a/FreeFileSync/Source/lib/icon_buffer.cpp +++ b/FreeFileSync/Source/lib/icon_buffer.cpp @@ -10,6 +10,7 @@ #include //includes #include #include +#include #include "icon_loader.h" @@ -34,7 +35,7 @@ wxBitmap extractWxBitmap(ImageHolder&& ih) wxImage img(ih.getWidth(), ih.getHeight(), ih.releaseRgb(), false /*static_data*/); //pass ownership if (ih.getAlpha()) - img.SetAlpha(ih.releaseAlpha(), false); + img.SetAlpha(ih.releaseAlpha(), false /*static_data*/); return wxBitmap(img); } @@ -78,7 +79,7 @@ class WorkLoad { public: //context of main thread - void setWorkload(const std::vector& newLoad) + void set(const std::vector& newLoad) { assert(std::this_thread::get_id() == mainThreadId); { @@ -92,7 +93,7 @@ public: //condition handling, see: http://www.boost.org/doc/libs/1_43_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref } - void addToWorkload(const AbstractPath& filePath) //context of main thread + void add(const AbstractPath& filePath) //context of main thread { assert(std::this_thread::get_id() == mainThreadId); { @@ -103,7 +104,7 @@ public: } //context of worker thread, blocking: - AbstractPath extractNextFile() //throw ThreadInterruption + AbstractPath extractNext() //throw ThreadInterruption { assert(std::this_thread::get_id() != mainThreadId); std::unique_lock dummy(lockFiles_); @@ -170,7 +171,7 @@ public: } //must be called by main thread only! => ~wxBitmap() is NOT thread-safe! - //call at an appropriate time, e.g. after Workload::setWorkload() + //call at an appropriate time, e.g. after Workload::set() void limitSize() { assert(std::this_thread::get_id() == mainThreadId); @@ -201,10 +202,10 @@ private: void priorityListPopFront() { assert(firstInsertPos_!= iconList.end()); - firstInsertPos_ = refData(firstInsertPos_).next_; + firstInsertPos_ = refData(firstInsertPos_).next; if (firstInsertPos_ != iconList.end()) - refData(firstInsertPos_).prev_ = iconList.end(); + refData(firstInsertPos_).prev = iconList.end(); else //priority list size > BUFFER_SIZE_MAX in this context, but still for completeness: lastInsertPos_ = iconList.end(); } @@ -216,13 +217,13 @@ private: { assert(firstInsertPos_ == iconList.end()); firstInsertPos_ = lastInsertPos_ = it; - refData(it).prev_ = refData(it).next_ = iconList.end(); + refData(it).prev = refData(it).next = iconList.end(); } else { - refData(it).next_ = iconList.end(); - refData(it).prev_ = lastInsertPos_; - refData(lastInsertPos_).next_ = it; + refData(it).next = iconList.end(); + refData(it).prev = lastInsertPos_; + refData(lastInsertPos_).next = it; lastInsertPos_ = it; } } @@ -231,12 +232,12 @@ private: void markAsHot(FileIconMap::iterator it) //mark existing buffer entry as if newly inserted { assert(it != iconList.end()); - if (refData(it).next_ != iconList.end()) + if (refData(it).next != iconList.end()) { - if (refData(it).prev_ != iconList.end()) + if (refData(it).prev != iconList.end()) { - refData(refData(it).prev_).next_ = refData(it).next_; //remove somewhere from the middle - refData(refData(it).next_).prev_ = refData(it).prev_; // + refData(refData(it).prev).next = refData(it).next; //remove somewhere from the middle + refData(refData(it).next).prev = refData(it).prev; // } else { @@ -247,7 +248,7 @@ private: } else { - if (refData(it).prev_ != iconList.end()) + if (refData(it).prev != iconList.end()) assert(it == lastInsertPos_); //nothing to do else assert(iconList.size() == 1 && it == firstInsertPos_ && it == lastInsertPos_); //nothing to do @@ -257,7 +258,7 @@ private: struct IconData { IconData() {} - IconData(IconData&& tmp) : iconRaw(std::move(tmp.iconRaw)), iconFmt(std::move(tmp.iconFmt)), prev_(tmp.prev_), next_(tmp.next_) {} + IconData(IconData&& tmp) : iconRaw(std::move(tmp.iconRaw)), iconFmt(std::move(tmp.iconFmt)), prev(tmp.prev), next(tmp.next) {} ImageHolder iconRaw; //native icon representation: may be used by any thread @@ -267,8 +268,8 @@ private: //- prohibit calls to ~wxBitmap() and transitively ~IconData() //- prohibit even wxBitmap() default constructor - better be safe than sorry! - FileIconMap::iterator prev_; //store list sorted by time of insertion into buffer - FileIconMap::iterator next_; // + FileIconMap::iterator prev; //store list sorted by time of insertion into buffer + FileIconMap::iterator next; // }; mutable std::mutex lockIconList_; @@ -279,50 +280,14 @@ private: //################################################################################################################################################ -class WorkerThread //lifetime is part of icon buffer -{ -public: - WorkerThread(const std::shared_ptr& workload, - const std::shared_ptr& buffer, - IconBuffer::IconSize st) : - workload_(workload), - buffer_(buffer), - iconSizeType_(st) {} - - void operator()() const; //thread entry - -private: - std::shared_ptr workload_; //main/worker thread may access different shared_ptr instances safely (even though they have the same target!) - std::shared_ptr buffer_; //http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm?sess=8153b05b34d890e02d48730db1ff7ddc#ThreadSafety - const IconBuffer::IconSize iconSizeType_; -}; - - - - -void WorkerThread::operator()() const //thread entry -{ - setCurrentThreadName("Icon Buffer Worker"); - for (;;) - { - interruptionPoint(); //throw ThreadInterruption - //needed? extractNextFile() is already interruptible... - - //start work: blocks until next icon to load is retrieved: - const AbstractPath itemPath = workload_->extractNextFile(); //throw ThreadInterruption - - if (!buffer_->hasIcon(itemPath)) //perf: workload may contain duplicate entries? - buffer_->insert(itemPath, getDisplayIcon(itemPath, iconSizeType_)); - } - -} //######################### redirect to impl ##################################################### struct IconBuffer::Impl { - std::shared_ptr workload = std::make_shared(); - std::shared_ptr buffer = std::make_shared(); + //communication channel used by threads: + WorkLoad workload; //manage life time: enclose InterruptibleThread's (until joined)!!! + Buffer buffer; // InterruptibleThread worker; @@ -333,7 +298,18 @@ struct IconBuffer::Impl IconBuffer::IconBuffer(IconSize sz) : pimpl_(std::make_unique()), iconSizeType_(sz) { - pimpl_->worker = InterruptibleThread(WorkerThread(pimpl_->workload, pimpl_->buffer, sz)); + pimpl_->worker = InterruptibleThread([&workload = pimpl_->workload, &buffer = pimpl_->buffer, sz] + { + setCurrentThreadName("Icon Buffer"); + for (;;) + { + //start work: blocks until next icon to load is retrieved: + const AbstractPath itemPath = workload.extractNext(); //throw ThreadInterruption + + if (!buffer.hasIcon(itemPath)) //perf: workload may contain duplicate entries? + buffer.insert(itemPath, getDisplayIcon(itemPath, sz)); + } + }); } @@ -347,15 +323,15 @@ IconBuffer::~IconBuffer() int IconBuffer::getSize(IconSize sz) { - //coordinate with getThumbSizeType() and linkOverlayIcon()! + //coordinate with getIconByIndexImpl() and linkOverlayIcon()! switch (sz) { case IconBuffer::SIZE_SMALL: - return 24; + return fastFromDIP(24); case IconBuffer::SIZE_MEDIUM: - return 48; + return fastFromDIP(48); case IconBuffer::SIZE_LARGE: - return 128; + return fastFromDIP(128); } assert(false); return 0; @@ -364,18 +340,18 @@ int IconBuffer::getSize(IconSize sz) bool IconBuffer::readyForRetrieval(const AbstractPath& filePath) { - return pimpl_->buffer->hasIcon(filePath); + return pimpl_->buffer.hasIcon(filePath); } Opt IconBuffer::retrieveFileIcon(const AbstractPath& filePath) { - if (Opt ico = pimpl_->buffer->retrieve(filePath)) + if (Opt ico = pimpl_->buffer.retrieve(filePath)) return ico; //since this icon seems important right now, we don't want to wait until next setWorkload() to start retrieving - pimpl_->workload->addToWorkload(filePath); - pimpl_->buffer->limitSize(); + pimpl_->workload.add(filePath); + pimpl_->buffer.limitSize(); return NoValue(); } @@ -384,8 +360,8 @@ void IconBuffer::setWorkload(const std::vector& load) { assert(load.size() < BUFFER_SIZE_MAX / 2); - pimpl_->workload->setWorkload(load); //since buffer can only increase due to new workload, - pimpl_->buffer->limitSize(); //this is the place to impose the limit from main thread! + pimpl_->workload.set(load); //since buffer can only increase due to new workload, + pimpl_->buffer.limitSize(); //this is the place to impose the limit from main thread! } @@ -427,9 +403,9 @@ wxBitmap IconBuffer::linkOverlayIcon(IconSize sz) { const int pixelSize = IconBuffer::getSize(sz); - if (pixelSize >= 128) return L"link_128"; - if (pixelSize >= 48) return L"link_48"; - if (pixelSize >= 24) return L"link_24"; + if (pixelSize >= fastFromDIP(128)) return L"link_128"; + if (pixelSize >= fastFromDIP(48)) return L"link_48"; + if (pixelSize >= fastFromDIP(24)) return L"link_24"; return L"link_16"; }()); } diff --git a/FreeFileSync/Source/lib/icon_holder.h b/FreeFileSync/Source/lib/icon_holder.h deleted file mode 100755 index 52bfe474..00000000 --- a/FreeFileSync/Source/lib/icon_holder.h +++ /dev/null @@ -1,51 +0,0 @@ -// ***************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * -// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * -// ***************************************************************************** - -#ifndef IMAGE_HOLDER_H_284578426342567457 -#define IMAGE_HOLDER_H_284578426342567457 - -#include - - -//used by fs/abstract.h => check carefully before adding dependencies! -namespace fff -{ -struct ImageHolder //prepare conversion to wxImage as much as possible while staying thread-safe (in contrast to wxIcon/wxBitmap) -{ - ImageHolder() {} - - ImageHolder(int w, int h, bool withAlpha) : //init with allocated memory - width_(w), height_(h), - rgb_(static_cast(::malloc(w * h * 3))), - alpha_(withAlpha ? static_cast(::malloc(w * h)) : nullptr) {} - - ImageHolder (ImageHolder&& tmp) = default; // - ImageHolder& operator=(ImageHolder&& tmp) = default; //move semantics only! - ImageHolder (const ImageHolder&) = delete; // - ImageHolder& operator=(const ImageHolder&) = delete; // - - explicit operator bool() const { return rgb_.get() != nullptr; } - - int getWidth () const { return width_; } - int getHeight() const { return height_; } - - unsigned char* getRgb () { return rgb_ .get(); } - unsigned char* getAlpha() { return alpha_.get(); } - - unsigned char* releaseRgb () { return rgb_ .release(); } - unsigned char* releaseAlpha() { return alpha_.release(); } - - struct CLibFree { void operator()(unsigned char* p) const { ::free(p); } }; //use malloc/free to allow direct move into wxImage! - -private: - int width_ = 0; - int height_ = 0; - std::unique_ptr rgb_; //optional - std::unique_ptr alpha_; // -}; -} - -#endif //IMAGE_HOLDER_H_284578426342567457 diff --git a/FreeFileSync/Source/lib/icon_loader.h b/FreeFileSync/Source/lib/icon_loader.h index efbd530f..7f14ff54 100755 --- a/FreeFileSync/Source/lib/icon_loader.h +++ b/FreeFileSync/Source/lib/icon_loader.h @@ -8,7 +8,7 @@ #define ICON_LOADER_H_1348701985713445 #include -#include "icon_holder.h" +#include namespace fff @@ -17,11 +17,11 @@ namespace fff //!!!Note: init COM + system image list before loading icons!!! //return null icon on failure: -ImageHolder getIconByTemplatePath(const Zstring& templatePath, int pixelSize); -ImageHolder genericFileIcon(int pixelSize); -ImageHolder genericDirIcon(int pixelSize); -ImageHolder getFileIcon(const Zstring& filePath, int pixelSize); -ImageHolder getThumbnailImage(const Zstring& filePath, int pixelSize); +zen::ImageHolder getIconByTemplatePath(const Zstring& templatePath, int pixelSize); +zen::ImageHolder genericFileIcon(int pixelSize); +zen::ImageHolder genericDirIcon(int pixelSize); +zen::ImageHolder getFileIcon(const Zstring& filePath, int pixelSize); +zen::ImageHolder getThumbnailImage(const Zstring& filePath, int pixelSize); } #endif //ICON_LOADER_H_1348701985713445 diff --git a/FreeFileSync/Source/lib/localization.cpp b/FreeFileSync/Source/lib/localization.cpp index a60e34e2..bc27e6ea 100755 --- a/FreeFileSync/Source/lib/localization.cpp +++ b/FreeFileSync/Source/lib/localization.cpp @@ -341,8 +341,8 @@ public: void init(wxLanguage lng) { - locale.reset(); //avoid global locale lifetime overlap! wxWidgets cannot handle this and will crash! - locale = std::make_unique(); + locale_.reset(); //avoid global locale lifetime overlap! wxWidgets cannot handle this and will crash! + locale_ = std::make_unique(); const wxLanguageInfo* sysLngInfo = wxLocale::GetLanguageInfo(wxLocale::GetSystemLanguage()); const wxLanguageInfo* selLngInfo = wxLocale::GetLanguageInfo(lng); @@ -352,23 +352,22 @@ public: wxLogNull dummy; //rather than implementing a reasonable error handling wxWidgets decides to shows a modal dialog in wxLocale::Init -> at least we can shut it up! if (sysLangIsRTL == selectedLangIsRTL) - locale->Init(wxLANGUAGE_DEFAULT); //use sys-lang to preserve sub-language specific rules (e.g. german swiss number punctation) + locale_->Init(wxLANGUAGE_DEFAULT); //use sys-lang to preserve sub-language specific rules (e.g. german swiss number punctation) else - locale->Init(lng); //have to use the supplied language to enable RTL layout different than user settings - locLng = lng; + locale_->Init(lng); //have to use the supplied language to enable RTL layout different than user settings + locLng_ = lng; } - void tearDown() { locale.reset(); locLng = wxLANGUAGE_UNKNOWN; } - - wxLanguage getLanguage() const { return locLng; } + void tearDown() { locale_.reset(); locLng_ = wxLANGUAGE_UNKNOWN; } + wxLanguage getLanguage() const { return locLng_; } private: wxWidgetsLocale() {} - ~wxWidgetsLocale() { assert(!locale); } + ~wxWidgetsLocale() { assert(!locale_); } - std::unique_ptr locale; - wxLanguage locLng = wxLANGUAGE_UNKNOWN; + std::unique_ptr locale_; + wxLanguage locLng_ = wxLANGUAGE_UNKNOWN; }; } diff --git a/FreeFileSync/Source/lib/parallel_scan.cpp b/FreeFileSync/Source/lib/parallel_scan.cpp index 3ff7c9b6..702b7aac 100755 --- a/FreeFileSync/Source/lib/parallel_scan.cpp +++ b/FreeFileSync/Source/lib/parallel_scan.cpp @@ -20,6 +20,7 @@ using namespace fff; namespace { + /* #ifdef ZEN_WIN @@ -164,17 +165,18 @@ public: //blocking call: context of worker thread FillBufferCallback::HandleError reportError(const std::wstring& msg, size_t retryNumber) //throw ThreadInterruption { + assert(std::this_thread::get_id() != mainThreadId); std::unique_lock dummy(lockErrorInfo_); interruptibleWait(conditionCanReportError_, dummy, [this] { return !errorInfo_ && !errorResponse_; }); //throw ThreadInterruption - errorInfo_ = std::make_unique>(copyStringTo(msg), retryNumber); + errorInfo_ = std::make_pair(copyStringTo(msg), retryNumber); interruptibleWait(conditionGotResponse_, dummy, [this] { return static_cast(errorResponse_); }); //throw ThreadInterruption FillBufferCallback::HandleError rv = *errorResponse_; - errorInfo_ .reset(); - errorResponse_.reset(); + errorInfo_ = NoValue(); + errorResponse_ = NoValue(); dummy.unlock(); //optimization for condition_variable::notify_all() conditionCanReportError_.notify_all(); //instead of notify_one(); workaround bug: https://svn.boost.org/trac/boost/ticket/7796 @@ -185,18 +187,18 @@ public: //context of main thread, call repreatedly void processErrors(FillBufferCallback& callback) { + assert(std::this_thread::get_id() == mainThreadId); std::unique_lock dummy(lockErrorInfo_); - if (errorInfo_.get() && !errorResponse_.get()) + if (errorInfo_ && !errorResponse_) { - FillBufferCallback::HandleError rv = callback.reportError(copyStringTo(errorInfo_->first), errorInfo_->second); //throw! - errorResponse_ = std::make_unique(rv); + errorResponse_ = callback.reportError(copyStringTo(errorInfo_->first), errorInfo_->second); //throw! dummy.unlock(); //optimization for condition_variable::notify_all() conditionGotResponse_.notify_all(); //instead of notify_one(); workaround bug: https://svn.boost.org/trac/boost/ticket/7796 } } - void incrementNotifyingThreadId() { ++notifyingThreadID_; } //context of main thread + void incrementNotifyingThreadId() {assert(std::this_thread::get_id() == mainThreadId); ++notifyingThreadID_; } //context of main thread //perf optimization: comparison phase is 7% faster by avoiding needless std::wstring contstruction for reportCurrentFile() bool mayReportCurrentFile(int threadID, std::chrono::steady_clock::time_point& lastReportTime) const @@ -217,12 +219,14 @@ public: void reportCurrentFile(const std::wstring& filepath) //context of worker thread { + assert(std::this_thread::get_id() != mainThreadId); std::lock_guard dummy(lockCurrentStatus_); currentFile_ = copyStringTo(filepath); } std::wstring getCurrentStatus() //context of main thread, call repreatedly { + assert(std::this_thread::get_id() == mainThreadId); std::wstring filepath; { std::lock_guard dummy(lockCurrentStatus_); @@ -255,8 +259,8 @@ private: std::mutex lockErrorInfo_; std::condition_variable conditionCanReportError_; std::condition_variable conditionGotResponse_; - std::unique_ptr> errorInfo_; //error message + retry number - std::unique_ptr errorResponse_; + Opt> errorInfo_; //error message + retry number + Opt errorResponse_; //---- status updates ---- std::atomic notifyingThreadID_ { 0 }; //CAVEAT: do NOT use boost::thread::id: https://svn.boost.org/trac/boost/ticket/5754 @@ -276,43 +280,27 @@ private: struct TraverserConfig { -public: - TraverserConfig(int threadID, - const AbstractPath& baseFolderPath, - const HardFilter::FilterRef& filter, - SymLinkHandling handleSymlinks, - std::map& failedFolderReads, - std::map& failedItemReads, - AsyncCallback& acb) : - baseFolderPath_(baseFolderPath), - filter_(filter), - handleSymlinks_(handleSymlinks), - failedDirReads_ (failedFolderReads), - failedItemReads_(failedItemReads), - acb_(acb), - threadID_(threadID) {} - - const AbstractPath baseFolderPath_; - const HardFilter::FilterRef filter_; //always bound! - const SymLinkHandling handleSymlinks_; - - std::map& failedDirReads_; - std::map& failedItemReads_; - - AsyncCallback& acb_; - const int threadID_; - std::chrono::steady_clock::time_point lastReportTime_; + const AbstractPath baseFolderPath; //thread-safe like an int! :) + const HardFilter::FilterRef filter; //always bound! + const SymLinkHandling handleSymlinks; + + std::map& failedDirReads; + std::map& failedItemReads; + + AsyncCallback& acb; + const int threadID; + std::chrono::steady_clock::time_point lastReportTime; }; class DirCallback : public AFS::TraverserCallback { public: - DirCallback(TraverserConfig& config, + DirCallback(TraverserConfig& cfg, const Zstring& parentRelPathPf, //postfixed with FILE_NAME_SEPARATOR! FolderContainer& output, int level) : - cfg(config), + cfg_(cfg), parentRelPathPf_(parentRelPathPf), output_(output), level_(level) {} @@ -325,7 +313,7 @@ public: HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override; // private: - TraverserConfig& cfg; + TraverserConfig& cfg_; const Zstring parentRelPathPf_; FolderContainer& output_; const int level_; @@ -344,12 +332,12 @@ void DirCallback::onFile(const FileInfo& fi) //throw ThreadInterruption const Zstring fileRelPath = parentRelPathPf_ + fi.itemName; //update status information no matter whether item is excluded or not! - if (cfg.acb_.mayReportCurrentFile(cfg.threadID_, cfg.lastReportTime_)) - cfg.acb_.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, fileRelPath))); + if (cfg_.acb.mayReportCurrentFile(cfg_.threadID, cfg_.lastReportTime)) + cfg_.acb.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, fileRelPath))); //------------------------------------------------------------------------------------ //apply filter before processing (use relative name!) - if (!cfg.filter_->passFileFilter(fileRelPath)) + if (!cfg_.filter->passFileFilter(fileRelPath)) return; // std::string fileId = details.fileSize >= 1024 * 1024U ? util::retrieveFileID(filepath) : std::string(); @@ -365,7 +353,7 @@ void DirCallback::onFile(const FileInfo& fi) //throw ThreadInterruption output_.addSubFile(fi.itemName, FileAttributes(fi.modTime, fi.fileSize, fi.fileId, fi.symlinkInfo != nullptr)); - cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator + cfg_.acb.incItemsScanned(); //add 1 element to the progress indicator } @@ -376,31 +364,31 @@ std::unique_ptr DirCallback::onFolder(const FolderInfo& const Zstring& folderRelPath = parentRelPathPf_ + fi.itemName; //update status information no matter whether item is excluded or not! - if (cfg.acb_.mayReportCurrentFile(cfg.threadID_, cfg.lastReportTime_)) - cfg.acb_.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, folderRelPath))); + if (cfg_.acb.mayReportCurrentFile(cfg_.threadID, cfg_.lastReportTime)) + cfg_.acb.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, folderRelPath))); //------------------------------------------------------------------------------------ //apply filter before processing (use relative name!) bool childItemMightMatch = true; - const bool passFilter = cfg.filter_->passDirFilter(folderRelPath, &childItemMightMatch); + const bool passFilter = cfg_.filter->passDirFilter(folderRelPath, &childItemMightMatch); if (!passFilter && !childItemMightMatch) return nullptr; //do NOT traverse subdirs //else: attention! ensure directory filtering is applied later to exclude actually filtered directories FolderContainer& subFolder = output_.addSubFolder(fi.itemName, fi.symlinkInfo != nullptr); if (passFilter) - cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator + cfg_.acb.incItemsScanned(); //add 1 element to the progress indicator //------------------------------------------------------------------------------------ if (level_ > 100) //Win32 traverser: stack overflow approximately at level 1000 //check after FolderContainer::addSubFolder() if (!tryReportingItemError([&] //throw ThreadInterruption { - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, folderRelPath))), L"Endless recursion."); + throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, folderRelPath))), L"Endless recursion."); }, *this, fi.itemName)) return nullptr; - return std::make_unique(cfg, folderRelPath + FILE_NAME_SEPARATOR, subFolder, level_ + 1); + return std::make_unique(cfg_, folderRelPath + FILE_NAME_SEPARATOR, subFolder, level_ + 1); } @@ -411,29 +399,29 @@ DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si) //throw Th const Zstring& linkRelPath = parentRelPathPf_ + si.itemName; //update status information no matter whether item is excluded or not! - if (cfg.acb_.mayReportCurrentFile(cfg.threadID_, cfg.lastReportTime_)) - cfg.acb_.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, linkRelPath))); + if (cfg_.acb.mayReportCurrentFile(cfg_.threadID, cfg_.lastReportTime)) + cfg_.acb.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, linkRelPath))); - switch (cfg.handleSymlinks_) + switch (cfg_.handleSymlinks) { case SymLinkHandling::EXCLUDE: return LINK_SKIP; case SymLinkHandling::DIRECT: - if (cfg.filter_->passFileFilter(linkRelPath)) //always use file filter: Link type may not be "stable" on Linux! + if (cfg_.filter->passFileFilter(linkRelPath)) //always use file filter: Link type may not be "stable" on Linux! { output_.addSubLink(si.itemName, LinkAttributes(si.modTime)); - cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator + cfg_.acb.incItemsScanned(); //add 1 element to the progress indicator } return LINK_SKIP; case SymLinkHandling::FOLLOW: //filter symlinks before trying to follow them: handle user-excluded broken symlinks! //since we don't know yet what type the symlink will resolve to, only do this when both variants agree: - if (!cfg.filter_->passFileFilter(linkRelPath)) + if (!cfg_.filter->passFileFilter(linkRelPath)) { bool childItemMightMatch = true; - if (!cfg.filter_->passDirFilter(linkRelPath, &childItemMightMatch)) + if (!cfg_.filter->passDirFilter(linkRelPath, &childItemMightMatch)) if (!childItemMightMatch) return LINK_SKIP; } @@ -447,10 +435,10 @@ DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si) //throw Th DirCallback::HandleError DirCallback::reportDirError(const std::wstring& msg, size_t retryNumber) //throw ThreadInterruption { - switch (cfg.acb_.reportError(msg, retryNumber)) //throw ThreadInterruption + switch (cfg_.acb.reportError(msg, retryNumber)) //throw ThreadInterruption { case FillBufferCallback::ON_ERROR_CONTINUE: - cfg.failedDirReads_[beforeLast(parentRelPathPf_, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)] = msg; + cfg_.failedDirReads[beforeLast(parentRelPathPf_, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)] = msg; return ON_ERROR_CONTINUE; case FillBufferCallback::ON_ERROR_RETRY: @@ -463,10 +451,10 @@ DirCallback::HandleError DirCallback::reportDirError(const std::wstring& msg, si DirCallback::HandleError DirCallback::reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) //throw ThreadInterruption { - switch (cfg.acb_.reportError(msg, retryNumber)) //throw ThreadInterruption + switch (cfg_.acb.reportError(msg, retryNumber)) //throw ThreadInterruption { case FillBufferCallback::ON_ERROR_CONTINUE: - cfg.failedItemReads_[parentRelPathPf_ + itemName] = msg; + cfg_.failedItemReads[parentRelPathPf_ + itemName] = msg; return ON_ERROR_CONTINUE; case FillBufferCallback::ON_ERROR_RETRY: @@ -475,48 +463,6 @@ DirCallback::HandleError DirCallback::reportItemError(const std::wstring& msg, s assert(false); return ON_ERROR_CONTINUE; } - -//------------------------------------------------------------------------------------------ - -class WorkerThread -{ -public: - WorkerThread(int threadID, - const std::shared_ptr& acb, - const AbstractPath& baseFolderPath, //always bound! - const HardFilter::FilterRef& filter, // - SymLinkHandling handleSymlinks, - DirectoryValue& dirOutput) : - acb_(acb), - outputContainer_(dirOutput.folderCont), - travCfg_(threadID, - baseFolderPath, - filter, - handleSymlinks, //shared by all(!) instances of DirCallback while traversing a folder hierarchy - dirOutput.failedFolderReads, - dirOutput.failedItemReads, - *acb_) {} - - void operator()() //thread entry - { - setCurrentThreadName("Folder Traverser"); - - acb_->incActiveWorker(); - ZEN_ON_SCOPE_EXIT(acb_->decActiveWorker()); - - if (acb_->mayReportCurrentFile(travCfg_.threadID_, travCfg_.lastReportTime_)) - acb_->reportCurrentFile(AFS::getDisplayPath(travCfg_.baseFolderPath_)); //just in case first directory access is blocking - - DirCallback cb(travCfg_, Zstring(), outputContainer_, 0); - - AFS::traverseFolder(travCfg_.baseFolderPath_, cb); //throw ThreadInterruption - } - -private: - std::shared_ptr acb_; - FolderContainer& outputContainer_; - TraverserConfig travCfg_; -}; } @@ -527,6 +473,9 @@ void fff::fillBuffer(const std::set& keysToRead, //in { buf.clear(); + //communication channel used by threads + AsyncCallback acb(cbInterval); //manage life time: enclose InterruptibleThread's!!! + FixedList worker; ZEN_ON_SCOPE_FAIL @@ -535,24 +484,39 @@ void fff::fillBuffer(const std::set& keysToRead, //in wt.interrupt(); //interrupt all first, then join for (InterruptibleThread& wt : worker) if (wt.joinable()) //= precondition of thread::join(), which throws an exception if violated! - wt.join(); //in this context it is possible a thread is *not* joinable anymore due to the thread::try_join_for() below! + wt.join(); //in this context it is possible a thread is *not* joinable anymore due to the tryJoinFor() below! ); - auto acb = std::make_shared(cbInterval); - //init worker threads for (const DirectoryKey& key : keysToRead) { - assert(buf.find(key) == buf.end()); DirectoryValue& dirOutput = buf[key]; const int threadId = static_cast(worker.size()); - worker.emplace_back(WorkerThread(threadId, - acb, - key.folderPath, //AbstractPath is thread-safe like an int! :) - key.filter, - key.handleSymlinks, - dirOutput)); + worker.emplace_back([&outputContainer = dirOutput.folderCont, + travCfg = TraverserConfig //shared by all(!) instances of DirCallback while traversing a folder hierarchy + { + key.folderPath, + key.filter, + key.handleSymlinks, + dirOutput.failedFolderReads, + dirOutput.failedItemReads, + acb, + threadId, + }]() mutable + { + setCurrentThreadName("Folder Traverser"); + + travCfg.acb.incActiveWorker(); + ZEN_ON_SCOPE_EXIT(travCfg.acb.decActiveWorker()); + + if (travCfg.acb.mayReportCurrentFile(travCfg.threadID, travCfg.lastReportTime)) + travCfg.acb.reportCurrentFile(AFS::getDisplayPath(travCfg.baseFolderPath)); //just in case first directory access is blocking + + DirCallback cb(travCfg, Zstring(), outputContainer, 0); + + AFS::traverseFolder(travCfg.baseFolderPath, cb); //throw ThreadInterruption + }); } //wait until done @@ -560,14 +524,11 @@ void fff::fillBuffer(const std::set& keysToRead, //in { do { - //update status - callback.reportStatus(acb->getCurrentStatus(), acb->getItemsScanned()); //throw! - - //process errors - acb->processErrors(callback); + callback.reportStatus(acb.getCurrentStatus(), acb.getItemsScanned()); //throw! + acb.processErrors(callback); } while (!wt.tryJoinFor(cbInterval)); - acb->incrementNotifyingThreadId(); //process info messages of one thread at a time only + acb.incrementNotifyingThreadId(); //process info messages of one thread at a time only } } diff --git a/FreeFileSync/Source/lib/parse_lng.h b/FreeFileSync/Source/lib/parse_lng.h index 78aa4a88..86faca28 100755 --- a/FreeFileSync/Source/lib/parse_lng.h +++ b/FreeFileSync/Source/lib/parse_lng.h @@ -725,8 +725,8 @@ std::string generateLng(const TranslationUnorderedList& in, const TransHeader& h out += tokens.text(Token::TK_SRC_END) + '\n'; out += tokens.text(Token::TK_TRG_BEGIN); - if (!forms.empty()) - out += '\n'; + if (!forms.empty()) //translators will be searching for "" + out += '\n'; for (std::string plForm : forms) { formatMultiLineText(plForm); diff --git a/FreeFileSync/Source/lib/perf_check.cpp b/FreeFileSync/Source/lib/perf_check.cpp index fe4727c7..8b6f52d6 100755 --- a/FreeFileSync/Source/lib/perf_check.cpp +++ b/FreeFileSync/Source/lib/perf_check.cpp @@ -45,8 +45,8 @@ std::tuple Perf const int itemsDelta = itBack->second.items - itFront->second.items; const double bytesDelta = itBack->second.bytes - itFront->second.bytes; - //return { timeDelta, itemsDelta, bytesDelta }; -> requires C++17 (Linux only issue) - return std::make_tuple(timeDelta, itemsDelta, bytesDelta); + //return { timeDelta, itemsDelta, bytesDelta }; -> requires C++17 (Linux-only issue) + return std::make_tuple(timeDelta, itemsDelta, bytesDelta); } diff --git a/FreeFileSync/Source/lib/process_xml.cpp b/FreeFileSync/Source/lib/process_xml.cpp index 2b9b52c8..d7db65df 100755 --- a/FreeFileSync/Source/lib/process_xml.cpp +++ b/FreeFileSync/Source/lib/process_xml.cpp @@ -21,8 +21,8 @@ using namespace fff; //functionally needed for correct overload resolution!!! namespace { //------------------------------------------------------------------------------------------------------------------------------- -const int XML_FORMAT_VER_GLOBAL = 8; //2018-02-01 -const int XML_FORMAT_VER_FFS_CFG = 9; //2018-02-01 +const int XML_FORMAT_VER_GLOBAL = 8; //2018-02-01 +const int XML_FORMAT_VER_FFS_CFG = 10; //2018-02-24 //------------------------------------------------------------------------------------------------------------------------------- } @@ -955,22 +955,22 @@ void readConfig(const XmlIn& in, FilterConfig& filter, int formatVer) } -void readConfig(const XmlIn& in, FolderPairEnh& enhPair, int formatVer) +void readConfig(const XmlIn& in, LocalPairConfig& lpc, int formatVer) { //read folder pairs - in["Left" ](enhPair.folderPathPhraseLeft_); - in["Right"](enhPair.folderPathPhraseRight_); + in["Left" ](lpc.folderPathPhraseLeft); + in["Right"](lpc.folderPathPhraseRight); //TODO: remove after migration - 2016-07-24 auto ciReplace = [](Zstring& pathPhrase, const Zstring& oldTerm, const Zstring& newTerm) { pathPhrase = ciReplaceCpy(pathPhrase, oldTerm, newTerm); }; - ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%")); - ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%")); - ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%")); - ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%")); - ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%")); - ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%")); - ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%")); - ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%")); + ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%")); + ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%")); + ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%")); + ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%")); + ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%")); + ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%")); + ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%")); + ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%")); //TODO: remove after migration 2016-09-27 if (formatVer < 6) //the-base64-encoded password is now stored as an option at the string end @@ -988,50 +988,59 @@ void readConfig(const XmlIn& in, FolderPairEnh& enhPair, int formatVer) Zstr("|pass64=") + Zstring(pathPhrase.begin() + pos + strLength(Zstr(":[base64]")), pathPhrase.begin() + posEnd); } }; - updateSftpSyntax(enhPair.folderPathPhraseLeft_); - updateSftpSyntax(enhPair.folderPathPhraseRight_); + updateSftpSyntax(lpc.folderPathPhraseLeft); + updateSftpSyntax(lpc.folderPathPhraseRight); } //########################################################### //alternate comp configuration (optional) - if (XmlIn inAltCmp = in["CompareConfig"]) + if (XmlIn inLocalCmp = in[formatVer < 10 ? "CompareConfig" : "Compare"]) //TODO: remove if parameter migration after some time! 2018-02-25 { - CompConfig altCmpCfg; - readConfig(inAltCmp, altCmpCfg); + CompConfig cmpCfg; + readConfig(inLocalCmp, cmpCfg); - enhPair.altCmpConfig = std::make_shared(altCmpCfg); + lpc.localCmpCfg = cmpCfg; } //########################################################### //alternate sync configuration (optional) - if (XmlIn inAltSync = in["SyncConfig"]) + if (XmlIn inLocalSync = in[formatVer < 10 ? "SyncConfig" : "Synchronize"]) //TODO: remove if parameter migration after some time! 2018-02-25 { - SyncConfig altSyncCfg; - readConfig(inAltSync, altSyncCfg); + SyncConfig syncCfg; + readConfig(inLocalSync, syncCfg); - enhPair.altSyncConfig = std::make_shared(altSyncCfg); + lpc.localSyncCfg = syncCfg; } //########################################################### //alternate filter configuration - if (XmlIn inLocFilter = in["LocalFilter"]) - readConfig(inLocFilter, enhPair.localFilter, formatVer); + if (XmlIn inLocFilter = in[formatVer < 10 ? "LocalFilter" : "Filter"]) //TODO: remove if parameter migration after some time! 2018-02-25 + readConfig(inLocFilter, lpc.localFilter, formatVer); } void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer) { - //read compare settings - XmlIn inMain = in["MainConfig"]; + XmlIn inMain = formatVer < 10 ? in["MainConfig"] : in; //TODO: remove if parameter migration after some time! 2018-02-25 - readConfig(inMain["Comparison"], mainCfg.cmpConfig); + if (formatVer < 10) //TODO: remove if parameter migration after some time! 2018-02-25 + readConfig(inMain["Comparison"], mainCfg.cmpConfig); + else + readConfig(inMain["Compare"], mainCfg.cmpConfig); //########################################################### //read sync configuration - readConfig(inMain["SyncConfig"], mainCfg.syncCfg); + if (formatVer < 10) //TODO: remove if parameter migration after some time! 2018-02-25 + readConfig(inMain["SyncConfig"], mainCfg.syncCfg); + else + readConfig(inMain["Synchronize"], mainCfg.syncCfg); + //########################################################### //read filter settings - readConfig(inMain["GlobalFilter"], mainCfg.globalFilter, formatVer); + if (formatVer < 10) //TODO: remove if parameter migration after some time! 2018-02-25 + readConfig(inMain["GlobalFilter"], mainCfg.globalFilter, formatVer); + else + readConfig(inMain["Filter"], mainCfg.globalFilter, formatVer); //########################################################### //read all folder pairs @@ -1040,16 +1049,16 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer) bool firstItem = true; for (XmlIn inPair = inMain["FolderPairs"]["Pair"]; inPair; inPair.next()) { - FolderPairEnh newPair; - readConfig(inPair, newPair, formatVer); + LocalPairConfig lpc; + readConfig(inPair, lpc, formatVer); if (firstItem) { firstItem = false; - mainCfg.firstPair = newPair; //set first folder pair + mainCfg.firstPair = lpc; //set first folder pair } else - mainCfg.additionalPairs.push_back(newPair); //set additional folder pairs + mainCfg.additionalPairs.push_back(lpc); //set additional folder pairs } //TODO: remove if parameter migration after some time! 2017-10-24 @@ -1057,7 +1066,16 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer) inMain["OnCompletion"](mainCfg.postSyncCommand); else { - inMain["IgnoreErrors"](mainCfg.ignoreErrors); + //TODO: remove if parameter migration after some time! 2018-02-24 + if (formatVer < 10) + inMain["IgnoreErrors"](mainCfg.ignoreErrors); + else + { + inMain["Errors"].attribute("Ignore", mainCfg.ignoreErrors); + inMain["Errors"].attribute("Retry", mainCfg.automaticRetryCount); + inMain["Errors"].attribute("Delay", mainCfg.automaticRetryDelay); + } + inMain["PostSyncCommand"](mainCfg.postSyncCommand); inMain["PostSyncCommand"].attribute("Condition", mainCfg.postSyncCondition); } @@ -1070,7 +1088,7 @@ void readConfig(const XmlIn& in, XmlGuiConfig& cfg, int formatVer) readConfig(in, cfg.mainCfg, formatVer); //read GUI specific config data - XmlIn inGuiCfg = in["GuiConfig"]; + XmlIn inGuiCfg = in[formatVer < 10 ? "GuiConfig" : "Gui"]; //TODO: remove if parameter migration after some time! 2018-02-25 std::string val; if (inGuiCfg["MiddleGridView"](val)) //refactor into enum!? @@ -1092,7 +1110,7 @@ void readConfig(const XmlIn& in, XmlGuiConfig& cfg, int formatVer) void readConfig(const XmlIn& in, BatchExclusiveConfig& cfg, int formatVer) { - XmlIn inBatchCfg = in["BatchConfig"]; + XmlIn inBatchCfg = in[formatVer < 10 ? "BatchConfig" : "Batch"]; //TODO: remove if parameter migration after some time! 2018-02-25 //TODO: remove if clause after migration! 2018-02-01 if (formatVer < 9) @@ -1197,8 +1215,6 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer) inGeneral["FailSafeFileCopy" ].attribute("Enabled", cfg.failSafeFileCopy); inGeneral["CopyLockedFiles" ].attribute("Enabled", cfg.copyLockedFiles); inGeneral["CopyFilePermissions" ].attribute("Enabled", cfg.copyFilePermissions); - inGeneral["AutomaticRetry" ].attribute("Count", cfg.automaticRetryCount); - inGeneral["AutomaticRetry" ].attribute("Delay", cfg.automaticRetryDelay); inGeneral["FileTimeTolerance" ].attribute("Seconds", cfg.fileTimeTolerance); inGeneral["FolderAccessTimeout" ].attribute("Seconds", cfg.folderAccessTimeout); inGeneral["RunWithBackgroundPriority"].attribute("Enabled", cfg.runWithBackgroundPriority); @@ -1207,7 +1223,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer) inGeneral["LastSyncsLogSizeMax" ].attribute("Bytes", cfg.lastSyncsLogFileSizeMax); inGeneral["NotificationSound" ].attribute("CompareFinished", cfg.soundFileCompareFinished); inGeneral["NotificationSound" ].attribute("SyncFinished", cfg.soundFileSyncFinished); - inGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog); + inGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog); //TODO: remove old parameter after migration! 2018-02-04 if (formatVer < 8) @@ -1643,54 +1659,54 @@ void writeConfig(const FilterConfig& filter, XmlOut& out) } -void writeConfig(const FolderPairEnh& enhPair, XmlOut& out) +void writeConfig(const LocalPairConfig& lpc, XmlOut& out) { XmlOut outPair = out.ref().addChild("Pair"); //read folder pairs - outPair["Left" ](enhPair.folderPathPhraseLeft_); - outPair["Right"](enhPair.folderPathPhraseRight_); + outPair["Left" ](lpc.folderPathPhraseLeft); + outPair["Right"](lpc.folderPathPhraseRight); //########################################################### //alternate comp configuration (optional) - if (enhPair.altCmpConfig.get()) + if (lpc.localCmpCfg) { - XmlOut outAlt = outPair["CompareConfig"]; - writeConfig(*enhPair.altCmpConfig, outAlt); + XmlOut outLocalCmp = outPair["Compare"]; + writeConfig(*lpc.localCmpCfg, outLocalCmp); } //########################################################### //alternate sync configuration (optional) - if (enhPair.altSyncConfig.get()) + if (lpc.localSyncCfg) { - XmlOut outAltSync = outPair["SyncConfig"]; - writeConfig(*enhPair.altSyncConfig, outAltSync); + XmlOut outLocalSync = outPair["Synchronize"]; + writeConfig(*lpc.localSyncCfg, outLocalSync); } //########################################################### //alternate filter configuration - if (enhPair.localFilter != FilterConfig()) //don't spam .ffs_gui file with default filter entries + if (lpc.localFilter != FilterConfig()) //don't spam .ffs_gui file with default filter entries { - XmlOut outFilter = outPair["LocalFilter"]; - writeConfig(enhPair.localFilter, outFilter); + XmlOut outFilter = outPair["Filter"]; + writeConfig(lpc.localFilter, outFilter); } } void writeConfig(const MainConfiguration& mainCfg, XmlOut& out) { - XmlOut outMain = out["MainConfig"]; + XmlOut outMain = out; - XmlOut outCmp = outMain["Comparison"]; + XmlOut outCmp = outMain["Compare"]; writeConfig(mainCfg.cmpConfig, outCmp); //########################################################### - XmlOut outSync = outMain["SyncConfig"]; + XmlOut outSync = outMain["Synchronize"]; writeConfig(mainCfg.syncCfg, outSync); //########################################################### - XmlOut outFilter = outMain["GlobalFilter"]; + XmlOut outFilter = outMain["Filter"]; //write filter settings writeConfig(mainCfg.globalFilter, outFilter); @@ -1703,10 +1719,13 @@ void writeConfig(const MainConfiguration& mainCfg, XmlOut& out) writeConfig(mainCfg.firstPair, outFp); //write additional folder pairs - for (const FolderPairEnh& fp : mainCfg.additionalPairs) - writeConfig(fp, outFp); + for (const LocalPairConfig& lpc : mainCfg.additionalPairs) + writeConfig(lpc, outFp); + + outMain["Errors"].attribute("Ignore", mainCfg.ignoreErrors); + outMain["Errors"].attribute("Retry", mainCfg.automaticRetryCount); + outMain["Errors"].attribute("Delay", mainCfg.automaticRetryDelay); - outMain["IgnoreErrors"](mainCfg.ignoreErrors); outMain["PostSyncCommand"](mainCfg.postSyncCommand); outMain["PostSyncCommand"].attribute("Condition", mainCfg.postSyncCondition); } @@ -1717,7 +1736,7 @@ void writeConfig(const XmlGuiConfig& cfg, XmlOut& out) writeConfig(cfg.mainCfg, out); //write main config //write GUI specific config data - XmlOut outGuiCfg = out["GuiConfig"]; + XmlOut outGuiCfg = out["Gui"]; outGuiCfg["MiddleGridView"](cfg.highlightSyncAction ? "Action" : "Category"); //refactor into enum!? } @@ -1725,11 +1744,11 @@ void writeConfig(const XmlGuiConfig& cfg, XmlOut& out) void writeConfig(const BatchExclusiveConfig& cfg, XmlOut& out) { - XmlOut outBatchCfg = out["BatchConfig"]; + XmlOut outBatchCfg = out["Batch"]; outBatchCfg["ProgressDialog"].attribute("Minimized", cfg.runMinimized); outBatchCfg["ProgressDialog"].attribute("AutoClose", cfg.autoCloseSummary); - outBatchCfg["ErrorDialog" ](cfg.batchErrorDialog); + outBatchCfg["ErrorDialog" ](cfg.batchErrorDialog); outBatchCfg["PostSyncAction"](cfg.postSyncAction); outBatchCfg["LogfileFolder"](cfg.logFolderPathPhrase); outBatchCfg["LogfileFolder"].attribute("Limit", cfg.logfilesCountLimit); @@ -1752,8 +1771,6 @@ void writeConfig(const XmlGlobalSettings& cfg, XmlOut& out) outGeneral["FailSafeFileCopy" ].attribute("Enabled", cfg.failSafeFileCopy); outGeneral["CopyLockedFiles" ].attribute("Enabled", cfg.copyLockedFiles); outGeneral["CopyFilePermissions" ].attribute("Enabled", cfg.copyFilePermissions); - outGeneral["AutomaticRetry" ].attribute("Count", cfg.automaticRetryCount); - outGeneral["AutomaticRetry" ].attribute("Delay", cfg.automaticRetryDelay); outGeneral["FileTimeTolerance" ].attribute("Seconds", cfg.fileTimeTolerance); outGeneral["FolderAccessTimeout" ].attribute("Seconds", cfg.folderAccessTimeout); outGeneral["RunWithBackgroundPriority"].attribute("Enabled", cfg.runWithBackgroundPriority); @@ -1762,7 +1779,7 @@ void writeConfig(const XmlGlobalSettings& cfg, XmlOut& out) outGeneral["LastSyncsLogSizeMax" ].attribute("Bytes", cfg.lastSyncsLogFileSizeMax); outGeneral["NotificationSound" ].attribute("CompareFinished", cfg.soundFileCompareFinished); outGeneral["NotificationSound" ].attribute("SyncFinished", cfg.soundFileSyncFinished); - outGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog); + outGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog); XmlOut outOpt = outGeneral["OptionalDialogs"]; outOpt["ConfirmStartSync" ].attribute("Show", cfg.confirmDlgs.confirmSyncStart); diff --git a/FreeFileSync/Source/lib/process_xml.h b/FreeFileSync/Source/lib/process_xml.h index eeaf5c1b..13709ec6 100755 --- a/FreeFileSync/Source/lib/process_xml.h +++ b/FreeFileSync/Source/lib/process_xml.h @@ -183,8 +183,6 @@ struct XmlGlobalSettings bool failSafeFileCopy = true; bool copyLockedFiles = false; //safer default: avoid copies of partially written files bool copyFilePermissions = false; - size_t automaticRetryCount = 0; - size_t automaticRetryDelay = 5; //unit: [sec] int fileTimeTolerance = 2; //max. allowed file time deviation; < 0 means unlimited tolerance; default 2s: FAT vs NTFS int folderAccessTimeout = 20; //unit: [s]; consider CD-ROM insert or hard disk spin up time from sleep diff --git a/FreeFileSync/Source/lib/soft_filter.h b/FreeFileSync/Source/lib/soft_filter.h index 95ff5a79..f0b7eec8 100755 --- a/FreeFileSync/Source/lib/soft_filter.h +++ b/FreeFileSync/Source/lib/soft_filter.h @@ -105,7 +105,7 @@ bool SoftFilter::isNull() const //filter is equivalent to NullFilter, but may be return timeFrom_ == std::numeric_limits::min() && sizeMin_ == 0U && sizeMax_ == std::numeric_limits::max() && - matchesFolder_ == true; + matchesFolder_; } } diff --git a/FreeFileSync/Source/lib/versioning.cpp b/FreeFileSync/Source/lib/versioning.cpp index 6d8ea721..9033bea8 100755 --- a/FreeFileSync/Source/lib/versioning.cpp +++ b/FreeFileSync/Source/lib/versioning.cpp @@ -15,9 +15,10 @@ Zstring getDotExtension(const Zstring& relativePath) //including "." if extensio }; } + bool fff::impl::isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersioned) //e.g. ("Sample.txt", "Sample.txt 2012-05-15 131513.txt") { - auto it = shortnameVersioned.begin(); + auto it = shortnameVersioned.begin(); auto itLast = shortnameVersioned.end(); auto nextDigit = [&]() -> bool diff --git a/FreeFileSync/Source/structures.cpp b/FreeFileSync/Source/structures.cpp index 47552362..79c3029e 100755 --- a/FreeFileSync/Source/structures.cpp +++ b/FreeFileSync/Source/structures.cpp @@ -183,18 +183,18 @@ DirectionSet fff::getTwoWayUpdateSet() } -std::wstring MainConfiguration::getCompVariantName() const +std::wstring fff::getCompVariantName(const MainConfiguration& mainCfg) { - const CompareVariant firstVariant = firstPair.altCmpConfig.get() ? - firstPair.altCmpConfig->compareVar : - cmpConfig.compareVar; //fallback to main sync cfg + const CompareVariant firstVariant = mainCfg.firstPair.localCmpCfg ? + mainCfg.firstPair.localCmpCfg->compareVar : + mainCfg.cmpConfig.compareVar; //fallback to main sync cfg //test if there's a deviating variant within the additional folder pairs - for (const FolderPairEnh& fp : additionalPairs) + for (const LocalPairConfig& lpc : mainCfg.additionalPairs) { - const CompareVariant thisVariant = fp.altCmpConfig.get() ? - fp.altCmpConfig->compareVar : - cmpConfig.compareVar; //fallback to main sync cfg + const CompareVariant thisVariant = lpc.localCmpCfg ? + lpc.localCmpCfg->compareVar : + mainCfg.cmpConfig.compareVar; //fallback to main sync cfg if (thisVariant != firstVariant) return _("Multiple..."); } @@ -204,18 +204,18 @@ std::wstring MainConfiguration::getCompVariantName() const } -std::wstring MainConfiguration::getSyncVariantName() const +std::wstring fff::getSyncVariantName(const MainConfiguration& mainCfg) { - const DirectionConfig::Variant firstVariant = firstPair.altSyncConfig.get() ? - firstPair.altSyncConfig->directionCfg.var : - syncCfg.directionCfg.var; //fallback to main sync cfg + const DirectionConfig::Variant firstVariant = mainCfg.firstPair.localSyncCfg ? + mainCfg.firstPair.localSyncCfg->directionCfg.var : + mainCfg.syncCfg.directionCfg.var; //fallback to main sync cfg //test if there's a deviating variant within the additional folder pairs - for (const FolderPairEnh& fp : additionalPairs) + for (const LocalPairConfig& lpc : mainCfg.additionalPairs) { - const DirectionConfig::Variant thisVariant = fp.altSyncConfig.get() ? - fp.altSyncConfig->directionCfg.var : - syncCfg.directionCfg.var; + const DirectionConfig::Variant thisVariant = lpc.localSyncCfg ? + lpc.localSyncCfg->directionCfg.var : + mainCfg.syncCfg.directionCfg.var; if (thisVariant != firstVariant) return _("Multiple..."); } @@ -315,60 +315,54 @@ int daysSinceBeginOfWeek(int dayOfWeek) //0-6, 0=Monday, 6=Sunday time_t resolve(size_t value, UnitTime unit, time_t defaultVal) { TimeComp tcLocal = getLocalTime(); - if (tcLocal == TimeComp()) - { - assert(false); - return defaultVal; - } - - switch (unit) - { - case UnitTime::NONE: - return defaultVal; - - case UnitTime::TODAY: - tcLocal.second = 0; //0-61 - tcLocal.minute = 0; //0-59 - tcLocal.hour = 0; //0-23 - return localToTimeT(tcLocal); //convert local time back to UTC - - //case UnitTime::THIS_WEEK: - //{ - // localTimeFmt->tm_sec = 0; //0-61 - // localTimeFmt->tm_min = 0; //0-59 - // localTimeFmt->tm_hour = 0; //0-23 - // const time_t timeFrom = ::mktime(localTimeFmt); - - // int dayOfWeek = (localTimeFmt->tm_wday + 6) % 7; //tm_wday := days since Sunday 0-6 - // // +6 == -1 in Z_7 - - // return int64_t(timeFrom) - daysSinceBeginOfWeek(dayOfWeek) * 24 * 3600; - //} - - case UnitTime::THIS_MONTH: - tcLocal.second = 0; //0-61 - tcLocal.minute = 0; //0-59 - tcLocal.hour = 0; //0-23 - tcLocal.day = 1; //1-31 - return localToTimeT(tcLocal); - - case UnitTime::THIS_YEAR: - tcLocal.second = 0; //0-61 - tcLocal.minute = 0; //0-59 - tcLocal.hour = 0; //0-23 - tcLocal.day = 1; //1-31 - tcLocal.month = 1; //1-12 - return localToTimeT(tcLocal); - - case UnitTime::LAST_X_DAYS: - tcLocal.second = 0; //0-61 - tcLocal.minute = 0; //0-59 - tcLocal.hour = 0; //0-23 - return localToTimeT(tcLocal) - value * 24 * 3600; - } - + if (tcLocal != TimeComp()) + switch (unit) + { + case UnitTime::NONE: + return defaultVal; + + case UnitTime::TODAY: + tcLocal.second = 0; //0-61 + tcLocal.minute = 0; //0-59 + tcLocal.hour = 0; //0-23 + return localToTimeT(tcLocal); //convert local time back to UTC + + //case UnitTime::THIS_WEEK: + //{ + // localTimeFmt->tm_sec = 0; //0-61 + // localTimeFmt->tm_min = 0; //0-59 + // localTimeFmt->tm_hour = 0; //0-23 + // const time_t timeFrom = ::mktime(localTimeFmt); + + // int dayOfWeek = (localTimeFmt->tm_wday + 6) % 7; //tm_wday := days since Sunday 0-6 + // // +6 == -1 in Z_7 + + // return int64_t(timeFrom) - daysSinceBeginOfWeek(dayOfWeek) * 24 * 3600; + //} + + case UnitTime::THIS_MONTH: + tcLocal.second = 0; //0-61 + tcLocal.minute = 0; //0-59 + tcLocal.hour = 0; //0-23 + tcLocal.day = 1; //1-31 + return localToTimeT(tcLocal); + + case UnitTime::THIS_YEAR: + tcLocal.second = 0; //0-61 + tcLocal.minute = 0; //0-59 + tcLocal.hour = 0; //0-23 + tcLocal.day = 1; //1-31 + tcLocal.month = 1; //1-12 + return localToTimeT(tcLocal); + + case UnitTime::LAST_X_DAYS: + tcLocal.second = 0; //0-61 + tcLocal.minute = 0; //0-59 + tcLocal.hour = 0; //0-23 + return localToTimeT(tcLocal) - value * 24 * 3600; + } assert(false); - return localToTimeT(tcLocal); + return defaultVal; } @@ -464,10 +458,10 @@ FilterConfig mergeFilterConfig(const FilterConfig& global, const FilterConfig& l inline -bool effectivelyEmpty(const FolderPairEnh& fp) +bool effectivelyEmpty(const LocalPairConfig& lpc) { - return trimCpy(fp.folderPathPhraseLeft_ ).empty() && - trimCpy(fp.folderPathPhraseRight_).empty(); + return trimCpy(lpc.folderPathPhraseLeft ).empty() && + trimCpy(lpc.folderPathPhraseRight).empty(); } } @@ -482,33 +476,34 @@ MainConfiguration fff::merge(const std::vector& mainCfgs) return mainCfgs[0]; // //merge folder pair config - std::vector fpMerged; + std::vector mergedCfgs; for (const MainConfiguration& mainCfg : mainCfgs) { - std::vector fpTmp; + std::vector tmpCfgs; //skip empty folder pairs if (!effectivelyEmpty(mainCfg.firstPair)) - fpTmp.push_back(mainCfg.firstPair); - for (const FolderPairEnh& fp : mainCfg.additionalPairs) - if (!effectivelyEmpty(fp)) - fpTmp.push_back(fp); + tmpCfgs.push_back(mainCfg.firstPair); + + for (const LocalPairConfig& lpc : mainCfg.additionalPairs) + if (!effectivelyEmpty(lpc)) + tmpCfgs.push_back(lpc); //move all configuration down to item level - for (FolderPairEnh& fp : fpTmp) + for (LocalPairConfig& lpc : tmpCfgs) { - if (!fp.altCmpConfig.get()) - fp.altCmpConfig = std::make_shared(mainCfg.cmpConfig); + if (!lpc.localCmpCfg) + lpc.localCmpCfg = mainCfg.cmpConfig; - if (!fp.altSyncConfig.get()) - fp.altSyncConfig = std::make_shared(mainCfg.syncCfg); + if (!lpc.localSyncCfg) + lpc.localSyncCfg = mainCfg.syncCfg; - fp.localFilter = mergeFilterConfig(mainCfg.globalFilter, fp.localFilter); + lpc.localFilter = mergeFilterConfig(mainCfg.globalFilter, lpc.localFilter); } - append(fpMerged, fpTmp); + append(mergedCfgs, tmpCfgs); } - if (fpMerged.empty()) + if (mergedCfgs.empty()) return MainConfiguration(); //optimization: remove redundant configuration @@ -517,11 +512,11 @@ MainConfiguration fff::merge(const std::vector& mainCfgs) //find out which comparison and synchronization setting are used most often and use them as new "header" std::vector> cmpCfgStat; std::vector> syncCfgStat; - for (const FolderPairEnh& fp : fpMerged) + for (const LocalPairConfig& lpc : mergedCfgs) { //a rather inefficient algorithm, but it does not require a less-than operator: { - const CompConfig& cmpCfg = *fp.altCmpConfig; + const CompConfig& cmpCfg = *lpc.localCmpCfg; auto it = std::find_if(cmpCfgStat.begin(), cmpCfgStat.end(), [&](const std::pair& entry) { return effectivelyEqual(entry.first, cmpCfg); }); @@ -531,7 +526,7 @@ MainConfiguration fff::merge(const std::vector& mainCfgs) ++(it->second); } { - const SyncConfig& syncCfg = *fp.altSyncConfig; + const SyncConfig& syncCfg = *lpc.localSyncCfg; auto it = std::find_if(syncCfgStat.begin(), syncCfgStat.end(), [&](const std::pair& entry) { return effectivelyEqual(entry.first, syncCfg); }); @@ -553,24 +548,24 @@ MainConfiguration fff::merge(const std::vector& mainCfgs) //######################################################################################################################## FilterConfig globalFilter; - const bool allFiltersEqual = std::all_of(fpMerged.begin(), fpMerged.end(), [&](const FolderPairEnh& fp) { return fp.localFilter == fpMerged[0].localFilter; }); + const bool allFiltersEqual = std::all_of(mergedCfgs.begin(), mergedCfgs.end(), [&](const LocalPairConfig& lpc) { return lpc.localFilter == mergedCfgs[0].localFilter; }); if (allFiltersEqual) - globalFilter = fpMerged[0].localFilter; + globalFilter = mergedCfgs[0].localFilter; //strip redundancy... - for (FolderPairEnh& fp : fpMerged) + for (LocalPairConfig& lpc : mergedCfgs) { //if local config matches output global config we don't need local one - if (fp.altCmpConfig && - effectivelyEqual(*fp.altCmpConfig, cmpCfgHead)) - fp.altCmpConfig.reset(); + if (lpc.localCmpCfg && + effectivelyEqual(*lpc.localCmpCfg, cmpCfgHead)) + lpc.localCmpCfg = NoValue(); - if (fp.altSyncConfig && - effectivelyEqual(*fp.altSyncConfig, syncCfgHead)) - fp.altSyncConfig.reset(); + if (lpc.localSyncCfg && + effectivelyEqual(*lpc.localSyncCfg, syncCfgHead)) + lpc.localSyncCfg = NoValue(); if (allFiltersEqual) //use global filter in this case - fp.localFilter = FilterConfig(); + lpc.localFilter = FilterConfig(); } //final assembly @@ -578,9 +573,16 @@ MainConfiguration fff::merge(const std::vector& mainCfgs) cfgOut.cmpConfig = cmpCfgHead; cfgOut.syncCfg = syncCfgHead; cfgOut.globalFilter = globalFilter; - cfgOut.firstPair = fpMerged[0]; - cfgOut.additionalPairs.assign(fpMerged.begin() + 1, fpMerged.end()); + cfgOut.firstPair = mergedCfgs[0]; + cfgOut.additionalPairs.assign(mergedCfgs.begin() + 1, mergedCfgs.end()); cfgOut.ignoreErrors = std::all_of(mainCfgs.begin(), mainCfgs.end(), [](const MainConfiguration& mainCfg) { return mainCfg.ignoreErrors; }); + + cfgOut.automaticRetryCount = std::max_element(mainCfgs.begin(), mainCfgs.end(), + [](const MainConfiguration& lhs, const MainConfiguration& rhs) { return lhs.automaticRetryCount < rhs.automaticRetryCount; })->automaticRetryCount; + + cfgOut.automaticRetryDelay = std::max_element(mainCfgs.begin(), mainCfgs.end(), + [](const MainConfiguration& lhs, const MainConfiguration& rhs) { return lhs.automaticRetryDelay < rhs.automaticRetryDelay; })->automaticRetryDelay; + //cfgOut.postSyncCommand = mainCfgs[0].postSyncCommand; -> better leave at default ... !? //cfgOut.postSyncCondition = mainCfgs[0].postSyncCondition; -> return cfgOut; diff --git a/FreeFileSync/Source/structures.h b/FreeFileSync/Source/structures.h index 4f9b6a65..298eda76 100755 --- a/FreeFileSync/Source/structures.h +++ b/FreeFileSync/Source/structures.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace fff @@ -324,46 +325,40 @@ void resolveUnits(size_t timeSpan, UnitTime unitTimeSpan, uint64_t& sizeMaxBy); //unit: bytes -struct FolderPairEnh //enhanced folder pairs with (optional) alternate configuration +struct LocalPairConfig //enhanced folder pairs with (optional) alternate configuration { - FolderPairEnh() {} - - FolderPairEnh(const Zstring& folderPathPhraseLeft, - const Zstring& folderPathPhraseRight, - const std::shared_ptr& cmpConfig, - const std::shared_ptr& syncConfig, - const FilterConfig& filter) : - folderPathPhraseLeft_ (folderPathPhraseLeft), - folderPathPhraseRight_(folderPathPhraseRight), - altCmpConfig(cmpConfig), - altSyncConfig(syncConfig), + LocalPairConfig() {} + + LocalPairConfig(const Zstring& phraseLeft, + const Zstring& phraseRight, + const zen::Opt& cmpConfig, + const zen::Opt& syncConfig, + const FilterConfig& filter) : + folderPathPhraseLeft (phraseLeft), + folderPathPhraseRight(phraseRight), + localCmpCfg(cmpConfig), + localSyncCfg(syncConfig), localFilter(filter) {} - Zstring folderPathPhraseLeft_; //unresolved directory names as entered by user! - Zstring folderPathPhraseRight_; // + Zstring folderPathPhraseLeft; //unresolved directory names as entered by user! + Zstring folderPathPhraseRight; // - std::shared_ptr altCmpConfig; //optional - std::shared_ptr altSyncConfig; // - FilterConfig localFilter; + zen::Opt localCmpCfg; + zen::Opt localSyncCfg; + FilterConfig localFilter; }; inline -bool operator==(const FolderPairEnh& lhs, const FolderPairEnh& rhs) +bool operator==(const LocalPairConfig& lhs, const LocalPairConfig& rhs) { - return lhs.folderPathPhraseLeft_ == rhs.folderPathPhraseLeft_ && - lhs.folderPathPhraseRight_ == rhs.folderPathPhraseRight_ && - - (lhs.altCmpConfig.get() && rhs.altCmpConfig.get() ? - *lhs.altCmpConfig == *rhs.altCmpConfig : - lhs.altCmpConfig.get() == rhs.altCmpConfig.get()) && - - (lhs.altSyncConfig.get() && rhs.altSyncConfig.get() ? - *lhs.altSyncConfig == *rhs.altSyncConfig : - lhs.altSyncConfig.get() == rhs.altSyncConfig.get()) && - - lhs.localFilter == rhs.localFilter; + return lhs.folderPathPhraseLeft == rhs.folderPathPhraseLeft && + lhs.folderPathPhraseRight == rhs.folderPathPhraseRight && + lhs.localCmpCfg == rhs.localCmpCfg && + lhs.localSyncCfg == rhs.localSyncCfg && + lhs.localFilter == rhs.localFilter; } +inline bool operator!=(const LocalPairConfig& lhs, const LocalPairConfig& rhs) { return !(lhs == rhs); } enum class PostSyncCondition @@ -380,30 +375,34 @@ struct MainConfiguration SyncConfig syncCfg; //global synchronisation settings: may be overwritten by folder pair settings FilterConfig globalFilter; //global filter settings: combined with folder pair settings - FolderPairEnh firstPair; //there needs to be at least one pair! - std::vector additionalPairs; + LocalPairConfig firstPair; //there needs to be at least one pair! + std::vector additionalPairs; bool ignoreErrors = false; //true: errors will still be logged + size_t automaticRetryCount = 0; + size_t automaticRetryDelay = 5; //unit: [sec] Zstring postSyncCommand; //user-defined command line PostSyncCondition postSyncCondition = PostSyncCondition::COMPLETION; - - std::wstring getCompVariantName() const; - std::wstring getSyncVariantName() const; }; +std::wstring getCompVariantName(const MainConfiguration& mainCfg); +std::wstring getSyncVariantName(const MainConfiguration& mainCfg); + inline bool operator==(const MainConfiguration& lhs, const MainConfiguration& rhs) { - return lhs.cmpConfig == rhs.cmpConfig && - lhs.syncCfg == rhs.syncCfg && - lhs.globalFilter == rhs.globalFilter && - lhs.firstPair == rhs.firstPair && - lhs.additionalPairs == rhs.additionalPairs && - lhs.ignoreErrors == rhs.ignoreErrors && - lhs.postSyncCommand == rhs.postSyncCommand && - lhs.postSyncCondition == rhs.postSyncCondition; + return lhs.cmpConfig == rhs.cmpConfig && + lhs.syncCfg == rhs.syncCfg && + lhs.globalFilter == rhs.globalFilter && + lhs.firstPair == rhs.firstPair && + lhs.additionalPairs == rhs.additionalPairs && + lhs.ignoreErrors == rhs.ignoreErrors && + lhs.automaticRetryCount == rhs.automaticRetryCount && + lhs.automaticRetryDelay == rhs.automaticRetryDelay && + lhs.postSyncCommand == rhs.postSyncCommand && + lhs.postSyncCondition == rhs.postSyncCondition; } diff --git a/FreeFileSync/Source/synchronization.cpp b/FreeFileSync/Source/synchronization.cpp index b7a51fe5..a4d064d7 100755 --- a/FreeFileSync/Source/synchronization.cpp +++ b/FreeFileSync/Source/synchronization.cpp @@ -248,15 +248,15 @@ void SyncStatistics::processFolder(const FolderPair& folder) std::vector fff::extractSyncCfg(const MainConfiguration& mainCfg) { //merge first and additional pairs - std::vector allPairs = { mainCfg.firstPair }; - append(allPairs, mainCfg.additionalPairs); + std::vector localCfgs = { mainCfg.firstPair }; + append(localCfgs, mainCfg.additionalPairs); std::vector output; //process all pairs - for (const FolderPairEnh& fp : allPairs) + for (const LocalPairConfig& lpc : localCfgs) { - SyncConfig syncCfg = fp.altSyncConfig.get() ? *fp.altSyncConfig : mainCfg.syncCfg; + SyncConfig syncCfg = lpc.localSyncCfg ? *lpc.localSyncCfg : mainCfg.syncCfg; output.push_back( FolderPairSyncCfg(syncCfg.directionCfg.var == DirectionConfig::TWO_WAY || detectMovedFilesEnabled(syncCfg.directionCfg), diff --git a/FreeFileSync/Source/ui/batch_config.cpp b/FreeFileSync/Source/ui/batch_config.cpp index 0e4ff689..fe647828 100755 --- a/FreeFileSync/Source/ui/batch_config.cpp +++ b/FreeFileSync/Source/ui/batch_config.cpp @@ -75,9 +75,12 @@ BatchDialog::BatchDialog(wxWindow* parent, BatchDialogConfig& dlgCfg) : { setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonSaveAs).setCancel(m_buttonCancel)); - m_staticTextDescr->SetLabel(replaceCpy(m_staticTextDescr->GetLabel(), L"%x", L"FreeFileSync.exe <" + _("job name") + L">.ffs_batch")); + m_staticTextHeader->SetLabel(replaceCpy(m_staticTextHeader->GetLabel(), L"%x", L"FreeFileSync.exe <" + _("job name") + L">.ffs_batch")); + m_staticTextHeader->Wrap(fastFromDIP(520)); - m_bitmapBatchJob->SetBitmap(getResourceImage(L"batch")); + m_spinCtrlLogfileLimit->SetMinSize(wxSize(fastFromDIP(70), -1)); //Hack: set size (why does wxWindow::Size() not work?) + + m_bitmapBatchJob->SetBitmap(getResourceImage(L"file_batch")); logfileDir_ = std::make_unique(*m_panelLogfile, *m_buttonSelectLogFolder, *m_bpButtonSelectAltLogFolder, *m_logFolderPath, nullptr /*staticText*/, nullptr /*wxWindow*/); @@ -90,7 +93,7 @@ BatchDialog::BatchDialog(wxWindow* parent, BatchDialogConfig& dlgCfg) : setConfig(dlgCfg); - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(BatchDialog::onLocalKeyEvent), nullptr, this); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() @@ -105,7 +108,7 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes { const BatchDialogConfig dlgCfg = getConfig(); //resolve parameter ownership: some on GUI controls, others member variables - m_bitmapIgnoreErrors->SetBitmap(getResourceImage(dlgCfg.ignoreErrors ? L"msg_error_medium_ignored" : L"msg_error_medium")); + m_bitmapIgnoreErrors->SetBitmap(dlgCfg.ignoreErrors ? getResourceImage(L"error_ignore_active") : greyScale(getResourceImage(L"error_ignore_inactive"))); m_radioBtnErrorDialogShow ->Enable(!dlgCfg.ignoreErrors); m_radioBtnErrorDialogCancel->Enable(!dlgCfg.ignoreErrors); diff --git a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp index be007e09..6d49ac08 100755 --- a/FreeFileSync/Source/ui/batch_status_handler.cpp +++ b/FreeFileSync/Source/ui/batch_status_handler.cpp @@ -166,7 +166,7 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, automaticRetryCount_(automaticRetryCount), automaticRetryDelay_(automaticRetryDelay), progressDlg_(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, nullptr /*parentWindow*/, showProgress, autoCloseDialog, -jobName, soundFileSyncComplete, ignoreErrors, [&] +jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, [&] { switch (postSyncAction) { @@ -235,7 +235,7 @@ BatchStatusHandler::~BatchStatusHandler() getBytesTotal(PHASE_SYNCHRONIZING) == 0) finalStatusMsg = _("Nothing to synchronize"); //even if "ignored conflicts" occurred! else - finalStatusMsg = _("Completed"); + finalStatusMsg = _("Completed successfully"); errorLog_.logMsg(finalStatusMsg, MSG_TYPE_INFO); } diff --git a/FreeFileSync/Source/ui/cfg_grid.cpp b/FreeFileSync/Source/ui/cfg_grid.cpp index 775a3f16..f6af408f 100755 --- a/FreeFileSync/Source/ui/cfg_grid.cpp +++ b/FreeFileSync/Source/ui/cfg_grid.cpp @@ -236,8 +236,8 @@ private: switch (static_cast(colType)) { case ColumnTypeCfg::NAME: - rectTmp.x += COLUMN_GAP_LEFT; - rectTmp.width -= COLUMN_GAP_LEFT; + rectTmp.x += getColumnGapLeft(); + rectTmp.width -= getColumnGapLeft(); switch (item->cfgType) { @@ -250,8 +250,8 @@ private: drawBitmapRtlNoMirror(dc, enabled ? batchIconSmall_ : batchIconSmall_.ConvertToDisabled(), rectTmp, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); break; } - rectTmp.x += fileIconSize_ + COLUMN_GAP_LEFT; - rectTmp.width -= fileIconSize_ + COLUMN_GAP_LEFT; + rectTmp.x += fileIconSize_ + getColumnGapLeft(); + rectTmp.width -= fileIconSize_ + getColumnGapLeft(); drawCellText(dc, rectTmp, getValue(row, colType)); break; @@ -276,10 +276,10 @@ private: switch (static_cast(colType)) { case ColumnTypeCfg::NAME: - return COLUMN_GAP_LEFT + fileIconSize_ + COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth() + COLUMN_GAP_LEFT; + return getColumnGapLeft() + fileIconSize_ + getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth() + getColumnGapLeft(); case ColumnTypeCfg::LAST_SYNC: - return COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth() + COLUMN_GAP_LEFT; + return getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth() + getColumnGapLeft(); } return 0; } @@ -297,14 +297,14 @@ private: wxRect rectInside = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectInside, highlighted); - rectInside.x += COLUMN_GAP_LEFT; - rectInside.width -= COLUMN_GAP_LEFT; + rectInside.x += getColumnGapLeft(); + rectInside.width -= getColumnGapLeft(); drawColumnLabelText(dc, rectInside, getColumnLabel(colType)); auto sortInfo = cfgView_.getSortDirection(); if (colType == static_cast(sortInfo.first)) { - const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sortAscending" : L"sortDescending"); + const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sort_ascending" : L"sort_descending"); drawBitmapRtlNoMirror(dc, marker, rectInside, wxALIGN_CENTER_HORIZONTAL); } } @@ -325,23 +325,27 @@ private: ConfigView cfgView_; int syncOverdueDays_ = 0; const int fileIconSize_; - const wxBitmap syncIconSmall_ = getResourceImage(L"sync" ).ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR); //looks sharper than wxIMAGE_QUALITY_HIGH! - const wxBitmap batchIconSmall_ = getResourceImage(L"batch").ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR); + const wxBitmap syncIconSmall_ = getResourceImage(L"file_sync" ).ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR); //looks sharper than wxIMAGE_QUALITY_HIGH! + const wxBitmap batchIconSmall_ = getResourceImage(L"file_batch").ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR); }; } void cfggrid::init(Grid& grid) { - const int rowHeight = GridDataCfg::getRowDefaultHeight(grid); + const int rowHeight = GridDataCfg::getRowDefaultHeight(grid); - auto prov = std::make_shared(rowHeight /*fileIconSize*/); + int fileIconSize = rowHeight - fastFromDIP(2); /*border*/ + if (fileIconSize < 16) //no border for very small icons + fileIconSize = rowHeight; + + auto prov = std::make_shared(fileIconSize); grid.setDataProvider(prov); grid.showRowLabel(false); grid.setRowHeight(rowHeight); - grid.setColumnLabelHeight(rowHeight + 2); + grid.setColumnLabelHeight(rowHeight + fastFromDIP(2)); } diff --git a/FreeFileSync/Source/ui/cfg_grid.h b/FreeFileSync/Source/ui/cfg_grid.h index 7633d3c2..d0d02442 100755 --- a/FreeFileSync/Source/ui/cfg_grid.h +++ b/FreeFileSync/Source/ui/cfg_grid.h @@ -9,6 +9,7 @@ #include #include +#include namespace fff @@ -31,10 +32,11 @@ struct ColAttributesCfg inline std::vector getCfgGridDefaultColAttribs() { + using namespace zen; return { - { ColumnTypeCfg::NAME, -75, 1, true }, - { ColumnTypeCfg::LAST_SYNC, 75, 0, true }, + { ColumnTypeCfg::NAME, fastFromDIP(-75), 1, true }, + { ColumnTypeCfg::LAST_SYNC, fastFromDIP( 75), 0, true }, }; } diff --git a/FreeFileSync/Source/ui/command_box.cpp b/FreeFileSync/Source/ui/command_box.cpp index 3468415a..81a0aa6f 100755 --- a/FreeFileSync/Source/ui/command_box.cpp +++ b/FreeFileSync/Source/ui/command_box.cpp @@ -10,6 +10,7 @@ #include #include #include +#include using namespace zen; using namespace fff; @@ -48,7 +49,7 @@ CommandBox::CommandBox(wxWindow* parent, defaultCommands_(getDefaultCommands()) { //#################################### - /*#*/ SetMinSize(wxSize(150, -1)); //# workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox + /*#*/ SetMinSize(wxSize(fastFromDIP(150), -1)); //# workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox //#################################### Connect(wxEVT_KEY_DOWN, wxKeyEventHandler (CommandBox::OnKeyEvent ), nullptr, this); diff --git a/FreeFileSync/Source/ui/file_grid.cpp b/FreeFileSync/Source/ui/file_grid.cpp index 7e704ba1..7ff66729 100755 --- a/FreeFileSync/Source/ui/file_grid.cpp +++ b/FreeFileSync/Source/ui/file_grid.cpp @@ -42,6 +42,7 @@ inline wxColor getColorNotActive() { return { 228, 228, 228 }; } //light grey inline wxColor getColorGridLine () { return { 192, 192, 192 }; } //light grey const size_t ROW_COUNT_IF_NO_DATA = 0; +const int FILE_GRID_GAP_SIZE_DIP = 2; /* class hierarchy: @@ -197,7 +198,7 @@ public: void setIconManager(const std::shared_ptr& iconMgr) { iconMgr_ = iconMgr; } - void setItemPathForm(ItemPathFormat fmt) { itemPathFormat = fmt; } + void setItemPathForm(ItemPathFormat fmt) { itemPathFormat_ = fmt; } void getUnbufferedIconsForPreload(std::vector>& newLoad) //return (priority, filepath) list { @@ -256,15 +257,15 @@ public: } private: - bool isFailedLoad(size_t row) const { return row < failedLoads.size() ? failedLoads[row] != 0 : false; } + bool isFailedLoad(size_t row) const { return row < failedLoads_.size() ? failedLoads_[row] != 0 : false; } void setFailedLoad(size_t row, bool failed = true) { - if (failedLoads.size() != refGrid().getRowCount()) - failedLoads.resize(refGrid().getRowCount()); + if (failedLoads_.size() != refGrid().getRowCount()) + failedLoads_.resize(refGrid().getRowCount()); - if (row < failedLoads.size()) - failedLoads[row] = failed; + if (row < failedLoads_.size()) + failedLoads_[row] = failed; } //icon buffer will load reversely, i.e. if we want to go from inside out, we need to start from outside in @@ -280,7 +281,7 @@ protected: if (enabled) { if (selected) - dc.GradientFillLinear(rect, Grid::getColorSelectionGradientFrom(), Grid::getColorSelectionGradientTo(), wxEAST); + dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST); //ignore focus else { @@ -371,7 +372,7 @@ private: switch (colTypeRim) { case ColumnTypeRim::ITEM_PATH: - switch (itemPathFormat) + switch (itemPathFormat_) { case ItemPathFormat::FULL_PATH: return AFS::getDisplayPath(folder.getAbstractPath()); @@ -403,7 +404,7 @@ private: switch (colTypeRim) { case ColumnTypeRim::ITEM_PATH: - switch (itemPathFormat) + switch (itemPathFormat_) { case ItemPathFormat::FULL_PATH: return AFS::getDisplayPath(file.getAbstractPath()); @@ -436,7 +437,7 @@ private: switch (colTypeRim) { case ColumnTypeRim::ITEM_PATH: - switch (itemPathFormat) + switch (itemPathFormat_) { case ItemPathFormat::FULL_PATH: return AFS::getDisplayPath(symlink.getAbstractPath()); @@ -463,8 +464,6 @@ private: return std::wstring(); } - static const int GAP_SIZE = 2; - void renderCell(wxDC& dc, const wxRect& rect, size_t row, ColumnType colType, bool enabled, bool selected, HoverArea rowHover) override { //don't forget to harmonize with getBestSize()!!! @@ -486,8 +485,8 @@ private: auto drawTextBlock = [&](const std::wstring& text) { - rectTmp.x += GAP_SIZE; - rectTmp.width -= GAP_SIZE; + rectTmp.x += gridGap_; + rectTmp.width -= gridGap_; const wxSize extent = drawCellText(dc, rectTmp, text, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); rectTmp.x += extent.GetWidth(); rectTmp.width -= extent.GetWidth(); @@ -524,8 +523,8 @@ private: drawTextBlock(pathPrefix); //draw file icon - rectTmp.x += GAP_SIZE; - rectTmp.width -= GAP_SIZE; + rectTmp.x += gridGap_; + rectTmp.width -= gridGap_; const int iconSize = iconMgr_->refIconBuffer().getSize(); if (rectTmp.GetWidth() >= iconSize) @@ -592,7 +591,7 @@ private: case ColumnTypeRim::SIZE: if (refGrid().GetLayoutDirection() != wxLayout_RightToLeft) { - rectTmp.width -= GAP_SIZE; //have file size right-justified (but don't change for RTL languages) + rectTmp.width -= gridGap_; //have file size right-justified (but don't change for RTL languages) drawCellText(dc, rectTmp, cellValue, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); } else @@ -632,14 +631,14 @@ private: int bestSize = 0; if (!pathPrefix.empty()) - bestSize += GAP_SIZE + dc.GetTextExtent(pathPrefix).GetWidth(); + bestSize += gridGap_ + dc.GetTextExtent(pathPrefix).GetWidth(); - bestSize += GAP_SIZE + iconMgr_->refIconBuffer().getSize(); - bestSize += GAP_SIZE + dc.GetTextExtent(itemName).GetWidth() + GAP_SIZE; + bestSize += gridGap_ + iconMgr_->refIconBuffer().getSize(); + bestSize += gridGap_ + dc.GetTextExtent(itemName).GetWidth() + gridGap_; return bestSize; } else - return GAP_SIZE + dc.GetTextExtent(cellValue).GetWidth() + GAP_SIZE; + return gridGap_ + dc.GetTextExtent(cellValue).GetWidth() + gridGap_; // + 1 pix for cell border line ? -> not used anymore! } @@ -648,7 +647,7 @@ private: switch (static_cast(colType)) { case ColumnTypeRim::ITEM_PATH: - switch (itemPathFormat) + switch (itemPathFormat_) { case ItemPathFormat::FULL_PATH: return _("Full path"); @@ -675,8 +674,8 @@ private: wxRect rectInside = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectInside, highlighted); - rectInside.x += COLUMN_GAP_LEFT; - rectInside.width -= COLUMN_GAP_LEFT; + rectInside.x += getColumnGapLeft(); + rectInside.width -= getColumnGapLeft(); drawColumnLabelText(dc, rectInside, getColumnLabel(colType)); //draw sort marker @@ -687,7 +686,7 @@ private: { if (colType == static_cast(sortInfo->type) && (side == LEFT_SIDE) == sortInfo->onLeft) { - const wxBitmap& marker = getResourceImage(sortInfo->ascending ? L"sortAscending" : L"sortDescending"); + const wxBitmap& marker = getResourceImage(sortInfo->ascending ? L"sort_ascending" : L"sort_descending"); drawBitmapRtlNoMirror(dc, marker, rectInside, wxALIGN_CENTER_HORIZONTAL); } } @@ -765,11 +764,13 @@ private: return toolTip; } + const int gridGap_ = fastFromDIP(FILE_GRID_GAP_SIZE_DIP); + std::shared_ptr iconMgr_; //optional - ItemPathFormat itemPathFormat = ItemPathFormat::FULL_PATH; + ItemPathFormat itemPathFormat_ = ItemPathFormat::FULL_PATH; - std::vector failedLoads; //effectively a vector of size "number of rows" - Opt renderBuf; //avoid costs of recreating this temporary variable + std::vector failedLoads_; //effectively a vector of size "number of rows" + Opt renderBuf_; //avoid costs of recreating this temporary variable }; @@ -826,7 +827,7 @@ private: { wxRect rectTmp = rect; rectTmp.width /= 20; - dc.GradientFillLinear(rectTmp, Grid::getColorSelectionGradientFrom(), GridDataRim::getBackGroundColor(row), wxEAST); + dc.GradientFillLinear(rectTmp, getColorSelectionGradientFrom(), GridDataRim::getBackGroundColor(row), wxEAST); } } } @@ -956,7 +957,7 @@ private: if (enabled) { if (selected) - dc.GradientFillLinear(rect, Grid::getColorSelectionGradientFrom(), Grid::getColorSelectionGradientTo(), wxEAST); + dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST); else { if (const FileSystemObject* fsObj = getRawData(row)) @@ -1111,7 +1112,7 @@ private: wxRect rectInside = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectInside, highlighted); - const wxBitmap& cmpIcon = getResourceImage(L"compare_small"); + const wxBitmap& cmpIcon = getResourceImage(L"compare_sicon"); drawBitmapRtlNoMirror(dc, highlightSyncAction_ ? greyScale(cmpIcon) : cmpIcon, rectInside, wxALIGN_CENTER); } break; @@ -1121,7 +1122,7 @@ private: wxRect rectInside = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectInside, highlighted); - const wxBitmap& syncIcon = getResourceImage(L"sync_small"); + const wxBitmap& syncIcon = getResourceImage(L"file_sync_sicon"); drawBitmapRtlNoMirror(dc, highlightSyncAction_ ? syncIcon : greyScale(syncIcon), rectInside, wxALIGN_CENTER); } break; @@ -1590,9 +1591,9 @@ void filegrid::init(Grid& gridLeft, Grid& gridCenter, Grid& gridRight) //gridLeft .showScrollBars(Grid::SB_SHOW_AUTOMATIC, Grid::SB_SHOW_NEVER); -> redundant: configuration happens in GridEventManager::onAlignScrollBars() //gridCenter.showScrollBars(Grid::SB_SHOW_NEVER, Grid::SB_SHOW_NEVER); - const int widthCheckbox = getResourceImage(L"checkbox_true").GetWidth() + 4 + getResourceImage(L"notch").GetWidth(); - const int widthCategory = 30; - const int widthAction = 45; + const int widthCheckbox = getResourceImage(L"checkbox_true").GetWidth() + fastFromDIP(3); + const int widthCategory = 2 * getResourceImage(L"cat_left_only_small").GetWidth() + getResourceImage(L"notch").GetWidth(); + const int widthAction = 3 * getResourceImage(L"so_create_left_sicon").GetWidth(); gridCenter.SetSize(widthCategory + widthCheckbox + widthAction, -1); gridCenter.setColumnConfig( @@ -1688,7 +1689,7 @@ void filegrid::setupIcons(Grid& gridLeft, Grid& gridCenter, Grid& gridRight, boo iconHeight = IconBuffer::getSize(IconBuffer::SIZE_SMALL); } - const int newRowHeight = std::max(iconHeight, gridLeft.getMainWin().GetCharHeight()) + 1; //add some space + const int newRowHeight = std::max(iconHeight, gridLeft.getMainWin().GetCharHeight()) + fastFromDIP(1); //add some space gridLeft .setRowHeight(newRowHeight); gridCenter.setRowHeight(newRowHeight); @@ -1758,31 +1759,31 @@ wxBitmap fff::getSyncOpImage(SyncOperation syncOp) switch (syncOp) //evaluate comparison result and sync direction { case SO_CREATE_NEW_LEFT: - return getResourceImage(L"so_create_left_small"); + return getResourceImage(L"so_create_left_sicon"); case SO_CREATE_NEW_RIGHT: - return getResourceImage(L"so_create_right_small"); + return getResourceImage(L"so_create_right_sicon"); case SO_DELETE_LEFT: - return getResourceImage(L"so_delete_left_small"); + return getResourceImage(L"so_delete_left_sicon"); case SO_DELETE_RIGHT: - return getResourceImage(L"so_delete_right_small"); + return getResourceImage(L"so_delete_right_sicon"); case SO_MOVE_LEFT_FROM: - return getResourceImage(L"so_move_left_source_small"); + return getResourceImage(L"so_move_left_source_sicon"); case SO_MOVE_LEFT_TO: - return getResourceImage(L"so_move_left_target_small"); + return getResourceImage(L"so_move_left_target_sicon"); case SO_MOVE_RIGHT_FROM: - return getResourceImage(L"so_move_right_source_small"); + return getResourceImage(L"so_move_right_source_sicon"); case SO_MOVE_RIGHT_TO: - return getResourceImage(L"so_move_right_target_small"); + return getResourceImage(L"so_move_right_target_sicon"); case SO_OVERWRITE_LEFT: - return getResourceImage(L"so_update_left_small"); + return getResourceImage(L"so_update_left_sicon"); case SO_OVERWRITE_RIGHT: - return getResourceImage(L"so_update_right_small"); + return getResourceImage(L"so_update_right_sicon"); case SO_COPY_METADATA_TO_LEFT: - return getResourceImage(L"so_move_left_small"); + return getResourceImage(L"so_move_left_sicon"); case SO_COPY_METADATA_TO_RIGHT: - return getResourceImage(L"so_move_right_small"); + return getResourceImage(L"so_move_right_sicon"); case SO_DO_NOTHING: - return getResourceImage(L"so_none_small"); + return getResourceImage(L"so_none_sicon"); case SO_EQUAL: return getResourceImage(L"cat_equal_small"); case SO_UNRESOLVED_CONFLICT: diff --git a/FreeFileSync/Source/ui/file_grid_attr.h b/FreeFileSync/Source/ui/file_grid_attr.h index ea3c6303..ea5f1b54 100755 --- a/FreeFileSync/Source/ui/file_grid_attr.h +++ b/FreeFileSync/Source/ui/file_grid_attr.h @@ -9,6 +9,7 @@ #include #include +#include namespace fff @@ -32,12 +33,13 @@ struct ColAttributesRim inline std::vector getFileGridDefaultColAttribsLeft() { + using namespace zen; return //harmonize with main_dlg.cpp::onGridLabelContextRim() => expects stretched ITEM_PATH and non-stretched other columns! { - { ColumnTypeRim::ITEM_PATH, -100, 1, true }, - { ColumnTypeRim::EXTENSION, 60, 0, false }, - { ColumnTypeRim::DATE, 140, 0, false }, - { ColumnTypeRim::SIZE, 100, 0, true }, + { ColumnTypeRim::ITEM_PATH, fastFromDIP(-100), 1, true }, + { ColumnTypeRim::EXTENSION, fastFromDIP( 60), 0, false }, + { ColumnTypeRim::DATE, fastFromDIP( 140), 0, false }, + { ColumnTypeRim::SIZE, fastFromDIP( 100), 0, true }, }; } diff --git a/FreeFileSync/Source/ui/file_view.cpp b/FreeFileSync/Source/ui/file_view.cpp index c68357b0..19a77f8c 100755 --- a/FreeFileSync/Source/ui/file_view.cpp +++ b/FreeFileSync/Source/ui/file_view.cpp @@ -64,7 +64,7 @@ void FileView::updateView(Predicate pred) if (pred(*fsObj)) { //save row position for direct random access to FilePair or FolderPair - this->rowPositions_.emplace(ref.objId, viewRef_.size()); //costs: 0.28 s per call - MSVC based on std::set + this->rowPositions_.emplace(ref.objId, viewRef_.size()); //costs: 0.28 µs per call - MSVC based on std::set //"this->" required by two-pass lookup as enforced by GCC 4.7 //save row position to identify first child *on sorted subview* of FolderPair or BaseFolderPair in case latter are filtered out diff --git a/FreeFileSync/Source/ui/folder_history_box.cpp b/FreeFileSync/Source/ui/folder_history_box.cpp index fc4902d9..57a2a5fd 100755 --- a/FreeFileSync/Source/ui/folder_history_box.cpp +++ b/FreeFileSync/Source/ui/folder_history_box.cpp @@ -7,6 +7,7 @@ #include "folder_history_box.h" #include #include +#include #include "../lib/resolve_path.h" #include @@ -27,7 +28,7 @@ FolderHistoryBox::FolderHistoryBox(wxWindow* parent, wxComboBox(parent, id, value, pos, size, n, choices, style, validator, name) { //##################################### - /*##*/ SetMinSize(wxSize(150, -1)); //## workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox + /*##*/ SetMinSize(wxSize(fastFromDIP(150), -1)); //## workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox //##################################### Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(FolderHistoryBox::OnKeyEvent), nullptr, this); diff --git a/FreeFileSync/Source/ui/folder_pair.h b/FreeFileSync/Source/ui/folder_pair.h index 5b71c09a..640907fa 100755 --- a/FreeFileSync/Source/ui/folder_pair.h +++ b/FreeFileSync/Source/ui/folder_pair.h @@ -28,29 +28,26 @@ template class FolderPairPanelBasic : private wxEvtHandler { public: - using AltCompCfgPtr = std::shared_ptr; - using AltSyncCfgPtr = std::shared_ptr; - - void setConfig(AltCompCfgPtr compConfig, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setConfig(const zen::Opt& compConfig, const zen::Opt& syncCfg, const FilterConfig& filter) { - altCompConfig_ = compConfig; - altSyncConfig_ = syncCfg; - localFilter_ = filter; + localCmpCfg_ = compConfig; + localSyncCfg_ = syncCfg; + localFilter_ = filter; refreshButtons(); } - AltCompCfgPtr getAltCompConfig () const { return altCompConfig_; } - AltSyncCfgPtr getAltSyncConfig () const { return altSyncConfig_; } - FilterConfig getAltFilterConfig() const { return localFilter_; } + zen::Opt getCompConfig () const { return localCmpCfg_; } + zen::Opt getSyncConfig () const { return localSyncCfg_; } + FilterConfig getFilterConfig() const { return localFilter_; } FolderPairPanelBasic(GuiPanel& basicPanel) : //takes reference on basic panel to be enhanced basicPanel_(basicPanel) { //register events for removal of alternate configuration - basicPanel_.m_bpButtonAltCompCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltCompCfgContext ), nullptr, this); - basicPanel_.m_bpButtonAltSyncCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfgContext ), nullptr, this); - basicPanel_.m_bpButtonLocalFilter->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgContext), nullptr, this); + basicPanel_.m_bpButtonLocalCompCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalCompCfgContext ), nullptr, this); + basicPanel_.m_bpButtonLocalSyncCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalSyncCfgContext ), nullptr, this); + basicPanel_.m_bpButtonLocalFilter ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgContext), nullptr, this); basicPanel_.m_bpButtonRemovePair->SetBitmapLabel(zen::getResourceImage(L"item_remove")); } @@ -60,65 +57,65 @@ private: { using namespace zen; - if (altCompConfig_.get()) + if (localCmpCfg_) { - setImage(*basicPanel_.m_bpButtonAltCompCfg, getResourceImage(L"cfg_compare_small")); - basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Local comparison settings") + L" (" + getVariantName(altCompConfig_->compareVar) + L")"); + setImage(*basicPanel_.m_bpButtonLocalCompCfg, getResourceImage(L"cfg_compare_small")); + basicPanel_.m_bpButtonLocalCompCfg->SetToolTip(_("Local comparison settings") + L" (" + getVariantName(localCmpCfg_->compareVar) + L")"); } else { - setImage(*basicPanel_.m_bpButtonAltCompCfg, greyScale(getResourceImage(L"cfg_compare_small"))); - basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Local comparison settings")); + setImage(*basicPanel_.m_bpButtonLocalCompCfg, greyScale(getResourceImage(L"cfg_compare_small"))); + basicPanel_.m_bpButtonLocalCompCfg->SetToolTip(_("Local comparison settings")); } - if (altSyncConfig_.get()) + if (localSyncCfg_) { - setImage(*basicPanel_.m_bpButtonAltSyncCfg, getResourceImage(L"cfg_sync_small")); - basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Local synchronization settings") + L" (" + getVariantName(altSyncConfig_->directionCfg.var) + L")"); + setImage(*basicPanel_.m_bpButtonLocalSyncCfg, getResourceImage(L"cfg_sync_small")); + basicPanel_.m_bpButtonLocalSyncCfg->SetToolTip(_("Local synchronization settings") + L" (" + getVariantName(localSyncCfg_->directionCfg.var) + L")"); } else { - setImage(*basicPanel_.m_bpButtonAltSyncCfg, greyScale(getResourceImage(L"cfg_sync_small"))); - basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Local synchronization settings")); + setImage(*basicPanel_.m_bpButtonLocalSyncCfg, greyScale(getResourceImage(L"cfg_sync_small"))); + basicPanel_.m_bpButtonLocalSyncCfg->SetToolTip(_("Local synchronization settings")); } if (!isNullFilter(localFilter_)) { - setImage(*basicPanel_.m_bpButtonLocalFilter, getResourceImage(L"filter_small")); + setImage(*basicPanel_.m_bpButtonLocalFilter, getResourceImage(L"cfg_filter_small")); basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Local filter") + L" (" + _("Active") + L")"); } else { - setImage(*basicPanel_.m_bpButtonLocalFilter, greyScale(getResourceImage(L"filter_small"))); + setImage(*basicPanel_.m_bpButtonLocalFilter, greyScale(getResourceImage(L"cfg_filter_small"))); basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Local filter") + L" (" + _("None") + L")"); } } - void OnAltCompCfgContext(wxCommandEvent& event) + void OnLocalCompCfgContext(wxCommandEvent& event) { - auto removeAltCompCfg = [&] + auto removeLocalCompCfg = [&] { - this->altCompConfig_.reset(); //"this->" galore: workaround GCC compiler bugs + this->localCmpCfg_ = zen::NoValue(); //"this->" galore: workaround GCC compiler bugs this->refreshButtons(); - this->onAltCompCfgChange(); + this->onLocalCompCfgChange(); }; zen::ContextMenu menu; - menu.addItem(_("Remove local settings"), removeAltCompCfg, nullptr, altCompConfig_.get() != nullptr); + menu.addItem(_("Remove local settings"), removeLocalCompCfg, nullptr, static_cast(localCmpCfg_)); menu.popup(basicPanel_); } - void OnAltSyncCfgContext(wxCommandEvent& event) + void OnLocalSyncCfgContext(wxCommandEvent& event) { - auto removeAltSyncCfg = [&] + auto removeLocalSyncCfg = [&] { - this->altSyncConfig_.reset(); + this->localSyncCfg_ = zen::NoValue(); this->refreshButtons(); - this->onAltSyncCfgChange(); + this->onLocalSyncCfgChange(); }; zen::ContextMenu menu; - menu.addItem(_("Remove local settings"), removeAltSyncCfg, nullptr, altSyncConfig_.get() != nullptr); + menu.addItem(_("Remove local settings"), removeLocalSyncCfg, nullptr, static_cast(localSyncCfg_)); menu.popup(basicPanel_); } @@ -157,16 +154,16 @@ private: virtual wxWindow* getParentWindow() = 0; virtual std::unique_ptr& getFilterCfgOnClipboardRef() = 0; - virtual void onAltCompCfgChange() = 0; - virtual void onAltSyncCfgChange() = 0; + virtual void onLocalCompCfgChange () = 0; + virtual void onLocalSyncCfgChange () = 0; virtual void onLocalFilterCfgChange() = 0; GuiPanel& basicPanel_; //panel to be enhanced by this template //alternate configuration attached to it - AltCompCfgPtr altCompConfig_; //optional - AltSyncCfgPtr altSyncConfig_; // - FilterConfig localFilter_; + zen::Opt localCmpCfg_; + zen::Opt localSyncCfg_; + FilterConfig localFilter_; }; } diff --git a/FreeFileSync/Source/ui/folder_selector.cpp b/FreeFileSync/Source/ui/folder_selector.cpp index eed43dc6..ac501107 100755 --- a/FreeFileSync/Source/ui/folder_selector.cpp +++ b/FreeFileSync/Source/ui/folder_selector.cpp @@ -27,6 +27,9 @@ using namespace fff; namespace { +const std::chrono::milliseconds FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX(200); + + void setFolderPathPhrase(const Zstring& folderPathPhrase, FolderHistoryBox* comboBox, wxWindow& tooltipWnd, wxStaticText* staticText) //pointers are optional { if (comboBox) @@ -104,7 +107,7 @@ FolderSelector::~FolderSelector() void FolderSelector::onMouseWheel(wxMouseEvent& event) { - //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. explorer + //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. Explorer //additionally this will delete manual entries, although all the users wanted is scroll the parent window! //redirect to parent scrolled window! @@ -181,7 +184,7 @@ void FolderSelector::onSelectFolder(wxCommandEvent& event) } catch (FileError&) { return false; } }); - return ft.wait_for(std::chrono::milliseconds(200)) == std::future_status::ready && ft.get(); //potentially slow network access: wait 200ms at most + return ft.wait_for(FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX) == std::future_status::ready && ft.get(); //potentially slow network access: wait 200ms at most }; const Zstring folderPathPhrase = getPath(); diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp index 747095d1..47843381 100755 --- a/FreeFileSync/Source/ui/gui_generated.cpp +++ b/FreeFileSync/Source/ui/gui_generated.cpp @@ -5,14 +5,6 @@ // PLEASE DO *NOT* EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// -#include "command_box.h" -#include "folder_history_box.h" -#include "triple_splitter.h" -#include "wx+/bitmap_button.h" -#include "wx+/graph.h" -#include "wx+/grid.h" -#include "wx+/toggle_button.h" - #include "gui_generated.h" /////////////////////////////////////////////////////////////////////////// @@ -167,7 +159,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer198->Add( m_bpButtonCmpConfig, 1, wxEXPAND, 5 ); - m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 17, -1 ), wxBU_AUTODRAW ); + m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonCmpContext->SetToolTip( _("dummy") ); bSizer198->Add( m_bpButtonCmpContext, 0, wxEXPAND, 5 ); @@ -184,10 +176,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer199; bSizer199 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 60, -1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + m_bpButtonFilter->SetToolTip( _("dummy") ); + bSizer199->Add( m_bpButtonFilter, 1, wxEXPAND, 5 ); - m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 17, -1 ), wxBU_AUTODRAW ); + m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonFilterContext->SetToolTip( _("dummy") ); bSizer199->Add( m_bpButtonFilterContext, 0, wxEXPAND, 5 ); @@ -209,7 +203,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer200->Add( m_bpButtonSyncConfig, 1, wxEXPAND, 5 ); - m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 17, -1 ), wxBU_AUTODRAW ); + m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSyncContext->SetToolTip( _("dummy") ); bSizer200->Add( m_bpButtonSyncContext, 0, wxEXPAND, 5 ); @@ -264,18 +258,18 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer159; bSizer159 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); + m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer159->Add( m_bpButtonAddPair, 0, wxEXPAND, 5 ); - m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer159->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 ); - fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer8->Add( bSizer159, 0, wxEXPAND, 5 ); wxBoxSizer* bSizer182; bSizer182 = new wxBoxSizer( wxHORIZONTAL ); @@ -286,9 +280,9 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_buttonSelectFolderLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") ); - bSizer182->Add( m_buttonSelectFolderLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer182->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW ); + m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") ); bSizer182->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 ); @@ -300,15 +294,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_panelTopLeft->SetSizer( fgSizer8 ); m_panelTopLeft->Layout(); fgSizer8->Fit( m_panelTopLeft ); - bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_BOTTOM, 5 ); m_panelTopCenter = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* bSizer1771; bSizer1771 = new wxBoxSizer( wxVERTICAL ); - - bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 ); - m_bpButtonSwapSides = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSwapSides->SetToolTip( _("Swap sides") ); @@ -317,26 +308,29 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer160; bSizer160 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonLocalCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonLocalCompCfg->SetToolTip( _("dummy") ); + + bSizer160->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 ); - m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonLocalFilter->SetToolTip( _("dummy") ); - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer160->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 ); + m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") ); - bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer160->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 ); - bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer1771->Add( bSizer160, 1, wxALIGN_CENTER_HORIZONTAL, 5 ); m_panelTopCenter->SetSizer( bSizer1771 ); m_panelTopCenter->Layout(); bSizer1771->Fit( m_panelTopCenter ); - bSizer91->Add( m_panelTopCenter, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + bSizer91->Add( m_panelTopCenter, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_panelTopRight->SetMinSize( wxSize( 1, -1 ) ); @@ -357,9 +351,9 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_buttonSelectFolderRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonSelectFolderRight->SetToolTip( _("Select a folder") ); - bSizer179->Add( m_buttonSelectFolderRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer179->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW ); + m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") ); bSizer179->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 ); @@ -371,7 +365,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_panelTopRight->SetSizer( bSizer183 ); m_panelTopRight->Layout(); bSizer183->Fit( m_panelTopRight ); - bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer91->Add( m_panelTopRight, 1, wxRIGHT|wxALIGN_BOTTOM, 5 ); bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 ); @@ -586,16 +580,16 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer1713; bSizer1713 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); + m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonHideSearch->SetToolTip( _("Close search bar") ); - bSizer1713->Add( m_bpButtonHideSearch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer1713->Add( m_bpButtonHideSearch, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); m_staticText101 = new wxStaticText( m_panelSearch, wxID_ANY, _("Find:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText101->Wrap( -1 ); bSizer1713->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220, -1 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS ); + m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS ); bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -615,7 +609,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer17611; bSizer17611 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonNew->SetToolTip( _("dummy") ); bSizer17611->Add( m_bpButtonNew, 0, wxEXPAND, 5 ); @@ -630,7 +624,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer1761; bSizer1761 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonOpen->SetToolTip( _("dummy") ); bSizer1761->Add( m_bpButtonOpen, 0, wxEXPAND, 5 ); @@ -645,7 +639,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer175; bSizer175 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSave->SetToolTip( _("dummy") ); bSizer175->Add( m_bpButtonSave, 0, wxEXPAND, 5 ); @@ -663,12 +657,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer1772; bSizer1772 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSaveAs->SetToolTip( _("dummy") ); bSizer1772->Add( m_bpButtonSaveAs, 1, 0, 5 ); - m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSaveAsBatch->SetToolTip( _("dummy") ); bSizer1772->Add( m_bpButtonSaveAsBatch, 1, 0, 5 ); @@ -703,10 +697,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_staticTextViewType->Wrap( -1 ); bSizerViewFilter->Add( m_staticTextViewType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonViewTypeSyncAction = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 82, 42 ), wxBU_AUTODRAW ); + m_bpButtonViewTypeSyncAction = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowExcluded, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -716,46 +710,46 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_staticTextSelectView->Wrap( -1 ); bSizerViewFilter->Add( m_staticTextSelectView, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW ); + m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -968,6 +962,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const this->SetSizer( bSizerPanelHolder ); this->Layout(); + bSizerPanelHolder->Fit( this ); // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); @@ -1007,9 +1002,9 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopFolderPairAdd ), NULL, this ); m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopFolderPairRemove ), NULL, this ); m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); - m_bpButtonAltCompCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalCompCfg ), NULL, this ); + m_bpButtonLocalCompCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalCompCfg ), NULL, this ); m_bpButtonLocalFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalFilterCfg ), NULL, this ); - m_bpButtonAltSyncCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalSyncCfg ), NULL, this ); + m_bpButtonLocalSyncCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalSyncCfg ), NULL, this ); m_bpButtonHideSearch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideSearchPanel ), NULL, this ); m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MainDialogGenerated::OnSearchGridEnter ), NULL, this ); m_bpButtonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ), NULL, this ); @@ -1054,6 +1049,106 @@ MainDialogGenerated::~MainDialogGenerated() { } +FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) +{ + wxBoxSizer* bSizer74; + bSizer74 = new wxBoxSizer( wxHORIZONTAL ); + + m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelLeft->SetMinSize( wxSize( 1, -1 ) ); + + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") ); + + bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxEXPAND, 5 ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer134->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 ); + + m_folderPathLeft = new fff::FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer134->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectFolderLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") ); + + bSizer134->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 ); + + m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") ); + + bSizer134->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 ); + + + m_panelLeft->SetSizer( bSizer134 ); + m_panelLeft->Layout(); + bSizer134->Fit( m_panelLeft ); + bSizer74->Add( m_panelLeft, 0, wxLEFT|wxEXPAND, 5 ); + + m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonLocalCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonLocalCompCfg->SetToolTip( _("dummy") ); + + bSizer95->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 ); + + m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonLocalFilter->SetToolTip( _("dummy") ); + + bSizer95->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 ); + + m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") ); + + bSizer95->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 ); + + + m_panel20->SetSizer( bSizer95 ); + m_panel20->Layout(); + bSizer95->Fit( m_panel20 ); + bSizer74->Add( m_panel20, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelRight->SetMinSize( wxSize( 1, -1 ) ); + + wxBoxSizer* bSizer135; + bSizer135 = new wxBoxSizer( wxHORIZONTAL ); + + m_folderPathRight = new fff::FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer135->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectFolderRight->SetToolTip( _("Select a folder") ); + + bSizer135->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 ); + + m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") ); + + bSizer135->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 ); + + + m_panelRight->SetSizer( bSizer135 ); + m_panelRight->Layout(); + bSizer135->Fit( m_panelRight ); + bSizer74->Add( m_panelRight, 1, wxRIGHT|wxEXPAND, 5 ); + + + this->SetSizer( bSizer74 ); + this->Layout(); + bSizer74->Fit( this ); +} + +FolderPairPanelGenerated::~FolderPairPanelGenerated() +{ +} + ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { this->SetSizeHints( wxDefaultSize, wxDefaultSize ); @@ -1079,30 +1174,30 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer190->Add( bSizer1911, 0, wxEXPAND|wxLEFT, 5 ); m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelCompSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelCompSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelCompSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelCompSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); wxBoxSizer* bSizer275; bSizer275 = new wxBoxSizer( wxVERTICAL ); bSizerHeaderCompSettings = new wxBoxSizer( wxVERTICAL ); - m_staticTextMainCompSettings = new wxStaticText( m_panelCompSettingsHolder, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMainCompSettings = new wxStaticText( m_panelCompSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextMainCompSettings->Wrap( -1 ); bSizerHeaderCompSettings->Add( m_staticTextMainCompSettings, 0, wxALL, 10 ); - m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkBoxUseLocalCmpOptions->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); bSizerHeaderCompSettings->Add( m_checkBoxUseLocalCmpOptions, 0, wxALL|wxEXPAND, 10 ); - m_staticlineCompHeader = new wxStaticLine( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_staticlineCompHeader = new wxStaticLine( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerHeaderCompSettings->Add( m_staticlineCompHeader, 0, wxEXPAND, 5 ); bSizer275->Add( bSizerHeaderCompSettings, 0, wxEXPAND, 5 ); - m_panelComparisonSettings = new wxPanel( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelComparisonSettings = new wxPanel( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_panelComparisonSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); wxBoxSizer* bSizer159; @@ -1121,17 +1216,17 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer2381; bSizer2381 = new wxBoxSizer( wxVERTICAL ); - m_toggleBtnByTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1, 30 ), 0 ); + m_toggleBtnByTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_toggleBtnByTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); bSizer2381->Add( m_toggleBtnByTimeSize, 0, wxEXPAND|wxBOTTOM, 5 ); - m_toggleBtnByContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1, 30 ), 0 ); + m_toggleBtnByContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_toggleBtnByContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); bSizer2381->Add( m_toggleBtnByContent, 0, wxEXPAND|wxBOTTOM, 5 ); - m_toggleBtnBySize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1, 30 ), 0 ); + m_toggleBtnBySize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_toggleBtnBySize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); bSizer2381->Add( m_toggleBtnBySize, 0, wxEXPAND, 5 ); @@ -1249,33 +1344,33 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer275->Add( m_panelComparisonSettings, 0, wxEXPAND, 5 ); - m_panelCompSettingsHolder->SetSizer( bSizer275 ); - m_panelCompSettingsHolder->Layout(); - bSizer275->Fit( m_panelCompSettingsHolder ); - m_notebook->AddPage( m_panelCompSettingsHolder, _("dummy"), false ); - m_panelFilterSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelFilterSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelCompSettingsTab->SetSizer( bSizer275 ); + m_panelCompSettingsTab->Layout(); + bSizer275->Fit( m_panelCompSettingsTab ); + m_notebook->AddPage( m_panelCompSettingsTab, _("dummy"), false ); + m_panelFilterSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelFilterSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); wxBoxSizer* bSizer278; bSizer278 = new wxBoxSizer( wxVERTICAL ); bSizerHeaderFilterSettings = new wxBoxSizer( wxVERTICAL ); - m_staticTextMainFilterSettings = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMainFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextMainFilterSettings->Wrap( -1 ); bSizerHeaderFilterSettings->Add( m_staticTextMainFilterSettings, 0, wxALL, 10 ); - m_staticTextLocalFilterSettings = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLocalFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextLocalFilterSettings->Wrap( -1 ); bSizerHeaderFilterSettings->Add( m_staticTextLocalFilterSettings, 0, wxALL, 10 ); - m_staticlineFilterHeader = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_staticlineFilterHeader = new wxStaticLine( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerHeaderFilterSettings->Add( m_staticlineFilterHeader, 0, wxEXPAND, 5 ); bSizer278->Add( bSizerHeaderFilterSettings, 0, wxEXPAND, 5 ); - m_panelFilterSettings = new wxPanel( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelFilterSettings = new wxPanel( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_panelFilterSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); wxBoxSizer* bSizer1591; @@ -1290,7 +1385,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer1661; bSizer1661 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, 30 ), 0 ); + m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); wxBoxSizer* bSizer1731; @@ -1301,15 +1396,13 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer1731->Add( m_staticText78, 0, 0, 5 ); m_textCtrlInclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_MULTILINE ); - m_textCtrlInclude->SetMinSize( wxSize( 280, -1 ) ); - bSizer1731->Add( m_textCtrlInclude, 1, wxEXPAND|wxTOP, 5 ); bSizer1661->Add( bSizer1731, 1, wxEXPAND, 5 ); - bSizer166->Add( bSizer1661, 1, wxEXPAND|wxLEFT, 5 ); + bSizer166->Add( bSizer1661, 3, wxEXPAND|wxLEFT, 5 ); m_staticline22 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 ); @@ -1320,7 +1413,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer1651; bSizer1651 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, 30 ), 0 ); + m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); wxBoxSizer* bSizer1742; @@ -1349,7 +1442,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer1651->Add( bSizer1742, 1, wxEXPAND, 5 ); - bSizer166->Add( bSizer1651, 2, wxEXPAND|wxLEFT, 5 ); + bSizer166->Add( bSizer1651, 5, wxEXPAND|wxLEFT, 5 ); bSizer1591->Add( bSizer166, 1, wxEXPAND, 5 ); @@ -1363,7 +1456,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer167; bSizer167 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34, 34 ), 0 ); + m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); wxBoxSizer* bSizer165; @@ -1385,7 +1478,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer160->Add( bSizer167, 0, wxEXPAND|wxALL, 5 ); + bSizer160->Add( bSizer167, 1, wxEXPAND|wxALL, 5 ); m_staticline23 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 ); @@ -1393,7 +1486,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer168; bSizer168 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32, 32 ), 0 ); + m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); wxBoxSizer* bSizer158; @@ -1443,7 +1536,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer160->Add( bSizer168, 1, wxEXPAND|wxALL, 5 ); + bSizer160->Add( bSizer168, 0, wxEXPAND|wxALL, 5 ); bSizer1591->Add( bSizer160, 0, wxEXPAND, 5 ); @@ -1454,55 +1547,55 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer1591->Fit( m_panelFilterSettings ); bSizer278->Add( m_panelFilterSettings, 1, wxEXPAND, 5 ); - m_staticline62 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_staticline62 = new wxStaticLine( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizer278->Add( m_staticline62, 0, wxEXPAND, 5 ); wxBoxSizer* bSizer280; bSizer280 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText44 = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticText44->Wrap( 590 ); - bSizer280->Add( m_staticText44, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextFilterDescr = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_staticTextFilterDescr->Wrap( -1 ); + bSizer280->Add( m_staticTextFilterDescr, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); bSizer280->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticline46 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + m_staticline46 = new wxStaticLine( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizer280->Add( m_staticline46, 0, wxEXPAND, 5 ); - m_buttonClear = new wxButton( m_panelFilterSettingsHolder, wxID_ANY, _("C&lear"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonClear = new wxButton( m_panelFilterSettingsTab, wxID_ANY, _("C&lear"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer280->Add( m_buttonClear, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); bSizer278->Add( bSizer280, 0, wxEXPAND, 5 ); - m_panelFilterSettingsHolder->SetSizer( bSizer278 ); - m_panelFilterSettingsHolder->Layout(); - bSizer278->Fit( m_panelFilterSettingsHolder ); - m_notebook->AddPage( m_panelFilterSettingsHolder, _("dummy"), false ); - m_panelSyncSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelSyncSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelFilterSettingsTab->SetSizer( bSizer278 ); + m_panelFilterSettingsTab->Layout(); + bSizer278->Fit( m_panelFilterSettingsTab ); + m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), false ); + m_panelSyncSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelSyncSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); wxBoxSizer* bSizer276; bSizer276 = new wxBoxSizer( wxVERTICAL ); bSizerHeaderSyncSettings = new wxBoxSizer( wxVERTICAL ); - m_staticTextMainSyncSettings = new wxStaticText( m_panelSyncSettingsHolder, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMainSyncSettings = new wxStaticText( m_panelSyncSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextMainSyncSettings->Wrap( -1 ); bSizerHeaderSyncSettings->Add( m_staticTextMainSyncSettings, 0, wxALL, 10 ); - m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); bSizerHeaderSyncSettings->Add( m_checkBoxUseLocalSyncOptions, 0, wxALL|wxEXPAND, 10 ); - m_staticlineSyncHeader = new wxStaticLine( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_staticlineSyncHeader = new wxStaticLine( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerHeaderSyncSettings->Add( m_staticlineSyncHeader, 0, wxEXPAND, 5 ); bSizer276->Add( bSizerHeaderSyncSettings, 0, wxEXPAND, 5 ); - m_panelSyncSettings = new wxPanel( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelSyncSettings = new wxPanel( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_panelSyncSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); wxBoxSizer* bSizer232; @@ -1521,22 +1614,22 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer236; bSizer236 = new wxBoxSizer( wxVERTICAL ); - m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 ); + m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); bSizer236->Add( m_toggleBtnTwoWay, 0, wxBOTTOM|wxEXPAND, 5 ); - m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 ); + m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); bSizer236->Add( m_toggleBtnMirror, 0, wxEXPAND|wxBOTTOM, 5 ); - m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 ); + m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); bSizer236->Add( m_toggleBtnUpdate, 0, wxEXPAND|wxBOTTOM, 5 ); - m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 ); + m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); bSizer236->Add( m_toggleBtnCustom, 0, wxEXPAND, 5 ); @@ -1556,64 +1649,64 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer238->Add( 0, 0, 1, wxEXPAND, 5 ); - bSizer233 = new wxBoxSizer( wxHORIZONTAL ); + bSizerSyncDirHolder = new wxBoxSizer( wxHORIZONTAL ); bSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); - m_staticText119 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText119->Wrap( -1 ); - bSizerSyncDirections->Add( m_staticText119, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticTextCategory = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCategory->Wrap( -1 ); + bSizerSyncDirections->Add( m_staticTextCategory, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); ffgSizer11->SetFlexibleDirection( wxBOTH ); ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45, 45 ), 0 ); + m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") ); ffgSizer11->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapLeftNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45, 45 ), 0 ); + m_bitmapLeftNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_bitmapLeftNewer->SetToolTip( _("Left side is newer") ); ffgSizer11->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapDifferent = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45, 45 ), 0 ); + m_bitmapDifferent = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_bitmapDifferent->SetToolTip( _("Items have different content") ); ffgSizer11->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapConflict = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45, 45 ), 0 ); + m_bitmapConflict = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") ); ffgSizer11->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapRightNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45, 45 ), 0 ); + m_bitmapRightNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_bitmapRightNewer->SetToolTip( _("Right side is newer") ); ffgSizer11->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapRightOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45, 45 ), 0 ); + m_bitmapRightOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") ); ffgSizer11->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonLeftOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46, 46 ), wxBU_AUTODRAW ); + m_bpButtonLeftOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); ffgSizer11->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonLeftNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46, 46 ), wxBU_AUTODRAW ); + m_bpButtonLeftNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); ffgSizer11->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonDifferent = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46, 46 ), wxBU_AUTODRAW ); + m_bpButtonDifferent = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); ffgSizer11->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonConflict = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46, 46 ), wxBU_AUTODRAW ); + m_bpButtonConflict = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); ffgSizer11->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonRightNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46, 46 ), wxBU_AUTODRAW ); + m_bpButtonRightNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); ffgSizer11->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonRightOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46, 46 ), wxBU_AUTODRAW ); + m_bpButtonRightOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); ffgSizer11->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -1624,30 +1717,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizerSyncDirections->Add( m_staticText120, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); - bSizer233->Add( bSizerSyncDirections, 0, 0, 5 ); - - wxBoxSizer* bSizerKeepVerticalHeight; - bSizerKeepVerticalHeight = new wxBoxSizer( wxVERTICAL ); - - m_staticText140 = new wxStaticText( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText140->Wrap( -1 ); - bSizerKeepVerticalHeight->Add( m_staticText140, 0, 0, 5 ); - - - bSizerKeepVerticalHeight->Add( 0, 45, 0, 0, 5 ); - - - bSizerKeepVerticalHeight->Add( 0, 5, 0, 0, 5 ); - - - bSizerKeepVerticalHeight->Add( 0, 46, 0, 0, 5 ); - - m_staticText1401 = new wxStaticText( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1401->Wrap( -1 ); - bSizerKeepVerticalHeight->Add( m_staticText1401, 0, wxTOP, 5 ); - - - bSizer233->Add( bSizerKeepVerticalHeight, 0, 0, 5 ); + bSizerSyncDirHolder->Add( bSizerSyncDirections, 0, 0, 5 ); bSizerDatabase = new wxWrapSizer( wxVERTICAL ); @@ -1659,22 +1729,22 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w m_staticText145 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("sync.ffs_db"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText145->Wrap( -1 ); - m_staticText145->SetFont( wxFont( 9, wxFONTFAMILY_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ) ); + m_staticText145->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ) ); m_staticText145->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); bSizerDatabase->Add( m_staticText145, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer233->Add( bSizerDatabase, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerSyncDirHolder->Add( bSizerDatabase, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_staticTextSyncVarDescription = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_staticTextSyncVarDescription->Wrap( -1 ); m_staticTextSyncVarDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer233->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); + bSizerSyncDirHolder->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); - bSizer238->Add( bSizer233, 0, wxALL, 10 ); + bSizer238->Add( bSizerSyncDirHolder, 0, wxALL, 10 ); bSizer238->Add( 0, 0, 1, wxEXPAND, 5 ); @@ -1686,7 +1756,6 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer201 = new wxBoxSizer( wxHORIZONTAL ); m_checkBoxDetectMove = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Detect moved files"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxDetectMove->SetValue(true); m_checkBoxDetectMove->SetToolTip( _("- Not supported by all file systems\n- Requires and creates database files\n- Detection not available for first sync") ); bSizer201->Add( m_checkBoxDetectMove, 0, wxALL|wxEXPAND, 5 ); @@ -1736,8 +1805,10 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w m_staticline531 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizer2361->Add( m_staticline531, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer2351; - bSizer2351 = new wxBoxSizer( wxVERTICAL ); + bSizerVersioningHolder = new wxBoxSizer( wxVERTICAL ); + + + bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 ); wxBoxSizer* bSizer2331; bSizer2331 = new wxBoxSizer( wxHORIZONTAL ); @@ -1758,7 +1829,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer2331->Add( m_hyperlinkVersioning, 0, wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT, 5 ); - bSizer2351->Add( bSizer2331, 0, wxALL|wxEXPAND, 5 ); + bSizerVersioningHolder->Add( bSizer2331, 0, wxALL|wxEXPAND, 5 ); m_panelVersioning = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); @@ -1777,7 +1848,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer156->Add( m_buttonSelectVersioningFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonSelectAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW ); + m_bpButtonSelectAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSelectAltFolder->SetToolTip( _("Access online storage") ); bSizer156->Add( m_bpButtonSelectAltFolder, 0, wxEXPAND, 5 ); @@ -1823,10 +1894,13 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w m_panelVersioning->SetSizer( bSizer191 ); m_panelVersioning->Layout(); bSizer191->Fit( m_panelVersioning ); - bSizer2351->Add( m_panelVersioning, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizerVersioningHolder->Add( m_panelVersioning, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 ); - bSizer2361->Add( bSizer2351, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer2361->Add( bSizerVersioningHolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); bSizer232->Add( bSizer2361, 0, wxEXPAND, 5 ); @@ -1836,28 +1910,56 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizerMiscConfig = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer242; - bSizer242 = new wxBoxSizer( wxHORIZONTAL ); + wxFlexGridSizer* fgSizer61; + fgSizer61 = new wxFlexGridSizer( 0, 2, 5, 5 ); + fgSizer61->SetFlexibleDirection( wxBOTH ); + fgSizer61->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer242->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + fgSizer61->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + fgSizer61->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_checkBoxIgnoreErrors = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxIgnoreErrors->SetToolTip( _("Show pop-up on errors or warnings") ); + m_bitmapRetryErrors = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer61->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer242->Add( m_checkBoxIgnoreErrors, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_checkBoxAutoRetry = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer61->Add( m_checkBoxAutoRetry, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizerMiscConfig->Add( bSizer242, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerMiscConfig->Add( fgSizer61, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + + fgSizerAutoRetry = new wxFlexGridSizer( 0, 2, 5, 10 ); + fgSizerAutoRetry->SetFlexibleDirection( wxBOTH ); + fgSizerAutoRetry->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText96 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText96->Wrap( -1 ); + fgSizerAutoRetry->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextAutoRetryDelay = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextAutoRetryDelay->Wrap( -1 ); + fgSizerAutoRetry->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 0 ); + fgSizerAutoRetry->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + fgSizerAutoRetry->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerMiscConfig->Add( fgSizerAutoRetry, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 ); m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizerMiscConfig->Add( m_staticline57, 0, wxEXPAND, 5 ); - bSizerOnCompletion = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer247; + bSizer247 = new wxBoxSizer( wxVERTICAL ); m_staticText89 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Run a command after synchronization:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText89->Wrap( -1 ); - bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 ); + bSizer247->Add( m_staticText89, 0, wxBOTTOM, 5 ); wxBoxSizer* bSizer251; bSizer251 = new wxBoxSizer( wxHORIZONTAL ); @@ -1871,10 +1973,10 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer251->Add( m_comboBoxPostSyncCommand, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerOnCompletion->Add( bSizer251, 0, wxEXPAND, 5 ); + bSizer247->Add( bSizer251, 0, wxEXPAND, 5 ); - bSizerMiscConfig->Add( bSizerOnCompletion, 1, wxALL, 10 ); + bSizerMiscConfig->Add( bSizer247, 1, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); bSizer232->Add( bSizerMiscConfig, 1, wxEXPAND, 5 ); @@ -1886,10 +1988,10 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer276->Add( m_panelSyncSettings, 1, wxEXPAND, 5 ); - m_panelSyncSettingsHolder->SetSizer( bSizer276 ); - m_panelSyncSettingsHolder->Layout(); - bSizer276->Fit( m_panelSyncSettingsHolder ); - m_notebook->AddPage( m_panelSyncSettingsHolder, _("dummy"), true ); + m_panelSyncSettingsTab->SetSizer( bSizer276 ); + m_panelSyncSettingsTab->Layout(); + bSizer276->Fit( m_panelSyncSettingsTab ); + m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), true ); bSizer190->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); @@ -1962,6 +2064,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w m_hyperlinkVersioning->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), NULL, this ); m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeSyncOption ), NULL, this ); m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleIgnoreErrors ), NULL, this ); + m_checkBoxAutoRetry->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleAutoRetry ), NULL, this ); m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnOkay ), NULL, this ); m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCancel ), NULL, this ); } @@ -1970,106 +2073,6 @@ ConfigDlgGenerated::~ConfigDlgGenerated() { } -FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) -{ - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxHORIZONTAL ); - - m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelLeft->SetMinSize( wxSize( 1, -1 ) ); - - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); - m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") ); - - bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_folderPathLeft = new fff::FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer134->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectFolderLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") ); - - bSizer134->Add( m_buttonSelectFolderLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW ); - m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") ); - - bSizer134->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 ); - - - m_panelLeft->SetSizer( bSizer134 ); - m_panelLeft->Layout(); - bSizer134->Fit( m_panelLeft ); - bSizer74->Add( m_panelLeft, 0, wxLEFT|wxEXPAND, 5 ); - - m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); - - - m_panel20->SetSizer( bSizer95 ); - m_panel20->Layout(); - bSizer95->Fit( m_panel20 ); - bSizer74->Add( m_panel20, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelRight->SetMinSize( wxSize( 1, -1 ) ); - - wxBoxSizer* bSizer135; - bSizer135 = new wxBoxSizer( wxHORIZONTAL ); - - m_folderPathRight = new fff::FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer135->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectFolderRight->SetToolTip( _("Select a folder") ); - - bSizer135->Add( m_buttonSelectFolderRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW ); - m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") ); - - bSizer135->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 ); - - - m_panelRight->SetSizer( bSizer135 ); - m_panelRight->Layout(); - bSizer135->Fit( m_panelRight ); - bSizer74->Add( m_panelRight, 1, wxRIGHT|wxEXPAND, 5 ); - - - this->SetSizer( bSizer74 ); - this->Layout(); - bSizer74->Fit( this ); -} - -FolderPairPanelGenerated::~FolderPairPanelGenerated() -{ -} - CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { this->SetSizeHints( wxDefaultSize, wxDefaultSize ); @@ -2130,14 +2133,14 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id, m_staticText12311->Wrap( -1 ); bSizer245->Add( m_staticText12311, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlServer = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 260, -1 ), 0 ); + m_textCtrlServer = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer245->Add( m_textCtrlServer, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_staticText1233 = new wxStaticText( m_panel41, wxID_ANY, _("Port:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText1233->Wrap( -1 ); bSizer245->Add( m_staticText1233, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlPort = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), 0 ); + m_textCtrlPort = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer245->Add( m_textCtrlPort, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -2337,7 +2340,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id, m_staticText12341->Wrap( -1 ); fgSizer1611->Add( m_staticText12341, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - m_spinCtrlConnectionCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + m_spinCtrlConnectionCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); fgSizer1611->Add( m_spinCtrlConnectionCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_staticTextSftpConnectionCountHint = new wxStaticText( m_panel411, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -2350,7 +2353,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id, m_staticText1231111->Wrap( -1 ); fgSizer1611->Add( m_staticText1231111, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + m_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); fgSizer1611->Add( m_spinCtrlChannelCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_button42 = new wxButton( m_panel411, wxID_ANY, _("Detect server limit"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -2411,7 +2414,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id, m_staticText123411->Wrap( -1 ); fgSizer16111->Add( m_staticText123411, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - m_spinCtrlConnectionCountFtp = new wxSpinCtrl( m_panel4111, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + m_spinCtrlConnectionCountFtp = new wxSpinCtrl( m_panel4111, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); fgSizer16111->Add( m_spinCtrlConnectionCountFtp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_staticTextFtpConnectionCountHint = new wxStaticText( m_panel4111, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -2441,7 +2444,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id, m_buttonOkay->SetDefault(); m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); @@ -2507,7 +2510,7 @@ AbstractFolderPickerGenerated::AbstractFolderPickerGenerated( wxWindow* parent, wxBoxSizer* bSizer185; bSizer185 = new wxBoxSizer( wxVERTICAL ); - m_treeCtrlFileSystem = new wxTreeCtrl( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( 350, 400 ), wxTR_FULL_ROW_HIGHLIGHT|wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT|wxTR_NO_LINES|wxNO_BORDER ); + m_treeCtrlFileSystem = new wxTreeCtrl( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxTR_FULL_ROW_HIGHLIGHT|wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT|wxTR_NO_LINES|wxNO_BORDER ); bSizer185->Add( m_treeCtrlFileSystem, 1, wxEXPAND, 5 ); @@ -2525,7 +2528,7 @@ AbstractFolderPickerGenerated::AbstractFolderPickerGenerated( wxWindow* parent, m_buttonOkay->SetDefault(); m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); @@ -2867,16 +2870,33 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi wxBoxSizer* bSizer199; bSizer199 = new wxBoxSizer( wxHORIZONTAL ); - bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL ); + bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapRetryErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText1461 = new wxStaticText( this, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1461->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_staticTextRetryCount = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRetryCount->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + + bSizer199->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL ); m_bitmapIgnoreErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerProgressFooter->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerProgressFooter->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + m_staticText146 = new wxStaticText( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText146->Wrap( -1 ); + bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - bSizer199->Add( bSizerProgressFooter, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer199->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); bSizerProgressGraph = new wxBoxSizer( wxHORIZONTAL ); @@ -2902,7 +2922,7 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi bSizerProgressGraph->Add( bSizer247, 0, 0, 5 ); - bSizer199->Add( bSizerProgressGraph, 1, 0, 5 ); + bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL, 5 ); bSizer181->Add( bSizer199, 0, wxTOP|wxEXPAND, 5 ); @@ -2914,9 +2934,6 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi this->SetSizer( bSizer40 ); this->Layout(); bSizer40->Fit( this ); - - // Connect Events - m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CompareProgressDlgGenerated::OnToggleIgnoreErrors ), NULL, this ); } CompareProgressDlgGenerated::~CompareProgressDlgGenerated() @@ -2930,27 +2947,30 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - bSizer42->Add( 32, 0, 0, 0, 5 ); - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32, 32 ), 0 ); + m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 ); m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextPhase->Wrap( -1 ); m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + wxBoxSizer* bSizer247; + bSizer247 = new wxBoxSizer( wxHORIZONTAL ); - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer247->Add( 0, 0, 1, 0, 5 ); - m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32, 32 ), wxBU_AUTODRAW ); + m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") ); - bSizer42->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( bSizer247, 1, wxALIGN_CENTER_VERTICAL, 5 ); bSizerRoot->Add( bSizer42, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); @@ -2983,7 +3003,7 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizer161->Add( m_panelGraphBytes, 1, wxEXPAND, 15 ); + bSizer161->Add( m_panelGraphBytes, 1, wxEXPAND|wxLEFT, 10 ); wxBoxSizer* bSizer232; bSizer232 = new wxBoxSizer( wxHORIZONTAL ); @@ -3135,7 +3155,7 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind bSizer175->Add( m_bitmapGraphKeyBytes, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); wxStaticText* m_staticText99; - m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes copied:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText99->Wrap( -1 ); bSizer175->Add( m_staticText99, 0, wxALIGN_CENTER_VERTICAL, 5 ); @@ -3149,7 +3169,7 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind bSizer174->Add( m_bitmapGraphKeyItems, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); wxStaticText* m_staticText100; - m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText100->Wrap( -1 ); bSizer174->Add( m_staticText100, 0, wxALIGN_CENTER_VERTICAL, 5 ); @@ -3165,18 +3185,40 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizer161->Add( m_panelGraphItems, 1, wxEXPAND, 15 ); + bSizer161->Add( m_panelGraphItems, 1, wxEXPAND|wxLEFT, 10 ); + bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL ); - bSizer161->Add( 550, 0, 0, 0, 5 ); + bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL ); - bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL ); + m_bitmapRetryErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText1461 = new wxStaticText( m_panelProgress, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1461->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_staticTextRetryCount = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRetryCount->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + + bSizerProgressFooter->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL ); m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerProgressFooter->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText146 = new wxStaticText( m_panelProgress, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText146->Wrap( -1 ); + bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizerProgressFooter->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + - m_checkBoxIgnoreErrors = new wxCheckBox( m_panelProgress, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerProgressFooter->Add( m_checkBoxIgnoreErrors, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + bSizerProgressFooter->Add( 0, 0, 1, wxEXPAND, 5 ); m_staticText137 = new wxStaticText( m_panelProgress, wxID_ANY, _("When finished:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText137->Wrap( -1 ); @@ -3188,15 +3230,12 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind bSizerProgressFooter->Add( m_choicePostSyncAction, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT, 10 ); + bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); bSizer173->Add( bSizer161, 1, wxEXPAND|wxLEFT, 10 ); - bSizer173->Add( 0, 340, 0, 0, 5 ); - - m_panelProgress->SetSizer( bSizer173 ); m_panelProgress->Layout(); bSizer173->Fit( m_panelProgress ); @@ -3213,8 +3252,11 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-Close"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStdButtons->Add( m_checkBoxAutoClose, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStdButtons->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_buttonClose->SetDefault(); @@ -3251,13 +3293,13 @@ LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxP wxBoxSizer* bSizer154; bSizer154 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49, 49 ), wxBU_AUTODRAW ); + m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49, 49 ), wxBU_AUTODRAW ); + m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49, 49 ), wxBU_AUTODRAW ); + m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -3299,9 +3341,9 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextDescr = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDescr->Wrap( 520 ); - bSizer72->Add( m_staticTextDescr, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); bSizer54->Add( bSizer72, 0, 0, 5 ); @@ -3338,8 +3380,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS ffgSizer11->Add( 0, 0, 1, wxEXPAND, 5 ); - m_checkBoxAutoClose = new wxCheckBox( m_panel35, wxID_ANY, _("Auto-Close"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxAutoClose->SetValue(true); + m_checkBoxAutoClose = new wxCheckBox( m_panel35, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 ); ffgSizer11->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); @@ -3360,7 +3401,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_bitmapIgnoreErrors = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); bSizer243->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxIgnoreErrors = new wxCheckBox( m_panel35, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxIgnoreErrors = new wxCheckBox( m_panel35, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer243->Add( m_checkBoxIgnoreErrors, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); @@ -3426,14 +3467,17 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer238 = new wxBoxSizer( wxHORIZONTAL ); m_checkBoxSaveLog = new wxCheckBox( m_panel35, wxID_ANY, _("Save log:"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer238->Add( m_checkBoxSaveLog, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer238->Add( m_checkBoxSaveLog, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer238->Add( 0, 0, 1, wxEXPAND, 5 ); m_checkBoxLogfilesLimit = new wxCheckBox( m_panel35, wxID_ANY, _("Limit:"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") ); bSizer238->Add( m_checkBoxLogfilesLimit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") ); bSizer238->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); @@ -3455,7 +3499,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer1721->Add( m_buttonSelectLogFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW ); + m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") ); bSizer1721->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 ); @@ -3536,7 +3580,7 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); bSizer72->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextHeader->Wrap( -1 ); bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); @@ -3558,7 +3602,7 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 ); - m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 500, 200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); + m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 ); @@ -3573,7 +3617,10 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStdButtons->Add( m_checkBoxUseRecycler, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizerStdButtons->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_buttonOK->SetDefault(); @@ -3619,8 +3666,8 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w m_bitmapCopyTo = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); bSizer72->Add( m_bitmapCopyTo, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER ); - m_staticTextHeader->Wrap( 460 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); @@ -3644,7 +3691,7 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 ); - m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 500, 200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); + m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 ); @@ -3661,7 +3708,7 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer182->Add( m_buttonSelectTargetFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW ); + m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); m_bpButtonSelectAltTargetFolder->SetToolTip( _("Access online storage") ); bSizer182->Add( m_bpButtonSelectAltTargetFolder, 0, wxEXPAND, 5 ); @@ -3692,7 +3739,10 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w bSizer189->Add( m_checkBoxOverwriteIfExists, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - bSizerStdButtons->Add( bSizer189, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizerStdButtons->Add( bSizer189, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); m_buttonOK = new wxButton( this, wxID_OK, _("Copy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_buttonOK->SetDefault(); @@ -3740,7 +3790,7 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); m_staticText44 = new wxStaticText( this, wxID_ANY, _("The following settings are used for all synchronization jobs."), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticText44->Wrap( 500 ); + m_staticText44->Wrap( -1 ); bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); @@ -3851,42 +3901,25 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const bSizer160->Add( bSizer178, 0, wxEXPAND, 5 ); - bSizer186->Add( bSizer160, 0, wxEXPAND|wxALL, 5 ); + bSizer186->Add( bSizer160, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer188; - bSizer188 = new wxBoxSizer( wxVERTICAL ); - - m_staticText95 = new wxStaticText( m_panel39, wxID_ANY, _("Automatic retry on error:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText95->Wrap( -1 ); - bSizer188->Add( m_staticText95, 0, wxBOTTOM, 5 ); - - wxFlexGridSizer* fgSizer6; - fgSizer6 = new wxFlexGridSizer( 0, 2, 5, 5 ); - fgSizer6->SetFlexibleDirection( wxBOTH ); - fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText96 = new wxStaticText( m_panel39, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText96->Wrap( -1 ); - fgSizer6->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 4 ); - fgSizer6->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextAutoRetryDelay = new wxStaticText( m_panel39, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextAutoRetryDelay->Wrap( -1 ); - fgSizer6->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); + wxBoxSizer* bSizer1881; + bSizer1881 = new wxBoxSizer( wxVERTICAL ); - m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - fgSizer6->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("Show hidden dialogs again"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + bSizer1881->Add( m_buttonResetDialogs, 0, wxALL, 5 ); + m_staticTextResetDialogs = new wxStaticText( m_panel39, wxID_ANY, _("Show all permanently hidden dialogs and warning messages again"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextResetDialogs->Wrap( -1 ); + m_staticTextResetDialogs->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer188->Add( fgSizer6, 0, wxLEFT, 10 ); + bSizer1881->Add( m_staticTextResetDialogs, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer186->Add( bSizer188, 0, wxALL, 10 ); + bSizer186->Add( bSizer1881, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); bSizer166->Add( bSizer186, 0, wxEXPAND, 5 ); @@ -3904,18 +3937,16 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); // Grid - m_gridCustomCommand->CreateGrid( 5, 2 ); + m_gridCustomCommand->CreateGrid( 3, 2 ); m_gridCustomCommand->EnableEditing( true ); m_gridCustomCommand->EnableGridLines( true ); m_gridCustomCommand->EnableDragGridSize( false ); m_gridCustomCommand->SetMargins( 0, 0 ); // Columns - m_gridCustomCommand->SetColSize( 0, 165 ); - m_gridCustomCommand->SetColSize( 1, 196 ); m_gridCustomCommand->EnableDragColMove( false ); m_gridCustomCommand->EnableDragColSize( true ); - m_gridCustomCommand->SetColLabelSize( 20 ); + m_gridCustomCommand->SetColLabelSize( -1 ); m_gridCustomCommand->SetColLabelValue( 0, _("Description") ); m_gridCustomCommand->SetColLabelValue( 1, _("Command line") ); m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); @@ -3923,7 +3954,7 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const // Rows m_gridCustomCommand->EnableDragRowSize( false ); m_gridCustomCommand->SetRowLabelSize( 1 ); - m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); // Label Appearance @@ -3934,11 +3965,11 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const wxBoxSizer* bSizer193; bSizer193 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); - bSizer193->Add( m_bpButtonAddRow, 0, 0, 5 ); + m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + bSizer193->Add( m_bpButtonAddRow, 0, wxEXPAND, 5 ); - m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW ); - bSizer193->Add( m_bpButtonRemoveRow, 0, 0, 5 ); + m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW ); + bSizer193->Add( m_bpButtonRemoveRow, 0, wxEXPAND, 5 ); bSizer193->Add( 0, 0, 1, wxEXPAND, 5 ); @@ -3952,24 +3983,6 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const bSizer166->Add( bSizer181, 1, wxEXPAND|wxALL, 10 ); - m_staticline192 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline192, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer1881; - bSizer1881 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("Show hidden dialogs again"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer1881->Add( m_buttonResetDialogs, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText923 = new wxStaticText( m_panel39, wxID_ANY, _("Show all permanently hidden dialogs and warning messages again"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText923->Wrap( 350 ); - m_staticText923->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - bSizer1881->Add( m_staticText923, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - - - bSizer166->Add( bSizer1881, 0, wxALL, 5 ); - m_panel39->SetSizer( bSizer166 ); m_panel39->Layout(); @@ -4008,11 +4021,10 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::OnClose ) ); - m_spinCtrlAutoRetryCount->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::OnToggleAutoRetryCount ), NULL, this ); + m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnResetDialogs ), NULL, this ); m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnAddRow ), NULL, this ); m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnRemoveRow ), NULL, this ); m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( OptionsDlgGenerated::OnHelpShowExamples ), NULL, this ); - m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnResetDialogs ), NULL, this ); m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnDefault ), NULL, this ); m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnOkay ), NULL, this ); m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnCancel ), NULL, this ); @@ -4416,11 +4428,11 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS wxBoxSizer* bSizer177; bSizer177 = new wxBoxSizer( wxVERTICAL ); - m_staticText54 = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( 200 ); - m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextThanksForLoc = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_staticTextThanksForLoc->Wrap( -1 ); + m_staticTextThanksForLoc->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer177->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + bSizer177->Add( m_staticTextThanksForLoc, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); bSizer177->Add( 0, 5, 0, 0, 5 ); @@ -4428,7 +4440,6 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxVSCROLL ); m_scrolledWindowTranslators->SetScrollRate( 10, 10 ); m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_scrolledWindowTranslators->SetMinSize( wxSize( 220, -1 ) ); fgSizerTranslators = new wxFlexGridSizer( 0, 2, 2, 10 ); fgSizerTranslators->SetFlexibleDirection( wxBOTH ); @@ -4441,7 +4452,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer177->Add( m_scrolledWindowTranslators, 1, wxLEFT|wxEXPAND, 5 ); - bSizer174->Add( bSizer177, 0, wxEXPAND|wxTOP|wxLEFT, 5 ); + bSizer174->Add( bSizer177, 0, wxTOP|wxLEFT|wxEXPAND, 5 ); bSizer162->Add( bSizer174, 0, 0, 5 ); @@ -4495,8 +4506,8 @@ DownloadProgressDlgGenerated::DownloadProgressDlgGenerated( wxWindow* parent, wx m_bitmapDownloading = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); bSizer72->Add( m_bitmapDownloading, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER ); - m_staticTextHeader->Wrap( 460 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); @@ -4514,8 +4525,6 @@ DownloadProgressDlgGenerated::DownloadProgressDlgGenerated( wxWindow* parent, wx m_staticTextDetails = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); m_staticTextDetails->Wrap( -1 ); - m_staticTextDetails->SetMinSize( wxSize( 550, -1 ) ); - bSizer212->Add( m_staticTextDetails, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); @@ -4654,7 +4663,6 @@ ActivationDlgGenerated::ActivationDlgGenerated( wxWindow* parent, wxWindowID id, bSizer236->Add( m_staticText1361, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); m_buttonCopyUrl = new wxButton( m_panel351, wxID_ANY, _("&Copy to clipboard"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonCopyUrl->SetDefault(); m_buttonCopyUrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); bSizer236->Add( m_buttonCopyUrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); @@ -4662,8 +4670,8 @@ ActivationDlgGenerated::ActivationDlgGenerated( wxWindow* parent, wxWindowID id, bSizer237->Add( bSizer236, 0, wxEXPAND, 5 ); - m_textCtrlManualActivationUrl = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220, 55 ), wxTE_MULTILINE|wxTE_READONLY|wxWANTS_CHARS ); - bSizer237->Add( m_textCtrlManualActivationUrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_textCtrlManualActivationUrl = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, 55 ), wxTE_MULTILINE|wxTE_READONLY ); + bSizer237->Add( m_textCtrlManualActivationUrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); wxBoxSizer* bSizer235; bSizer235 = new wxBoxSizer( wxHORIZONTAL ); @@ -4672,7 +4680,7 @@ ActivationDlgGenerated::ActivationDlgGenerated( wxWindow* parent, wxWindowID id, m_staticText13611->Wrap( -1 ); bSizer235->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220, -1 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS ); + m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250, -1 ), wxTE_PROCESS_ENTER ); bSizer235->Add( m_textCtrlOfflineActivationKey, 1, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_buttonActivateOffline = new wxButton( m_panel351, wxID_ANY, _("Activate offline"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); @@ -4740,12 +4748,12 @@ CfgHighlightDlgGenerated::CfgHighlightDlgGenerated( wxWindow* parent, wxWindowID wxBoxSizer* bSizer238; bSizer238 = new wxBoxSizer( wxVERTICAL ); - m_staticText145 = new wxStaticText( m_panel35, wxID_ANY, _("Highlight configurations that have not been run for more than the following number of days:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText145->Wrap( 300 ); - bSizer238->Add( m_staticText145, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticTextHighlight = new wxStaticText( m_panel35, wxID_ANY, _("Highlight configurations that have not been run for more than the following number of days:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHighlight->Wrap( -1 ); + bSizer238->Add( m_staticTextHighlight, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - m_spinCtrlSyncOverdueDays = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer238->Add( m_spinCtrlSyncOverdueDays, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_spinCtrlOverdueDays = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer238->Add( m_spinCtrlOverdueDays, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); bSizer98->Add( bSizer238, 1, wxALL|wxEXPAND, 5 ); diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h index 3b2287e1..3b7034db 100755 --- a/FreeFileSync/Source/ui/gui_generated.h +++ b/FreeFileSync/Source/ui/gui_generated.h @@ -11,14 +11,13 @@ #include #include #include -namespace fff { class CommandBox; } -namespace fff { class FolderHistoryBox; } -namespace fff { class TripleSplitter; } -namespace zen { class BitmapTextButton; } -namespace zen { class Graph2D; } -namespace zen { class Grid; } -namespace zen { class ToggleButton; } - +#include "wx+/bitmap_button.h" +#include "folder_history_box.h" +#include "wx+/grid.h" +#include "triple_splitter.h" +#include "wx+/toggle_button.h" +#include "command_box.h" +#include "wx+/graph.h" #include #include #include @@ -246,21 +245,51 @@ public: wxBitmapButton* m_bpButtonRemovePair; fff::FolderHistoryBox* m_folderPathLeft; wxBitmapButton* m_bpButtonSelectAltFolderLeft; - wxBitmapButton* m_bpButtonAltCompCfg; + wxBitmapButton* m_bpButtonLocalCompCfg; wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonAltSyncCfg; + wxBitmapButton* m_bpButtonLocalSyncCfg; wxPanel* m_panelTopRight; fff::FolderHistoryBox* m_folderPathRight; wxBitmapButton* m_bpButtonSelectAltFolderRight; wxBoxSizer* bSizerStatistics; wxBoxSizer* bSizerData; - MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 900, 600 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); ~MainDialogGenerated(); }; +/////////////////////////////////////////////////////////////////////////////// +/// Class FolderPairPanelGenerated +/////////////////////////////////////////////////////////////////////////////// +class FolderPairPanelGenerated : public wxPanel +{ +private: + +protected: + wxButton* m_buttonSelectFolderLeft; + wxButton* m_buttonSelectFolderRight; + +public: + wxPanel* m_panelLeft; + wxBitmapButton* m_bpButtonFolderPairOptions; + wxBitmapButton* m_bpButtonRemovePair; + fff::FolderHistoryBox* m_folderPathLeft; + wxBitmapButton* m_bpButtonSelectAltFolderLeft; + wxPanel* m_panel20; + wxBitmapButton* m_bpButtonLocalCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonLocalSyncCfg; + wxPanel* m_panelRight; + fff::FolderHistoryBox* m_folderPathRight; + wxBitmapButton* m_bpButtonSelectAltFolderRight; + + FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 ); + ~FolderPairPanelGenerated(); + +}; + /////////////////////////////////////////////////////////////////////////////// /// Class ConfigDlgGenerated /////////////////////////////////////////////////////////////////////////////// @@ -272,7 +301,7 @@ protected: wxStaticText* m_staticTextFolderPairLabel; wxListBox* m_listBoxFolderPair; wxNotebook* m_notebook; - wxPanel* m_panelCompSettingsHolder; + wxPanel* m_panelCompSettingsTab; wxBoxSizer* bSizerHeaderCompSettings; wxStaticText* m_staticTextMainCompSettings; wxCheckBox* m_checkBoxUseLocalCmpOptions; @@ -298,7 +327,7 @@ protected: wxHyperlinkCtrl* m_hyperlink241; wxStaticLine* m_staticline441; wxStaticLine* m_staticline331; - wxPanel* m_panelFilterSettingsHolder; + wxPanel* m_panelFilterSettingsTab; wxBoxSizer* bSizerHeaderFilterSettings; wxStaticText* m_staticTextMainFilterSettings; wxStaticText* m_staticTextLocalFilterSettings; @@ -327,10 +356,9 @@ protected: wxSpinCtrl* m_spinCtrlMaxSize; wxChoice* m_choiceUnitMaxSize; wxStaticLine* m_staticline62; - wxStaticText* m_staticText44; wxStaticLine* m_staticline46; wxButton* m_buttonClear; - wxPanel* m_panelSyncSettingsHolder; + wxPanel* m_panelSyncSettingsTab; wxBoxSizer* bSizerHeaderSyncSettings; wxStaticText* m_staticTextMainSyncSettings; wxCheckBox* m_checkBoxUseLocalSyncOptions; @@ -342,9 +370,9 @@ protected: wxToggleButton* m_toggleBtnUpdate; wxToggleButton* m_toggleBtnCustom; wxStaticLine* m_staticline53; - wxBoxSizer* bSizer233; + wxBoxSizer* bSizerSyncDirHolder; wxBoxSizer* bSizerSyncDirections; - wxStaticText* m_staticText119; + wxStaticText* m_staticTextCategory; wxFlexGridSizer* ffgSizer11; wxStaticBitmap* m_bitmapLeftOnly; wxStaticBitmap* m_bitmapLeftNewer; @@ -359,8 +387,6 @@ protected: wxBitmapButton* m_bpButtonRightNewer; wxBitmapButton* m_bpButtonRightOnly; wxStaticText* m_staticText120; - wxStaticText* m_staticText140; - wxStaticText* m_staticText1401; wxWrapSizer* bSizerDatabase; wxStaticBitmap* m_bitmapDatabase; wxStaticText* m_staticText145; @@ -375,6 +401,7 @@ protected: wxToggleButton* m_toggleBtnPermanent; wxToggleButton* m_toggleBtnVersioning; wxStaticLine* m_staticline531; + wxBoxSizer* bSizerVersioningHolder; wxStaticBitmap* m_bitmapDeletionType; wxStaticText* m_staticTextDeletionTypeDescription; wxHyperlinkCtrl* m_hyperlinkVersioning; @@ -390,8 +417,13 @@ protected: wxBoxSizer* bSizerMiscConfig; wxStaticBitmap* m_bitmapIgnoreErrors; wxCheckBox* m_checkBoxIgnoreErrors; + wxCheckBox* m_checkBoxAutoRetry; + wxFlexGridSizer* fgSizerAutoRetry; + wxStaticText* m_staticText96; + wxStaticText* m_staticTextAutoRetryDelay; + wxSpinCtrl* m_spinCtrlAutoRetryCount; + wxSpinCtrl* m_spinCtrlAutoRetryDelay; wxStaticLine* m_staticline57; - wxBoxSizer* bSizerOnCompletion; wxStaticText* m_staticText89; fff::CommandBox* m_comboBoxPostSyncCommand; wxBoxSizer* bSizerStdButtons; @@ -439,49 +471,22 @@ protected: virtual void OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); } virtual void OnChangeSyncOption( wxCommandEvent& event ) { event.Skip(); } virtual void OnToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleAutoRetry( wxCommandEvent& event ) { event.Skip(); } virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } public: + wxStaticText* m_staticTextFilterDescr; wxBitmapButton* m_bpButtonSelectAltFolder; + wxStaticBitmap* m_bitmapRetryErrors; wxChoice* m_choicePostSyncCondition; - ConfigDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + ConfigDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); ~ConfigDlgGenerated(); }; -/////////////////////////////////////////////////////////////////////////////// -/// Class FolderPairPanelGenerated -/////////////////////////////////////////////////////////////////////////////// -class FolderPairPanelGenerated : public wxPanel -{ -private: - -protected: - wxButton* m_buttonSelectFolderLeft; - wxButton* m_buttonSelectFolderRight; - -public: - wxPanel* m_panelLeft; - wxBitmapButton* m_bpButtonFolderPairOptions; - wxBitmapButton* m_bpButtonRemovePair; - fff::FolderHistoryBox* m_folderPathLeft; - wxBitmapButton* m_bpButtonSelectAltFolderLeft; - wxPanel* m_panel20; - wxBitmapButton* m_bpButtonAltCompCfg; - wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonAltSyncCfg; - wxPanel* m_panelRight; - fff::FolderHistoryBox* m_folderPathRight; - wxBitmapButton* m_bpButtonSelectAltFolderRight; - - FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 ); - ~FolderPairPanelGenerated(); - -}; - /////////////////////////////////////////////////////////////////////////////// /// Class CloudSetupDlgGenerated /////////////////////////////////////////////////////////////////////////////// @@ -576,7 +581,7 @@ protected: public: - CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Access online storage"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Access Online Storage"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); ~CloudSetupDlgGenerated(); }; @@ -683,17 +688,17 @@ protected: wxStaticText* m_staticTextTimeRemaining; wxStaticText* m_staticTextTimeElapsed; wxStaticText* m_staticTextStatus; + wxStaticText* m_staticText1461; + wxStaticText* m_staticTextRetryCount; + wxStaticText* m_staticText146; wxBoxSizer* bSizerProgressGraph; zen::Graph2D* m_panelProgressGraph; - // Virtual event handlers, overide them in your derived class - virtual void OnToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); } - - public: - wxBoxSizer* bSizerProgressFooter; + wxBoxSizer* bSizerErrorsRetry; + wxStaticBitmap* m_bitmapRetryErrors; + wxBoxSizer* bSizerErrorsIgnore; wxStaticBitmap* m_bitmapIgnoreErrors; - wxCheckBox* m_checkBoxIgnoreErrors; CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxRAISED_BORDER ); ~CompareProgressDlgGenerated(); @@ -709,6 +714,8 @@ private: protected: wxBoxSizer* bSizer42; + wxStaticText* m_staticText1461; + wxStaticText* m_staticText146; wxStaticText* m_staticText137; public: @@ -733,8 +740,11 @@ public: wxStaticBitmap* m_bitmapGraphKeyItems; zen::Graph2D* m_panelGraphItems; wxBoxSizer* bSizerProgressFooter; + wxBoxSizer* bSizerErrorsRetry; + wxStaticBitmap* m_bitmapRetryErrors; + wxStaticText* m_staticTextRetryCount; + wxBoxSizer* bSizerErrorsIgnore; wxStaticBitmap* m_bitmapIgnoreErrors; - wxCheckBox* m_checkBoxIgnoreErrors; wxChoice* m_choicePostSyncAction; wxNotebook* m_notebookResult; wxStaticLine* m_staticlineFooter; @@ -785,7 +795,7 @@ private: protected: wxStaticBitmap* m_bitmapBatchJob; - wxStaticText* m_staticTextDescr; + wxStaticText* m_staticTextHeader; wxStaticLine* m_staticline18; wxPanel* m_panel35; wxStaticText* m_staticText146; @@ -904,7 +914,7 @@ public: fff::FolderHistoryBox* m_targetFolderPath; wxBitmapButton* m_bpButtonSelectAltTargetFolder; - CopyToDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Copy items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + CopyToDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Copy Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); ~CopyToDlgGenerated(); }; @@ -935,20 +945,14 @@ protected: wxStaticText* m_staticText93; wxStaticText* m_staticText932; wxStaticLine* m_staticline39; - wxStaticText* m_staticText95; - wxStaticText* m_staticText96; - wxSpinCtrl* m_spinCtrlAutoRetryCount; - wxStaticText* m_staticTextAutoRetryDelay; - wxSpinCtrl* m_spinCtrlAutoRetryDelay; + zen::BitmapTextButton* m_buttonResetDialogs; + wxStaticText* m_staticTextResetDialogs; wxStaticLine* m_staticline191; wxStaticText* m_staticText85; wxGrid* m_gridCustomCommand; wxBitmapButton* m_bpButtonAddRow; wxBitmapButton* m_bpButtonRemoveRow; wxHyperlinkCtrl* m_hyperlink17; - wxStaticLine* m_staticline192; - zen::BitmapTextButton* m_buttonResetDialogs; - wxStaticText* m_staticText923; wxStaticLine* m_staticline36; wxBoxSizer* bSizerStdButtons; wxButton* m_buttonDefault; @@ -957,11 +961,10 @@ protected: // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnToggleAutoRetryCount( wxCommandEvent& event ) { event.Skip(); } + virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); } virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); } virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); } virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); } - virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); } virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } @@ -1067,7 +1070,7 @@ protected: wxStaticBitmap* m_bitmapGpl; wxHyperlinkCtrl* m_hyperlink5; wxStaticLine* m_staticline37; - wxStaticText* m_staticText54; + wxStaticText* m_staticTextThanksForLoc; wxScrolledWindow* m_scrolledWindowTranslators; wxFlexGridSizer* fgSizerTranslators; wxStaticLine* m_staticline36; @@ -1170,8 +1173,8 @@ private: protected: wxPanel* m_panel35; - wxStaticText* m_staticText145; - wxSpinCtrl* m_spinCtrlSyncOverdueDays; + wxStaticText* m_staticTextHighlight; + wxSpinCtrl* m_spinCtrlOverdueDays; wxStaticLine* m_staticline21; wxBoxSizer* bSizerStdButtons; wxButton* m_buttonOkay; diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp index ee14082a..4a1bebbd 100755 --- a/FreeFileSync/Source/ui/gui_status_handler.cpp +++ b/FreeFileSync/Source/ui/gui_status_handler.cpp @@ -23,7 +23,7 @@ using namespace fff; StatusHandlerTemporaryPanel::StatusHandlerTemporaryPanel(MainDialog& dlg) : mainDlg_(dlg) { { - mainDlg_.compareStatus_->init(*this, false /*ignoreErrors*/); //clear old values before showing panel + mainDlg_.compareStatus_->init(*this, false /*ignoreErrors*/, 0 /*automaticRetryCount*/); //clear old values before showing panel //------------------------------------------------------------------ const wxAuiPaneInfo& topPanel = mainDlg_.auiMgr_.GetPane(mainDlg_.m_panelTopButtons); @@ -238,7 +238,7 @@ StatusHandlerFloatingDialog::StatusHandlerFloatingDialog(wxFrame* parentDlg, bool& exitAfterSync, bool& autoCloseDialog) : progressDlg_(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, parentDlg, true /*showProgress*/, autoCloseDialog, -jobName, soundFileSyncComplete, ignoreErrors, PostSyncAction2::NONE)), +jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, PostSyncAction2::NONE)), lastSyncsLogFileSizeMax_(lastSyncsLogFileSizeMax), automaticRetryCount_(automaticRetryCount), automaticRetryDelay_(automaticRetryDelay), @@ -285,7 +285,7 @@ StatusHandlerFloatingDialog::~StatusHandlerFloatingDialog() getBytesTotal(PHASE_SYNCHRONIZING) == 0) finalStatusMsg = _("Nothing to synchronize"); //even if "ignored conflicts" occurred! else - finalStatusMsg = _("Completed"); + finalStatusMsg = _("Completed successfully"); errorLog_.logMsg(finalStatusMsg, MSG_TYPE_INFO); } diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp index b20b4b08..4a0d4ed1 100755 --- a/FreeFileSync/Source/ui/main_dlg.cpp +++ b/FreeFileSync/Source/ui/main_dlg.cpp @@ -52,11 +52,12 @@ using namespace zen; using namespace fff; - namespace { -const size_t EXT_APP_MASS_INVOKE_THRESHOLD = 10; //more than this is likely a user mistake (Explorer uses limit of 15) -const int TOP_BUTTON_OPTIMAL_WIDTH = 180; +const size_t EXT_APP_MASS_INVOKE_THRESHOLD = 10; //more is likely a user mistake (Explorer uses limit of 15) +const int TOP_BUTTON_OPTIMAL_WIDTH_DIP = 180; +const std::chrono::milliseconds LAST_USED_CFG_EXISTENCE_CHECK_TIME_MAX(500); +const std::chrono::milliseconds FILE_GRID_POST_UPDATE_DELAY(400); IconBuffer::IconSize convert(FileIconSize isize) @@ -145,8 +146,8 @@ private: wxWindow* getParentWindow() override { return &mainDlg_; } std::unique_ptr& getFilterCfgOnClipboardRef() override { return mainDlg_.filterCfgOnClipboard_; } - void onAltCompCfgChange () override { mainDlg_.applyCompareConfig(false /*setDefaultViewType*/); } - void onAltSyncCfgChange () override { mainDlg_.applySyncConfig(); } + void onLocalCompCfgChange () override { mainDlg_.applyCompareConfig(false /*setDefaultViewType*/); } + void onLocalSyncCfgChange () override { mainDlg_.applySyncConfig(); } void onLocalFilterCfgChange() override { mainDlg_.applyFilterConfig(); } //re-apply filter MainDialog& mainDlg_; @@ -176,14 +177,14 @@ public: m_bpButtonFolderPairOptions->SetBitmapLabel(getResourceImage(L"button_arrow_down")); } - void setValues(const FolderPairEnh& fp) + void setValues(const LocalPairConfig& lpc) { - setConfig(fp.altCmpConfig, fp.altSyncConfig, fp.localFilter); - folderSelectorLeft_ .setPath(fp.folderPathPhraseLeft_); - folderSelectorRight_.setPath(fp.folderPathPhraseRight_); + setConfig(lpc.localCmpCfg, lpc.localSyncCfg, lpc.localFilter); + folderSelectorLeft_ .setPath(lpc.folderPathPhraseLeft); + folderSelectorRight_.setPath(lpc.folderPathPhraseRight); } - FolderPairEnh getValues() const { return FolderPairEnh(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getAltCompConfig(), getAltSyncConfig(), getAltFilterConfig()); } + LocalPairConfig getValues() const { return LocalPairConfig(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getCompConfig(), getSyncConfig(), getFilterConfig()); } private: //support for drag and drop @@ -228,14 +229,14 @@ public: mainDialog.m_panelTopRight ->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::onTopFolderPairKeyEvent), nullptr, &mainDialog); } - void setValues(const FolderPairEnh& fp) + void setValues(const LocalPairConfig& lpc) { - setConfig(fp.altCmpConfig, fp.altSyncConfig, fp.localFilter); - folderSelectorLeft_ .setPath(fp.folderPathPhraseLeft_); - folderSelectorRight_.setPath(fp.folderPathPhraseRight_); + setConfig(lpc.localCmpCfg, lpc.localSyncCfg, lpc.localFilter); + folderSelectorLeft_ .setPath(lpc.folderPathPhraseLeft); + folderSelectorRight_.setPath(lpc.folderPathPhraseRight); } - FolderPairEnh getValues() const { return FolderPairEnh(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getAltCompConfig(), getAltSyncConfig(), getAltFilterConfig()); } + LocalPairConfig getValues() const { return LocalPairConfig(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getCompConfig(), getSyncConfig(), getFilterConfig()); } private: //support for drag and drop @@ -258,12 +259,12 @@ void updateTopButton(wxBitmapButton& btn, const wxBitmap& bmp, const wxString& v const wxImage& iconImage = makeGrey ? greyScale(bmp.ConvertToImage()) : bmp.ConvertToImage(); wxImage dynImage = btn.GetLayoutDirection() != wxLayout_RightToLeft ? - stackImages(iconImage, descrImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5) : - stackImages(descrImage, iconImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5); + stackImages(iconImage, descrImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, fastFromDIP(5)) : + stackImages(descrImage, iconImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, fastFromDIP(5)); //SetMinSize() instead of SetSize() is needed here for wxWindows layout determination to work correctly - wxSize minSize = dynImage.GetSize() + wxSize(16, 16); //add border space - minSize.x = std::max(minSize.x, TOP_BUTTON_OPTIMAL_WIDTH); + wxSize minSize = dynImage.GetSize() + wxSize(fastFromDIP(16), fastFromDIP(16)); //add border space + minSize.x = std::max(minSize.x, fastFromDIP(TOP_BUTTON_OPTIMAL_WIDTH_DIP)); btn.SetMinSize(minSize); @@ -312,7 +313,7 @@ void MainDialog::create(const Zstring& globalConfigFilePath) }); //potentially slow network access: give all checks 500ms to finish - const bool allFilesAvailable = firstUnavailableFile.timedWait(std::chrono::milliseconds(500)) && //false: time elapsed + const bool allFilesAvailable = firstUnavailableFile.timedWait(LAST_USED_CFG_EXISTENCE_CHECK_TIME_MAX) && //false: time elapsed !firstUnavailableFile.get(); //no missing if (!allFilesAvailable) cfgFilePaths.clear(); //we do NOT want to show an error due to last config file missing on application start! @@ -412,13 +413,18 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, m_bpButtonFilterContext->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"button_arrow_right"))); m_bpButtonSyncContext ->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"button_arrow_right"))); - m_bpButtonNew ->SetBitmapLabel(getResourceImage(L"new")); - m_bpButtonOpen ->SetBitmapLabel(getResourceImage(L"load")); - m_bpButtonSaveAs ->SetBitmapLabel(getResourceImage(L"sync")); - m_bpButtonSaveAsBatch->SetBitmapLabel(getResourceImage(L"batch")); + m_bpButtonNew ->SetBitmapLabel(getResourceImage(L"file_new")); + m_bpButtonOpen ->SetBitmapLabel(getResourceImage(L"file_load")); + m_bpButtonSaveAs ->SetBitmapLabel(getResourceImage(L"file_sync")); + m_bpButtonSaveAsBatch->SetBitmapLabel(getResourceImage(L"file_batch")); + m_bpButtonAddPair ->SetBitmapLabel(getResourceImage(L"item_add")); m_bpButtonHideSearch ->SetBitmapLabel(getResourceImage(L"close_panel")); + m_textCtrlSearchTxt->SetMinSize(wxSize(fastFromDIP(220), -1)); + + initViewFilterButtons(); + //we have to use the OS X naming convention by default, because wxMac permanently populates the display menu when the wxMenuItem is created for the first time! //=> other wx ports are not that badly programmed; therefore revert: assert(m_menuItemOptions->GetItemLabel() == _("&Preferences") + L"\tCtrl+,"); //"Ctrl" is automatically mapped to command button! @@ -446,33 +452,39 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, m_panelTopButtons->GetSizer()->SetSizeHints(m_panelTopButtons); //~=Fit() + SetMinSize() setBitmapTextLabel(*m_buttonCancel, wxImage(), m_buttonCancel->GetLabel()); //we can't use a wxButton for cancel: it's rendered smaller on OS X than a wxBitmapButton! - m_buttonCancel->SetMinSize(wxSize(std::max(m_buttonCancel->GetSize().x, TOP_BUTTON_OPTIMAL_WIDTH), + m_buttonCancel->SetMinSize(wxSize(std::max(m_buttonCancel->GetSize().x, fastFromDIP(TOP_BUTTON_OPTIMAL_WIDTH_DIP)), std::max(m_buttonCancel->GetSize().y, m_buttonCompare->GetSize().y))); auiMgr_.AddPane(m_panelTopButtons, - wxAuiPaneInfo().Name(L"TopPanel").Layer(2).Top().Row(1).Caption(_("Main Bar")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(TOP_BUTTON_OPTIMAL_WIDTH, m_panelTopButtons->GetSize().GetHeight())); + wxAuiPaneInfo().Name(L"TopPanel").Layer(2).Top().Row(1).Caption(_("Main Bar")).CaptionVisible(false). + PaneBorder(false).Gripper().MinSize(fastFromDIP(TOP_BUTTON_OPTIMAL_WIDTH_DIP), m_panelTopButtons->GetSize().GetHeight())); //note: min height is calculated incorrectly by wxAuiManager if panes with and without caption are in the same row => use smaller min-size auiMgr_.AddPane(compareStatus_->getAsWindow(), - wxAuiPaneInfo().Name(L"ProgressPanel").Layer(2).Top().Row(2).CaptionVisible(false).PaneBorder(false).Hide() + wxAuiPaneInfo().Name(L"ProgressPanel").Layer(2).Top().Row(2).CaptionVisible(false).PaneBorder(false).Hide(). //wxAui does not consider the progress panel's wxRAISED_BORDER and set's too small a panel height! => use correct value from wxWindow::GetSize() - .MinSize(200, compareStatus_->getAsWindow()->GetSize().GetHeight())); //bonus: minimal height isn't a bad idea anyway + MinSize(-1, compareStatus_->getAsWindow()->GetSize().GetHeight())); //bonus: minimal height isn't a bad idea anyway } auiMgr_.AddPane(m_panelDirectoryPairs, wxAuiPaneInfo().Name(L"FoldersPanel").Layer(2).Top().Row(3).Caption(_("Folder Pairs")).CaptionVisible(false).PaneBorder(false).Gripper()); auiMgr_.AddPane(m_panelSearch, - wxAuiPaneInfo().Name(L"SearchPanel").Layer(2).Bottom().Row(2).Caption(_("Find")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(200, m_bpButtonHideSearch->GetSize().GetHeight()).Hide()); + wxAuiPaneInfo().Name(L"SearchPanel").Layer(2).Bottom().Row(2).Caption(_("Find")).CaptionVisible(false).PaneBorder(false).Gripper(). + MinSize(fastFromDIP(100), m_panelSearch->GetSize().y).Hide()); + m_panelViewFilter->GetSizer()->SetSizeHints(m_panelViewFilter); //~=Fit() + SetMinSize() auiMgr_.AddPane(m_panelViewFilter, - wxAuiPaneInfo().Name(L"ViewFilterPanel").Layer(2).Bottom().Row(1).Caption(_("View Settings")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(m_bpButtonViewTypeSyncAction->GetSize().GetWidth(), m_panelViewFilter->GetSize().GetHeight())); + wxAuiPaneInfo().Name(L"ViewFilterPanel").Layer(2).Bottom().Row(1).Caption(_("View Settings")).CaptionVisible(false). + PaneBorder(false).Gripper().MinSize(fastFromDIP(100), m_panelViewFilter->GetSize().y)); + m_panelConfig->GetSizer()->SetSizeHints(m_panelConfig); //~=Fit() + SetMinSize() auiMgr_.AddPane(m_panelConfig, wxAuiPaneInfo().Name(L"ConfigPanel").Layer(3).Left().Position(1).Caption(_("Configuration")).MinSize(bSizerCfgHistoryButtons->GetSize())); auiMgr_.AddPane(m_gridOverview, - wxAuiPaneInfo().Name(L"OverviewPanel").Layer(3).Left().Position(2).Caption(_("Overview")).MinSize(300, m_gridOverview->GetSize().GetHeight())); //MinSize(): just default size, see comment below + wxAuiPaneInfo().Name(L"OverviewPanel").Layer(3).Left().Position(2).Caption(_("Overview")). + MinSize(fastFromDIP(300), m_gridOverview->GetSize().GetHeight())); //MinSize(): just default size, see comment below auiMgr_.Update(); @@ -482,7 +494,7 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, font.SetWeight(wxFONTWEIGHT_BOLD); font.SetPointSize(wxNORMAL_FONT->GetPointSize()); //= larger than the wxAuiDockArt default; looks better on OS X artProvider->SetFont(wxAUI_DOCKART_CAPTION_FONT, font); - artProvider->SetMetric(wxAUI_DOCKART_CAPTION_SIZE, font.GetPixelSize().GetHeight() + 2 + 2); + artProvider->SetMetric(wxAUI_DOCKART_CAPTION_SIZE, font.GetPixelSize().GetHeight() + fastFromDIP(2 + 2)); //- fix wxWidgets 3.1.0 insane color scheme artProvider->SetColor(wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR, wxColor(220, 220, 220)); //light grey @@ -561,23 +573,23 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, m_bitmapSmallFileRight ->SetBitmap(bmpFile); } - m_menuItemNew ->SetBitmap(getResourceImage(L"new_small")); - m_menuItemLoad ->SetBitmap(getResourceImage(L"load_small")); - m_menuItemSave ->SetBitmap(getResourceImage(L"save_small")); - m_menuItemSaveAsBatch->SetBitmap(getResourceImage(L"batch_small")); + m_menuItemNew ->SetBitmap(getResourceImage(L"file_new_sicon")); + m_menuItemLoad ->SetBitmap(getResourceImage(L"file_load_sicon")); + m_menuItemSave ->SetBitmap(getResourceImage(L"file_save_sicon")); + m_menuItemSaveAsBatch->SetBitmap(getResourceImage(L"file_batch_sicon")); - m_menuItemCompare ->SetBitmap(getResourceImage(L"compare_small")); - m_menuItemCompSettings->SetBitmap(getResourceImage(L"cfg_compare_small")); - m_menuItemFilter ->SetBitmap(getResourceImage(L"filter_small")); - m_menuItemSyncSettings->SetBitmap(getResourceImage(L"cfg_sync_small")); - m_menuItemSynchronize ->SetBitmap(getResourceImage(L"sync_small")); + m_menuItemCompare ->SetBitmap(getResourceImage(L"compare_sicon")); + m_menuItemCompSettings->SetBitmap(getResourceImage(L"cfg_compare_sicon")); + m_menuItemFilter ->SetBitmap(getResourceImage(L"cfg_filter_sicon")); + m_menuItemSyncSettings->SetBitmap(getResourceImage(L"cfg_sync_sicon")); + m_menuItemSynchronize ->SetBitmap(getResourceImage(L"file_sync_sicon")); - m_menuItemOptions ->SetBitmap(getResourceImage(L"settings_small")); - m_menuItemFind ->SetBitmap(getResourceImage(L"find_small")); + m_menuItemOptions ->SetBitmap(getResourceImage(L"settings_sicon")); + m_menuItemFind ->SetBitmap(getResourceImage(L"find_sicon")); - m_menuItemHelp ->SetBitmap(getResourceImage(L"help_small")); - m_menuItemAbout->SetBitmap(getResourceImage(L"about_small")); - m_menuItemCheckVersionNow->SetBitmap(getResourceImage(L"update_check_small")); + m_menuItemHelp ->SetBitmap(getResourceImage(L"help_sicon")); + m_menuItemAbout->SetBitmap(getResourceImage(L"about_sicon")); + m_menuItemCheckVersionNow->SetBitmap(getResourceImage(L"update_check_sicon")); //create language selection menu for (const TranslationInfo& ti : getExistingTranslations()) @@ -634,8 +646,6 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, //init handling of first folder pair firstFolderPair_ = std::make_unique(*this); - initViewFilterButtons(); - //init grid settings filegrid::init(*m_gridMainL, *m_gridMainC, *m_gridMainR); treegrid::init(*m_gridOverview); @@ -652,7 +662,7 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, m_gridOverview->getMainWin().Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onTreeButtonEvent), nullptr, this); - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::onLocalKeyEvent), nullptr, this); //drag and drop .ffs_gui and .ffs_batch on main dialog @@ -717,10 +727,10 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, std::vector folderPathsToCheck; - auto addFolderCheck = [&](const FolderPairEnh& fp) + auto addFolderCheck = [&](const LocalPairConfig& lpc) { - const AbstractPath folderPathL = createAbstractPath(fp.folderPathPhraseLeft_); - const AbstractPath folderPathR = createAbstractPath(fp.folderPathPhraseRight_); + const AbstractPath folderPathL = createAbstractPath(lpc.folderPathPhraseLeft); + const AbstractPath folderPathR = createAbstractPath(lpc.folderPathPhraseRight); if (AFS::isNullPath(folderPathL) != AFS::isNullPath(folderPathR)) //only skip check if both sides are empty! havePartialPair = true; @@ -734,8 +744,8 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, }; addFolderCheck(currMainCfg.firstPair); - for (const FolderPairEnh& fp : currMainCfg.additionalPairs) - addFolderCheck(fp); + for (const LocalPairConfig& lpc : currMainCfg.additionalPairs) + addFolderCheck(lpc); //------------------------------------------------------------------------------------------ if (havePartialPair != haveFullPair) //either all pairs full or all half-filled -> validity check! @@ -875,8 +885,11 @@ void MainDialog::setGlobalCfgOnInit(const XmlGlobalSettings& globalSettings) else Center(); } - else + else //default window size and position + { + SetClientSize(wxSize(fastFromDIP(900), fastFromDIP(550))); //=~ 900 x 600 total size Center(); + } if (globalSettings.gui.mainDlg.isMaximized) //no real need to support both maximize and full screen functions { @@ -1150,7 +1163,7 @@ std::vector MainDialog::getTreeSelection() const if (auto root = dynamic_cast(node.get())) { //selecting root means "select everything", *ignoring* current view filter! - BaseFolderPair& baseDir = root->baseFolder_; + BaseFolderPair& baseDir = root->baseFolder; std::vector dirsFilesAndLinks; @@ -1164,9 +1177,9 @@ std::vector MainDialog::getTreeSelection() const append(output, dirsFilesAndLinks); } else if (auto dir = dynamic_cast(node.get())) - output.push_back(&(dir->folder_)); + output.push_back(&(dir->folder)); else if (auto file = dynamic_cast(node.get())) - append(output, file->filesAndLinks_); + append(output, file->filesAndLinks); else assert(false); } return output; @@ -1390,8 +1403,8 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool if (selectionLeft.empty() && selectionRight.empty()) return openFolderInFileBrowser(leftSide ? - createAbstractPath(firstFolderPair_->getValues().folderPathPhraseLeft_) : - createAbstractPath(firstFolderPair_->getValues().folderPathPhraseRight_)); + createAbstractPath(firstFolderPair_->getValues().folderPathPhraseLeft) : + createAbstractPath(firstFolderPair_->getValues().folderPathPhraseRight)); //in this context either left or right selection is filled with exactly one item if (!selectionLeft.empty()) { @@ -1662,8 +1675,7 @@ void MainDialog::enableAllElements() m_panelTopButtons->Enable(); m_panelTopButtons->Layout(); - //at least wxWidgets on OS X fails to do this after enabling: - Refresh(); + Refresh(); //at least wxWidgets on OS X fails to do this after enabling: } @@ -1698,11 +1710,11 @@ void MainDialog::OnResizeConfigPanel(wxEvent& event) void MainDialog::OnResizeViewPanel(wxEvent& event) { //we need something more fancy for the statistics: - const int parentOrient = m_panelViewFilter->GetSize().GetWidth() > m_panelViewFilter->GetSize().GetHeight() ? wxHORIZONTAL : wxVERTICAL; //check window NOT sizer width! - if (bSizerViewFilter->GetOrientation() != parentOrient) + const int newOrientation = m_panelViewFilter->GetSize().GetWidth() > m_panelViewFilter->GetSize().GetHeight() ? wxHORIZONTAL : wxVERTICAL; //check window NOT sizer width! + if (bSizerViewFilter->GetOrientation() != newOrientation) { //apply opposite orientation for child sizers - const int childOrient = parentOrient == wxHORIZONTAL ? wxVERTICAL : wxHORIZONTAL; + const int childOrient = newOrientation == wxHORIZONTAL ? wxVERTICAL : wxHORIZONTAL; wxSizerItemList& sl = bSizerStatistics->GetChildren(); for (auto it = sl.begin(); it != sl.end(); ++it) //yet another wxWidgets bug keeps us from using std::for_each { @@ -1712,8 +1724,8 @@ void MainDialog::OnResizeViewPanel(wxEvent& event) sizerChild->SetOrientation(childOrient); } - bSizerStatistics->SetOrientation(parentOrient); - bSizerViewFilter->SetOrientation(parentOrient); + bSizerStatistics->SetOrientation(newOrientation); + bSizerViewFilter->SetOrientation(newOrientation); m_panelViewFilter->Layout(); m_panelStatistics->Layout(); } @@ -1995,18 +2007,18 @@ void MainDialog::onTreeGridSelection(GridSelectEvent& event) if (std::unique_ptr node = treegrid::getDataView(*m_gridOverview).getLine(event.rowFirst_)) { if (const TreeView::RootNode* root = dynamic_cast(node.get())) - leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(root->baseFolder_)); + leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(root->baseFolder)); else if (const TreeView::DirNode* dir = dynamic_cast(node.get())) { - leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(&(dir->folder_)); + leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(&(dir->folder)); if (leadRow < 0) //directory was filtered out! still on tree view (but NOT on grid view) - leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(dir->folder_)); + leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(dir->folder)); } else if (const TreeView::FilesNode* files = dynamic_cast(node.get())) { - assert(!files->filesAndLinks_.empty()); - if (!files->filesAndLinks_.empty()) - leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(files->filesAndLinks_[0]->getId()); + assert(!files->filesAndLinks.empty()); + if (!files->filesAndLinks.empty()) + leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(files->filesAndLinks[0]->getId()); } } @@ -2029,11 +2041,11 @@ void MainDialog::onTreeGridSelection(GridSelectEvent& event) if (std::unique_ptr node = treegrid::getDataView(*m_gridOverview).getLine(row)) { if (const TreeView::RootNode* root = dynamic_cast(node.get())) - markedContainer.insert(&(root->baseFolder_)); + markedContainer.insert(&(root->baseFolder)); else if (const TreeView::DirNode* dir = dynamic_cast(node.get())) - markedContainer.insert(&(dir->folder_)); + markedContainer.insert(&(dir->folder)); else if (const TreeView::FilesNode* files = dynamic_cast(node.get())) - markedFilesAndLinks.insert(files->filesAndLinks_.begin(), files->filesAndLinks_.end()); + markedFilesAndLinks.insert(files->filesAndLinks.begin(), files->filesAndLinks.end()); } filegrid::setNavigationMarker(*m_gridMainL, std::move(markedFilesAndLinks), std::move(markedContainer)); @@ -2104,8 +2116,8 @@ void MainDialog::onTreeGridContext(GridClickEvent& event) [this, &selection, include] { filterItems(selection, include); }, &getResourceImage(iconName)); } }; - addFilterMenu(_("Include via filter:"), L"filter_include_small", true); - addFilterMenu(_("Exclude via filter:"), L"filter_exclude_small", false); + addFilterMenu(_("Include via filter:"), L"filter_include_sicon", true); + addFilterMenu(_("Exclude via filter:"), L"filter_exclude_sicon", false); //---------------------------------------------------------------------------------------------------- if (!selection.empty()) @@ -2239,8 +2251,8 @@ void MainDialog::onMainGridContextRim(bool leftSide) [this, &selection, include] { filterItems(selection, include); }, &getResourceImage(iconName)); } }; - addFilterMenu(_("Include via filter:"), L"filter_include_small", true); - addFilterMenu(_("Exclude via filter:"), L"filter_exclude_small", false); + addFilterMenu(_("Include via filter:"), L"filter_include_sicon", true); + addFilterMenu(_("Exclude via filter:"), L"filter_exclude_sicon", false); //---------------------------------------------------------------------------------------------------- @@ -2611,9 +2623,9 @@ void MainDialog::OnCompSettingsContext(wxEvent& event) const wxBitmap iconGrey = greyScale(iconNormal); menu.addItem(getVariantName(cmpVar), [&setVariant, cmpVar] { setVariant(cmpVar); }, activeCmpVar == cmpVar ? &iconNormal : &iconGrey); }; - addVariantItem(CompareVariant::TIME_SIZE, L"file-time-small"); - addVariantItem(CompareVariant::CONTENT, L"file-content-small"); - addVariantItem(CompareVariant::SIZE, L"file-size-small"); + addVariantItem(CompareVariant::TIME_SIZE, L"cmp_file_time_sicon"); + addVariantItem(CompareVariant::CONTENT, L"cmp_file_content_sicon"); + addVariantItem(CompareVariant::SIZE, L"cmp_file_size_sicon"); //menu.addRadio(getVariantName(CompareVariant::TIME_SIZE), [&] { setVariant(CompareVariant::TIME_SIZE); }, activeCmpVar == CompareVariant::TIME_SIZE); //menu.addRadio(getVariantName(CompareVariant::CONTENT ), [&] { setVariant(CompareVariant::CONTENT); }, activeCmpVar == CompareVariant::CONTENT); @@ -2718,7 +2730,7 @@ void MainDialog::updateUnsavedCfgStatus() return img; }; - setImage(*m_bpButtonSave, allowSave ? getResourceImage(L"save") : makeBrightGrey(getResourceImage(L"save"))); + setImage(*m_bpButtonSave, allowSave ? getResourceImage(L"file_save") : makeBrightGrey(getResourceImage(L"file_save"))); m_bpButtonSave->Enable(allowSave); m_menuItemSave->Enable(allowSave); //bitmap is automatically greyscaled on Win7 (introducing a crappy looking shift), but not on XP @@ -3309,8 +3321,6 @@ XmlGuiConfig MainDialog::getConfig() const void MainDialog::updateGuiDelayedIf(bool condition) { - const int delay = 400; - if (condition) { filegrid::refresh(*m_gridMainL, *m_gridMainC, *m_gridMainR); @@ -3318,7 +3328,8 @@ void MainDialog::updateGuiDelayedIf(bool condition) m_gridMainC->Update(); m_gridMainR->Update(); - wxMilliSleep(delay); //some delay to show the changed GUI before removing rows from sight + //some delay to show the changed GUI before removing rows from sight + std::this_thread::sleep_for(FILE_GRID_POST_UPDATE_DELAY); } updateGui(); @@ -3327,144 +3338,120 @@ void MainDialog::updateGuiDelayedIf(bool condition) void MainDialog::showConfigDialog(SyncConfigPanel panelToShow, int localPairIndexToShow) { - std::vector folderPairConfig; - auto addPairCfg = [&](const FolderPairEnh& fp) - { - LocalPairConfig fpCfg; - fpCfg.folderPairName = getShortDisplayNameForFolderPair(createAbstractPath(fp.folderPathPhraseLeft_ ), - createAbstractPath(fp.folderPathPhraseRight_)); - fpCfg.altCmpConfig = fp.altCmpConfig; - fpCfg.altSyncConfig = fp.altSyncConfig; - fpCfg.localFilter = fp.localFilter; - folderPairConfig.push_back(fpCfg); - }; + GlobalPairConfig globalPairCfg; + globalPairCfg.cmpConfig = currentCfg_.mainCfg.cmpConfig; + globalPairCfg.syncCfg = currentCfg_.mainCfg.syncCfg; + globalPairCfg.filter = currentCfg_.mainCfg.globalFilter; + + globalPairCfg.miscCfg.ignoreErrors = currentCfg_.mainCfg.ignoreErrors; + globalPairCfg.miscCfg.automaticRetryCount = currentCfg_.mainCfg.automaticRetryCount; + globalPairCfg.miscCfg.automaticRetryDelay = currentCfg_.mainCfg.automaticRetryDelay; + globalPairCfg.miscCfg.postSyncCommand = currentCfg_.mainCfg.postSyncCommand; + globalPairCfg.miscCfg.postSyncCondition = currentCfg_.mainCfg.postSyncCondition; + globalPairCfg.miscCfg.commandHistory = globalCfg_.gui.commandHistory; //don't recalculate value but consider current screen status!!! //e.g. it's possible that the first folder pair local config is shown with all config initial if user just removed local config via mouse context menu! - const bool showLocalCfgFirstPair = m_bpButtonAltCompCfg->IsShown(); + const bool showLocalCfg = m_bpButtonLocalCompCfg->IsShown(); //harmonize with MainDialog::updateGuiForFolderPair()! - assert(m_bpButtonAltCompCfg->IsShown() == m_bpButtonAltSyncCfg->IsShown() && - m_bpButtonAltCompCfg->IsShown() == m_bpButtonLocalFilter->IsShown()); + assert(m_bpButtonLocalCompCfg->IsShown() == m_bpButtonLocalSyncCfg->IsShown() && + m_bpButtonLocalCompCfg->IsShown() == m_bpButtonLocalFilter->IsShown()); - if (showLocalCfgFirstPair) + std::vector localCfgs; + if (showLocalCfg) { - addPairCfg(firstFolderPair_->getValues()); + localCfgs.push_back(firstFolderPair_->getValues()); + for (const FolderPairPanel* panel : additionalFolderPairs_) - addPairCfg(panel->getValues()); + localCfgs.push_back(panel->getValues()); } //------------------------------------------------ - - const std::vector folderPairConfigOld = folderPairConfig; - - const CompConfig cmpCfgOld = currentCfg_.mainCfg.cmpConfig; - const SyncConfig syncCfgOld = currentCfg_.mainCfg.syncCfg; - const FilterConfig filterCfgOld = currentCfg_.mainCfg.globalFilter; - - const bool ignoreErrorsOld = currentCfg_.mainCfg.ignoreErrors; - const Zstring postSyncCommandOld = currentCfg_.mainCfg.postSyncCommand; - const PostSyncCondition postSyncConditionOld = currentCfg_.mainCfg.postSyncCondition; - const std::vector commandHistoryOld = globalCfg_.gui.commandHistory; + const GlobalPairConfig globalPairCfgOld = globalPairCfg; + const std::vector localPairCfgOld = localCfgs; if (showSyncConfigDlg(this, panelToShow, localPairIndexToShow, - folderPairConfig, + globalPairCfg, + localCfgs, + globalCfg_.gui.commandHistItemsMax) != ReturnSyncConfig::BUTTON_OKAY) + return; - currentCfg_.mainCfg.cmpConfig, - currentCfg_.mainCfg.syncCfg, - currentCfg_.mainCfg.globalFilter, + assert(localCfgs.size() == localPairCfgOld.size()); - currentCfg_.mainCfg.ignoreErrors, - currentCfg_.mainCfg.postSyncCommand, - currentCfg_.mainCfg.postSyncCondition, - globalCfg_.gui.commandHistory, - globalCfg_.gui.commandHistItemsMax) == ReturnSyncConfig::BUTTON_OKAY) - { - assert(folderPairConfig.size() == folderPairConfigOld.size()); + currentCfg_.mainCfg.cmpConfig = globalPairCfg.cmpConfig; + currentCfg_.mainCfg.syncCfg = globalPairCfg.syncCfg; + currentCfg_.mainCfg.globalFilter = globalPairCfg.filter; - if (showLocalCfgFirstPair) - { - { - auto fp = firstFolderPair_->getValues(); - fp.altCmpConfig = folderPairConfig[0].altCmpConfig; - fp.altSyncConfig = folderPairConfig[0].altSyncConfig; - fp.localFilter = folderPairConfig[0].localFilter; - firstFolderPair_->setValues(fp); - } + currentCfg_.mainCfg.ignoreErrors = globalPairCfg.miscCfg.ignoreErrors; + currentCfg_.mainCfg.automaticRetryCount = globalPairCfg.miscCfg.automaticRetryCount; + currentCfg_.mainCfg.automaticRetryDelay = globalPairCfg.miscCfg.automaticRetryDelay; + currentCfg_.mainCfg.postSyncCommand = globalPairCfg.miscCfg.postSyncCommand; + currentCfg_.mainCfg.postSyncCondition = globalPairCfg.miscCfg.postSyncCondition; + globalCfg_.gui.commandHistory = globalPairCfg.miscCfg.commandHistory; - for (size_t i = 1; i < folderPairConfig.size(); ++i) - { - auto fp = additionalFolderPairs_[i - 1]->getValues(); - fp.altCmpConfig = folderPairConfig[i].altCmpConfig; - fp.altSyncConfig = folderPairConfig[i].altSyncConfig; - fp.localFilter = folderPairConfig[i].localFilter; - additionalFolderPairs_[i - 1]->setValues(fp); - } - } + if (showLocalCfg) + { + firstFolderPair_->setValues(localCfgs[0]); - //------------------------------------------------ + for (size_t i = 1; i < localCfgs.size(); ++i) + additionalFolderPairs_[i - 1]->setValues(localCfgs[i]); + } - const bool cmpConfigChanged = currentCfg_.mainCfg.cmpConfig != cmpCfgOld || [&] - { - for (size_t i = 0; i < folderPairConfig.size(); ++i) - { - if ((folderPairConfig[i].altCmpConfig.get() == nullptr) != (folderPairConfigOld[i].altCmpConfig.get() == nullptr)) - return true; - if (folderPairConfig[i].altCmpConfig.get()) - if (*folderPairConfig[i].altCmpConfig != *folderPairConfigOld[i].altCmpConfig) - return true; - } - return false; - }(); + //------------------------------------------------ - const bool syncConfigChanged = currentCfg_.mainCfg.syncCfg != syncCfgOld || [&] - { - for (size_t i = 0; i < folderPairConfig.size(); ++i) - { - if ((folderPairConfig[i].altSyncConfig.get() == nullptr) != (folderPairConfigOld[i].altSyncConfig.get() == nullptr)) - return true; - if (folderPairConfig[i].altSyncConfig.get()) - if (*folderPairConfig[i].altSyncConfig != *folderPairConfigOld[i].altSyncConfig) - return true; - } - return false; - }(); + const bool cmpConfigChanged = globalPairCfg.cmpConfig != globalPairCfgOld.cmpConfig || [&] + { + for (size_t i = 0; i < localCfgs.size(); ++i) + if (localCfgs[i].localCmpCfg != localPairCfgOld[i].localCmpCfg) + return true; + return false; + }(); - const bool filterConfigChanged = currentCfg_.mainCfg.globalFilter != filterCfgOld || [&] - { - for (size_t i = 0; i < folderPairConfig.size(); ++i) - if (folderPairConfig[i].localFilter != folderPairConfigOld[i].localFilter) - return true; - return false; - }(); + const bool syncConfigChanged = globalPairCfg.syncCfg != globalPairCfgOld.syncCfg || [&] + { + for (size_t i = 0; i < localCfgs.size(); ++i) + if (localCfgs[i].localSyncCfg != localPairCfgOld[i].localSyncCfg) + return true; + return false; + }(); - const bool miscConfigChanged = currentCfg_.mainCfg.ignoreErrors != ignoreErrorsOld || - currentCfg_.mainCfg.postSyncCommand != postSyncCommandOld || - currentCfg_.mainCfg.postSyncCondition != postSyncConditionOld; - //globalCfg.gui.commandHistory != commandHistoryOld; + const bool filterConfigChanged = globalPairCfg.filter != globalPairCfgOld.filter || [&] + { + for (size_t i = 0; i < localCfgs.size(); ++i) + if (localCfgs[i].localFilter != localPairCfgOld[i].localFilter) + return true; + return false; + }(); - //------------------------------------------------ + const bool miscConfigChanged = globalPairCfg.miscCfg.ignoreErrors != globalPairCfgOld.miscCfg.ignoreErrors || + globalPairCfg.miscCfg.automaticRetryCount != globalPairCfgOld.miscCfg.automaticRetryCount || + globalPairCfg.miscCfg.automaticRetryDelay != globalPairCfgOld.miscCfg.automaticRetryDelay || + globalPairCfg.miscCfg.postSyncCommand != globalPairCfgOld.miscCfg.postSyncCommand || + globalPairCfg.miscCfg.postSyncCondition != globalPairCfgOld.miscCfg.postSyncCondition; + //globalPairCfg.miscCfg.commandHistory != globalPairCfgOld.miscCfg.commandHistory; - if (cmpConfigChanged) - { - const bool setDefaultViewType = currentCfg_.mainCfg.cmpConfig.compareVar != cmpCfgOld.compareVar; - applyCompareConfig(setDefaultViewType); - } + //------------------------------------------------ - if (syncConfigChanged) - applySyncConfig(); + if (cmpConfigChanged) + { + const bool setDefaultViewType = globalPairCfg.cmpConfig.compareVar != globalPairCfgOld.cmpConfig.compareVar; + applyCompareConfig(setDefaultViewType); + } - if (filterConfigChanged) - { - updateGlobalFilterButton(); //refresh global filter icon - applyFilterConfig(); //re-apply filter - } + if (syncConfigChanged) + applySyncConfig(); - if (miscConfigChanged) - updateUnsavedCfgStatus(); //usually included by: updateGui(); + if (filterConfigChanged) + { + updateGlobalFilterButton(); //refresh global filter icon + applyFilterConfig(); //re-apply filter } + + if (miscConfigChanged) + updateUnsavedCfgStatus(); //usually included by: updateGui(); } @@ -3518,19 +3505,24 @@ void MainDialog::OnToggleViewButton(wxCommandEvent& event) inline -wxBitmap buttonPressed(const std::string& name) +wxBitmap buttonPressed(const wchar_t* name) { - wxBitmap background = getResourceImage(L"buttonPressed"); - return mirrorIfRtl(layOver(background, getResourceImage(utfTo(name)))); + wxBitmap background = getResourceImage(L"button_pressed"); + return mirrorIfRtl(layOver(background, getResourceImage(name))); } inline -wxBitmap buttonReleased(const std::string& name) +wxBitmap buttonReleased(const wchar_t* name) { - wxImage output = getResourceImage(utfTo(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally! + wxImage output = getResourceImage(name).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally! //moveImage(output, 1, 0); //move image right one pixel + //enlarge (needed for m_bpButtonShowExcluded) + const wxSize diff = getResourceImage(L"button_pressed").GetSize() - output.GetSize(); + if (diff != wxSize()) + output.Resize(diff + output.GetSize(), wxPoint(diff.x, diff.y) / 2); + brighten(output, 80); return mirrorIfRtl(output); } @@ -3538,30 +3530,31 @@ wxBitmap buttonReleased(const std::string& name) void MainDialog::initViewFilterButtons() { - m_bpButtonViewTypeSyncAction->init(getResourceImage(L"viewtype_sync_action"), getResourceImage(L"viewtype_cmp_result")); + m_bpButtonViewTypeSyncAction->init(mirrorIfRtl(getResourceImage(L"viewtype_sync_action")), + mirrorIfRtl(getResourceImage(L"viewtype_cmp_result"))); //tooltip is updated dynamically in setViewTypeSyncAction() - auto initButton = [](ToggleButton& btn, const char* imgName, const wxString& tooltip) { btn.init(buttonPressed(imgName), buttonReleased(imgName)); btn.SetToolTip(tooltip); }; + auto initButton = [](ToggleButton& btn, const wchar_t* imgName, const wxString& tooltip) { btn.init(buttonPressed(imgName), buttonReleased(imgName)); btn.SetToolTip(tooltip); }; //compare result buttons - initButton(*m_bpButtonShowLeftOnly, "cat_left_only", _("Show files that exist on left side only")); - initButton(*m_bpButtonShowRightOnly, "cat_right_only", _("Show files that exist on right side only")); - initButton(*m_bpButtonShowLeftNewer, "cat_left_newer", _("Show files that are newer on left")); - initButton(*m_bpButtonShowRightNewer, "cat_right_newer", _("Show files that are newer on right")); - initButton(*m_bpButtonShowEqual, "cat_equal", _("Show files that are equal")); - initButton(*m_bpButtonShowDifferent, "cat_different", _("Show files that are different")); - initButton(*m_bpButtonShowConflict, "cat_conflict", _("Show conflicts")); + initButton(*m_bpButtonShowLeftOnly, L"cat_left_only", _("Show files that exist on left side only")); + initButton(*m_bpButtonShowRightOnly, L"cat_right_only", _("Show files that exist on right side only")); + initButton(*m_bpButtonShowLeftNewer, L"cat_left_newer", _("Show files that are newer on left")); + initButton(*m_bpButtonShowRightNewer, L"cat_right_newer", _("Show files that are newer on right")); + initButton(*m_bpButtonShowEqual, L"cat_equal", _("Show files that are equal")); + initButton(*m_bpButtonShowDifferent, L"cat_different", _("Show files that are different")); + initButton(*m_bpButtonShowConflict, L"cat_conflict", _("Show conflicts")); //sync preview buttons - initButton(*m_bpButtonShowCreateLeft, "so_create_left", _("Show files that will be created on the left side")); - initButton(*m_bpButtonShowCreateRight, "so_create_right", _("Show files that will be created on the right side")); - initButton(*m_bpButtonShowDeleteLeft, "so_delete_left", _("Show files that will be deleted on the left side")); - initButton(*m_bpButtonShowDeleteRight, "so_delete_right", _("Show files that will be deleted on the right side")); - initButton(*m_bpButtonShowUpdateLeft, "so_update_left", _("Show files that will be updated on the left side")); - initButton(*m_bpButtonShowUpdateRight, "so_update_right", _("Show files that will be updated on the right side")); - initButton(*m_bpButtonShowDoNothing, "so_none", _("Show files that won't be copied")); + initButton(*m_bpButtonShowCreateLeft, L"so_create_left", _("Show files that will be created on the left side")); + initButton(*m_bpButtonShowCreateRight, L"so_create_right", _("Show files that will be created on the right side")); + initButton(*m_bpButtonShowDeleteLeft, L"so_delete_left", _("Show files that will be deleted on the left side")); + initButton(*m_bpButtonShowDeleteRight, L"so_delete_right", _("Show files that will be deleted on the right side")); + initButton(*m_bpButtonShowUpdateLeft, L"so_update_left", _("Show files that will be updated on the left side")); + initButton(*m_bpButtonShowUpdateRight, L"so_update_right", _("Show files that will be updated on the right side")); + initButton(*m_bpButtonShowDoNothing, L"so_none", _("Show files that won't be copied")); - initButton(*m_bpButtonShowExcluded, "checkbox_false", _("Show filtered or temporarily excluded files")); + initButton(*m_bpButtonShowExcluded, L"checkbox_false", _("Show filtered or temporarily excluded files")); } @@ -3632,12 +3625,12 @@ void MainDialog::updateGlobalFilterButton() std::wstring status; if (!isNullFilter(currentCfg_.mainCfg.globalFilter)) { - setImage(*m_bpButtonFilter, getResourceImage(L"filter")); + setImage(*m_bpButtonFilter, getResourceImage(L"cfg_filter")); status = _("Active"); } else { - setImage(*m_bpButtonFilter, greyScale(getResourceImage(L"filter"))); + setImage(*m_bpButtonFilter, greyScale(getResourceImage(L"cfg_filter"))); status = _("None"); } @@ -3741,8 +3734,8 @@ void MainDialog::updateGui() updateUnsavedCfgStatus(); - updateTopButton(*m_buttonCompare, getResourceImage(L"compare"), getConfig().mainCfg.getCompVariantName(), false /*makeGrey*/); - updateTopButton(*m_buttonSync, getResourceImage(L"sync"), getConfig().mainCfg.getSyncVariantName(), folderCmp_.empty()); + updateTopButton(*m_buttonCompare, getResourceImage(L"compare"), getCompVariantName(getConfig().mainCfg), false /*makeGrey*/); + updateTopButton(*m_buttonSync, getResourceImage(L"file_sync"), getSyncVariantName(getConfig().mainCfg), folderCmp_.empty()); m_panelTopButtons->Layout(); m_menuItemExportList->Enable(!folderCmp_.empty()); //a CSV without even folder names confuses users: https://www.freefilesync.org/forum/viewtopic.php?t=4787 @@ -3792,13 +3785,13 @@ void MainDialog::updateStatistics() //update preview of item count and bytes to be transferred: const SyncStatistics st(folderCmp_); - setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data"); - setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_small"); - setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_small"); - setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_small"); - setIntValue(*m_staticTextCreateRight, st.createCount(), *m_bitmapCreateRight, L"so_create_right_small"); - setIntValue(*m_staticTextUpdateRight, st.updateCount(), *m_bitmapUpdateRight, L"so_update_right_small"); - setIntValue(*m_staticTextDeleteRight, st.deleteCount(), *m_bitmapDeleteRight, L"so_delete_right_small"); + setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data"); + setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_sicon"); + setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_sicon"); + setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_sicon"); + setIntValue(*m_staticTextCreateRight, st.createCount(), *m_bitmapCreateRight, L"so_create_right_sicon"); + setIntValue(*m_staticTextUpdateRight, st.updateCount(), *m_bitmapUpdateRight, L"so_update_right_sicon"); + setIntValue(*m_staticTextDeleteRight, st.deleteCount(), *m_bitmapDeleteRight, L"so_delete_right_sicon"); m_panelStatistics->Layout(); m_panelStatistics->Refresh(); //fix small mess up on RTL layout @@ -3843,7 +3836,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event) bool dontShowAgain = false; if (showSyncConfirmationDlg(this, - getConfig().mainCfg.getSyncVariantName(), + getSyncVariantName(getConfig().mainCfg), SyncStatistics(folderCmp_), dontShowAgain) != ReturnSmallDlg::BUTTON_OKAY) return; @@ -3868,9 +3861,9 @@ void MainDialog::OnStartSync(wxCommandEvent& event) StatusHandlerFloatingDialog statusHandler(this, //throw AbortProcess syncStartTime, globalCfg_.lastSyncsLogFileSizeMax, - currentCfg_.mainCfg.ignoreErrors, - globalCfg_.automaticRetryCount, - globalCfg_.automaticRetryDelay, + guiCfg.mainCfg.ignoreErrors, + guiCfg.mainCfg.automaticRetryCount, + guiCfg.mainCfg.automaticRetryDelay, extractJobName(activeCfgFilePath), globalCfg_.soundFileSyncFinished, guiCfg.mainCfg.postSyncCommand, @@ -4017,15 +4010,15 @@ void MainDialog::onGridLabelLeftClickC(GridLabelClickEvent& event) void MainDialog::OnSwapSides(wxCommandEvent& event) { //swap directory names: - FolderPairEnh fp1st = firstFolderPair_->getValues(); - std::swap(fp1st.folderPathPhraseLeft_, fp1st.folderPathPhraseRight_); - firstFolderPair_->setValues(fp1st); + LocalPairConfig lpc1st = firstFolderPair_->getValues(); + std::swap(lpc1st.folderPathPhraseLeft, lpc1st.folderPathPhraseRight); + firstFolderPair_->setValues(lpc1st); for (FolderPairPanel* panel : additionalFolderPairs_) { - FolderPairEnh fp = panel->getValues(); - std::swap(fp.folderPathPhraseLeft_, fp.folderPathPhraseRight_); - panel->setValues(fp); + LocalPairConfig lpc = panel->getValues(); + std::swap(lpc.folderPathPhraseLeft, lpc.folderPathPhraseRight); + panel->setValues(lpc); } //swap view filter @@ -4347,7 +4340,7 @@ void MainDialog::startFindNext(bool searchAscending) //F3 or ENTER in m_textCtrl void MainDialog::OnTopFolderPairAdd(wxCommandEvent& event) { - insertAddFolderPair({ FolderPairEnh() }, 0); + insertAddFolderPair({ LocalPairConfig() }, 0); moveAddFolderPairUp(0); } @@ -4368,7 +4361,7 @@ void MainDialog::OnLocalCompCfg(wxCommandEvent& event) { const wxObject* const eventObj = event.GetEventObject(); //find folder pair originating the event for (auto it = additionalFolderPairs_.begin(); it != additionalFolderPairs_.end(); ++it) - if (eventObj == (*it)->m_bpButtonAltCompCfg) + if (eventObj == (*it)->m_bpButtonLocalCompCfg) { showConfigDialog(SyncConfigPanel::COMPARISON, (it - additionalFolderPairs_.begin()) + 1); break; @@ -4380,7 +4373,7 @@ void MainDialog::OnLocalSyncCfg(wxCommandEvent& event) { const wxObject* const eventObj = event.GetEventObject(); //find folder pair originating the event for (auto it = additionalFolderPairs_.begin(); it != additionalFolderPairs_.end(); ++it) - if (eventObj == (*it)->m_bpButtonAltSyncCfg) + if (eventObj == (*it)->m_bpButtonLocalSyncCfg) { showConfigDialog(SyncConfigPanel::SYNC, (it - additionalFolderPairs_.begin()) + 1); break; @@ -4423,10 +4416,10 @@ void MainDialog::OnShowFolderPairOptions(wxEvent& event) const ptrdiff_t pos = it - additionalFolderPairs_.begin(); ContextMenu menu; - menu.addItem(_("Add folder pair"), [this, pos] { insertAddFolderPair({ FolderPairEnh() }, pos); }, &getResourceImage(L"item_add_small")); + menu.addItem(_("Add folder pair"), [this, pos] { insertAddFolderPair({ LocalPairConfig() }, pos); }, &getResourceImage(L"item_add_sicon")); menu.addSeparator(); - menu.addItem(_("Move up" ) + L"\tAlt+Page Up", [this, pos] { moveAddFolderPairUp(pos); }, &getResourceImage(L"move_up_small")); - menu.addItem(_("Move down") + L"\tAlt+Page Down", [this, pos] { moveAddFolderPairUp(pos + 1); }, &getResourceImage(L"move_down_small"), pos + 1 < makeSigned(additionalFolderPairs_.size())); + menu.addItem(_("Move up" ) + L"\tAlt+Page Up", [this, pos] { moveAddFolderPairUp(pos); }, &getResourceImage(L"move_up_sicon")); + menu.addItem(_("Move down") + L"\tAlt+Page Down", [this, pos] { moveAddFolderPairUp(pos + 1); }, &getResourceImage(L"move_down_sicon"), pos + 1 < makeSigned(additionalFolderPairs_.size())); wxPoint ctxPos = (*it)->m_bpButtonFolderPairOptions->GetPosition(); ctxPos.x += (*it)->m_bpButtonFolderPairOptions->GetSize().GetWidth(); @@ -4509,14 +4502,14 @@ void MainDialog::updateGuiForFolderPair() m_panelTopLeft->Layout(); //adapt local filter and sync cfg for first folder pair - const bool showLocalCfgFirstPair = !additionalFolderPairs_.empty() || - firstFolderPair_->getAltCompConfig().get() != nullptr || - firstFolderPair_->getAltSyncConfig().get() != nullptr || - !isNullFilter(firstFolderPair_->getAltFilterConfig()); + const bool showLocalCfgFirstPair = !additionalFolderPairs_.empty() || + firstFolderPair_->getCompConfig() || + firstFolderPair_->getSyncConfig() || + !isNullFilter(firstFolderPair_->getFilterConfig()); //harmonize with MainDialog::showConfigDialog()! - m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair); - m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair); + m_bpButtonLocalCompCfg ->Show(showLocalCfgFirstPair); + m_bpButtonLocalSyncCfg ->Show(showLocalCfgFirstPair); m_bpButtonLocalFilter->Show(showLocalCfgFirstPair); setImage(*m_bpButtonSwapSides, getResourceImage(showLocalCfgFirstPair ? L"swap_slim" : L"swap")); @@ -4558,7 +4551,7 @@ void MainDialog::updateGuiForFolderPair() } -void MainDialog::insertAddFolderPair(const std::vector& newPairs, size_t pos) +void MainDialog::insertAddFolderPair(const std::vector& newPairs, size_t pos) { assert(pos <= additionalFolderPairs_.size() && additionalFolderPairs_.size() == bSizerAddFolderPairs->GetItemCount()); pos = std::min(pos, additionalFolderPairs_.size()); @@ -4575,8 +4568,8 @@ void MainDialog::insertAddFolderPair(const std::vector& newPairs, const int width = m_panelTopLeft->GetSize().GetWidth(); newPair->m_panelLeft->SetMinSize(wxSize(width, -1)); - bSizerAddFolderPairs->Insert(pos, newPair, 0, wxEXPAND); - additionalFolderPairs_.insert(additionalFolderPairs_.begin() + pos, newPair); + bSizerAddFolderPairs->Insert(pos + i, newPair, 0, wxEXPAND); + additionalFolderPairs_.insert(additionalFolderPairs_.begin() + pos + i, newPair); //register events newPair->m_bpButtonFolderPairOptions->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxEventHandler(MainDialog::OnShowFolderPairOptions), nullptr, this); @@ -4584,17 +4577,20 @@ void MainDialog::insertAddFolderPair(const std::vector& newPairs, newPair->m_bpButtonRemovePair ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolderPair ), nullptr, this); static_cast(newPair)->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::onAddFolderPairKeyEvent), nullptr, this); - newPair->m_bpButtonAltCompCfg ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalCompCfg ), nullptr, this); - newPair->m_bpButtonAltSyncCfg ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalSyncCfg ), nullptr, this); - newPair->m_bpButtonLocalFilter->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalFilterCfg), nullptr, this); + newPair->m_bpButtonLocalCompCfg->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalCompCfg ), nullptr, this); + newPair->m_bpButtonLocalSyncCfg->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalSyncCfg ), nullptr, this); + newPair->m_bpButtonLocalFilter ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalFilterCfg), nullptr, this); + + //important: make sure panel has proper default height! + newPair->GetSizer()->SetSizeHints(newPair); //~=Fit() + SetMinSize() + + //wxComboBox screws up miserably if width/height is smaller than the magic number 4! Problem occurs when trying to set tooltip + //so we have to update window sizes before setting configuration: + newPair->setValues(newPairs[i]); } updateGuiForFolderPair(); - //wxComboBox screws up miserably if width/height is smaller than the magic number 4! Problem occurs when trying to set tooltip - //so we have to update window sizes before setting configuration: - for (auto it = newPairs.begin(); it != newPairs.end(); ++it)//set alternate configuration - additionalFolderPairs_[pos + (it - newPairs.begin())]->setValues(*it); clearGrid(); //+ GUI update } @@ -4604,7 +4600,7 @@ void MainDialog::moveAddFolderPairUp(size_t pos) assert(pos < additionalFolderPairs_.size()); if (pos < additionalFolderPairs_.size()) { - const FolderPairEnh cfgTmp = additionalFolderPairs_[pos]->getValues(); + const LocalPairConfig cfgTmp = additionalFolderPairs_[pos]->getValues(); if (pos == 0) { additionalFolderPairs_[pos]->setValues(firstFolderPair_->getValues()); @@ -4648,7 +4644,7 @@ void MainDialog::removeAddFolderPair(size_t pos) } -void MainDialog::setAddFolderPairs(const std::vector& newPairs) +void MainDialog::setAddFolderPairs(const std::vector& newPairs) { additionalFolderPairs_.clear(); @@ -4862,8 +4858,8 @@ void MainDialog::OnLayoutWindowAsync(wxIdleEvent& event) for (FolderPairPanel* panel : additionalFolderPairs_) panel->Layout(); - m_panelTopButtons->Layout(); Layout(); //strangely this layout call works if called in next idle event only + m_panelTopButtons->Layout(); auiMgr_.Update(); //fix view filter distortion } diff --git a/FreeFileSync/Source/ui/main_dlg.h b/FreeFileSync/Source/ui/main_dlg.h index 646bfd58..40496410 100755 --- a/FreeFileSync/Source/ui/main_dlg.h +++ b/FreeFileSync/Source/ui/main_dlg.h @@ -92,10 +92,10 @@ private: void cfgHistoryRemoveObsolete(const std::vector& filepaths); - void insertAddFolderPair(const std::vector& newPairs, size_t pos); + void insertAddFolderPair(const std::vector& newPairs, size_t pos); void moveAddFolderPairUp(size_t pos); void removeAddFolderPair(size_t pos); - void setAddFolderPairs(const std::vector& newPairs); + void setAddFolderPairs(const std::vector& newPairs); void updateGuiForFolderPair(); //helper method: add usability by showing/hiding buttons related to folder pairs diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp index 10e9664b..dcb9539c 100755 --- a/FreeFileSync/Source/ui/progress_indicator.cpp +++ b/FreeFileSync/Source/ui/progress_indicator.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "gui_generated.h" #include "../lib/ffs_paths.h" #include "../lib/perf_check.h" @@ -46,6 +47,10 @@ namespace //window size used for statistics const std::chrono::seconds WINDOW_REMAINING_TIME(60); //USB memory stick scenario can have drop outs of 40 seconds => 60 sec. window size handles it const std::chrono::seconds WINDOW_BYTES_PER_SEC (5); // +const std::chrono::milliseconds SPEED_ESTIMATE_UPDATE_INTERVAL(500); +const std::chrono::seconds SPEED_ESTIMATE_SAMPLE_INTERVAL(1); + +const size_t PROGRESS_GRAPH_SAMPLE_SIZE_MAX = 2500000; //sizeof(single node) worst case ~ 3 * 8 byte ptr + 16 byte key/value = 40 byte inline wxColor getColorGridLine() { return { 192, 192, 192 }; } //light grey @@ -144,7 +149,7 @@ std::wstring getDialogPhaseText(const Statistics* syncStat, bool paused, SyncPro case SyncProgressDialog::RESULT_FINISHED_WITH_WARNINGS: return _("Completed with warnings"); case SyncProgressDialog::RESULT_FINISHED_WITH_SUCCESS: - return _("Completed"); + return _("Completed successfully"); } return std::wstring(); } @@ -199,17 +204,17 @@ class CompareProgressDialog::Impl : public CompareProgressDlgGenerated public: Impl(wxFrame& parentWindow); - void init(const Statistics& syncStat, bool ignoreErrors); //constructor/destructor semantics, but underlying Window is reused - void teardown(); // + void init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount); //constructor/destructor semantics, but underlying Window is reused + void teardown(); // void initNewPhase(); void updateProgressGui(); - bool getOptionIgnoreErrors() const { return m_checkBoxIgnoreErrors->GetValue(); } - void setOptionIgnoreErrors(bool ignoreErrors) { m_checkBoxIgnoreErrors->SetValue(ignoreErrors); updateStaticGui(); } + bool getOptionIgnoreErrors() const { return ignoreErrors_; } + void setOptionIgnoreErrors(bool ignoreErrors) { ignoreErrors_ = ignoreErrors; updateStaticGui(); } private: - void OnToggleIgnoreErrors(wxCommandEvent& event) override { updateStaticGui(); } + //void OnToggleIgnoreErrors(wxCommandEvent& event) override { updateStaticGui(); } void updateStaticGui(); @@ -229,6 +234,8 @@ private: std::shared_ptr curveDataBytes_{ std::make_shared(true /*drawTop*/) }; std::shared_ptr curveDataItems_{ std::make_shared(false /*drawTop*/) }; + + bool ignoreErrors_ = false; }; @@ -236,6 +243,9 @@ CompareProgressDialog::Impl::Impl(wxFrame& parentWindow) : CompareProgressDlgGenerated(&parentWindow), parentWindow_(parentWindow) { + m_bitmapIgnoreErrors->SetBitmap(getResourceImage(L"error_ignore_active")); + m_bitmapRetryErrors ->SetBitmap(getResourceImage(L"error_retry")); + //make sure that standard height matches PHASE_COMPARING_CONTENT statistics layout m_staticTextItemsFoundLabel->Hide(); m_staticTextItemsFound ->Hide(); @@ -252,15 +262,15 @@ CompareProgressDialog::Impl::Impl(wxFrame& parentWindow) : m_panelProgressGraph->addCurve(std::make_shared(), Graph2D::CurveAttributes().setLineWidth(1).setColor(Graph2D::getBorderColor())); - m_panelStatistics->Layout(); Layout(); + m_panelStatistics->Layout(); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! } -void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreErrors) +void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount) { syncStat_ = &syncStat; parentTitleBackup_ = parentWindow_.GetTitle(); @@ -287,14 +297,17 @@ void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreEr m_staticTextTimeRemainingLabel->Hide(); m_staticTextTimeRemaining ->Hide(); + setText(*m_staticTextRetryCount, std::wstring(L"(") + formatNumber(automaticRetryCount) + MULT_SIGN + L")"); + bSizerErrorsRetry->Show(automaticRetryCount > 0); + //allow changing a few options dynamically during sync - m_checkBoxIgnoreErrors->SetValue(ignoreErrors); + ignoreErrors_ = ignoreErrors; updateStaticGui(); updateProgressGui(); - m_panelStatistics->Layout(); Layout(); + m_panelStatistics->Layout(); } @@ -335,8 +348,8 @@ void CompareProgressDialog::Impl::initNewPhase() m_staticTextTimeRemainingLabel->Show(); m_staticTextTimeRemaining ->Show(); - m_panelStatistics->Layout(); Layout(); + m_panelStatistics->Layout(); break; } @@ -346,7 +359,8 @@ void CompareProgressDialog::Impl::initNewPhase() void CompareProgressDialog::Impl::updateStaticGui() { - m_bitmapIgnoreErrors->SetBitmap(getResourceImage(m_checkBoxIgnoreErrors->GetValue() ? L"msg_error_medium_ignored" : L"msg_error_medium")); + bSizerErrorsIgnore->Show(ignoreErrors_); + Layout(); } @@ -417,11 +431,11 @@ void CompareProgressDialog::Impl::updateProgressGui() //remaining time and speed: only visible during binary comparison assert(perf_); if (perf_) - if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= std::chrono::milliseconds(500)) + if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= SPEED_ESTIMATE_UPDATE_INTERVAL) { timeLastSpeedEstimate_ = timeElapsed; - if (numeric::dist(binCompStart_, timeElapsed) >= std::chrono::seconds(1)) //discard stats for first second: probably messy + if (numeric::dist(binCompStart_, timeElapsed) >= SPEED_ESTIMATE_SAMPLE_INTERVAL) //discard stats for first second: probably messy perf_->addSample(timeElapsed, itemsCurrent, bytesCurrent); //current speed -> Win 7 copy uses 1 sec update interval instead @@ -450,8 +464,8 @@ void CompareProgressDialog::Impl::updateProgressGui() if (layoutChanged) { - m_panelStatistics->Layout(); Layout(); + m_panelStatistics->Layout(); } //do the ui update @@ -463,7 +477,7 @@ void CompareProgressDialog::Impl::updateProgressGui() //redirect to implementation CompareProgressDialog::CompareProgressDialog(wxFrame& parentWindow) : pimpl_(new Impl(parentWindow)) {} //owned by parentWindow wxWindow* CompareProgressDialog::getAsWindow() { return pimpl_; } -void CompareProgressDialog::init(const Statistics& syncStat, bool ignoreErrors) { pimpl_->init(syncStat, ignoreErrors); } +void CompareProgressDialog::init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount) { pimpl_->init(syncStat, ignoreErrors, automaticRetryCount); } void CompareProgressDialog::teardown() { pimpl_->teardown(); } void CompareProgressDialog::initNewPhase() { pimpl_->initNewPhase(); } void CompareProgressDialog::updateGui() { pimpl_->updateProgressGui(); } @@ -474,21 +488,10 @@ void CompareProgressDialog::setOptionIgnoreErrors(bool ignoreErrors) { pimpl_->s namespace { -//pretty much the same like "bool wxWindowBase::IsDescendant(wxWindowBase* child) const" but without the obvious misnomer -inline -bool isComponentOf(const wxWindow* child, const wxWindow* top) -{ - for (const wxWindow* wnd = child; wnd != nullptr; wnd = wnd->GetParent()) - if (wnd == top) - return true; - return false; -} - - inline wxBitmap getImageButtonPressed(const wchar_t* name) { - return layOver(getResourceImage(L"log button pressed"), getResourceImage(name)); + return layOver(getResourceImage(L"msg_button_pressed"), getResourceImage(name)); } @@ -684,21 +687,21 @@ public: switch (entry->type) { case MSG_TYPE_INFO: - drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_info_small"), rectTmp, wxALIGN_CENTER); + drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_info_sicon"), rectTmp, wxALIGN_CENTER); break; case MSG_TYPE_WARNING: - drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_warning_small"), rectTmp, wxALIGN_CENTER); + drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_warning_sicon"), rectTmp, wxALIGN_CENTER); break; case MSG_TYPE_ERROR: case MSG_TYPE_FATAL_ERROR: - drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_error_small"), rectTmp, wxALIGN_CENTER); + drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_error_sicon"), rectTmp, wxALIGN_CENTER); break; } break; case ColumnTypeMsg::TEXT: - rectTmp.x += COLUMN_GAP_LEFT; - rectTmp.width -= COLUMN_GAP_LEFT; + rectTmp.x += getColumnGapLeft(); + rectTmp.width -= getColumnGapLeft(); drawCellText(dc, rectTmp, getValue(row, colType)); break; } @@ -712,13 +715,13 @@ public: switch (static_cast(colType)) { case ColumnTypeMsg::TIME: - return 2 * COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); + return 2 * getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth(); case ColumnTypeMsg::CATEGORY: - return getResourceImage(L"msg_info_small").GetWidth(); + return getResourceImage(L"msg_info_sicon").GetWidth(); case ColumnTypeMsg::TEXT: - return COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); + return getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth(); } return 0; } @@ -727,17 +730,17 @@ public: { wxClientDC dc(&grid.getMainWin()); dc.SetFont(grid.getMainWin().GetFont()); - return 2 * COLUMN_GAP_LEFT + dc.GetTextExtent(formatTime(FORMAT_TIME)).GetWidth(); + return 2 * getColumnGapLeft() + dc.GetTextExtent(formatTime(FORMAT_TIME)).GetWidth(); } static int getColumnCategoryDefaultWidth() { - return getResourceImage(L"msg_info_small").GetWidth(); + return getResourceImage(L"msg_info_sicon").GetWidth(); } static int getRowDefaultHeight(const Grid& grid) { - return std::max(getResourceImage(L"msg_info_small").GetHeight(), grid.getMainWin().GetCharHeight() + 2) + 1; //+ some space + bottom border + return std::max(getResourceImage(L"msg_info_sicon").GetHeight(), grid.getMainWin().GetCharHeight() + fastFromDIP(2)) + 1; //+ some space + bottom border } std::wstring getToolTip(size_t row, ColumnType colType) const override @@ -810,7 +813,7 @@ public: m_gridMessages->Connect(EVENT_GRID_MOUSE_RIGHT_UP, GridClickEventHandler(LogPanel::onMsgGridContext), nullptr, this); - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(LogPanel::onLocalKeyEvent), nullptr, this); updateGrid(); @@ -1033,7 +1036,7 @@ public: //documentation differs about whether "hint" should be before or after the to be inserted element! //however "std::map<>::end()" is interpreted correctly by GCC and VS2010 - if (samples_.size() > MAX_BUFFER_SIZE) //limit buffer size + if (samples_.size() > PROGRESS_GRAPH_SAMPLE_SIZE_MAX) //limit buffer size samples_.erase(samples_.begin()); } @@ -1091,8 +1094,6 @@ private: return CurvePoint(std::chrono::duration(it->first).count(), it->second); } - static const size_t MAX_BUFFER_SIZE = 2500000; //sizeof(single node) worst case ~ 3 * 8 byte ptr + 16 byte key/value = 40 byte - std::map samples_; //[!] don't use std::multimap, see getLessEq() std::pair lastSample_; //artificial most current record at the end of samples to visualize current time! }; @@ -1220,6 +1221,7 @@ struct LabelFormatterTimeElapsed : public LabelFormatter { if (!drawLabel_) return wxString(); + return timeElapsed < 60 ? wxString(_P("1 sec", "%x sec", numeric::round(timeElapsed))) : timeElapsed < 3600 ? @@ -1253,6 +1255,7 @@ public: const wxString& jobName, const Zstring& soundFileSyncComplete, bool ignoreErrors, + size_t automaticRetryCount, PostSyncAction2 postSyncAction); ~SyncProgressDialogImpl() override; @@ -1267,8 +1270,8 @@ public: void notifyProgressChange() override; void updateGui () override { updateProgressGui(true /*allowYield*/); } - bool getOptionIgnoreErrors() const override { return pnl_.m_checkBoxIgnoreErrors->GetValue(); } - void setOptionIgnoreErrors(bool ignoreErrors) override { pnl_.m_checkBoxIgnoreErrors->SetValue(ignoreErrors); updateStaticGui(); } + bool getOptionIgnoreErrors() const override { return ignoreErrors_; } + void setOptionIgnoreErrors(bool ignoreErrors) override { ignoreErrors_ = ignoreErrors; updateStaticGui(); } PostSyncAction2 getOptionPostSyncAction() const override { return getEnumVal(enumPostSyncAction_, *pnl_.m_choicePostSyncAction); } bool getOptionAutoCloseDialog() const override { return pnl_.m_checkBoxAutoClose->GetValue(); } @@ -1294,7 +1297,7 @@ private: void OnClose (wxCloseEvent& event); void OnIconize(wxIconizeEvent& event); void OnMinimizeToTray(wxCommandEvent& event) { minimizeToTray(); } - void OnToggleIgnoreErrors(wxCommandEvent& event) { updateStaticGui(); } + //void OnToggleIgnoreErrors(wxCommandEvent& event) { updateStaticGui(); } void minimizeToTray(); void resumeFromSystray(); @@ -1314,12 +1317,13 @@ private: std::function notifyWindowTerminate_; //call once in OnClose(), NOT in destructor which is called far too late somewhere in wxWidgets main loop! - bool wereDead_ = false; //set after wxWindow::Delete(), which equals "delete this" on OS X! - //status variables const Statistics* syncStat_; // AbortCallback* abortCb_; //valid only while sync is running - bool paused_ = false; //valid only while sync is running + bool paused_ = false; + const std::shared_ptr lifeSign_ = std::make_shared(42); //only bound while instance exists, see pause handling in updateProgressGui() + //wxWindow::Delete(), equals "delete this" on OS X! + SyncResult finalResult_ = RESULT_ABORTED; //set after sync //remaining time @@ -1340,6 +1344,7 @@ private: std::unique_ptr trayIcon_; //optional: if filled all other windows should be hidden and conversely std::unique_ptr taskbar_; + bool ignoreErrors_ = false; EnumDescrList enumPostSyncAction_; }; @@ -1356,6 +1361,7 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF const wxString& jobName, const Zstring& soundFileSyncComplete, bool ignoreErrors, + size_t automaticRetryCount, PostSyncAction2 postSyncAction) : TopLevelDialog(parentFrame, wxID_ANY, wxString(), wxDefaultPosition, wxDefaultSize, style), //title is overwritten anyway in setExternalStatus() pnl_(*new SyncProgressPanelGenerated(this)), //ownership passed to "this" @@ -1371,7 +1377,8 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF assert((IsSameType::value == !parentFrame)); //finish construction of this dialog: - this->SetMinSize(wxSize(470, 280)); //== minimum size! no idea why SetMinSize() is not used... + this->pnl_.m_panelProgress->SetMinSize(wxSize(fastFromDIP(550), fastFromDIP(340))); + wxBoxSizer* bSizer170 = new wxBoxSizer(wxVERTICAL); bSizer170->Add(&pnl_, 1, wxEXPAND); this->SetSizer(bSizer170); //pass ownership @@ -1384,7 +1391,6 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF pnl_.m_buttonPause->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnPause ), NULL, this); pnl_.m_buttonStop ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnCancel), NULL, this); pnl_.m_bpButtonMinimizeToTray->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnMinimizeToTray), NULL, this); - pnl_.m_checkBoxIgnoreErrors->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnToggleIgnoreErrors), NULL, this); if (parentFrame_) parentFrame_->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncProgressDialogImpl::onParentKeyEvent), nullptr, this); @@ -1420,9 +1426,12 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF pnl_.m_bpButtonMinimizeToTray->SetBitmapLabel(getResourceImage(L"minimize_to_tray")); + pnl_.m_bitmapIgnoreErrors->SetBitmap(getResourceImage(L"error_ignore_active")); + pnl_.m_bitmapRetryErrors ->SetBitmap(getResourceImage(L"error_retry")); + //init graph - const int xLabelHeight = this->GetCharHeight() + 2 * 1 /*border*/; //use same height for both graphs to make sure they stretch evenly - const int yLabelWidth = 70; + const int xLabelHeight = this->GetCharHeight() + fastFromDIP(2) /*margin*/; //use same height for both graphs to make sure they stretch evenly + const int yLabelWidth = fastFromDIP(70); pnl_.m_panelGraphBytes->setAttributes(Graph2D::MainAttributes(). setLabelX(Graph2D::LABEL_X_TOP, xLabelHeight, std::make_shared(true)). setLabelY(Graph2D::LABEL_Y_RIGHT, yLabelWidth, std::make_shared()). @@ -1459,8 +1468,11 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF pnl_.m_bitmapGraphKeyBytes->SetBitmap(generateSquareBitmap(getColorBytes(), getColorBytesRim())); pnl_.m_bitmapGraphKeyItems->SetBitmap(generateSquareBitmap(getColorItems(), getColorItemsRim())); + setText(*pnl_.m_staticTextRetryCount, std::wstring(L"(") + formatNumber(automaticRetryCount) + MULT_SIGN + L")"); + pnl_.bSizerErrorsRetry->Show(automaticRetryCount > 0); + //allow changing a few options dynamically during sync - pnl_.m_checkBoxIgnoreErrors->SetValue(ignoreErrors); + ignoreErrors_ = ignoreErrors; enumPostSyncAction_.add(PostSyncAction2::NONE, L""); if (parentFrame_) //enable EXIT option for gui mode sync @@ -1711,11 +1723,11 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) //remaining time and speed assert(perf_); if (perf_) - if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= std::chrono::milliseconds(500)) + if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= SPEED_ESTIMATE_UPDATE_INTERVAL) { timeLastSpeedEstimate_ = timeElapsed; - if (numeric::dist(phaseStart_, timeElapsed) >= std::chrono::seconds(1)) //discard stats for first second: probably messy + if (numeric::dist(phaseStart_, timeElapsed) >= SPEED_ESTIMATE_SAMPLE_INTERVAL) //discard stats for first second: probably messy perf_->addSample(timeElapsed, itemsCurrent, bytesCurrent); //current speed -> Win 7 copy uses 1 sec update interval instead @@ -1760,7 +1772,7 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) { pnl_.m_panelProgress->Layout(); //small statistics panels: - //pnl.m_panelItemsProcessed->Layout(); + //pnl.m_panelItemsProcessed ->Layout(); -> hidden pnl_.m_panelItemsRemaining->Layout(); pnl_.m_panelTimeRemaining ->Layout(); //pnl.m_panelTimeElapsed->Layout(); -> needed? @@ -1772,25 +1784,19 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) //support for pause button if (paused_) { - /* - ZEN_ON_SCOPE_EXIT(resumeTimer()); -> crashes on Fedora; WHY??? - => likely compiler bug!!! - 1. no crash on Fedora for: ZEN_ON_SCOPE_EXIT(this->resumeTimer()); - 1. no crash if we derive from wxFrame instead of template "TopLevelDialog" - 2. no crash on Ubuntu GCC - 3. following makes GCC crash already during compilation: auto dfd = zen::makeGuard([this]{ resumeTimer(); }); - */ timerSetStatus(false /*active*/); + std::weak_ptr lifeSignWeak(lifeSign_); while (paused_) { wxTheApp->Yield(); //receive UI message that end pause OR forceful termination! //*first* refresh GUI (removing flicker) before sleeping! std::this_thread::sleep_for(UI_UPDATE_INTERVAL); + + //after SyncProgressDialogImpl::OnClose() called wxWindow::Destroy() on OS X this instance is instantly toast! + if (!lifeSignWeak.lock()) + return; //GTFO and don't call this->timerSetStatus(); we're fine: https://isocpp.org/wiki/faq/freestore-mgmt#delete-this } - //after SyncProgressDialogImpl::OnClose() called wxWindow::Destroy() on OS X this instance is instantly toast! - if (wereDead_) - return; //GTFO and don't call this->timerSetStatus() timerSetStatus(true /*active*/); } @@ -1911,11 +1917,11 @@ void SyncProgressDialogImpl::updateStaticGui() //depends on "syn if (syncStat_) //sync running pnl_.m_buttonPause->SetLabel(paused_ ? _("&Continue") : _("&Pause")); - - pnl_.m_bitmapIgnoreErrors->SetBitmap(getResourceImage(pnl_.m_checkBoxIgnoreErrors->GetValue() ? L"msg_error_medium_ignored" : L"msg_error_medium")); + pnl_.bSizerErrorsIgnore->Show(ignoreErrors_); pnl_.Layout(); - this->Refresh(); //a few pixels below the status text need refreshing + pnl_.m_panelProgress->Layout(); //for bSizerErrorsIgnore + //this->Refresh(); //a few pixels below the status text need refreshing -> still needed? } @@ -2037,7 +2043,7 @@ void SyncProgressDialogImpl::showSummary(SyncResult resultId, co //------------------------------------------------------------- - pnl_.m_notebookResult->SetPadding(wxSize(2, 0)); //height cannot be changed + pnl_.m_notebookResult->SetPadding(wxSize(fastFromDIP(2), 0)); //height cannot be changed const size_t pagePosProgress = 0; const size_t pagePosLog = 1; @@ -2060,8 +2066,7 @@ void SyncProgressDialogImpl::showSummary(SyncResult resultId, co pnl_.m_notebookResult->ChangeSelection(pagePosLog); //fill image list to cope with wxNotebook image setting design desaster... - const int imgListSize = getResourceImage(L"log_file_small").GetHeight(); - assert(imgListSize == 16); //Windows default size for panel caption + const int imgListSize = getResourceImage(L"log_file_sicon").GetHeight(); auto imgList = std::make_unique(imgListSize, imgListSize); auto addToImageList = [&](const wxBitmap& bmp) @@ -2070,8 +2075,8 @@ void SyncProgressDialogImpl::showSummary(SyncResult resultId, co assert(bmp.GetHeight() <= imgListSize); imgList->Add(bmp); }; - addToImageList(getResourceImage(L"progress_small")); - addToImageList(getResourceImage(L"log_file_small")); + addToImageList(getResourceImage(L"progress_sicon")); + addToImageList(getResourceImage(L"log_file_sicon")); pnl_.m_notebookResult->AssignImageList(imgList.release()); //pass ownership @@ -2088,7 +2093,7 @@ void SyncProgressDialogImpl::showSummary(SyncResult resultId, co //small statistics panels: pnl_.m_panelItemsProcessed->Layout(); pnl_.m_panelItemsRemaining->Layout(); - //pnl.m_panelTimeRemaining->Layout(); + //pnl.m_panelTimeRemaining->Layout(); -> hidden //pnl.m_panelTimeElapsed->Layout(); -> needed? //play (optional) sound notification after sync has completed -> only play when waiting on results dialog, seems to be pointless otherwise! @@ -2129,7 +2134,7 @@ void SyncProgressDialogImpl::OnCancel(wxCommandEvent& event) paused_ = false; updateStaticGui(); //update status + pause button - //no Layout() or UI-update here to avoid cascaded Yield()-call! + //no UI-update here to avoid cascaded Yield()-call! } @@ -2159,7 +2164,6 @@ void SyncProgressDialogImpl::OnClose(wxCloseEvent& event) syncStat_ = nullptr; abortCb_ = nullptr; - wereDead_ = true; this->Destroy(); //wxWidgets OS X: simple "delete"!!!!!!! } @@ -2250,6 +2254,7 @@ SyncProgressDialog* fff::createProgressDialog(AbortCallback& abortCb, const wxString& jobName, const Zstring& soundFileSyncComplete, bool ignoreErrors, + size_t automaticRetryCount, PostSyncAction2 postSyncAction) { if (parentWindow) //sync from GUI @@ -2258,13 +2263,13 @@ SyncProgressDialog* fff::createProgressDialog(AbortCallback& abortCb, //https://groups.google.com/forum/#!topic/wx-users/J5SjjLaBOQE return new SyncProgressDialogImpl(wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxRESIZE_BORDER, [&](wxDialog& progDlg) { return parentWindow; }, - abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, postSyncAction); + abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, postSyncAction); } else //FFS batch job { auto dlg = new SyncProgressDialogImpl(wxDEFAULT_FRAME_STYLE, [](wxFrame& progDlg) { return &progDlg; }, - abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, postSyncAction); + abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, postSyncAction); //only top level windows should have an icon: dlg->SetIcon(getFfsIcon()); diff --git a/FreeFileSync/Source/ui/progress_indicator.h b/FreeFileSync/Source/ui/progress_indicator.h index 3562db96..ca45bd72 100755 --- a/FreeFileSync/Source/ui/progress_indicator.h +++ b/FreeFileSync/Source/ui/progress_indicator.h @@ -24,7 +24,7 @@ public: wxWindow* getAsWindow(); //convenience! don't abuse! - void init(const Statistics& syncStat, bool ignoreErrors); //begin of sync: make visible, set pointer to "syncStat", initialize all status values + void init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount); //begin of sync: make visible, set pointer to "syncStat", initialize all status values void teardown(); //end of sync: hide again, clear pointer to "syncStat" void initNewPhase(); //call after "StatusHandler::initNewPhase" @@ -96,6 +96,7 @@ SyncProgressDialog* createProgressDialog(AbortCallback& abortCb, const wxString& jobName, const Zstring& soundFileSyncComplete, bool ignoreErrors, + size_t automaticRetryCount, PostSyncAction2 postSyncAction); //DON'T delete the pointer! it will be deleted by the user clicking "OK/Cancel"/wxWindow::Destroy() after showSummary() or closeDirectly() diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp index c3889a94..1fd6229b 100755 --- a/FreeFileSync/Source/ui/small_dlgs.cpp +++ b/FreeFileSync/Source/ui/small_dlgs.cpp @@ -62,7 +62,7 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) { m_panelThankYou->Hide(); - m_bitmapDonate->SetBitmap(getResourceImage(L"freefilesync-heart")); + m_bitmapDonate->SetBitmap(getResourceImage(L"ffs_heart")); setRelativeFontSize(*m_staticTextDonate, 1.25); setRelativeFontSize(*m_buttonDonate, 1.25); } @@ -70,16 +70,18 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) //m_animCtrlWink->SetAnimation(getResourceAnimation(L"wink")); //m_animCtrlWink->Play(); + m_staticTextThanksForLoc->SetMinSize(wxSize(fastFromDIP(200), -1)); + m_staticTextThanksForLoc->Wrap(fastFromDIP(200)); + //create language credits for (const TranslationInfo& ti : getExistingTranslations()) { //flag - wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, getResourceImage(ti.languageFlag), wxDefaultPosition, wxSize(-1, 11), 0); + wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, getResourceImage(ti.languageFlag)); fgSizerTranslators->Add(staticBitmapFlag, 0, wxALIGN_CENTER); //translator name wxStaticText* staticTextTranslator = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, ti.translatorName, wxDefaultPosition, wxDefaultSize, 0); - staticTextTranslator->Wrap(-1); fgSizerTranslators->Add(staticTextTranslator, 0, wxALIGN_CENTER_VERTICAL); staticBitmapFlag ->SetToolTip(ti.languageName); @@ -115,8 +117,9 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) ImageStackAlignment::CENTER); wxImage versionImage = stackImages(appnameImg, buildImg, ImageStackLayout::VERTICAL, ImageStackAlignment::CENTER, 0); - const int BORDER_SIZE = 5; - wxBitmap headerBmp(GetClientSize().GetWidth(), versionImage.GetHeight() + 2 * BORDER_SIZE, 24); + const int borderSize = fastFromDIP(5); + + wxBitmap headerBmp(GetClientSize().GetWidth(), versionImage.GetHeight() + 2 * borderSize, 24); //attention: *must* pass 24 bits, auto-determination fails on Windows high-contrast colors schemes!!! //problem only shows when calling wxDC::DrawBitmap { @@ -128,15 +131,15 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) dc.DrawBitmap(bmpGradient, wxPoint(0, (headerBmp.GetHeight() - bmpGradient.GetHeight()) / 2)); const int logoSize = versionImage.GetHeight(); - const wxBitmap logoBmp = getResourceImage(L"FreeFileSync").ConvertToImage().Scale(logoSize, logoSize, wxIMAGE_QUALITY_HIGH); - dc.DrawBitmap(logoBmp, wxPoint(2 * BORDER_SIZE, (headerBmp.GetHeight() - logoBmp.GetHeight()) / 2)); + const wxBitmap logoBmp = getResourceImage(L"FreeFileSync").ConvertToImage().Scale(logoSize, logoSize, wxIMAGE_QUALITY_HIGH); //looks smooth unlike wxIMAGE_QUALITY_BILINEAR! + dc.DrawBitmap(logoBmp, wxPoint(2 * borderSize, (headerBmp.GetHeight() - logoBmp.GetHeight()) / 2)); dc.DrawBitmap(versionImage, wxPoint((headerBmp.GetWidth () - versionImage.GetWidth ()) / 2, (headerBmp.GetHeight() - versionImage.GetHeight()) / 2)); } m_bitmapLogo->SetBitmap(headerBmp); - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(AboutDlg::onLocalKeyEvent), nullptr, this); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() @@ -216,6 +219,8 @@ CopyToDialog::CopyToDialog(wxWindow* parent, m_targetFolderPath->init(folderHistory_); + m_textCtrlFileList->SetMinSize(wxSize(fastFromDIP(500), fastFromDIP(200))); + /* There is a nasty bug on wxGTK under Ubuntu: If a multi-line wxTextCtrl contains so many lines that scrollbars are shown, it re-enables all windows that are supposed to be disabled during the current modal loop! @@ -229,7 +234,7 @@ CopyToDialog::CopyToDialog(wxWindow* parent, const wxString header = _P("Copy the following item to another folder?", "Copy the following %x items to another folder?", selectionInfo.second); m_staticTextHeader->SetLabel(header); - m_staticTextHeader->Wrap(460); //needs to be reapplied after SetLabel() + m_staticTextHeader->Wrap(fastFromDIP(460)); //needs to be reapplied after SetLabel() m_textCtrlFileList->ChangeValue(selectionInfo.first); @@ -239,7 +244,7 @@ CopyToDialog::CopyToDialog(wxWindow* parent, m_checkBoxOverwriteIfExists->SetValue(overwriteIfExists); //----------------- /set config -------------------------------- - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CopyToDialog::onLocalKeyEvent), nullptr, this); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() @@ -339,17 +344,17 @@ DeleteDialog::DeleteDialog(wxWindow* parent, setMainInstructionFont(*m_staticTextHeader); - m_checkBoxUseRecycler->SetValue(useRecycleBin); + m_textCtrlFileList->SetMinSize(wxSize(fastFromDIP(500), fastFromDIP(200))); + m_checkBoxUseRecycler->SetValue(useRecycleBin); updateGui(); - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(DeleteDialog::onLocalKeyEvent), nullptr, this); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! - Layout(); Center(); //needs to be re-applied after a dialog size change! m_buttonOK->SetFocus(); @@ -377,7 +382,7 @@ void DeleteDialog::updateGui() m_buttonOK->SetLabel(replaceCpy(_("&Delete"), L"&", L"")); } m_staticTextHeader->SetLabel(header); - m_staticTextHeader->Wrap(460); //needs to be reapplied after SetLabel() + m_staticTextHeader->Wrap(fastFromDIP(460)); //needs to be reapplied after SetLabel() m_textCtrlFileList->ChangeValue(delInfo.first); /* @@ -451,7 +456,7 @@ SyncConfirmationDlg::SyncConfirmationDlg(wxWindow* parent, setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonStartSync).setCancel(m_buttonCancel)); setMainInstructionFont(*m_staticTextHeader); - m_bitmapSync->SetBitmap(getResourceImage(L"sync")); + m_bitmapSync->SetBitmap(getResourceImage(L"file_sync")); m_staticTextVariant->SetLabel(variantName); m_checkBoxDontShowAgain->SetValue(dontShowAgain); @@ -478,15 +483,13 @@ SyncConfirmationDlg::SyncConfirmationDlg(wxWindow* parent, setValue(txtControl, value == 0, formatNumber(value), bmpControl, bmpName); }; - setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data"); - setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_small"); - setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_small"); - setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_small"); - setIntValue(*m_staticTextCreateRight, st.createCount(), *m_bitmapCreateRight, L"so_create_right_small"); - setIntValue(*m_staticTextUpdateRight, st.updateCount(), *m_bitmapUpdateRight, L"so_update_right_small"); - setIntValue(*m_staticTextDeleteRight, st.deleteCount(), *m_bitmapDeleteRight, L"so_delete_right_small"); - - m_panelStatistics->Layout(); + setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data"); + setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_sicon"); + setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_sicon"); + setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_sicon"); + setIntValue(*m_staticTextCreateRight, st.createCount(), *m_bitmapCreateRight, L"so_create_right_sicon"); + setIntValue(*m_staticTextUpdateRight, st.updateCount(), *m_bitmapUpdateRight, L"so_update_right_sicon"); + setIntValue(*m_staticTextDeleteRight, st.deleteCount(), *m_bitmapDeleteRight, L"so_delete_right_sicon"); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! @@ -543,8 +546,6 @@ private: //work around defunct keyboard focus on macOS (or is it wxMac?) => not needed for this dialog! //void onLocalKeyEvent(wxKeyEvent& event); - void OnToggleAutoRetryCount(wxCommandEvent& event) override { updateGui(); } - void setExtApp(const std::vector& extApp); std::vector getExtApp() const; @@ -581,13 +582,12 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) : m_bpButtonRemoveRow->SetBitmapLabel(getResourceImage(L"item_remove")); setBitmapTextLabel(*m_buttonResetDialogs, getResourceImage(L"reset_dialogs").ConvertToImage(), m_buttonResetDialogs->GetLabel()); + m_staticTextResetDialogs->Wrap(std::max(fastFromDIP(200), m_buttonResetDialogs->GetMinSize().x)); + m_checkBoxFailSafe ->SetValue(globalSettings.failSafeFileCopy); m_checkBoxCopyLocked ->SetValue(globalSettings.copyLockedFiles); m_checkBoxCopyPermissions->SetValue(globalSettings.copyFilePermissions); - m_spinCtrlAutoRetryCount->SetValue(globalSettings.automaticRetryCount); - m_spinCtrlAutoRetryDelay->SetValue(globalSettings.automaticRetryDelay); - setExtApp(globalSettings.gui.externalApps); updateGui(); @@ -601,15 +601,20 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) : L"\n" + L"%item_path2%, %folder_path2%, %local_path2% \t" + _("Parameters for opposite side"); - m_gridCustomCommand->GetGridWindow()->SetToolTip(toolTip); + m_gridCustomCommand->GetGridWindow() ->SetToolTip(toolTip); m_gridCustomCommand->GetGridColLabelWindow()->SetToolTip(toolTip); m_gridCustomCommand->SetMargins(0, 0); + //temporarily set dummy value for window height calculations: + setExtApp(std::vector(globalSettings.gui.externalApps.size() + 1)); + GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! - Layout(); Center(); //needs to be re-applied after a dialog size change! + //restore actual value: + setExtApp(globalSettings.gui.externalApps); + //automatically fit column width to match total grid width Connect(wxEVT_SIZE, wxSizeEventHandler(OptionsDlg::onResize), nullptr, this); wxSizeEvent dummy; @@ -622,16 +627,14 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) : void OptionsDlg::onResize(wxSizeEvent& event) { const int widthTotal = m_gridCustomCommand->GetGridWindow()->GetClientSize().GetWidth(); + assert(m_gridCustomCommand->GetNumberCols() == 2); - if (widthTotal >= 0 && m_gridCustomCommand->GetNumberCols() == 2) - { - const int w0 = widthTotal * 2 / 5; //ratio 2 : 3 - const int w1 = widthTotal - w0; - m_gridCustomCommand->SetColSize(0, w0); - m_gridCustomCommand->SetColSize(1, w1); + const int w0 = widthTotal * 2 / 5; //ratio 2 : 3 + const int w1 = widthTotal - w0; + m_gridCustomCommand->SetColSize(0, w0); + m_gridCustomCommand->SetColSize(1, w1); - m_gridCustomCommand->Refresh(); //required on Ubuntu - } + m_gridCustomCommand->Refresh(); //required on Ubuntu event.Skip(); } @@ -639,10 +642,6 @@ void OptionsDlg::onResize(wxSizeEvent& event) void OptionsDlg::updateGui() { - const bool autoRetryActive = m_spinCtrlAutoRetryCount->GetValue() > 0; - m_staticTextAutoRetryDelay->Enable(autoRetryActive); - m_spinCtrlAutoRetryDelay ->Enable(autoRetryActive); - m_buttonResetDialogs->Enable(confirmDlgs_ != defaultCfg_.confirmDlgs || warnDlgs_ != defaultCfg_.warnDlgs || autoCloseProgressDialog_ != defaultCfg_.autoCloseProgressDialog); @@ -664,9 +663,6 @@ void OptionsDlg::OnDefault(wxCommandEvent& event) m_checkBoxCopyLocked ->SetValue(defaultCfg_.copyLockedFiles); m_checkBoxCopyPermissions->SetValue(defaultCfg_.copyFilePermissions); - m_spinCtrlAutoRetryCount->SetValue(defaultCfg_.automaticRetryCount); - m_spinCtrlAutoRetryDelay->SetValue(defaultCfg_.automaticRetryDelay); - setExtApp(defaultCfg_.gui.externalApps); updateGui(); } @@ -679,9 +675,6 @@ void OptionsDlg::OnOkay(wxCommandEvent& event) globalCfgOut_.copyLockedFiles = m_checkBoxCopyLocked->GetValue(); globalCfgOut_.copyFilePermissions = m_checkBoxCopyPermissions->GetValue(); - globalCfgOut_.automaticRetryCount = m_spinCtrlAutoRetryCount->GetValue(); - globalCfgOut_.automaticRetryDelay = m_spinCtrlAutoRetryDelay->GetValue(); - globalCfgOut_.gui.externalApps = getExtApp(); globalCfgOut_.confirmDlgs = confirmDlgs_; @@ -694,19 +687,17 @@ void OptionsDlg::OnOkay(wxCommandEvent& event) void OptionsDlg::setExtApp(const std::vector& extApps) { - auto extAppsTmp = extApps; - erase_if(extAppsTmp, [](auto& entry) { return entry.description.empty() && entry.cmdLine.empty(); }); + int rowDiff = static_cast(extApps.size()) - m_gridCustomCommand->GetNumberRows(); + ++rowDiff; //append empty row to facilitate insertions by user - extAppsTmp.emplace_back(); //append empty row to facilitate insertions by user - - const int rowCount = m_gridCustomCommand->GetNumberRows(); - if (rowCount > 0) - m_gridCustomCommand->DeleteRows(0, rowCount); + if (rowDiff >= 0) + m_gridCustomCommand->AppendRows(rowDiff); + else + m_gridCustomCommand->DeleteRows(0, -rowDiff); - m_gridCustomCommand->AppendRows(static_cast(extAppsTmp.size())); - for (auto it = extAppsTmp.begin(); it != extAppsTmp.end(); ++it) + for (auto it = extApps.begin(); it != extApps.end(); ++it) { - const int row = it - extAppsTmp.begin(); + const int row = it - extApps.begin(); const std::wstring description = zen::translate(it->description); if (description != it->description) //remember english description to save in GlobalSettings.xml later rather than hard-code translation @@ -740,12 +731,14 @@ std::vector OptionsDlg::getExtApp() const void OptionsDlg::OnAddRow(wxCommandEvent& event) { - const int selectedRow = m_gridCustomCommand->GetGridCursorRow(); if (0 <= selectedRow && selectedRow < m_gridCustomCommand->GetNumberRows()) m_gridCustomCommand->InsertRows(selectedRow); else m_gridCustomCommand->AppendRows(); + + wxSizeEvent dummy2; + onResize(dummy2); } @@ -753,13 +746,15 @@ void OptionsDlg::OnRemoveRow(wxCommandEvent& event) { if (m_gridCustomCommand->GetNumberRows() > 0) { - const int selectedRow = m_gridCustomCommand->GetGridCursorRow(); if (0 <= selectedRow && selectedRow < m_gridCustomCommand->GetNumberRows()) m_gridCustomCommand->DeleteRows(selectedRow); else m_gridCustomCommand->DeleteRows(m_gridCustomCommand->GetNumberRows() - 1); } + + wxSizeEvent dummy2; + onResize(dummy2); } @@ -827,7 +822,7 @@ SelectTimespanDlg::SelectTimespanDlg(wxWindow* parent, time_t& timeFrom, time_t& m_calendarFrom->SetDate(timeFromTmp); m_calendarTo ->SetDate(timeToTmp ); - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SelectTimespanDlg::onLocalKeyEvent), nullptr, this); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() @@ -851,7 +846,7 @@ void SelectTimespanDlg::OnOkay(wxCommandEvent& event) //align to full days from.ResetTime(); - to.ResetTime(); //reset local(!) time + to .ResetTime(); //reset local(!) time to += wxTimeSpan::Day(); to -= wxTimeSpan::Second(); //go back to end of previous day @@ -905,21 +900,26 @@ CfgHighlightDlg::CfgHighlightDlg(wxWindow* parent, int& cfgHistSyncOverdueDays) CfgHighlightDlgGenerated(parent), cfgHistSyncOverdueDaysOut_(cfgHistSyncOverdueDays) { + + m_staticTextHighlight->Wrap(fastFromDIP(300)); + + m_spinCtrlOverdueDays->SetMinSize(wxSize(fastFromDIP(70), -1)); //Hack: set size (why does wxWindow::Size() not work?) + setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel)); - m_spinCtrlSyncOverdueDays->SetValue(cfgHistSyncOverdueDays); + m_spinCtrlOverdueDays->SetValue(cfgHistSyncOverdueDays); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! Center(); //needs to be re-applied after a dialog size change! - m_spinCtrlSyncOverdueDays->SetFocus(); + m_spinCtrlOverdueDays->SetFocus(); } void CfgHighlightDlg::OnOkay(wxCommandEvent& event) { - cfgHistSyncOverdueDaysOut_ = m_spinCtrlSyncOverdueDays->GetValue(); + cfgHistSyncOverdueDaysOut_ = m_spinCtrlOverdueDays->GetValue(); EndModal(ReturnSmallDlg::BUTTON_OKAY); } @@ -961,6 +961,7 @@ ActivationDlg::ActivationDlg(wxWindow* parent, //setMainInstructionFont(*m_staticTextMain); m_bitmapActivation->SetBitmap(getResourceImage(L"website")); + m_textCtrlOfflineActivationKey->ForceUpper(); m_textCtrlLastError ->ChangeValue(lastErrorMsg); m_textCtrlManualActivationUrl ->ChangeValue(manualActivationUrl); @@ -1059,6 +1060,9 @@ DownloadProgressWindow::Impl::Impl(wxWindow* parent, int64_t fileSizeTotal) : setStandardButtonLayout(*bSizerStdButtons, StdButtons().setCancel(m_buttonCancel)); setMainInstructionFont(*m_staticTextHeader); + m_staticTextHeader->Wrap(fastFromDIP(460)); //*after* font change! + + m_staticTextDetails->SetMinSize(wxSize(fastFromDIP(550), -1)); m_bitmapDownloading->SetBitmap(getResourceImage(L"website")); diff --git a/FreeFileSync/Source/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp index 3f73a263..38aa8940 100755 --- a/FreeFileSync/Source/ui/sync_cfg.cpp +++ b/FreeFileSync/Source/ui/sync_cfg.cpp @@ -22,6 +22,7 @@ #include "../file_hierarchy.h" #include "../lib/help_provider.h" #include "../lib/norm_filter.h" +#include "../fs/concrete.h" using namespace zen; @@ -30,22 +31,7 @@ using namespace fff; namespace { -struct MiscSyncConfig -{ - bool ignoreErrors = false; - Zstring postSyncCommand; - PostSyncCondition postSyncCondition = PostSyncCondition::COMPLETION; - std::vector commandHistory; -}; - - -struct GlobalSyncConfig -{ - CompConfig cmpConfig; - SyncConfig syncCfg; - FilterConfig filter; - MiscSyncConfig miscCfg; -}; +const int CFG_DESCRIPTION_WIDTH_DIP = 250; class ConfigDialog : public ConfigDlgGenerated @@ -54,8 +40,8 @@ public: ConfigDialog(wxWindow* parent, SyncConfigPanel panelToShow, int localPairIndexToShow, - std::vector& folderPairConfig, - GlobalSyncConfig& globalCfg, + GlobalPairConfig& globalPairCfg, + std::vector& localPairConfig, size_t commandHistItemsMax); private: @@ -91,8 +77,8 @@ private: void OnChangeCompOption (wxCommandEvent& event) override { updateCompGui(); } void onlTimeShiftKeyDown (wxKeyEvent& event) override; - std::shared_ptr getCompConfig() const; - void setCompConfig(std::shared_ptr compCfg); + Opt getCompConfig() const; + void setCompConfig(const CompConfig* compCfg); void updateCompGui(); @@ -142,8 +128,8 @@ private: void OnHelpDetectMovedFiles(wxHyperlinkEvent& event) override { displayHelpEntry(L"synchronization-settings", this); } void OnHelpVersioning (wxHyperlinkEvent& event) override { displayHelpEntry(L"versioning", this); } - std::shared_ptr getSyncConfig() const; - void setSyncConfig(std::shared_ptr syncCfg); + Opt getSyncConfig() const; + void setSyncConfig(const SyncConfig* syncCfg); void updateSyncGui(); @@ -152,6 +138,7 @@ private: //----------------------------------------------------- void OnToggleIgnoreErrors(wxCommandEvent& event) override { updateMiscGui(); } + void OnToggleAutoRetry (wxCommandEvent& event) override { updateMiscGui(); } MiscSyncConfig getMiscSyncOptions() const; void setMiscSyncOptions(const MiscSyncConfig& miscCfg); @@ -171,12 +158,12 @@ private: bool unselectFolderPairConfig(); //returns false on error: shows message box! //output-only parameters - GlobalSyncConfig& globalCfgOut_; - std::vector& folderPairConfigOut_; + GlobalPairConfig& globalPairCfgOut_; + std::vector& localPairCfgOut_; //working copy of ALL config parameters: only one folder pair is selected at a time! - GlobalSyncConfig globalCfg_; - std::vector folderPairConfig_; + GlobalPairConfig globalPairCfg_; + std::vector localPairCfg_; int selectedPairIndexToShow_ = EMPTY_PAIR_INDEX_SELECTED; static const int EMPTY_PAIR_INDEX_SELECTED = -2; @@ -223,26 +210,23 @@ std::wstring getSyncVariantDescription(DirectionConfig::Variant var) ConfigDialog::ConfigDialog(wxWindow* parent, SyncConfigPanel panelToShow, int localPairIndexToShow, - std::vector& folderPairConfig, - GlobalSyncConfig& globalCfg, + GlobalPairConfig& globalPairCfg, + std::vector& localPairConfig, size_t commandHistItemsMax) : ConfigDlgGenerated(parent), versioningFolder_(*m_panelVersioning, *m_buttonSelectVersioningFolder, *m_bpButtonSelectAltFolder, *m_versioningFolderPath, nullptr /*staticText*/, nullptr /*dropWindow2*/), - globalCfgOut_(globalCfg), - folderPairConfigOut_(folderPairConfig), - globalCfg_(globalCfg), - folderPairConfig_(folderPairConfig), + globalPairCfgOut_(globalPairCfg), + localPairCfgOut_(localPairConfig), + globalPairCfg_(globalPairCfg), + localPairCfg_(localPairConfig), commandHistItemsMax_(commandHistItemsMax) { setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel)); - SetTitle(_("Synchronization Settings")); - - m_notebook->SetPadding(wxSize(2, 0)); //height cannot be changed + m_notebook->SetPadding(wxSize(fastFromDIP(2), 0)); //height cannot be changed //fill image list to cope with wxNotebook image setting design desaster... - const int imgListSize = getResourceImage(L"cfg_compare_small").GetHeight(); - assert(imgListSize == 16); //Windows default size for panel caption + const int imgListSize = getResourceImage(L"cfg_compare_sicon").GetHeight(); auto imgList = std::make_unique(imgListSize, imgListSize); auto addToImageList = [&](const wxBitmap& bmp) @@ -253,9 +237,9 @@ ConfigDialog::ConfigDialog(wxWindow* parent, imgList->Add(greyScale(bmp)); }; //add images in same sequence like ConfigTypeImage enum!!! - addToImageList(getResourceImage(L"cfg_compare_small")); - addToImageList(getResourceImage(L"filter_small" )); - addToImageList(getResourceImage(L"cfg_sync_small" )); + addToImageList(getResourceImage(L"cfg_compare_sicon")); + addToImageList(getResourceImage(L"cfg_filter_sicon")); + addToImageList(getResourceImage(L"cfg_sync_sicon")); assert(imgList->GetImageCount() == static_cast(ConfigTypeImage::SYNC_GREY) + 1); m_notebook->AssignImageList(imgList.release()); //pass ownership @@ -275,12 +259,18 @@ ConfigDialog::ConfigDialog(wxWindow* parent, m_toggleBtnByContent ->SetToolTip(getCompVariantDescription(CompareVariant::CONTENT)); m_toggleBtnBySize ->SetToolTip(getCompVariantDescription(CompareVariant::SIZE)); + m_staticTextCompVarDescription->SetMinSize(wxSize(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP), -1)); + //------------- filter panel -------------------------- + m_textCtrlInclude->SetMinSize(wxSize(fastFromDIP(280), -1)); + assert(!contains(m_buttonClear->GetLabel(), L"&C") && !contains(m_buttonClear->GetLabel(), L"&c")); //gazillionth wxWidgets bug on OS X: Command + C mistakenly hits "&C" access key! m_textCtrlInclude->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(ConfigDialog::onFilterKeyEvent), nullptr, this); m_textCtrlExclude->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(ConfigDialog::onFilterKeyEvent), nullptr, this); + m_staticTextFilterDescr->Wrap(fastFromDIP(590)); + enumTimeDescr_. add(UnitTime::NONE, L"(" + _("None") + L")"). //meta options should be enclosed in parentheses add(UnitTime::TODAY, _("Today")). @@ -318,10 +308,15 @@ ConfigDialog::ConfigDialog(wxWindow* parent, setRelativeFontSize(*m_toggleBtnUpdate, 1.25); setRelativeFontSize(*m_toggleBtnCustom, 1.25); + m_staticTextSyncVarDescription->SetMinSize(wxSize(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP), -1)); + m_toggleBtnRecycler ->SetToolTip(_("Retain deleted and overwritten files in the recycle bin")); m_toggleBtnPermanent ->SetToolTip(_("Delete and overwrite files permanently")); m_toggleBtnVersioning->SetToolTip(_("Move files to a user-defined folder")); + m_spinCtrlAutoRetryCount->SetMinSize(wxSize(fastFromDIP(60), -1)); //Hack: set size (why does wxWindow::Size() not work?) + m_spinCtrlAutoRetryDelay->SetMinSize(wxSize(fastFromDIP(60), -1)); // + enumVersioningStyle_. add(VersioningStyle::REPLACE, _("Replace"), _("Move files and replace if existing")). add(VersioningStyle::ADD_TIMESTAMP, _("Time stamp"), _("Append a time stamp to each file name")); @@ -334,38 +329,50 @@ ConfigDialog::ConfigDialog(wxWindow* parent, m_comboBoxPostSyncCommand->SetHint(_("Example:") + L" systemctl poweroff"); - //use spacer to keep dialog height stable, no matter if versioning options are visible - //bSizerDelHandling->Add(0, m_panelVersioning->GetSize().GetHeight()); - //----------------------------------------------------- - //enable dialog-specific key local events + //enable dialog-specific key events Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(ConfigDialog::onLocalKeyEvent), nullptr, this); assert(!m_listBoxFolderPair->IsSorted()); m_listBoxFolderPair->Append(_("Main config")); - for (const LocalPairConfig& cfg : folderPairConfig) + for (const LocalPairConfig& lpc : localPairConfig) { - auto fpName = utfTo(cfg.folderPairName); + std::wstring fpName = getShortDisplayNameForFolderPair(createAbstractPath(lpc.folderPathPhraseLeft ), + createAbstractPath(lpc.folderPathPhraseRight)); if (trimCpy(fpName).empty()) fpName = L"<" + _("empty") + L">"; + m_listBoxFolderPair->Append(L" " + fpName); } - if (folderPairConfig.empty()) + if (localPairConfig.empty()) { m_listBoxFolderPair->Hide(); m_staticTextFolderPairLabel->Hide(); } - selectFolderPairConfig(-1); //temporarily set main config as reference for window height calculations: + //temporarily set main config as reference for window height calculations: + globalPairCfg_ = GlobalPairConfig(); + globalPairCfg_.syncCfg.directionCfg.var = DirectionConfig::MIRROR; // + globalPairCfg_.syncCfg.handleDeletion = DeletionPolicy::VERSIONING; //set tentatively for sync dir height calculation below + globalPairCfg_.syncCfg.versioningFolderPhrase = Zstr("dummy"); // + + selectFolderPairConfig(-1); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! Center(); //needs to be re-applied after a dialog size change! + //keep stable sizer height: "two way" description is smaller than grid of sync directions + bSizerSyncDirHolder ->SetMinSize(-1, bSizerSyncDirections ->GetSize().y); + bSizerVersioningHolder->SetMinSize(-1, bSizerVersioningHolder->GetSize().y); + unselectFolderPairConfig(); + globalPairCfg_ = globalPairCfg; //restore proper value + + //set actual sync config selectFolderPairConfig(localPairIndexToShow); //more useful and Enter is redirected to m_buttonOkay anyway: @@ -501,30 +508,29 @@ void ConfigDialog::onlTimeShiftKeyDown(wxKeyEvent& event) } -std::shared_ptr ConfigDialog::getCompConfig() const +Opt ConfigDialog::getCompConfig() const { if (!m_checkBoxUseLocalCmpOptions->GetValue()) - return nullptr; + return NoValue(); CompConfig compCfg; compCfg.compareVar = localCmpVar_; compCfg.handleSymlinks = !m_checkBoxSymlinksInclude->GetValue() ? SymLinkHandling::EXCLUDE : m_radioBtnSymlinksDirect->GetValue() ? SymLinkHandling::DIRECT : SymLinkHandling::FOLLOW; compCfg.ignoreTimeShiftMinutes = fromTimeShiftPhrase(copyStringTo(m_textCtrlTimeShift->GetValue())); - - return std::make_shared(compCfg); + return compCfg; } -void ConfigDialog::setCompConfig(std::shared_ptr compCfg) +void ConfigDialog::setCompConfig(const CompConfig* compCfg) { - m_checkBoxUseLocalCmpOptions->SetValue(compCfg != nullptr); + m_checkBoxUseLocalCmpOptions->SetValue(compCfg); - if (!compCfg) //when local settings are inactive, display (current) global settings instead: - compCfg = std::make_shared(globalCfg_.cmpConfig); + //when local settings are inactive, display (current) global settings instead: + const CompConfig tmpCfg = compCfg ? *compCfg : globalPairCfg_.cmpConfig; - localCmpVar_ = compCfg->compareVar; + localCmpVar_ = tmpCfg.compareVar; - switch (compCfg->handleSymlinks) + switch (tmpCfg.handleSymlinks) { case SymLinkHandling::EXCLUDE: m_checkBoxSymlinksInclude->SetValue(false); @@ -540,7 +546,7 @@ void ConfigDialog::setCompConfig(std::shared_ptr compCfg) break; } - m_textCtrlTimeShift->ChangeValue(toTimeShiftPhrase(compCfg->ignoreTimeShiftMinutes)); + m_textCtrlTimeShift->ChangeValue(toTimeShiftPhrase(tmpCfg.ignoreTimeShiftMinutes)); updateCompGui(); } @@ -583,19 +589,19 @@ void ConfigDialog::updateCompGui() switch (localCmpVar_) //unconditionally update image, including "local options off" { case CompareVariant::TIME_SIZE: - setBitmap(*m_bitmapCompVariant, getResourceImage(L"file-time")); + setBitmap(*m_bitmapCompVariant, getResourceImage(L"cmp_file_time")); break; case CompareVariant::CONTENT: - setBitmap(*m_bitmapCompVariant, getResourceImage(L"file-content")); + setBitmap(*m_bitmapCompVariant, getResourceImage(L"cmp_file_content")); break; case CompareVariant::SIZE: - setBitmap(*m_bitmapCompVariant, getResourceImage(L"file-size")); + setBitmap(*m_bitmapCompVariant, getResourceImage(L"cmp_file_size")); break; } //active variant description: setText(*m_staticTextCompVarDescription, getCompVariantDescription(localCmpVar_)); - m_staticTextCompVarDescription->Wrap(400); //needs to be reapplied after SetLabel() + m_staticTextCompVarDescription->Wrap(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP)); //needs to be reapplied after SetLabel() m_radioBtnSymlinksDirect->Enable(m_checkBoxSymlinksInclude->GetValue()); m_radioBtnSymlinksFollow->Enable(m_checkBoxSymlinksInclude->GetValue()); @@ -668,8 +674,8 @@ void ConfigDialog::updateFilterGui() }; setStatusBitmap(*m_bitmapInclude, L"filter_include", !NameFilter::isNull(activeCfg.includeFilter, FilterConfig().excludeFilter)); setStatusBitmap(*m_bitmapExclude, L"filter_exclude", !NameFilter::isNull(FilterConfig().includeFilter, activeCfg.excludeFilter)); - setStatusBitmap(*m_bitmapFilterDate, L"file-time", activeCfg.unitTimeSpan != UnitTime::NONE); - setStatusBitmap(*m_bitmapFilterSize, L"file-size", activeCfg.unitSizeMin != UnitSize::NONE || activeCfg.unitSizeMax != UnitSize::NONE); + setStatusBitmap(*m_bitmapFilterDate, L"cmp_file_time", activeCfg.unitTimeSpan != UnitTime::NONE); + setStatusBitmap(*m_bitmapFilterSize, L"cmp_file_size", activeCfg.unitSizeMin != UnitSize::NONE || activeCfg.unitSizeMax != UnitSize::NONE); m_spinCtrlTimespan->Enable(activeCfg.unitTimeSpan == UnitTime::LAST_X_DAYS); m_spinCtrlMinSize ->Enable(activeCfg.unitSizeMin != UnitSize::NONE); @@ -871,32 +877,31 @@ void updateSyncDirectionIcons(const DirectionConfig& directionCfg, } -std::shared_ptr ConfigDialog::getSyncConfig() const +Opt ConfigDialog::getSyncConfig() const { if (!m_checkBoxUseLocalSyncOptions->GetValue()) - return nullptr; + return NoValue(); SyncConfig syncCfg; syncCfg.directionCfg = directionCfg_; syncCfg.handleDeletion = handleDeletion_; syncCfg.versioningFolderPhrase = versioningFolder_.getPath(); syncCfg.versioningStyle = getEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle); - - return std::make_shared(syncCfg); + return syncCfg; } -void ConfigDialog::setSyncConfig(std::shared_ptr syncCfg) +void ConfigDialog::setSyncConfig(const SyncConfig* syncCfg) { - m_checkBoxUseLocalSyncOptions->SetValue(syncCfg != nullptr); + m_checkBoxUseLocalSyncOptions->SetValue(syncCfg); - if (!syncCfg) //when local settings are inactive, display (current) global settings instead: - syncCfg = std::make_shared(globalCfg_.syncCfg); + //when local settings are inactive, display (current) global settings instead: + const SyncConfig tmpCfg = syncCfg ? *syncCfg : globalPairCfg_.syncCfg; - directionCfg_ = syncCfg->directionCfg; //make working copy; ownership *not* on GUI - handleDeletion_ = syncCfg->handleDeletion; - versioningFolder_.setPath(syncCfg->versioningFolderPhrase); - setEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle, syncCfg->versioningStyle); + directionCfg_ = tmpCfg.directionCfg; //make working copy; ownership *not* on GUI + handleDeletion_ = tmpCfg.handleDeletion; + versioningFolder_.setPath(tmpCfg.versioningFolderPhrase); + setEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle, tmpCfg.versioningStyle); updateSyncGui(); } @@ -938,7 +943,7 @@ void ConfigDialog::updateSyncGui() setBitmap(*m_bitmapDatabase, getResourceImage(L"database")); else { - const CompareVariant activeCmpVar = m_checkBoxUseLocalCmpOptions->GetValue() ? localCmpVar_ : globalCfg_.cmpConfig.compareVar; + const CompareVariant activeCmpVar = m_checkBoxUseLocalCmpOptions->GetValue() ? localCmpVar_ : globalPairCfg_.cmpConfig.compareVar; m_bitmapLeftNewer ->Show(activeCmpVar == CompareVariant::TIME_SIZE); m_bpButtonLeftNewer ->Show(activeCmpVar == CompareVariant::TIME_SIZE); @@ -951,7 +956,7 @@ void ConfigDialog::updateSyncGui() //active variant description: setText(*m_staticTextSyncVarDescription, getSyncVariantDescription(directionCfg_.var)); - m_staticTextSyncVarDescription->Wrap(220); //needs to be reapplied after SetLabel() + m_staticTextSyncVarDescription->Wrap(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP)); //needs to be reapplied after SetLabel() //update toggle buttons -> they have no parameter-ownership at all! m_toggleBtnTwoWay->SetValue(false); @@ -1009,7 +1014,7 @@ void ConfigDialog::updateSyncGui() setText(*m_staticTextDeletionTypeDescription, _("Move files to a user-defined folder")); break; } - //m_staticTextDeletionTypeDescription->Wrap(200); //needs to be reapplied after SetLabel() + //m_staticTextDeletionTypeDescription->Wrap(fastFromDIP(200)); //needs to be reapplied after SetLabel() const bool versioningSelected = handleDeletion_ == DeletionPolicy::VERSIONING; m_panelVersioning ->Show(versioningSelected); @@ -1037,7 +1042,6 @@ void ConfigDialog::updateSyncGui() } m_panelSyncSettings->Layout(); - //Layout(); //Refresh(); //removes a few artifacts when toggling display of versioning folder } @@ -1047,7 +1051,10 @@ MiscSyncConfig ConfigDialog::getMiscSyncOptions() const assert(selectedPairIndexToShow_ == -1); MiscSyncConfig miscCfg; - miscCfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + miscCfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + miscCfg.automaticRetryCount = m_checkBoxAutoRetry->GetValue() ? m_spinCtrlAutoRetryCount->GetValue() : 0; + miscCfg.automaticRetryDelay = m_spinCtrlAutoRetryDelay->GetValue(); + miscCfg.postSyncCommand = m_comboBoxPostSyncCommand->getValue(); miscCfg.postSyncCondition = getEnumVal(enumPostSyncCondition_, *m_choicePostSyncCondition), miscCfg.commandHistory = m_comboBoxPostSyncCommand->getHistory(); @@ -1058,6 +1065,10 @@ MiscSyncConfig ConfigDialog::getMiscSyncOptions() const void ConfigDialog::setMiscSyncOptions(const MiscSyncConfig& miscCfg) { m_checkBoxIgnoreErrors->SetValue(miscCfg.ignoreErrors); + m_checkBoxAutoRetry ->SetValue(miscCfg.automaticRetryCount > 0); + m_spinCtrlAutoRetryCount->SetValue(std::max(miscCfg.automaticRetryCount, 0)); + m_spinCtrlAutoRetryDelay->SetValue(miscCfg.automaticRetryDelay); + m_comboBoxPostSyncCommand->setValue(miscCfg.postSyncCommand); setEnumVal(enumPostSyncCondition_, *m_choicePostSyncCondition, miscCfg.postSyncCondition), m_comboBoxPostSyncCommand->setHistory(miscCfg.commandHistory, commandHistItemsMax_); @@ -1068,17 +1079,22 @@ void ConfigDialog::setMiscSyncOptions(const MiscSyncConfig& miscCfg) void ConfigDialog::updateMiscGui() { - const MiscSyncConfig activeCfg = getMiscSyncOptions(); + const MiscSyncConfig miscCfg = getMiscSyncOptions(); + + m_bitmapIgnoreErrors->SetBitmap(miscCfg.ignoreErrors ? getResourceImage(L"error_ignore_active") : greyScale(getResourceImage(L"error_ignore_inactive"))); + m_bitmapRetryErrors ->SetBitmap(miscCfg.automaticRetryCount > 0 ? getResourceImage(L"error_retry") : greyScale(getResourceImage(L"error_retry"))); + + fgSizerAutoRetry->Show(miscCfg.automaticRetryCount > 0); - m_bitmapIgnoreErrors->SetBitmap(getResourceImage(activeCfg.ignoreErrors ? L"msg_error_medium_ignored" : L"msg_error_medium")); + bSizerMiscConfig->Layout(); } void ConfigDialog::selectFolderPairConfig(int newPairIndexToShow) { assert(selectedPairIndexToShow_ == EMPTY_PAIR_INDEX_SELECTED); - assert(newPairIndexToShow == -1 || makeUnsigned(newPairIndexToShow) < folderPairConfig_.size()); - numeric::clamp(newPairIndexToShow, -1, static_cast(folderPairConfig_.size()) - 1); + assert(newPairIndexToShow == -1 || makeUnsigned(newPairIndexToShow) < localPairCfg_.size()); + numeric::clamp(newPairIndexToShow, -1, static_cast(localPairCfg_.size()) - 1); selectedPairIndexToShow_ = newPairIndexToShow; m_listBoxFolderPair->SetSelection(newPairIndexToShow + 1); @@ -1086,47 +1102,46 @@ void ConfigDialog::selectFolderPairConfig(int newPairIndexToShow) //show/hide controls that are only relevant for main/local config const bool mainConfigSelected = newPairIndexToShow < 0; //comparison panel: - m_staticTextMainCompSettings->Show( mainConfigSelected && !folderPairConfig_.empty()); - m_checkBoxUseLocalCmpOptions->Show(!mainConfigSelected && !folderPairConfig_.empty()); - m_staticlineCompHeader->Show(!folderPairConfig_.empty()); - m_panelCompSettingsHolder->Layout(); //fix comp panel glitch on Win 7 125% font size + m_staticTextMainCompSettings->Show( mainConfigSelected && !localPairCfg_.empty()); + m_checkBoxUseLocalCmpOptions->Show(!mainConfigSelected && !localPairCfg_.empty()); + m_staticlineCompHeader->Show(!localPairCfg_.empty()); + m_panelCompSettingsTab->Layout(); //fix comp panel glitch on Win 7 125% font size //filter panel - m_staticTextMainFilterSettings ->Show( mainConfigSelected && !folderPairConfig_.empty()); - m_staticTextLocalFilterSettings->Show(!mainConfigSelected && !folderPairConfig_.empty()); - m_staticlineFilterHeader->Show(!folderPairConfig_.empty()); - m_panelFilterSettingsHolder->Layout(); + m_staticTextMainFilterSettings ->Show( mainConfigSelected && !localPairCfg_.empty()); + m_staticTextLocalFilterSettings->Show(!mainConfigSelected && !localPairCfg_.empty()); + m_staticlineFilterHeader->Show(!localPairCfg_.empty()); + m_panelFilterSettingsTab->Layout(); //sync panel: - m_staticTextMainSyncSettings ->Show( mainConfigSelected && !folderPairConfig_.empty()); - m_checkBoxUseLocalSyncOptions->Show(!mainConfigSelected && !folderPairConfig_.empty()); - m_staticlineSyncHeader->Show(!folderPairConfig_.empty()); - m_panelSyncSettingsHolder->Layout(); + m_staticTextMainSyncSettings ->Show( mainConfigSelected && !localPairCfg_.empty()); + m_checkBoxUseLocalSyncOptions->Show(!mainConfigSelected && !localPairCfg_.empty()); + m_staticlineSyncHeader->Show(!localPairCfg_.empty()); + m_panelSyncSettingsTab->Layout(); //misc bSizerMiscConfig->Show(mainConfigSelected); - Layout(); if (mainConfigSelected) { - setCompConfig (std::make_shared(globalCfg_.cmpConfig)); - setSyncConfig (std::make_shared(globalCfg_.syncCfg)); - setFilterConfig (globalCfg_.filter); - setMiscSyncOptions(globalCfg_.miscCfg); + setCompConfig (&globalPairCfg_.cmpConfig); + setSyncConfig (&globalPairCfg_.syncCfg); + setFilterConfig (globalPairCfg_.filter); + setMiscSyncOptions(globalPairCfg_.miscCfg); } else { - setCompConfig (folderPairConfig_[selectedPairIndexToShow_].altCmpConfig); - setSyncConfig (folderPairConfig_[selectedPairIndexToShow_].altSyncConfig); - setFilterConfig(folderPairConfig_[selectedPairIndexToShow_].localFilter); + setCompConfig (localPairCfg_[selectedPairIndexToShow_].localCmpCfg .get()); + setSyncConfig (localPairCfg_[selectedPairIndexToShow_].localSyncCfg.get()); + setFilterConfig(localPairCfg_[selectedPairIndexToShow_].localFilter); } } bool ConfigDialog::unselectFolderPairConfig() { - assert(selectedPairIndexToShow_ == -1 || makeUnsigned(selectedPairIndexToShow_) < folderPairConfig_.size()); + assert(selectedPairIndexToShow_ == -1 || makeUnsigned(selectedPairIndexToShow_) < localPairCfg_.size()); - auto compCfg = getCompConfig(); - auto syncCfg = getSyncConfig(); - auto filterCfg = getFilterConfig(); + Opt compCfg = getCompConfig(); + Opt syncCfg = getSyncConfig(); + FilterConfig filterCfg = getFilterConfig(); //------- parameter validation (BEFORE writing output!) ------- @@ -1151,16 +1166,16 @@ bool ConfigDialog::unselectFolderPairConfig() if (selectedPairIndexToShow_ < 0) { - globalCfg_.cmpConfig = *compCfg; - globalCfg_.syncCfg = *syncCfg; - globalCfg_.filter = filterCfg; - globalCfg_.miscCfg = getMiscSyncOptions(); + globalPairCfg_.cmpConfig = *compCfg; + globalPairCfg_.syncCfg = *syncCfg; + globalPairCfg_.filter = filterCfg; + globalPairCfg_.miscCfg = getMiscSyncOptions(); } else { - folderPairConfig_[selectedPairIndexToShow_].altCmpConfig = compCfg; - folderPairConfig_[selectedPairIndexToShow_].altSyncConfig = syncCfg; - folderPairConfig_[selectedPairIndexToShow_].localFilter = filterCfg; + localPairCfg_[selectedPairIndexToShow_].localCmpCfg = compCfg; + localPairCfg_[selectedPairIndexToShow_].localSyncCfg = syncCfg; + localPairCfg_[selectedPairIndexToShow_].localFilter = filterCfg; } selectedPairIndexToShow_ = EMPTY_PAIR_INDEX_SELECTED; @@ -1174,8 +1189,8 @@ void ConfigDialog::OnOkay(wxCommandEvent& event) if (!unselectFolderPairConfig()) return; - globalCfgOut_ = globalCfg_; - folderPairConfigOut_ = folderPairConfig_; + globalPairCfgOut_ = globalPairCfg_; + localPairCfgOut_ = localPairCfg_; EndModal(ReturnSyncConfig::BUTTON_OKAY); } @@ -1187,48 +1202,16 @@ ReturnSyncConfig::ButtonPressed fff::showSyncConfigDlg(wxWindow* parent, SyncConfigPanel panelToShow, int localPairIndexToShow, - std::vector& folderPairConfig, - - CompConfig& globalCmpConfig, - SyncConfig& globalSyncCfg, - FilterConfig& globalFilter, - - bool& ignoreErrors, - Zstring& postSyncCommand, - PostSyncCondition& postSyncCondition, - std::vector& commandHistory, + GlobalPairConfig& globalPairCfg, + std::vector& localPairConfig, size_t commandHistItemsMax) { - GlobalSyncConfig globalCfg; - globalCfg.cmpConfig = globalCmpConfig; - globalCfg.syncCfg = globalSyncCfg; - globalCfg.filter = globalFilter; - - globalCfg.miscCfg.ignoreErrors = ignoreErrors; - globalCfg.miscCfg.postSyncCommand = postSyncCommand; - globalCfg.miscCfg.postSyncCondition = postSyncCondition; - globalCfg.miscCfg.commandHistory = commandHistory; - ConfigDialog syncDlg(parent, panelToShow, localPairIndexToShow, - folderPairConfig, - globalCfg, + globalPairCfg, + localPairConfig, commandHistItemsMax); - const auto rv = static_cast(syncDlg.ShowModal()); - - if (rv != ReturnSyncConfig::BUTTON_CANCEL) - { - globalCmpConfig = globalCfg.cmpConfig; - globalSyncCfg = globalCfg.syncCfg; - globalFilter = globalCfg.filter; - - ignoreErrors = globalCfg.miscCfg.ignoreErrors; - postSyncCommand = globalCfg.miscCfg.postSyncCommand ; - postSyncCondition = globalCfg.miscCfg.postSyncCondition; - commandHistory = globalCfg.miscCfg.commandHistory; - } - - return rv; + return static_cast(syncDlg.ShowModal()); } diff --git a/FreeFileSync/Source/ui/sync_cfg.h b/FreeFileSync/Source/ui/sync_cfg.h index 9d64ffcf..a18207de 100755 --- a/FreeFileSync/Source/ui/sync_cfg.h +++ b/FreeFileSync/Source/ui/sync_cfg.h @@ -8,7 +8,7 @@ #define SYNC_CFG_H_31289470134253425 #include -#include "../lib/process_xml.h" +#include "../structures.h" namespace fff @@ -29,12 +29,22 @@ enum class SyncConfigPanel SYNC = 2, // }; -struct LocalPairConfig +struct MiscSyncConfig { - Zstring folderPairName; //read-only! - std::shared_ptr altCmpConfig; //optional - std::shared_ptr altSyncConfig; // - FilterConfig localFilter; + bool ignoreErrors = false; + size_t automaticRetryCount = 0; + size_t automaticRetryDelay = 0; + Zstring postSyncCommand; + PostSyncCondition postSyncCondition = PostSyncCondition::COMPLETION; + std::vector commandHistory; +}; + +struct GlobalPairConfig +{ + CompConfig cmpConfig; + SyncConfig syncCfg; + FilterConfig filter; + MiscSyncConfig miscCfg; }; @@ -42,16 +52,8 @@ ReturnSyncConfig::ButtonPressed showSyncConfigDlg(wxWindow* parent, SyncConfigPanel panelToShow, int localPairIndexToShow, //< 0 to show global config - std::vector& folderPairConfig, - - CompConfig& globalCmpConfig, - SyncConfig& globalSyncCfg, - FilterConfig& globalFilter, - - bool& ignoreErrors, - Zstring& postSyncCommand, - PostSyncCondition& postSyncCondition, - std::vector& commandHistory, + GlobalPairConfig& globalPairCfg, + std::vector& localPairConfig, size_t commandHistoryMax); } diff --git a/FreeFileSync/Source/ui/tray_icon.cpp b/FreeFileSync/Source/ui/tray_icon.cpp index 98412723..4508f7a6 100755 --- a/FreeFileSync/Source/ui/tray_icon.cpp +++ b/FreeFileSync/Source/ui/tray_icon.cpp @@ -133,7 +133,7 @@ wxIcon FfsTrayIcon::ProgressIconGenerator::get(double fraction) class FfsTrayIcon::TaskBarImpl : public wxTaskBarIcon { public: - TaskBarImpl(const std::function& onRequestResume) : onRequestResume_(onRequestResume) + TaskBarImpl(const std::function& requestResume) : requestResume_(requestResume) { Connect(wxEVT_TASKBAR_LEFT_DCLICK, wxEventHandler(TaskBarImpl::OnDoubleClick), nullptr, this); @@ -143,12 +143,12 @@ public: //=> the only way to distinguish single left click and double-click is to wait wxSystemSettings::GetMetric(wxSYS_DCLICK_MSEC) (480ms) which is way too long! } - void dontCallbackAnymore() { onRequestResume_ = nullptr; } + void dontCallbackAnymore() { requestResume_ = nullptr; } private: wxMenu* CreatePopupMenu() override { - if (!onRequestResume_) + if (!requestResume_) return nullptr; wxMenu* contextMenu = new wxMenu; @@ -170,16 +170,16 @@ private: switch (static_cast(event.GetId())) { case CONTEXT_RESTORE: - if (onRequestResume_) - onRequestResume_(); + if (requestResume_) + requestResume_(); break; } } void OnDoubleClick(wxEvent& event) { - if (onRequestResume_) - onRequestResume_(); + if (requestResume_) + requestResume_(); } //void OnLeftDownClick(wxEvent& event) @@ -192,12 +192,12 @@ private: // } //} - std::function onRequestResume_; + std::function requestResume_; }; -FfsTrayIcon::FfsTrayIcon(const std::function& onRequestResume) : - trayIcon_(new TaskBarImpl(onRequestResume)), +FfsTrayIcon::FfsTrayIcon(const std::function& requestResume) : + trayIcon_(new TaskBarImpl(requestResume)), iconGenerator_(std::make_unique(getResourceImage(L"FFS_tray_24x24").ConvertToImage())) { trayIcon_->SetIcon(iconGenerator_->get(activeFraction_), activeToolTip_); diff --git a/FreeFileSync/Source/ui/tray_icon.h b/FreeFileSync/Source/ui/tray_icon.h index e99d5127..d0aeaf78 100755 --- a/FreeFileSync/Source/ui/tray_icon.h +++ b/FreeFileSync/Source/ui/tray_icon.h @@ -27,7 +27,7 @@ namespace fff class FfsTrayIcon { public: - FfsTrayIcon(const std::function& onRequestResume); //callback only held during lifetime of this instance + FfsTrayIcon(const std::function& requestResume); //callback only held during lifetime of this instance ~FfsTrayIcon(); void setToolTip(const wxString& toolTip); diff --git a/FreeFileSync/Source/ui/tree_grid.cpp b/FreeFileSync/Source/ui/tree_grid.cpp index b802f294..d17985f7 100755 --- a/FreeFileSync/Source/ui/tree_grid.cpp +++ b/FreeFileSync/Source/ui/tree_grid.cpp @@ -24,7 +24,12 @@ using namespace fff; namespace { -const int WIDTH_PERCENTAGE_BAR = 60; +//let's NOT create wxWidgets objects statically: +const int PERCENTAGE_BAR_WIDTH_DIP = 60; +const int TREE_GRID_GAP_SIZE_DIP = 2; + +inline wxColor getColorPercentBorder () { return { 198, 198, 198 }; } +inline wxColor getColorPercentBackground() { return { 0xf8, 0xf8, 0xf8 }; } } @@ -157,48 +162,6 @@ void calcPercentage(std::vector>& workList) } -Zstring fff::getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR) -{ - Zstring commonTrail; - AbstractPath tmpPathL = itemPathL; - AbstractPath tmpPathR = itemPathR; - for (;;) - { - Opt parentPathL = AFS::getParentFolderPath(tmpPathL); - Opt parentPathR = AFS::getParentFolderPath(tmpPathR); - if (!parentPathL || !parentPathR) - break; - - const Zstring itemNameL = AFS::getItemName(tmpPathL); - const Zstring itemNameR = AFS::getItemName(tmpPathR); - if (!strEqual(itemNameL, itemNameR, CmpNaturalSort())) //let's compare case-insensitively even on Linux! - break; - - tmpPathL = *parentPathL; - tmpPathR = *parentPathR; - - commonTrail = AFS::appendPaths(itemNameL, commonTrail, FILE_NAME_SEPARATOR); - } - if (!commonTrail.empty()) - return commonTrail; - - auto getLastComponent = [](const AbstractPath& itemPath) - { - if (!AFS::getParentFolderPath(itemPath)) //= device root - return utfTo(AFS::getDisplayPath(itemPath)); - return AFS::getItemName(itemPath); - }; - - if (AFS::isNullPath(itemPathL)) - return getLastComponent(itemPathR); - else if (AFS::isNullPath(itemPathR)) - return getLastComponent(itemPathL); - else - return getLastComponent(itemPathL) + utfTo(SPACED_DASH) + - getLastComponent(itemPathR); -} - - template struct TreeView::LessShortName { @@ -216,8 +179,9 @@ struct TreeView::LessShortName switch (lhs.type) { case TreeView::TYPE_ROOT: - return makeSortDirection(LessNaturalSort() /*even on Linux*/, Int2Type())(static_cast(lhs.node)->displayName, - static_cast(rhs.node)->displayName); + return makeSortDirection(LessNaturalSort() /*even on Linux*/, + Int2Type())(utfTo(static_cast(lhs.node)->displayName), + utfTo(static_cast(rhs.node)->displayName)); case TreeView::TYPE_DIRECTORY: { @@ -698,16 +662,6 @@ std::unique_ptr TreeView::getLine(size_t row) const namespace { -//let's NOT create wxWidgets objects statically: -inline wxColor getColorPercentBorder () { return { 198, 198, 198 }; } -inline wxColor getColorPercentBackground() { return { 0xf8, 0xf8, 0xf8 }; } - -inline wxColor getColorTreeSelectionGradientFrom() { return Grid::getColorSelectionGradientFrom(); } -inline wxColor getColorTreeSelectionGradientTo () { return Grid::getColorSelectionGradientTo (); } - -const int iconSizeSmall = IconBuffer::getSize(IconBuffer::SIZE_SMALL); - - wxColor getColorForLevel(size_t level) { switch (level % 12) @@ -746,10 +700,10 @@ class GridDataTree : private wxEvtHandler, public GridData { public: GridDataTree(Grid& grid) : - rootBmp_(getResourceImage(L"rootFolder").ConvertToImage().Scale(iconSizeSmall, iconSizeSmall, wxIMAGE_QUALITY_HIGH)), - widthNodeIcon_(iconSizeSmall), + widthNodeIcon_(IconBuffer::getSize(IconBuffer::SIZE_SMALL)), widthLevelStep_(widthNodeIcon_), widthNodeStatus_(getResourceImage(L"node_expanded").GetWidth()), + rootBmp_(getResourceImage(L"rootFolder").ConvertToImage().Scale(widthNodeIcon_, widthNodeIcon_, wxIMAGE_QUALITY_BILINEAR)), //looks sharper than wxIMAGE_QUALITY_HIGH! grid_(grid) { grid.getMainWin().Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(GridDataTree::onKeyDown), nullptr, this); @@ -775,8 +729,8 @@ private: if (std::unique_ptr node = treeDataView_.getLine(row)) if (const TreeView::RootNode* root = dynamic_cast(node.get())) { - const std::wstring& dirLeft = AFS::getDisplayPath(root->baseFolder_.getAbstractPath< LEFT_SIDE>()); - const std::wstring& dirRight = AFS::getDisplayPath(root->baseFolder_.getAbstractPath()); + const std::wstring& dirLeft = AFS::getDisplayPath(root->baseFolder.getAbstractPath< LEFT_SIDE>()); + const std::wstring& dirRight = AFS::getDisplayPath(root->baseFolder.getAbstractPath()); if (dirLeft.empty()) return dirRight; else if (dirRight.empty()) @@ -799,9 +753,9 @@ private: { case ColumnTypeTree::FOLDER_NAME: if (const TreeView::RootNode* root = dynamic_cast(node.get())) - return utfTo(root->displayName_); + return root->displayName; else if (const TreeView::DirNode* dir = dynamic_cast(node.get())) - return utfTo(dir->folder_.getPairItemName()); + return utfTo(dir->folder.getPairItemName()); else if (dynamic_cast(node.get())) return _("Files"); break; @@ -821,20 +775,18 @@ private: wxRect rectInside = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectInside, highlighted); - rectInside.x += COLUMN_GAP_LEFT; - rectInside.width -= COLUMN_GAP_LEFT; + rectInside.x += getColumnGapLeft(); + rectInside.width -= getColumnGapLeft(); drawColumnLabelText(dc, rectInside, getColumnLabel(colType)); auto sortInfo = treeDataView_.getSortDirection(); if (colType == static_cast(sortInfo.first)) { - const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sortAscending" : L"sortDescending"); + const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sort_ascending" : L"sort_descending"); drawBitmapRtlNoMirror(dc, marker, rectInside, wxALIGN_CENTER_HORIZONTAL); } } - static const int GAP_SIZE = 2; - enum class HoverAreaTree { NODE, @@ -845,7 +797,7 @@ private: if (enabled) { if (selected) - dc.GradientFillLinear(rect, getColorTreeSelectionGradientFrom(), getColorTreeSelectionGradientTo(), wxEAST); + dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST); //ignore focus else clearArea(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); @@ -871,17 +823,17 @@ private: { ////clear first secion: //clearArea(dc, wxRect(rect.GetTopLeft(), wxSize( - // node->level_ * widthLevelStep_ + GAP_SIZE + //width - // (showPercentBar ? WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE : 0) + // - // widthNodeStatus_ + GAP_SIZE + widthNodeIcon + GAP_SIZE, // + // node->level_ * widthLevelStep_ + gridGap_ + //width + // (showPercentBar ? percentageBarWidth_ + 2 * gridGap_ : 0) + // + // widthNodeStatus_ + gridGap_ + widthNodeIcon + gridGap_, // // rect.height)), wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); //consume space rectTmp.x += static_cast(node->level_) * widthLevelStep_; rectTmp.width -= static_cast(node->level_) * widthLevelStep_; - rectTmp.x += GAP_SIZE; - rectTmp.width -= GAP_SIZE; + rectTmp.x += gridGap_; + rectTmp.width -= gridGap_; if (rectTmp.width > 0) { @@ -889,7 +841,7 @@ private: if (showPercentBar_) { - const wxRect areaPerc(rectTmp.x, rectTmp.y + 2, WIDTH_PERCENTAGE_BAR, rectTmp.height - 4); + const wxRect areaPerc(rectTmp.x, rectTmp.y + 2, percentageBarWidth_, rectTmp.height - 4); { //clear background wxDCPenChanger dummy (dc, getColorPercentBorder()); @@ -910,8 +862,8 @@ private: wxDCTextColourChanger dummy3(dc, *wxBLACK); //accessibility: always set both foreground AND background colors! drawCellText(dc, areaPerc, numberTo(node->percent_) + L"%", wxALIGN_CENTER); - rectTmp.x += WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE; - rectTmp.width -= WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE; + rectTmp.x += percentageBarWidth_ + 2 * gridGap_; + rectTmp.width -= percentageBarWidth_ + 2 * gridGap_; } if (rectTmp.width > 0) { @@ -941,8 +893,8 @@ private: break; } - rectTmp.x += widthNodeStatus_ + GAP_SIZE; - rectTmp.width -= widthNodeStatus_ + GAP_SIZE; + rectTmp.x += widthNodeStatus_ + gridGap_; + rectTmp.width -= widthNodeStatus_ + gridGap_; if (rectTmp.width > 0) { wxBitmap nodeIcon; @@ -953,7 +905,7 @@ private: else if (auto dir = dynamic_cast(node.get())) { nodeIcon = dirIcon_; - isActive = dir->folder_.isActive(); + isActive = dir->folder.isActive(); } else if (dynamic_cast(node.get())) nodeIcon = fileIcon_; @@ -963,8 +915,8 @@ private: drawBitmapRtlNoMirror(dc, nodeIcon, rectTmp, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); - rectTmp.x += widthNodeIcon_ + GAP_SIZE; - rectTmp.width -= widthNodeIcon_ + GAP_SIZE; + rectTmp.x += widthNodeIcon_ + gridGap_; + rectTmp.width -= widthNodeIcon_ + gridGap_; if (rectTmp.width > 0) { @@ -987,13 +939,13 @@ private: if ((static_cast(colType) == ColumnTypeTree::BYTES || static_cast(colType) == ColumnTypeTree::ITEM_COUNT) && grid_.GetLayoutDirection() != wxLayout_RightToLeft) { - rectTmp.width -= 2 * GAP_SIZE; + rectTmp.width -= 2 * gridGap_; alignment = wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL; } else //left-justified { - rectTmp.x += 2 * GAP_SIZE; - rectTmp.width -= 2 * GAP_SIZE; + rectTmp.x += 2 * gridGap_; + rectTmp.width -= 2 * gridGap_; } drawCellText(dc, rectTmp, getValue(row, colType), alignment); @@ -1007,15 +959,15 @@ private: if (static_cast(colType) == ColumnTypeTree::FOLDER_NAME) { if (std::unique_ptr node = treeDataView_.getLine(row)) - return node->level_ * widthLevelStep_ + GAP_SIZE + (showPercentBar_ ? WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE : 0) + widthNodeStatus_ + GAP_SIZE - + widthNodeIcon_ + GAP_SIZE + dc.GetTextExtent(getValue(row, colType)).GetWidth() + - GAP_SIZE; //additional gap from right + return node->level_ * widthLevelStep_ + gridGap_ + (showPercentBar_ ? percentageBarWidth_ + 2 * gridGap_ : 0) + widthNodeStatus_ + gridGap_ + + widthNodeIcon_ + gridGap_ + dc.GetTextExtent(getValue(row, colType)).GetWidth() + + gridGap_; //additional gap from right else return 0; } else - return 2 * GAP_SIZE + dc.GetTextExtent(getValue(row, colType)).GetWidth() + - 2 * GAP_SIZE; //include gap from right! + return 2 * gridGap_ + dc.GetTextExtent(getValue(row, colType)).GetWidth() + + 2 * gridGap_; //include gap from right! } HoverArea getRowMouseHover(size_t row, ColumnType colType, int cellRelativePosX, int cellWidth) override @@ -1026,7 +978,7 @@ private: if (std::unique_ptr node = treeDataView_.getLine(row)) { const int tolerance = 2; - const int nodeStatusXFirst = -tolerance + static_cast(node->level_) * widthLevelStep_ + GAP_SIZE + (showPercentBar_ ? WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE : 0); + const int nodeStatusXFirst = -tolerance + static_cast(node->level_) * widthLevelStep_ + gridGap_ + (showPercentBar_ ? percentageBarWidth_ + 2 * gridGap_ : 0); const int nodeStatusXLast = (nodeStatusXFirst + tolerance) + widthNodeStatus_ + tolerance; // -> synchronize renderCell() <-> getBestSize() <-> getRowMouseHover() @@ -1231,14 +1183,19 @@ private: TreeView treeDataView_; + const int gridGap_ = fastFromDIP(TREE_GRID_GAP_SIZE_DIP); + const int percentageBarWidth_ = fastFromDIP(PERCENTAGE_BAR_WIDTH_DIP); + const wxBitmap fileIcon_ = IconBuffer::genericFileIcon(IconBuffer::SIZE_SMALL); const wxBitmap dirIcon_ = IconBuffer::genericDirIcon (IconBuffer::SIZE_SMALL); - const wxBitmap rootBmp_; - Opt renderBuf_; //avoid costs of recreating this temporary variable const int widthNodeIcon_; const int widthLevelStep_; const int widthNodeStatus_; + + const wxBitmap rootBmp_; + Opt renderBuf_; //avoid costs of recreating this temporary variable + Grid& grid_; bool showPercentBar_ = true; }; diff --git a/FreeFileSync/Source/ui/tree_grid.h b/FreeFileSync/Source/ui/tree_grid.h index af57070d..22ae293d 100755 --- a/FreeFileSync/Source/ui/tree_grid.h +++ b/FreeFileSync/Source/ui/tree_grid.h @@ -69,25 +69,25 @@ public: struct FilesNode : public Node { - FilesNode(int percent, uint64_t bytes, int itemCount, unsigned int level, const std::vector& filesAndLinks) : - Node(percent, bytes, itemCount, level, STATUS_EMPTY), filesAndLinks_(filesAndLinks) {} + FilesNode(int percent, uint64_t bytes, int itemCount, unsigned int level, const std::vector& fsos) : + Node(percent, bytes, itemCount, level, STATUS_EMPTY), filesAndLinks(fsos) {} - std::vector filesAndLinks_; //files and symlinks matching view filter; pointers are bound! + std::vector filesAndLinks; //files and symlinks matching view filter; pointers are bound! }; struct DirNode : public Node { - DirNode(int percent, uint64_t bytes, int itemCount, unsigned int level, NodeStatus status, FolderPair& folder) : Node(percent, bytes, itemCount, level, status), folder_(folder) {} - FolderPair& folder_; + DirNode(int percent, uint64_t bytes, int itemCount, unsigned int level, NodeStatus status, FolderPair& fp) : Node(percent, bytes, itemCount, level, status), folder(fp) {} + FolderPair& folder; }; struct RootNode : public Node { - RootNode(int percent, uint64_t bytes, int itemCount, NodeStatus status, BaseFolderPair& baseFolder, const Zstring& displayName) : - Node(percent, bytes, itemCount, 0, status), baseFolder_(baseFolder), displayName_(displayName) {} + RootNode(int percent, uint64_t bytes, int itemCount, NodeStatus status, BaseFolderPair& bFolder, const std::wstring& dispName) : + Node(percent, bytes, itemCount, 0, status), baseFolder(bFolder), displayName(dispName) {} - BaseFolderPair& baseFolder_; - const Zstring displayName_; + BaseFolderPair& baseFolder; + const std::wstring displayName; }; std::unique_ptr getLine(size_t row) const; //return nullptr on error @@ -126,7 +126,7 @@ private: struct RootNodeImpl : public Container { std::shared_ptr baseFolder; - Zstring displayName; + std::wstring displayName; }; enum NodeType @@ -170,9 +170,6 @@ private: }; -Zstring getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR); - - namespace treegrid { void init(zen::Grid& grid); diff --git a/FreeFileSync/Source/ui/tree_grid_attr.h b/FreeFileSync/Source/ui/tree_grid_attr.h index ce37e468..aea8130a 100755 --- a/FreeFileSync/Source/ui/tree_grid_attr.h +++ b/FreeFileSync/Source/ui/tree_grid_attr.h @@ -9,6 +9,7 @@ #include #include +#include namespace fff @@ -32,16 +33,17 @@ struct ColAttributesTree inline std::vector getTreeGridDefaultColAttribs() { + using namespace zen; return //harmonize with tree_view.cpp::onGridLabelContext() => expects stretched FOLDER_NAME and non-stretched other columns! { - { ColumnTypeTree::FOLDER_NAME, -120, 1, true }, //stretch to full width and substract sum of fixed size widths - { ColumnTypeTree::ITEM_COUNT, 60, 0, true }, - { ColumnTypeTree::BYTES, 60, 0, true }, //GTK needs a few pixels more width + { ColumnTypeTree::FOLDER_NAME, fastFromDIP(-120), 1, true }, //stretch to full width and substract sum of fixed size widths + { ColumnTypeTree::ITEM_COUNT, fastFromDIP( 60), 0, true }, + { ColumnTypeTree::BYTES, fastFromDIP( 60), 0, true }, //GTK needs a few pixels more width }; } -const bool treeGridShowPercentageDefault = true; -const ColumnTypeTree treeGridLastSortColumnDefault = ColumnTypeTree::BYTES; +const bool treeGridShowPercentageDefault = true; +const ColumnTypeTree treeGridLastSortColumnDefault = ColumnTypeTree::BYTES; inline bool getDefaultSortDirection(ColumnTypeTree colType) diff --git a/FreeFileSync/Source/ui/triple_splitter.cpp b/FreeFileSync/Source/ui/triple_splitter.cpp index 0bc43101..0797b807 100755 --- a/FreeFileSync/Source/ui/triple_splitter.cpp +++ b/FreeFileSync/Source/ui/triple_splitter.cpp @@ -7,6 +7,7 @@ #include "triple_splitter.h" #include #include +#include using namespace zen; using namespace fff; @@ -15,10 +16,12 @@ using namespace fff; namespace { //------------ Grid Constants ------------------------------- -const int SASH_HIT_TOLERANCE = 5; //currently only a placebo! -const int SASH_SIZE = 10; +const int SASH_HIT_TOLERANCE_DIP = 5; //currently only a placebo! +const int SASH_SIZE_DIP = 10; +const int SASH_GRADIENT_SIZE_DIP = 3; + const double SASH_GRAVITY = 0.5; //value within [0, 1]; 1 := resize left only, 0 := resize right only -const int CHILD_WINDOW_MIN_SIZE = 50; //min. size of managed windows +const int CHILD_WINDOW_MIN_SIZE_DIP = 50; //min. size of managed windows //let's NOT create wxWidgets objects statically: inline wxColor getColorSashGradientFrom() { return { 192, 192, 192 }; } //light grey @@ -30,12 +33,13 @@ TripleSplitter::TripleSplitter(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, - long style) : wxWindow(parent, id, pos, size, style | wxTAB_TRAVERSAL) //tab between windows + long style) : wxWindow(parent, id, pos, size, style | wxTAB_TRAVERSAL), //tab between windows + sashSize_ (fastFromDIP(SASH_SIZE_DIP)), + childWindowMinSize_(fastFromDIP(CHILD_WINDOW_MIN_SIZE_DIP)) { - Connect(wxEVT_PAINT, wxPaintEventHandler(TripleSplitter::onPaintEvent ), nullptr, this); - Connect(wxEVT_SIZE, wxSizeEventHandler (TripleSplitter::onSizeEvent ), nullptr, this); - //http://wiki.wxwidgets.org/Flicker-Free_Drawing - Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(TripleSplitter::onEraseBackGround), nullptr, this); + Connect(wxEVT_PAINT, wxPaintEventHandler(TripleSplitter::onPaintEvent), nullptr, this); + Connect(wxEVT_SIZE, wxSizeEventHandler (TripleSplitter::onSizeEvent ), nullptr, this); + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing SetBackgroundStyle(wxBG_STYLE_PAINT); @@ -43,8 +47,8 @@ TripleSplitter::TripleSplitter(wxWindow* parent, Connect(wxEVT_LEFT_UP, wxMouseEventHandler(TripleSplitter::onMouseLeftUp ), nullptr, this); Connect(wxEVT_MOTION, wxMouseEventHandler(TripleSplitter::onMouseMovement ), nullptr, this); Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(TripleSplitter::onLeaveWindow ), nullptr, this); - Connect(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(TripleSplitter::onMouseCaptureLost), nullptr, this); Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(TripleSplitter::onMouseLeftDouble), nullptr, this); + Connect(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(TripleSplitter::onMouseCaptureLost), nullptr, this); } @@ -65,7 +69,7 @@ void TripleSplitter::updateWindowSizes() const int widthR = clientRect.width - windowRposX; windowL_->SetSize(0, 0, widthL, clientRect.height); - windowC_->SetSize(widthL + SASH_SIZE, 0, windowC_->GetSize().GetWidth(), clientRect.height); + windowC_->SetSize(widthL + sashSize_, 0, windowC_->GetSize().GetWidth(), clientRect.height); windowR_->SetSize(windowRposX, 0, widthR, clientRect.height); wxClientDC dc(this); @@ -101,7 +105,7 @@ private: inline int TripleSplitter::getCenterWidth() const { - return 2 * SASH_SIZE + (windowC_ ? windowC_->GetSize().GetWidth() : 0); + return 2 * sashSize_ + (windowC_ ? windowC_->GetSize().GetWidth() : 0); } @@ -120,12 +124,12 @@ int TripleSplitter::getCenterPosX() const const int centerPosXOptimal = getCenterPosXOptimal(); //normalize "centerPosXOptimal + centerOffset" - if (clientRect.width < 2 * CHILD_WINDOW_MIN_SIZE + centerWidth) - //use fixed "centeroffset" when "clientRect.width == 2 * CHILD_WINDOW_MIN_SIZE + centerWidth" - return centerPosXOptimal + CHILD_WINDOW_MIN_SIZE - static_cast(2 * CHILD_WINDOW_MIN_SIZE * SASH_GRAVITY); //avoid rounding error + if (clientRect.width < 2 * childWindowMinSize_ + centerWidth) + //use fixed "centeroffset" when "clientRect.width == 2 * childWindowMinSize_ + centerWidth" + return centerPosXOptimal + childWindowMinSize_ - static_cast(2 * childWindowMinSize_ * SASH_GRAVITY); //avoid rounding error //make sure transition between conditional branches is continuous! - return std::max(CHILD_WINDOW_MIN_SIZE, //make sure centerPosXOptimal + offset is within bounds - std::min(centerPosXOptimal + centerOffset_, clientRect.width - CHILD_WINDOW_MIN_SIZE - centerWidth)); + return std::max(childWindowMinSize_, //make sure centerPosXOptimal + offset is within bounds + std::min(centerPosXOptimal + centerOffset_, clientRect.width - childWindowMinSize_ - centerWidth)); } @@ -136,19 +140,16 @@ void TripleSplitter::drawSash(wxDC& dc) auto draw = [&](wxRect rect) { - const int sash2ndHalf = 3; - rect.width -= sash2ndHalf; + rect.width = fastFromDIP(SASH_GRADIENT_SIZE_DIP); dc.GradientFillLinear(rect, getColorSashGradientFrom(), getColorSashGradientTo(), wxEAST); rect.x += rect.width; - rect.width = sash2ndHalf; + rect.width = sashSize_ - fastFromDIP(SASH_GRADIENT_SIZE_DIP); dc.GradientFillLinear(rect, getColorSashGradientFrom(), getColorSashGradientTo(), wxWEST); - - static_assert(SASH_SIZE > sash2ndHalf, ""); }; - const wxRect rectSashL(centerPosX, 0, SASH_SIZE, GetClientRect().height); - const wxRect rectSashR(centerPosX + centerWidth - SASH_SIZE, 0, SASH_SIZE, GetClientRect().height); + const wxRect rectSashL(centerPosX, 0, sashSize_, GetClientRect().height); + const wxRect rectSashR(centerPosX + centerWidth - sashSize_, 0, sashSize_, GetClientRect().height); draw(rectSashL); draw(rectSashR); @@ -160,10 +161,10 @@ bool TripleSplitter::hitOnSashLine(int posX) const const int centerPosX = getCenterPosX(); const int centerWidth = getCenterWidth(); - //we don't get events outside of sash, so SASH_HIT_TOLERANCE is currently *useless* - auto hitSash = [&](int sashX) { return sashX - SASH_HIT_TOLERANCE <= posX && posX < sashX + SASH_SIZE + SASH_HIT_TOLERANCE; }; + //we don't get events outside of sash, so SASH_HIT_TOLERANCE_DIP is currently *useless* + auto hitSash = [&](int sashX) { return sashX - fastFromDIP(SASH_HIT_TOLERANCE_DIP) <= posX && posX < sashX + sashSize_ + fastFromDIP(SASH_HIT_TOLERANCE_DIP); }; - return hitSash(centerPosX) || hitSash(centerPosX + centerWidth - SASH_SIZE); //hit one of the two sash lines + return hitSash(centerPosX) || hitSash(centerPosX + centerWidth - sashSize_); //hit one of the two sash lines } diff --git a/FreeFileSync/Source/ui/triple_splitter.h b/FreeFileSync/Source/ui/triple_splitter.h index f14e8039..ea7974fe 100755 --- a/FreeFileSync/Source/ui/triple_splitter.h +++ b/FreeFileSync/Source/ui/triple_splitter.h @@ -49,7 +49,6 @@ public: void setSashOffset(int off) { centerOffset_ = off; updateWindowSizes(); } private: - void onEraseBackGround(wxEraseEvent& event) {} void onSizeEvent(wxSizeEvent& event) { updateWindowSizes(); event.Skip(); } void onPaintEvent(wxPaintEvent& event) @@ -77,6 +76,8 @@ private: std::unique_ptr activeMove_; int centerOffset_ = 0; //offset to add after "gravity" stretching + const int sashSize_; + const int childWindowMinSize_; wxWindow* windowL_ = nullptr; wxWindow* windowC_ = nullptr; diff --git a/FreeFileSync/Source/ui/version_check_impl.h b/FreeFileSync/Source/ui/version_check_impl.h old mode 100644 new mode 100755 index b33bb55b..ccf2c387 --- a/FreeFileSync/Source/ui/version_check_impl.h +++ b/FreeFileSync/Source/ui/version_check_impl.h @@ -45,7 +45,7 @@ time_t getVersionCheckCurrentTime() } -inline +//as declared in version_check.h: bool shouldRunAutomaticUpdateCheck(time_t lastUpdateCheck) { if (lastUpdateCheck == getVersionCheckInactiveId()) diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h index 44e25841..677f9556 100755 --- a/FreeFileSync/Source/version/version.h +++ b/FreeFileSync/Source/version/version.h @@ -3,7 +3,7 @@ namespace fff { -const char ffsVersion[] = "9.8"; //internal linkage! +const char ffsVersion[] = "9.9"; //internal linkage! const char FFS_VERSION_SEPARATOR = '.'; } diff --git a/wx+/bitmap_button.h b/wx+/bitmap_button.h index 379cf52d..dc7615c1 100755 --- a/wx+/bitmap_button.h +++ b/wx+/bitmap_button.h @@ -9,6 +9,7 @@ #include #include "image_tools.h" +#include "dc.h" namespace zen @@ -28,7 +29,7 @@ public: wxBitmapButton(parent, id, wxNullBitmap, pos, size, style | wxBU_AUTODRAW, validator, name) { SetLabel(label); } }; -void setBitmapTextLabel(wxBitmapButton& btn, const wxImage& img, const wxString& text, int gap = 5, int border = 5); +void setBitmapTextLabel(wxBitmapButton& btn, const wxImage& img, const wxString& text, int gap = fastFromDIP(5), int border = fastFromDIP(5)); //set bitmap label flicker free: void setImage(wxBitmapButton& button, const wxBitmap& bmp); diff --git a/wx+/choice_enum.h b/wx+/choice_enum.h index 6b2edd01..97c40b68 100755 --- a/wx+/choice_enum.h +++ b/wx+/choice_enum.h @@ -107,8 +107,6 @@ template void updateTooltipEnumVal(const EnumDescrList& mappi if (item.first == value) ctrl.SetToolTip(item.second.second); } - } - #endif //CHOICE_ENUM_H_132413545345687 diff --git a/wx+/dc.h b/wx+/dc.h index 55047a53..23c70d3f 100755 --- a/wx+/dc.h +++ b/wx+/dc.h @@ -9,7 +9,9 @@ #include #include +#include #include //for macro: wxALWAYS_NATIVE_DOUBLE_BUFFER +#include namespace zen @@ -41,6 +43,25 @@ void clearArea(wxDC& dc, const wxRect& rect, const wxColor& col) } +/* +Standard DPI: + Windows/Ubuntu: 96 x 96 + macOS: wxWidgets uses DIP (note: wxScreenDC().GetPPI() returns 72 x 72 which is a lie; looks like 96 x 96) +*/ +inline +int fastFromDIP(int d) //like wxWindow::FromDIP (but tied to primary monitor and buffered) +{ + +#ifdef wxHAVE_DPI_INDEPENDENT_PIXELS //pulled from wx/window.h + return d; //e.g. macOS, GTK3 +#else + assert(wxTheApp); //only call after wxWidgets was initalized! + static const int dpiY = wxScreenDC().GetPPI().y; //perf: buffering for calls to ::GetDeviceCaps() needed!? + const int defaultDpi = 96; + return numeric::round(1.0 * d * dpiY / defaultDpi); +#endif +} + diff --git a/wx+/font_size.h b/wx+/font_size.h index 636b07aa..2f2d377c 100755 --- a/wx+/font_size.h +++ b/wx+/font_size.h @@ -10,6 +10,7 @@ #include #include #include +#include "dc.h" namespace zen diff --git a/wx+/graph.cpp b/wx+/graph.cpp index dbce3769..b006cda0 100755 --- a/wx+/graph.cpp +++ b/wx+/graph.cpp @@ -203,12 +203,11 @@ void drawYLabel(wxDC& dc, double yMin, double yMax, int blockCount, const Conver void drawCornerText(wxDC& dc, const wxRect& graphArea, const wxString& txt, Graph2D::PosCorner pos, const wxColor& backgroundColor) { if (txt.empty()) return; - const int borderX = 5; - const int borderY = 2; //it looks like wxDC::GetMultiLineTextExtent() precisely returns width, but too large a height: maybe they consider "text row height"? - wxSize txtExtent = dc.GetMultiLineTextExtent(txt); - txtExtent.x += 2 * borderX; - txtExtent.y += 2 * borderY; + const wxSize border(fastFromDIP(5), fastFromDIP(2)); + //it looks like wxDC::GetMultiLineTextExtent() precisely returns width, but too large a height: maybe they consider "text row height"? + + const wxSize boxExtent = dc.GetMultiLineTextExtent(txt) + 2 * border; wxPoint drawPos = graphArea.GetTopLeft(); switch (pos) @@ -216,24 +215,24 @@ void drawCornerText(wxDC& dc, const wxRect& graphArea, const wxString& txt, Grap case Graph2D::CORNER_TOP_LEFT: break; case Graph2D::CORNER_TOP_RIGHT: - drawPos.x += graphArea.width - txtExtent.GetWidth(); + drawPos.x += graphArea.width - boxExtent.GetWidth(); break; case Graph2D::CORNER_BOTTOM_LEFT: - drawPos.y += graphArea.height - txtExtent.GetHeight(); + drawPos.y += graphArea.height - boxExtent.GetHeight(); break; case Graph2D::CORNER_BOTTOM_RIGHT: - drawPos.x += graphArea.width - txtExtent.GetWidth(); - drawPos.y += graphArea.height - txtExtent.GetHeight(); + drawPos.x += graphArea.width - boxExtent.GetWidth(); + drawPos.y += graphArea.height - boxExtent.GetHeight(); break; } { //add text shadow to improve readability: wxDCTextColourChanger dummy(dc, backgroundColor); - dc.DrawText(txt, drawPos + wxPoint(borderX + 1, borderY + 1)); + dc.DrawText(txt, drawPos + border + wxSize(fastFromDIP(1), fastFromDIP(1))); } wxDCTextColourChanger dummy(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); - dc.DrawText(txt, drawPos + wxPoint(borderX, borderY)); + dc.DrawText(txt, drawPos + border); } @@ -452,8 +451,7 @@ Graph2D::Graph2D(wxWindow* parent, { Connect(wxEVT_PAINT, wxPaintEventHandler(Graph2D::onPaintEvent), nullptr, this); Connect(wxEVT_SIZE, wxSizeEventHandler (Graph2D::onSizeEvent ), nullptr, this); - //http://wiki.wxwidgets.org/Flicker-Free_Drawing - Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(Graph2D::onEraseBackGround), nullptr, this); + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing //SetDoubleBuffered(true); slow as hell! @@ -548,6 +546,9 @@ void Graph2D::render(wxDC& dc) const //wxPanel::GetClassDefaultAttributes().colBg : //wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); + const int xLabelHeight = attr_.xLabelHeight ? *attr_.xLabelHeight : GetCharHeight() + fastFromDIP(2) /*margin*/; + const int yLabelWidth = attr_.yLabelWidth ? *attr_.yLabelWidth : dc.GetTextExtent(L"1,23457e+07").x; + /* ----------------------- | | x-label | @@ -562,12 +563,12 @@ void Graph2D::render(wxDC& dc) const switch (attr_.labelposX) { case LABEL_X_TOP: - graphArea.y += attr_.xLabelHeight; - graphArea.height -= attr_.xLabelHeight; + graphArea.y += xLabelHeight; + graphArea.height -= xLabelHeight; break; case LABEL_X_BOTTOM: - xLabelPosY += clientRect.height - attr_.xLabelHeight; - graphArea.height -= attr_.xLabelHeight; + xLabelPosY += clientRect.height - xLabelHeight; + graphArea.height -= xLabelHeight; break; case LABEL_X_NONE: break; @@ -575,17 +576,20 @@ void Graph2D::render(wxDC& dc) const switch (attr_.labelposY) { case LABEL_Y_LEFT: - graphArea.x += attr_.yLabelWidth; - graphArea.width -= attr_.yLabelWidth; + graphArea.x += yLabelWidth; + graphArea.width -= yLabelWidth; break; case LABEL_Y_RIGHT: - yLabelPosX += clientRect.width - attr_.yLabelWidth; - graphArea.width -= attr_.yLabelWidth; + yLabelPosX += clientRect.width - yLabelWidth; + graphArea.width -= yLabelWidth; break; case LABEL_Y_NONE: break; } + assert(attr_.labelposX == LABEL_X_NONE || attr_.labelFmtX); + assert(attr_.labelposY == LABEL_Y_NONE || attr_.labelFmtY); + { //paint graph background (excluding label area) wxDCPenChanger dummy (dc, getBorderColor()); @@ -597,13 +601,13 @@ void Graph2D::render(wxDC& dc) const } //set label areas respecting graph area border! - const wxRect xLabelArea(graphArea.x, xLabelPosY, graphArea.width, attr_.xLabelHeight); - const wxRect yLabelArea(yLabelPosX, graphArea.y, attr_.yLabelWidth, graphArea.height); + const wxRect xLabelArea(graphArea.x, xLabelPosY, graphArea.width, xLabelHeight); + const wxRect yLabelArea(yLabelPosX, graphArea.y, yLabelWidth, graphArea.height); const wxPoint graphAreaOrigin = graphArea.GetTopLeft(); //detect x value range - double minX = attr_.minXauto ? std::numeric_limits::infinity() : attr_.minX; //automatic: ensure values are initialized by first curve - double maxX = attr_.maxXauto ? -std::numeric_limits::infinity() : attr_.maxX; // + double minX = attr_.minX ? *attr_.minX : std::numeric_limits::infinity(); //automatic: ensure values are initialized by first curve + double maxX = attr_.maxX ? *attr_.maxX : -std::numeric_limits::infinity(); // for (auto it = curves_.begin(); it != curves_.end(); ++it) if (const CurveData* curve = it->first.get()) { @@ -611,9 +615,9 @@ void Graph2D::render(wxDC& dc) const assert(rangeX.first <= rangeX.second + 1.0e-9); //GCC fucks up badly when comparing two *binary identical* doubles and finds "begin > end" with diff of 1e-18 - if (attr_.minXauto) + if (!attr_.minX) minX = std::min(minX, rangeX.first); - if (attr_.maxXauto) + if (!attr_.maxX) maxX = std::max(maxX, rangeX.second); } @@ -630,8 +634,8 @@ void Graph2D::render(wxDC& dc) const *attr_.labelFmtX); //get raw values + detect y value range - double minY = attr_.minYauto ? std::numeric_limits::infinity() : attr_.minY; //automatic: ensure values are initialized by first curve - double maxY = attr_.maxYauto ? -std::numeric_limits::infinity() : attr_.maxY; // + double minY = attr_.minY ? *attr_.minY : std::numeric_limits::infinity(); //automatic: ensure values are initialized by first curve + double maxY = attr_.maxY ? *attr_.maxY : -std::numeric_limits::infinity(); // std::vector> curvePoints(curves_.size()); std::vector> oobMarker (curves_.size()); //effectively a std::vector marking points that start an out-of-bounds line @@ -650,12 +654,12 @@ void Graph2D::render(wxDC& dc) const const bool doPolygonCut = curves_[index].second.fillMode == CurveAttributes::FILL_POLYGON; //impacts auto minY/maxY!! cutPointsOutsideX(points, marker, minX, maxX, doPolygonCut); - if (attr_.minYauto || attr_.maxYauto) + if (!attr_.minY || !attr_.maxY) { auto itPair = std::minmax_element(points.begin(), points.end(), [](const CurvePoint& lhs, const CurvePoint& rhs) { return lhs.y < rhs.y; }); - if (attr_.minYauto) + if (!attr_.minY) minY = std::min(minY, itPair.first->y); - if (attr_.maxYauto) + if (!attr_.maxY) maxY = std::max(maxY, itPair.second->y); } } @@ -805,8 +809,8 @@ void Graph2D::render(wxDC& dc) const } //3. draw labels and background grid - drawXLabel(dc, minX, maxX, blockCountX, cvrtX, graphArea, xLabelArea, *attr_.labelFmtX); - drawYLabel(dc, minY, maxY, blockCountY, cvrtY, graphArea, yLabelArea, *attr_.labelFmtY); + if (attr_.labelFmtX) drawXLabel(dc, minX, maxX, blockCountX, cvrtX, graphArea, xLabelArea, *attr_.labelFmtX); + if (attr_.labelFmtY) drawYLabel(dc, minY, maxY, blockCountY, cvrtY, graphArea, yLabelArea, *attr_.labelFmtY); //4. finally draw curves { diff --git a/wx+/graph.h b/wx+/graph.h index 45129c4b..bf0e7a70 100755 --- a/wx+/graph.h +++ b/wx+/graph.h @@ -101,12 +101,12 @@ private: struct VectorCurveData : public ArrayCurveData { - std::vector& refData() { return data; } + std::vector& refData() { return data_; } private: - double getValue(size_t pos) const override { return pos < data.size() ? data[pos] : 0; } - size_t getSize() const override { return data.size(); } + double getValue(size_t pos) const override { return pos < data_.size() ? data_[pos] : 0; } + size_t getSize() const override { return data_.size(); } - std::vector data; + std::vector data_; }; //------------------------------------------------------------------------------------------------------------ @@ -128,7 +128,7 @@ double nextNiceNumber(double blockSize); //round to next number which is conveni struct DecimalNumberFormatter : public LabelFormatter { double getOptimalBlockSize(double sizeProposed ) const override { return nextNiceNumber(sizeProposed); } - wxString formatText (double value, double optimalBlockSize) const override { return zen::numberTo(value); } + wxString formatText (double value, double optimalBlockSize) const override { return numberTo(value); } }; //------------------------------------------------------------------------------------------------------------ @@ -178,7 +178,7 @@ public: { public: CurveAttributes() {} //required by GCC - CurveAttributes& setColor (const wxColor& col) { color = col; autoColor = false; return *this; } + CurveAttributes& setColor (const wxColor& col) { color = col; autoColor = false; return *this; } CurveAttributes& fillCurveArea (const wxColor& col) { fillColor = col; fillMode = FILL_CURVE; return *this; } CurveAttributes& fillPolygonArea(const wxColor& col) { fillColor = col; fillMode = FILL_POLYGON; return *this; } CurveAttributes& setLineWidth(size_t width) { lineWidth = static_cast(width); return *this; } @@ -240,26 +240,26 @@ public: class MainAttributes { public: - MainAttributes& setMinX(double newMinX) { minX = newMinX; minXauto = false; return *this; } - MainAttributes& setMaxX(double newMaxX) { maxX = newMaxX; maxXauto = false; return *this; } + MainAttributes& setMinX(double newMinX) { minX = newMinX; return *this; } + MainAttributes& setMaxX(double newMaxX) { maxX = newMaxX; return *this; } - MainAttributes& setMinY(double newMinY) { minY = newMinY; minYauto = false; return *this; } - MainAttributes& setMaxY(double newMaxY) { maxY = newMaxY; maxYauto = false; return *this; } + MainAttributes& setMinY(double newMinY) { minY = newMinY; return *this; } + MainAttributes& setMaxY(double newMaxY) { maxY = newMaxY; return *this; } - MainAttributes& setAutoSize() { minXauto = maxXauto = minYauto = maxYauto = true; return *this; } + MainAttributes& setAutoSize() { minX = maxX = minY = maxY = NoValue(); return *this; } - MainAttributes& setLabelX(PosLabelX posX, size_t height = 25, std::shared_ptr newLabelFmt = std::make_shared()) + MainAttributes& setLabelX(PosLabelX posX, int height = -1, std::shared_ptr newLabelFmt = nullptr) { - labelposX = posX; - xLabelHeight = static_cast(height); - labelFmtX = newLabelFmt; + labelposX = posX; + if (height >= 0) xLabelHeight = height; + if (newLabelFmt) labelFmtX = newLabelFmt; return *this; } - MainAttributes& setLabelY(PosLabelY posY, size_t width = 60, std::shared_ptr newLabelFmt = std::make_shared()) + MainAttributes& setLabelY(PosLabelY posY, int width = -1, std::shared_ptr newLabelFmt = nullptr) { - labelposY = posY; - yLabelWidth = static_cast(width); - labelFmtY = newLabelFmt; + labelposY = posY; + if (width >= 0) yLabelWidth = width; + if (newLabelFmt) labelFmtY = newLabelFmt; return *this; } @@ -272,22 +272,18 @@ public: private: friend class Graph2D; - bool minXauto = true; //autodetect range for X value - bool maxXauto = true; - double minX = 0; //x-range to visualize - double maxX = 0; // + Opt minX; //x-range to visualize + Opt maxX; // - bool minYauto = true; //autodetect range for Y value - bool maxYauto = true; - double minY = 0; //y-range to visualize - double maxY = 0; // + Opt minY; //y-range to visualize + Opt maxY; // PosLabelX labelposX = LABEL_X_BOTTOM; - int xLabelHeight = 25; + Opt xLabelHeight; std::shared_ptr labelFmtX = std::make_shared(); PosLabelY labelposY = LABEL_Y_LEFT; - int yLabelWidth = 60; + Opt yLabelWidth; std::shared_ptr labelFmtY = std::make_shared(); std::map cornerTexts; @@ -295,6 +291,7 @@ public: wxColor backgroundColor = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); SelMode mouseSelMode = SELECT_RECTANGLE; }; + void setAttributes(const MainAttributes& newAttr) { attr_ = newAttr; Refresh(); } MainAttributes getAttributes() const { return attr_; } @@ -315,7 +312,6 @@ private: void onPaintEvent(wxPaintEvent& event); void onSizeEvent(wxSizeEvent& event) { Refresh(); event.Skip(); } - void onEraseBackGround(wxEraseEvent& event) {} void render(wxDC& dc) const; diff --git a/wx+/grid.cpp b/wx+/grid.cpp index 64f7f4a6..a1beee01 100755 --- a/wx+/grid.cpp +++ b/wx+/grid.cpp @@ -25,15 +25,15 @@ using namespace zen; -wxColor Grid::getColorSelectionGradientFrom() { return { 137, 172, 255 }; } //blue: HSL: 158, 255, 196 HSV: 222, 0.46, 1 -wxColor Grid::getColorSelectionGradientTo () { return { 225, 234, 255 }; } // HSL: 158, 255, 240 HSV: 222, 0.12, 1 +//let's NOT create wxWidgets objects statically: +wxColor GridData::getColorSelectionGradientFrom() { return { 137, 172, 255 }; } //blue: HSL: 158, 255, 196 HSV: 222, 0.46, 1 +wxColor GridData::getColorSelectionGradientTo () { return { 225, 234, 255 }; } // HSL: 158, 255, 240 HSV: 222, 0.12, 1 -const int GridData::COLUMN_GAP_LEFT = 4; +int GridData::getColumnGapLeft() { return fastFromDIP(4); } namespace { -//let's NOT create wxWidgets objects statically: //------------------------------ Grid Parameters -------------------------------- inline wxColor getColorLabelText() { return wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); } inline wxColor getColorGridLine() { return { 192, 192, 192 }; } //light grey @@ -42,15 +42,16 @@ inline wxColor getColorLabelGradientFrom() { return wxSystemSettings::GetColour( inline wxColor getColorLabelGradientTo () { return { 200, 200, 200 }; } //light grey inline wxColor getColorLabelGradientFocusFrom() { return getColorLabelGradientFrom(); } -inline wxColor getColorLabelGradientFocusTo () { return Grid::getColorSelectionGradientFrom(); } +inline wxColor getColorLabelGradientFocusTo () { return GridData::getColorSelectionGradientFrom(); } -const double MOUSE_DRAG_ACCELERATION = 1.5; //unit: [rows / (pixel * sec)] -> same value like Explorer! -const int DEFAULT_COL_LABEL_BORDER = 6; //top + bottom border in addition to label height -const int COLUMN_MOVE_DELAY = 5; //unit: [pixel] (from Explorer) -const int COLUMN_MIN_WIDTH = 40; //only honored when resizing manually! -const int ROW_LABEL_BORDER = 3; -const int COLUMN_RESIZE_TOLERANCE = 6; //unit [pixel] -const int COLUMN_FILL_GAP_TOLERANCE = 10; //enlarge column to fill full width when resizing +const double MOUSE_DRAG_ACCELERATION_DIP = 1.5; //unit: [rows / (DIP * sec)] -> same value like Explorer! +const int DEFAULT_COL_LABEL_BORDER_DIP = 6; //top + bottom border in addition to label height +const int COLUMN_MOVE_DELAY_DIP = 5; //unit: [pixel] (from Explorer) +const int COLUMN_MIN_WIDTH_DIP = 40; //only honored when resizing manually! +const int ROW_LABEL_BORDER_DIP = 3; +const int COLUMN_RESIZE_TOLERANCE_DIP = 6; //unit [pixel] +const int COLUMN_FILL_GAP_TOLERANCE_DIP = 10; //enlarge column to fill full width when resizing +const int COLUMN_MOVE_MARKER_WIDTH_DIP = 3; const bool fillGapAfterColumns = true; //draw rows/column label to fill full window width; may become an instance variable some time? } @@ -77,15 +78,15 @@ void GridData::renderCell(wxDC& dc, const wxRect& rect, size_t row, ColumnType c { wxRect rectTmp = drawCellBorder(dc, rect); - rectTmp.x += COLUMN_GAP_LEFT; - rectTmp.width -= COLUMN_GAP_LEFT; + rectTmp.x += getColumnGapLeft(); + rectTmp.width -= getColumnGapLeft(); drawCellText(dc, rectTmp, getValue(row, colType)); } int GridData::getBestSize(wxDC& dc, size_t row, ColumnType colType) { - return dc.GetTextExtent(getValue(row, colType)).GetWidth() + 2 * COLUMN_GAP_LEFT + 1; //gap on left and right side + border + return dc.GetTextExtent(getValue(row, colType)).GetWidth() + 2 * getColumnGapLeft() + 1; //gap on left and right side + border } @@ -104,7 +105,7 @@ void GridData::drawCellBackground(wxDC& dc, const wxRect& rect, bool enabled, bo if (enabled) { if (selected) - dc.GradientFillLinear(rect, Grid::getColorSelectionGradientFrom(), Grid::getColorSelectionGradientTo(), wxEAST); + dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST); else clearArea(dc, rect, backgroundColor); } @@ -186,8 +187,8 @@ void GridData::renderColumnLabel(Grid& grid, wxDC& dc, const wxRect& rect, Colum wxRect rectTmp = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectTmp, highlighted); - rectTmp.x += COLUMN_GAP_LEFT; - rectTmp.width -= COLUMN_GAP_LEFT; + rectTmp.x += getColumnGapLeft(); + rectTmp.width -= getColumnGapLeft(); drawColumnLabelText(dc, rectTmp, getColumnLabel(colType)); } @@ -245,15 +246,14 @@ public: { Connect(wxEVT_PAINT, wxPaintEventHandler(SubWindow::onPaintEvent), nullptr, this); Connect(wxEVT_SIZE, wxSizeEventHandler (SubWindow::onSizeEvent), nullptr, this); - //http://wiki.wxwidgets.org/Flicker-Free_Drawing - Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(SubWindow::onEraseBackGround), nullptr, this); + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing //SetDoubleBuffered(true); slow as hell! SetBackgroundStyle(wxBG_STYLE_PAINT); - Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this); - Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this); + Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this); + Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this); Connect(wxEVT_CHILD_FOCUS, wxEventHandler(SubWindow::onChildFocus), nullptr, this); Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(SubWindow::onMouseLeftDown ), nullptr, this); @@ -364,8 +364,6 @@ private: event.Skip(); } - void onEraseBackGround(wxEraseEvent& event) {} - Grid& parent_; Opt doubleBuffer_; }; @@ -429,7 +427,7 @@ public: int bestWidth = 0; for (ptrdiff_t i = rowFrom; i <= rowTo; ++i) - bestWidth = std::max(bestWidth, dc.GetTextExtent(formatRow(i)).GetWidth() + 2 * ROW_LABEL_BORDER); + bestWidth = std::max(bestWidth, dc.GetTextExtent(formatRow(i)).GetWidth() + fastFromDIP(2 * ROW_LABEL_BORDER_DIP)); return bestWidth; } @@ -671,10 +669,12 @@ private: if (refParent().allowColumnMove_) if (activeClickOrMove_ && activeClickOrMove_->isRealMove()) { + const int markerWidth = fastFromDIP(COLUMN_MOVE_MARKER_WIDTH_DIP); + if (col + 1 == activeClickOrMove_->refColumnTo()) //handle pos 1, 2, .. up to "at end" position - dc.GradientFillLinear(wxRect(rect.GetTopRight(), rect.GetBottomRight() + wxPoint(-2, 0)), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH); + dc.GradientFillLinear(wxRect(rect.x + rect.width - markerWidth, rect.y, markerWidth, rect.height), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH); else if (col == activeClickOrMove_->refColumnTo() && col == 0) //pos 0 - dc.GradientFillLinear(wxRect(rect.GetTopLeft(), rect.GetBottomLeft() + wxPoint(2, 0)), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH); + dc.GradientFillLinear(wxRect(rect.GetTopLeft(), wxSize(markerWidth, rect.height)), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH); } } } @@ -769,7 +769,7 @@ private: //check if there's a small gap after last column, if yes, fill it const int gapWidth = GetClientSize().GetWidth() - refParent().getColWidthsSum(GetClientSize().GetWidth()); - if (std::abs(gapWidth) < COLUMN_FILL_GAP_TOLERANCE) + if (std::abs(gapWidth) < fastFromDIP(COLUMN_FILL_GAP_TOLERANCE_DIP)) refParent().setColumnWidth(newWidth + gapWidth, col, ALLOW_GRID_EVENT); refParent().Refresh(); //refresh columns on main grid as well! @@ -777,7 +777,7 @@ private: else if (activeClickOrMove_) { const int clientPosX = event.GetPosition().x; - if (std::abs(clientPosX - activeClickOrMove_->getStartPosX()) > COLUMN_MOVE_DELAY) //real move (not a single click) + if (std::abs(clientPosX - activeClickOrMove_->getStartPosX()) > fastFromDIP(COLUMN_MOVE_DELAY_DIP)) //real move (not a single click) { activeClickOrMove_->setRealMove(); @@ -1163,13 +1163,13 @@ private: wnd_.refParent().GetScrollPixelsPerUnit(nullptr, &pixelsPerUnitY); if (pixelsPerUnitY <= 0) return; - const double mouseDragSpeedIncScrollU = pixelsPerUnitY > 0 ? MOUSE_DRAG_ACCELERATION * wnd_.rowLabelWin_.getRowHeight() / pixelsPerUnitY : 0; //unit: [scroll units / (pixel * sec)] + const double mouseDragSpeedIncScrollU = pixelsPerUnitY > 0 ? MOUSE_DRAG_ACCELERATION_DIP * wnd_.rowLabelWin_.getRowHeight() / pixelsPerUnitY : 0; //unit: [scroll units / (DIP * sec)] auto autoScroll = [&](int overlapPix, double& toScroll) { if (overlapPix != 0) { - const double scrollSpeed = overlapPix * mouseDragSpeedIncScrollU; //unit: [scroll units / sec] + const double scrollSpeed = wnd_.ToDIP(overlapPix) * mouseDragSpeedIncScrollU; //unit: [scroll units / sec] toScroll += scrollSpeed * deltaSecs; } else @@ -1291,7 +1291,7 @@ Grid::Grid(wxWindow* parent, colLabelWin_ = new ColLabelWin(*this); // mainWin_ = new MainWin (*this, *rowLabelWin_, *colLabelWin_); // - colLabelHeight_ = 2 * DEFAULT_COL_LABEL_BORDER + [&]() -> int + colLabelHeight_ = fastFromDIP(2 * DEFAULT_COL_LABEL_BORDER_DIP) + [&] { //coordinate with ColLabelWin::render(): wxFont labelFont = colLabelWin_->GetFont(); @@ -1306,9 +1306,9 @@ Grid::Grid(wxWindow* parent, assert(GetClientSize() == GetSize()); //borders are NOT allowed for Grid //reason: updateWindowSizes() wants to use "GetSize()" as a "GetClientSize()" including scrollbars - Connect(wxEVT_PAINT, wxPaintEventHandler(Grid::onPaintEvent ), nullptr, this); - Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(Grid::onEraseBackGround), nullptr, this); - Connect(wxEVT_SIZE, wxSizeEventHandler (Grid::onSizeEvent ), nullptr, this); + Connect(wxEVT_PAINT, wxPaintEventHandler(Grid::onPaintEvent), nullptr, this); + Connect(wxEVT_SIZE, wxSizeEventHandler (Grid::onSizeEvent ), nullptr, this); + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(Grid::onKeyDown), nullptr, this); } @@ -1820,7 +1820,7 @@ Opt Grid::clientPosToColumnAction(const wxPoint& pos) const const int absPosX = CalcUnscrolledPosition(pos).x; if (absPosX >= 0) { - const int resizeTolerance = allowColumnResize_ ? COLUMN_RESIZE_TOLERANCE : 0; + const int resizeTolerance = allowColumnResize_ ? fastFromDIP(COLUMN_RESIZE_TOLERANCE_DIP) : 0; std::vector absWidths = getColWidths(); //resolve stretched widths int accuWidth = 0; @@ -2104,10 +2104,10 @@ void Grid::setColumnWidth(int width, size_t col, GridEventPolicy columnResizeEve return; } //CAVEATS: - //I. fixed-size columns: normalize offset so that resulting width is at least COLUMN_MIN_WIDTH: this is NOT enforced by getColWidths()! + //I. fixed-size columns: normalize offset so that resulting width is at least COLUMN_MIN_WIDTH_DIP: this is NOT enforced by getColWidths()! //II. stretched columns: do not allow user to set offsets so small that they result in negative (non-normalized) widths: this gives an //unusual delay when enlarging the column again later - width = std::max(width, COLUMN_MIN_WIDTH); + width = std::max(width, fastFromDIP(COLUMN_MIN_WIDTH_DIP)); vcRs.offset = width - stretchedWidths[col]; //width := stretchedWidth + offset @@ -2119,7 +2119,7 @@ void Grid::setColumnWidth(int width, size_t col, GridEventPolicy columnResizeEve //4. now verify that the stretched column is resizing immediately if main window is enlarged again for (size_t col2 = 0; col2 < visibleCols_.size(); ++col2) if (visibleCols_[col2].stretch > 0) //normalize stretched columns only - visibleCols_[col2].offset = std::max(visibleCols_[col2].offset, COLUMN_MIN_WIDTH - stretchedWidths[col2]); + visibleCols_[col2].offset = std::max(visibleCols_[col2].offset, fastFromDIP(COLUMN_MIN_WIDTH_DIP) - stretchedWidths[col2]); if (columnResizeEventPolicy == ALLOW_GRID_EVENT) { @@ -2213,9 +2213,9 @@ std::vector Grid::getColWidths(int mainWinWidth) const //eval int width = stretchedWidths[col2] + vc.offset; if (vc.stretch > 0) - width = std::max(width, COLUMN_MIN_WIDTH); //normalization really needed here: e.g. smaller main window would result in negative width + width = std::max(width, fastFromDIP(COLUMN_MIN_WIDTH_DIP)); //normalization really needed here: e.g. smaller main window would result in negative width else - width = std::max(width, 0); //support smaller width than COLUMN_MIN_WIDTH if set via configuration + width = std::max(width, 0); //support smaller width than COLUMN_MIN_WIDTH_DIP if set via configuration output.push_back({ vc.type, width }); } diff --git a/wx+/grid.h b/wx+/grid.h index a5c1a783..c90981b5 100755 --- a/wx+/grid.h +++ b/wx+/grid.h @@ -118,7 +118,9 @@ public: virtual void renderColumnLabel(Grid& grid, wxDC& dc, const wxRect& rect, ColumnType colType, bool highlighted); //default implementation virtual std::wstring getToolTip(ColumnType colType) const { return std::wstring(); } - static const int COLUMN_GAP_LEFT; //for left-aligned text + static int getColumnGapLeft(); //for left-aligned text + static wxColor getColorSelectionGradientFrom(); + static wxColor getColorSelectionGradientTo(); //optional helper routines: static wxSize drawCellText (wxDC& dc, const wxRect& rect, const std::wstring& text, int alignment = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); //returns text extent @@ -223,12 +225,8 @@ public: //############################################################################################################ - static wxColor getColorSelectionGradientFrom(); - static wxColor getColorSelectionGradientTo(); - private: void onPaintEvent(wxPaintEvent& event); - void onEraseBackGround(wxEraseEvent& event) {} //[!] void onSizeEvent(wxSizeEvent& event) { updateWindowSizes(); event.Skip(); } void onKeyDown(wxKeyEvent& event); diff --git a/wx+/image_holder.h b/wx+/image_holder.h new file mode 100755 index 00000000..6804d5fc --- /dev/null +++ b/wx+/image_holder.h @@ -0,0 +1,52 @@ +// ***************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * +// ***************************************************************************** + +#ifndef IMAGE_HOLDER_H_284578426342567457 +#define IMAGE_HOLDER_H_284578426342567457 + +#include + +//used by fs/abstract.h => check carefully before adding dependencies! +//DO NOT add any wx/wx+ includes! + +namespace zen +{ +struct ImageHolder //prepare conversion to wxImage as much as possible while staying thread-safe (in contrast to wxIcon/wxBitmap) +{ + ImageHolder() {} + + ImageHolder(int w, int h, bool withAlpha) : //init with allocated memory + width_(w), height_(h), + rgb_(static_cast(::malloc(w * h * 3))), + alpha_(withAlpha ? static_cast(::malloc(w * h)) : nullptr) {} + + ImageHolder (ImageHolder&& tmp) = default; // + ImageHolder& operator=(ImageHolder&& tmp) = default; //move semantics only! + ImageHolder (const ImageHolder&) = delete; // + ImageHolder& operator=(const ImageHolder&) = delete; // + + explicit operator bool() const { return rgb_.get() != nullptr; } + + int getWidth () const { return width_; } + int getHeight() const { return height_; } + + unsigned char* getRgb () { return rgb_ .get(); } + unsigned char* getAlpha() { return alpha_.get(); } + + unsigned char* releaseRgb () { return rgb_ .release(); } + unsigned char* releaseAlpha() { return alpha_.release(); } + + struct CLibFree { void operator()(unsigned char* p) const { ::free(p); } }; //use malloc/free to allow direct move into wxImage! + +private: + int width_ = 0; + int height_ = 0; + std::unique_ptr rgb_; //optional + std::unique_ptr alpha_; // +}; +} + +#endif //IMAGE_HOLDER_H_284578426342567457 diff --git a/wx+/image_resources.cpp b/wx+/image_resources.cpp index d4547d35..e87b245c 100755 --- a/wx+/image_resources.cpp +++ b/wx+/image_resources.cpp @@ -9,12 +9,17 @@ #include #include #include +#include #include #include #include #include #include +#include +#include #include "image_tools.h" +#include "image_holder.h" +#include "dc.h" using namespace zen; @@ -22,6 +27,195 @@ using namespace zen; namespace { + +ImageHolder dpiScale(int width, int height, int dpiWidth, int dpiHeight, const unsigned char* imageRgb, const unsigned char* imageAlpha, int hqScale) +{ + assert(imageRgb && imageAlpha); //see convertToVanillaImage() + if (width <= 0 || height <= 0 || dpiWidth <= 0 || dpiHeight <= 0) + return ImageHolder(0, 0, true /*withAlpha*/); + + const int hqWidth = width * hqScale; + const int hqHeight = height * hqScale; + + //get rid of allocation and buffer std::vector<> at thread-level? => no discernable perf improvement + std::vector buf(hqWidth * hqHeight + std::max(width * height, dpiWidth * dpiHeight)); + uint32_t* const argbSrc = &buf[0] + hqWidth * hqHeight; + uint32_t* const xbrTrg = &buf[0]; + uint32_t* const dpiTrg = argbSrc; + + //convert RGB (RGB byte order) to ARGB (BGRA byte order) + { + const unsigned char* rgb = imageRgb; + const unsigned char* rgbEnd = rgb + 3 * width * height; + const unsigned char* alpha = imageAlpha; + uint32_t* out = argbSrc; + + for (; rgb < rgbEnd; rgb += 3) + *out++ = xbrz::makePixel(*alpha++, rgb[0], rgb[1], rgb[2]); + } + //----------------------------------------------------- + xbrz::scale(hqScale, //size_t factor, //valid range: 2 - SCALE_FACTOR_MAX + argbSrc, //const uint32_t* src, + xbrTrg, //uint32_t* trg, + width, height, //int srcWidth, int srcHeight, + xbrz::ColorFormat::ARGB_UNBUFFERED); //ColorFormat colFmt, + //test: total xBRZ scaling time with ARGB: 300ms, ARGB_UNBUFFERED: 50ms + //----------------------------------------------------- + xbrz::bilinearScale(xbrTrg, //const uint32_t* src, + hqWidth, hqHeight, //int srcWidth, int srcHeight, + dpiTrg, //uint32_t* trg, + dpiWidth, dpiHeight); //int trgWidth, int trgHeight + //----------------------------------------------------- + //convert BGRA to RGB + alpha + ImageHolder trgImg(dpiWidth, dpiHeight, true /*withAlpha*/); + { + unsigned char* rgb = trgImg.getRgb(); + unsigned char* alpha = trgImg.getAlpha(); + + std::for_each(dpiTrg, dpiTrg + dpiWidth * dpiHeight, [&](uint32_t col) + { + *alpha++ = xbrz::getAlpha(col); + *rgb++ = xbrz::getRed (col); + *rgb++ = xbrz::getGreen(col); + *rgb++ = xbrz::getBlue (col); + }); + } + return trgImg; +} + + +struct WorkItem +{ + Zbase name; + int width = 0; + int height = 0; + int dpiWidth = 0; + int dpiHeight = 0; + const unsigned char* rgb = nullptr; + const unsigned char* alpha = nullptr; +}; + + +class WorkLoad +{ +public: + void add(const WorkItem& wi) //context of main thread + { + assert(std::this_thread::get_id() == mainThreadId); + { + std::lock_guard dummy(lockWork_); + workLoad_.push_back(wi); + } + conditionNewWork_.notify_all(); + } + + void noMoreWork() + { + assert(std::this_thread::get_id() == mainThreadId); + { + std::lock_guard dummy(lockWork_); + expectMoreWork_ = false; + } + conditionNewWork_.notify_all(); + } + + //context of worker thread, blocking: + Opt extractNext() //throw ThreadInterruption + { + assert(std::this_thread::get_id() != mainThreadId); + std::unique_lock dummy(lockWork_); + + interruptibleWait(conditionNewWork_, dummy, [this] { return !workLoad_.empty() || !expectMoreWork_; }); //throw ThreadInterruption + + if (workLoad_.empty()) + return NoValue(); + + WorkItem wi = workLoad_.back(); // + workLoad_.pop_back(); //yes, no strong exception guarantee (std::bad_alloc) + return wi; // + } + +private: + bool expectMoreWork_ = true; + std::vector workLoad_; + std::mutex lockWork_; + std::condition_variable conditionNewWork_; //signal event: data for processing available +}; + + +class DpiParallelScaler +{ +public: + DpiParallelScaler(int hqScale) + { + assert(hqScale > 1); + const int threadCount = std::max(std::thread::hardware_concurrency(), 1); //hardware_concurrency() == 0 if "not computable or well defined" + + for (int i = 0; i < threadCount; ++i) + worker_.push_back([hqScale, &workload = workload_, &result = result_] + { + setCurrentThreadName("xBRZ Scaler"); + while (Opt wi = workload.extractNext()) //throw ThreadInterruption + { + ImageHolder ih = dpiScale(wi->width, wi->height, + wi->dpiWidth, wi->dpiHeight, + wi->rgb, wi->alpha, hqScale); + result.access([&](std::vector, ImageHolder>>& r) { r.emplace_back(wi->name, std::move(ih)); }); + } + }); + } + + ~DpiParallelScaler() + { + for (InterruptibleThread& w : worker_) + w.interrupt(); + + for (InterruptibleThread& w : worker_) + if (w.joinable()) + w.join(); + } + + void add(const wxString& name, const wxImage& img) + { + imgKeeper_.push_back(img); //retain (ref-counted) wxImage so that the rgb/alpha pointers remain valid after passed to threads + workload_.add({ copyStringTo>(name), + img.GetWidth(), img.GetHeight(), + fastFromDIP(img.GetWidth()), fastFromDIP(img.GetHeight()), //don't call fastFromDIP() from worker thread (wxWidgets function!) + img.GetData(), img.GetAlpha() }); + } + + std::map waitAndGetResult() + { + workload_.noMoreWork(); + + for (InterruptibleThread& w : worker_) + w.join(); + + std::map output; + + result_.access([&](std::vector, ImageHolder>>& r) + { + for (auto& item : r) + { + ImageHolder& ih = item.second; + + wxImage img(ih.getWidth(), ih.getHeight(), ih.releaseRgb(), false /*static_data*/); //pass ownership + img.SetAlpha(ih.releaseAlpha(), false /*static_data*/); + + output[utfTo(item.first)] = wxBitmap(img); + } + }); + return output; + } + +private: + std::vector worker_; + WorkLoad workload_; + Protected, ImageHolder>>> result_; + std::vector imgKeeper_; +}; + + void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation& anim) { //work around wxWidgets bug: @@ -39,6 +233,8 @@ void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation& anim) anim.Load(seekAbleStream, wxANIMATION_TYPE_GIF); } +//================================================================================================ +//================================================================================================ class GlobalBitmaps { @@ -51,32 +247,35 @@ public: } GlobalBitmaps() {} - ~GlobalBitmaps() { assert(bitmaps.empty() && anims.empty()); } //don't leave wxWidgets objects for static destruction! + ~GlobalBitmaps() { assert(bitmaps_.empty() && anims_.empty()); } //don't leave wxWidgets objects for static destruction! void init(const Zstring& filepath); void cleanup() { - bitmaps.clear(); - anims.clear(); + bitmaps_.clear(); + anims_ .clear(); + dpiScaler_.reset(); } - const wxBitmap& getImage (const wxString& name) const; + const wxBitmap& getImage (const wxString& name); const wxAnimation& getAnimation(const wxString& name) const; private: GlobalBitmaps (const GlobalBitmaps&) = delete; GlobalBitmaps& operator=(const GlobalBitmaps&) = delete; - std::map bitmaps; - std::map anims; + std::map bitmaps_; + std::map anims_; + + std::unique_ptr dpiScaler_; }; -void GlobalBitmaps::init(const Zstring& filepath) +void GlobalBitmaps::init(const Zstring& filePath) { - assert(bitmaps.empty() && anims.empty()); + assert(bitmaps_.empty() && anims_.empty()); - wxFFileInputStream input(utfTo(filepath)); + wxFFileInputStream input(utfTo(filePath)); if (input.IsOk()) //if not... we don't want to react too harsh here { //activate support for .png files @@ -85,36 +284,49 @@ void GlobalBitmaps::init(const Zstring& filepath) wxZipInputStream streamIn(input, wxConvUTF8); //do NOT rely on wxConvLocal! On failure shows unhelpful popup "Cannot convert from the charset 'Unknown encoding (-1)'!" - for (;;) - { - std::unique_ptr entry(streamIn.GetNextEntry()); //take ownership! - if (!entry) - break; + //do we need xBRZ scaling for high quality DPI images? + const int hqScale = numeric::clampCpy(std::ceil(fastFromDIP(1000) / 1000.0), 1, xbrz::SCALE_FACTOR_MAX); + //even for 125% DPI scaling, "2xBRZ + bilinear downscale" gives a better result than mere "125% bilinear upscale"! + if (hqScale > 1) + dpiScaler_ = std::make_unique(hqScale); + while (const auto& entry = std::unique_ptr(streamIn.GetNextEntry())) //take ownership!) + { const wxString name = entry->GetName(); - //generic image loading if (endsWith(name, L".png")) { wxImage img(streamIn, wxBITMAP_TYPE_PNG); //end this alpha/no-alpha/mask/wxDC::DrawBitmap/RTL/high-contrast-scheme interoperability nightmare here and now!!!! - //=> there's only one type of png image: with alpha channel, no mask!!! + //=> there's only one type of wxImage: with alpha channel, no mask!!! convertToVanillaImage(img); - bitmaps.emplace(name, img); + if (dpiScaler_) + dpiScaler_->add(name, img); //scale in parallel! + else + bitmaps_.emplace(name, img); } else if (endsWith(name, L".gif")) - loadAnimFromZip(streamIn, anims[name]); + loadAnimFromZip(streamIn, anims_[name]); } } } -const wxBitmap& GlobalBitmaps::getImage(const wxString& name) const +const wxBitmap& GlobalBitmaps::getImage(const wxString& name) { - auto it = bitmaps.find(contains(name, L'.') ? name : name + L".png"); //assume .png ending if nothing else specified - if (it != bitmaps.end()) + //test: this function is first called about 220ms after GlobalBitmaps::init() has ended + // => should be enough time to finish xBRZ scaling in parallel (which takes 50ms) + //debug perf: extra 800-1000ms during startup + if (dpiScaler_) + { + bitmaps_ = dpiScaler_->waitAndGetResult(); + dpiScaler_.reset(); + } + + auto it = bitmaps_.find(contains(name, L'.') ? name : name + L".png"); //assume .png ending if nothing else specified + if (it != bitmaps_.end()) return it->second; assert(false); return wxNullBitmap; @@ -123,8 +335,8 @@ const wxBitmap& GlobalBitmaps::getImage(const wxString& name) const const wxAnimation& GlobalBitmaps::getAnimation(const wxString& name) const { - auto it = anims.find(contains(name, L'.') ? name : name + L".gif"); - if (it != anims.end()) + auto it = anims_.find(contains(name, L'.') ? name : name + L".gif"); + if (it != anims_.end()) return it->second; assert(false); return wxNullAnimation; diff --git a/wx+/image_resources.h b/wx+/image_resources.h index cc4ab2cc..5ea56679 100755 --- a/wx+/image_resources.h +++ b/wx+/image_resources.h @@ -14,7 +14,7 @@ namespace zen { -void initResourceImages(const Zstring& filepath); //pass resources .zip file at application startup +void initResourceImages(const Zstring& filePath); //pass resources .zip file at application startup void cleanupResourceImages(); const wxBitmap& getResourceImage (const wxString& name); diff --git a/wx+/image_tools.cpp b/wx+/image_tools.cpp index 235ebe59..26a5b37c 100755 --- a/wx+/image_tools.cpp +++ b/wx+/image_tools.cpp @@ -9,9 +9,9 @@ #include #include - using namespace zen; + namespace { void writeToImage(const wxImage& source, wxImage& target, const wxPoint& pos) diff --git a/wx+/popup_dlg.cpp b/wx+/popup_dlg.cpp index 5babaff3..6633d2ab 100755 --- a/wx+/popup_dlg.cpp +++ b/wx+/popup_dlg.cpp @@ -15,18 +15,12 @@ using namespace zen; + namespace { -void setAsStandard(wxButton& btn) -{ - btn.SetDefault(); - btn.SetFocus(); -} - - void setBestInitialSize(wxTextCtrl& ctrl, const wxString& text, wxSize maxSize) { - const int scrollbarWidth = 30; + const int scrollbarWidth = fastFromDIP(20); if (maxSize.x <= scrollbarWidth) //implicitly checks for non-zero, too! return; maxSize.x -= scrollbarWidth; @@ -117,8 +111,9 @@ public: SetTitle(wxTheApp->GetAppDisplayName() + SPACED_DASH + titleTmp); } - int maxWidth = 500; - int maxHeight = 400; //try to determine better value based on actual display resolution: + int maxWidth = fastFromDIP(500); + int maxHeight = fastFromDIP(400); //try to determine better value based on actual display resolution: + //int [maxWidth, maxHeight] = wxSize(fastFromDIP(500), fastFromDIP(400)); if (parent) { @@ -139,7 +134,10 @@ public: if (!cfg.textDetail.empty()) { - const wxString& text = L"\n" + trimCpy(cfg.textDetail) + L"\n"; //add empty top/bottom lines *instead* of using border space! + wxString text; + if (!cfg.textMain.empty()) + text += L"\n"; + text += trimCpy(cfg.textDetail) + L"\n"; //add empty top/bottom lines *instead* of using border space! setBestInitialSize(*m_textCtrlTextDetail, text, wxSize(maxWidth, maxHeight)); m_textCtrlTextDetail->ChangeValue(text); } @@ -200,9 +198,10 @@ public: //set std order after button visibility was set setStandardButtonLayout(*bSizerStdButtons, stdBtns); - setAsStandard(*m_buttonAccept); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() Center(); //needs to be re-applied after a dialog size change! + + m_buttonAccept->SetFocus(); } private: diff --git a/wx+/popup_dlg_generated.cpp b/wx+/popup_dlg_generated.cpp index c8c504ae..25ac00e1 100755 --- a/wx+/popup_dlg_generated.cpp +++ b/wx+/popup_dlg_generated.cpp @@ -1,8 +1,8 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Jun 17 2015) +// C++ code generated with wxFormBuilder (version Jan 23 2018) // http://www.wxformbuilder.org/ // -// PLEASE DO "NOT" EDIT THIS FILE! +// PLEASE DO *NOT* EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// #include "popup_dlg_generated.h" @@ -63,6 +63,7 @@ PopupDialogGenerated::PopupDialogGenerated( wxWindow* parent, wxWindowID id, con bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); m_buttonAccept = new wxButton( this, wxID_YES, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonAccept->SetDefault(); bSizerStdButtons->Add( m_buttonAccept, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_buttonAcceptAll = new wxButton( this, wxID_YESTOALL, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); diff --git a/wx+/popup_dlg_generated.h b/wx+/popup_dlg_generated.h index 896f8d0c..0d3459e2 100755 --- a/wx+/popup_dlg_generated.h +++ b/wx+/popup_dlg_generated.h @@ -1,8 +1,8 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Jun 17 2015) +// C++ code generated with wxFormBuilder (version Jan 23 2018) // http://www.wxformbuilder.org/ // -// PLEASE DO "NOT" EDIT THIS FILE! +// PLEASE DO *NOT* EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// #ifndef __POPUP_DLG_GENERATED_H__ diff --git a/wx+/std_button_layout.h b/wx+/std_button_layout.h index 8fe5f405..cf0152de 100755 --- a/wx+/std_button_layout.h +++ b/wx+/std_button_layout.h @@ -10,6 +10,7 @@ #include #include #include +#include "dc.h" namespace zen @@ -71,9 +72,9 @@ void setStandardButtonLayout(wxBoxSizer& sizer, const StdButtons& buttons) detach(buttonsTmp.btnCancel); //GNOME Human Interface Guidelines: https://developer.gnome.org/hig-book/3.2/hig-book.html#alert-spacing - const int spaceH = 6; //OK - const int spaceRimH = 12; //OK - const int spaceRimV = 12; //OK + const int spaceH = fastFromDIP( 6); //OK + const int spaceRimH = fastFromDIP(12); //OK + const int spaceRimV = fastFromDIP(12); //OK bool settingFirstButton = true; auto attach = [&](wxButton* btn) @@ -82,7 +83,7 @@ void setStandardButtonLayout(wxBoxSizer& sizer, const StdButtons& buttons) { assert(btn->GetMinSize().GetHeight() == -1); //let OS or this routine do the sizing! note: OS X does not allow changing the (visible!) button height! const int defaultHeight = wxButton::GetDefaultSize().GetHeight(); //buffered by wxWidgets - btn->SetMinSize(wxSize(-1, std::max(defaultHeight, 30))); //default button height is much too small => increase! + btn->SetMinSize(wxSize(-1, std::max(defaultHeight, fastFromDIP(30)))); //default button height is much too small => increase! if (settingFirstButton) settingFirstButton = false; diff --git a/wx+/tooltip.cpp b/wx+/tooltip.cpp index a8fd1da1..a7bf85fe 100755 --- a/wx+/tooltip.cpp +++ b/wx+/tooltip.cpp @@ -11,20 +11,22 @@ #include #include #include -#include +#include "image_tools.h" +#include "dc.h" using namespace zen; +namespace +{ +const int TIP_WINDOW_OFFSET_DIP = 30; +} + + class Tooltip::TooltipDlgGenerated : public wxDialog { public: - TooltipDlgGenerated(wxWindow* parent, - wxWindowID id = wxID_ANY, - const wxString& title = {}, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0) : wxDialog(parent, id, title, pos, size, style) + TooltipDlgGenerated(wxWindow* parent) : wxDialog(parent, wxID_ANY, L"" /*title*/, wxDefaultPosition, wxDefaultSize, 0 /*style*/) { //Suse Linux/X11: needs parent window, else there are z-order issues @@ -66,15 +68,15 @@ void Tooltip::show(const wxString& text, wxPoint mousePos, const wxBitmap* bmp) if (text != tipWindow_->staticTextMain_->GetLabel()) { tipWindow_->staticTextMain_->SetLabel(text); - tipWindow_->staticTextMain_->Wrap(600); + tipWindow_->staticTextMain_->Wrap(fastFromDIP(600)); } tipWindow_->GetSizer()->SetSizeHints(tipWindow_); //~=Fit() + SetMinSize() //Linux: Fit() seems to be broken => this needs to be called EVERY time inside show, not only if text or bmp change const wxPoint newPos = wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ? - mousePos - wxPoint(30 + tipWindow_->GetSize().GetWidth(), 0) : - mousePos + wxPoint(30, 0); + mousePos - wxPoint(fastFromDIP(TIP_WINDOW_OFFSET_DIP) + tipWindow_->GetSize().GetWidth(), 0) : + mousePos + wxPoint(fastFromDIP(TIP_WINDOW_OFFSET_DIP), 0); if (newPos != tipWindow_->GetScreenPosition()) tipWindow_->SetSize(newPos.x, newPos.y, wxDefaultCoord, wxDefaultCoord); diff --git a/wx+/zlib_wrap.cpp b/wx+/zlib_wrap.cpp index 540854a1..cb6e3083 100755 --- a/wx+/zlib_wrap.cpp +++ b/wx+/zlib_wrap.cpp @@ -5,7 +5,9 @@ // ***************************************************************************** #include "zlib_wrap.h" - #include //let's pray this is the same version wxWidgets is linking against! +//include the SAME zlib version that wxWidgets is linking against! + //#include //wxWidgets compiled with: --with-zlib=builtin + #include //use same library as used by Curl (zlib is required for HTTP) using namespace zen; diff --git a/zen/format_unit.cpp b/zen/format_unit.cpp index 09134c07..931a29be 100755 --- a/zen/format_unit.cpp +++ b/zen/format_unit.cpp @@ -161,38 +161,39 @@ std::wstring zen::formatFraction(double fraction) -std::wstring zen::impl::includeNumberSeparator(const std::wstring& number) +std::wstring zen::formatNumber(int64_t n) { //we have to include thousands separator ourselves; this doesn't work for all countries (e.g india), but is better than nothing //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale - const lconv* localInfo = ::localeconv(); //always bound according to doc - const std::wstring& thousandSep = zen::utfTo(localInfo->thousands_sep); + const lconv& localInfo = *::localeconv(); //always bound according to doc + const std::wstring& thousandSep = utfTo(localInfo.thousands_sep); // THOUSANDS_SEPARATOR = std::use_facet>(std::locale("")).thousands_sep(); - why not working? // DECIMAL_POINT = std::use_facet>(std::locale("")).decimal_point(); - std::wstring output(number); - size_t i = output.size(); + std::wstring number = numberTo(n); + + size_t i = number.size(); for (;;) { if (i <= 3) break; i -= 3; - if (!isDigit(output[i - 1])) //stop on +, - signs + if (!isDigit(number[i - 1])) //stop on +, - signs break; - output.insert(i, thousandSep); + number.insert(i, thousandSep); } - return output; + return number; } -std::wstring zen::formatUtcToLocalTime(int64_t utcTime) +std::wstring zen::formatUtcToLocalTime(time_t utcTime) { auto errorMsg = [&] { return _("Error") + L" (time_t: " + numberTo(utcTime) + L")"; }; TimeComp loc = getLocalTime(utcTime); - + std::wstring dateString = formatTime(L"%x %X", loc); return !dateString.empty() ? dateString : errorMsg(); } diff --git a/zen/format_unit.h b/zen/format_unit.h index 9c6a4690..23ab33fb 100755 --- a/zen/format_unit.h +++ b/zen/format_unit.h @@ -18,36 +18,14 @@ namespace zen std::wstring formatFilesizeShort(int64_t filesize); std::wstring formatRemainingTime(double timeInSec); std::wstring formatFraction(double fraction); //within [0, 1] -std::wstring formatUtcToLocalTime(int64_t utcTime); //like Windows Explorer would... +std::wstring formatUtcToLocalTime(time_t utcTime); //like Windows Explorer would... std::wstring formatTwoDigitPrecision (double value); //format with fixed number of digits std::wstring formatThreeDigitPrecision(double value); //(unless value is too large) -template -std::wstring formatNumber(NumberType number); //format integer number including thousands separator +std::wstring formatNumber(int64_t n); //format integer number including thousands separator - - - - - - - - - -//--------------- inline impelementation ------------------------------------------- -namespace impl -{ -std::wstring includeNumberSeparator(const std::wstring& number); -} - -template inline -std::wstring formatNumber(NumberType number) -{ - static_assert(IsInteger::value, ""); - return impl::includeNumberSeparator(zen::numberTo(number)); -} } #endif diff --git a/zen/globals.h b/zen/globals.h index c57d97ff..2066c380 100755 --- a/zen/globals.h +++ b/zen/globals.h @@ -22,17 +22,17 @@ public: Global() { static_assert(std::is_trivially_destructible::value, "this memory needs to live forever"); - assert(!pod.inst && !pod.spinLock); //we depend on static zero-initialization! + assert(!pod_.inst && !pod_.spinLock); //we depend on static zero-initialization! } explicit Global(std::unique_ptr&& newInst) { set(std::move(newInst)); } ~Global() { set(nullptr); } std::shared_ptr get() //=> return std::shared_ptr to let instance life time be handled by caller (MT usage!) { - while (pod.spinLock.exchange(true)) ; - ZEN_ON_SCOPE_EXIT(pod.spinLock = false); - if (pod.inst) - return *pod.inst; + while (pod_.spinLock.exchange(true)) ; + ZEN_ON_SCOPE_EXIT(pod_.spinLock = false); + if (pod_.inst) + return *pod_.inst; return nullptr; } @@ -42,9 +42,9 @@ public: if (newInst) tmpInst = new std::shared_ptr(std::move(newInst)); { - while (pod.spinLock.exchange(true)) ; - ZEN_ON_SCOPE_EXIT(pod.spinLock = false); - std::swap(pod.inst, tmpInst); + while (pod_.spinLock.exchange(true)) ; + ZEN_ON_SCOPE_EXIT(pod_.spinLock = false); + std::swap(pod_.inst, tmpInst); } delete tmpInst; } @@ -58,7 +58,7 @@ private: std::shared_ptr* inst; // = nullptr; std::atomic spinLock; // { false }; rely entirely on static zero-initialization! => avoid potential contention with worker thread during Global<> construction! //serialize access; can't use std::mutex: has non-trival destructor - } pod; + } pod_; }; } diff --git a/zen/guid.h b/zen/guid.h index 633547ad..b2ada48c 100755 --- a/zen/guid.h +++ b/zen/guid.h @@ -21,7 +21,7 @@ inline std::string generateGUID() //creates a 16-byte GUID { //perf: generator: 0.38ms per creation; - // retrieve GUID: 0.13s per call + // retrieve GUID: 0.13µs per call //generator is only thread-safe like an int => keep thread-local thread_local boost::uuids::random_generator gen; const boost::uuids::uuid nativeRep = gen(); diff --git a/zen/optional.h b/zen/optional.h index 0ef5f1db..88928ac0 100755 --- a/zen/optional.h +++ b/zen/optional.h @@ -7,7 +7,7 @@ #ifndef OPTIONAL_H_2857428578342203589 #define OPTIONAL_H_2857428578342203589 -#include +//#include #include @@ -96,6 +96,20 @@ private: std::aligned_storage_t rawMem_; //don't require T to be default-constructible! bool valid_ = false; }; + + +template inline +bool operator==(const Opt& lhs, const Opt& rhs) +{ + if (static_cast(lhs) != static_cast(rhs)) + return false; + if (!lhs) + return true; + return *lhs == *rhs; +} +template inline +bool operator!=(const Opt& lhs, const Opt& rhs) { return !(lhs == rhs); } + } #endif //OPTIONAL_H_2857428578342203589 diff --git a/zen/perf.h b/zen/perf.h index 72b57f52..2006bdab 100755 --- a/zen/perf.h +++ b/zen/perf.h @@ -19,6 +19,13 @@ #define PERF_STOP perfTest.showResult(); //########################################################################### +/* Example: Aggregated function call time: + + static zen::PerfTimer timer; + timer.resume(); + ZEN_ON_SCOPE_EXIT(timer.pause()); +*/ + namespace zen { class PerfTimer diff --git a/zen/process_priority.cpp b/zen/process_priority.cpp index e925f142..c2a7ed20 100755 --- a/zen/process_priority.cpp +++ b/zen/process_priority.cpp @@ -11,6 +11,8 @@ using namespace zen; +//wxPowerResourceBlocker? http://docs.wxwidgets.org/trunk/classwx_power_resource_blocker.html +//nah, "currently the power events are only available under Windows" struct PreventStandby::Impl {}; PreventStandby::PreventStandby() {} PreventStandby::~PreventStandby() {} diff --git a/zen/scope_guard.h b/zen/scope_guard.h index 6945b011..328e2caa 100755 --- a/zen/scope_guard.h +++ b/zen/scope_guard.h @@ -115,6 +115,10 @@ auto makeGuard(F&& fun) { return ScopeGuard>(std::forwa #define ZEN_CONCAT_SUB(X, Y) X ## Y #define ZEN_CONCAT(X, Y) ZEN_CONCAT_SUB(X, Y) +#define ZEN_CHECK_CASE_FOR_CONSTANT(X) case X: return ZEN_CHECK_CASE_FOR_CONSTANT_IMPL(#X) +#define ZEN_CHECK_CASE_FOR_CONSTANT_IMPL(X) L ## X + + #define ZEN_ON_SCOPE_EXIT(X) auto ZEN_CONCAT(dummy, __LINE__) = zen::makeGuard([&]{ X; }); (void)ZEN_CONCAT(dummy, __LINE__); #define ZEN_ON_SCOPE_FAIL(X) auto ZEN_CONCAT(dummy, __LINE__) = zen::makeGuard([&]{ X; }); (void)ZEN_CONCAT(dummy, __LINE__); #define ZEN_ON_SCOPE_SUCCESS(X) auto ZEN_CONCAT(dummy, __LINE__) = zen::makeGuard([&]{ X; }); (void)ZEN_CONCAT(dummy, __LINE__); diff --git a/zen/sys_error.h b/zen/sys_error.h index 31eb8209..c179ec8a 100755 --- a/zen/sys_error.h +++ b/zen/sys_error.h @@ -81,7 +81,11 @@ std::wstring formatSystemError(const std::wstring& functionName, long long lastE inline std::wstring formatSystemError(const std::wstring& functionName, ErrorCode ec) { - return formatSystemError(functionName, replaceCpy(_("Error Code %x"), L"%x", numberTo(ec)), formatSystemErrorRaw(ec)); + //static_assert(sizeof(ec) == sizeof(int), ""); + //const std::wstring errorCode = printNumber(L"0x%08x", static_cast(ec)); + const std::wstring errorCode = numberTo(ec); + + return formatSystemError(functionName, replaceCpy(_("Error Code %x"), L"%x", errorCode), formatSystemErrorRaw(ec)); } diff --git a/zen/thread.h b/zen/thread.h index bfb66c31..3721b3c7 100755 --- a/zen/thread.h +++ b/zen/thread.h @@ -37,12 +37,11 @@ public: template bool tryJoinFor(const std::chrono::duration& relTime) { - if (threadCompleted_.wait_for(relTime) == std::future_status::ready) - { - stdThread_.join(); //runs thread-local destructors => this better be fast!!! - return true; - } - return false; + if (threadCompleted_.wait_for(relTime) != std::future_status::ready) + return false; + + stdThread_.join(); //runs thread-local destructors => this better be fast!!! + return true; } private: @@ -297,7 +296,7 @@ public: setConditionVar(&cv); ZEN_ON_SCOPE_EXIT(setConditionVar(nullptr)); - //"interrupted" is not protected by cv's mutex => signal may get lost!!! => add artifical time out to mitigate! CPU: 0.25% vs 0% for longer time out! + //"interrupted_" is not protected by cv's mutex => signal may get lost!!! => add artifical time out to mitigate! CPU: 0.25% vs 0% for longer time out! while (!cv.wait_for(lock, std::chrono::milliseconds(1), [&] { return this->interrupted_ || pred(); })) ; diff --git a/zen/time.h b/zen/time.h index 74898c7c..723614ef 100755 --- a/zen/time.h +++ b/zen/time.h @@ -48,9 +48,9 @@ template String formatTime(const String2& format, const TimeComp& tc = getLocalTime()); //format as specified by "std::strftime", returns empty string on failure //the "format" parameter of formatTime() is partially specialized with the following type tags: -const struct FormatDateTag {} FORMAT_DATE = {}; //%x - locale dependent date representation: e.g. 08/23/01 -const struct FormatTimeTag {} FORMAT_TIME = {}; //%X - locale dependent time representation: e.g. 14:55:02 -const struct FormatDateTimeTag {} FORMAT_DATE_TIME = {}; //%c - locale dependent date and time: e.g. Thu Aug 23 14:55:02 2001 +const struct FormatDateTag {} FORMAT_DATE = {}; //%x - locale dependent date representation: e.g. 8/23/2001 +const struct FormatTimeTag {} FORMAT_TIME = {}; //%X - locale dependent time representation: e.g. 2:55:02 PM +const struct FormatDateTimeTag {} FORMAT_DATE_TIME = {}; //%c - locale dependent date and time: e.g. 8/23/2001 2:55:02 PM const struct FormatIsoDateTag {} FORMAT_ISO_DATE = {}; //%Y-%m-%d - e.g. 2001-08-23 const struct FormatIsoTimeTag {} FORMAT_ISO_TIME = {}; //%H:%M:%S - e.g. 14:55:02 diff --git a/zen/zstring.h b/zen/zstring.h index b96842b5..258603dc 100755 --- a/zen/zstring.h +++ b/zen/zstring.h @@ -79,6 +79,7 @@ const wchar_t* const SPACED_DASH = L" \u2013 "; //using 'EN DASH' const wchar_t LTR_MARK = L'\u200E'; //UTF-8: E2 80 8E const wchar_t RTL_MARK = L'\u200F'; //UTF-8: E2 80 8F const wchar_t ELLIPSIS = L'\u2026'; //"..." +const wchar_t MULT_SIGN = L'\u00D7'; //fancy "x" diff --git a/zenXml/zenxml/bind.h b/zenXml/zenxml/bind.h index 824c6cc6..e33809d2 100755 --- a/zenXml/zenxml/bind.h +++ b/zenXml/zenxml/bind.h @@ -78,7 +78,7 @@ public: \endcode Output: \verbatim - + 1 2 @@ -130,7 +130,7 @@ public: \endcode Output: \verbatim - + @@ -205,7 +205,7 @@ public: /** Example: Loop over all XML child elements named "Item" \verbatim - + 1 3 diff --git a/zenXml/zenxml/dom.h b/zenXml/zenxml/dom.h index c8959e4b..15700ee2 100755 --- a/zenXml/zenxml/dom.h +++ b/zenXml/zenxml/dom.h @@ -275,7 +275,7 @@ bool XmlElement::getValue(std::string& value) const { value = value_; return tru class XmlDoc { public: - ///Default constructor setting up an empty XML document with a standard declaration: + ///Default constructor setting up an empty XML document with a standard declaration: XmlDoc() {} XmlDoc(XmlDoc&& tmp) { swap(tmp); } @@ -350,7 +350,7 @@ private: XmlDoc& operator=(const XmlDoc&) = delete; std::string version_ { "1.0" }; - std::string encoding_{ "UTF-8" }; + std::string encoding_{ "utf-8" }; std::string standalone_; XmlElement root_{ "Root" }; diff --git a/zenXml/zenxml/parser.h b/zenXml/zenxml/parser.h index 5c6a9ec2..76497ce7 100755 --- a/zenXml/zenxml/parser.h +++ b/zenXml/zenxml/parser.h @@ -262,7 +262,7 @@ std::string serialize(const XmlDoc& doc, Grammar for XML parser ------------------------------- document-expression: - + element-expression: element-expression: -- cgit