diff --git a/NEWS b/NEWS index 20f15c403a..a1bde857a4 100644 --- a/NEWS +++ b/NEWS @@ -1,531 +1,532 @@ ***************************************************************************************************** digiKam 5.7.0 - Release date: 2017-07-23 NEW FEATURES: General : Add online handbook reader not dependant of desktop. General : New tool to export albums by email. General : New tool to create advance print layout. General : Send by Mail tool can remove all metadata to attached items. General : Replaced the minimum and maximum similarity selection boxes in fuzzy search, duplicates search and maintenance by a new, generic DIntRangeBox which makes the look, feel and behavious consistent in all places. Also, this makes redundant code obsolete and reduces the probability of bugs. PrintCreator: Add option to create printing from albums or images selection. PrintCreator: Add option to customize output image properties to render printing. PrintCreator: Tool is now multi-threaded to process images while preview and printing. ImageEditor : Add SendByMail and PrintCreator tools support. Showfoto : Add SendByMail and PrintCreator tools support. LightTable : Add SendByMail and PrintCreator tools support. Panorama : Add Hugin 2017.0 support. Geolocation : Add new tool to export GPS trace to KML file from geolocation editor. BUGFIXES FROM BUGZILLA: 001 ==> 381143 - Camera not removed between invocations. 002 ==> 381306 - Error with import from Fujifilm X-T10. 003 ==> 379869 - Crash of digikam after ending digiam writing changed tags into photos. 004 ==> 361047 - Wishlist: make grouped images more prominently visible [patch]. 005 ==> 381510 - "open with" on multiple images only passes first image. 006 ==> 378475 - digiKam crashed after connecting a Camera. 007 ==> 381697 - Cannot remove an image whose file has already been deleted by another application. 008 ==> 380189 - digiKam Import Menu doesn't show all plugins. 009 ==> 376422 - Rotate crashes. 010 ==> 314089 - Tagging faces is not working. 011 ==> 367692 - digiKam crashed trying to save an edited image. 012 ==> 369636 - Batch time stamp adjusting causes digikam to crash and destroys photos. 013 ==> 381762 - Crash on Windows installer. 014 ==> 381766 - Problem compiling digikam from GIT repository. 015 ==> 380359 - Shouldn't "Email Images" be in "Export" menu instead of "Tools" menu? 016 ==> 281921 - Send Images by mail tool cannot process albums. 017 ==> 114508 - Send images by mail tool does not delete its temporary files. 018 ==> 151327 - Send Images by mail dialog is not resizable. 019 ==> 108234 - Thunderbird will not open when sending emails in digiKam. 020 ==> 149915 - Sending selected pictures makes PC hang for 15 minutes + crash. 021 ==> 104918 - digiKam crashes while converting for email purposes. 022 ==> 096507 - Bug in email client selection. 023 ==> 280923 - The command Email messages does not attach the images to the email. 024 ==> 228609 - Sending images with thunderbird from albums with spaces in the name failes. 025 ==> 158585 - digiKam crashes after attempt to email pictures. 026 ==> 126493 - Mozilla does not start when sending emailed images. 027 ==> 139646 - "send by email" function does not work with Thunderbird 1.5.0.9 (it use to work before). 028 ==> 158916 - Error with non ascii characters in album names when sending images. 029 ==> 365733 - Tool «export by email» does not work properly. 030 ==> 366086 - No attachment in mail when using resizing option. 031 ==> 276428 - Send by emails fails for pgf pictures because they cannot be resized. 032 ==> 191872 - Use the send image tool in showfoto. 033 ==> 330274 - I downloaded showfoto photo program. Tried to open ShowFoto Handbook, got message could not find 'Khelpcenter'. 034 ==> 240220 - Help button not working properly. 035 ==> 110899 - All DigiKam ImagePlugins don't work in Showfoto. 036 ==> 132162 - Load image plugins on demand. 037 ==> 240222 - ShowFoto Handbook menu item not working. 038 ==> 211117 - Showfoto no filters or decorate menu. 039 ==> 252796 - "Save as" doesn't reuse previously selected dialog. 040 ==> 190208 - Change image properties options should be grayed out when the check box is unchecked. 041 ==> 147513 - It's non possible to send the file of photo because kmail don't start. 042 ==> 144247 - No file attachment in thunderbird. 043 ==> 134910 - Using email image tool (while having kontact open) results in a detachement of kmail from kontact. 044 ==> 377306 - Optionally remove all metadata. 045 ==> 204040 - Allow to share images by e-mail in message body instead as attachments. 046 ==> 281269 - Allow to share a remote image by e-mail. 047 ==> 346577 - digiKam does not show help when not running in KDE. 048 ==> 256262 - "Help / digiKam Handbook" menu item is misleading. 049 ==> 099497 - Please add a dummy handbook until there's a real one. 050 ==> 147865 - Image>email image>add image dialog does not show most thumbnails - but does show some. 051 ==> 172651 - Send image by email missing. 052 ==> 244649 - Cannot load and use tool such as SendMail. 053 ==> 132313 - Provide a simple way to email photos. 054 ==> 108956 - Send image as email attachment from within the imageviewer. 055 ==> 108949 - Send image as email attachment. 056 ==> 297798 - digiKam crashed (Export-Email Images). 057 ==> 337146 - Crash when exporting (to e-mail). 058 ==> 094157 - Can't email images with special characters in file name. 059 ==> 296776 - Crash while trying to send pictures via default email software. 060 ==> 197341 - Html pages do not sort pictures as they are sorted in the album. 061 ==> 116960 - Html Export tool appends ".jpg" to files who already has .jpg suffix. 062 ==> 158083 - Html interface for camera raw images. 063 ==> 164749 - background picture/logo for html. 064 ==> 095115 - killer feature: recursive HTML gallery from a category. 065 ==> 190293 - Export as html gallery has the forward button disabled before changing the selected folder. 066 ==> 125002 - Tmp is deleted no html. 067 ==> 127888 - Images not sorted in HTML Album Export. 068 ==> 128125 - Album title from digiKam are not converted into html entities. 069 ==> 113722 - Mpeg encoding fails. 070 ==> 118343 - Mjpeg slide stops with error. 071 ==> 125413 - "create MPEG slideshow" tool fails. 072 ==> 127532 - Images to mpg wrong directory error. 073 ==> 112558 - Mpeg plugin framerate adjustment. 074 ==> 091547 - focus stealing when 'mpeg slideshow' is selected, but mp2enc is missing. 075 ==> 131606 - Images 2 mpg with SVCD changes the proportion of the pictures. 076 ==> 168266 - digiKam mpeg enconding failure. 077 ==> 116040 - Merging MPEG flux. Unable to open file for reading. 078 ==> 114515 - Verify the existence of the MPEG output file path and the existence of the audio input file before launching the encoding process. 079 ==> 101110 - Cannot create MPEG from photos using transitions. 080 ==> 119070 - Difficult behaviour of MPEG slide slide show. 081 ==> 127219 - Creation of mpeg slide show fails. 082 ==> 171242 - Encoding of mpeg slideshow does not work. 083 ==> 145771 - Gnome Desktop crashes and restarts when select Cancel option for Mpeg Slideshow plugin. 084 ==> 145536 - MPEG SlideShow creates color lines on the first image processed. 085 ==> 119940 - Failed when trying to create MPEG Slide Show file from some jpg images. 086 ==> 153962 - Dependency Error the package doesn't check for the presence of mpg123. 087 ==> 138916 - Creating MPEG slideshow fails if previously attempted - background file not found. 088 ==> 140507 - Create MPEG diagshow in HDV formats (720i/p, 1080i/p). 089 ==> 162240 - The encoder start and finish imediately and there isn't any mpeg file. 090 ==> 143979 - Create an mpeg slideshow fails after the encoding. 091 ==> 121045 - Images 2 mpg. 092 ==> 114514 - Do not delete the temporary folder after each encoding process. 093 ==> 101656 - Image gallery use irretating filenames foo.jpeg.jpeg for images. 094 ==> 098968 - Cannot encode to VCD, DVD, XVCD. 095 ==> 109739 - Yuvscaler error in digiKam. 096 ==> 154363 - Encoding MPEG file error. 097 ==> 243531 - Mjpeg encoder. 098 ==> 151115 - Error encoding image files; unable to open file. 099 ==> 297287 - Remove metadata option when email exporting. 100 ==> 112550 - Stopping encoding mjpegtools digiKam error. 101 ==> 149971 - Encoding process finishes with unclear message. 102 ==> 119425 - Works one time not twice. 103 ==> 355509 - DNGkonverter crash when trying to convert raw file from Nikon D750. 104 ==> 379884 - Item Metadata Editor doesn't save changes. 105 ==> 381380 - Item Edit / Metadata doesn't work. 106 ==> 381639 - Map filter (left side bar) doesn't show images anymore. 107 ==> 149970 - MPEG slideshow : incorrect warrning about missing runtime files. 108 ==> 381916 - digiKam crash when add person names. 109 ==> 328848 - Print Assistant window not resizable nor scrollable. 110 ==> 100311 - digikam crashes when using print wizard. 112 ==> 162085 - digikam freezes while printing. 113 ==> 160810 - digikam crop photos next button does not work. 114 ==> 118868 - A recto-verso printing wizard. 115 ==> 308963 - Add the ability to Export photos to a PDF file. 116 ==> 260994 - Print error when print with "print assistant. 117 ==> 155084 - Printing comments and EXIF tags. 118 ==> 103153 - Add print icon to main toolbar of digiKam. 119 ==> 178983 - next/back-buttons in print-assistant should be labeled. 120 ==> 126863 - print thumbnails on A4 produces 210x297 pixel (instead of mm) image. 121 ==> 195960 - Error printing A4 size miniatures. 122 ==> 101495 - Raster effect on printout - using printwizard. 123 ==> 171439 - Before printing more than 1 picture could be possible all of them cut to set size - only first can be. 124 ==> 233970 - PrintWizard do not retaining settings. 125 ==> 294563 - digiKam - DVD Slideshow. 126 ==> 117073 - Album export to HTMLGallery would benefit from a treeview widget. 128 ==> 251705 - Remove Red Eyes process wrong image regions, fill image parts with green color. 129 ==> 222992 - Crash in digikam when correcting red eyes. 130 ==> 342475 - Crash by open red Eyes correction tool. 131 ==> 164916 - With RAWs the burning crashes. 132 ==> 321879 - digiKam crash while viewing images. 133 ==> 232957 - digikam crashes while importing images (about 60000 files). 134 ==> 316994 - Crash with Red Eyes Correction tool. 135 ==> 322558 - Crash when i click on Red Eyes tool. 136 ==> 382133 - Processing fails, caused by too long filename. 137 ==> 294062 - digiKam crashes on HTML export. 138 ==> 210228 - Next button is disabled in html gallery. 139 ==> 311510 - HTML export crashing. 140 ==> 342645 - Export button inoperable. 141 ==> 219068 - Export items to html gallery using tags doesn't sort by date or file-name. 142 ==> 140374 - HTML Gallery export fails to parse xml from non-UTF8 metadata in jpeg. 143 ==> 194947 - Original Image link is 'hidden' by css colour setting. 144 ==> 169952 - Pictures on nfs-drive crashes digikam when i send picture as mail. 145 ==> 173203 - When sending images via email, tool fails to convert PNG to JPG. 146 ==> 146487 - Export to email fails when email too large. 147 ==> 128341 - Html export should not resize images if "resize target images" is not checked. 148 ==> 089541 - Exporting to HTML from Digikam doesn't seem to work due to unsafe thread access. 149 ==> 116605 - HTML Gallery crashing when exporting to an existing dir an choosing no to overwrite [Patch]. 150 ==> 090943 - Html export tool: add css functionality. 151 ==> 089068 - Improvement for the HTML export tool. 152 ==> 087188 - Send by mail tool attach empty comments for images even if photos have them. 153 ==> 115850 - Remove all the Image tools menu entries when unchecking the tools in Settings->Configure ShowFoto. 154 ==> 141362 - Get rid of any mention of core image tool. 155 ==> 105514 - Some menu items are displayed twice when displaying/editing a picture. E.g. sharpen. 156 ==> 103147 - digikam image tools appear multiple times in menus. 157 ==> 110015 - digikam tools not found - error in config file. 158 ==> 096853 - Tools from the digikam image editor are not available in the UI. 159 ==> 176140 - Red eyes tool is not working fine. 160 ==> 103644 - Red eyes remover make green eyes instead of blue eyes. 161 ==> 293321 - Open Red Eyes tool crash. 162 ==> 243186 - Crash when clicking on Red Eyes tool in menu list. 163 ==> 103150 - Have print wizard tool replace default printing function. 164 ==> 097187 - Calendar tool still messing with fonts and locales. 165 ==> 318661 - Send by mail tool does not convert to sRGB and strips existing ICC profile. 166 ==> 306993 - Crash with Edit all metadata. 167 ==> 146293 - Metadata editor menu untranslated. 168 ==> 167379 - Image selection or Album Selection for HTML Gallery tool. 169 ==> 301688 - Crash while browsing. 170 ==> 137014 - "Email Images" should be reached under "Album" > "Export". 171 ==> 137392 - add "send images by email" to context menu. 172 ==> 146601 - Error during renaming of images being sent via email. 173 ==> 140319 - Filetype incorrectly added to pictures sent in email. 174 ==> 163395 - digikam and encoding errors in mail attachments. 175 ==> 091596 - Send images stopped working, telling me the path to firefox was wrong. 176 ==> 096191 - "Email Images" feature requires Thunderbird. 177 ==> 189984 - Impossible to email images if the path contains characters such as éèà. 178 ==> 148186 - "send by email" function does not attach images in Thunderbird. 179 ==> 335163 - Digikam crashing when exporting to html with theme "floating frames". 180 ==> 101925 - HTML Export stop to work. 181 ==> 150479 - Provide export to pdf file. 182 ==> 121589 - Generate web-album from digiKam. 183 ==> 358843 - Add link to source code web interface to main menu. 184 ==> 167281 - Replace the Konqueror as the default external webbrowser by a system call. 185 ==> 118831 - First image from avi as icon. 186 ==> 141132 - digiKam is hung reading a file avi. 187 ==> 362472 - Provide a way to install Digikam 4.14 in (K)Ubuntu 16.04 (Xenial). 188 ==> 151604 - Print Wizard does not recognize raw images. 189 ==> 202480 - PrintWizard doesn't add comments properly but shows them in the preview. 190 ==> 146457 - Rotation is not done correctly exif. 191 ==> 188426 - Add support for different size printwizard templates. 192 ==> 100471 - Can't print the same image more than once on the same page. 193 ==> 133730 - Tool to print images on photo paper. 194 ==> 209165 - Print Assistant does not print svgz images. 195 ==> 218312 - Make search results to exclude children's tags 196 ==> 116149 - Possibility to quickly print an 'index print' from current album. 197 ==> 117670 - Printing is awfully slow. 198 ==> 127476 - Printing as very very slow. 199 ==> 175077 - digiKam does not print. 200 ==> 177137 - digiKam print assistant problems and ideas. 201 ==> 348760 - Old and not secure VLC version. 202 ==> 117920 - No encoder slide show. 203 ==> 342607 - digiKam crash at startup with GStream : QtMultimedia relevant. 204 ==> 235469 - digiKam Segmentation fault after 2 or 3 modifications. 205 ==> 223936 - Moving photos between albums is slow. 206 ==> 186640 - Multiseat workstation with mdm and gdm - digiKam crash. 207 ==> 227902 - digiKam crashes when picture saved after red-eye effect. 208 ==> 091485 - Red eye reduction - user should be told to select a part of the image. 209 ==> 382259 - Can't open picture database located at /home/egh/Pictures. 210 ==> 102636 - Delete fails: access denied to trash:/xyz.jpg. 211 ==> 382002 - Lazy synchronization not working. 212 ==> 170758 - High load when tagging. 213 ==> 111591 - Tag images browser doesn't show any images. 214 ==> 168267 - digiKam mpeg encoding failure. 215 ==> 115705 - ERROR: [yuvscaler] Could'nt read YUV4MPEG header. 216 ==> 331989 - digiKam crashes when playing AVI-file. 217 ==> 233693 - digiKam crash when clicking on .MOV file in album. 218 ==> 324611 - Deleting picture not possible. 219 ==> 105303 - Can't move images between folders. 220 ==> 092624 - Crashes while starting with signal 11 (SIGSEGV). 221 ==> 292634 - digiKam crash just after moving a people tag square. 222 ==> 274957 - Crash on copy multiple files. 223 ==> 323964 - digiKam crash while processing tags. 224 ==> 333352 - Re-appoints tag people. 225 ==> 283537 - digiKam crashed. 226 ==> 320292 - Crash while entering person names. 227 ==> 197562 - digiKam crash on deleting and moving a few pictures. 228 ==> 323993 - Crash while naming multiple people at the same time in one picture. 229 ==> 203146 - digiKam crashed wile moving files in the background. 230 ==> 107717 - Add trash to album treeview. 231 ==> 093246 - PrintWizard tool is missing. 232 ==> 176367 - Crop stage does not allow rotation or selection. 233 ==> 166712 - Choosing the part which is cut off for printing only works for the first photo. 234 ==> 133193 - Metadata over the photo to print. 235 ==> 145569 - There's non print option on the menu. 236 ==> 111454 - Print photo's date into one corner like print assistant. 237 ==> 141535 - Suggestion for photo layout algorithm. 238 ==> 121538 - Access denied. Could not write to digikamalbums. 239 ==> 273399 - Crash on exit. 240 ==> 267359 - Crash after unmount hdd drive during process running. 241 ==> 231866 - Crash when assigning score. 242 ==> 235249 - I was looking through images one by one in the viewing pane. 243 ==> 226888 - digiKam crashs after edit a few images. 244 ==> 228109 - digiKam close when I rate my picture and changing photos with backspace. 245 ==> 104008 - Name of the album not refreshed when changed. 246 ==> 269925 - Crash on library creation from usb drive. 247 ==> 229857 - Crash while browsing pictures. 248 ==> 266506 - Startup of digikam "by itself". 249 ==> 230531 - digiKam crashed while moving pictures from one folder to another. 250 ==> 261228 - Segfault while plugging in usb flash drive. 251 ==> 223617 - digiKam crash when changing the name of a pict. 252 ==> 225263 - digiKam crashed while applying black and white effect. 253 ==> 117845 - Crashes at startup, only in normal user mode. 254 ==> 252436 - Cierre repentino de digiKam, sin aviso de causa. 255 ==> 230346 - Crash after browsing through Album. 256 ==> 230799 - Crash while editing picture. 257 ==> 222550 - digiKam crashes when looking at pictures. 258 ==> 228501 - digiKam crashes after deleting images. 259 ==> 235583 - Manually updating metadata from database while having the option to write metadata automatically enabled. 260 ==> 259005 - digiKam crashed after external disk was turned off. 261 ==> 226663 - digiKam crashed after applying captions change. 262 ==> 225076 - digiKam crash while it was importing photo from NTFS files system. 263 ==> 256867 - digiKam crashes when deleting album. 264 ==> 173691 - digiKam doesn't show pictures. 265 ==> 193023 - Crash on closing application. 266 ==> 361981 - digiKam dies on start every time. 267 ==> 350927 - digiKam crash on startup. 268 ==> 354071 - digiKam crash on startup. 269 ==> 373876 - digiKam crash on start up. 270 ==> 350487 - digiKam crashes as startup. 271 ==> 173645 - digiKam crashes after startdialog. 272 ==> 375982 - digiKam launching fail. 273 ==> 098286 - Print Wizard has wrong default paper size. 274 ==> 177333 - digiKam can't find images in album. 275 ==> 180342 - Crash when migrating from 9.4 on Ubuntu Intrepid Ibex. 276 ==> 095582 - Link failure, -lpng missing in kioslave. 277 ==> 173995 - digiKam crashes on loading main view. 278 ==> 123120 - Delete (Move to trash) fails if you don't own the directory. 279 ==> 111920 - Crash with signal 11 when sending album to trash. 280 ==> 111819 - Can not move to trash album which contains sub-album. 281 ==> 139287 - Gallery images suddenly disappear after moving the second image to the trash. 282 ==> 145277 - Deleting photo to trash does not send to trash. 283 ==> 235594 - Cannot move files to trash in digiKam. 284 ==> 098231 - "move to trash" doesn't work. 285 ==> 225798 - Error when deleting or moving image to trash. 286 ==> 338920 - View/empty trash from within digiKam. 287 ==> 088923 - Improved verbosity when deleting items and deleting to trashcan. 289 ==> 227773 - At least twice in succession, the program did not even get so far as presenting me with a GUI screen -- instead, it crashed. 290 ==> 254544 - digikam crashed on initial config 291 ==> 206381 - Crash of app when closing app. 292 ==> 318991 - digiKam crash at startup. 293 ==> 319166 - digiKam crashes on 64bit version. 294 ==> 318861 - digiKam crashes on startup. 295 ==> 318744 - digiKam stop immediatly when I try to open it. 296 ==> 319674 - digiKam crashed. 297 ==> 318848 - Crash on startup the application. 298 ==> 320357 - Crash de digiKam. 299 ==> 326347 - Absturz bei Start. 300 ==> 318989 - digiKam crash. 301 ==> 319144 - digiKam crashes. 302 ==> 318859 - digiKam crashes on start. 303 ==> 318842 - digiKam crash in color management. 304 ==> 318730 - digiKam crashes. 305 ==> 318987 - digiKam crashes at startup. 306 ==> 318762 - digiKam crash. 307 ==> 324780 - Crash on startup. 308 ==> 315376 - digiKam Crash on Startup with active X11 color profile. 309 ==> 204551 - Error klauncher reports: Error loading 'kio_digikamalbums'. 310 ==> 180926 - Image thumbnails in albums not showing. 311 ==> 112766 - Can't import photo because digikamalbums:// died. 312 ==> 144200 - digiKam won't display or import thumbnails. 313 ==> 165885 - Thumbnails and images are NOT displayed in the main view center pane. 314 ==> 159377 - High CPU usage while changing exif data. 315 ==> 138106 - Rebuild thumbnails should be multithreaded. 316 ==> 118236 - Long delay and 100% cpu when showing tag submenu or dialogue. 317 ==> 106794 - Too many kio_thumbnail processes bring machine to its knees. 318 ==> 277619 - SETUP : Exclude folder/subfolder/image from database. 319 ==> 151317 - Don't import hidden directories. 320 ==> 226885 - Not displayed thumbnails failed load kio_digikamalbums. 321 ==> 290421 - digiKam should inform users when kio-slave fail to load. 322 ==> 127634 - Communication between digikam and its kioslaves broken if size_t != off_t. 323 ==> 308734 - digikam/kioslave: a lot of "KIO::Slave::timeout: Houston, we lost our slave" and "slave died". 324 ==> 337810 - Crashed after not install able libkgeomap1 depends. 325 ==> 341451 - Will not find subdirectories with images in main collection directory. 326 ==> 284577 - No images shown in albums. 327 ==> 266735 - digiKam displays no images: "unable to create io-slave" (OS X). 328 ==> 327827 - Some pictures not visible in digiKam. 329 ==> 193763 - digiKam doesn't display any photos. 330 ==> 226235 - digiKam fails after upgrade - no albums - rh tag & captions bar frozen. 331 ==> 250610 - Tool or procedure to check digiKam database. 332 ==> 196332 - Copying images leads to an error message. 333 ==> 227244 - Images on local disk not shown in middle pane. 334 ==> 227498 - digikam no longer shows any fotos. Showfoto works. 335 ==> 196329 - Renaming album causes problems (until re-opening). 336 ==> 198868 - pictures are not displayed in the main view i just can see them in the batch menu. 337 ==> 185494 - No images in digiKam, possibly database problem, however they look fine in showfoto. 338 ==> 181792 - Folders appear empty on first run after migrating from an old KDE version. 339 ==> 224404 - No images of a album are shown. 340 ==> 294835 - Albums are listed with (0) photos, but Database Statistics shows correct numbers of photos. 341 ==> 232720 - All Digikam Albums show zero items even though pictures exist. 342 ==> 195079 - digiKam albums appear empty. 343 ==> 203031 - Album list doesn't show pictures even after tons of new pictures were imported. 344 ==> 342557 - No rule to make target /opt/local/lib/libkgeomap.dylib in recent git distribution. 345 ==> 267789 - Make face detection (kface) and geo tagging (kmap) optional features. 346 ==> 171778 - digiKam does not load photos in its database. 347 ==> 196545 - Images on digikam are not dispayed / visualized. 348 ==> 198067 - digiKam does not show any pictures. 349 ==> 253815 - Allow directories/images to be excluded by default. 350 ==> 253062 - Database of 80,000+ images wiped out. 351 ==> 289872 - Database will not open. 352 ==> 313506 - Erasing files should be an independent process in digiKam. 353 ==> 255478 - digiKam database tables only grow in size and get never cleaned. 354 ==> 269435 - digiKam does not display any picture from any source. 355 ==> 201810 - Segfault moving files to trash. 356 ==> 197622 - digiKam crashes on exit. 357 ==> 327470 - digiKam crashes when exiting, after exporting to html. 358 ==> 330111 - No Thumbnails for video files - ffmpegthumbnailer works perfectly outside of digikam. 359 ==> 382703 - Compile error with cmake 3.9. 360 ==> 382677 - Rating groups by mouse only changes first item [patch]. 361 ==> 379126 - digiKam on Wayland Plasma crashes at start. 362 ==> 377517 - digiKam editor crash. 363 ==> 152105 - Add collection view concept based on items to print. 364 ==> 383021 - Documentation links in web site broken. 365 ==> 382952 - Don't abort cmake when package is missing. 366 ==> 382732 - Ignore orphan rows in MySQL migration. 367 ==> 374812 - Panorama stops. 368 ==> 382707 - Order of albums different between tree view and thumbnail view. 369 ==> 147203 - Add ability to Create / Edit GPS information. 370 ==> 119315 - digiKam crashes when viewing a photo. 371 ==> 227903 - digiKam crashes on every second image I edit. 372 ==> 237625 - digiKam crashed when overwriting, or saving edited photo, or deleting photo. 373 ==> 225810 - Crash when saving edited image. 374 ==> 223614 - digiKam crashes when saving a photo editing. 375 ==> 227828 - digiKam is crashing randomly after clicking save icon in picture editor after correcting exposition of picture. 376 ==> 219356 - When clicking on an image to import, digikam crashed. 377 ==> 214676 - digiKam crashed on exit. 378 ==> 219612 - Opened dgiKam, selected a photo, clicked Edit. 379 ==> 223752 - Crashes when selecting images to download off my CF card. 380 ==> 214718 - digiKam Crashed when trying to Edit photo. 381 ==> 196866 - digiKam crashes when saving any file format. 382 ==> 200338 - Segmentation fault while trying to select PNG format for saving. 383 ==> 196790 - digiKam crashes while typing filename extension in "save as" dialogue. 384 ==> 189913 - When saving from TIFF (16bit) image to jpeg or png the system crashes. 385 ==> 228562 - digiKam crashes saving from editor. 386 ==> 230755 - digiKam crashes while saving photos. 387 ==> 225038 - digiKam crash set tag to photo. 388 ==> 227220 - Try to aplay Tags to a set of Images. 389 ==> 227253 - Instability after heavy image transfer/editing. 390 ==> 228788 - digiKam Crashes after editing a jpeg file. 391 ==> 230897 - digiKam core dump when changing stars (notation/cotation) of RAW or not RAW pictures. 392 ==> 231868 - Crash digikam download replace. 393 ==> 233195 - Crash when adding tag information. 394 ==> 222213 - digiKam crash when saving photo (by overwriting the original file). 395 ==> 225987 - Crash selecting another image while the current has unsaved changed properties. 396 ==> 225849 - Crash saving an updated tiff. 397 ==> 225180 - Crash saving Exif on NEF raw file. 398 ==> 246963 - digiKam crash when saving file. 399 ==> 227513 - digiKam crashes when trying to edit (and save) photos. 400 ==> 182488 - digiKam crashes while changing file extention filter for saving. 401 ==> 179035 - Crash using save as and selecting JPEG. 402 ==> 181871 - ShowFoto crashes while trying to save as jpg. 403 ==> 227001 - digiKam crashes after editor save. 404 ==> 226998 - digiKam editor crashed while saving edited image (jpeg, rotated and cropped). 405 ==> 229069 - digiKam crashed while saving edited image. 406 ==> 255817 - digiKam crashed with segmentation fault when saving changed photo. 407 ==> 226457 - digiKam crash on saving edited image. 408 ==> 196866 - digiKam crashes when saving any file format. 409 ==> 241575 - digiKam crashes after saving several (>2) pictures. 410 ==> 143838 - Image menu in Menubar is Empty (no options). 411 ==> 225232 - digiKam exits unexpectedly while saving edited image. 412 ==> 325785 - Most of the tools in editor do not work anymore after upgrading. 413 ==> 261740 - Crash when adding album folders using settings dialogue. 414 ==> 258002 - Crash while attempting to open another directory in my albums. 415 ==> 245261 - digiKam crashes after entering image comments. 416 ==> 263355 - digiKam terminates and crashes sometimes when entering a description for an image. 417 ==> 383280 - Panorama tool doesn't find autooptimiser from Hugin 2017.0. 418 ==> 376470 - Title is not refreshed when read again metadata from file is launched [patch]. 419 ==> 211831 - digiKam crashes at exit, after first start. 420 ==> 210611 - Geolocation tool add gps data crash after write. 421 ==> 191351 - digiKam crashes in Ubuntu (NOT Kubuntu) 9.04 when Konqueror removed. 422 ==> 221117 - digiKam crashes when being closed. 423 ==> 220125 - digiKam crash on exit . 424 ==> 221495 - The program crashed unexpectedly. 425 ==> 211298 - Crash after add geolocalisation via googlemap. 426 ==> 212239 - When leaving the geo-coordinates modify dialog, digikam crashes. 427 ==> 213815 - digiKam crashes when setting geolocation. 428 ==> 212326 - digiKam crashes when closing. 429 ==> 210536 - digiKam crashes when cannot access camera. 430 ==> 218127 - digiKam exit crash (amd64). 431 ==> 212531 - Closing the digiKam application. 432 ==> 210202 - digiKam crash after writing geolocation info on files. 433 ==> 210895 - Switching app leaves left 2 vertical lines of the thumbail frame, closing digiKam crashes. 434 ==> 216760 - digiKam crashed while idle. 435 ==> 165370 - Crash when saving geocoordinates. 436 ==> 242400 - digiKam crashes on startup. 437 ==> 211730 - digiKam crashes when closing the application. 438 ==> 214102 - digiKam crashes on geo info manipulation. 439 ==> 211568 - Crash (sig11) when exiting digiKam. 440 ==> 215708 - digiKam crash while updating sqlite database. 441 ==> 210361 - digiKam crashes on exit. 442 ==> 213911 - Crash after trying to modify gps coordinates. 443 ==> 211138 - Regular crushes when closing digiKam. 444 ==> 221453 - geotag window resize caused crash. 445 ==> 216619 - Crash when setting geolocation coordinates. 446 ==> 214993 - digiKam crash after closing it. 447 ==> 210378 - When closing digikam by clicking the "x" in the window topbar, digikam crashes. 448 ==> 207638 - digiKam crashes when i close it. 449 ==> 211174 - SEGV Crash using Geolocation editor. 450 ==> 217362 - digiKam create crashreport everytime I close it. 451 ==> 212294 - digiKam crash on quit. 452 ==> 211027 - digiKam crash chiusura applicazione. 453 ==> 217506 - digiKam crash when editing coordinates. 454 ==> 211350 - closing digiKam causes crash. 455 ==> 210816 - digiKam crash after normal closing. 456 ==> 212806 - digiKam crashes at program shutdown. 457 ==> 213707 - Crash right after quitting digiKam. 458 ==> 217810 - digiKam crash upon closure. 459 ==> 213843 - Everytime I close digiKam I get this crash however so far everything is working fine with the program. 460 ==> 210350 - Crash when editing geolocation. 461 ==> 211623 - Crash: update gps data. 462 ==> 210512 - This crash report was generated after normal closing digiKam. 463 ==> 327377 - SCAN : upgrade to 3.5.0 caused loss of collection, re-adding caused loss of tags. 464 ==> 223969 - Crash when closing the Track list Editor. 465 ==> 175316 - digiKam crashes when trying to enter gps data. 466 ==> 159570 - Gpssync crashes when the google maps URL cannot be rendered. 467 ==> 210577 - digiKam ever crash when editing GPS Coordinates. 468 ==> 216137 - digiKam geolocation editor crash. 469 ==> 226558 - digiKam crashes when exiting program. 470 ==> 183582 - Crash when trying to geolocate photographs after canceling empty map window. 471 ==> 376681 - Region Coordinates Are Sometimes inf / Large Numbers. 472 ==> 326538 - When a picture is in portrait, face thumbnails are not rotated. 473 ==> 381378 - Face rectangle from XMP sidecar drawn incorrectly for EXIF rotated images. 474 ==> 245081 - digiKam crash while importing images. 475 ==> 243454 - Crash while tagging and moving backwards. 476 ==> 204178 - digiKam crashes while batch processing and album preview in output directory. 477 ==> 240415 - Application crashed while I was editing a picture metadata. 478 ==> 234144 - Crash while renaming album. 479 ==> 234042 - Crash when rating a Image. 480 ==> 224588 - Applying tags crashes digiKam. 481 ==> 226418 - digiKam consistantly crashes upon while I add tags and ratings. 482 ==> 227957 - Crash when deleting picture in lighttable. 483 ==> 246478 - digiKam crashes when a metadata comment is applied to multiple pictures. 484 ==> 224994 - Segmentation fault when saving edited photo with ctrl-s shortcut. 485 ==> 234932 - digiKam crashes on mouse hovering the photo. 486 ==> 225821 - Writing tags to metadata. 487 ==> 241696 - digiKam typical crash, processing large-file-size jpeg images. 488 ==> 235400 - Segmentation fault during view/delete. 489 ==> 226734 - Crash while browsing picture using preview mode. 490 ==> 233943 - digiKam crash after adding tags to RAW pictrue (NEF). 491 ==> 228701 - Crash while moving rapidly through pictures and changing tags. 492 ==> 231396 - digiKam crash when I assign tags to photos. 493 ==> 227390 - Crash upon assigning rating to a photo. 494 ==> 232268 - Editing tags (persons on images), set to be written to image files. 495 ==> 234181 - digiKam crashes when editing metadata of CR2 files. 496 ==> 237896 - Tagging Pics causes frequent crashing. 497 ==> 236880 - Change exif orientation crashes digiKam and alter photograph. 498 ==> 255679 - digiKam add tag auto apply. 499 ==> 233116 - Crash when saving PNG (from RAW NEF). 500 ==> 232271 - Crash when adding tag information. 501 ==> 372482 - Empty album view during thumbnails re-creation. 502 ==> 383646 - Store facetag information in the photo file. 503 ==> 381605 - Importing large image collection slows down to unacceptable speed. 504 ==> 374313 - Wrong icon usage revisited [patch]. 505 ==> 247793 - Add Color Management support to image Viewer. 506 ==> 231321 - Allow to rate items with image viewer. 507 ==> 290931 - Allow to delete items in image viewer. 508 ==> 221458 - Resizing the geotag window causes crash. 509 ==> 383707 - BQM renames files (adds «_1») even if renaming is disabled. -510 ==> +510 ==> 384049 - Add an option for group icon-view frame. +511 ==> diff --git a/app/items/imagedelegate.cpp b/app/items/imagedelegate.cpp index d29ef0877b..aa17f47387 100644 --- a/app/items/imagedelegate.cpp +++ b/app/items/imagedelegate.cpp @@ -1,604 +1,606 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2009-04-19 * Description : Qt item view for images - the delegate * * Copyright (C) 2002-2005 by Renchi Raju * Copyright (C) 2009-2011 by Andi Clemens * Copyright (C) 2002-2017 by Gilles Caulier * Copyright (C) 2006-2011 by Marcel Wiesweg * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #include "imagedelegate.h" #include "imagedelegatepriv.h" // C++ includes #include // Qt includes #include #include #include #include // Local includes #include "digikam_debug.h" #include "albummanager.h" #include "imagecategorydrawer.h" #include "imagecategorizedview.h" #include "imagedelegateoverlay.h" #include "imagemodel.h" #include "imagefiltermodel.h" #include "imagethumbnailmodel.h" #include "thumbnailloadthread.h" +#include "applicationsettings.h" namespace Digikam { void ImageDelegate::ImageDelegatePrivate::clearRects() { ItemViewImageDelegatePrivate::clearRects(); dateRect = QRect(0, 0, 0, 0); modDateRect = QRect(0, 0, 0, 0); pixmapRect = QRect(0, 0, 0, 0); nameRect = QRect(0, 0, 0, 0); titleRect = QRect(0, 0, 0, 0); commentsRect = QRect(0, 0, 0, 0); resolutionRect = QRect(0, 0, 0, 0); coordinatesRect = QRect(0, 0, 0, 0); arRect = QRect(0, 0, 0, 0); sizeRect = QRect(0, 0, 0, 0); tagRect = QRect(0, 0, 0, 0); imageInformationRect = QRect(0, 0, 0, 0); pickLabelRect = QRect(0, 0, 0, 0); groupRect = QRect(0, 0, 0, 0); } ImageDelegate::ImageDelegate(QObject* const parent) : ItemViewImageDelegate(*new ImageDelegatePrivate, parent) { } ImageDelegate::ImageDelegate(ImageDelegate::ImageDelegatePrivate& dd, QObject* parent) : ItemViewImageDelegate(dd, parent) { } ImageDelegate::~ImageDelegate() { Q_D(ImageDelegate); // crashes for a lot of people, see bug 230515. Cause unknown. //delete d->categoryDrawer; Q_UNUSED(d); // To please compiler about warnings. } void ImageDelegate::setView(ImageCategorizedView* view) { Q_D(ImageDelegate); setViewOnAllOverlays(view); if (d->currentView) { disconnect(d->currentView, SIGNAL(modelChanged()), this, SLOT(modelChanged())); } d->currentView = view; setModel(view ? view->model() : 0); if (d->currentView) { connect(d->currentView, SIGNAL(modelChanged()), this, SLOT(modelChanged())); } } void ImageDelegate::setModel(QAbstractItemModel* model) { Q_D(ImageDelegate); // 1) We only need the model to invalidate model-index based caches on change // 2) We do not need to care for overlays. The view calls setActive() on them on model change if (model == d->currentModel) { return; } if (d->currentModel) { disconnect(d->currentModel, 0, this, 0); } d->currentModel = model; if (d->currentModel) { connect(d->currentModel, SIGNAL(layoutAboutToBeChanged()), this, SLOT(modelContentsChanged())); connect(d->currentModel, SIGNAL(modelAboutToBeReset()), this, SLOT(modelContentsChanged())); connect(d->currentModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), this, SLOT(modelContentsChanged())); connect(d->currentModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), this, SLOT(modelContentsChanged())); connect(d->currentModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelContentsChanged())); } } void ImageDelegate::setSpacing(int spacing) { Q_D(ImageDelegate); if (d->categoryDrawer) { d->categoryDrawer->setLowerSpacing(spacing); } ItemViewImageDelegate::setSpacing(spacing); } ImageCategoryDrawer* ImageDelegate::categoryDrawer() const { Q_D(const ImageDelegate); return d->categoryDrawer; } QRect ImageDelegate::commentsRect() const { Q_D(const ImageDelegate); return d->commentsRect; } QRect ImageDelegate::tagsRect() const { Q_D(const ImageDelegate); return d->tagRect; } QRect ImageDelegate::pixmapRect() const { Q_D(const ImageDelegate); return d->pixmapRect; } QRect ImageDelegate::imageInformationRect() const { Q_D(const ImageDelegate); return d->imageInformationRect; } QRect ImageDelegate::groupIndicatorRect() const { Q_D(const ImageDelegate); return d->groupRect; } QRect ImageDelegate::coordinatesIndicatorRect() const { Q_D(const ImageDelegate); return d->coordinatesRect; } void ImageDelegate::prepareThumbnails(ImageThumbnailModel* thumbModel, const QList& indexes) { thumbModel->prepareThumbnails(indexes, thumbnailSize()); } QPixmap ImageDelegate::retrieveThumbnailPixmap(const QModelIndex& index, int thumbnailSize) { // work around constness QAbstractItemModel* const model = const_cast(index.model()); // set requested thumbnail size model->setData(index, thumbnailSize, ImageModel::ThumbnailRole); // get data from model QVariant thumbData = index.data(ImageModel::ThumbnailRole); // reset to default thumbnail size model->setData(index, QVariant(), ImageModel::ThumbnailRole); return thumbData.value(); } QPixmap ImageDelegate::thumbnailPixmap(const QModelIndex& index) const { Q_D(const ImageDelegate); return retrieveThumbnailPixmap(index, d->thumbSize.size()); } void ImageDelegate::paint(QPainter* p, const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_D(const ImageDelegate); ImageInfo info = ImageModel::retrieveImageInfo(index); if (info.isNull()) { return; } // state of painter must not be changed p->save(); p->translate(option.rect.topLeft()); QRect r; bool isSelected = (option.state & QStyle::State_Selected); // Thumbnail QPixmap pix; if (isSelected) { pix = d->selPixmap; } else { pix = d->regPixmap; } bool groupedAndClosed = (info.hasGroupedImages() && - !index.data(ImageFilterModel::GroupIsOpenRole).toBool()); + !index.data(ImageFilterModel::GroupIsOpenRole).toBool() && + ApplicationSettings::instance()->getDrawFramesToGrouped()); QRect actualPixmapRect = drawThumbnail(p, d->pixmapRect, pix, thumbnailPixmap(index), groupedAndClosed); if (!actualPixmapRect.isNull()) { const_cast(this)->updateActualPixmapRect(index, actualPixmapRect); } if (!d->ratingRect.isNull()) { drawRating(p, index, d->ratingRect, info.rating(), isSelected); } // Draw Color Label rectangle drawColorLabelRect(p, option, isSelected, info.colorLabel()); p->setPen(isSelected ? qApp->palette().color(QPalette::HighlightedText) : qApp->palette().color(QPalette::Text)); /* // If there is ImageHistory present, paint a small icon over the thumbnail to indicate that this is derived image if (info.hasImageHistory()) { p->drawPixmap(d->pixmapRect.right()-24, d->pixmapRect.bottom()-24, QIcon::fromTheme(QLatin1String("svn_switch")).pixmap(22, 22)); } */ if (!d->nameRect.isNull()) { drawName(p, d->nameRect, info.name()); } if (!d->titleRect.isNull()) { drawTitle(p, d->titleRect, info.title()); } if (!d->commentsRect.isNull()) { drawComments(p, d->commentsRect, info.comment()); } if (!d->dateRect.isNull()) { drawCreationDate(p, d->dateRect, info.dateTime()); } if (!d->modDateRect.isNull() && info.modDateTime() != info.dateTime()) { drawModificationDate(p, d->modDateRect, info.modDateTime()); } if (!d->resolutionRect.isNull()) { drawImageSize(p, d->resolutionRect, info.dimensions()); } if (!d->arRect.isNull()) { drawAspectRatio(p, d->arRect, info.dimensions()); } if (!d->sizeRect.isNull()) { drawFileSize(p, d->sizeRect, info.fileSize()); } if (!d->groupRect.isNull()) { drawGroupIndicator(p, d->groupRect, info.numberOfGroupedImages(), index.data(ImageFilterModel::GroupIsOpenRole).toBool()); } if (!d->tagRect.isNull()) { QStringList tagsList = AlbumManager::instance()->tagNames(info.tagIds()); tagsList.sort(); QString tags = tagsList.join(QLatin1String(", ")); drawTags(p, d->tagRect, tags, isSelected); } if (!d->pickLabelRect.isNull()) { drawPickLabelIcon(p, d->pickLabelRect, info.pickLabel()); } bool left = index.data(ImageModel::LTLeftPanelRole).toBool(); bool right = index.data(ImageModel::LTRightPanelRole).toBool(); drawPanelSideIcon(p, left, right); if (d->drawImageFormat) { QString frm = info.format(); if (frm.contains(QLatin1String("-"))) frm = frm.section(QLatin1Char('-'), -1); // For RAW format annoted as "RAW-xxx" => "xxx" drawImageFormat(p, actualPixmapRect, frm); } if (info.id() == info.currentReferenceImage()) { drawSpecialInfo(p, actualPixmapRect, i18n("Reference Image")); } if (d->drawCoordinates && info.hasCoordinates()) { drawGeolocationIndicator(p, d->coordinatesRect); } if (d->drawFocusFrame) { drawFocusRect(p, option, isSelected); } if (d->drawMouseOverFrame) { drawMouseOverRect(p, option); } p->restore(); drawOverlays(p, option, index); } QPixmap ImageDelegate::pixmapForDrag(const QStyleOptionViewItem& option, const QList& indexes) const { QPixmap icon; if (!indexes.isEmpty()) { icon = thumbnailPixmap(indexes.first()); } return makeDragPixmap(option, indexes, icon); } bool ImageDelegate::acceptsToolTip(const QPoint& pos, const QRect& visualRect, const QModelIndex& index, QRect* toolTipRect) const { return onActualPixmapRect(pos, visualRect, index, toolTipRect); } bool ImageDelegate::acceptsActivation(const QPoint& pos, const QRect& visualRect, const QModelIndex& index, QRect* activationRect) const { return onActualPixmapRect(pos, visualRect, index, activationRect); } bool ImageDelegate::onActualPixmapRect(const QPoint& pos, const QRect& visualRect, const QModelIndex& index, QRect* returnRect) const { QRect actualRect = actualPixmapRect(index); if (actualRect.isNull()) { return false; } actualRect.translate(visualRect.topLeft()); if (returnRect) { *returnRect = actualRect; } return actualRect.contains(pos); } void ImageDelegate::setDefaultViewOptions(const QStyleOptionViewItem& option) { Q_D(ImageDelegate); if (d->categoryDrawer) { d->categoryDrawer->setDefaultViewOptions(option); } ItemViewImageDelegate::setDefaultViewOptions(option); } void ImageDelegate::invalidatePaintingCache() { Q_D(ImageDelegate); if (d->categoryDrawer) { d->categoryDrawer->invalidatePaintingCache(); } ItemViewImageDelegate::invalidatePaintingCache(); } void ImageDelegate::updateContentWidth() { Q_D(ImageDelegate); d->contentWidth = d->thumbSize.size() + 2*d->radius; } void ImageDelegate::updateSizeRectsAndPixmaps() { Q_D(ImageDelegate); // ---- Reset rects and prepare fonts ---- d->clearRects(); prepareFonts(); // ---- Fixed sizes and metrics ---- updateContentWidth(); prepareMetrics(d->contentWidth); // ---- Calculate rects ---- updateRects(); // ---- Cached pixmaps ---- prepareBackground(); if (!d->ratingRect.isNull()) { // Normally we prepare the pixmaps over the background of the rating rect. // If the rating is drawn over the thumbnail, we can only draw over a transparent pixmap. prepareRatingPixmaps(!d->ratingOverThumbnail); } // ---- Drawing related caches ---- clearCaches(); } void ImageDelegate::clearCaches() { Q_D(ImageDelegate); ItemViewImageDelegate::clearCaches(); d->actualPixmapRectCache.clear(); } void ImageDelegate::clearModelDataCaches() { Q_D(ImageDelegate); d->actualPixmapRectCache.clear(); } void ImageDelegate::modelChanged() { Q_D(ImageDelegate); clearModelDataCaches(); setModel(d->currentView ? d->currentView->model() : 0); } void ImageDelegate::modelContentsChanged() { clearModelDataCaches(); } QRect ImageDelegate::actualPixmapRect(const QModelIndex& index) const { Q_D(const ImageDelegate); // We do not recompute if not found. Assumption is cache is always properly updated. QRect* rect = d->actualPixmapRectCache.object(index.row()); if (rect) { return *rect; } else { return d->pixmapRect; } } void ImageDelegate::updateActualPixmapRect(const QModelIndex& index, const QRect& rect) { Q_D(ImageDelegate); QRect* const old = d->actualPixmapRectCache.object(index.row()); if (!old || *old != rect) { d->actualPixmapRectCache.insert(index.row(), new QRect(rect)); } } int ImageDelegate::calculatethumbSizeToFit(int ws) { Q_D(ImageDelegate); int ts = thumbnailSize().size(); int gs = gridSize().width(); int sp = spacing(); ws = ws - 2*sp; // Thumbnails size loop to check (upper/lower) int ts1, ts2; // New grid size used in loop int ngs; double rs1 = fmod((double)ws, (double)gs); for (ts1 = ts ; ts1 < ThumbnailSize::maxThumbsSize() ; ++ts1) { ngs = ts1 + 2*(d->margin + d->radius) + sp; double nrs = fmod((double)ws, (double)ngs); if (nrs <= rs1) { rs1 = nrs; } else { break; } } double rs2 = fmod((double)ws, (double)gs); for (ts2 = ts ; ts2 > ThumbnailSize::Small ; --ts2) { ngs = ts2 + 2*(d->margin + d->radius) + sp; double nrs = fmod((double)ws, (double)ngs); if (nrs >= rs2) { rs2 = nrs; } else { rs2 = nrs; break; } } if (rs1 > rs2) { return (ts2); } return (ts1); } } // namespace Digikam diff --git a/libs/settings/applicationsettings.cpp b/libs/settings/applicationsettings.cpp index c785254e84..9c42580cec 100644 --- a/libs/settings/applicationsettings.cpp +++ b/libs/settings/applicationsettings.cpp @@ -1,475 +1,477 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2003-16-10 * Description : application settings interface * * Copyright (C) 2003-2004 by Renchi Raju * Copyright (C) 2003-2017 by Gilles Caulier * Copyright (C) 2007 by Arnd Baecker * Copyright (C) 2014-2015 by Mohamed Anwer * Copyright (C) 2014 by Veaceslav Munteanu * Copyright (C) 2017 by Simon Frei * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #include "applicationsettings.h" // Qt includes #include #include // Local includes #include "digikam_config.h" #include "imagefiltersettings.h" #include "imagesortsettings.h" #include "mimefilter.h" #include "thumbnailsize.h" #include "thememanager.h" #include "applicationsettings_p.h" #ifdef HAVE_KFILEMETADATA #include "baloowrap.h" #endif namespace Digikam { class ApplicationSettingsCreator { public: ApplicationSettings object; }; Q_GLOBAL_STATIC(ApplicationSettingsCreator, creator) // ------------------------------------------------------------------------------------------------- ApplicationSettings* ApplicationSettings::instance() { return &creator->object; } ApplicationSettings::ApplicationSettings() : QObject(), d(new Private(this)) { d->config = KSharedConfig::openConfig(); d->init(); readSettings(); // Init Max Thumbnail Size at startup. ThumbnailSize::readSettings(generalConfigGroup()); } ApplicationSettings::~ApplicationSettings() { delete d; } QString ApplicationSettings::generalConfigGroupName() const { return d->configGroupGeneral; } KConfigGroup ApplicationSettings::generalConfigGroup() const { return d->config->group(generalConfigGroupName()); } void ApplicationSettings::emitSetupChanged() { emit setupChanged(); } void ApplicationSettings::applyBalooSettings() { #ifdef HAVE_KFILEMETADATA BalooWrap::instance()->setSyncToBaloo(d->syncToBaloo); BalooWrap::instance()->setSyncToDigikam(d->syncToDigikam); #endif } void ApplicationSettings::readSettings() { KSharedConfigPtr config = d->config; // --------------------------------------------------------------------- KConfigGroup group = config->group(d->configGroupDefault); QStringList collectionList = group.readEntry(d->configAlbumCollectionsEntry, QStringList()); if (!collectionList.isEmpty()) { collectionList.sort(); d->albumCategoryNames = collectionList; } d->albumSortRole = ApplicationSettings::AlbumSortRole(group.readEntry(d->configAlbumSortRoleEntry, (int)ApplicationSettings::ByFolder)); d->imageSortOrder = group.readEntry(d->configImageSortOrderEntry, (int)ImageSortSettings::SortByFileName); d->imageSorting = group.readEntry(d->configImageSortingEntry, (int)ImageSortSettings::AscendingOrder); d->imageGroupMode = group.readEntry(d->configImageGroupModeEntry, (int)ImageSortSettings::CategoryByAlbum); d->imageGroupSortOrder = group.readEntry(d->configImageGroupSortOrderEntry, (int)ImageSortSettings::AscendingOrder); d->itemLeftClickAction = ApplicationSettings::ItemLeftClickAction(group.readEntry( d->configItemLeftClickActionEntry, (int)ApplicationSettings::ShowPreview)); d->thumbnailSize = group.readEntry(d->configDefaultIconSizeEntry, (int)ThumbnailSize::Medium); d->treeThumbnailSize = group.readEntry(d->configDefaultTreeIconSizeEntry, 22); d->treeviewFont = group.readEntry(d->configTreeViewFontEntry, QFontDatabase::systemFont(QFontDatabase::GeneralFont)); d->currentTheme = group.readEntry(d->configThemeEntry, ThemeManager::instance()->defaultThemeName()); d->sidebarTitleStyle = (DMultiTabBar::TextStyle)group.readEntry(d->configSidebarTitleStyleEntry, (int)DMultiTabBar::AllIconsText); d->ratingFilterCond = group.readEntry(d->configRatingFilterConditionEntry, (int)ImageFilterSettings::GreaterEqualCondition); d->recursiveAlbums = group.readEntry(d->configRecursiveAlbumsEntry, false); d->recursiveTags = group.readEntry(d->configRecursiveTagsEntry, true); d->iconShowName = group.readEntry(d->configIconShowNameEntry, false); d->iconShowResolution = group.readEntry(d->configIconShowResolutionEntry, false); d->iconShowAspectRatio = group.readEntry(d->configIconShowAspectRatioEntry, false); d->iconShowSize = group.readEntry(d->configIconShowSizeEntry, false); d->iconShowDate = group.readEntry(d->configIconShowDateEntry, false); d->iconShowModDate = group.readEntry(d->configIconShowModificationDateEntry, false); d->iconShowTitle = group.readEntry(d->configIconShowTitleEntry, true); d->iconShowComments = group.readEntry(d->configIconShowCommentsEntry, true); d->iconShowTags = group.readEntry(d->configIconShowTagsEntry, true); d->iconShowOverlays = group.readEntry(d->configIconShowOverlaysEntry, true); d->iconShowFullscreen = group.readEntry(d->configIconShowFullscreenEntry, true); d->iconShowRating = group.readEntry(d->configIconShowRatingEntry, true); d->iconShowImageFormat = group.readEntry(d->configIconShowImageFormatEntry, true); d->iconShowCoordinates = group.readEntry(d->configIconShowCoordinatesEntry, true); d->iconviewFont = group.readEntry(d->configIconViewFontEntry, QFontDatabase::systemFont(QFontDatabase::GeneralFont)); d->toolTipsFont = group.readEntry(d->configToolTipsFontEntry, QFontDatabase::systemFont(QFontDatabase::GeneralFont)); d->showToolTips = group.readEntry(d->configShowToolTipsEntry, false); d->tooltipShowFileName = group.readEntry(d->configToolTipsShowFileNameEntry, true); d->tooltipShowFileDate = group.readEntry(d->configToolTipsShowFileDateEntry, false); d->tooltipShowFileSize = group.readEntry(d->configToolTipsShowFileSizeEntry, false); d->tooltipShowImageType = group.readEntry(d->configToolTipsShowImageTypeEntry, false); d->tooltipShowImageDim = group.readEntry(d->configToolTipsShowImageDimEntry, true); d->tooltipShowImageAR = group.readEntry(d->configToolTipsShowImageAREntry, true); d->tooltipShowPhotoMake = group.readEntry(d->configToolTipsShowPhotoMakeEntry, true); d->tooltipShowPhotoDate = group.readEntry(d->configToolTipsShowPhotoDateEntry, true); d->tooltipShowPhotoFocal = group.readEntry(d->configToolTipsShowPhotoFocalEntry, true); d->tooltipShowPhotoExpo = group.readEntry(d->configToolTipsShowPhotoExpoEntry, true); d->tooltipShowPhotoMode = group.readEntry(d->configToolTipsShowPhotoModeEntry, true); d->tooltipShowPhotoFlash = group.readEntry(d->configToolTipsShowPhotoFlashEntry, false); d->tooltipShowPhotoWb = group.readEntry(d->configToolTipsShowPhotoWBEntry, false); d->tooltipShowAlbumName = group.readEntry(d->configToolTipsShowAlbumNameEntry, false); d->tooltipShowTitles = group.readEntry(d->configToolTipsShowTitlesEntry, true); d->tooltipShowComments = group.readEntry(d->configToolTipsShowCommentsEntry, true); d->tooltipShowTags = group.readEntry(d->configToolTipsShowTagsEntry, true); d->tooltipShowLabelRating = group.readEntry(d->configToolTipsShowLabelRatingEntry, true); d->tooltipShowVideoAspectRatio = group.readEntry(d->configToolTipsShowVideoAspectRatioEntry, true); d->tooltipShowVideoAudioBitRate = group.readEntry(d->configToolTipsShowVideoAudioBitRateEntry, true); d->tooltipShowVideoAudioChannelType = group.readEntry(d->configToolTipsShowVideoAudioChannelTypeEntry, true); d->tooltipShowVideoAudioCompressor = group.readEntry(d->configToolTipsShowVideoAudioCompressorEntry, true); d->tooltipShowVideoDuration = group.readEntry(d->configToolTipsShowVideoDurationEntry, true); d->tooltipShowVideoFrameRate = group.readEntry(d->configToolTipsShowVideoFrameRateEntry, true); d->tooltipShowVideoVideoCodec = group.readEntry(d->configToolTipsShowVideoVideoCodecEntry, true); d->showAlbumToolTips = group.readEntry(d->configShowAlbumToolTipsEntry, false); d->tooltipShowAlbumTitle = group.readEntry(d->configToolTipsShowAlbumTitleEntry, true); d->tooltipShowAlbumDate = group.readEntry(d->configToolTipsShowAlbumDateEntry, true); d->tooltipShowAlbumCollection = group.readEntry(d->configToolTipsShowAlbumCollectionEntry, true); d->tooltipShowAlbumCategory = group.readEntry(d->configToolTipsShowAlbumCategoryEntry, true); d->tooltipShowAlbumCaption = group.readEntry(d->configToolTipsShowAlbumCaptionEntry, true); d->tooltipShowAlbumPreview = group.readEntry(d->configToolTipsShowAlbumPreviewEntry, false); if (group.readEntry(d->configPreviewLoadFullImageSizeEntry, true)) { d->previewSettings.quality = PreviewSettings::HighQualityPreview; if (group.readEntry(d->configPreviewRawUseEmbeddedPreview, false)) { d->previewSettings.rawLoading = PreviewSettings::RawPreviewFromEmbeddedPreview; } else if (group.readEntry(d->configPreviewRawUseHalfSizeData, false)) { d->previewSettings.rawLoading = PreviewSettings::RawPreviewFromRawHalfSize; } else { d->previewSettings.rawLoading = PreviewSettings::RawPreviewAutomatic; } } else { d->previewSettings.quality = PreviewSettings::FastPreview; } d->previewSettings.convertToEightBit = group.readEntry(d->configPreviewConvertToEightBitEntry, true); d->previewSettings.zoomOrgSize = group.readEntry(d->configPreviewZoomOrgSizeEntry, true); d->previewShowIcons = group.readEntry(d->configPreviewShowIconsEntry, true); d->showThumbbar = group.readEntry(d->configShowThumbbarEntry, true); d->showFolderTreeViewItemsCount = group.readEntry(d->configShowFolderTreeViewItemsCountEntry, false); // --------------------------------------------------------------------- group = generalConfigGroup(); d->showSplash = group.readEntry(d->configShowSplashEntry, true); d->useTrash = group.readEntry(d->configUseTrashEntry, true); d->showTrashDeleteDialog = group.readEntry(d->configShowTrashDeleteDialogEntry, true); d->showPermanentDeleteDialog = group.readEntry(d->configShowPermanentDeleteDialogEntry, true); d->sidebarApplyDirectly = group.readEntry(d->configApplySidebarChangesDirectlyEntry, false); + d->drawFramesToGrouped = group.readEntry(d->configDrawFramesToGroupedEntry, true); d->scrollItemToCenter = group.readEntry(d->configScrollItemToCenterEntry, false); d->showOnlyPersonTagsInPeopleSidebar = group.readEntry(d->configShowOnlyPersonTagsInPeopleSidebarEntry, true); d->stringComparisonType = (StringComparisonType) group.readEntry(d->configStringComparisonTypeEntry, (int) Natural); #ifdef HAVE_APPSTYLE_SUPPORT setApplicationStyle(group.readEntry(d->configApplicationStyleEntry, qApp->style()->objectName())); #else setApplicationStyle(QLatin1String("Fusion")); #endif d->iconTheme = group.readEntry(d->configIconThemeEntry, QString()); d->scanAtStart = group.readEntry(d->configScanAtStartEntry, true); d->cleanAtStart = group.readEntry(d->configCleanAtStartEntry, false); // --------------------------------------------------------------------- d->databaseParams.readFromConfig(); #ifdef HAVE_KFILEMETADATA group = config->group(d->configGroupBaloo); d->syncToDigikam = group.readEntry(d->configSyncBalootoDigikamEntry, false); d->syncToBaloo = group.readEntry(d->configSyncDigikamtoBalooEntry, false); emit balooSettingsChanged(); #endif // HAVE_KFILEMETADATA // --------------------------------------------------------------------- group = config->group(d->configGroupVersioning); d->versionSettings.readFromConfig(group); // --------------------------------------------------------------------- group = config->group(d->configGroupFaceDetection); d->faceDetectionAccuracy = group.readEntry(d->configFaceDetectionAccuracyEntry, double(0.8)); // --------------------------------------------------------------------- group = config->group(d->configGroupDuplicatesSearch); d->minimumSimilarityBound = group.readEntry(d->configMinimumSimilarityBound, 40); d->duplicatesSearchLastMinSimilarity = group.readEntry(d->configDuplicatesSearchLastMinSimilarity, 90); d->duplicatesSearchLastMaxSimilarity = group.readEntry(d->configDuplicatesSearchLastMaxSimilarity, 100); d->duplicatesSearchLastAlbumTagRelation = group.readEntry(d->configDuplicatesSearchLastAlbumTagRelation, 0); d->duplicatesSearchLastRestrictions = group.readEntry(d->configDuplicatesSearchLastRestrictions, 0); // --------------------------------------------------------------------- group = config->group(d->configGroupGrouping); for (ApplicationSettings::OperationModes::key_iterator it = d->groupingOperateOnAll.keyBegin(); it != d->groupingOperateOnAll.keyEnd(); ++it) { d->groupingOperateOnAll.insert(*it, (ApplicationSettings::ApplyToEntireGroup)group.readEntry( d->configGroupingOperateOnAll.value(*it), (int)ApplicationSettings::Ask)); } emit setupChanged(); emit recurseSettingsChanged(); emit balooSettingsChanged(); } void ApplicationSettings::saveSettings() { KSharedConfigPtr config = d->config; // --------------------------------------------------------------------- KConfigGroup group = config->group(d->configGroupDefault); group.writeEntry(d->configAlbumCollectionsEntry, d->albumCategoryNames); group.writeEntry(d->configAlbumSortRoleEntry, (int)d->albumSortRole); group.writeEntry(d->configImageSortOrderEntry, (int)d->imageSortOrder); group.writeEntry(d->configImageSortingEntry, (int)d->imageSorting); group.writeEntry(d->configImageGroupModeEntry, (int)d->imageGroupMode); group.writeEntry(d->configImageGroupSortOrderEntry, (int)d->imageGroupSortOrder); group.writeEntry(d->configItemLeftClickActionEntry, (int)d->itemLeftClickAction); group.writeEntry(d->configDefaultIconSizeEntry, QString::number(d->thumbnailSize)); group.writeEntry(d->configDefaultTreeIconSizeEntry, QString::number(d->treeThumbnailSize)); group.writeEntry(d->configTreeViewFontEntry, d->treeviewFont); group.writeEntry(d->configRatingFilterConditionEntry, d->ratingFilterCond); group.writeEntry(d->configRecursiveAlbumsEntry, d->recursiveAlbums); group.writeEntry(d->configRecursiveTagsEntry, d->recursiveTags); group.writeEntry(d->configThemeEntry, d->currentTheme); group.writeEntry(d->configSidebarTitleStyleEntry, (int)d->sidebarTitleStyle); group.writeEntry(d->configIconShowNameEntry, d->iconShowName); group.writeEntry(d->configIconShowResolutionEntry, d->iconShowResolution); group.writeEntry(d->configIconShowAspectRatioEntry, d->iconShowAspectRatio); group.writeEntry(d->configIconShowSizeEntry, d->iconShowSize); group.writeEntry(d->configIconShowDateEntry, d->iconShowDate); group.writeEntry(d->configIconShowModificationDateEntry, d->iconShowModDate); group.writeEntry(d->configIconShowTitleEntry, d->iconShowTitle); group.writeEntry(d->configIconShowCommentsEntry, d->iconShowComments); group.writeEntry(d->configIconShowTagsEntry, d->iconShowTags); group.writeEntry(d->configIconShowOverlaysEntry, d->iconShowOverlays); group.writeEntry(d->configIconShowFullscreenEntry, d->iconShowFullscreen); group.writeEntry(d->configIconShowRatingEntry, d->iconShowRating); group.writeEntry(d->configIconShowImageFormatEntry, d->iconShowImageFormat); group.writeEntry(d->configIconShowCoordinatesEntry, d->iconShowCoordinates); group.writeEntry(d->configIconViewFontEntry, d->iconviewFont); group.writeEntry(d->configToolTipsFontEntry, d->toolTipsFont); group.writeEntry(d->configShowToolTipsEntry, d->showToolTips); group.writeEntry(d->configToolTipsShowFileNameEntry, d->tooltipShowFileName); group.writeEntry(d->configToolTipsShowFileDateEntry, d->tooltipShowFileDate); group.writeEntry(d->configToolTipsShowFileSizeEntry, d->tooltipShowFileSize); group.writeEntry(d->configToolTipsShowImageTypeEntry, d->tooltipShowImageType); group.writeEntry(d->configToolTipsShowImageDimEntry, d->tooltipShowImageDim); group.writeEntry(d->configToolTipsShowImageAREntry, d->tooltipShowImageAR); group.writeEntry(d->configToolTipsShowPhotoMakeEntry, d->tooltipShowPhotoMake); group.writeEntry(d->configToolTipsShowPhotoDateEntry, d->tooltipShowPhotoDate); group.writeEntry(d->configToolTipsShowPhotoFocalEntry, d->tooltipShowPhotoFocal); group.writeEntry(d->configToolTipsShowPhotoExpoEntry, d->tooltipShowPhotoExpo); group.writeEntry(d->configToolTipsShowPhotoModeEntry, d->tooltipShowPhotoMode); group.writeEntry(d->configToolTipsShowPhotoFlashEntry, d->tooltipShowPhotoFlash); group.writeEntry(d->configToolTipsShowPhotoWBEntry, d->tooltipShowPhotoWb); group.writeEntry(d->configToolTipsShowAlbumNameEntry, d->tooltipShowAlbumName); group.writeEntry(d->configToolTipsShowTitlesEntry, d->tooltipShowTitles); group.writeEntry(d->configToolTipsShowCommentsEntry, d->tooltipShowComments); group.writeEntry(d->configToolTipsShowTagsEntry, d->tooltipShowTags); group.writeEntry(d->configToolTipsShowLabelRatingEntry, d->tooltipShowLabelRating); group.writeEntry(d->configToolTipsShowVideoAspectRatioEntry, d->tooltipShowVideoAspectRatio); group.writeEntry(d->configToolTipsShowVideoAudioBitRateEntry, d->tooltipShowVideoAudioBitRate); group.writeEntry(d->configToolTipsShowVideoAudioChannelTypeEntry, d->tooltipShowVideoAudioChannelType); group.writeEntry(d->configToolTipsShowVideoAudioCompressorEntry, d->tooltipShowVideoAudioCompressor); group.writeEntry(d->configToolTipsShowVideoDurationEntry, d->tooltipShowVideoDuration); group.writeEntry(d->configToolTipsShowVideoFrameRateEntry, d->tooltipShowVideoFrameRate); group.writeEntry(d->configToolTipsShowVideoVideoCodecEntry, d->tooltipShowVideoVideoCodec); group.writeEntry(d->configShowAlbumToolTipsEntry, d->showAlbumToolTips); group.writeEntry(d->configToolTipsShowAlbumTitleEntry, d->tooltipShowAlbumTitle); group.writeEntry(d->configToolTipsShowAlbumDateEntry, d->tooltipShowAlbumDate); group.writeEntry(d->configToolTipsShowAlbumCollectionEntry, d->tooltipShowAlbumCollection); group.writeEntry(d->configToolTipsShowAlbumCategoryEntry, d->tooltipShowAlbumCategory); group.writeEntry(d->configToolTipsShowAlbumCaptionEntry, d->tooltipShowAlbumCaption); group.writeEntry(d->configToolTipsShowAlbumPreviewEntry, d->tooltipShowAlbumPreview); if (d->previewSettings.quality == PreviewSettings::HighQualityPreview) { group.writeEntry(d->configPreviewLoadFullImageSizeEntry, true); switch (d->previewSettings.rawLoading) { case PreviewSettings::RawPreviewAutomatic: group.writeEntry(d->configPreviewRawUseEmbeddedPreview, false); group.writeEntry(d->configPreviewRawUseHalfSizeData, false); break; case PreviewSettings::RawPreviewFromEmbeddedPreview: group.writeEntry(d->configPreviewRawUseEmbeddedPreview, true); group.writeEntry(d->configPreviewRawUseHalfSizeData, false); break; case PreviewSettings::RawPreviewFromRawHalfSize: group.writeEntry(d->configPreviewRawUseEmbeddedPreview, false); group.writeEntry(d->configPreviewRawUseHalfSizeData, true); break; } } else { group.writeEntry(d->configPreviewLoadFullImageSizeEntry, false); } group.writeEntry(d->configPreviewConvertToEightBitEntry, d->previewSettings.convertToEightBit); group.writeEntry(d->configPreviewZoomOrgSizeEntry, d->previewSettings.zoomOrgSize); group.writeEntry(d->configPreviewShowIconsEntry, d->previewShowIcons); group.writeEntry(d->configShowThumbbarEntry, d->showThumbbar); group.writeEntry(d->configShowFolderTreeViewItemsCountEntry, d->showFolderTreeViewItemsCount); // --------------------------------------------------------------------- group = generalConfigGroup(); group.writeEntry(d->configShowSplashEntry, d->showSplash); group.writeEntry(d->configUseTrashEntry, d->useTrash); group.writeEntry(d->configShowTrashDeleteDialogEntry, d->showTrashDeleteDialog); group.writeEntry(d->configShowPermanentDeleteDialogEntry, d->showPermanentDeleteDialog); group.writeEntry(d->configApplySidebarChangesDirectlyEntry, d->sidebarApplyDirectly); + group.writeEntry(d->configDrawFramesToGroupedEntry, d->drawFramesToGrouped); group.writeEntry(d->configScrollItemToCenterEntry, d->scrollItemToCenter); group.writeEntry(d->configShowOnlyPersonTagsInPeopleSidebarEntry, d->showOnlyPersonTagsInPeopleSidebar); group.writeEntry(d->configStringComparisonTypeEntry, (int) d->stringComparisonType); #ifdef HAVE_APPSTYLE_SUPPORT group.writeEntry(d->configApplicationStyleEntry, d->applicationStyle); #endif group.writeEntry(d->configIconThemeEntry, d->iconTheme); group.writeEntry(d->configScanAtStartEntry, d->scanAtStart); group.writeEntry(d->configCleanAtStartEntry, d->cleanAtStart); // --------------------------------------------------------------------- d->databaseParams.writeToConfig(); #ifdef HAVE_KFILEMETADATA group = config->group(d->configGroupBaloo); group.writeEntry(d->configSyncBalootoDigikamEntry, d->syncToDigikam); group.writeEntry(d->configSyncDigikamtoBalooEntry, d->syncToBaloo); #endif // HAVE_KFILEMETADATA // --------------------------------------------------------------------- group = config->group(d->configGroupVersioning); d->versionSettings.writeToConfig(group); // --------------------------------------------------------------------- group = config->group(d->configGroupFaceDetection); group.writeEntry(d->configFaceDetectionAccuracyEntry, d->faceDetectionAccuracy); group = config->group(d->configGroupDuplicatesSearch); group.writeEntry(d->configMinimumSimilarityBound, d->minimumSimilarityBound); group.writeEntry(d->configDuplicatesSearchLastMinSimilarity, d->duplicatesSearchLastMinSimilarity); group.writeEntry(d->configDuplicatesSearchLastMaxSimilarity, d->duplicatesSearchLastMaxSimilarity); group.writeEntry(d->configDuplicatesSearchLastAlbumTagRelation, d->duplicatesSearchLastAlbumTagRelation); group.writeEntry(d->configDuplicatesSearchLastRestrictions, d->duplicatesSearchLastRestrictions); group = config->group(d->configGroupGrouping); for (ApplicationSettings::OperationModes::key_iterator it = d->groupingOperateOnAll.keyBegin(); it != d->groupingOperateOnAll.keyEnd(); ++it) { group.writeEntry(d->configGroupingOperateOnAll.value(*it), (int)d->groupingOperateOnAll.value(*it)); } config->sync(); } } // namespace Digikam diff --git a/libs/settings/applicationsettings.h b/libs/settings/applicationsettings.h index 8cf4c7dd0f..ea43c68275 100644 --- a/libs/settings/applicationsettings.h +++ b/libs/settings/applicationsettings.h @@ -1,539 +1,542 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2003-16-10 * Description : application settings interface * * Copyright (C) 2003-2004 by Renchi Raju * Copyright (C) 2003-2017 by Gilles Caulier * Copyright (C) 2007 by Arnd Baecker * Copyright (C) 2014-2015 by Mohamed Anwer * Copyright (C) 2017 by Simon Frei * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #ifndef APPLICATIONSETTINGS_H #define APPLICATIONSETTINGS_H // Qt includes #include #include #include #include #include // KDE includes #include // Local includes #include "sidebar.h" #include "dbengineparameters.h" #include "versionmanager.h" #include "digikam_export.h" namespace Digikam { class DbEngineParameters; class VersionManagerSettings; class PreviewSettings; class DIGIKAM_EXPORT ApplicationSettings : public QObject { Q_OBJECT public: enum AlbumSortRole { ByFolder = 0, ByCategory, ByDate }; enum ItemLeftClickAction { ShowPreview = 0, StartEditor }; /** * Possible ways of comparing strings. */ enum StringComparisonType { /** * Natural compare using KStringHandler::naturalCompare. */ Natural = 0, /** * Normal comparison using Qt's compare function. */ Normal }; /** * Types of operations * Originally introduced for grouping to configure whether an operation * should be done on all group members or only it's head. */ enum OperationType { Metadata = 0, Kipi, BQM, LightTable, Slideshow, Rename, Tools, Unspecified // This element must always come last }; /** * */ enum ApplyToEntireGroup { No = 0, Yes, Ask }; typedef QHash OperationStrings; typedef QHash OperationModes; Q_SIGNALS: void setupChanged(); void recurseSettingsChanged(); void balooSettingsChanged(); public: static ApplicationSettings* instance(); void readSettings(); void saveSettings(); void emitSetupChanged(); QString generalConfigGroupName() const; // -- MessageBox Notification --------------------------------------------------- /** * @return true if the corresponding message box should be shown. * @param dontShowAgainName the name that identify the message box. * @param result is set to the result that was chosen the last * time the message box was shown. */ bool readMsgBoxShouldBeShown(const QString& dontShowAgainName); /** * Save the fact that the message box should not be shown again. * @param dontShowAgainName the name that identify the message box. If * empty, this method does nothing. */ void saveMsgBoxShouldBeShown(const QString& dontShowAgainName); // -- Database Settings --------------------------------------------------------- DbEngineParameters getDbEngineParameters() const; void setDbEngineParameters(const DbEngineParameters& params); void setSyncBalooToDigikam(bool val); bool getSyncBalooToDigikam() const; void setSyncDigikamToBaloo(bool val); bool getSyncDigikamToBaloo() const; // -- Albums Settings ------------------------------------------------------- void setTreeViewIconSize(int val); int getTreeViewIconSize() const; void setTreeViewFont(const QFont& font); QFont getTreeViewFont() const; void setAlbumSortRole(const AlbumSortRole role); AlbumSortRole getAlbumSortRole() const; void setAlbumSortChanged(bool val); bool getAlbumSortChanged() const; void setShowFolderTreeViewItemsCount(bool val); bool getShowFolderTreeViewItemsCount() const; void setRecurseAlbums(bool val); bool getRecurseAlbums() const; void setRecurseTags(bool val); bool getRecurseTags() const; void setAlbumCategoryNames(const QStringList& list); QStringList getAlbumCategoryNames() const; bool addAlbumCategoryName(const QString& name) const; bool delAlbumCategoryName(const QString& name) const; // -- Icon-View Settings ------------------------------------------------------- void setDefaultIconSize(int val); int getDefaultIconSize() const; void setIconViewFont(const QFont& font); QFont getIconViewFont() const; void setImageSortOrder(int order); int getImageSortOrder() const; // means ascending or descending void setImageSorting(int sorting); int getImageSorting() const; void setImageGroupMode(int mode); int getImageGroupMode() const; void setImageGroupSortOrder(int order); int getImageGroupSortOrder() const; void setItemLeftClickAction(const ItemLeftClickAction action); ItemLeftClickAction getItemLeftClickAction() const; void setIconShowName(bool val); bool getIconShowName() const; void setIconShowSize(bool val); bool getIconShowSize() const; void setIconShowTitle(bool val); bool getIconShowTitle() const; void setIconShowComments(bool val); bool getIconShowComments() const; void setIconShowResolution(bool val); bool getIconShowResolution() const; void setIconShowAspectRatio(bool val); bool getIconShowAspectRatio() const; void setIconShowTags(bool val); bool getIconShowTags() const; void setIconShowDate(bool val); bool getIconShowDate() const; void setIconShowModDate(bool val); bool getIconShowModDate() const; void setIconShowRating(bool val); bool getIconShowRating() const; void setIconShowImageFormat(bool val); bool getIconShowImageFormat() const; void setIconShowCoordinates(bool val); bool getIconShowCoordinates() const; /** * Sets the visibility of the overlay buttons on the image icons. */ void setIconShowOverlays(bool val); /** * Determines whether the overlay buttons should be displayed on the icons. */ bool getIconShowOverlays() const; void setIconShowFullscreen(bool val); bool getIconShowFullscreen() const; void setPreviewSettings(const PreviewSettings& settings); PreviewSettings getPreviewSettings() const; void setPreviewShowIcons(bool val); bool getPreviewShowIcons() const; // -- Mime-Types Settings ------------------------------------------------------- QString getImageFileFilter() const; QString getMovieFileFilter() const; QString getAudioFileFilter() const; QString getRawFileFilter() const; QString getAllFileFilter() const; void addToImageFileFilter(const QString& extensions); // -- Tool-Tips Settings ------------------------------------------------------- bool showToolTipsIsValid() const; bool showAlbumToolTipsIsValid() const; void setToolTipsFont(const QFont& font); QFont getToolTipsFont() const; void setShowToolTips(bool val); bool getShowToolTips() const; void setToolTipsShowFileName(bool val); bool getToolTipsShowFileName() const; void setToolTipsShowFileDate(bool val); bool getToolTipsShowFileDate() const; void setToolTipsShowFileSize(bool val); bool getToolTipsShowFileSize() const; void setToolTipsShowImageType(bool val); bool getToolTipsShowImageType() const; void setToolTipsShowImageDim(bool val); bool getToolTipsShowImageDim() const; void setToolTipsShowImageAR(bool val); bool getToolTipsShowImageAR() const; void setToolTipsShowPhotoMake(bool val); bool getToolTipsShowPhotoMake() const; void setToolTipsShowPhotoDate(bool val); bool getToolTipsShowPhotoDate() const; void setToolTipsShowPhotoFocal(bool val); bool getToolTipsShowPhotoFocal() const; void setToolTipsShowPhotoExpo(bool val); bool getToolTipsShowPhotoExpo() const; void setToolTipsShowPhotoMode(bool val); bool getToolTipsShowPhotoMode() const; void setToolTipsShowPhotoFlash(bool val); bool getToolTipsShowPhotoFlash() const; void setToolTipsShowPhotoWB(bool val); bool getToolTipsShowPhotoWB() const; void setToolTipsShowAlbumName(bool val); bool getToolTipsShowAlbumName() const; void setToolTipsShowTitles(bool val); bool getToolTipsShowTitles() const; void setToolTipsShowComments(bool val); bool getToolTipsShowComments() const; void setToolTipsShowTags(bool val); bool getToolTipsShowTags() const; void setToolTipsShowLabelRating(bool val); bool getToolTipsShowLabelRating() const; void setShowAlbumToolTips(bool val); bool getShowAlbumToolTips() const; void setToolTipsShowAlbumTitle(bool val); bool getToolTipsShowAlbumTitle() const; void setToolTipsShowAlbumDate(bool val); bool getToolTipsShowAlbumDate() const; void setToolTipsShowAlbumCollection(bool val); bool getToolTipsShowAlbumCollection() const; void setToolTipsShowAlbumCategory(bool val); bool getToolTipsShowAlbumCategory() const; void setToolTipsShowAlbumCaption(bool val); bool getToolTipsShowAlbumCaption() const; void setToolTipsShowAlbumPreview(bool val); bool getToolTipsShowAlbumPreview() const; void setToolTipsShowVideoAspectRatio(bool val); bool getToolTipsShowVideoAspectRatio() const; void setToolTipsShowVideoAudioBitRate(bool val); bool getToolTipsShowVideoAudioBitRate() const; void setToolTipsShowVideoAudioChannelType(bool val); bool getToolTipsShowVideoAudioChannelType() const; void setToolTipsShowVideoAudioCompressor(bool val); bool getToolTipsShowVideoAudioCompressor() const; void setToolTipsShowVideoDuration(bool val); bool getToolTipsShowVideoDuration() const; void setToolTipsShowVideoFrameRate(bool val); bool getToolTipsShowVideoFrameRate() const; void setToolTipsShowVideoVideoCodec(bool val); bool getToolTipsShowVideoVideoCodec() const; // -- Miscs Settings ------------------------------------------------------- void setScanAtStart(bool val); bool getScanAtStart() const; void setCleanAtStart(bool val); bool getCleanAtStart() const; void setDatabaseDirSetAtCmd(bool val); bool getDatabaseDirSetAtCmd() const; void setUseTrash(bool val); bool getUseTrash() const; void setShowTrashDeleteDialog(bool val); bool getShowTrashDeleteDialog() const; void setShowPermanentDeleteDialog(bool val); bool getShowPermanentDeleteDialog() const; void setApplySidebarChangesDirectly(bool val); bool getApplySidebarChangesDirectly() const; + void setDrawFramesToGrouped(bool val); + bool getDrawFramesToGrouped() const; + void setScrollItemToCenter(bool val); bool getScrollItemToCenter() const; void setShowOnlyPersonTagsInPeopleSidebar(bool val); bool showOnlyPersonTagsInPeopleSidebar() const; /** * Defines the way in which string comparisons are performed. * * @param val new way to compare strings */ void setStringComparisonType(ApplicationSettings::StringComparisonType val); /** * Tells in which way strings are compared at the moment. * * @return string comparison type to use. */ StringComparisonType getStringComparisonType() const; bool isStringTypeNatural() const; void setApplicationStyle(const QString& style); QString getApplicationStyle() const; void setIconTheme(const QString& theme); QString getIconTheme() const; void setShowSplashScreen(bool val); bool getShowSplashScreen() const; void setCurrentTheme(const QString& theme); QString getCurrentTheme() const; void setSidebarTitleStyle(DMultiTabBar::TextStyle style); DMultiTabBar::TextStyle getSidebarTitleStyle() const; void setVersionManagerSettings(const VersionManagerSettings& settings); VersionManagerSettings getVersionManagerSettings() const; double getFaceDetectionAccuracy() const; void setFaceDetectionAccuracy(double value); void setShowThumbbar(bool val); bool getShowThumbbar() const; void setRatingFilterCond(int val); int getRatingFilterCond() const; void setMinimumSimilarityBound(int val); int getMinimumSimilarityBound() const; void setDuplicatesSearchLastMinSimilarity(int val); int getDuplicatesSearchLastMinSimilarity() const; void setDuplicatesSearchLastMaxSimilarity(int val); int getDuplicatesSearchLastMaxSimilarity() const; /** * Defines whether an operation should be performed on all grouped items * or just the head item. * * @param type Operation to be performed * @param applyAll Whether to apply to all images or just one, or ask */ void setGroupingOperateOnAll(OperationType type, ApplyToEntireGroup applyAll); /** * Tells whether an operation should be performed on all grouped items * or just the head item. * * @param type Operation to be performed * @return Whether to apply to all images or just one, or ask */ ApplyToEntireGroup getGroupingOperateOnAll(OperationType type) const; /** * Asks the user whether the operation should be performed on all grouped * images or just the first. Also supplies an option to remember the answer. * * @param type Operation to be performed * @return Whether to apply to all images or just one */ bool askGroupingOperateOnAll(OperationType type); /** * Gives the translated title/short explanation of the operation * * @param type Operation to be performed * @return Translated operation title/short explanation */ static QString operationTypeTitle(OperationType type); /** * Gives a translated explanation of the operation and an empty string, * if there is none (e.g. for tooltips) * * @param type Operation to be performed * @return Translated operation explanation */ static QString operationTypeExplanation(OperationType type); void setDuplicatesAlbumTagRelation(int val); int getDuplicatesAlbumTagRelation() const; void setDuplicatesSearchRestrictions(int val); int getDuplicatesSearchRestrictions() const; private Q_SLOTS: void applyBalooSettings(); private: ApplicationSettings(); ~ApplicationSettings(); KConfigGroup generalConfigGroup() const; private: friend class ApplicationSettingsCreator; class Private; Private* const d; }; } // namespace Digikam #endif // APPLICATIONSETTINGS_H diff --git a/libs/settings/applicationsettings_miscs.cpp b/libs/settings/applicationsettings_miscs.cpp index e5418da1df..4bef41d8b5 100644 --- a/libs/settings/applicationsettings_miscs.cpp +++ b/libs/settings/applicationsettings_miscs.cpp @@ -1,416 +1,426 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2003-16-10 * Description : application settings interface * * Copyright (C) 2003-2004 by Renchi Raju * Copyright (C) 2003-2017 by Gilles Caulier * Copyright (C) 2007 by Arnd Baecker * Copyright (C) 2014 by Mohamed Anwer * Copyright (C) 2014 by Veaceslav Munteanu * Copyright (C) 2017 by Simon Frei * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #include // Qt includes #include #include #include // KDE includes #include // Local includes #include "applicationsettings.h" #include "applicationsettings_p.h" #include "digikam_debug.h" namespace Digikam { void ApplicationSettings::setCurrentTheme(const QString& theme) { d->currentTheme = theme; } QString ApplicationSettings::getCurrentTheme() const { return d->currentTheme; } void ApplicationSettings::setShowSplashScreen(bool val) { d->showSplash = val; } bool ApplicationSettings::getShowSplashScreen() const { return d->showSplash; } void ApplicationSettings::setSidebarTitleStyle(DMultiTabBar::TextStyle style) { d->sidebarTitleStyle = style; } DMultiTabBar::TextStyle ApplicationSettings::getSidebarTitleStyle() const { return d->sidebarTitleStyle; } void ApplicationSettings::setUseTrash(bool val) { d->useTrash = val; } bool ApplicationSettings::getUseTrash() const { return d->useTrash; } void ApplicationSettings::setShowTrashDeleteDialog(bool val) { d->showTrashDeleteDialog = val; } bool ApplicationSettings::getShowTrashDeleteDialog() const { return d->showTrashDeleteDialog; } void ApplicationSettings::setShowPermanentDeleteDialog(bool val) { d->showPermanentDeleteDialog = val; } bool ApplicationSettings::getShowPermanentDeleteDialog() const { return d->showPermanentDeleteDialog; } void ApplicationSettings::setApplySidebarChangesDirectly(bool val) { d->sidebarApplyDirectly = val; } bool ApplicationSettings::getApplySidebarChangesDirectly() const { return d->sidebarApplyDirectly; } +void ApplicationSettings::setDrawFramesToGrouped(bool val) +{ + d->drawFramesToGrouped = val; +} + +bool ApplicationSettings::getDrawFramesToGrouped() const +{ + return d->drawFramesToGrouped; +} + void ApplicationSettings::setScrollItemToCenter(bool val) { d->scrollItemToCenter = val; } bool ApplicationSettings::getScrollItemToCenter() const { return d->scrollItemToCenter; } void ApplicationSettings::setShowOnlyPersonTagsInPeopleSidebar(bool val) { d->showOnlyPersonTagsInPeopleSidebar = val; } bool ApplicationSettings::showOnlyPersonTagsInPeopleSidebar() const { return d->showOnlyPersonTagsInPeopleSidebar; } void ApplicationSettings::setStringComparisonType(ApplicationSettings::StringComparisonType val) { d->stringComparisonType = val; } ApplicationSettings::StringComparisonType ApplicationSettings::getStringComparisonType() const { return d->stringComparisonType; } bool ApplicationSettings::isStringTypeNatural() const { return (d->stringComparisonType == ApplicationSettings::Natural); } void ApplicationSettings::setVersionManagerSettings(const VersionManagerSettings& settings) { d->versionSettings = settings; } VersionManagerSettings ApplicationSettings::getVersionManagerSettings() const { return d->versionSettings; } double ApplicationSettings::getFaceDetectionAccuracy() const { return d->faceDetectionAccuracy; } void ApplicationSettings::setFaceDetectionAccuracy(double value) { d->faceDetectionAccuracy = value; } void ApplicationSettings::setApplicationStyle(const QString& style) { if (d->applicationStyle.compare(style, Qt::CaseInsensitive) != 0) { d->applicationStyle = style; qApp->setStyle(d->applicationStyle); qApp->style()->polish(qApp); qCDebug(DIGIKAM_GENERAL_LOG) << "Switch to widget style: " << d->applicationStyle; } } QString ApplicationSettings::getApplicationStyle() const { return d->applicationStyle; } void ApplicationSettings::setIconTheme(const QString& theme) { d->iconTheme = theme; } QString ApplicationSettings::getIconTheme() const { return d->iconTheme; } void ApplicationSettings::setShowThumbbar(bool val) { d->showThumbbar = val; } bool ApplicationSettings::getShowThumbbar() const { return d->showThumbbar; } void ApplicationSettings::setRatingFilterCond(int val) { d->ratingFilterCond = val; } int ApplicationSettings::getRatingFilterCond() const { return d->ratingFilterCond; } void ApplicationSettings::setScanAtStart(bool val) { d->scanAtStart = val; } bool ApplicationSettings::getScanAtStart() const { return d->scanAtStart; } void ApplicationSettings::setCleanAtStart(bool val) { d->cleanAtStart = val; } bool ApplicationSettings::getCleanAtStart() const { return d->cleanAtStart; } void ApplicationSettings::setDatabaseDirSetAtCmd(bool val) { d->databaseDirSetAtCmd = val; } bool ApplicationSettings::getDatabaseDirSetAtCmd() const { return d->databaseDirSetAtCmd; } void ApplicationSettings::setMinimumSimilarityBound(int val) { d->minimumSimilarityBound = val; } int ApplicationSettings::getMinimumSimilarityBound() const { return d->minimumSimilarityBound; } void ApplicationSettings::setDuplicatesSearchLastMinSimilarity(int val) { d->duplicatesSearchLastMinSimilarity = val; } int ApplicationSettings::getDuplicatesSearchLastMinSimilarity() const { return d->duplicatesSearchLastMinSimilarity; } void ApplicationSettings::setDuplicatesSearchLastMaxSimilarity(int val) { d->duplicatesSearchLastMaxSimilarity = val; } int ApplicationSettings::getDuplicatesSearchLastMaxSimilarity() const { return d->duplicatesSearchLastMaxSimilarity; } void ApplicationSettings::setDuplicatesAlbumTagRelation(int val) { d->duplicatesSearchLastAlbumTagRelation = val; } int ApplicationSettings::getDuplicatesAlbumTagRelation() const { return d->duplicatesSearchLastAlbumTagRelation; } void ApplicationSettings::setDuplicatesSearchRestrictions(int val) { d->duplicatesSearchLastRestrictions = val; } int ApplicationSettings::getDuplicatesSearchRestrictions() const { return d->duplicatesSearchLastRestrictions; } void ApplicationSettings::setGroupingOperateOnAll(ApplicationSettings::OperationType type, ApplicationSettings::ApplyToEntireGroup applyAll) { if (!d->groupingOperateOnAll.contains(type)) { throw std::invalid_argument("ApplicationSettings::setGroupingOperateOnAll: Invalid operation type."); } d->groupingOperateOnAll[type] = applyAll; return; } ApplicationSettings::ApplyToEntireGroup ApplicationSettings::getGroupingOperateOnAll( ApplicationSettings::OperationType type) const { if (!d->groupingOperateOnAll.contains(type)) { throw std::invalid_argument("ApplicationSettings::getGroupingOperateOnAll: Invalid operation type."); } if (type == ApplicationSettings::Unspecified) { return ApplicationSettings::No; } return d->groupingOperateOnAll[type]; } bool ApplicationSettings::askGroupingOperateOnAll(ApplicationSettings::OperationType type) { if (!d->groupingOperateOnAll.contains(type)) { throw std::invalid_argument("ApplicationSettings::askGroupingOperateOnAll: Invalid operation type."); } if (type == ApplicationSettings::Unspecified) { return false; } QMessageBox msgBox(qApp->activeWindow()); msgBox.setWindowTitle(qApp->applicationName()); msgBox.setText(QLatin1String("

") + ApplicationSettings::operationTypeTitle(type) + QLatin1String("

") + i18n("Do you want to do this operation on all group items?")); msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes); QCheckBox *chkBox = new QCheckBox(i18n("Remember choice for this operation"), &msgBox); msgBox.setCheckBox(chkBox); int result = msgBox.exec(); if (result == QMessageBox::No) { if (chkBox->isChecked()) { setGroupingOperateOnAll(type, ApplicationSettings::No); } return false; } if (chkBox->isChecked()) { setGroupingOperateOnAll(type, ApplicationSettings::Yes); } return true; } QString ApplicationSettings::operationTypeTitle(ApplicationSettings::OperationType type) { switch (type) { case ApplicationSettings::Metadata: return i18n("Metadata"); case ApplicationSettings::LightTable: return i18n("Light Table"); case ApplicationSettings::BQM: return i18n("Batch Queue Manager"); case ApplicationSettings::Slideshow: return i18n("Slideshow"); case ApplicationSettings::Rename: return i18n("Renaming"); case ApplicationSettings::Kipi: return i18n("Import/Export plugins"); case ApplicationSettings::Tools: return i18n("Tools (editor, panorama, stack blending, calendar, " "external program)"); default: throw std::invalid_argument("ApplicationSettings::operationTypeTitle: Invalid operation type."); } } QString ApplicationSettings::operationTypeExplanation(ApplicationSettings::OperationType type) { switch (type) { case ApplicationSettings::Metadata: return i18n("Operations related to metadata, labels, ratings, tags, geolocation and rotation"); case ApplicationSettings::LightTable: return i18n("Adding items to the Light Table"); case ApplicationSettings::BQM: return i18n("Adding items to the Batch Queue Manager"); case ApplicationSettings::Slideshow: return i18n("Opening items in the Slideshow"); case ApplicationSettings::Rename: return i18n("Renaming items"); case ApplicationSettings::Kipi: return i18n("Passing items to import/export plugins"); case ApplicationSettings::Tools: return i18n("Several tools including the editor, panorama, stack blending, " "calendar, html gallery and opening with external programs"); default: return QString(); } } } // namespace Digikam diff --git a/libs/settings/applicationsettings_p.cpp b/libs/settings/applicationsettings_p.cpp index 91259bee89..1d0e3f6110 100644 --- a/libs/settings/applicationsettings_p.cpp +++ b/libs/settings/applicationsettings_p.cpp @@ -1,390 +1,393 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2003-16-10 * Description : application settings interface * * Copyright (C) 2003-2017 by Gilles Caulier * Copyright (C) 2015 by Mohamed Anwer * Copyright (C) 2017 by Simon Frei * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // Qt includes #include #include #include #include // KDE includes #include // Local includes #include "imagefiltersettings.h" #include "imagesortsettings.h" #include "thumbnailsize.h" #include "dbengineparameters.h" #include "versionmanager.h" #include "applicationsettings.h" #include "applicationsettings_p.h" namespace Digikam { const QString ApplicationSettings::Private::configGroupDefault(QLatin1String("Album Settings")); const QString ApplicationSettings::Private::configGroupExif(QLatin1String("EXIF Settings")); const QString ApplicationSettings::Private::configGroupMetadata(QLatin1String("Metadata Settings")); const QString ApplicationSettings::Private::configGroupBaloo(QLatin1String("Baloo Settings")); const QString ApplicationSettings::Private::configGroupGeneral(QLatin1String("General Settings")); const QString ApplicationSettings::Private::configGroupVersioning(QLatin1String("Versioning Settings")); const QString ApplicationSettings::Private::configGroupFaceDetection(QLatin1String("Face Detection Settings")); const QString ApplicationSettings::Private::configGroupDuplicatesSearch(QLatin1String("Find Duplicates View")); const QString ApplicationSettings::Private::configGroupGrouping(QLatin1String("Grouping Behaviour")); const QString ApplicationSettings::Private::configAlbumCollectionsEntry(QLatin1String("Album Collections")); const QString ApplicationSettings::Private::configAlbumSortRoleEntry(QLatin1String("Album Sort Role")); const QString ApplicationSettings::Private::configImageSortOrderEntry(QLatin1String("Image Sort Order")); const QString ApplicationSettings::Private::configImageSortingEntry(QLatin1String("Image Sorting")); const QString ApplicationSettings::Private::configImageGroupModeEntry(QLatin1String("Image Group Mode")); const QString ApplicationSettings::Private::configImageGroupSortOrderEntry(QLatin1String("Image Group Sort Order")); const QString ApplicationSettings::Private::configItemLeftClickActionEntry(QLatin1String("Item Left Click Action")); const QString ApplicationSettings::Private::configDefaultIconSizeEntry(QLatin1String("Default Icon Size")); const QString ApplicationSettings::Private::configDefaultTreeIconSizeEntry(QLatin1String("Default Tree Icon Size")); const QString ApplicationSettings::Private::configTreeViewFontEntry(QLatin1String("TreeView Font")); const QString ApplicationSettings::Private::configThemeEntry(QLatin1String("Theme")); const QString ApplicationSettings::Private::configSidebarTitleStyleEntry(QLatin1String("Sidebar Title Style")); const QString ApplicationSettings::Private::configRatingFilterConditionEntry(QLatin1String("Rating Filter Condition")); const QString ApplicationSettings::Private::configRecursiveAlbumsEntry(QLatin1String("Recursive Albums")); const QString ApplicationSettings::Private::configRecursiveTagsEntry(QLatin1String("Recursive Tags")); const QString ApplicationSettings::Private::configIconShowNameEntry(QLatin1String("Icon Show Name")); const QString ApplicationSettings::Private::configIconShowResolutionEntry(QLatin1String("Icon Show Resolution")); const QString ApplicationSettings::Private::configIconShowSizeEntry(QLatin1String("Icon Show Size")); const QString ApplicationSettings::Private::configIconShowDateEntry(QLatin1String("Icon Show Date")); const QString ApplicationSettings::Private::configIconShowModificationDateEntry(QLatin1String("Icon Show Modification Date")); const QString ApplicationSettings::Private::configIconShowTitleEntry(QLatin1String("Icon Show Title")); const QString ApplicationSettings::Private::configIconShowCommentsEntry(QLatin1String("Icon Show Comments")); const QString ApplicationSettings::Private::configIconShowTagsEntry(QLatin1String("Icon Show Tags")); const QString ApplicationSettings::Private::configIconShowRatingEntry(QLatin1String("Icon Show Rating")); const QString ApplicationSettings::Private::configIconShowImageFormatEntry(QLatin1String("Icon Show Image Format")); const QString ApplicationSettings::Private::configIconShowCoordinatesEntry(QLatin1String("Icon Show Coordinates")); const QString ApplicationSettings::Private::configIconShowAspectRatioEntry(QLatin1String("Icon Show Aspect Ratio")); const QString ApplicationSettings::Private::configIconShowOverlaysEntry(QLatin1String("Icon Show Overlays")); const QString ApplicationSettings::Private::configIconShowFullscreenEntry(QLatin1String("Icon Show Fullscreen")); const QString ApplicationSettings::Private::configIconViewFontEntry(QLatin1String("IconView Font")); const QString ApplicationSettings::Private::configToolTipsFontEntry(QLatin1String("ToolTips Font")); const QString ApplicationSettings::Private::configShowToolTipsEntry(QLatin1String("Show ToolTips")); const QString ApplicationSettings::Private::configToolTipsShowFileNameEntry(QLatin1String("ToolTips Show File Name")); const QString ApplicationSettings::Private::configToolTipsShowFileDateEntry(QLatin1String("ToolTips Show File Date")); const QString ApplicationSettings::Private::configToolTipsShowFileSizeEntry(QLatin1String("ToolTips Show File Size")); const QString ApplicationSettings::Private::configToolTipsShowImageTypeEntry(QLatin1String("ToolTips Show Image Type")); const QString ApplicationSettings::Private::configToolTipsShowImageDimEntry(QLatin1String("ToolTips Show Image Dim")); const QString ApplicationSettings::Private::configToolTipsShowImageAREntry(QLatin1String("ToolTips Show Image AR")); const QString ApplicationSettings::Private::configToolTipsShowPhotoMakeEntry(QLatin1String("ToolTips Show Photo Make")); const QString ApplicationSettings::Private::configToolTipsShowPhotoDateEntry(QLatin1String("ToolTips Show Photo Date")); const QString ApplicationSettings::Private::configToolTipsShowPhotoFocalEntry(QLatin1String("ToolTips Show Photo Focal")); const QString ApplicationSettings::Private::configToolTipsShowPhotoExpoEntry(QLatin1String("ToolTips Show Photo Expo")); const QString ApplicationSettings::Private::configToolTipsShowPhotoModeEntry(QLatin1String("ToolTips Show Photo Mode")); const QString ApplicationSettings::Private::configToolTipsShowPhotoFlashEntry(QLatin1String("ToolTips Show Photo Flash")); const QString ApplicationSettings::Private::configToolTipsShowPhotoWBEntry(QLatin1String("ToolTips Show Photo WB")); const QString ApplicationSettings::Private::configToolTipsShowAlbumNameEntry(QLatin1String("ToolTips Show Album Name")); const QString ApplicationSettings::Private::configToolTipsShowTitlesEntry(QLatin1String("ToolTips Show Titles")); const QString ApplicationSettings::Private::configToolTipsShowCommentsEntry(QLatin1String("ToolTips Show Comments")); const QString ApplicationSettings::Private::configToolTipsShowTagsEntry(QLatin1String("ToolTips Show Tags")); const QString ApplicationSettings::Private::configToolTipsShowLabelRatingEntry(QLatin1String("ToolTips Show Label Rating")); const QString ApplicationSettings::Private::configToolTipsShowVideoAspectRatioEntry(QLatin1String("ToolTips Show Video Aspect Ratio")); const QString ApplicationSettings::Private::configToolTipsShowVideoAudioBitRateEntry(QLatin1String("ToolTips Show Audio Bit Rate")); const QString ApplicationSettings::Private::configToolTipsShowVideoAudioChannelTypeEntry(QLatin1String("ToolTips Show Audio Channel Type")); const QString ApplicationSettings::Private::configToolTipsShowVideoAudioCompressorEntry(QLatin1String("ToolTips Show Audio Compressor")); const QString ApplicationSettings::Private::configToolTipsShowVideoDurationEntry(QLatin1String("ToolTips Show Video Duration")); const QString ApplicationSettings::Private::configToolTipsShowVideoFrameRateEntry(QLatin1String("ToolTips Show Video Frame Rate")); const QString ApplicationSettings::Private::configToolTipsShowVideoVideoCodecEntry(QLatin1String("ToolTips Show Video Codec")); const QString ApplicationSettings::Private::configShowAlbumToolTipsEntry(QLatin1String("Show Album ToolTips")); const QString ApplicationSettings::Private::configToolTipsShowAlbumTitleEntry(QLatin1String("ToolTips Show Album Title")); const QString ApplicationSettings::Private::configToolTipsShowAlbumDateEntry(QLatin1String("ToolTips Show Album Date")); const QString ApplicationSettings::Private::configToolTipsShowAlbumCollectionEntry(QLatin1String("ToolTips Show Album Collection")); const QString ApplicationSettings::Private::configToolTipsShowAlbumCategoryEntry(QLatin1String("ToolTips Show Album Category")); const QString ApplicationSettings::Private::configToolTipsShowAlbumCaptionEntry(QLatin1String("ToolTips Show Album Caption")); const QString ApplicationSettings::Private::configToolTipsShowAlbumPreviewEntry(QLatin1String("ToolTips Show Album Preview")); const QString ApplicationSettings::Private::configPreviewLoadFullImageSizeEntry(QLatin1String("Preview Load Full Image Size")); const QString ApplicationSettings::Private::configPreviewRawUseEmbeddedPreview(QLatin1String("Preview Raw Use Embedded Preview")); const QString ApplicationSettings::Private::configPreviewRawUseHalfSizeData(QLatin1String("Preview Raw Use Half Size Data")); const QString ApplicationSettings::Private::configPreviewConvertToEightBitEntry(QLatin1String("Preview Convert To Eight Bit")); const QString ApplicationSettings::Private::configPreviewZoomOrgSizeEntry(QLatin1String("Preview Zoom Use Original Size")); const QString ApplicationSettings::Private::configPreviewShowIconsEntry(QLatin1String("Preview Show Icons")); const QString ApplicationSettings::Private::configShowThumbbarEntry(QLatin1String("Show Thumbbar")); const QString ApplicationSettings::Private::configShowFolderTreeViewItemsCountEntry(QLatin1String("Show Folder Tree View Items Count")); const QString ApplicationSettings::Private::configShowSplashEntry(QLatin1String("Show Splash")); const QString ApplicationSettings::Private::configUseTrashEntry(QLatin1String("Use Trash")); const QString ApplicationSettings::Private::configShowTrashDeleteDialogEntry(QLatin1String("Show Trash Delete Dialog")); const QString ApplicationSettings::Private::configShowPermanentDeleteDialogEntry(QLatin1String("Show Permanent Delete Dialog")); const QString ApplicationSettings::Private::configApplySidebarChangesDirectlyEntry(QLatin1String("Apply Sidebar Changes Directly")); +const QString ApplicationSettings::Private::configDrawFramesToGroupedEntry(QLatin1String("Draw Frames To Grouped Items")); const QString ApplicationSettings::Private::configScrollItemToCenterEntry(QLatin1String("Scroll Current Item To Center")); const QString ApplicationSettings::Private::configShowOnlyPersonTagsInPeopleSidebarEntry(QLatin1String("Show Only Face Tags For Assigning Name")); const QString ApplicationSettings::Private::configSyncBalootoDigikamEntry(QLatin1String("Sync Baloo to Digikam")); const QString ApplicationSettings::Private::configSyncDigikamtoBalooEntry(QLatin1String("Sync Digikam to Baloo")); const QString ApplicationSettings::Private::configStringComparisonTypeEntry(QLatin1String("String Comparison Type")); const QString ApplicationSettings::Private::configFaceDetectionAccuracyEntry(QLatin1String("Detection Accuracy")); const QString ApplicationSettings::Private::configApplicationStyleEntry(QLatin1String("Application Style")); const QString ApplicationSettings::Private::configIconThemeEntry(QLatin1String("Icon Theme")); const QString ApplicationSettings::Private::configScanAtStartEntry(QLatin1String("Scan At Start")); const QString ApplicationSettings::Private::configCleanAtStartEntry(QLatin1String("Clean core DB At Start")); const QString ApplicationSettings::Private::configMinimumSimilarityBound(QLatin1String("Lower bound for minimum similarity")); const QString ApplicationSettings::Private::configDuplicatesSearchLastMinSimilarity(QLatin1String("Last minimum similarity")); const QString ApplicationSettings::Private::configDuplicatesSearchLastMaxSimilarity(QLatin1String("Last maximum similarity")); const QString ApplicationSettings::Private::configDuplicatesSearchLastAlbumTagRelation(QLatin1String("Last search album tag relation")); const QString ApplicationSettings::Private::configDuplicatesSearchLastRestrictions(QLatin1String("Last search results restriction")); const ApplicationSettings::OperationStrings ApplicationSettings::Private::configGroupingOperateOnAll = ApplicationSettings::Private::createConfigGroupingOperateOnAll(); ApplicationSettings::OperationStrings ApplicationSettings::Private::createConfigGroupingOperateOnAll() { ApplicationSettings::OperationStrings out; out.insert(ApplicationSettings::Metadata, QLatin1String("Do metadata operations on all")); out.insert(ApplicationSettings::Kipi, QLatin1String("Do Kipi operations on all")); out.insert(ApplicationSettings::BQM, QLatin1String("Do BQM operations on all")); out.insert(ApplicationSettings::LightTable, QLatin1String("Do light table operations on all")); out.insert(ApplicationSettings::Slideshow, QLatin1String("Do slideshow operations on all")); out.insert(ApplicationSettings::Rename, QLatin1String("Rename all")); out.insert(ApplicationSettings::Tools, QLatin1String("Operate tools on all")); return out; } ApplicationSettings::Private::Private(ApplicationSettings* const qq) : showSplash(false), useTrash(false), showTrashDeleteDialog(false), showPermanentDeleteDialog(false), sidebarApplyDirectly(false), + drawFramesToGrouped(true), scrollItemToCenter(false), showOnlyPersonTagsInPeopleSidebar(false), iconShowName(false), iconShowSize(false), iconShowDate(false), iconShowModDate(false), iconShowTitle(false), iconShowComments(false), iconShowResolution(false), iconShowTags(false), iconShowOverlays(false), iconShowFullscreen(false), iconShowRating(false), iconShowImageFormat(false), iconShowCoordinates(false), iconShowAspectRatio(false), showToolTips(false), tooltipShowFileName(false), tooltipShowFileDate(false), tooltipShowFileSize(false), tooltipShowImageType(false), tooltipShowImageDim(false), tooltipShowImageAR(false), tooltipShowPhotoMake(false), tooltipShowPhotoDate(false), tooltipShowPhotoFocal(false), tooltipShowPhotoExpo(false), tooltipShowPhotoMode(false), tooltipShowPhotoFlash(false), tooltipShowPhotoWb(false), tooltipShowAlbumName(false), tooltipShowTitles(false), tooltipShowComments(false), tooltipShowTags(false), tooltipShowLabelRating(false), tooltipShowVideoAspectRatio(false), tooltipShowVideoAudioBitRate(false), tooltipShowVideoAudioChannelType(false), tooltipShowVideoAudioCompressor(false), tooltipShowVideoDuration(false), tooltipShowVideoFrameRate(false), tooltipShowVideoVideoCodec(false), showAlbumToolTips(false), tooltipShowAlbumTitle(false), tooltipShowAlbumDate(false), tooltipShowAlbumCollection(false), tooltipShowAlbumCategory(false), tooltipShowAlbumCaption(false), tooltipShowAlbumPreview(false), previewShowIcons(true), showThumbbar(false), showFolderTreeViewItemsCount(false), treeThumbnailSize(0), thumbnailSize(0), ratingFilterCond(0), recursiveAlbums(false), recursiveTags(false), scanAtStart(true), cleanAtStart(true), databaseDirSetAtCmd(false), sidebarTitleStyle(DMultiTabBar::AllIconsText), albumSortRole(ApplicationSettings::ByFolder), albumSortChanged(false), imageSortOrder(0), imageSorting(0), imageGroupMode(0), imageGroupSortOrder(0), itemLeftClickAction(ApplicationSettings::ShowPreview), syncToDigikam(false), syncToBaloo(false), faceDetectionAccuracy(0.8), stringComparisonType(ApplicationSettings::Natural), minimumSimilarityBound(40), duplicatesSearchLastMinSimilarity(90), duplicatesSearchLastMaxSimilarity(100), duplicatesSearchLastAlbumTagRelation(0), duplicatesSearchLastRestrictions(0), groupingOperateOnAll(ApplicationSettings::OperationModes()), q(qq) { for (int i = 0; i != ApplicationSettings::Unspecified; ++i) { groupingOperateOnAll.insert((ApplicationSettings::OperationType)i, ApplicationSettings::Ask); } } ApplicationSettings::Private::~Private() { } void ApplicationSettings::Private::init() { albumCategoryNames.clear(); albumCategoryNames.append(i18n("Category")); albumCategoryNames.append(i18n("Travel")); albumCategoryNames.append(i18n("Holidays")); albumCategoryNames.append(i18n("Friends")); albumCategoryNames.append(i18n("Nature")); albumCategoryNames.append(i18n("Party")); albumCategoryNames.append(i18n("Todo")); albumCategoryNames.append(i18n("Miscellaneous")); albumCategoryNames.sort(); albumSortRole = ApplicationSettings::ByFolder; imageSortOrder = ImageSortSettings::SortByFileName; imageSorting = ImageSortSettings::AscendingOrder; imageGroupMode = ImageSortSettings::CategoryByAlbum; imageGroupSortOrder = ImageSortSettings::AscendingOrder; itemLeftClickAction = ApplicationSettings::ShowPreview; thumbnailSize = ThumbnailSize::Medium; treeThumbnailSize = 22; treeviewFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont); sidebarTitleStyle = DMultiTabBar::AllIconsText; ratingFilterCond = ImageFilterSettings::GreaterEqualCondition; showSplash = true; useTrash = true; showTrashDeleteDialog = true; showPermanentDeleteDialog = true; sidebarApplyDirectly = false; + drawFramesToGrouped = true; scrollItemToCenter = false; showOnlyPersonTagsInPeopleSidebar = false; iconShowName = false; iconShowSize = false; iconShowDate = false; iconShowModDate = false; iconShowTitle = false; iconShowComments = false; iconShowResolution = false; iconShowAspectRatio = false; iconShowTags = true; iconShowOverlays = true; iconShowFullscreen = true; iconShowRating = true; iconShowImageFormat = true; iconShowCoordinates = true; iconviewFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont); toolTipsFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont); showToolTips = false; tooltipShowFileName = true; tooltipShowFileDate = false; tooltipShowFileSize = false; tooltipShowImageType = false; tooltipShowImageDim = true; tooltipShowImageAR = true; tooltipShowPhotoMake = true; tooltipShowPhotoDate = true; tooltipShowPhotoFocal = true; tooltipShowPhotoExpo = true; tooltipShowPhotoMode = true; tooltipShowPhotoFlash = false; tooltipShowPhotoWb = false; tooltipShowAlbumName = false; tooltipShowTitles = false; tooltipShowComments = true; tooltipShowTags = true; tooltipShowLabelRating = true; tooltipShowVideoAspectRatio = true; tooltipShowVideoAudioBitRate = true; tooltipShowVideoAudioChannelType = true; tooltipShowVideoAudioCompressor = true; tooltipShowVideoDuration = true; tooltipShowVideoFrameRate = true; tooltipShowVideoVideoCodec = true; showAlbumToolTips = false; tooltipShowAlbumTitle = true; tooltipShowAlbumDate = true; tooltipShowAlbumCollection = true; tooltipShowAlbumCategory = true; tooltipShowAlbumCaption = true; tooltipShowAlbumPreview = false; previewShowIcons = true; showThumbbar = true; recursiveAlbums = false; recursiveTags = true; showFolderTreeViewItemsCount = false; syncToDigikam = false; syncToBaloo = false; albumSortChanged = false; faceDetectionAccuracy = 0.8; minimumSimilarityBound = 40; duplicatesSearchLastMinSimilarity = 90; duplicatesSearchLastMaxSimilarity = 100; duplicatesSearchLastAlbumTagRelation = 0; duplicatesSearchLastRestrictions = 0; scanAtStart = true; cleanAtStart = true; databaseDirSetAtCmd = false; stringComparisonType = ApplicationSettings::Natural; applicationStyle = qApp->style()->objectName(); iconTheme = QString(); for (int i = 0; i != ApplicationSettings::Unspecified; ++i) { groupingOperateOnAll.insert((ApplicationSettings::OperationType)i, ApplicationSettings::Ask); } q->connect(q, SIGNAL(balooSettingsChanged()), q, SLOT(applyBalooSettings())); } } // namespace Digikam diff --git a/libs/settings/applicationsettings_p.h b/libs/settings/applicationsettings_p.h index f3851c76eb..142a1052fd 100644 --- a/libs/settings/applicationsettings_p.h +++ b/libs/settings/applicationsettings_p.h @@ -1,301 +1,304 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2003-16-10 * Description : application settings interface * * Copyright (C) 2003-2017 by Gilles Caulier * Copyright (C 2015 by Mohamed Anwer * Copyright (C) 2017 by Simon Frei * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #ifndef APPLICATIONSETTINGS_P_H #define APPLICATIONSETTINGS_P_H // Local includes #include "previewsettings.h" class QString; namespace Digikam { class ApplicationSettings; class ApplicationSettings::Private { public: Private(ApplicationSettings* const qq); ~Private(); void init(); public: static const QString configGroupDefault; static const QString configGroupExif; static const QString configGroupMetadata; static const QString configGroupBaloo; static const QString configGroupGeneral; static const QString configGroupVersioning; static const QString configGroupFaceDetection; static const QString configGroupDuplicatesSearch; static const QString configGroupGrouping; static const QString configAlbumCollectionsEntry; static const QString configAlbumSortRoleEntry; static const QString configImageSortOrderEntry; static const QString configImageSortingEntry; static const QString configImageGroupModeEntry; static const QString configImageGroupSortOrderEntry; static const QString configItemLeftClickActionEntry; static const QString configDefaultIconSizeEntry; static const QString configDefaultTreeIconSizeEntry; static const QString configTreeViewFontEntry; static const QString configThemeEntry; static const QString configSidebarTitleStyleEntry; + static const QString configDrawFramesToGroupedEntry; static const QString configScrollItemToCenterEntry; static const QString configShowOnlyPersonTagsInPeopleSidebarEntry; static const QString configRatingFilterConditionEntry; static const QString configRecursiveAlbumsEntry; static const QString configRecursiveTagsEntry; static const QString configIconShowNameEntry; static const QString configIconShowResolutionEntry; static const QString configIconShowSizeEntry; static const QString configIconShowDateEntry; static const QString configIconShowModificationDateEntry; static const QString configIconShowTitleEntry; static const QString configIconShowCommentsEntry; static const QString configIconShowTagsEntry; static const QString configIconShowOverlaysEntry; static const QString configIconShowFullscreenEntry; static const QString configIconShowRatingEntry; static const QString configIconShowImageFormatEntry; static const QString configIconShowCoordinatesEntry; static const QString configIconShowAspectRatioEntry; static const QString configIconViewFontEntry; static const QString configToolTipsFontEntry; static const QString configShowToolTipsEntry; static const QString configToolTipsShowFileNameEntry; static const QString configToolTipsShowFileDateEntry; static const QString configToolTipsShowFileSizeEntry; static const QString configToolTipsShowImageTypeEntry; static const QString configToolTipsShowImageDimEntry; static const QString configToolTipsShowImageAREntry; static const QString configToolTipsShowPhotoMakeEntry; static const QString configToolTipsShowPhotoDateEntry; static const QString configToolTipsShowPhotoFocalEntry; static const QString configToolTipsShowPhotoExpoEntry; static const QString configToolTipsShowPhotoModeEntry; static const QString configToolTipsShowPhotoFlashEntry; static const QString configToolTipsShowPhotoWBEntry; static const QString configToolTipsShowVideoAspectRatioEntry; static const QString configToolTipsShowVideoAudioBitRateEntry; static const QString configToolTipsShowVideoAudioChannelTypeEntry; static const QString configToolTipsShowVideoAudioCompressorEntry; static const QString configToolTipsShowVideoDurationEntry; static const QString configToolTipsShowVideoFrameRateEntry; static const QString configToolTipsShowVideoVideoCodecEntry; static const QString configToolTipsShowAlbumNameEntry; static const QString configToolTipsShowTitlesEntry; static const QString configToolTipsShowCommentsEntry; static const QString configToolTipsShowTagsEntry; static const QString configToolTipsShowLabelRatingEntry; static const QString configShowAlbumToolTipsEntry; static const QString configToolTipsShowAlbumTitleEntry; static const QString configToolTipsShowAlbumDateEntry; static const QString configToolTipsShowAlbumCollectionEntry; static const QString configToolTipsShowAlbumCategoryEntry; static const QString configToolTipsShowAlbumCaptionEntry; static const QString configToolTipsShowAlbumPreviewEntry; static const QString configPreviewLoadFullImageSizeEntry; static const QString configPreviewRawUseEmbeddedPreview; static const QString configPreviewRawUseHalfSizeData; static const QString configPreviewConvertToEightBitEntry; static const QString configPreviewZoomOrgSizeEntry; static const QString configPreviewShowIconsEntry; static const QString configShowThumbbarEntry; static const QString configShowFolderTreeViewItemsCountEntry; static const QString configShowSplashEntry; static const QString configUseTrashEntry; static const QString configShowTrashDeleteDialogEntry; static const QString configShowPermanentDeleteDialogEntry; static const QString configApplySidebarChangesDirectlyEntry; static const QString configScanAtStartEntry; static const QString configCleanAtStartEntry; static const QString configSyncBalootoDigikamEntry; static const QString configSyncDigikamtoBalooEntry; static const QString configStringComparisonTypeEntry; static const QString configFaceDetectionAccuracyEntry; static const QString configApplicationStyleEntry; static const QString configIconThemeEntry; static const QString configMinimumSimilarityBound; static const QString configDuplicatesSearchLastMinSimilarity; static const QString configDuplicatesSearchLastMaxSimilarity; static const QString configDuplicatesSearchLastAlbumTagRelation; static const QString configDuplicatesSearchLastRestrictions; static const ApplicationSettings::OperationStrings configGroupingOperateOnAll; // start up setting bool showSplash; // file ops settings bool useTrash; bool showTrashDeleteDialog; bool showPermanentDeleteDialog; // metadata setting bool sidebarApplyDirectly; + // grouped item draw settings + bool drawFramesToGrouped; // item center settings bool scrollItemToCenter; // tag filter settings bool showOnlyPersonTagsInPeopleSidebar; // icon view settings bool iconShowName; bool iconShowSize; bool iconShowDate; bool iconShowModDate; bool iconShowTitle; bool iconShowComments; bool iconShowResolution; bool iconShowTags; bool iconShowOverlays; bool iconShowFullscreen; bool iconShowRating; bool iconShowImageFormat; bool iconShowCoordinates; bool iconShowAspectRatio; QFont iconviewFont; // Icon-view tooltip settings bool showToolTips; bool tooltipShowFileName; bool tooltipShowFileDate; bool tooltipShowFileSize; bool tooltipShowImageType; bool tooltipShowImageDim; bool tooltipShowImageAR; bool tooltipShowPhotoMake; bool tooltipShowPhotoDate; bool tooltipShowPhotoFocal; bool tooltipShowPhotoExpo; bool tooltipShowPhotoMode; bool tooltipShowPhotoFlash; bool tooltipShowPhotoWb; bool tooltipShowAlbumName; bool tooltipShowTitles; bool tooltipShowComments; bool tooltipShowTags; bool tooltipShowLabelRating; bool tooltipShowVideoAspectRatio; bool tooltipShowVideoAudioBitRate; bool tooltipShowVideoAudioChannelType; bool tooltipShowVideoAudioCompressor; bool tooltipShowVideoDuration; bool tooltipShowVideoFrameRate; bool tooltipShowVideoVideoCodec; QFont toolTipsFont; // Folder-view tooltip settings bool showAlbumToolTips; bool tooltipShowAlbumTitle; bool tooltipShowAlbumDate; bool tooltipShowAlbumCollection; bool tooltipShowAlbumCategory; bool tooltipShowAlbumCaption; bool tooltipShowAlbumPreview; // preview settings PreviewSettings previewSettings; bool previewShowIcons; bool showThumbbar; bool showFolderTreeViewItemsCount; // tree-view settings int treeThumbnailSize; QFont treeviewFont; // icon view settings int thumbnailSize; int ratingFilterCond; bool recursiveAlbums; bool recursiveTags; // theme settings QString currentTheme; // database settings DbEngineParameters databaseParams; bool scanAtStart; bool cleanAtStart; bool databaseDirSetAtCmd; // album settings QStringList albumCategoryNames; KSharedConfigPtr config; DMultiTabBar::TextStyle sidebarTitleStyle; // album view settings ApplicationSettings::AlbumSortRole albumSortRole; bool albumSortChanged; // icon view settings int imageSortOrder; int imageSorting; int imageGroupMode; int imageGroupSortOrder; ApplicationSettings::ItemLeftClickAction itemLeftClickAction; // Baloo settings bool syncToDigikam; bool syncToBaloo; // versioning settings VersionManagerSettings versionSettings; // face detection settings double faceDetectionAccuracy; //misc ApplicationSettings::StringComparisonType stringComparisonType; QString applicationStyle; QString iconTheme; int minimumSimilarityBound; int duplicatesSearchLastMinSimilarity; int duplicatesSearchLastMaxSimilarity; int duplicatesSearchLastAlbumTagRelation; int duplicatesSearchLastRestrictions; // Grouping operation settings ApplicationSettings::OperationModes groupingOperateOnAll; private: ApplicationSettings* q; static ApplicationSettings::OperationStrings createConfigGroupingOperateOnAll(); }; } // namespace Digikam #endif // APPLICATIONSETTINGS_P_H diff --git a/utilities/setup/setupmisc.cpp b/utilities/setup/setupmisc.cpp index 98a3bd13bb..a0a5c05596 100644 --- a/utilities/setup/setupmisc.cpp +++ b/utilities/setup/setupmisc.cpp @@ -1,407 +1,413 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2004-08-23 * Description : mics configuration setup tab * * Copyright (C) 2004 by Renchi Raju * Copyright (C) 2005-2017 by Gilles Caulier * Copyright (C) 2017 by Simon Frei * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #include "setupmisc.h" // Qt includes #include #include #include #include #include #include #include #include #include #include #include #include #include // KDE includes #include // Local includes #include "digikam_config.h" #include "dlayoutbox.h" #include "applicationsettings.h" namespace Digikam { class SetupMisc::Private { public: Private() : tab(0), sidebarTypeLabel(0), stringComparisonTypeLabel(0), applicationStyleLabel(0), iconThemeLabel(0), minSimilarityBoundLabel(0), showSplashCheck(0), showTrashDeleteDialogCheck(0), showPermanentDeleteDialogCheck(0), sidebarApplyDirectlyCheck(0), + drawFramesToGroupedCheck(0), scrollItemToCenterCheck(0), showOnlyPersonTagsInPeopleSidebarCheck(0), scanAtStart(0), cleanAtStart(0), sidebarType(0), stringComparisonType(0), applicationStyle(0), iconTheme(0), minimumSimilarityBound(0), groupingButtons(QHash()) { } QTabWidget* tab; QLabel* sidebarTypeLabel; QLabel* stringComparisonTypeLabel; QLabel* applicationStyleLabel; QLabel* iconThemeLabel; QLabel* minSimilarityBoundLabel; QCheckBox* showSplashCheck; QCheckBox* showTrashDeleteDialogCheck; QCheckBox* showPermanentDeleteDialogCheck; QCheckBox* sidebarApplyDirectlyCheck; + QCheckBox* drawFramesToGroupedCheck; QCheckBox* scrollItemToCenterCheck; QCheckBox* showOnlyPersonTagsInPeopleSidebarCheck; QCheckBox* scanAtStart; QCheckBox* cleanAtStart; QComboBox* sidebarType; QComboBox* stringComparisonType; QComboBox* applicationStyle; QComboBox* iconTheme; QSpinBox* minimumSimilarityBound; QHash groupingButtons; }; SetupMisc::SetupMisc(QWidget* const parent) : QScrollArea(parent), d(new Private) { d->tab = new QTabWidget(viewport()); setWidget(d->tab); setWidgetResizable(true); const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing); // -------------------------------------------------------- QWidget* const behaviourPanel = new QWidget(d->tab); QVBoxLayout* const layout = new QVBoxLayout(behaviourPanel); // -------------------------------------------------------- DHBox* const stringComparisonHbox = new DHBox(behaviourPanel); d->stringComparisonTypeLabel = new QLabel(i18n("String comparison type:"), stringComparisonHbox); d->stringComparisonType = new QComboBox(stringComparisonHbox); d->stringComparisonType->addItem(i18nc("method to compare strings", "Natural"), ApplicationSettings::Natural); d->stringComparisonType->addItem(i18nc("method to compare strings", "Normal"), ApplicationSettings::Normal); d->stringComparisonType->setToolTip(i18n("Sets the way in which strings are compared inside digiKam. " "This eg. influences the sorting of the tree views.
" "Natural tries to compare strings in a way that regards some normal conventions " "and will eg. result in sorting numbers naturally even if they have a different number of digits.
" "Normal uses a more technical approach. " "Use this style if you eg. want to entitle albums with ISO dates (201006 or 20090523) " "and the albums should be sorted according to these dates.
")); // -------------------------------------------------------- d->showTrashDeleteDialogCheck = new QCheckBox(i18n("Confirm when moving items to the &trash"), behaviourPanel); d->showPermanentDeleteDialogCheck = new QCheckBox(i18n("Confirm when permanently deleting items"), behaviourPanel); d->sidebarApplyDirectlyCheck = new QCheckBox(i18n("Do not confirm when applying changes in the &right sidebar"), behaviourPanel); d->scanAtStart = new QCheckBox(i18n("&Scan for new items at startup (makes startup slower)"), behaviourPanel); d->scanAtStart->setToolTip(i18n("Set this option to force digiKam to scan all collections for new items to\n" "register new elements in database. The scan is performed in the background through\n" "the progress manager available in the statusbar\n when digiKam main interface\n" "is loaded. If your computer is fast enough, this will have no effect on usability\n" "of digiKam while scanning. If your collections are huge or if you use a remote database,\n" "this can introduce low latency, and it's recommended to disable this option and to plan\n" "a manual scan through the maintenance tool at the right moment.")); // --------------------------------------------------------- d->cleanAtStart = new QCheckBox(i18n("Remove obsolete core database objects (makes startup slower)"), behaviourPanel); d->cleanAtStart->setToolTip(i18n("Set this option to force digiKam to clean up the core database from obsolete item entries.\n" "Entries are only deleted if the connected image/video/audio file was already removed, i.e.\n" "the database object wastes space.\n" "This option does not clean up other databases as the thumbnails or recognition db.\n" "For clean up routines for other databases, please use the maintenance.")); // -- Application Behavior Options -------------------------------------------------------- QGroupBox* const abOptionsGroup = new QGroupBox(i18n("Application Behavior"), behaviourPanel); QVBoxLayout* const gLayout5 = new QVBoxLayout(); + d->showSplashCheck = new QCheckBox(i18n("&Show splash screen at startup"), abOptionsGroup); + d->drawFramesToGroupedCheck = new QCheckBox(i18n("Draw frames around grouped items"), abOptionsGroup); d->scrollItemToCenterCheck = new QCheckBox(i18n("Scroll current item to center of thumbbar"), abOptionsGroup); d->showOnlyPersonTagsInPeopleSidebarCheck = new QCheckBox(i18n("Show only face tags for assigning names in people sidebar"), abOptionsGroup); - d->showSplashCheck = new QCheckBox(i18n("&Show splash screen at startup"), abOptionsGroup); DHBox* const minSimilarityBoundHbox = new DHBox(abOptionsGroup); d->minSimilarityBoundLabel = new QLabel(i18n("Lower bound for minimum similarity:"), minSimilarityBoundHbox); d->minimumSimilarityBound = new QSpinBox(minSimilarityBoundHbox); d->minimumSimilarityBound->setSuffix(QLatin1String("%")); d->minimumSimilarityBound->setRange(1, 100); d->minimumSimilarityBound->setSingleStep(1); d->minimumSimilarityBound->setValue(40); d->minimumSimilarityBound->setToolTip(i18n("Select here the lower bound of " "the minimum similarity threshold " "for fuzzy and duplicates searches. " "The default value is 40. Selecting " "a lower value than 40 can make the search really slow.")); d->minSimilarityBoundLabel->setBuddy(d->minimumSimilarityBound); DHBox* const tabStyleHbox = new DHBox(abOptionsGroup); d->sidebarTypeLabel = new QLabel(i18n("Sidebar tab title:"), tabStyleHbox); d->sidebarType = new QComboBox(tabStyleHbox); d->sidebarType->addItem(i18n("Only For Active Tab"), 0); d->sidebarType->addItem(i18n("For All Tabs"), 1); d->sidebarType->setToolTip(i18n("Set this option to configure how sidebar tab titles are visible. " "Use \"Only For Active Tab\" option if you use a small screen resolution as with a laptop computer.")); DHBox* const appStyleHbox = new DHBox(abOptionsGroup); d->applicationStyleLabel = new QLabel(i18n("Widget style:"), appStyleHbox); d->applicationStyle = new QComboBox(appStyleHbox); d->applicationStyle->setToolTip(i18n("Set this option to choose the default window decoration and looks.")); QStringList styleList = QStyleFactory::keys(); for (int i = 0 ; i < styleList.count() ; ++i) { d->applicationStyle->addItem(styleList.at(i)); } #ifndef HAVE_APPSTYLE_SUPPORT // See Bug #365262 appStyleHbox->setVisible(false); #endif DHBox* const iconThemeHbox = new DHBox(abOptionsGroup); d->iconThemeLabel = new QLabel(i18n("Icon theme (changes after restart):"), iconThemeHbox); d->iconTheme = new QComboBox(iconThemeHbox); d->iconTheme->setToolTip(i18n("Set this option to choose the default icon theme.")); d->iconTheme->addItem(i18n("Use Icon Theme From System"), QString()); const QString indexTheme = QLatin1String("/index.theme"); const QString breezeDark = QLatin1String("/breeze-dark"); const QString breeze = QLatin1String("/breeze"); bool foundBreezeDark = false; bool foundBreeze = false; foreach(const QString& path, QIcon::themeSearchPaths()) { if (!foundBreeze && QFile::exists(path + breeze + indexTheme)) { d->iconTheme->addItem(i18n("Breeze"), breeze.mid(1)); foundBreeze = true; } if (!foundBreezeDark && QFile::exists(path + breezeDark + indexTheme)) { d->iconTheme->addItem(i18n("Breeze Dark"), breezeDark.mid(1)); foundBreezeDark = true; } } + gLayout5->addWidget(d->showSplashCheck); + gLayout5->addWidget(d->drawFramesToGroupedCheck); gLayout5->addWidget(d->scrollItemToCenterCheck); gLayout5->addWidget(d->showOnlyPersonTagsInPeopleSidebarCheck); - gLayout5->addWidget(d->showSplashCheck); gLayout5->addWidget(minSimilarityBoundHbox); gLayout5->addWidget(tabStyleHbox); gLayout5->addWidget(appStyleHbox); gLayout5->addWidget(iconThemeHbox); abOptionsGroup->setLayout(gLayout5); // -------------------------------------------------------- layout->setContentsMargins(spacing, spacing, spacing, spacing); layout->setSpacing(spacing); layout->addWidget(stringComparisonHbox); layout->addWidget(d->scanAtStart); layout->addWidget(d->cleanAtStart); layout->addWidget(d->showTrashDeleteDialogCheck); layout->addWidget(d->showPermanentDeleteDialogCheck); layout->addWidget(d->sidebarApplyDirectlyCheck); layout->addWidget(abOptionsGroup); layout->addStretch(); // -------------------------------------------------------- d->tab->insertTab(Behaviour, behaviourPanel, i18nc("@title:tab", "Behaviour")); // -------------------------------------------------------- QWidget* const groupingPanel = new QWidget(d->tab); QGridLayout* const grid = new QGridLayout(groupingPanel); // -------------------------------------------------------- QLabel* const description = new QLabel(i18n("Perform the following operations on all group members:"), groupingPanel); description->setToolTip(i18n("When images are grouped the following operations
" "are performed only on the displayed item (No)
" "or on all the hidden items in the group as well (Yes).
" "If Ask is selected, there will be a prompt every
" "time this operation is executed.")); QLabel* const noLabel = new QLabel(i18n("No"), groupingPanel); QLabel* const yesLabel = new QLabel(i18n("Yes"), groupingPanel); QLabel* const askLabel = new QLabel(i18n("Ask"), groupingPanel); QHash labels; for (int i = 0 ; i != ApplicationSettings::Unspecified ; ++i) { labels.insert(i, new QLabel(ApplicationSettings::operationTypeTitle( (ApplicationSettings::OperationType)i), groupingPanel)); QString explanation = ApplicationSettings::operationTypeExplanation( (ApplicationSettings::OperationType)i); if (!explanation.isEmpty()) { labels.value(i)->setToolTip(explanation); } d->groupingButtons.insert(i, new QButtonGroup(groupingPanel)); d->groupingButtons.value(i)->addButton(new QRadioButton(groupingPanel), 0); d->groupingButtons.value(i)->addButton(new QRadioButton(groupingPanel), 1); d->groupingButtons.value(i)->addButton(new QRadioButton(groupingPanel), 2); } // -------------------------------------------------------- grid->addWidget(description, 0, 0, 1, 4); grid->addWidget(noLabel, 1, 1, 1, 1); grid->addWidget(yesLabel, 1, 2, 1, 1); grid->addWidget(askLabel, 1, 3, 1, 1); for (int i = 0 ; i != ApplicationSettings::Unspecified ; ++i) { grid->addWidget(labels.value(i), i+2, 0, 1, 1); grid->addWidget(d->groupingButtons.value(i)->button(0), i+2, 1, 1, 1); grid->addWidget(d->groupingButtons.value(i)->button(1), i+2, 2, 1, 1); grid->addWidget(d->groupingButtons.value(i)->button(2), i+2, 3, 1, 1); } grid->setContentsMargins(spacing, spacing, spacing, spacing); grid->setSpacing(spacing); grid->setColumnStretch(0, 10); grid->setColumnMinimumWidth(1, 30); grid->setColumnMinimumWidth(2, 30); grid->setColumnMinimumWidth(3, 30); grid->setRowStretch(20, 10); // -------------------------------------------------------- d->tab->insertTab(Grouping, groupingPanel, i18nc("@title:tab", "Grouping")); // -------------------------------------------------------- readSettings(); adjustSize(); // -------------------------------------------------------- } SetupMisc::~SetupMisc() { delete d; } void SetupMisc::applySettings() { ApplicationSettings* const settings = ApplicationSettings::instance(); settings->setShowSplashScreen(d->showSplashCheck->isChecked()); settings->setShowTrashDeleteDialog(d->showTrashDeleteDialogCheck->isChecked()); settings->setShowPermanentDeleteDialog(d->showPermanentDeleteDialogCheck->isChecked()); settings->setMinimumSimilarityBound(d->minimumSimilarityBound->value()); settings->setApplySidebarChangesDirectly(d->sidebarApplyDirectlyCheck->isChecked()); settings->setScanAtStart(d->scanAtStart->isChecked()); settings->setCleanAtStart(d->cleanAtStart->isChecked()); + settings->setDrawFramesToGrouped(d->drawFramesToGroupedCheck->isChecked()); settings->setScrollItemToCenter(d->scrollItemToCenterCheck->isChecked()); settings->setShowOnlyPersonTagsInPeopleSidebar(d->showOnlyPersonTagsInPeopleSidebarCheck->isChecked()); settings->setSidebarTitleStyle(d->sidebarType->currentIndex() == 0 ? DMultiTabBar::ActiveIconText : DMultiTabBar::AllIconsText); settings->setStringComparisonType((ApplicationSettings::StringComparisonType) d->stringComparisonType->itemData(d->stringComparisonType->currentIndex()).toInt()); for (int i = 0 ; i != ApplicationSettings::Unspecified ; ++i) { settings->setGroupingOperateOnAll((ApplicationSettings::OperationType)i, (ApplicationSettings::ApplyToEntireGroup)d->groupingButtons.value(i)->checkedId()); } #ifdef HAVE_APPSTYLE_SUPPORT settings->setApplicationStyle(d->applicationStyle->currentText()); #endif settings->setIconTheme(d->iconTheme->currentData().toString()); settings->saveSettings(); } void SetupMisc::readSettings() { ApplicationSettings* const settings = ApplicationSettings::instance(); d->showSplashCheck->setChecked(settings->getShowSplashScreen()); d->showTrashDeleteDialogCheck->setChecked(settings->getShowTrashDeleteDialog()); d->showPermanentDeleteDialogCheck->setChecked(settings->getShowPermanentDeleteDialog()); d->minimumSimilarityBound->setValue(settings->getMinimumSimilarityBound()); d->sidebarApplyDirectlyCheck->setChecked(settings->getApplySidebarChangesDirectly()); d->sidebarApplyDirectlyCheck->setChecked(settings->getApplySidebarChangesDirectly()); d->scanAtStart->setChecked(settings->getScanAtStart()); d->cleanAtStart->setChecked(settings->getCleanAtStart()); + d->drawFramesToGroupedCheck->setChecked(settings->getDrawFramesToGrouped()); d->scrollItemToCenterCheck->setChecked(settings->getScrollItemToCenter()); d->showOnlyPersonTagsInPeopleSidebarCheck->setChecked(settings->showOnlyPersonTagsInPeopleSidebar()); d->sidebarType->setCurrentIndex(settings->getSidebarTitleStyle() == DMultiTabBar::ActiveIconText ? 0 : 1); d->stringComparisonType->setCurrentIndex(settings->getStringComparisonType()); for (int i = 0 ; i != ApplicationSettings::Unspecified ; ++i) { d->groupingButtons.value(i)->button((int)settings->getGroupingOperateOnAll((ApplicationSettings::OperationType)i))->setChecked(true); } #ifdef HAVE_APPSTYLE_SUPPORT d->applicationStyle->setCurrentIndex(d->applicationStyle->findText(settings->getApplicationStyle(), Qt::MatchFixedString)); #endif d->iconTheme->setCurrentIndex(d->iconTheme->findData(settings->getIconTheme())); } } // namespace Digikam