From 90d537281333ddd0f6384ca832ab6ed3d3b7b158 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Fri, 29 May 2020 10:00:07 -0400 Subject: [PATCH] Replace database icons with SVG's MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original source of icons is the icon8 library (http://icons8.com/c/flat-color-icons) and Paomedia (https://github.com/paomedia/small-n-flat). All icons used are licensed MIT or CC0; annotated in COPYING. * Closes #4071 * Increase default size of database icons to 24px and entry preview panel to 48px * Add shell script to assemble the database icons * Use QIcon to seamlessly support High DPI displays and pixmap caching * Add badge support for KeeShare groups and expired entries. * Guard against use of QPixmap::fromImage without a GUI * Add SVG minify and improve `make icons` Co-authored-by: Wolfram Rösler --- COPYING | 180 ++++++++--------- share/CMakeLists.txt | 100 ++-------- share/crushpng.sh | 8 - share/icons/badges/0_ShareActive.svg | 1 + share/icons/badges/1_ShareInactive.svg | 1 + share/icons/badges/2_Expired.svg | 1 + share/icons/database/C00_Password.png | Bin 808 -> 0 bytes share/icons/database/C00_Password.svg | 1 + share/icons/database/C01_Package_Network.png | Bin 985 -> 0 bytes share/icons/database/C01_Package_Network.svg | 1 + .../icons/database/C02_MessageBox_Warning.png | Bin 805 -> 0 bytes .../icons/database/C02_MessageBox_Warning.svg | 1 + share/icons/database/C03_Server.png | Bin 810 -> 0 bytes share/icons/database/C03_Server.svg | 1 + share/icons/database/C04_Klipper.png | Bin 823 -> 0 bytes share/icons/database/C04_Klipper.svg | 1 + share/icons/database/C05_Edu_Languages.png | Bin 919 -> 0 bytes share/icons/database/C05_Edu_Languages.svg | 1 + share/icons/database/C06_KCMDF.png | Bin 801 -> 0 bytes share/icons/database/C06_KCMDF.svg | 1 + share/icons/database/C07_Kate.png | Bin 926 -> 0 bytes share/icons/database/C07_Kate.svg | 1 + share/icons/database/C08_Socket.png | Bin 992 -> 0 bytes share/icons/database/C08_Socket.svg | 1 + share/icons/database/C09_Identity.png | Bin 688 -> 0 bytes share/icons/database/C09_Identity.svg | 1 + share/icons/database/C10_Kontact.png | Bin 902 -> 0 bytes share/icons/database/C10_Kontact.svg | 1 + share/icons/database/C11_Camera.png | Bin 754 -> 0 bytes share/icons/database/C11_Camera.svg | 1 + share/icons/database/C12_IRKickFlash.png | Bin 950 -> 0 bytes share/icons/database/C12_IRKickFlash.svg | 1 + share/icons/database/C13_KGPG_Key3.png | Bin 821 -> 0 bytes share/icons/database/C13_KGPG_Key3.svg | 1 + share/icons/database/C14_Laptop_Power.png | Bin 816 -> 0 bytes share/icons/database/C14_Laptop_Power.svg | 1 + share/icons/database/C15_Scanner.png | Bin 955 -> 0 bytes share/icons/database/C15_Scanner.svg | 1 + share/icons/database/C16_Mozilla_Firebird.png | Bin 891 -> 0 bytes share/icons/database/C16_Mozilla_Firebird.svg | 1 + share/icons/database/C17_CDROM_Unmount.png | Bin 920 -> 0 bytes share/icons/database/C17_CDROM_Unmount.svg | 1 + share/icons/database/C18_Display.png | Bin 743 -> 0 bytes share/icons/database/C18_Display.svg | 1 + share/icons/database/C19_Mail_Generic.png | Bin 971 -> 0 bytes share/icons/database/C19_Mail_Generic.svg | 1 + share/icons/database/C20_Misc.png | Bin 914 -> 0 bytes share/icons/database/C20_Misc.svg | 1 + share/icons/database/C21_KOrganizer.png | Bin 930 -> 0 bytes share/icons/database/C21_KOrganizer.svg | 1 + share/icons/database/C22_ASCII.png | Bin 358 -> 0 bytes share/icons/database/C22_ASCII.svg | 1 + share/icons/database/C23_Icons.png | Bin 623 -> 0 bytes share/icons/database/C23_Icons.svg | 1 + .../database/C24_Connect_Established.png | Bin 1012 -> 0 bytes .../database/C24_Connect_Established.svg | 1 + share/icons/database/C25_Folder_Mail.png | Bin 709 -> 0 bytes share/icons/database/C25_Folder_Mail.svg | 1 + share/icons/database/C26_FileSave.png | Bin 691 -> 0 bytes share/icons/database/C26_FileSave.svg | 1 + share/icons/database/C27_NFS_Unmount.png | Bin 887 -> 0 bytes share/icons/database/C27_NFS_Unmount.svg | 1 + share/icons/database/C28_QuickTime.png | Bin 764 -> 0 bytes share/icons/database/C28_QuickTime.svg | 1 + share/icons/database/C29_KGPG_Term.png | Bin 751 -> 0 bytes share/icons/database/C29_KGPG_Term.svg | 1 + share/icons/database/C30_Konsole.png | Bin 826 -> 0 bytes share/icons/database/C30_Konsole.svg | 1 + share/icons/database/C31_FilePrint.png | Bin 875 -> 0 bytes share/icons/database/C31_FilePrint.svg | 1 + share/icons/database/C32_FSView.png | Bin 721 -> 0 bytes share/icons/database/C32_FSView.svg | 1 + share/icons/database/C33_Run.png | Bin 836 -> 0 bytes share/icons/database/C33_Run.svg | 1 + share/icons/database/C34_Configure.png | Bin 828 -> 0 bytes share/icons/database/C34_Configure.svg | 1 + share/icons/database/C35_KRFB.png | Bin 1021 -> 0 bytes share/icons/database/C35_KRFB.svg | 1 + share/icons/database/C36_Ark.png | Bin 929 -> 0 bytes share/icons/database/C36_Ark.svg | 1 + share/icons/database/C37_KPercentage.png | Bin 980 -> 0 bytes share/icons/database/C37_KPercentage.svg | 1 + share/icons/database/C38_Samba_Unmount.png | Bin 999 -> 0 bytes share/icons/database/C38_Samba_Unmount.svg | 1 + share/icons/database/C39_History.png | Bin 963 -> 0 bytes share/icons/database/C39_History.svg | 1 + share/icons/database/C40_Mail_Find.png | Bin 1018 -> 0 bytes share/icons/database/C40_Mail_Find.svg | 1 + share/icons/database/C41_VectorGfx.png | Bin 743 -> 0 bytes share/icons/database/C41_VectorGfx.svg | 1 + share/icons/database/C42_KCMMemory.png | Bin 752 -> 0 bytes share/icons/database/C42_KCMMemory.svg | 1 + share/icons/database/C43_EditTrash.png | Bin 880 -> 0 bytes share/icons/database/C43_EditTrash.svg | 1 + share/icons/database/C44_KNotes.png | Bin 786 -> 0 bytes share/icons/database/C44_KNotes.svg | 1 + share/icons/database/C45_Cancel.png | Bin 998 -> 0 bytes share/icons/database/C45_Cancel.svg | 1 + share/icons/database/C46_Help.png | Bin 963 -> 0 bytes share/icons/database/C46_Help.svg | 1 + share/icons/database/C47_KPackage.png | Bin 858 -> 0 bytes share/icons/database/C47_KPackage.svg | 1 + share/icons/database/C48_Folder.png | Bin 484 -> 0 bytes share/icons/database/C48_Folder.svg | 1 + share/icons/database/C49_Folder_Blue_Open.png | Bin 496 -> 0 bytes share/icons/database/C49_Folder_Blue_Open.svg | 1 + share/icons/database/C50_Folder_Tar.png | Bin 719 -> 0 bytes share/icons/database/C50_Folder_Tar.svg | 1 + share/icons/database/C51_Decrypted.png | Bin 826 -> 0 bytes share/icons/database/C51_Decrypted.svg | 1 + share/icons/database/C52_Encrypted.png | Bin 730 -> 0 bytes share/icons/database/C52_Encrypted.svg | 1 + share/icons/database/C53_Apply.png | Bin 759 -> 0 bytes share/icons/database/C53_Apply.svg | 1 + share/icons/database/C54_Signature.png | Bin 673 -> 0 bytes share/icons/database/C54_Signature.svg | 1 + share/icons/database/C55_Thumbnail.png | Bin 740 -> 0 bytes share/icons/database/C55_Thumbnail.svg | 1 + share/icons/database/C56_KAddressBook.png | Bin 834 -> 0 bytes share/icons/database/C56_KAddressBook.svg | 1 + share/icons/database/C57_View_Text.png | Bin 735 -> 0 bytes share/icons/database/C57_View_Text.svg | 1 + share/icons/database/C58_KGPG.png | Bin 939 -> 0 bytes share/icons/database/C58_KGPG.svg | 1 + share/icons/database/C58_KPGP.svg | 1 + .../database/C59_Package_Development.png | Bin 847 -> 0 bytes .../database/C59_Package_Development.svg | 1 + share/icons/database/C60_KFM_Home.png | Bin 869 -> 0 bytes share/icons/database/C60_KFM_Home.svg | 1 + share/icons/database/C61_Services.png | Bin 862 -> 0 bytes share/icons/database/C61_Services.svg | 1 + share/icons/database/C62_Tux.png | Bin 530 -> 0 bytes share/icons/database/C62_Tux.svg | 1 + share/icons/database/C63_Feather.png | Bin 406 -> 0 bytes share/icons/database/C63_Feather.svg | 1 + share/icons/database/C64_Apple.png | Bin 478 -> 0 bytes share/icons/database/C64_Apple.svg | 1 + share/icons/database/C65_W.png | Bin 452 -> 0 bytes share/icons/database/C65_W.svg | 1 + share/icons/database/C66_Money.png | Bin 285 -> 0 bytes share/icons/database/C66_Money.svg | 1 + share/icons/database/C67_Certificate.png | Bin 512 -> 0 bytes share/icons/database/C67_Certificate.svg | 1 + share/icons/database/C68_BlackBerry.png | Bin 516 -> 0 bytes share/icons/database/C68_BlackBerry.svg | 1 + share/icons/icons.qrc | 142 +++++++------- share/icons/minify.sh | 21 ++ share/windows/create-ico.sh | 11 +- share/wizard/background-pixmap.png | Bin 45338 -> 41772 bytes src/core/DatabaseIcons.cpp | 181 +++++++----------- src/core/DatabaseIcons.h | 30 +-- src/core/Entry.cpp | 33 ++-- src/core/Entry.h | 4 +- src/core/Global.h | 7 + src/core/Group.cpp | 45 ++--- src/core/Group.h | 5 +- src/core/Merger.cpp | 11 +- src/core/Metadata.cpp | 110 ++++------- src/core/Metadata.h | 18 +- src/fdosecrets/widgets/SettingsModels.cpp | 3 +- src/format/HtmlExporter.cpp | 5 +- src/format/KdbxXmlReader.cpp | 6 +- src/gui/EditWidgetIcons.cpp | 6 +- src/gui/EntryPreviewWidget.cpp | 12 +- src/gui/EntryPreviewWidget.h | 1 - src/gui/IconModels.cpp | 6 +- src/gui/entry/AutoTypeMatchModel.cpp | 8 +- src/gui/entry/EditEntryWidget.cpp | 2 +- src/gui/entry/EntryModel.cpp | 7 +- src/gui/group/EditGroupWidget.cpp | 2 +- src/gui/group/GroupModel.cpp | 9 +- src/keeshare/KeeShare.cpp | 14 +- src/keeshare/ShareExport.cpp | 2 +- tests/TestEntryModel.cpp | 2 +- tests/TestGroup.cpp | 14 +- tests/TestKeePass1Reader.cpp | 2 +- tests/TestKeePass2Format.cpp | 4 +- tests/TestMerge.cpp | 12 +- tests/gui/TestGuiPixmaps.cpp | 98 ++-------- tests/gui/TestGuiPixmaps.h | 3 - utils/{makeicons.sh => makeappicons.sh} | 0 utils/makedbicons.sh | 123 ++++++++++++ 182 files changed, 640 insertions(+), 680 deletions(-) delete mode 100644 share/crushpng.sh create mode 100644 share/icons/badges/0_ShareActive.svg create mode 100644 share/icons/badges/1_ShareInactive.svg create mode 100644 share/icons/badges/2_Expired.svg delete mode 100644 share/icons/database/C00_Password.png create mode 100644 share/icons/database/C00_Password.svg delete mode 100644 share/icons/database/C01_Package_Network.png create mode 100644 share/icons/database/C01_Package_Network.svg delete mode 100644 share/icons/database/C02_MessageBox_Warning.png create mode 100644 share/icons/database/C02_MessageBox_Warning.svg delete mode 100644 share/icons/database/C03_Server.png create mode 100644 share/icons/database/C03_Server.svg delete mode 100644 share/icons/database/C04_Klipper.png create mode 100644 share/icons/database/C04_Klipper.svg delete mode 100644 share/icons/database/C05_Edu_Languages.png create mode 100644 share/icons/database/C05_Edu_Languages.svg delete mode 100644 share/icons/database/C06_KCMDF.png create mode 100644 share/icons/database/C06_KCMDF.svg delete mode 100644 share/icons/database/C07_Kate.png create mode 100644 share/icons/database/C07_Kate.svg delete mode 100644 share/icons/database/C08_Socket.png create mode 100644 share/icons/database/C08_Socket.svg delete mode 100644 share/icons/database/C09_Identity.png create mode 100644 share/icons/database/C09_Identity.svg delete mode 100644 share/icons/database/C10_Kontact.png create mode 100644 share/icons/database/C10_Kontact.svg delete mode 100644 share/icons/database/C11_Camera.png create mode 100644 share/icons/database/C11_Camera.svg delete mode 100644 share/icons/database/C12_IRKickFlash.png create mode 100644 share/icons/database/C12_IRKickFlash.svg delete mode 100644 share/icons/database/C13_KGPG_Key3.png create mode 100644 share/icons/database/C13_KGPG_Key3.svg delete mode 100644 share/icons/database/C14_Laptop_Power.png create mode 100644 share/icons/database/C14_Laptop_Power.svg delete mode 100644 share/icons/database/C15_Scanner.png create mode 100644 share/icons/database/C15_Scanner.svg delete mode 100644 share/icons/database/C16_Mozilla_Firebird.png create mode 100644 share/icons/database/C16_Mozilla_Firebird.svg delete mode 100644 share/icons/database/C17_CDROM_Unmount.png create mode 100644 share/icons/database/C17_CDROM_Unmount.svg delete mode 100644 share/icons/database/C18_Display.png create mode 100644 share/icons/database/C18_Display.svg delete mode 100644 share/icons/database/C19_Mail_Generic.png create mode 100644 share/icons/database/C19_Mail_Generic.svg delete mode 100644 share/icons/database/C20_Misc.png create mode 100644 share/icons/database/C20_Misc.svg delete mode 100644 share/icons/database/C21_KOrganizer.png create mode 100644 share/icons/database/C21_KOrganizer.svg delete mode 100644 share/icons/database/C22_ASCII.png create mode 100644 share/icons/database/C22_ASCII.svg delete mode 100644 share/icons/database/C23_Icons.png create mode 100644 share/icons/database/C23_Icons.svg delete mode 100644 share/icons/database/C24_Connect_Established.png create mode 100644 share/icons/database/C24_Connect_Established.svg delete mode 100644 share/icons/database/C25_Folder_Mail.png create mode 100644 share/icons/database/C25_Folder_Mail.svg delete mode 100644 share/icons/database/C26_FileSave.png create mode 100644 share/icons/database/C26_FileSave.svg delete mode 100644 share/icons/database/C27_NFS_Unmount.png create mode 100644 share/icons/database/C27_NFS_Unmount.svg delete mode 100644 share/icons/database/C28_QuickTime.png create mode 100644 share/icons/database/C28_QuickTime.svg delete mode 100644 share/icons/database/C29_KGPG_Term.png create mode 100644 share/icons/database/C29_KGPG_Term.svg delete mode 100644 share/icons/database/C30_Konsole.png create mode 100644 share/icons/database/C30_Konsole.svg delete mode 100644 share/icons/database/C31_FilePrint.png create mode 100644 share/icons/database/C31_FilePrint.svg delete mode 100644 share/icons/database/C32_FSView.png create mode 100644 share/icons/database/C32_FSView.svg delete mode 100644 share/icons/database/C33_Run.png create mode 100644 share/icons/database/C33_Run.svg delete mode 100644 share/icons/database/C34_Configure.png create mode 100644 share/icons/database/C34_Configure.svg delete mode 100644 share/icons/database/C35_KRFB.png create mode 100644 share/icons/database/C35_KRFB.svg delete mode 100644 share/icons/database/C36_Ark.png create mode 100644 share/icons/database/C36_Ark.svg delete mode 100644 share/icons/database/C37_KPercentage.png create mode 100644 share/icons/database/C37_KPercentage.svg delete mode 100644 share/icons/database/C38_Samba_Unmount.png create mode 100644 share/icons/database/C38_Samba_Unmount.svg delete mode 100644 share/icons/database/C39_History.png create mode 100644 share/icons/database/C39_History.svg delete mode 100644 share/icons/database/C40_Mail_Find.png create mode 100644 share/icons/database/C40_Mail_Find.svg delete mode 100644 share/icons/database/C41_VectorGfx.png create mode 100644 share/icons/database/C41_VectorGfx.svg delete mode 100644 share/icons/database/C42_KCMMemory.png create mode 100644 share/icons/database/C42_KCMMemory.svg delete mode 100644 share/icons/database/C43_EditTrash.png create mode 100644 share/icons/database/C43_EditTrash.svg delete mode 100644 share/icons/database/C44_KNotes.png create mode 100644 share/icons/database/C44_KNotes.svg delete mode 100644 share/icons/database/C45_Cancel.png create mode 100644 share/icons/database/C45_Cancel.svg delete mode 100644 share/icons/database/C46_Help.png create mode 100644 share/icons/database/C46_Help.svg delete mode 100644 share/icons/database/C47_KPackage.png create mode 100644 share/icons/database/C47_KPackage.svg delete mode 100644 share/icons/database/C48_Folder.png create mode 100644 share/icons/database/C48_Folder.svg delete mode 100644 share/icons/database/C49_Folder_Blue_Open.png create mode 100644 share/icons/database/C49_Folder_Blue_Open.svg delete mode 100644 share/icons/database/C50_Folder_Tar.png create mode 100644 share/icons/database/C50_Folder_Tar.svg delete mode 100644 share/icons/database/C51_Decrypted.png create mode 100644 share/icons/database/C51_Decrypted.svg delete mode 100644 share/icons/database/C52_Encrypted.png create mode 100644 share/icons/database/C52_Encrypted.svg delete mode 100644 share/icons/database/C53_Apply.png create mode 100644 share/icons/database/C53_Apply.svg delete mode 100644 share/icons/database/C54_Signature.png create mode 100644 share/icons/database/C54_Signature.svg delete mode 100644 share/icons/database/C55_Thumbnail.png create mode 100644 share/icons/database/C55_Thumbnail.svg delete mode 100644 share/icons/database/C56_KAddressBook.png create mode 100644 share/icons/database/C56_KAddressBook.svg delete mode 100644 share/icons/database/C57_View_Text.png create mode 100644 share/icons/database/C57_View_Text.svg delete mode 100644 share/icons/database/C58_KGPG.png create mode 100644 share/icons/database/C58_KGPG.svg create mode 100644 share/icons/database/C58_KPGP.svg delete mode 100644 share/icons/database/C59_Package_Development.png create mode 100644 share/icons/database/C59_Package_Development.svg delete mode 100644 share/icons/database/C60_KFM_Home.png create mode 100644 share/icons/database/C60_KFM_Home.svg delete mode 100644 share/icons/database/C61_Services.png create mode 100644 share/icons/database/C61_Services.svg delete mode 100644 share/icons/database/C62_Tux.png create mode 100644 share/icons/database/C62_Tux.svg delete mode 100644 share/icons/database/C63_Feather.png create mode 100644 share/icons/database/C63_Feather.svg delete mode 100644 share/icons/database/C64_Apple.png create mode 100644 share/icons/database/C64_Apple.svg delete mode 100644 share/icons/database/C65_W.png create mode 100644 share/icons/database/C65_W.svg delete mode 100644 share/icons/database/C66_Money.png create mode 100644 share/icons/database/C66_Money.svg delete mode 100644 share/icons/database/C67_Certificate.png create mode 100644 share/icons/database/C67_Certificate.svg delete mode 100644 share/icons/database/C68_BlackBerry.png create mode 100644 share/icons/database/C68_BlackBerry.svg create mode 100644 share/icons/minify.sh rename utils/{makeicons.sh => makeappicons.sh} (100%) create mode 100644 utils/makedbicons.sh diff --git a/COPYING b/COPYING index fbca3c12..11f5ee0b 100644 --- a/COPYING +++ b/COPYING @@ -58,82 +58,89 @@ Files: share/icons/application/scalable/apps/keepassxc.svg Copyright: 2016, Lorenzo Stella License: LGPL-2 -Files: share/icons/database/C00_Password.png - share/icons/database/C01_Package_Network.png - share/icons/database/C02_MessageBox_Warning.png - share/icons/database/C03_Server.png - share/icons/database/C04_Klipper.png - share/icons/database/C05_Edu_Languages.png - share/icons/database/C06_KCMDF.png - share/icons/database/C07_Kate.png - share/icons/database/C08_Socket.png - share/icons/database/C09_Identity.png - share/icons/database/C10_Kontact.png - share/icons/database/C11_Camera.png - share/icons/database/C12_IRKickFlash.png - share/icons/database/C13_KGPG_Key3.png - share/icons/database/C14_Laptop_Power.png - share/icons/database/C15_Scanner.png - share/icons/database/C16_Mozilla_Firebird.png - share/icons/database/C17_CDROM_Unmount.png - share/icons/database/C18_Display.png - share/icons/database/C19_Mail_Generic.png - share/icons/database/C20_Misc.png - share/icons/database/C21_KOrganizer.png - share/icons/database/C22_ASCII.png - share/icons/database/C23_Icons.png - share/icons/database/C24_Connect_Established.png - share/icons/database/C25_Folder_Mail.png - share/icons/database/C26_FileSave.png - share/icons/database/C27_NFS_Unmount.png - share/icons/database/C28_QuickTime.png - share/icons/database/C29_KGPG_Term.png - share/icons/database/C30_Konsole.png - share/icons/database/C31_FilePrint.png - share/icons/database/C32_FSView.png - share/icons/database/C33_Run.png - share/icons/database/C34_Configure.png - share/icons/database/C35_KRFB.png - share/icons/database/C36_Ark.png - share/icons/database/C37_KPercentage.png - share/icons/database/C38_Samba_Unmount.png - share/icons/database/C39_History.png - share/icons/database/C40_Mail_Find.png - share/icons/database/C41_VectorGfx.png - share/icons/database/C42_KCMMemory.png - share/icons/database/C43_EditTrash.png - share/icons/database/C44_KNotes.png - share/icons/database/C45_Cancel.png - share/icons/database/C46_Help.png - share/icons/database/C47_KPackage.png - share/icons/database/C48_Folder.png - share/icons/database/C49_Folder_Blue_Open.png - share/icons/database/C50_Folder_Tar.png - share/icons/database/C51_Decrypted.png - share/icons/database/C52_Encrypted.png - share/icons/database/C53_Apply.png - share/icons/database/C54_Signature.png - share/icons/database/C55_Thumbnail.png - share/icons/database/C56_KAddressBook.png - share/icons/database/C57_View_Text.png - share/icons/database/C58_KGPG.png - share/icons/database/C59_Package_Development.png - share/icons/database/C60_KFM_Home.png - share/icons/database/C61_Services.png -Copyright: 2003-2004, David Vignoni -License: LGPL-2.1 -Comment: from Nuvola icon theme +Files: share/icons/database/C00_Password.svg + share/icons/database/C01_Package_Network.svg + share/icons/database/C02_MessageBox_Warning.svg + share/icons/database/C03_Server.svg + share/icons/database/C04_Klipper.svg + share/icons/database/C05_Edu_Languages.svg + share/icons/database/C06_KCMDF.svg + share/icons/database/C08_Socket.svg + share/icons/database/C09_Identity.svg + share/icons/database/C10_Kontact.svg + share/icons/database/C11_Camera.svg + share/icons/database/C12_IRKickFlash.svg + share/icons/database/C13_KGPG_Key3.svg + share/icons/database/C14_Laptop_Power.svg + share/icons/database/C15_Scanner.svg + share/icons/database/C16_Mozilla_Firebird.svg + share/icons/database/C19_Mail_Generic.svg + share/icons/database/C20_Misc.svg + share/icons/database/C21_KOrganizer.svg + share/icons/database/C22_ASCII.svg + share/icons/database/C23_Icons.svg + share/icons/database/C24_Connect_Established.svg + share/icons/database/C25_Folder_Mail.svg + share/icons/database/C28_QuickTime.svg + share/icons/database/C29_KGPG_Term.svg + share/icons/database/C30_Konsole.svg + share/icons/database/C31_FilePrint.svg + share/icons/database/C32_FSView.svg + share/icons/database/C33_Run.svg + share/icons/database/C34_Configure.svg + share/icons/database/C36_Ark.svg + share/icons/database/C39_History.svg + share/icons/database/C40_Mail_Find.svg + share/icons/database/C41_VectorGfx.svg + share/icons/database/C42_KCMMemory.svg + share/icons/database/C43_EditTrash.svg + share/icons/database/C47_KPackage.svg + share/icons/database/C48_Folder.svg + share/icons/database/C49_Folder_Blue_Open.svg + share/icons/database/C50_Folder_Tar.svg + share/icons/database/C55_Thumbnail.svg + share/icons/database/C56_KAddressBook.svg + share/icons/database/C57_View_Text.svg + share/icons/database/C58_KGPG.svg + share/icons/database/C59_Package_Development.svg + share/icons/database/C60_KFM_Home.svg + share/icons/database/C62_Tux.svg + share/icons/database/C63_Feather.svg + share/icons/database/C65_W.svg + share/icons/database/C67_Certificate.svg + share/icons/database/C68_BlackBerry.svg +Copyright: none +License: MIT +Comment: Taken from https://github.com/icons8/flat-color-icons -Files: share/icons/application/scalable/actions/application-exit.svg - share/icons/application/scalable/actions/auto-type.svg - share/icons/application/scalable/actions/chronometer.svg - share/icons/application/scalable/actions/clipboard-text.svg - share/icons/application/scalable/actions/configure.svg - share/icons/application/scalable/actions/database-change-key.svg - share/icons/application/scalable/actions/database-lock.svg - share/icons/application/scalable/actions/dialog-close.svg - share/icons/application/scalable/actions/dialog-ok.svg - share/icons/application/scalable/actions/document-close.svg +Files: share/icons/badges/0_ShareActive.svg + share/icons/badges/1_ShareInactive.svg + share/icons/database/C07_Kate.svg + share/icons/database/C17_CDROM_Unmount.svg + share/icons/database/C18_Display.svg + share/icons/database/C26_FileSave.svg + share/icons/database/C27_NFS_Unmount.svg + share/icons/database/C35_KRFB.svg + share/icons/database/C38_Samba_Unmount.svg + share/icons/database/C44_KNotes.svg + share/icons/database/C51_Decrypted.svg + share/icons/database/C52_Encrypted.svg + share/icons/database/C54_Signature.svg + share/icons/database/C66_Money.svg +Copyright: none +License: CC0 +Comment: Taken from https://github.com/paomedia/small-n-flat + +Files: share/icons/badges/2_Expired.svg + share/icons/database/C37_KPercentage.svg + share/icons/database/C45_Cancel.svg + share/icons/database/C46_Help.svg + share/icons/database/C53_Apply.svg + share/icons/database/C61_Services.svg +Copyright: 2020 KeePassXC Team +License: MIT + +Files: share/icons/application/scalable/actions/document-close.svg share/icons/application/scalable/actions/document-edit.svg share/icons/application/scalable/actions/document-new.svg share/icons/application/scalable/actions/document-open.svg @@ -172,7 +179,6 @@ Files: share/icons/application/scalable/actions/application-exit.svg share/icons/application/scalable/actions/url-copy.svg share/icons/application/scalable/actions/username-copy.svg share/icons/application/scalable/actions/view-history.svg - share/icons/application/scalable/apps/freedesktop.svg share/icons/application/scalable/apps/internet-web-browser.svg share/icons/application/scalable/apps/keepassxc.svg share/icons/application/scalable/apps/keepassxc-dark.svg @@ -191,27 +197,6 @@ Copyright: 2019 Austin Andrews License: SIL OPEN FONT LICENSE Version 1.1 Comment: Taken from Material Design icon set (https://github.com/templarian/MaterialDesign/) -Files: share/icons/database/C62_Tux.png - share/icons/database/C63_Feather.png - share/icons/database/C64_Apple.png - share/icons/database/C67_Certificate.png - share/icons/database/C68_BlackBerry.png -Copyright: Mairin Duffy - Sarah Owens - James Birkett - Dominik Reichl -License: CC0 -Comment: C62_Tux.png from https://openclipart.org/detail/103855 - C63_Feather.png from http://openclipart.org/detail/122017 - C64_Apple.png based on http://openclipart.org/detail/24319 - C67_Certificate.png based on https://openclipart.org/detail/16729 - C68_BlackBerry.png from https://openclipart.org/detail/4465 - -Files: share/icons/database/C65_W.png - share/icons/database/C66_Money.png -Copyright: none -License: public-domain - Files: src/streams/qtiocompressor.* src/streams/QtIOCompressor tests/modeltest.* @@ -237,5 +222,6 @@ Copyright: GPL-2+ Comment: from Freedesktop.org website Files: share/icons/application/scalable/actions/hibp.svg + share/icons/database/C64_Apple.svg Copyright: GPL-2+ Comment: from the Simple Icons repo (https://github.com/simple-icons/simple-icons/) diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt index e07e6f08..0dde0fec 100644 --- a/share/CMakeLists.txt +++ b/share/CMakeLists.txt @@ -39,97 +39,19 @@ install(FILES icons/application/256x256/apps/keepassxc.png DESTINATION ${DATA_IN install(DIRECTORY docs/ DESTINATION ${DATA_INSTALL_DIR}/docs FILES_MATCHING PATTERN "*.pdf") -add_custom_target(icons - # SVG to PNGs for KeePassXC - COMMAND inkscape -z -w 16 -h 16 - icons/application/scalable/apps/keepassxc.svg -e icons/application/16x16/apps/keepassxc.png - COMMAND inkscape -z -w 24 -h 24 - icons/application/scalable/apps/keepassxc.svg -e icons/application/24x24/apps/keepassxc.png - COMMAND inkscape -z -w 32 -h 32 - icons/application/scalable/apps/keepassxc.svg -e icons/application/32x32/apps/keepassxc.png - COMMAND inkscape -z -w 48 -h 48 - icons/application/scalable/apps/keepassxc.svg -e icons/application/48x48/apps/keepassxc.png - COMMAND inkscape -z -w 64 -h 64 - icons/application/scalable/apps/keepassxc.svg -e icons/application/64x64/apps/keepassxc.png - COMMAND inkscape -z -w 128 -h 128 - icons/application/scalable/apps/keepassxc.svg -e icons/application/128x128/apps/keepassxc.png - COMMAND inkscape -z -w 256 -h 256 - icons/application/scalable/apps/keepassxc.svg -e icons/application/256x256/apps/keepassxc.png - # SVG to PNGs for KeePassXC - COMMAND inkscape -z -w 16 -h 16 - icons/application/scalable/apps/keepassxc-dark.svg -e icons/application/16x16/apps/keepassxc-dark.png - COMMAND inkscape -z -w 24 -h 24 - icons/application/scalable/apps/keepassxc-dark.svg -e icons/application/24x24/apps/keepassxc-dark.png - COMMAND inkscape -z -w 32 -h 32 - icons/application/scalable/apps/keepassxc-dark.svg -e icons/application/32x32/apps/keepassxc-dark.png - COMMAND inkscape -z -w 48 -h 48 - icons/application/scalable/apps/keepassxc-dark.svg -e icons/application/48x48/apps/keepassxc-dark.png - COMMAND inkscape -z -w 64 -h 64 - icons/application/scalable/apps/keepassxc-dark.svg -e icons/application/64x64/apps/keepassxc-dark.png - COMMAND inkscape -z -w 128 -h 128 - icons/application/scalable/apps/keepassxc-dark.svg -e icons/application/128x128/apps/keepassxc-dark.png - COMMAND inkscape -z -w 256 -h 256 - icons/application/scalable/apps/keepassxc-dark.svg -e icons/application/256x256/apps/keepassxc-dark.png +add_custom_target(icons) +add_custom_command(TARGET icons + COMMAND bash ./icons/minify.sh + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +if(APPLE) + add_custom_command(TARGET icons + COMMAND png2icns macosx/keepassxc.icns icons/application/256x256/apps/keepassxc.png + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +endif() - # SVG to PNGs for KeePassXC - COMMAND inkscape -z -w 16 -h 16 - icons/application/scalable/apps/keepassxc-locked.svg -e icons/application/16x16/apps/keepassxc-locked.png - COMMAND inkscape -z -w 24 -h 24 - icons/application/scalable/apps/keepassxc-locked.svg -e icons/application/24x24/apps/keepassxc-locked.png - COMMAND inkscape -z -w 32 -h 32 - icons/application/scalable/apps/keepassxc-locked.svg -e icons/application/32x32/apps/keepassxc-locked.png - COMMAND inkscape -z -w 48 -h 48 - icons/application/scalable/apps/keepassxc-locked.svg -e icons/application/48x48/apps/keepassxc-locked.png - COMMAND inkscape -z -w 64 -h 64 - icons/application/scalable/apps/keepassxc-locked.svg -e icons/application/64x64/apps/keepassxc-locked.png - COMMAND inkscape -z -w 128 -h 128 - icons/application/scalable/apps/keepassxc-locked.svg -e icons/application/128x128/apps/keepassxc-locked.png - COMMAND inkscape -z -w 256 -h 256 - icons/application/scalable/apps/keepassxc-locked.svg -e icons/application/256x256/apps/keepassxc-locked.png - - # SVG to PNGs for KeePassXC - COMMAND inkscape -z -w 16 -h 16 - icons/application/scalable/apps/keepassxc-unlocked.svg -e icons/application/16x16/apps/keepassxc-unlocked.png - COMMAND inkscape -z -w 24 -h 24 - icons/application/scalable/apps/keepassxc-unlocked.svg -e icons/application/24x24/apps/keepassxc-unlocked.png - COMMAND inkscape -z -w 32 -h 32 - icons/application/scalable/apps/keepassxc-unlocked.svg -e icons/application/32x32/apps/keepassxc-unlocked.png - COMMAND inkscape -z -w 48 -h 48 - icons/application/scalable/apps/keepassxc-unlocked.svg -e icons/application/48x48/apps/keepassxc-unlocked.png - COMMAND inkscape -z -w 64 -h 64 - icons/application/scalable/apps/keepassxc-unlocked.svg -e icons/application/64x64/apps/keepassxc-unlocked.png - COMMAND inkscape -z -w 128 -h 128 - icons/application/scalable/apps/keepassxc-unlocked.svg -e icons/application/128x128/apps/keepassxc-unlocked.png - COMMAND inkscape -z -w 256 -h 256 - icons/application/scalable/apps/keepassxc-unlocked.svg -e icons/application/256x256/apps/keepassxc-unlocked.png - - # SVG to PNGs for KeePassXC MIME-Type - COMMAND inkscape -z -w 16 -h 16 - icons/application/scalable/mimetypes/application-x-keepassxc.svg -e icons/application/16x16/mimetypes/application-x-keepassxc.png - COMMAND inkscape -z -w 22 -h 22 - icons/application/scalable/mimetypes/application-x-keepassxc.svg -e icons/application/22x22/mimetypes/application-x-keepassxc.png - COMMAND inkscape -z -w 32 -h 32 - icons/application/scalable/mimetypes/application-x-keepassxc.svg -e icons/application/32x32/mimetypes/application-x-keepassxc.png - COMMAND inkscape -z -w 64 -h 64 - icons/application/scalable/mimetypes/application-x-keepassxc.svg -e icons/application/64x64/mimetypes/application-x-keepassxc.png - COMMAND inkscape -z -w 128 -h 128 - icons/application/scalable/mimetypes/application-x-keepassxc.svg -e icons/application/128x128/mimetypes/application-x-keepassxc.png - - # Shrink PNGs using pngcrush - COMMAND bash ./crushpng.sh icons - - # ICNS for MacOS - COMMAND png2icns macosx/keepassxc.icns - icons/application/16x16/apps/keepassxc.png - icons/application/32x32/apps/keepassxc.png - icons/application/48x48/apps/keepassxc.png - icons/application/128x128/apps/keepassxc.png - icons/application/256x256/apps/keepassxc.png - - # ICO for Windows +# ICO for Windows +add_custom_command(TARGET icons COMMAND bash ./windows/create-ico.sh icons/application/scalable/apps/keepassxc.svg windows/keepassxc.ico COMMAND bash ./windows/create-ico.sh icons/application/scalable/mimetypes/application-x-keepassxc.svg windows/keepassxc-kdbx.ico - - VERBATIM WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/share/crushpng.sh b/share/crushpng.sh deleted file mode 100644 index f36176d3..00000000 --- a/share/crushpng.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -if [[ -z $1 ]]; then - echo "You must supply a root folder!" - exit 1 -fi - -find "$1" -iname '*png' -exec pngcrush -ow -brute {} \; \ No newline at end of file diff --git a/share/icons/badges/0_ShareActive.svg b/share/icons/badges/0_ShareActive.svg new file mode 100644 index 00000000..c9232eb6 --- /dev/null +++ b/share/icons/badges/0_ShareActive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/badges/1_ShareInactive.svg b/share/icons/badges/1_ShareInactive.svg new file mode 100644 index 00000000..c458b211 --- /dev/null +++ b/share/icons/badges/1_ShareInactive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/badges/2_Expired.svg b/share/icons/badges/2_Expired.svg new file mode 100644 index 00000000..7adda1bf --- /dev/null +++ b/share/icons/badges/2_Expired.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C00_Password.png b/share/icons/database/C00_Password.png deleted file mode 100644 index 86fa47f04cca136d546fc32256cdc29299331a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)CMmDj$bbG| z%xiWV5vw+BF=aL5yowN~_f_ubzW%{H^VvRsefRxfZ;T0l^I)tIhs_3@FizB7oT063 z-Kp*^O;a}7q0pv6Mmi*fLje92D78f3Sd1aJdPVTd_gBY|A3*Otkxsj!F#)n>){nqs z(;pT`nNc2RT-jW%@qd0OkT1ZlS|w}tD*{i;B|76#pA1o9fB@`^HT~)oGfJY(AvX)O z9=3pN0@*3EsmdBi!uY0J`S>(&Er`x2xyArNizCTVzgUqFjdM#URSz^sgkUb#3h$M}qe;&zw zWZMQ_S*Q$XMI6MMR0~!mTd_LHignW>vB?sN^`=RC+~<@W@qpeAFc63!nMLv_$tt!x z!#G_)GXOod&$Ypk9*=^VaoAy>g5A@s^XrOrJ>KUcdm97}wV6rgkgOnw4$*feiCe-k z2p|&xke?BYt+V2gH^YX)#F+FOMfx89Yk~a_M1JmwBsrJ-u!!tf!*>TF=m^KK8Ysed z@-t$wIV~PrQf#T$ibA@4uLKUXNE~?+LcWb)|K(8LU8~~lWil6x$2&k+j-T0@b~be^%r>y|kD1oYpR>A60RjyW11Am#!hRFFpf \ No newline at end of file diff --git a/share/icons/database/C01_Package_Network.png b/share/icons/database/C01_Package_Network.png deleted file mode 100644 index dceb0a528f3bd9fd717e2ef0dfb0a69d2c5690ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 985 zcmV;~119{5P)`KpO@=Wu zJ}*o3X^Dvs)5K}?VK}m36a_NFrb9s7#()CtN?Tg!?``kr%ZLx2_jBHkfFT4b5(N~c z%;j?rwsr(x?CkdM3I?2(t!&Y_HMg3a{Q1|3=-ky$6`S`rvo%eAW0VIB0UraO^z489 z+dCI7FUj?6PX323Q$|5v{W~L{8@!gY`rkNj(t5UKOwfkne9>X!U}!waCo$ zCOdX$CMV-+NiP_hPa{i;rO0>e2p`32--V;10hh0V z7Uw!YV69diG2JHy~uqKt&K>; z;H}di7D9i0H2_QkK43o%=gBY6o*Oq-5>npC-H}u21v!&ml?#Q4EJ!KyQpz7EqH^!y zfjsd3_6q{M2+@d?MPT#Y1O3MbgHHx3E%h1U@|Y32iJhqy7Jf+>-(37`F&i8I2>9ZE z0Te5;^ap@n;CanfQT~`>*D7_rAoGdHee}=>lr94CZ5iNSgCTwc`odd(00000NkvXX Hu0mjf#l6xf diff --git a/share/icons/database/C01_Package_Network.svg b/share/icons/database/C01_Package_Network.svg new file mode 100644 index 00000000..bc627393 --- /dev/null +++ b/share/icons/database/C01_Package_Network.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C02_MessageBox_Warning.png b/share/icons/database/C02_MessageBox_Warning.png deleted file mode 100644 index 0b8a56f4705234a112ae700359593dcb73d4f598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 805 zcmV+=1KRwFP)CfnnP>L$G3CGg}UjFtMXPb+IsWgn^%G z3{LMo*MX@Jh&CZ~*Kr*Mq-^U}W%j&Js}0Rhj2}AWq@2|4WuU!@4GHKDs2BI`IajRK z!1JKLpP+w$;U6b{k#H>8WVj)L1k19_-*=umoi$vK#axc>gJp1Bc2_ECCuRQ@fh)UO zBp?jHSap|BD^JyCi$7PPFu~E5;a%RNKq$OS z=2{EH%31;mGo?y!BKNJqQe~1j-wQysTBTmEcPsX9r+wiPv|5b$?u>*}As`gkZZ>;m z)EAjJ+lM-TnK+6`v?eGP87!Acv?h#Wdd{3hj_snj(spvL^G682kZ`axR6OgqzOZm| zmR5O;j?yS0_~+q6?%uyoECdmtiaSVOyabVC#I}wnaLn?1^EZckOe>mSB>LPWdHMtr zO*@_8%2W-dG>w1fSm|`=2$SVTg9QaYXicAOUpM9^M%w#Fx24-3KO)1JC^3npCW;k~ z>mem9EG{7xNUf1!M1(;`n7r1yV>KJi7tf`dQ6i&c6rti6sST78$p4mzRf5tQr4y7^ jC}EOdAeAyd#Pa3;FJvUr^d${&00000NkvXXu0mjfb9HN~ diff --git a/share/icons/database/C02_MessageBox_Warning.svg b/share/icons/database/C02_MessageBox_Warning.svg new file mode 100644 index 00000000..f982f76e --- /dev/null +++ b/share/icons/database/C02_MessageBox_Warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C03_Server.png b/share/icons/database/C03_Server.png deleted file mode 100644 index 00ed933167fc0ca708d00d7ce76c445d38dc9db3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 zcmV+_1J(SAP);4DA2?Nl3I{NW74EPHbxifjs-#g02gRn_=pV)U67E7 z31Sczgs^jg@zJospftfmrPM%x>9hkabf%q7XS_3!M8n+V&fMJj&hMP_-8-bN>u@ka zp%8lNpeQ9^n2K7z-+#ZqzyGSk!I3K~-&0##{6-?Nwit_jd@4!#-$o1x{|rsjK$a!W z>-9b8?d`i2iCn6zudfFT!ypp5=oiJje{yoVdto6)Bl*A~fX!wb3Y{09h!!%v2W?$~lU8PaJH3IzpnxjYC$7D}Zu)YMc1 zO;d(cwFKDh94-jEC<6wKjYnZ==_jnO3&3$K`o@}XnkGTlF|Y)b%Vmhi6NV4a-Q8|x zv)e0BYb@Y61|&%s<)bxN127B+m&*>ST0(snP4j5l=ovQyDT*{FQd$FWoP2w%i+!7$mMrPv<&`6}CW7W+njLC7F2}>puP%IV;mH>1OFj3q` zkUUhN{#E3>;e*TNM#s1T(dZ*>W@aiT%ljjifOJ|YmK2HcRJ%dJBp~*2kVF~g=ikBj z_~=G5`QssyjiQP)OF%UG_{OV=7XzJvu0Ut-R8`BdE^7Hp9LB~*mNOaQoX6uyx!sk( z^C@c+dwNdK?(OAf`Rz@ZcpkrUd&oQ0+*n7EjBPa->P \ No newline at end of file diff --git a/share/icons/database/C04_Klipper.png b/share/icons/database/C04_Klipper.png deleted file mode 100644 index a451fe1d25a02a1cd0b98f8ec08958a35aa2464d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823 zcmV-71IYY|P)(L_t(I zjir-KXcKt=#eXxI`OhScNmsYJr6pD^SaGFRTm=_A2!aO%5%lCu5ZuL+dK31x3xb|R zSw!5!t`|M}aak2B2;xUosundhwV7y}HtBriV`h^7--8&`iwEEN@p$jSPg6?qJu(11 z&qGT2O|#I@Yz+}eLUf%>CWEGwV)MYj>g~Cue-4eTA52<8*p?x(wkd33h@@qRZrcz- z7(!SH!!$Lnpa1*vkr#4rp-}kP;IDOD+ID>3IyM{xUC?SPrsg8TSQ51qPD>HCBy0Oq zWV;e-$Pi2*ysAgcLY&_glUmol%%gGP3rA9_xJB&{NH~tQr$nU z)cCpcfm6f5o7qTI1Z_96rv*a6KJ2$|!`*b{cA zO@3M;`Z^7Ka6G>WjTw+FOd2$uN5rwD7C{h!A3|<0%^hbIaVS}~*zEs2py<^#sJ(@S zarDL{zvhbEyZef26RJ&^Z@^p~s#Js74^jq05VbqFc}F0J{jawkBAj4Ud1?RJT| z-V-#eG=2nb2vS+dHAfl!KYIE5rvQL!_rn|A%P02)ai#urV*csaL}l#pYj3P{Gag#M z^U!bA(p15Hm(Q1{U*~5^Z}Pcbbr1N+!Y7z4uwsZMd_|T9d`YeTIZWT94_047!{+;- zuK)l58FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?002ovPDHLkV1fnb Ba8v*Q diff --git a/share/icons/database/C04_Klipper.svg b/share/icons/database/C04_Klipper.svg new file mode 100644 index 00000000..88ac1c50 --- /dev/null +++ b/share/icons/database/C04_Klipper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C05_Edu_Languages.png b/share/icons/database/C05_Edu_Languages.png deleted file mode 100644 index d36534f597dba99e04b6431f39727d18a8724ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 919 zcmV;I18Dq-P)^@R5%fB z!EH>`bpXKe@BiuUxI2W?BZRgJLIiud5jt{gSYwoy!=lXw%QcJsyMMb`_)mrOS zZ+fGv<{GQ9S`9_ZnG+?IM@g}RO_(VhcW~VO@9zKnYchMo_3|E;Kc=i{y;TYC<^7L`JPC!y8vse9tsCnYB*dWYUnJA0*B6@Kh*Fbi%1jDlS%fQ)tGh;sn^~Aqv$MwYA%+)C?bNx%;qWbH|IPQvduBNKGGgPxz z4nN$Cruw)SA7gp=H>Rd0W|yYNI+sK~1<@3kK-S^`_3PYSSm44#61Nmd1bAdmw*?o)VNj<&zrapt+b2PzGgS^n+|QUfQs-sqw2YG-qK zeeJ~H=p`I63wb~ROu%E+V{g}fbN==zp$lEyaFZhb*+(M&-n(MZ9urBiASN@zVn@f0 zTR@Oi5+LzErS+|r<1I~3hlJy@NeK{$HR9XVOocy+VXlzZk|YX?k*ocqH-sl9Swk%? z_eB=XIkH}kkTHkm4q&yzp+K>+ tMb_jHAbE~(P2F7)x-kge31EqJ{0E`aeqv`arAz<-002ovPDHLkV1nC+v#$UE diff --git a/share/icons/database/C05_Edu_Languages.svg b/share/icons/database/C05_Edu_Languages.svg new file mode 100644 index 00000000..bf1ff082 --- /dev/null +++ b/share/icons/database/C05_Edu_Languages.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C06_KCMDF.png b/share/icons/database/C06_KCMDF.png deleted file mode 100644 index 331895758306b94d8f05a577f6643e3547f07c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)&S+Vw}gAcDA##YO z$e|aa5r}*tt?hu?21uDeV!Vq_^G&>3FG_*Xbv(ksk?_#*(}fSb@Vp&1-N9%zIjRjo z!(Ldr6O6aEMq;3o(Cf>5>@(1XM%RGib|(xDLQX;uYQkC7Ow)an#lUTm4-5ew7!xRV z- \ No newline at end of file diff --git a/share/icons/database/C07_Kate.png b/share/icons/database/C07_Kate.png deleted file mode 100644 index 8427b9054472c3ceded439f1ac77c9aca4c6f42e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 zcmV;P17ZA$P)MbpXKe@9+2gp68zX^Qfuw{4-hpspTpcm^s3tvNwYWp%-(|s8PMy=uN9PgCJzY zY7`ZT1fw7ZS!_{IL{Qs{MQIIY4Nngfr>S@9oqFfpdC%Q*&o4)NQLp=agw~q>Lj*%_ z&G+?n?Cb1o(NdSSDK)03Xwwh~?dzbaL@K$wbK$Fzx67rfGkfft94=0i1bzopU9{ZV z+#M4A{cYmTmMDQBSSEx*5VFAz!X06pflm$$zy8Mgp2fuUkpP?s8|*7pIHig?ciT1W znx&m365}b_TRR9wY=nlO4M7`f>)@#u4vOl=(}SZYf17{$cweKFoRoi@k7F1#JrnJC ztfl9XJ=oPQ>6HyE&&Cc|_#SvAD0zZEXG&DAeaLgq7o7HEL!!#8VR3xoZsittu4mV` zdXZf?PJuvsiR9cA$z>BfkAPE!&T8!V2Mi2lX&$J8)suX4^3>@wcgK;1KB7I-s>D2exwS?#9!Lnd}c9ue3b8W#v9sP_WZ@x!w zXAKWMaF6LY4gLJrqrf5A+jDmH;?JIr=e3S+6!l`Rq?dAKo$<7GeXWb0)^iJK-QE50 zWp)Xn5JI6~8z}pUmFdOgRIZ_zuf~)XS_=#b6(0m345(7IG&ObI6`P*4B9WRByOfkZ zx1_e_e)#Uvmk&Bl9fqL@*g*n;AOYJ(DHGE)u`G|J<-a7_ldhZR7NOMr{G(D+@zZAv zsoSJ5w2%@Zq%fouyAaY)zVE3*VdYz`%kOa8-xn}p5G6y!5dZ)H07*qoM6N<$g7?0( AlK=n! diff --git a/share/icons/database/C07_Kate.svg b/share/icons/database/C07_Kate.svg new file mode 100644 index 00000000..694fd7e4 --- /dev/null +++ b/share/icons/database/C07_Kate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C08_Socket.png b/share/icons/database/C08_Socket.png deleted file mode 100644 index 6baa733350595d2676ee8ddcfb5eeccaedbbd4d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmV<610Vc}P)% zV$dI|u=e`55`_(j5fpR+m2gKO@B!`Cn!>3;v!_KDP> zKP}QZA%qYjCxqA(LX1U(IMZ=Ywb!2P2HEl;(DXg#qrbfO)|Y|Y*orDb@lCOu$cp84 zRg5g8#qfMu%tkWepM(%?U2$QreWf2z{>x>JzToh_{pD?sc}=oOR*@wQRaOzxQu^(3U~eS6QFeiNc+wVEZa*c@p!%Xc9?M)1UG;0Wprc|bD@cBPOunB zFcXXs2rN=i>|oDMj~M#;+}Ui>|FLY+Q#5?@2H#z}MDMLBMk0a@Yc)yZcKRpQ_@-x) zzQG`Yq(Ws~3&(vGlvxxBqs<2(=T%kYg_h7v;Xz7bh|<1VKWMP>#3@PEvHL7kGKquO6~riKjO9f*Cm&`2EA5` z-dPSND}DYcT5tV%cRG`4+5(UupM-1zi0aWfpF%Nslw8{STzcun6J}FYnW95T5_bv< zxeyLdPbQNu1O5L4Qd`eODJb4SHa-g?2jFnRJ2p6&2H6k8DtrP=0{jcD*oUrGl(`T9 O0000 \ No newline at end of file diff --git a/share/icons/database/C09_Identity.png b/share/icons/database/C09_Identity.png deleted file mode 100644 index 0bf21df9173fa4c259112f662f6b6f21040c9629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)w&vn@qh~!0JdQlVGjI7@@7$%GlU2br-y;J5K~ctqhfA zZ08V|W~%GcSp9>0_pgI@h$uur1dK5tLZjg^-bK8ND4RvOZC2mCpi-%jH(OMwvamRZ zCM8KM#u${+6bdn0m!|!TbWJ>FtCq)wh%pMKG+Jx4R%j)7=SWkJ2|luS z;Fw)c=sgR)ZLRbc3v9Lrre^|fsl=J%o+ufT#GsU-Sj^L$vxgRZ2-K>MxlPSl0Y(=$ zXr7tl^^)UTIm7Ml9 z03u{EhJ)Q5f^%9%CZ5fo?m5=0MWR;VqYyakJcuU6;-df%|4kYMVwA5d^`G+J-}o0q W \ No newline at end of file diff --git a/share/icons/database/C10_Kontact.png b/share/icons/database/C10_Kontact.png deleted file mode 100644 index 08d441315af9a8247cc482584c8ad2ab86326439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902 zcmV;119|+3P)DobpXKe@BMn$YrA&sirwZqvbZ@22$?9$jAOE43@9WcxGuIdgJo&Zff5ExePO(gEoXispD=sj}eyZ-AoMWM(9;hHge zZhgzYORFfZj_qjV3=`9^K)Q6c?@&u(4F|YK#GB5(cDU!uxhpH<%&XUEtJ+R!x!^>) zn^TiNGoGHpl|C#-Vp$ejH%4iBu45+<?m+o9FTs*-ToCdIRVp!Vp7Tki*1F%9xn^3+?uU z;PbL-LCzH{n-1HW>XrJf&%6Q%ar?5_{ZZHPV}0}AqvOXED|Ix4HW8~1VF-s#LxLibQ!8>t&t`jrp*-r~T=UvVm# \ No newline at end of file diff --git a/share/icons/database/C11_Camera.png b/share/icons/database/C11_Camera.png deleted file mode 100644 index e502227d009920950d735858bfdd9747ec76c9fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 754 zcmV9}Rr^wuigr37 z1T>Xl*ZPS!Umf)NZESyekJ&rZ7@ZtL%jf7s2C+&akua`{;n0l+0|&Ij^E`whL-Uu7 zh51`}Py=pWE5WwA$Ye&q_z=!<9ky%0;u`$G^EhKc zDp@}KHwtnlIOk9l6+z%bs4CXi-(qcz06u<*dxF4&s&ZoBQ9qLa?7v*YFrtf4(u<>; zoxP3wb5)dQrs22_f%CWrP-5xgoPskS+_+KDWr&4G4>4b>k%1ACMk)q&9AYPQ$@vsO zQkNBm0nyXZ?b-w~K%p>>Y&HYmbEs8DtirM^N{mC(jF>4W!&o| \ No newline at end of file diff --git a/share/icons/database/C12_IRKickFlash.png b/share/icons/database/C12_IRKickFlash.png deleted file mode 100644 index 4041042d3f81b8e07f5f1e5427b253998d03931b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmV;n14;aeP)>1333mj*t_FA~?aR6~7Lp z6&Hk1Np}xT;l&sSr9NkUeR)x> z&LbX(N+s-JXlMi1H(5U4mvRu}hoXZ5O1(}vpV5lNIZ-ObT7Un9D3^0u5CDQ`<+7#u z{y2VPUMl^Ra#1sOP=L}rq4a&`y0bh8PVgf~7#|v1)&>Uyqf~lTFBV@BK@ez_%5s|1 z3WZVRUL}mp03rFbz`MLqXyA^+nCS3ganrEvcMQY0frURxq3ik$;W%&eqema69CR|w z2L>9cmZF{4sBN!P%kt3v--czKv2(c(uHU&cf91=s^~;wo>A%!!^B9{ka=9~j%qGp{ zT;#8#c8rp2b{iKyqQwm34c#=q{r=Zmk8dy6&YmnfYh(X**KRH?o&8~9;ju8yD^%A{ zqx}}z_d$q|QXzJzrX}3AcbI7!&jHr{s@1%=1UomPD=cUZ-7JK5W-a4Ekq zGZ{efiI)HhMTCj-jA;VHT)ewmQBl;E-R?1T@F&HNey5}yeco=jh?KwWKY9c|&(4Cy zx&N~3@-iV@N2}N8=HTh(CXggql-t`|xZ!B3O@E{gNO?iF+ZEMn-Q8$5)k3`vS;y%g zsaBzijlu%`D=RCIgrSPJw(iErMa{)jd-#}^@jM^1cAH(jb`3VMzd6?(aU2JZD+M0F zNC#spi;F \ No newline at end of file diff --git a/share/icons/database/C13_KGPG_Key3.png b/share/icons/database/C13_KGPG_Key3.png deleted file mode 100644 index db6aa8ec7a14dab7d92842e94711f44d40c77e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmV-51Iqk~P)*gkyKjn#DS%T1g!tG5(2mXo2iRU=&+ znK~QJq1(*aT;^ux?4n{U>p}__b)jTn1(oo0-htM3>w*7)!*ibB`Tx&32msJl6rM^; zg@}lYJ1Eagy{_lw&3kn0)d%wY`PxG%H;NHL+$iy|E+7;M=*ZpG^SFayv^Zet(Z()EMxwizr#PVkJJ zfz?1dti7ef_h1IBy`jU;;C}dI-v_EA+pU`bHoH1qE^K&pnbd&U>;Q+u4bHKrFl3tn z|4;_3zeKQNMexmmVDS!uFD3*nbXxZ&pslUzgViXtDpQZD`Y; zBgCmpR&^wR$rQvX6xXbSgCj6GIRh@&Gwj9%B2lBSrKRI_f4>F1-Z?BkbavhgvDm`2 zXaHids&^=r%|5;UK6c`Psi|3LZ`XQ?i_dQp3YD6sruOHfqvIGp1yxn`a&8e34G5(co@LJES) z%EYHtD$Vcd=@+2Yc7Mizodh8Y*YT56b%g$pkd{VA<>gZRp+r=autcJIyTR}fTlRoV zcBKnDh@l!c6ak<{PR{W#fD&~IhQvyx%J)v^1T;6RgLqBbXs)P`A{vbr37|$+)-hCA zNQ42DT@FVoX>4p=kjcni%GE}5K|x8RgRST \ No newline at end of file diff --git a/share/icons/database/C14_Laptop_Power.png b/share/icons/database/C14_Laptop_Power.png deleted file mode 100644 index 8cd59f809cfbeac06760111b658cfca3fd468eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 816 zcmV-01JC@4P)MLO(JEC5`n zZ-%O>D0I2*mmRv?!RReIgE_gS$noT+6pOB|hJQpNk#S8^$3!tUE6ZD%L?Vtr;Oh>6 z5CTGom0|V1w6>DYz{uJycBji#lq=*^mDsYZCsl0|fj}TSG&KBnYHG5F5V8OOgi?z7 z`ep!>;W#dz(zK4}O;k}dE-ogrtXAG#Sm^eZdR)H7#s-h7QqtZ1#6L3fp&=NYj_Cj( zwJjl)N@~_DQz*4XLyF21jaqmeW8qRVv#>0t`+9r(TOW3I&gbVl(9&|Xn&Y^$yBScL z0nMmHmQxK?$GkU7$||Y_M_!IW&tY3u5sz=FMa7<(cx*`+8=pa3T!pI2hJS!e#$e){ z-L*B%cYSrI+1xx6vaPQ^8~wFwp}Bl};CYST@@{~lYdFUrxBqe9&pdWstbLEr z^mi;JU%^&Rz>q9_9{q-iiI++^>~F_T0~99?7(d=9B?+_6)&=mDcWNL>J)m!zK)tzn z6Gx8UUT$f9P21WAsn>gDL(k&6L$HHVx&r{XeSo2Y5CcmHDQGIk?^|9(^@Owo+ \ No newline at end of file diff --git a/share/icons/database/C15_Scanner.png b/share/icons/database/C15_Scanner.png deleted file mode 100644 index 43f52ae8b8260211e8d65af61ceda4f210116465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 955 zcmV;s14R6ZP)G!q9FT1#u!Vz&bA`RIAiUz=dU#e5#t+1Y~< z&N(V7+;28FKl>5qMLn5JuPiLY?=CGBGNx($9f{0LUA*}H2Zo`VScA2;cA-QN1Y|OQ z`TYJpKlbz-*{JI}ibWHus=+ilrlx*FSJ&%bMx!&YVGV&X2F4g{HW7wl+&Fr4;Kh-V zQDbFA!{Xu{sH%>V`uZmj2)xnZaJXK^8Up7g1i=PbwnI@A7=|7^c5Lw7$;n?yRZXPR zcaTVAu&|IqQiMnO+Ys^G&VF{d9}TLr!0vu zOb*jxC@XU#6#AKlhCY5fo4wu7y1S2qF@jwd;da_F^G6&GhX_e1dhMe1Rb}nIT{@Ss z&X$8B8IUEwtPdbBhHY}#H zu;-WHk4%3s|LV25f>5c)Fo(zP_dX@VsZAGg#OFO|&381l;8| zT%9Atvl4di^rE)*VaRsJg97IkblqrtXlvE=#%BNLzWuG0nN1$30^n9GD2fOsiO`AR zg{Ry&{n-vYUaR1X;bAKpoxOyCfp5k`SHniyDAF7eg;b)^7*XFZM4b~v&yA?G`~4(+ z_}v^CYJqMi6V%q$p))4*1CS98$Ec*pEm|%TB?}f^S}4-sHIq6fi1vT2()i^x5pnwc z=1tnW_xT)vPWrBT!7Ef#r5co9G{+!kf!QHWD!{gm5hy@rOlf?*8x=HUaG3LLXu=xMa6xu)Ya`7 zKXmAD`pnr2JQhpP;NY<3be5k3umShR;PpNNm#Z8ePc_!B--LhN?{bwN+_vq}3A^3# dDF6}w;~#f_w~SK&3z`4`002ovPDHLkV1g(ty7d46 diff --git a/share/icons/database/C15_Scanner.svg b/share/icons/database/C15_Scanner.svg new file mode 100644 index 00000000..8d0f7c2f --- /dev/null +++ b/share/icons/database/C15_Scanner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C16_Mozilla_Firebird.png b/share/icons/database/C16_Mozilla_Firebird.png deleted file mode 100644 index 7f592c673f0e0a9ee55115226fb7a1eb58eaba02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmV->1BCpEP)Hj`ixP9*jCxI$JLqsT5+ZB50#1Fd6tP~}h6iIKGGQE(K&`es!!fBa~ z8S>VcAvO2E*bi*6P{P(RdS~MfcTbhuhJRs{E#Dm@V?Zpi%9^o8I%^QUo@65xp}zf* z12(6>Q=>$+&wj{aSGLRPGTI}9*!~#iR6K~TdALObJ!5bsvc#96NtA1=s%`E#q*21- zwzq|+C-F!Mr#XpZuD~zR(~K;)kkePlWY#E{3Rk5Mx7$I5w|S>V2~{kVFN7CqlTlo) z7I5Fo^UdodwZn{l_%;^1lgf%3T6RB9m7_rB+FY3u5oEA=qL@yXPbcaE1<5)Ct|T?t zAg1o4=ounbx1Hqm6uGQHO{0U?qpy(iwvd|odRb%B3w^P{^K`50h@m@nb_5iK37A{9pVYIyGxyQ|}jv-sj%co;qz^`n8xjiV!V3T&6Bk9dw3{zIU01Z~wuN1I0 zW%0IU$y=fS#Cg5%)x$#@nZ*&{ni3I|QvAcX5bV^?UHaVllQ6Nzoto2B{D>vjsE_3M zxZ?r+*qf^t)|0=DgIopXfhZ!v4f&~E1BqUny!NbjO4HQKz|+q>S@~Y#BUf%_pe(Bt zM}Z))4R8ZiM1&j0KG{CBf1i5**bnRmb^_b(+TlDhbkaZPa#*{82EfjL{s!6wYGi^I RUJU>M002ovPDHLkV1n<=tPKDF diff --git a/share/icons/database/C16_Mozilla_Firebird.svg b/share/icons/database/C16_Mozilla_Firebird.svg new file mode 100644 index 00000000..c05515be --- /dev/null +++ b/share/icons/database/C16_Mozilla_Firebird.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C17_CDROM_Unmount.png b/share/icons/database/C17_CDROM_Unmount.png deleted file mode 100644 index 9471903746faf5e752e8a61614409b8fcb4705bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmV;J184k+P)M$pVWAb@ljuxiBD!R8htX} zqCRNiri=0R=))3>I!4pY45M3IoTfk#LI;$xQu09aVb_}SFqp^hsT-h8B^r+W{ZC8&AO zP@px`Lof=05NsPJCOSl^+%s}LcOx)nBP*L*BIlocW~e)JU=PJ2_&z8Ffe#x+sO^Ff z5QeZ_hUHZ_cH&VvGJ5t^kQq5Jn0kC-B16@KP=k=Lb02Qsgw+N3`xY!Of>KbbKz%rmIXVzU|XPA;kg&y^|QIG?(Bs15@-tqpcO=0T%3s8D(j)vLV{(1F<^jd z4O~0PD=(jkj0_Kmtu1hyKo|f(K%=41N+JI%6u0X>gaMT9fg_;zAnaB%Ja*~{*<_Cj zUkKvupcDuJLcm6`gjd_#klDGJ+#fe9)P0CGL8cvshT-55NjVU>ost6&3It#bI1%t_ zFrU4q!}{9K^56XY2S0o_8+NAPfnJaj0v~W7-3M)H08k1n2`w?0pUab*{dy6??=7t= zOAGlzD&0ADY!a4Y5{mTyUe%2w`p}&wFoO2=3hZ{2eeK0SGDMfQ{BQ9B1sc@$sqi z$4{J2^&RRK$@VC|-(Yp6ME2@6b@iujmbNRuy#ag$03f7{12!Oty8YC=+g;G|R3edn uI1-5_RYRF-bz?oOulx$?TVN9a0N{WBgl>R|sf#}V0000 \ No newline at end of file diff --git a/share/icons/database/C18_Display.png b/share/icons/database/C18_Display.png deleted file mode 100644 index 5348b7db2539220fd763c9a79510042e7c0ee770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmV?P)B_y*LeN++jPlO|~b zF)|p8Bb%%ZRwLnEe_m;Keou;7X)`d)nPT4ao@ZV;I5_zDXltuWatewn^EJDu{I5na zrXs2}zdU>Pw|%truy0z6=J%KHvGoFif1^#|a-4=M?Y3J0+x2$Ed`-fOioQK)}v$5d-)z zw_bL67$P`VMhO|B2PsgnI-?t}AC<1ff#PO7oKt)NpTGw}5L9OlM1+*)(EQAW_ht4g zA?Fo8gKA9qC0qInF%?K5DDirXJQs0Ac;XFD1P?xDg1>@WoTLbosZw3Op|+1v1e>YM&eI>bfA<}# znG$E^^5TNe&1V+t1v+2d#9E7z(X1@r_>ql`4PyMYs>b8-_WAjFcd=#6&6OoY6Yb?C zdfhep-Bs3BZ_!>^X642b7ncpg;U_)}K5+Q_c{)5iJdt+0T{lhhq^|4lf$w&9c7ER7 z-CZ@tkWxZK5D|vMA$xm!rzdYuesfbdNGZJrUeN3Hfbx}_o169i{{ETwUPq&mjz%LL z4u{$_jW$iA+uPg!7WVUXoy2~>Pp8xA9336KJ3c \ No newline at end of file diff --git a/share/icons/database/C19_Mail_Generic.png b/share/icons/database/C19_Mail_Generic.png deleted file mode 100644 index ca7812aebd6408a2cb901da6ea926337100f7a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971 zcmV;+12p`JP)*D3TdrL>m=A=xcaif>Xv_(EXuP87uS^fc$GOdk~(HJa);b|ER&q(3nR)vRKwQbuG z#mATAUcK7y0;sR=cBiHu=<@T6Pm{K2ga2#)57@r_=)ZvC;Ns%n$9YT(f4ljqy33uA zP}t!gkg{Xlx~=jxMapOl`412oc}!tpR%K>Z){KtMva|qWPH+r?a~P%{fMXcGFT3T6 zi_LHHTc4ER>1me1@T?35^Xh~6_>zp8D>m2E1L*GqTMzWzg}b+*tp#peeMsGvNlH%* z5*vSdNwQ>0MtOKVAw|4uea>pVHgVqpU7gT!(?xylJm-EG;oEQ8*}uPzjCZR@Oemx1 z>o!Wu@3Y=7qFIlWm398tpR4Uul-Vgd+)Ca@wWOzCAT_mul$0~1z5OF^rk*3epoy^w z7kzfv^uh;!N!l!VNQb_>zHsWajXmj?NZL_O^3JpDd8dl(oXhOXt0O13o{tM#=^j`B zV0Io-c9*-Pwb_!SjQ1*r9L^O+Mwh8+aB!@oozD(7Qt;_b@;|x7fiF7fvCROmxCm}H z94T%`+EgV;+PXEXvaxBJlO?%1IF9@w1FKMI`#(9pch*$YGL+Fg#pGw70hePi@|NXFrc^8;M(gN80> z8GsHuwDm$=;~d|e>E^?{i$p~qd>9mzJif+z(+$b@sHB%vT`ci(NXz}7IW;dhsVY`Y0X!X5+nsk21#C$B$-Sv%Eu>Ep`mHjQIY#*LV}|Q t*LVm0B6$}`dRfv_t4l9Q-mCSo{tp$rJtXG3d|m(m002ovPDHLkV1g&l(U<@L diff --git a/share/icons/database/C19_Mail_Generic.svg b/share/icons/database/C19_Mail_Generic.svg new file mode 100644 index 00000000..e0f27b12 --- /dev/null +++ b/share/icons/database/C19_Mail_Generic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C20_Misc.png b/share/icons/database/C20_Misc.png deleted file mode 100644 index f428e4f0d0af95444864d412827f75a8deb7633f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 914 zcmV;D18w|?P)cmacd75rMz2D5rZhPRp`1p8!@AEz%9|OStXIOT25xai9 zniUt{V^S$M_fJTrbqB=aDppqZu=vT7HmgFRQWX^3iD#tT++voOcZ*%VEM*rjUSVXu z?FAGS-Q87H_4Gk!rwJ<62P*;6o0{6jR#pI)%Z;2INe2fI3MEV|uJi)3vc$|w;{den znO19t#{*0f{|q%C}B~!Gfu&1x!!7(BE%E zM~4~R-Gdk&wyy(?jQqfvGwE&HxBG8o`T6p?_V&-Tc^)>~3??TR$k>OB3~?`?fBuz3 zBDbm4U38NDH=v^8fs?Tf`@_QzGbWQYSXx?)FdD6}S{)Q~5p{Jc7xlG|ttybu7c^@$ zeH4E+#-~sE<>chFdqUy0qtrq9ccrooFJ5$_xA!~7$DL?t=|pJg!PuA>KI66|B%Ix< zP&7K1{&Y$OdytZnp=CZkyr9U);{{6PJAC;v3X8=~H&5ZwqnA^cE{U=Q0^zaD%&U^t zR^5`@4N3txoi1+=(Kw2}zA=J*L}_UaxD$0c3rb29EB^jF5`P0yQ#07# ziiwG%A1426bMr^2)!m4SihZ|b%jSrrq;pytqpz>;@pXo{xTJN@@$rew&(H7B?%jJb oj~qE#%j5APe!cRg*~$LVPrCbSIOj@AQ~&?~07*qoM6N<$g17av5&!@I diff --git a/share/icons/database/C20_Misc.svg b/share/icons/database/C20_Misc.svg new file mode 100644 index 00000000..bf4a4219 --- /dev/null +++ b/share/icons/database/C20_Misc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C21_KOrganizer.png b/share/icons/database/C21_KOrganizer.png deleted file mode 100644 index e66e4aca8687ed122dfe56cc4ffb7c910919af53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 930 zcmV;T16}-yP)l`CCcK!AUYySJOVB*TLMcw;s;$8kHokv*}nK?ip#QT zVrDSJ%q#L?M#VGPFf6E8r$ay}#~2h!OQCeo^=^54y?r!siSx6+pO8}We+X_;ap1wa z=BIad-`h~zI5;}uTs-o9_m8Dn#b6Kyhc|h#(Zei|1td3!p>jiO;qJOu<(87t9!o*x z)ZVmNZ&nCpVnoj`@Lu^V6qQ>k?E50{)|syloe41jZ16scNQqjU9o3$dbNB6&K#e$(*U)II7%F*r>+j4wpbKkb zr({?En2b233@&En^!%cnpI?=Ilb7W3dPF8-QU+Bi&vkX@?rGnA@v!%i^nI^YTt%=? z8Jp316}yd6y^lX5F+?JRwX_V&HVfyko#V9qD9irqjLiSRRMVVz;p4Ve+sQ@e$SKze zBvEBNN{@G7G}E-z&D6D3G$0mGNopGVw;jY-pz^`OaYnRHs45F#>oqX@p??qv11riq zIfgF}`^T;6Y2slwKAl3`4^b^cO>qM{e+|3p1o;IU{QQlMV-LMc`{C2A2$2AS3XmCH z;>+Buox6-qCW3LatU`Q4py_qg7wzY(0XxHed34>@l8cd=pD$Imw*FWQ0A;wgVQ0zg>W(L0j;b z;#*wk!sDzdf_OMbA|ps>f+yPAxvkPlo)Hv-i64gMIC;=eU9*X&6#kK&@yO2-4mXYF zDJEP#OvNU0Nd;93COujDM}2(T{~Hs-pR&i;%dXZ2nk~l11UEE+x$}ARmFA=Sw!ifG z0cz{&3HV)@^1M`-7O3CsWT#<;{M2;_#F_pz%%eTQ9>KqKoja7X$1k-U8oF{Ts}2v< z`62Ytm|S(Ms@;)}O)O~vho5zC0-s-FIRztvn^eKwEw#F{2BR#T^yJoDA-sVsz7+TX zKM(;_APJ~IMDSmFU^`F-7=aX^0xF;aDIg7GfGm*y3)G;8e{o*jN&o-=07*qoM6N<$ Ef_Un;5C8xG diff --git a/share/icons/database/C21_KOrganizer.svg b/share/icons/database/C21_KOrganizer.svg new file mode 100644 index 00000000..a090bb54 --- /dev/null +++ b/share/icons/database/C21_KOrganizer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C22_ASCII.png b/share/icons/database/C22_ASCII.png deleted file mode 100644 index dcdfbed307a0aff753a55470211ddf6f276b95b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)_CKU!rDsg1QAkepT@?pAoNk5`Yi00v;sdVIM#dplnoJs$=DRm7!3o9)NfGvQ8DL{)L;vlDAIgD3!MU}F*O z45EmNii(%+`KcyUQB_scg@+b3cL*w~qK5e8z71wkMO9S5sRu6AtO_csqAC`PU`AC{ zR8_3RH_uEpi=e71YNrnDxl*&LsH&6tLF$`}*qqKe<|=>{=|7XaE2J07*qoM6N<$ Eg0@MR82|tP diff --git a/share/icons/database/C22_ASCII.svg b/share/icons/database/C22_ASCII.svg new file mode 100644 index 00000000..2c4e5a49 --- /dev/null +++ b/share/icons/database/C22_ASCII.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C23_Icons.png b/share/icons/database/C23_Icons.png deleted file mode 100644 index 0fcc98bd68349b6aaab69e694c4633bb1e26db50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623 zcmV-#0+9WQP)L zlf7duW+-+YJ5aLH(QGki_RQHCqpJMRF13Q4m!S zP(T!nK}Bq}_vQU}_u$da;Q5QkracTyQjM=62y_8r0-qp8h*FS%3PONaPxr34ZZ=nr zPt5({jL*9rzvtJ03Li5$lmej?2nno#RzOlGE~({sGGo6x)g?ZBvmAsW##A|3a&jmt&J>mC6R3jilCoYK9&Qi0yspeUJx5%{g6Jdo z03u*xG+5tobC~GMls2a2>nkd}WMWs4TM(S9U_6by`}mV_8eumbq4XaLyey@MwDd>- zr;@O1BbqKk8j#XorY&Mzwj#wu6~%VZvS}Nh+^M;~c1q(TNmu?|&KFx48Wsw`Fl}ax z$Gh zTdyqlMvm>ZtAwaX+|To$Kv9G|Fd~$@P}i18JK$N*7`ON1D{tOzu+fWH>oP?Y$djTd zsGvzPMo|@NYiN8;b9`V8w*L}SZ=)K{cJ!YW*Sw00dp \ No newline at end of file diff --git a/share/icons/database/C24_Connect_Established.png b/share/icons/database/C24_Connect_Established.png deleted file mode 100644 index b691fb3fec08cd2fc151540f3ad2be6a3f77e053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1012 zcmVqMTY|QzIJTs<{+qWzDSkqv@78YyIQ!kKVBL zN4hcBYQD6!Ihl=QkPD`gz{wbbFAxd`cNZ^rz#aE~_uQ|~M-mqmez_@e_Ig zGl+gShR_?&Tlc*DV~2vV7Eln0dyL;`npBV=kp=)&QNBC${*mLgwcFXWX#@8sCg`~E zdr$Af(Y|AKm77ru06(BGbozAMbK7$iab98NoWiye>UTB17oT?f#lMezVrt4Ogb-qU zaz>nJ+?{%I^`I`qm=I!2EZsRH+8z9K24usjHw|x@9CFo6KxwV7Z`@j94iZge@cCn8 zXWJ=r7VwPflk;ork}QrE6@t8AX|Y5U3Z0~5;cc661Fh^8|GCf8j z9AZ@lQQ3s$$qa=%!yv_pxJQ`1{7=jzcv=#jHaE{^=LI|llVM$wSxeC4eVvt!uToP{ z0jin!^c>~lEM?7kASCoehL|tPKy&XcCGJVxTmDbqYfMJS1S4dE3GxFjVr5OllRDv0 z5M_Odz`UQ_@eH=D`54R^3tf-m{`;$Ka&#{KY1c{LyN6G5y<0!UrC=)qS=%Vgvk>sF zvA(j3Kew2x*VJhA!AcsVLiCP@$u`%wdP2XUsH)_aOv3F7C+D{qo8lWVF#IkC_VYl4uzH;SUk*0p;be5=p z4c;ak4kf+G_^@MW^vi~#;Bl$ME)BMi@qM57`YRAl0MghAGp}{MNTHSjT_=_11FO~c zoXuuS%8D`(wC7(w)Yn_}POH6Ntt-vhzrSawJCr;C%mFAe0!^e5x( \ No newline at end of file diff --git a/share/icons/database/C25_Folder_Mail.png b/share/icons/database/C25_Folder_Mail.png deleted file mode 100644 index 3ef9fcb60255f8989aab079d4e5f905551cf652e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmV;$0y_PPP)+6cn{R> z-Yg8ZpU`!>pf^lnY&;3A+5x3{0F^b*&^46K3C{C^dZQpPyVJP-*pG7^PMDtt;PYpZ zN&`BL4KC`9V<>{nyV{}Yo5=}o@Pg{w!1ks|Tn6*u!Lan545KT@$EY> zJp(kJwBn%73f2(e1UGrXjw@LlZyAPO??I1Y0{4xd;PXW>JNp~0%>(!m$k06yjRG!r z9J_0-fz|o)g7s}#Y-@DFJ~9vIcpB~x3ozaL3}cTMO2rezVn93&WU>TRb)wmp`<=IV z!Ri+3fjSILn;pSvDs>77hXJnP$)vE9R0?prBTzM2v31`CumcuO(8>6n#n~ESs5oqg z>-{`mYGOf1jMLX0uclC2e-~>uDIr;_0NdNmCBGn!F>y!9h_ez&S+`2nJC~u(heByQ zdiXITm$ycw(v4r~y_2vIcZkbGEwO@$!5xrg+<;7WO5J|Z5w5CIdCSWyxP%Vk2(f`! rMMzoxfEA6U#7^QUv4>d6N*w9GcxEBH91PHe00000NkvXXu0mjf#Ys6O diff --git a/share/icons/database/C25_Folder_Mail.svg b/share/icons/database/C25_Folder_Mail.svg new file mode 100644 index 00000000..f8e28f7f --- /dev/null +++ b/share/icons/database/C25_Folder_Mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C26_FileSave.png b/share/icons/database/C26_FileSave.png deleted file mode 100644 index 0d87f2531a3e6d1c3abf2940e0d87e396a131f8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691 zcmV;k0!;mhP)J?I;qCn9LFVbW&CJX(GdG#Jo-@yS=9rl+Gcz-fHz)b&4-fPD2Y+T} zs<2qrzB`>tJDj+MHzo zfAYx}D_7pQV7NFa1*lL4b~B6GTzjtj>ig#Ho5h>2FKxH%?}u@lUbq%|4b#jrfC_<@ z%u{;wcpY-aWXs4&zpPPAROKH0kQQnMJE$4Axa zHf$GZ^Q5`_Y&aUjcFUy_ph83p%R{!yVkooEKkj6BvL&Q!X{hPtR}TFBUuYwBp+JS( zKi>KE=HcpAo}A{-M-QDpw=hm!>qJl@ZN_lCELKkjFZPIgKi#?OvzJ9?0ssI20001h Z{{cfZK2yIgKHUHS002ovPDHLkV1hQ%JM{nn diff --git a/share/icons/database/C26_FileSave.svg b/share/icons/database/C26_FileSave.svg new file mode 100644 index 00000000..404c75b8 --- /dev/null +++ b/share/icons/database/C26_FileSave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C27_NFS_Unmount.png b/share/icons/database/C27_NFS_Unmount.png deleted file mode 100644 index 4c52384617f376fded8d48d0784dd0d6e2db41f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcmV--1Bm>IP)#I_vT&sf;zBpLapB6PJ0m~982$(h;Ps!W2#5rK=LFGc1Ufs@8WN;fA`#E#^I5-E(`@>gxf0iP5Uzg?z|St; zH6Rj^A(KffjLA9H)6p4izW?6(kU-!05q2 z$p&PML^PBdLJ}EkY(eP^PAaEptb-~D)=yAA0mHJOXdJ@fVHs-GnoGvVug#~^-M7#@ z0qbj`WZZ1$d~ddOa&kKM=JhM*`{vrdEJ`*ND3wH63`t?O{ri{kadr7Ak)#&RoKO^5 z8XX<%m1J43H;m#$T6uWy?(G|opFFEBecpXAa%F7y__)kgS3iBFf^0js*>GL+27nR;xpWLSYOIH##Ng@7Lk#&M6o_s<4E2MTCf0MQomR<}aS{YcO`4R-XU> N002ovPDHLkV1mkAloJ2| diff --git a/share/icons/database/C27_NFS_Unmount.svg b/share/icons/database/C27_NFS_Unmount.svg new file mode 100644 index 00000000..0bb535f1 --- /dev/null +++ b/share/icons/database/C27_NFS_Unmount.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C28_QuickTime.png b/share/icons/database/C28_QuickTime.png deleted file mode 100644 index 59a1694912ed8c30c4abef28bf0d311b6b0c2a73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmVzc#SHtH>F%l=X1ydFs8e-IRsDTcZ8kPG9;~mgUjtNC`813%|2tc2 zX*3#UdwYAjxw-irTU%Q*{Y;36h7iyJg#SlWRAtI=% zE*e+^&Ut?P?TF`-CY|mwjRb72{IXl{`0pcbeZ52+L70=MD)wYJQ6&8I`-nl&CT=B+ z_FfPd`|Lh@$@w#ZS7pZ5!}mlcV2plj5JCXp&D$xDhY@5c<^Dh1`=-V9s~x(%n7zXZ zS1xxscyBluPKm6d^Nm@NI(hT1WFiscV$6*%8bqxnetzP(`DL5c)384(Nn07m9~`K% zP(SIk+=^JTjwH)@awynx#@*{FJ*GS#!HXi{@O42aH;5{tHASpiyY!YDtab|i^d(id z&kqmZa-lt8uK?FOPd~LBA2}LHP6&$3)veBPoWQqNPjS(|;*?D2UOGoOeTLqpvvkai zb|Q?EoM(q)EcK&vf?A=f0$Cby`$msPPmg(da73C$Fe~XqLQy1KuqDfRh7TWy7@w>| zBrvNC7{gbqUCPoin>vytCre`{lL{Z22rzSj5JF85MUjc)m^{ztSoN>WvV=6P^}Gma z9+Qetc~9PK(rh*{#@KjgXJ@*$ww5{PIQbJb6@V^Wfkj?bj=^9+Q52PFwOV)j{r-I* uQPq06^DxFNivN3OjERTC;dnF}eg7|7<+oC%nlEJl0000 \ No newline at end of file diff --git a/share/icons/database/C29_KGPG_Term.png b/share/icons/database/C29_KGPG_Term.png deleted file mode 100644 index 010d33570b059482f74861ff5e2e148d602854ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 751 zcmVL zlg&$1VHC!H@5i0FbDhy9HB1Im!%7QEh#<-`NNN!gNgotN7`cgP71XN#poJ}hcG05R z6eKMYN-C;F(PRnIlpkeT5~ii;o%{8+Fg2^42cE^*{5a=1=Mlyj7E&7Eq$5u3J4%}> z6=rNqYNxnlB9~2m?zr8%xjkl&78WGXTK}V5E{6nImZ7P!1-raPio4gNoAtY@)BDdi z)d?Z%L(jwWe0+bt!Z4hhpthDRNGPs~S41X8HRj-Kp=!5BIH%yTMBG@ZiP3!Jp0;3U1K4b~sq$?Ak9d2nlx%h_Uv)=bcS?>-7e zT-b!)4WF{_IkKY#DI~!36(o#5f5Mfq9>9i4W3jSf55c%Yja*Bazk=a@k8i^sq-?Bs zeAgi`4`K=`#xpF+&cgO002ovPDHLkV1fX`NJ9Vs diff --git a/share/icons/database/C29_KGPG_Term.svg b/share/icons/database/C29_KGPG_Term.svg new file mode 100644 index 00000000..ddbf3849 --- /dev/null +++ b/share/icons/database/C29_KGPG_Term.svg @@ -0,0 +1 @@ +>_ \ No newline at end of file diff --git a/share/icons/database/C30_Konsole.png b/share/icons/database/C30_Konsole.png deleted file mode 100644 index 292df84ced954de1d0d7d1ca88e871a6b0c5f082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmV-A1I7G_P)Wu1i8O;!;{O_ow|HCix_}>meXz_(7szl{BDK`p&S5HwCOvVLy{)Ce+ zEfPdw;KUfLHSF*ASzK)3y{FUZkR%Cto|C32>0rQcG$P9~4h}Nv^;Hau`gtZnBj0*z#{T|I`lO##FcmFEJbEsG5=ALCd9@A>I`0>F5<`)+DYGsA@FJ2@Hg3=_8!C1ry z#u!jA&RQy!3Tta?bkme?@80FanKN{HJ=WLPxpMh3tE;P2t5q-tq6myF4FF?}C9GE2 z*>3a6rAzGW?C{z3>nKp0okdmI8xGOw6;X)T0Anlw&IOJ<%Q^S%1unexCdL@H+ihm* zbzVPvmX$kq`0n9Dd=!DTpo)Y6&RS4#);LTQkahbkEiJLNwZ%%S#W0S!b^A7xEQ8tE zGXBY=3^fRF&Vhh4)?mVr-+ua;50;m)QAA&1u3pE8P!t7&(TMS2P#R1ojPo&K465L) zv%L7+^US||lHTqv$;=GrPrX7l46(*AnG~c4L;8aOd76@^BTmd8BaUOdFK|(m@Wto1 zxOTOJJ4{xjyjVCY!K>oEQmZ`!eoUU{;x_;Oi=>_ \ No newline at end of file diff --git a/share/icons/database/C31_FilePrint.png b/share/icons/database/C31_FilePrint.png deleted file mode 100644 index 4ff0f127c1204fc1fe90c0531d50f1d322b8bb32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmV-x1C;!UP)| zT=Y+~0W7{BYHPLeeT_&55rYGYB(Wq(m1=dXAQF%NcY6XTMD*yv!RC0se@K!X=R9j| zDwoSGPfkuP&dy#vH#S;2+lyjc*C1#V29yD-C_eM_?Be3mTBqIqb9eXg4~=H+ws+>t z=qERCe)#dlOEdJkZPp%avAN$N3=|FtN(q8PY&4`#t9P%zH<8ZfCbqY?Ui%a&;zBxRqTOJxQ)PH;j4PMt-}0uX%X!~} zsMV((TYl;k*nH@)U5AzttPC__75OB?mCHRY74x`Zj;UwMDX(7ds{Q>M*&)l33Hg3K zMWr?%Ua5gUc1Jc%_4y3>tk081M5`T(SF1Jc#>Qj90F0OBgDFjSGN7BdL<5Ztd64oG zvQA7s>GR9)9eRDJ)tY!pCB0HzL{Xh$smQAfuaM1TiQ^an#9FKfj&jgCW_5LyQZdi?c#&?m zS@U*xcW!TOJ^Zv#D5jT}-{-=GGS-6D2}xox#$rr@F@_-UnV!A~7`C_n=v69@zH-au zsRxzHqu(|*c34<=X(pG;ptV6nu-5*|K=6H+Tet4qy?_7SN1aanYfmW*gm-;E_43hC zqup+|l9OK$0TG3WMFw>GzUMlQ|JUJR^kW#N_#0~IhoH4ekMIBh002ovPDHLkV1mgh Bnc4sV diff --git a/share/icons/database/C31_FilePrint.svg b/share/icons/database/C31_FilePrint.svg new file mode 100644 index 00000000..53234c85 --- /dev/null +++ b/share/icons/database/C31_FilePrint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C32_FSView.png b/share/icons/database/C32_FSView.png deleted file mode 100644 index 53dda269ab87b7a5f0628290fcad2cd83e9c5090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmV;?0xtcDP)rib-}mQvQbYg%000000DunOKL5q;`jd|z+1?&wEDVLQ zFw|r$j3o@2F|(-Dc52+)O;^9W@L>m=XP&u#?dhisLx`?17D{C?FNQ^tCsVmlDq{{& zlWW&^T>JjW3mx3LxgY0V8PZDAoA2yv8U#xl$E3-UbmuRkN{MFDYStd|?&tf4!&*9s zZesP}CH13=hEF~-be+44g~u*_?2%Vr=F$bap1X5~`*`n5&GNlS(Ls(R2X5ci{{E+o z1I)K}7>hdoOVf+JUh4P6kYx>$4#wJO(C6$Xdi;YErGWV3j#Rd|aUjx)5}{~FNe5#M z`H;19Z?V2f+uF#*+Vd~U(* z+j4r`^!3JhZNq#)D%G3g+$8s;Mh97|#nt_v{8+xS+YheX`ppxMp0cre#*M$j(P?sP zC(LHyjgwh433QNaqroCqxA*3D_ZI%!UC4!6m)L@LH6vk5J z90C!cZ9A8K$u58T+7BJ<%nsw5%R@Toi-;r_#=>k2i;+m=%upx=HKf|pEZP(irpHge z-!$!WRSW?E1O$PAKq53rl!^ZOw<#h300000006-MdSzf;rKn|R00000NkvXXu0mjf Dlw4Q< diff --git a/share/icons/database/C32_FSView.svg b/share/icons/database/C32_FSView.svg new file mode 100644 index 00000000..c0d42f28 --- /dev/null +++ b/share/icons/database/C32_FSView.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C33_Run.png b/share/icons/database/C33_Run.png deleted file mode 100644 index 522b0a3f9314bba6865e42852dc009e67d7e7c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 836 zcmV-K1H1f*P)w4jkPCaa=~I-o3z1JMH8_?tzb~hE3m7+3O9lXF0ymcu3Usd zH`0ZrLQxDFNh;QwqIl`ZbefEvF*B3QnKSoud7j5bVA_5EFW}3M5B!DJnx{Dn;0wng zNT+GmY9z8*%uI%d)Wb%b$r%o;8a=Ev2x!loQHp>wy3Cm>)w*5}C-@j};xj+WNhiTVcI`h`K6BCPz zv*U|zWZcnFMz3E-S1JVgJe^t%-RUrG+sAkM{UZYE!@$(i(v=IVtIkL!gJIi5K!Y4h3(4=MDU=}Zuga8AmbQ0IMCOB{EpbIVLp>Z*$Mn^ zm+hTxgyXz8Gzg?5f}cyZ+Wph6d)5d;L>Qu!qV;cy-rBd+bJJ8d)~Wt>@1I7oaKBft z{_q&_z@c4hHuLpX>ukT*qwM=s+ij}B!1F%+_;!>^ueBbPwj-^7v7bHs$g~p-0|_Aj z2*U82wS0cL8-^u62)^!Xy@n9^?q0o`o}BI_vSa9G17R2-B>>`S-}!&ujC8yJb`kpk O0000 \ No newline at end of file diff --git a/share/icons/database/C34_Configure.png b/share/icons/database/C34_Configure.png deleted file mode 100644 index 5314140ec6650abf49b8fc7109f22f7b4f06b004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 828 zcmV-C1H=4@P)VU(yLq@psNiSEN4&)i&_X7KhuqYDRW^uohAoWuM3KhJXxD3#Yhsk{m* z)%6E@{Ub|fXScVd3&Llg8!e%R!;YJ62Fws3bR6puD`I-(dKRD=QA1np#DJ zVFGJw@6O3&xq=e`NqtSsw zLt|J}RPru4IjOm??={-(Zge{Lu&3v_OC(BDNF-T6K#-Z40b+3mq^Do<33NI=JvnK_ znVA(F82Es_y{~X?&V&xfE_yr%*xmiiEfmIS1cEr=^P?dmA`G}(E-=Gp2LQW*^2_%9npMv1vK!B8#BtdDZ z`uoVp7u?)*65IP^`GDM0J~6Ys?ZSozojodwmmL`y?hhdOATjZLd}gNPtxnfs>F9X6 z)877Me_>$_50BmM!20@o6tOQ34-fMPq^71qe7q21WBG~1q9Qc(^sSnjJDXN3?FXT0 zC;2xTZ5$3KCm?|34@gKj=Mw{Ba)yL(BpOY%)oix=mOY+5qFYP z(P;BQ78ifu($WTcy}z-t@+N&EfN{Z;#n@G=t1Kqd7I8rlfEnlKjVPBZCjJQ^HsSB& zkk4(iSX?+eyNqdRqEF-*|9=3?hzko#sO)U%M`oEt^8Ep;tCC(Hfbo0)0000 \ No newline at end of file diff --git a/share/icons/database/C35_KRFB.png b/share/icons/database/C35_KRFB.png deleted file mode 100644 index b518beebd6a71fe8c7372b9c3cac0ae33db18f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1021 zcmV#l*ye@vxYfc=O+39*mnB z7Y`m>Jn2Ob#&}pf%xxxfpk@I!H#Zo_A3+8Kp(`t+eeK%!&(BAs(`j7SMUv#bhYlV7 zp}(&;>em!hS(O!8k$kc$2_Z|8kR)V9()6%&=9AM`My~#R6hJ8!i#U#hB>9?;9ebfY z-qI#MJNp}UK*y2=Ha0dkw&h}FOCP67h1ng520*pI_F#Jl zvO6r>7LjO^R8v#abAN5+dr7YDMyc*567Q!_3H(*c=h)v{2jvRnONi}oPJ9t|1dCln59G zi9}m!?8bzm;FNJH7{@yIkUpTTAqq0uqzcVPG5ETm>*Js6LA|D6 z<~M~9L?Tfv>oKDD{a*`xy(#_pK!T~Uaqixo#r8a=7S>tWDsyySH%aTRne6B>Bh|6+ zKl3x@pJSuvXQn6L%@?+JUtG~bT&YNjT)es)khGAo6lXD+^ zxXsqWYJEdPczJnwW%d5bd?u5* \ No newline at end of file diff --git a/share/icons/database/C36_Ark.png b/share/icons/database/C36_Ark.png deleted file mode 100644 index e30bb09b90484146a364dc83cabcdd0787cf5fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmV;S177@zP) zC=?1kGdw&zJ~=tLHaa?bCKhv7UVr0L<_mYoWKtv=!W8m|fYP9~CI|xB z+S;ymb#=MfZ1#lbxgWN-cN6$^g1S!-_^7~lw5nsY0YCyo!!}hNB`nlQ75Lp_V_&hc zzDiHesf!&Q=f;}Ssm8&f!DcVj*c^$tUTLpVn7MQPO=Fl7#u&bStCL#?y=+(ID~*}M z-_@!W;W#eGy3TSu_bkFlwASowSJ~RCaZrZeCqCYs`1O<15}+ko;x+dV#urku6n}zP z+$H9<5sSu{y!M4DEUX@^ZQkE2?cU$@Yn$e|Gw)@4doQPNOpU!G0Rm-4M9bkz!@16Z zyOt3vt5t&iJWg?%rw=W2G*~l*>f-YF+~)gBRd=bfw{_c3iI8oFGZLWr*yEq|yzpYP zux*a}0sGsE`qmDSmLnwNj|m(TM=ke>%imu8ex~D9$8k}r4xl7}oosc4Ys1Pc(l6o4 zFm$$o^)L8EPzsWgva%YCv0SbBp9D~mj3Azc*e>k-1Em!Rg+UZS#vtAdkthegU5CKe z1`Go6Fd(AslITfD?SU1BP$R?~h`1o*kW7J$Q1xYCTlS7IAOJ8A0>(%ijzC(2lZ0Xd zVhR!(A_=hKm~w?$P3c4;(NM1|p|L;+Apt)4=<^@@ujkM94fc6GPac)&rX0i%@N4UA zEGib}cbL6hMJF${H$~iQkx09A!Um;$A&fB$4P8uEN*ixms?`7TOXr_&&Dg?g5a^(b z;&vs!-Ps-xN{S8lACn>VNK z*;aT%hP1SV1`}WjW0xyiwdIw$pOw;AB*4N#A?|riEZw_njsNn^mjeU+r&m|kVvCD& z=Yc$rVvND_nx4w#PW_fnxBMW4$atQ22 \ No newline at end of file diff --git a/share/icons/database/C37_KPercentage.png b/share/icons/database/C37_KPercentage.png deleted file mode 100644 index 64995d2de0ecf293254162c74fb743f87391374f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmV;_11tQAP)x>UFcRUR_T_q%B_u+kFqTvS93mV z>I2uv77sLOh`W@#0}k&v?$`J3KGEOM>m{U={2zkK_Zr zKp-ds{-Ep|3CbOv17V6cqF zl1(zVTFUOK800eC_LpT=b$0}208Ra&+^noGOid}ed8;khbF zRk2{uZ{!buo;J^8W+Ej>p|E??BEE=~`Nsv+Tb6mM+M)dPK&w+(x)EH8+Gnp!6>Pcr zx50dAIG*`oTrs@AM-whfnv0VTwwFaIGw1mHSA*;wNyyiljl!zw+zwc63Xo>@^pEkr zgY6?1I*yF~a`D36ttOhCYfLOz8Mq(AX4J`K1uL;wDi&Rir?V>LG8Ea(Mg@>S99SSe zJ6N{s?LCLRs?f8N?xCDMKl|5eUKq*gDauN0h0gL#RwbV#lT(PUCDPjX`1od373F3l zd~q$c-(at8sZ{2o;~PvJmi>H7rHbEnOGsHHsJI9KCkum_FALS zXo;SRi!t@c{u76tteaJO2BoZ6{r*pzmI{2=zjyVCj^>g&^8&~;5p^r)evasl;Mc \ No newline at end of file diff --git a/share/icons/database/C38_Samba_Unmount.png b/share/icons/database/C38_Samba_Unmount.png deleted file mode 100644 index 4112a4f631c0f5b04d5438b4eed42827c5a00418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmVaxn40 z!Ne_u#FLt6BI3bB4S}dgAgCpcY3bC`Qe&5)3uTsn`#eDOz5Ba7lu{gg;T2Bo9-*RX z)F9>T+BNN;J?pEZN1ZcLj+?{gu_sRDcbuGmwq@{KZYK#kxsL>}JeSKIS&r`=#WBny z#v>1R%XF*63L7^xRmcvdKiEII^Fpe=Z9G^I-&5k4;GQ}_pcHkr+TQDh{^urd{QgXz z6d03ZRIgp(e0wYy+*vU8WOg&lqFKHkrmZ29FIE2eKOm*Fnwncrk8ItZ87sStnQeGi zDkP(Mx<>kR(_CS`vcY%PCm3oOA^Td_p_A{u{_4h^wfA)ZA&mC!mWJj9(a!XtcX(_- z^5GeWSgxNp`aa{@dV=D`t7I=N@X(HznP0pk>f_0g{{m8|fx1og_Jwj216w4KD%_cO z7~m>{jq_|9wD1?kDE^eBoJiw|Wm2iu+}vEzk^r%Yy*03!#LV9nmj0aK$BWC{oS0#_ z?N>xgGcpuGENaZ?Td4>^eY}orHkSk%b%5q{dT`I40W$eAVXew~)hBl}U^7kJo|wd6 zyv6JfE=FM&cBo3&5Nz3!k7%0lpbpT{(cYWwOp@*NQGt&NT*RY_Qt53<)8pJNEu-yi zr>C=(z;y_RZTkBk&?1rOkPeVaC6a4vE8Hzt5!^%5B%T)#&GZq?Y2Z8fj)T-qtdLD1 zznOS_qM!prB9^99z}o5xnx>;vz{bV~sZ@%HWfJ%|LV(6Z--57S!%i-_^rUHQZ0H^yesZEazs)e`extYk8_bSP+`QbvT<%5G#ym%kJb$iOERIU4p;UlS zO3~GoAs&z6IIgAZ#%W*Zz2Ry_9qw9gO*9bx`j6)^*aP+CE$#2W$%A5CR@h^ \ No newline at end of file diff --git a/share/icons/database/C39_History.png b/share/icons/database/C39_History.png deleted file mode 100644 index 95e7d6e8ed5d29e28861c61e8b41409efbfe623b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 963 zcmV;!13dhRP)}q~IiOr7Sdoa_EJsAXP%p8?;jCi9f(^fFn|cI3ZAb z=n15>jZipLDj}hilAGR* z{qCqgBq6bPSgRH`jm5RX@jdF+9BtdC)&wDt$lM1>0+$*|4C!BAzczGdaxg%r+NM=C z5RQX86z0fsvAkL1=ZE=wZ&nY#qHXUW1PWcBLfa0f-;O@GeRKRqk2oMH?K3@=#HwxM zRccIRQdGC{&}eXRX5_-|&gnY`TgF3NvZ>(t$Qz9ZzP<7J^e3Z1i<$m5@oqQCRDx(s zCz0$T9PU6-Op;-RwyDt3*V9+Zm;29ljX6bCuU?t?c=DTwT9vPzuXABygwALT0JmF1 z(=>!|2zn^v7cAd%YHW`#U^+`ZtDghAc|}0LZe8 zEQ6v*XkLk_L<6@TA<`4Mt!jGsvZe~IULK|+IKuMF|Cpa&WH8;s$jC76>M@QaQ*jhd zk51_C>*d2xf=62ho@iu3#TN{Uu~&pGn~N`4NEBXkaZYaA|yuOX)NK073{nUN1w#S^UdYsGl@t^PsU* zZ!7%%>@}tJ0tm4Gd4Y(>A)N*Q001PmHi|6#wSsADm}T>&T-|N_v|VgDxr$7^?qI*p z;rRS0*(?A6jw28P97oWsTja{Hv)STgv-X3G+yCU*eEGq?n&GJIkY6oQ>gYfSFwF)v z(?lRqDiz7+3RDa?hiZmD9+zi@%lAkj`enOabr$kPF&)pwdnI2Bt7;GqgvsS{Y;W%n z3Pf02EwQ=Z;8nGsyWbr=KPsNw!mCykf_Fes&dg)xmR`vzS2Q)2?1^w@7_?drwxdxw zl{jz`{JN6l?)Rs&hehKHRBHnqBvMO&0&YLx)o?u5yVJf~1B2>hBBpqdV6S2~*Gty& lcA@?wG=G6won{q;#s5S*e3hUGz>oj{002ovPDHLkV1jd|%5MMw diff --git a/share/icons/database/C39_History.svg b/share/icons/database/C39_History.svg new file mode 100644 index 00000000..a50a0f92 --- /dev/null +++ b/share/icons/database/C39_History.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C40_Mail_Find.png b/share/icons/database/C40_Mail_Find.png deleted file mode 100644 index 6dfbb958d7ebf94e780e6deee43dda1269462db7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmVUmtB~;xtM68zAQ05YT}Cz#s?D< z_0flEoDo4@Otg?8a|EW_1j?kgLpCX3yFxF}L4Vr+_W8h~QBQInPEO8wI*0W2eU4mC z1!I7!vd07{)j`uJ#GLFi35KVi+*@;bdHMe4$jE!ARc$LyhzgN$v*0ScZmpiodujFFb&V(aTod#lcM9`o6%Jpdsa*vzI7 zoX^8h?1rn{iN5ns)m$6?>XmeA`hCCzp65xA&*ylpzOm}e!L}-WeVq-NWEj8yu?A5q zhAdMgS5wd}&7nl-K-bYd=stDn;y{1!3ZNvo_Vx?ohdNyy2U;sQZ?%AIW&z>o22j2q zo*EB!Ih`n}szxjegr}}!U(*w?mDQC8zMqUs(&8#`WCM6Lq{*pip@ZkF0KN z$qb@Gu&EFvw*bZgdL55!^e#?xwIZ*$9Al#si&T-NiJvDUfm}+0pa*mY3a1UQ7zs3v zKvDr60V*tjx59wjHjfWJ`4#;GBU3zA2=cs+ic3ptpUwQT+}nNJE-c0}C^t$dGwC4~ z05Cw$1En?~5>Fv8^27XgiQR-roa69rSx#JL(PHndY=WQjAb%glHG1Uf2yaRM&}oih_6C0830W| zVr2!R-wwfI5%6m3ZVwlp6@~Rw@Sv0iS6h1;loDu6eXyP>9JZM4-r?a;?AmvOV;igC z&G77uG&UNTz4^`H$0wDvFu9$;=0nG86LV-JQK>z>%07*qoM6N<$f}$kdiU0rr diff --git a/share/icons/database/C40_Mail_Find.svg b/share/icons/database/C40_Mail_Find.svg new file mode 100644 index 00000000..f049a7f2 --- /dev/null +++ b/share/icons/database/C40_Mail_Find.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C41_VectorGfx.png b/share/icons/database/C41_VectorGfx.png deleted file mode 100644 index ec47b76e3e4af2e3a16473fb97c9f5cab83482a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmV?P)gn-t4-cCTq|{7ZihHBPeL0f@mWMHezF)CUt6S@du>R#?oIPXemJv5f;Iy z#fl&j0*b!iy1uWSH#zg%Co6c^**DDGbLQSNcf`ud%JKaC{1^aD;1xpfC(J5ZVObW^ z>9p9}+jCb}SASr4ch}SJpy7EssMU1Dxl&3u8Vwx;f%bhr-akD()qQ<^zhp!hWdFxm@9k}*+S~DUW(J|>#e2yp6bf;?$yhe|@rFs(vTgjSR8TCJ(KS8}6^78wnAS4l zc;Z#SsM&38_J0oaJ&m@ZA=JCNP}tdlo$&@X(V45bCg67wET?p21Q7C~-Qe_6Y`+L-{ zuMsr`ES;ERu1hIs)~G1-w*Lrv5KT_ves&hA?rwm$Vh{@?Lvb-pqx_K(gb6X72KxKq zvZ1O|Q}E{Ikf&IqDIgO^6~BT*a>H6)M)mw0pRTT;dV5hD9K`eJDD2^3lsY>R(HCX1 zH6GZuEhOv7(ZIMIihLdzKz(x)F6%X=zxDL=d?zo(&9_be4#dkdmv?t}b;ogj Z{s*Zor5o#lk#+z8002ovPDHLkV1lPPRGa_+ diff --git a/share/icons/database/C41_VectorGfx.svg b/share/icons/database/C41_VectorGfx.svg new file mode 100644 index 00000000..44338605 --- /dev/null +++ b/share/icons/database/C41_VectorGfx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C42_KCMMemory.png b/share/icons/database/C42_KCMMemory.png deleted file mode 100644 index ee2560a0230f5892f96270031a20e7f8b7edc66a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmVe-yh)*LIDz*AoR~8>LL+EGEXRpFjF_wrQ~ra8>R*xvZ)tzVcKSQ*=jcJ zqO!EM-i(;bE_?ylOZausI=DRa-JZ+mvu6+B$pdO^fV&iMmHeC=ML?|t)LQ^gHUzK1 zaA7j*Kx|hZK#4491t0@}3c#5_odu}RGK#~7UE?b!bDuk?Xjbe)0|~nGfI11NHLGQP z#$^6e533TrZ2dGr*XP?zZ&w{c11rSS0Cy3D`YV@((51bCRWExNW9)6eLtnI$uD5+u zY&xjw(H#nEl>Q4;mH<_ST3OJXEMD<(ba{c{p%I2Uf{a8$%vfq<@U@MeH4_DsZ2LG+ zSqfAXYtfeTMKxn*cx9do@p+E)4>C4AO#4bVBQNv0vnHohE=wUz=spfq7a0+-?&VH- zX^XYdHqpfK@i9J1#OQo7z`++1KWr!{+0#-0yuhy?+_V8z#aaZilh*MDjxH{6ZuTLI zMw?g=zr~8>Fk^2jxU(hFTqaKeXvXh6`9MvfQRcJm7DT-qo_oN_u}Mxx?{PdHp?a)| zu0$bc*Hye)E>8i1AII|KW}(HB%PzYG8w>3~)V=oGm^gZ{8FVWFj5kvjQdrvZ8;pcf%z i%8QXH-vNXm{<9zE1?r7N%%R}`0000 \ No newline at end of file diff --git a/share/icons/database/C43_EditTrash.png b/share/icons/database/C43_EditTrash.png deleted file mode 100644 index d09e0793567ef5fd0264267c6350fadef85e226b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 zcmV-$1CRWPP)|Zou}w+Rkj5qLLL-qPL0OQvNgY6CV1)^Z5yaAw30B0yPzecv zn2I_eAr@drr8FQ>sHl1&YFYShN-0ay)PzAi?(c2vclUSJ`gec$!laWmI=>=O3ne1xw^yIPurzb^+}V?j zK>)k$kZjZ?2|{`!n92!-e4aviiYPjqtp9lB^U3{d?@2m10?vQ5{_v&cQ;WCPTRhnI zIYEyPUM*3u4BuSe;`=q9Nk7FVW%1byI29%LzI^j?I%s}k0W6=cHtuglq`SAca%q+m z)hdfmc$myEUmEdbc|>AdEEDtXFTZ0=zoDGU?CZc0aI%!L)R^JtV3DP>Rno9eb90Nv zLW70*Io^5Aq2yJ$y_07pP;4g?qH(AIEC3}L7oUO!_Z&AmfC{x)Prj)5!#1w3=gVw7ke9XbpTMl=Uw?(9XVsXCIgD7uGOy)juPpcKad zpezMBgn|tv!mQO(p$o~q&WJ(!B zE~nV;`rLfb<#ZJaTBCDix`TvHr-Nl{G6NzU0~(-QbogT{WV07B^kep0Ba%eOTMls) z6AUACrm&5|)fSFrfl~SyXl@VEz1SuZ%|vqS26+yKDQ#cV@-3oZg6rg{yA{TInmEcJ z_LF1a+Gihrb$#WI6pIC1uS!oI \ No newline at end of file diff --git a/share/icons/database/C44_KNotes.png b/share/icons/database/C44_KNotes.png deleted file mode 100644 index f981a9a47152fad062fed993fc5a18b9e23ed79b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmV+t1MU2YP)?cArAJ$-JzWb+5d#c8u~auOFfcGOB18uy5U2hJs3Q^sQek07 z0tpF(gv7!ED?ikt_9!~k<8pB>jh#4&f1DrN4?_}h>dII8ZqMuae7|2qYt8>D-<+ z+i&f(TBg@>crWmuJ2-dw8~Ms^?#~|=BI#!rx580=JPy54I%>nxbqyDGz z=O \ No newline at end of file diff --git a/share/icons/database/C45_Cancel.png b/share/icons/database/C45_Cancel.png deleted file mode 100644 index 443450f09044f70c0c9eb7b9f138d080f66dd866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 998 zcmVrKWi4J32@N3zte7^Usfnd+e2`G%i;~tRl@>8JJ{VIU`j^;`?6=xLQ4x>LU_rM zk--N_84JS}z?kk1*Uf#@)02_?{RFRH)16A~xpV2#HMPlg+q0WCf$u{YqRyP5vsCi* z_3MLw_YAF!Zr;2@J$dn>KXdQiz@ci@m&cAl5a6CZ zO=q#_bMxj%O$goD-JSA#d!bZhGY1k@it4%Q+|CG64?`sq_9$HwA`xw&&j>kEz$C;%xXCW><7#bVh^PG0?>Qc3y; z4)efYJddl(rNzjyz1jhmZ50p!~ UJf`3JDgXcg07*qoM6N<$f|7>Y4FCWD diff --git a/share/icons/database/C45_Cancel.svg b/share/icons/database/C45_Cancel.svg new file mode 100644 index 00000000..df1efdc0 --- /dev/null +++ b/share/icons/database/C45_Cancel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C46_Help.png b/share/icons/database/C46_Help.png deleted file mode 100644 index fc50cff7408d77ee4862333e0e05accb5abac268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 963 zcmV;!13dhRP)29`mlT>OFkG5)zl-7hu4LwrDLJ?8xn{OHk_&10Tz9@*- zi&P&h2p%YcFBVc1TWk|!4b+gNNhE3Z$R4vZJ3Gg3#?MD^{38Ge1vs8YOq|XYjJd(X zrBjBH)uoJR)Gg=!#_pZYUiD*w@ModK%&6yq5U2nM0j@u+8MzP6TzKlz%(G*pGddkR z#OZ+_D)GIlJ^9zIwaGgRH-EKv_U1s`1&C3+0FF0Y7%F}H_WbP3OD~MjwIr3TT?W%V zaN4Y{R}pHQ2M(9X4nA~bf4BC0ufBhcSgabuIG56LnGfgYXU|VRU1EK!i&L*~dD@`o zc|10xaq{6L*B2|)8V(6fBXMZd*x%eZ9yHA#6ohi(^w}q0e`dTyqX|3rEha{EjC_JG zueEvq`zGa5mdi5-sJFT_s#O$Kp*TJ@g&M!4CNuh*N5@Br0x<1>L^8#~N`pUFEwoIY zYRh9~(`I5UkCv!WYy0@JN}^C8Y4p9N7R$xyrAii8x;$D85kgRLbZR>;P0L4997YER zXjlO)Q{wbg+MOn7HmO4Yn3~P$xk@YIx7#gVIhkO%Umy@9Ri76pRAwg*aj-wh7gx8b zv_J+9^=5-~m_gOj2{n=tsv_w*9$#H|7#~#V)8JTH@W%NfW>@m=)&KbP$9+0o7uzuj zgC58k(Bt-609}v5befJMnR;i1wJjSFmqgNqP(mnCgdi}jKxyt& z|4_XSdP)HqfGR<{{Jmv!WueX5whb|#DD)r^pOFRmhJeJ|{ z2Q^MSl7pTHfe*e*TuYM>X`H+NE)sg*#K@lUebc&SSL$bnMuv*9jE>zlSzPU~e6Poq zpVqOu9hA5rl`}}j^Yj*%cZ2%gYoM;jNInNKrRg@zU(D^@BY8bFmOI$bUOVE(KP`et zp!M~UjO&Q~F3!^OO~1bLDyT~!5ES17K%fvgt}a3@ri{M%WbwdJp`{a%jPOj`_p0>` l*{XjYh4O2N8lV6Q{{u_RqFVRXeJ=n2002ovPDHLkV1j$%y9@vT diff --git a/share/icons/database/C46_Help.svg b/share/icons/database/C46_Help.svg new file mode 100644 index 00000000..6a7bf819 --- /dev/null +++ b/share/icons/database/C46_Help.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C47_KPackage.png b/share/icons/database/C47_KPackage.png deleted file mode 100644 index ac5d51789bfc69eee0accbd29cd72e64882fa025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)`6pHR5*=w zQCmopVHkeC|KPTtlxaG(shjhNiRTQmk|=~QP=rDuw640U8-paG=%&2r!VZ^0)I}O% z2LeU9CQV#as)cdGcZ$3bMJTf0wOrjnlH_~Y`A?U z7UB=wnf}r!Xjo})L$Tt7$(wB*vR|l7RF68A-JPDbwI__gFM%W2tPsJq7vuLHlxc1* z+h)l!ndfyeYOG9|pf>1`u|H49s4Fg8HMgdLf3 zobDW!92U6T6Nr|E!7WW7LWbX7?@MW~BPl<0WqhBAVI zNOiNUf(=i}+XRGRz|bbxUe9JJ1$svU5Jf7Jk-9uVupujc(H~Yv!cIZtodkkP$txoS#@OeB)8U0i3q+{o5W?*Y(2qcy zK0?8S?4rPG`(RmjFO1b{I#WixtKyem!PvmLiS&2?A4nMkX3 kuRDUPKdo)_`t{$K-^~mfi#r&!YybcN07*qoM6N<$f)vJuhX4Qo diff --git a/share/icons/database/C47_KPackage.svg b/share/icons/database/C47_KPackage.svg new file mode 100644 index 00000000..79b06f96 --- /dev/null +++ b/share/icons/database/C47_KPackage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C48_Folder.png b/share/icons/database/C48_Folder.png deleted file mode 100644 index e648b3fecbff8dd3db735ef47dd4360a90589b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 zcmV004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XU000XU0RWnu7ytkPT1iAfR5;6}lf6mbMM(11uPJ2OIfw* zCh!C}V0wR~So_~ZtUa&`tN>B?76CPBj{xporn&z50JX2{e^nL%bb7%ACY!Fbz=;PwLiL%p65}>XgdOEbp_mbmN9o=9Ap+U149b~ z1J=RC=_{4P^`e%Fv=9KDR3bJGaw~w;gt?J*FNe=`)XZ80@RkHXPoi}WG6#7$eHg~v zz#xZCf1GIq@E$7o=*yq5PTI(WIkPe^*4<(09u&lO0^SS6xN+Imi`h5 \ No newline at end of file diff --git a/share/icons/database/C49_Folder_Blue_Open.png b/share/icons/database/C49_Folder_Blue_Open.png deleted file mode 100644 index baba6e00e8fcf143b24c98abbbc0c1a5568b4cbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmVO>i=6ZOKN zH3l?>Wg;(_I|pV?Aq0~dU_1@94CqDG`Fzla8m(~ZeDTDw6z~HbN&&$Gpg&3H2MH&0{KsIJDEkEWLh5fKN%M7!~C mn1Z`i5!DX3En+@YrSJ>m7574%bPxLg0000 \ No newline at end of file diff --git a/share/icons/database/C50_Folder_Tar.png b/share/icons/database/C50_Folder_Tar.png deleted file mode 100644 index 69f1c455d8285bd016d9c5e6cac1866d2ec36e89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0x+_>^Jd;quVQy7D(Cb}>#iV6u9 zV^CbRk|3stP^zs16)1Fu0p{M%a}uN`=W+l53p3-`K!F?p0D#H4h=_=Yh=_=Yh=?#b z7r2EAGGu5&0stATJOltB=BFi7bBh1~7G}n=fdY93`*k3YBox7&---EY007C<+?s`% zn^;Dk!R~X`Ys{_yKmbu7AxV%Jx;D+VxLf-uxryZrYDdhj@b8C2g#R8a*}eCfa%U>d z+SLBu)%nu2OV{61sdh=zRQgZjuGz}<3~I-~;_VL%oUM9sbi~-zH`EWC%AI9Hqvwtu z-}A@kU-@aZqVdkB=!A(3c8?)kE^iunYl>1y#EG`pCNE372UT8v&G6V|!vl-nUtXY? zfeRVzJx3HGD{-*R!6QkU$SOUQs_buYQX@O3*t7HJ8toI1WbpJD5sJJ+f`+{OO(L6n)RDcZj8$jMMNdF~H>O@ZS8PzVb3gs%@z4DGzXDt9SIBHPJ z$g^I0M`;|9pV7WgPl-}adzIckMdiqO4xpJ?m>J(Uw`TZ;^Hz=*7`%dl<1TtybOeZ?=kc ze2e=Lah5 \ No newline at end of file diff --git a/share/icons/database/C51_Decrypted.png b/share/icons/database/C51_Decrypted.png deleted file mode 100644 index 1e239a7cc8e4251ed982b03c55afff808d680b53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmV-A1I7G_P)a7=TWv9o1^p*G5P8zP)+# z@QyT1qp7Jolb0`F{HW3R_md<^N`Q%p2{8bK5DX5kfA`3dSH3)OV0?e8)n3_bF4PVl zeBr4RCr+NJ*M~kViUI({kfaq!T2V=pSI5T2-U%V|`4^v_zjW!s(-$uMu;p=ArZ3M~8Qpd9N2jK?p(=OS2fIVtKjTwm;3%PH4 z+rGJbz<1}P{@@`vOddUGT#<70get$k#%$8-AvWs3r3pv(z5NI{Hf zk#d2kNobnC((>3M-IC@_2KV)opeU$iBr!-K#4t-(AhcLqv~E-6#QQZNimX}_5m#9i zQ54iN;sm5XNjyW^Cd8z%{^!@~&my3Q \ No newline at end of file diff --git a/share/icons/database/C52_Encrypted.png b/share/icons/database/C52_Encrypted.png deleted file mode 100644 index e1edec451bfaaac85fa06490bd26703fcd17458b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmV<00ww*4P)^-1`sw0W8rNU63F; zi9~!bJOpKc85rl)-Bs7cJRIG4l1gq>?mao@+>)iGrL~2Hg*iY~m46{3f89OLBa_L< z>gsA^d3kw}m6esI{s-1tP1984IM!CHrK+lhLO~}dCtn%ooC8SH6z3cwf(RTPm8euI zL{Y@Z$OzWjUQZN7q-lz(VmkA^VNfsxTN0Q?1A3hetU*Yp}UhB*=s~RjjpL0!%L)-%u$X^7Z{|EI#G)eQw>D z;^5~#(sUF*?lUo(XD~m6s{SFc)&kJ1*ExRooY|ox5JNZskro-w?9ptMNW(g(Yirm$ zPYDMjw6ihOE#gLvtar|}+tXl_Z`(01-X=Vp9%Smu79>qR9T*z5I*QP>-U|`&Q5U0U zyGYjKw+@*kFuLz-l5vVJu z!#Rhu9R;fG!dd}yhC~IBfT`&pEZ$5Aj1S>epoN_Kq={{ZsM`GpiUNX9qnU7AF5(4w zL=3($G@L-q0}H?E9s|&^&=;ajEq+$;#vW5Vya!$Yv^}=_6qm%v{f`ay5U)@qN)IRz4It420EKp2LIh-cQ<*BkTm^VuXxu-1YI+99A% zZvSb;EeeGK)oL}CTrT%$e0=-~5NJ2i4n(9!)c+ \ No newline at end of file diff --git a/share/icons/database/C53_Apply.png b/share/icons/database/C53_Apply.png deleted file mode 100644 index a2ae9cfc75cf75f871a976f69e9d597d1861b874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmVrxsG>6#;m4Ejk1Ml&rN0yiL)>*qKG0Yf{L6)1wpH5(ZjY8ts=6Z zFf_7=3N)SUVKEU*8ynK1fyN#)_@W|fuJ_z~{^2HQ(Tl#15fT0eGn+#o7tkj2pi3`w z%L|*iuyqUIHXL2THf#`|1k)vyM*_;O2!wnWpz}(Oe?b7G+*Lk*c5GX?x+b6(D2~5G zL^Bk}`G)Ex7muuol=Kf|RXR1Yn-gdr5e4xpL{N^ZG7G&A53FC&bf~rpt&d*eNg}H!a(IyuJZJpAV<{o}=r|aEBqqA#nV_)i=GZyYIcVwtOY_ zY^bXJ>dC#EyV$(hyfad|b4eYfl4yzdzAXe1R=P~3$QE?6+SLfD#p_Fyy| z-LPmm+LCv%G*p85{!)CREIJ30xPE1%Uw(GhA>VngxC5oxP?`kk4p{N-Rj@2-tOy%j zhqte00o{);)&z3wBOa#*aqaS_v^(zB3$L4kVgMKzF@PARa4qM9DGMHaNV5C!q36ha z&0y4hhxpr<=xWc6A!BS28d3xTF#<6K#a$@jKnVvt&osqtDEtr?0b!cL+O|4D1&IJ@^AIlm|k2Ah;OEu-QI% psYFgBijHc6TEX#0jEL|*z5~-~Bs9LDyovw-002ovPDHLkV1gTBQse*t diff --git a/share/icons/database/C53_Apply.svg b/share/icons/database/C53_Apply.svg new file mode 100644 index 00000000..7ebd41c0 --- /dev/null +++ b/share/icons/database/C53_Apply.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C54_Signature.png b/share/icons/database/C54_Signature.png deleted file mode 100644 index ba5ac29dd44b4797614a8ce57466c1b744b7ee83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmV;S0$%-zP)tdXNHJl79=5fR{Ig4%&j4CaAj`IQfr z47TP)w5|6<1Xh6Vf7At>0@_gYXDUjX9xu5o`b3lL60Ge%)_}q^UtGZqA4YvSirS1W zsjVPXH}yTxFed17gw0KYdZ}d%sPz(8(+;p2oS;;v73~|CuW5TC`s9#cD-}$gV{n!= z;9wqc)%(DtIF;~n%HORybS zMzg;XO(Sq*9jM*LN?r(ip~ekIi*+66FZ4-P{w)EwU=0eoU=%{YP9U%jm{l;VU^9Z< z00u27RbJ)!%y2|zM(SlxaX`?dkAX)6r9cT#vJR|H)dG;R%VU~+IeT3`z8H~-XwKsJ z>A>p(N0P^3$;M$R!eQ~_u=wKvAid1Zqfc{D5m}Il(Hr765xG)@eXs$BBC-7qn2Ph5 zo*(zi`!{!G;q#Pi&rQGYOoD+h^w&XuZEP`s7V0K@U9$Z3wk&?TEH}G${|1734IJ{p zP(uQsz@?w~@T^yUez_yl*8-B6sty7QKv^yfH*NqZTK1lZ_U^i*rRtM80#i(8doUTp8EFqvOJk>%EfL?*j{{a2~wR<2cpI4if00000NkvXX Hu0mjf^m!&Y diff --git a/share/icons/database/C54_Signature.svg b/share/icons/database/C54_Signature.svg new file mode 100644 index 00000000..a6adc424 --- /dev/null +++ b/share/icons/database/C54_Signature.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C55_Thumbnail.png b/share/icons/database/C55_Thumbnail.png deleted file mode 100644 index 4c3a26d449a02dd2f5d191991e3c62c16d9f72fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 740 zcmV<^g1YgS1oH>ns-Syaxeymws-U<^KoCI$!GMcE zMiU4@4Jsx+qQ+O^Os2c1Z5y2Rx5^Gr=W1qr!%?E*6oZld+~ zEZn`wpQTxJ@d{21lkgt}E+h<69$p<|<crxm;oY{)5yTb%G#7 z^BflhfFlUnJ$Wl7E)TJFYagqtKe~X8jSYr}k1#oTzr7I=%&c(Q3{S;@x#Q#L|>L=UOQ8p-?}Tmt-wqvl}fHwd)^ouJIi0C W32bOC5q{nP0000 \ No newline at end of file diff --git a/share/icons/database/C56_KAddressBook.png b/share/icons/database/C56_KAddressBook.png deleted file mode 100644 index e24b44ad3be0bac3b47b2430ee21a9974dfc7557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmV-I1HJr-P)pO^#9bb3xu+LF30b}93(w2n=hY7+@jt`p>=}@*Q6o~9h>@!! zAYL8;B&mS86Mif;0!Ru&xOUbx_10NU5F{!LZZP1xN`)Xz4E!=9fjLSbbv!Un3E9#q z%a0om3>;}&&(LI5=^p{|nW2zx ziduK8?*2DhKUve_U}ra3)?CTOk5U-2OxYrc#me7+C|wc)HcSH2{pRktnPW5AynNNr z!*^x}O>Itg*+_l8p0lsSQ4%gI{s~OdCO}v+Ry8(TeR|QkER**3S@*TqCK_t`Y53sa z%SI>5KiS#sB2BK3oVIVKSMVKn9;0{01qZB+*_3cRz53*{6CPuSk!`MCzV9G!lr{6h z(*|BO_EG=d$%@Ydw7Q*KSE8XPMDhVZAfoq1wH6#*LQkiS9xrM6;$e-&$(IcdJ}~w1 z(u+o(d1_(NTQ{rPz09q;Kv_bt3&4B;KzK%IsirWC*X!TWY#(5q#m-ubja8rReE8AD zl4=J}-l=6lSsyRfRxoz8 zMh_1^F)|~6Ek$y1B>>5w`{D3W24>DaI@$ere=a?hUF`CZy1|Sdpe* zz|@>{hNX}1ktl|}1#l3+Wc)L+4}?+v3cq0gB9Tv0nC)F)$&;7i2wiq M07*qoM6N<$g7koNCIA2c diff --git a/share/icons/database/C56_KAddressBook.svg b/share/icons/database/C56_KAddressBook.svg new file mode 100644 index 00000000..cceebf11 --- /dev/null +++ b/share/icons/database/C56_KAddressBook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C57_View_Text.png b/share/icons/database/C57_View_Text.png deleted file mode 100644 index afaa8132e9793050650e5d5f9b4aed2f7ef41c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmV<50wDc~P){$K7@NMt=4P_6{xflXRJbsD05cFVL;w?vLc(?#&cXDHj2jP>5XG@? zPl>gqcg)Q{r8Zh)a&nT@)m3I^AEQZe&S4m4Le^%@v`}!%D z_X6O3pi=2W)ev!*8D>V7MRx4!A#Noit{9NV$Z)mFaJ5>PH0bTEaOu)T{-uTab<7Jv z#UswM^tsN$%eM>;4NXty(#msf~U5dl@hOlh?;1}bH2hk)~hXpT;nQyU+nHZ}%8o+l0+8sOTsD}VQ& zb$B!P6T=m+;GAb|Wtk84MfwK@7#uuGqtT>ZualCZ3aW~#k!3kY`u8Dn7{e114(~l5 z>z{b|aE8gVXBZk9q}gmTJNtx~C!BMrDW*oN-DYaMhVMH9BE^8L)nek@6ccBsx)xhh zj~?Xq?VDfk>G^v5AY+DXMf#8I#Z;jBHzIu%R&@YClarg#c RxcC47002ovPDHLkV1oShP-OrB diff --git a/share/icons/database/C57_View_Text.svg b/share/icons/database/C57_View_Text.svg new file mode 100644 index 00000000..aba208d9 --- /dev/null +++ b/share/icons/database/C57_View_Text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C58_KGPG.png b/share/icons/database/C58_KGPG.png deleted file mode 100644 index a842c79713b73cf5648f5ade7853c20b48cbe81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 939 zcmV;c162HpP)17mqtyriPYB(>aq}ngd}`P(sM4HjwH?MX-0nQ8{3>Sr)Ot+F6z1aoX6)p=Q+=>&qwXA=E%U)>a9(!U>6a5 zL9t7XGBlb!nJwoBU)Z5kV3`G?PMAgCK~7I3;}=f6(+|=A=md5vMy`K} z$eLg7OoZj_gP+R9h{$4I}z?Yft6OFLa{?euqhX$V2E37#5!Wt;LmuwQp8=!CjJ5JeRrkS>;4 zv0y$6k!1tFV}ofkldf=lA;Ps)m&T4(RUK;Er&AtCfw%17;(|i4f#&Wy%x7UaULX*Q zB6Bk=#SPYqEktvgoM@Ex*6Vc#*5T-_8)U>1yk3Q&s)bNn;4PBaNOYd7=lhvzu=#!+JBO)RXzSUa0yZ@FwsUIegW%TjGa(LrQ=GH{yQQgX=Og~Q`~9jWq?IeUM$Rp!W97{4 zzv8%;KLfr}+W>$BH1*VZ|5z}^Oq87gzyN \ No newline at end of file diff --git a/share/icons/database/C58_KPGP.svg b/share/icons/database/C58_KPGP.svg new file mode 100644 index 00000000..aaa0fef8 --- /dev/null +++ b/share/icons/database/C58_KPGP.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C59_Package_Development.png b/share/icons/database/C59_Package_Development.png deleted file mode 100644 index b740c987b376d643fcbb8978cb7352c86f9cca59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 847 zcmV-V1F-ywP)G7WwC z(CKvAn3yB>qTgw8!J9YJ&H*Qw_$j;7tA081=%;WKZrfCoggKp^l=;%yEH2!N=lsE+%M4{>B{ z0-wEjg~P8Wv8bdBC1Ob<{0#w-l8D*Pkhfc`R_l00MTM)ay&aocTCw}76I;9baPVFU z<|T!GC1t^|U)XGy*Jj?%;n?UnR#sJFLSoYION9mQ(drDunQQo|$A*VB%*%ZN>FF7B zlT)+U)7y`6ak0Nh>Rhl~TGN{w3h%3az@>6b>+_fiwrUj;B$tg>zX=$6pn7aTx zvP58DdxMb7^TsZ`=|^B~zKZlw-WVc*1kMV*-YefmpmVCm{e zB?A$k1FKH$xP4NKw~hy3Y@lkLczI?AfKO52E0KXh!tRn%%7KQFEArJ@Cg6_002ovPDHLkV1oRQhvWbN diff --git a/share/icons/database/C59_Package_Development.svg b/share/icons/database/C59_Package_Development.svg new file mode 100644 index 00000000..f989becc --- /dev/null +++ b/share/icons/database/C59_Package_Development.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C60_KFM_Home.png b/share/icons/database/C60_KFM_Home.png deleted file mode 100644 index 8076b8e248d154e3b541750dfcce4d3426127f08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 869 zcmV-r1DgDaP)~2D}lC=CTVxG$!=!n{qV39FW!9Mcl?)=^)*)qylgt69OQCeAPaZ;u2NB8TW-c;(XM*Pw|Gfdq^uQ6MmcLa=GY?E9;0U#D;ZKuE_S^t_qHL5Jjht;2k~ma+%_@gAiu%J(qN$hV|(PBsdtP1#Jv{zDHo?p=-_7 zuX0+*&jOuBBd?4R_jiL0a4X&D+gsF^AChQ6(z3J@(832VAn`r=<1V>aZ%oPGwOX!9 zr}XOaCo0|jJ%ERkDY7-7>dWN^@-M7Z=c7sz_H)@Nm))lt~-;7Do z8)c&B)`jn+)}hCSWS*X&GP$4mYgGy)?CW;8v>;e%$Bb;Bdbm9h!2VuS}5HHIaktAPzBp9MQP7#GluH;pZPN+PS%_&AFwO zTMhUQz \ No newline at end of file diff --git a/share/icons/database/C61_Services.png b/share/icons/database/C61_Services.png deleted file mode 100644 index 66478f4ad8881df379864b92fc94e60ebdac13c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmV-k1EKthP){`z~L;`q|{0b z*c1Sx#e!#+E|taz5+Dj8sH-oEFvo~hSX-v(R7czCZ z=D~Ni7V5gj2s8fp;cLI_`FX0Trus%%64J_CsH?85*njl&k?`$k_mwSsH#J+aod4>@ zEESTJG*4C}rc_)b31XHAc~o67dEl()U;OExFwCm4J8Jh&ys^5c<)J=q6(}dfjFjG6+FBoOVuj5_ic%~!9;|(z$Z;J7FQ;a7HF+H&&P7JlpV>c3jWP9X2 zJR72I!m-9;Yo@A)d@qdy6#B{a3AJ4+>ziirF*1OpBv>ivjPxunKGCtElvmqN+bVPC zgLJycl3}5##{*++i<*ST0U(*jEap(t-MpzVypH-#e|~?`_zTBwzWLJ88`Ho4MMs~$ z(KTUZW9`EL;4lv3#}HOs*!@U3PQ4$GKGz+G66dhKhtgwB;kUDU?u+r-NAax(2W|#R z0QTYw?5oc0xG=FMezLJSUBY)*lEWHQp`Q;Aj`x(mdbBrI3F81>#V$-FVfj5d-{g56 opb|r9L>=y8TX)`}L>L43A3zKbH*4AWivR!s07*qoM6N<$f{u@n4*&oF diff --git a/share/icons/database/C61_Services.svg b/share/icons/database/C61_Services.svg new file mode 100644 index 00000000..3681a83e --- /dev/null +++ b/share/icons/database/C61_Services.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C62_Tux.png b/share/icons/database/C62_Tux.png deleted file mode 100644 index c22c15e2cf202ce61faf6cc12a5dcd3b72367d76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 530 zcmV+t0`2{YP)sK@d49J|*r%&_p@-iR+YisMDKY!xXU}a^+$;r87$r2?cC0kqDNs}f4 z^-P#B0jCBgCMHKmM{{%Y$jHc~#6%z|CMITJV1Ql2xpU`$=FP0s+da|fnsn? zvM!8}1Df*r^Jgp?>gwu%8rFAP-B@aHd7<8wMS8ba7)>m*01EEhxf5N(u3fuWSy??j zJ^%dq{p;=dZ+Dk`zrW)5r`tdu13kmT!vnM*MT44}8qlP(XV3n}0Q>jv2TB38AvA2+ zvIQt4Dk}OP8~FYEHy0Nd#5kyi*w|Pg-_+FfKMnw~zpShbszF{}9>_N{GsC4pU0ofh z02tg*4b05UK)#TW(4RklFjas5{v8;bKn0A9j8F|#RaL-b0~Bg+Z~yo2AF}GdfByny zfl{TVr9d?(@nEPakr^m8snobR$HKx$&D=;0$e2)U2o%)U5JQiLU$2h8+-mb?n-v5- zTx))BwHciIe6#hBmq*cK`pK#On>+JwY|Fg4v+(KJX)i9!xVftk%*}srycezv0QW \ No newline at end of file diff --git a/share/icons/database/C63_Feather.png b/share/icons/database/C63_Feather.png deleted file mode 100644 index 307deac8a7147c39497fb785c45204d0426e139a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmV;H0crk;P)6La~T$*G0f)gTVl~+-o$7dL7H)_4}Sa=wx5M4;qVPb zk?qlHK~atuwgqE0dkKY}IF4r+tDIi%7~K=}TJ4c#?*jqr#L46oZ40KR3107=-*2_~ zUEeuDp3kpY*5vu~s4Z+)tE+0&m2(KP> \ No newline at end of file diff --git a/share/icons/database/C64_Apple.png b/share/icons/database/C64_Apple.png deleted file mode 100644 index d799fec0a6592b084c1bd6a69da02ff24325483c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmV<40U`d0P)&?EGquGj1B zc9UmS_xt_h7wZ30EEec^QT)qR;Znwj_SS)^oPN&mXw-3D6a5$u4 zEEYST&xga|gY<#p@#wm4r_-TTyWNgNBK3N`R4Qe&*?2sjPNxIFX0w@0CiD56*LS;J z$V?`~fp{E}$)u)f^z?zzXykd`uMkQ4{XRQrwOZ9`wNNPVdQHf-?H4c}kC)5kpAaOE z3}#st08JE-N~Qb`v)RlOnog%YI*vnIH1K+g`8d2$7Xx$WShqWdL2*CE$mqWJ)Bj+%!$xtcaaTH&_5@Hk+mpV-Pf#%kggI zMqE??ptvI@<{K+>t4R=dFFgT(o$5l$Ck3oL0f5@?_t9vSk=E-qTMCE6EaTnq1nUl~ U46#6w1poj507*qoM6N<$g6w0|-2eap diff --git a/share/icons/database/C64_Apple.svg b/share/icons/database/C64_Apple.svg new file mode 100644 index 00000000..efca9f4f --- /dev/null +++ b/share/icons/database/C64_Apple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C65_W.png b/share/icons/database/C65_W.png deleted file mode 100644 index d3315b36cdaa45d4996bbccb2d3a6cc5c3249623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 452 zcmV;#0XzPQP)I+yy4qU){vt2O5n=EEXe4l4aTHbSjD>`F@p3rAnm|kH<5a%w#f2rBabd zq+YMTeZjIUf*_K~BzU{sG7JMb91eH89rCBs3G1e5wpy)^k`) zwOR$E!~JQy-S&O|ahG&mhe?)Y@N6~%QxvsWEFdLG3d8U*fV$CW6h7>gZQDH0gKM=~ zzu)h4I?vBR(=?bAMakuIqtOVAt;FkBtJU+sa=FA9@EL{ySu7U8<#PGeNuzEekvJZY u;PH5jfaiIy0{i{``v5@@eAfN1pYH~ogs2Z`QF#mi0000 \ No newline at end of file diff --git a/share/icons/database/C66_Money.png b/share/icons/database/C66_Money.png deleted file mode 100644 index 619cea4b2eb6539722d43a908149dde1804cb7f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!3_U_tpA+{^d|u6OP(%{ zAsXkWPEzDM6u{F~J@anT^c#|8t(7W-#SJI)udC=Sq}u5Sr`mfc{Tru_ext}GnL6i!tG(mcOC)dlal6cv3G^Im-=_< zN^-}u^Cqn8DrQ)4_50iCORo&XKW|jcf6LH*l~1aHX9~xHgBQ_h)+V h`S0KJ|MKo(tP@&0jpO)45uooFJYD@<);T3K0RX!!Z!iD= diff --git a/share/icons/database/C66_Money.svg b/share/icons/database/C66_Money.svg new file mode 100644 index 00000000..3fa77413 --- /dev/null +++ b/share/icons/database/C66_Money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/icons/database/C67_Certificate.png b/share/icons/database/C67_Certificate.png deleted file mode 100644 index ba7a76799314b5ec8f79e8b6d3cbf6030542bedd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmV+b0{{JqP)A3kuO-1{3XUjh(MyZ{s7_ z+F5$(ER2OV#!@Yek@x^$EDV?sGa#2C&M=(4|0N{8z+R+E<7i#X^R2o4-u`fS>{3xiiWxcQMu7mTx@^>}_t#n|qI+JR zSiCiLqnrL5q#h(>)^$DT_m9%Ra!l~c7tWWhc(}P67^0n^4f?}o*i=PnArdB6S+rVZ zl|3hDr@MFd+$1fUSrl-%fA~9fA*CkQby&D^(NLu~kGEbvuO^q~Uc3(>2#Sn?%#}$q z2GVF8Z%^Qq4d1=pTHEY?{`Bj^M`JWZ2o$4$>8a_X*6zQ0GSu!s+mehHlP4k=#_(SN(A(J9 zyz^jkZt3Uk`&jJEvmKBfq>Rrto{ooVwlzzbs0fqf06~}IlrrSX-+Eu~j^B%&dgUM; z95o4oNXY>QkaY^Q~HvR5KKWQ5Z&K7|}o6XWkpqkPq?z0000 \ No newline at end of file diff --git a/share/icons/database/C68_BlackBerry.png b/share/icons/database/C68_BlackBerry.png deleted file mode 100644 index 9f7e4db3962873a475cc68748c889fe03eed35eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i`mP)#*FER{+% z+U>T&aU6odAkEckHFUdOh@z;c)9I1kdcGe}sZ^AFArH6PjYK?7G7R$h2N;HdSZq%2 zuO9#e#>cR;x&>Roudl2wf@L|}WwLMtFbsp^`2|!M7N%uEA^?TwsDkzT+;D(~Y2kx0 zG3jz)R&pcLY?6z7?>Pg=8h43U^NqqU2)I=>ymw7_es-M!EQ9^2DBesH*RLvyM(a=6 ze>MPs1?XBG)m9r^y^dx3AaRdn!XoYnD1NHAINyc$s)W?WChdHAdWLOL#N+g|GoT|2 z2&^Q~x_QE6WP)~g5fMu>GvslHP@p^;2p{B-Exh39@Px>=Pj}ZmYo46=~As$ z>F8>jMgewg=OjrQZVv22EX&dOG{sm&;a2Vxs89twnDpFMykw|37K_W$+P6s^C zQ|Yvb#JaA->-9PVLZML8@AoUwX!P$o$z+nof*>^e>%RcLlb>KtbRK{J0000 \ No newline at end of file diff --git a/share/icons/icons.qrc b/share/icons/icons.qrc index 4f01feca..c1d74ba8 100644 --- a/share/icons/icons.qrc +++ b/share/icons/icons.qrc @@ -87,74 +87,78 @@ application/scalable/status/dialog-warning.svg application/scalable/status/security-high.svg - database/C00_Password.png - database/C01_Package_Network.png - database/C02_MessageBox_Warning.png - database/C03_Server.png - database/C04_Klipper.png - database/C05_Edu_Languages.png - database/C06_KCMDF.png - database/C07_Kate.png - database/C08_Socket.png - database/C09_Identity.png - database/C10_Kontact.png - database/C11_Camera.png - database/C12_IRKickFlash.png - database/C13_KGPG_Key3.png - database/C14_Laptop_Power.png - database/C15_Scanner.png - database/C16_Mozilla_Firebird.png - database/C17_CDROM_Unmount.png - database/C18_Display.png - database/C19_Mail_Generic.png - database/C20_Misc.png - database/C21_KOrganizer.png - database/C22_ASCII.png - database/C23_Icons.png - database/C24_Connect_Established.png - database/C25_Folder_Mail.png - database/C26_FileSave.png - database/C27_NFS_Unmount.png - database/C28_QuickTime.png - database/C29_KGPG_Term.png - database/C30_Konsole.png - database/C31_FilePrint.png - database/C32_FSView.png - database/C33_Run.png - database/C34_Configure.png - database/C35_KRFB.png - database/C36_Ark.png - database/C37_KPercentage.png - database/C38_Samba_Unmount.png - database/C39_History.png - database/C40_Mail_Find.png - database/C41_VectorGfx.png - database/C42_KCMMemory.png - database/C43_EditTrash.png - database/C44_KNotes.png - database/C45_Cancel.png - database/C46_Help.png - database/C47_KPackage.png - database/C48_Folder.png - database/C49_Folder_Blue_Open.png - database/C50_Folder_Tar.png - database/C51_Decrypted.png - database/C52_Encrypted.png - database/C53_Apply.png - database/C54_Signature.png - database/C55_Thumbnail.png - database/C56_KAddressBook.png - database/C57_View_Text.png - database/C58_KGPG.png - database/C59_Package_Development.png - database/C60_KFM_Home.png - database/C61_Services.png - database/C62_Tux.png - database/C63_Feather.png - database/C64_Apple.png - database/C65_W.png - database/C66_Money.png - database/C67_Certificate.png - database/C68_BlackBerry.png + database/C00_Password.svg + database/C01_Package_Network.svg + database/C02_MessageBox_Warning.svg + database/C03_Server.svg + database/C04_Klipper.svg + database/C05_Edu_Languages.svg + database/C06_KCMDF.svg + database/C07_Kate.svg + database/C08_Socket.svg + database/C09_Identity.svg + database/C10_Kontact.svg + database/C11_Camera.svg + database/C12_IRKickFlash.svg + database/C13_KGPG_Key3.svg + database/C14_Laptop_Power.svg + database/C15_Scanner.svg + database/C16_Mozilla_Firebird.svg + database/C17_CDROM_Unmount.svg + database/C18_Display.svg + database/C19_Mail_Generic.svg + database/C20_Misc.svg + database/C21_KOrganizer.svg + database/C22_ASCII.svg + database/C23_Icons.svg + database/C24_Connect_Established.svg + database/C25_Folder_Mail.svg + database/C26_FileSave.svg + database/C27_NFS_Unmount.svg + database/C28_QuickTime.svg + database/C29_KGPG_Term.svg + database/C30_Konsole.svg + database/C31_FilePrint.svg + database/C32_FSView.svg + database/C33_Run.svg + database/C34_Configure.svg + database/C35_KRFB.svg + database/C36_Ark.svg + database/C37_KPercentage.svg + database/C38_Samba_Unmount.svg + database/C39_History.svg + database/C40_Mail_Find.svg + database/C41_VectorGfx.svg + database/C42_KCMMemory.svg + database/C43_EditTrash.svg + database/C44_KNotes.svg + database/C45_Cancel.svg + database/C46_Help.svg + database/C47_KPackage.svg + database/C48_Folder.svg + database/C49_Folder_Blue_Open.svg + database/C50_Folder_Tar.svg + database/C51_Decrypted.svg + database/C52_Encrypted.svg + database/C53_Apply.svg + database/C54_Signature.svg + database/C55_Thumbnail.svg + database/C56_KAddressBook.svg + database/C57_View_Text.svg + database/C58_KGPG.svg + database/C59_Package_Development.svg + database/C60_KFM_Home.svg + database/C61_Services.svg + database/C62_Tux.svg + database/C63_Feather.svg + database/C64_Apple.svg + database/C65_W.svg + database/C66_Money.svg + database/C67_Certificate.svg + database/C68_BlackBerry.svg + + badges/0_ShareActive.svg + badges/1_ShareInactive.svg + badges/2_Expired.svg diff --git a/share/icons/minify.sh b/share/icons/minify.sh new file mode 100644 index 00000000..6286031a --- /dev/null +++ b/share/icons/minify.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +NC='\033[0m' +YELLOW='\033[0;33m' + +# Build desktop icon +echo "Creating desktop icon PNG..." +if command -v "inkscape" &> /dev/null; then + inkscape -z -w 256 -h 256 icons/application/scalable/apps/keepassxc.svg -e icons/application/256x256/apps/keepassxc.png +else + echo -e "${YELLOW}Could not find inkscape; keepassxc.png not built!${NC}" +fi + +# Minify SVG's +echo "Minifying SVG's..." +minify -o icons/badges --match=.svg icons/badges +minify -o icons/database --match=.svg icons/database + +# Crush PNG's +echo "Crushing PNG's..." +find "." -iname '*png' -exec pngcrush -ow -brute {} \; diff --git a/share/windows/create-ico.sh b/share/windows/create-ico.sh index 44ae06a0..d78592fe 100644 --- a/share/windows/create-ico.sh +++ b/share/windows/create-ico.sh @@ -1,7 +1,11 @@ #!/usr/bin/env bash +NC='\033[0m' +RED='\033[0;31m' +YELLOW='\033[0;33m' + if [[ -z "$1" ]]; then - echo "You must include an SVG file to convert!" + echo -e "${RED}You must include an SVG file to convert!${NC}" exit 1 fi @@ -10,6 +14,11 @@ if [[ -z "outfile" ]]; then outfile="logo.ico" fi +if ! command -v "inkscape" &> /dev/null; then + echo -e "${YELLOW}Could not find inkscape; $outfile not built!${NC}" + exit 0 +fi + echo "Generating $outfile from $1..." size_list=(16 24 32 48 64 128 256) for size in ${size_list[@]}; do diff --git a/share/wizard/background-pixmap.png b/share/wizard/background-pixmap.png index e64d87041879cad998833cc4c1403803a75ecce4..0651b38f5ccb1023dcb9154e3fe562c96135ad16 100644 GIT binary patch literal 41772 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%0Dl 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 ce +#include +#include +#include DatabaseIcons* DatabaseIcons::m_instance(nullptr); -const int DatabaseIcons::IconCount(69); -const int DatabaseIcons::ExpiredIconIndex(45); -const int DatabaseIcons::SharedIconIndex(1); -const int DatabaseIcons::UnsharedIconIndex(45); -// clang-format off -const char* const DatabaseIcons::m_indexToName[] = { - "C00_Password.png", - "C01_Package_Network.png", - "C02_MessageBox_Warning.png", - "C03_Server.png", - "C04_Klipper.png", - "C05_Edu_Languages.png", - "C06_KCMDF.png", - "C07_Kate.png", - "C08_Socket.png", - "C09_Identity.png", - "C10_Kontact.png", - "C11_Camera.png", - "C12_IRKickFlash.png", - "C13_KGPG_Key3.png", - "C14_Laptop_Power.png", - "C15_Scanner.png", - "C16_Mozilla_Firebird.png", - "C17_CDROM_Unmount.png", - "C18_Display.png", - "C19_Mail_Generic.png", - "C20_Misc.png", - "C21_KOrganizer.png", - "C22_ASCII.png", - "C23_Icons.png", - "C24_Connect_Established.png", - "C25_Folder_Mail.png", - "C26_FileSave.png", - "C27_NFS_Unmount.png", - "C28_QuickTime.png", - "C29_KGPG_Term.png", - "C30_Konsole.png", - "C31_FilePrint.png", - "C32_FSView.png", - "C33_Run.png", - "C34_Configure.png", - "C35_KRFB.png", - "C36_Ark.png", - "C37_KPercentage.png", - "C38_Samba_Unmount.png", - "C39_History.png", - "C40_Mail_Find.png", - "C41_VectorGfx.png", - "C42_KCMMemory.png", - "C43_EditTrash.png", - "C44_KNotes.png", - "C45_Cancel.png", - "C46_Help.png", - "C47_KPackage.png", - "C48_Folder.png", - "C49_Folder_Blue_Open.png", - "C50_Folder_Tar.png", - "C51_Decrypted.png", - "C52_Encrypted.png", - "C53_Apply.png", - "C54_Signature.png", - "C55_Thumbnail.png", - "C56_KAddressBook.png", - "C57_View_Text.png", - "C58_KGPG.png", - "C59_Package_Development.png", - "C60_KFM_Home.png", - "C61_Services.png", - "C62_Tux.png", - "C63_Feather.png", - "C64_Apple.png", - "C65_W.png", - "C66_Money.png", - "C67_Certificate.png", - "C68_BlackBerry.png" -}; -// clang-format on - -QImage DatabaseIcons::icon(int index) +namespace { - if (index < 0 || index >= IconCount) { - qWarning("DatabaseIcons::icon: invalid icon index %d", index); - return {}; - } + const QString iconDir = QStringLiteral(":/icons/database/"); + QStringList iconList; - if (!m_iconCache[index].isNull()) { - return m_iconCache[index]; - } - QImage icon(QStringLiteral(":/icons/database/").append(m_indexToName[index])); - m_iconCache[index] = icon; - return icon; -} - -QPixmap DatabaseIcons::iconPixmap(int index) -{ - if (index < 0 || index >= IconCount) { - qWarning("DatabaseIcons::iconPixmap: invalid icon index %d", index); - return QPixmap(); - } - - QPixmap pixmap; - - if (!QPixmapCache::find(m_pixmapCacheKeys[index], &pixmap)) { - pixmap = QPixmap::fromImage(icon(index)); - m_pixmapCacheKeys[index] = QPixmapCache::insert(pixmap); - } - - return pixmap; -} + const QString badgeDir = QStringLiteral(":/icons/badges/"); + QStringList badgeList; +} // namespace DatabaseIcons::DatabaseIcons() { - Q_STATIC_ASSERT(sizeof(m_indexToName) == IconCount * sizeof(m_indexToName[0])); + // Set the pixmap cache limit to 20 MB + QPixmapCache::setCacheLimit(20480); - m_iconCache.reserve(IconCount); - m_iconCache.resize(IconCount); - m_pixmapCacheKeys.reserve(IconCount); - m_pixmapCacheKeys.resize(IconCount); + iconList = QDir(iconDir).entryList(QDir::NoFilter, QDir::Name); + badgeList = QDir(badgeDir).entryList(QDir::NoFilter, QDir::Name); } DatabaseIcons* DatabaseIcons::instance() @@ -149,3 +54,55 @@ DatabaseIcons* DatabaseIcons::instance() return m_instance; } + +QPixmap DatabaseIcons::icon(int index, IconSize size) +{ + if (index < 0 || index >= count()) { + qWarning("DatabaseIcons::icon: invalid icon index %d", index); + return {}; + } + + auto cacheKey = QString::number(index); + auto icon = m_iconCache.value(cacheKey); + if (icon.isNull()) { + icon.addFile(iconDir + iconList[index]); + icon.addPixmap(icon.pixmap(IconSize::Default)); + icon.addPixmap(icon.pixmap(IconSize::Medium)); + icon.addPixmap(icon.pixmap(IconSize::Large)); + m_iconCache.insert(cacheKey, icon); + } + + return icon.pixmap(size); +} + +QPixmap DatabaseIcons::applyBadge(const QPixmap& basePixmap, Badges badgeIndex) +{ + const auto cacheKey = QStringLiteral("badgedicon-%1-%2").arg(basePixmap.cacheKey()).arg(badgeIndex); + QPixmap pixmap = basePixmap; + if (badgeIndex < 0 || badgeIndex >= badgeList.size()) { + qWarning("DatabaseIcons: Out-of-range badge index given to applyBadge: %d", badgeIndex); + } else if (!QPixmapCache::find(cacheKey, &pixmap)) { + int baseSize = basePixmap.width(); + int badgeSize = baseSize <= IconSize::Default * basePixmap.devicePixelRatio() ? baseSize * 0.6 : baseSize * 0.5; + QPoint badgePos(baseSize - badgeSize, baseSize - badgeSize); + badgePos /= basePixmap.devicePixelRatio(); + + QImageReader reader(badgeDir + badgeList[badgeIndex]); + reader.setScaledSize({badgeSize, badgeSize}); + auto badge = QPixmap::fromImageReader(&reader); + badge.setDevicePixelRatio(basePixmap.devicePixelRatio()); + + QPainter painter(&pixmap); + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); + painter.drawPixmap(badgePos, badge); + + QPixmapCache::insert(cacheKey, pixmap); + } + + return pixmap; +} + +int DatabaseIcons::count() +{ + return iconList.size(); +} diff --git a/src/core/DatabaseIcons.h b/src/core/DatabaseIcons.h index ecd38fd8..9f33644e 100644 --- a/src/core/DatabaseIcons.h +++ b/src/core/DatabaseIcons.h @@ -18,32 +18,32 @@ #ifndef KEEPASSX_DATABASEICONS_H #define KEEPASSX_DATABASEICONS_H -#include -#include -#include -#include +#include "core/Global.h" +#include class DatabaseIcons { public: - QImage icon(int index); - QPixmap iconPixmap(int index); - static DatabaseIcons* instance(); - static const int IconCount; - static const int ExpiredIconIndex; - static const int SharedIconIndex; - static const int UnsharedIconIndex; + static constexpr int ExpiredIconIndex = 45; + + enum Badges + { + ShareActive = 0, + ShareInactive, + Expired + }; + + QPixmap icon(int index, IconSize size = IconSize::Default); + QPixmap applyBadge(const QPixmap& basePixmap, Badges badgeIndex); + int count(); private: DatabaseIcons(); static DatabaseIcons* m_instance; - - static const char* const m_indexToName[]; - QVector m_iconCache; - QVector m_pixmapCacheKeys; + QHash m_iconCache; Q_DISABLE_COPY(DatabaseIcons) }; diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index a5e372d0..fc553f9e 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -163,7 +163,7 @@ const QString Entry::uuidToHex() const QImage Entry::icon() const { if (m_data.customIcon.isNull()) { - return databaseIcons()->icon(m_data.iconNumber); + return databaseIcons()->icon(m_data.iconNumber).toImage(); } else { Q_ASSERT(database()); @@ -175,27 +175,23 @@ QImage Entry::icon() const } } -QPixmap Entry::iconPixmap() const +QPixmap Entry::iconPixmap(IconSize size) const { + QPixmap icon(size, size); if (m_data.customIcon.isNull()) { - return databaseIcons()->iconPixmap(m_data.iconNumber); + icon = databaseIcons()->icon(m_data.iconNumber, size); + } else { + Q_ASSERT(database()); + if (database()) { + icon = database()->metadata()->customIconPixmap(m_data.customIcon, size); + } } - Q_ASSERT(database()); - if (database()) { - return database()->metadata()->customIconPixmap(m_data.customIcon); + if (isExpired()) { + icon = databaseIcons()->applyBadge(icon, DatabaseIcons::Badges::Expired); } - return QPixmap(); -} -QPixmap Entry::iconScaledPixmap() const -{ - if (m_data.customIcon.isNull()) { - // built-in icons are 16x16 so don't need to be scaled - return databaseIcons()->iconPixmap(m_data.iconNumber); - } - Q_ASSERT(database()); - return database()->metadata()->customIconScaledPixmap(m_data.customIcon); + return icon; } int Entry::iconNumber() const @@ -1104,9 +1100,8 @@ void Entry::setGroup(Group* group) m_group->database()->addDeletedObject(m_uuid); // copy custom icon to the new database - if (!iconUuid().isNull() && group->database() - && m_group->database()->metadata()->containsCustomIcon(iconUuid()) - && !group->database()->metadata()->containsCustomIcon(iconUuid())) { + if (!iconUuid().isNull() && group->database() && m_group->database()->metadata()->hasCustomIcon(iconUuid()) + && !group->database()->metadata()->hasCustomIcon(iconUuid())) { group->database()->metadata()->addCustomIcon(iconUuid(), icon()); } } diff --git a/src/core/Entry.h b/src/core/Entry.h index 3d42692c..cbaf3e2c 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -31,6 +31,7 @@ #include "core/CustomData.h" #include "core/EntryAttachments.h" #include "core/EntryAttributes.h" +#include "core/Global.h" #include "core/TimeInfo.h" class Database; @@ -81,8 +82,7 @@ public: const QUuid& uuid() const; const QString uuidToHex() const; QImage icon() const; - QPixmap iconPixmap() const; - QPixmap iconScaledPixmap() const; + QPixmap iconPixmap(IconSize size = IconSize::Default) const; int iconNumber() const; const QUuid& iconUuid() const; QString foregroundColor() const; diff --git a/src/core/Global.h b/src/core/Global.h index 0821687e..9cb89029 100644 --- a/src/core/Global.h +++ b/src/core/Global.h @@ -46,6 +46,13 @@ static const auto TRUE_STR = QStringLiteral("true"); static const auto FALSE_STR = QStringLiteral("false"); +enum IconSize +{ + Default = 24, + Medium = 32, + Large = 40 +}; + template struct AddConst { typedef const T Type; diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 7ce795f1..d9782a7c 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -17,6 +17,7 @@ */ #include "Group.h" +#include "config-keepassx.h" #include "core/Clock.h" #include "core/Config.h" @@ -25,6 +26,10 @@ #include "core/Metadata.h" #include "core/Tools.h" +#ifdef WITH_XC_KEESHARE +#include "keeshare/KeeShare.h" +#endif + #include const int Group::DefaultIconNumber = 48; @@ -128,10 +133,9 @@ QString Group::notes() const QImage Group::icon() const { if (m_data.customIcon.isNull()) { - return databaseIcons()->icon(m_data.iconNumber); + return databaseIcons()->icon(m_data.iconNumber).toImage(); } else { Q_ASSERT(m_db); - if (m_db) { return m_db->metadata()->customIcon(m_data.customIcon); } else { @@ -140,35 +144,28 @@ QImage Group::icon() const } } -QPixmap Group::iconPixmap() const +QPixmap Group::iconPixmap(IconSize size) const { + QPixmap icon(size, size); if (m_data.customIcon.isNull()) { - return databaseIcons()->iconPixmap(m_data.iconNumber); + icon = databaseIcons()->icon(m_data.iconNumber, size); } else { Q_ASSERT(m_db); - if (m_db) { - return m_db->metadata()->customIconPixmap(m_data.customIcon); - } else { - return QPixmap(); + icon = m_db->metadata()->customIconPixmap(m_data.customIcon, size); } } -} -QPixmap Group::iconScaledPixmap() const -{ - if (m_data.customIcon.isNull()) { - // built-in icons are 16x16 so don't need to be scaled - return databaseIcons()->iconPixmap(m_data.iconNumber); - } else { - Q_ASSERT(m_db); - - if (m_db) { - return m_db->metadata()->customIconScaledPixmap(m_data.customIcon); - } else { - return QPixmap(); - } + if (isExpired()) { + icon = databaseIcons()->applyBadge(icon, DatabaseIcons::Badges::Expired); } +#ifdef WITH_XC_KEESHARE + else if (KeeShare::isShared(this)) { + icon = KeeShare::indicatorBadge(this, icon); + } +#endif + + return icon; } int Group::iconNumber() const @@ -452,8 +449,8 @@ void Group::setParent(Group* parent, int index) recCreateDelObjects(); // copy custom icon to the new database - if (!iconUuid().isNull() && parent->m_db && m_db->metadata()->containsCustomIcon(iconUuid()) - && !parent->m_db->metadata()->containsCustomIcon(iconUuid())) { + if (!iconUuid().isNull() && parent->m_db && m_db->metadata()->hasCustomIcon(iconUuid()) + && !parent->m_db->metadata()->hasCustomIcon(iconUuid())) { parent->m_db->metadata()->addCustomIcon(iconUuid(), icon()); } } diff --git a/src/core/Group.h b/src/core/Group.h index 7adabc8b..8ff33d8d 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -21,12 +21,12 @@ #include #include -#include #include #include "core/CustomData.h" #include "core/Database.h" #include "core/Entry.h" +#include "core/Global.h" #include "core/TimeInfo.h" class Group : public QObject @@ -85,8 +85,7 @@ public: QString name() const; QString notes() const; QImage icon() const; - QPixmap iconPixmap() const; - QPixmap iconScaledPixmap() const; + QPixmap iconPixmap(IconSize size = IconSize::Default) const; int iconNumber() const; const QUuid& iconUuid() const; const TimeInfo& timeInfo() const; diff --git a/src/core/Merger.cpp b/src/core/Merger.cpp index 2becd8a6..83b1e5a4 100644 --- a/src/core/Merger.cpp +++ b/src/core/Merger.cpp @@ -612,12 +612,11 @@ Merger::ChangeList Merger::mergeMetadata(const MergeContext& context) auto* sourceMetadata = context.m_sourceDb->metadata(); auto* targetMetadata = context.m_targetDb->metadata(); - const auto keys = sourceMetadata->customIcons().keys(); - for (QUuid customIconId : keys) { - if (!targetMetadata->containsCustomIcon(customIconId)) { - QImage customIcon = sourceMetadata->customIcon(customIconId); - targetMetadata->addCustomIcon(customIconId, customIcon); - changes << tr("Adding missing icon %1").arg(QString::fromLatin1(customIconId.toRfc4122().toHex())); + for (const auto& iconUuid : sourceMetadata->customIconsOrder()) { + if (!targetMetadata->hasCustomIcon(iconUuid)) { + QImage customIcon = sourceMetadata->customIcon(iconUuid); + targetMetadata->addCustomIcon(iconUuid, customIcon); + changes << tr("Adding missing icon %1").arg(QString::fromLatin1(iconUuid.toRfc4122().toHex())); } } diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp index c0cb9bb6..67a58b06 100644 --- a/src/core/Metadata.cpp +++ b/src/core/Metadata.cpp @@ -16,6 +16,7 @@ */ #include "Metadata.h" +#include #include #include "core/Clock.h" @@ -64,8 +65,7 @@ void Metadata::clear() { init(); m_customIcons.clear(); - m_customIconCacheKeys.clear(); - m_customIconScaledCacheKeys.clear(); + m_customIconsRaw.clear(); m_customIconsOrder.clear(); m_customIconsHashes.clear(); m_customData->clear(); @@ -178,62 +178,33 @@ bool Metadata::protectNotes() const QImage Metadata::customIcon(const QUuid& uuid) const { - return m_customIcons.value(uuid); + return m_customIconsRaw.value(uuid); } -QPixmap Metadata::customIconPixmap(const QUuid& uuid) const +QPixmap Metadata::customIconPixmap(const QUuid& uuid, IconSize size) const { - QPixmap pixmap; - - if (!m_customIcons.contains(uuid)) { - return pixmap; + if (!hasCustomIcon(uuid)) { + return {}; } - - QPixmapCache::Key& cacheKey = m_customIconCacheKeys[uuid]; - - if (!QPixmapCache::find(cacheKey, &pixmap)) { - pixmap = QPixmap::fromImage(m_customIcons.value(uuid)); - QPixmapCache::insert(pixmap); - } - - return pixmap; + return m_customIcons.value(uuid).pixmap(size); } -QPixmap Metadata::customIconScaledPixmap(const QUuid& uuid, const QSize& size) const -{ - QPixmap pixmap; - - if (!m_customIcons.contains(uuid)) { - return pixmap; - } - - QImage image = m_customIcons.value(uuid).scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - pixmap = QPixmap::fromImage(image); - - return pixmap; -} - -bool Metadata::containsCustomIcon(const QUuid& uuid) const -{ - return m_customIcons.contains(uuid); -} - -QHash Metadata::customIcons() const -{ - return m_customIcons; -} - -QHash Metadata::customIconsScaledPixmaps(const QSize& size) const +QHash Metadata::customIconsPixmaps(IconSize size) const { QHash result; for (const QUuid& uuid : m_customIconsOrder) { - result.insert(uuid, customIconScaledPixmap(uuid, size)); + result.insert(uuid, customIconPixmap(uuid, size)); } return result; } +bool Metadata::hasCustomIcon(const QUuid& uuid) const +{ + return m_customIconsRaw.contains(uuid); +} + QList Metadata::customIconsOrder() const { return m_customIconsOrder; @@ -387,57 +358,54 @@ void Metadata::setProtectNotes(bool value) set(m_data.protectNotes, value); } -void Metadata::addCustomIcon(const QUuid& uuid, const QImage& icon) +void Metadata::addCustomIcon(const QUuid& uuid, const QImage& image) { Q_ASSERT(!uuid.isNull()); - Q_ASSERT(!m_customIcons.contains(uuid)); + Q_ASSERT(!m_customIconsRaw.contains(uuid)); - m_customIcons[uuid] = icon; - // reset cache in case there is also an icon with that uuid - m_customIconCacheKeys[uuid] = QPixmapCache::Key(); - m_customIconScaledCacheKeys[uuid] = QPixmapCache::Key(); + m_customIconsRaw[uuid] = image; // remove all uuids to prevent duplicates in release mode m_customIconsOrder.removeAll(uuid); m_customIconsOrder.append(uuid); // Associate image hash to uuid - QByteArray hash = hashImage(icon); + QByteArray hash = hashImage(image); m_customIconsHashes[hash] = uuid; - Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count()); - emit metadataModified(); -} + Q_ASSERT(m_customIconsRaw.count() == m_customIconsOrder.count()); -void Metadata::addCustomIconScaled(const QUuid& uuid, const QImage& icon) -{ - QImage iconScaled; - - // scale down to 128x128 if icon is larger - if (icon.width() > 128 || icon.height() > 128) { - iconScaled = icon.scaled(QSize(128, 128), Qt::KeepAspectRatio, Qt::SmoothTransformation); + // TODO: This check can go away when we move all QIcon handling outside of core + // On older versions of Qt, loading a QPixmap from QImage outside of a GUI + // environment causes ASAN to fail and crash on nullptr violation + static bool isGui = qApp->inherits("QGuiApplication"); + if (isGui) { + // Generate QIcon with pre-baked resolutions + auto basePixmap = QPixmap::fromImage(image).scaled(128, 128, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + QIcon icon(basePixmap); + icon.addPixmap(icon.pixmap(IconSize::Default)); + icon.addPixmap(icon.pixmap(IconSize::Medium)); + icon.addPixmap(icon.pixmap(IconSize::Large)); + m_customIcons.insert(uuid, icon); } else { - iconScaled = icon; + m_customIcons.insert(uuid, QIcon()); } - addCustomIcon(uuid, iconScaled); + emit metadataModified(); } void Metadata::removeCustomIcon(const QUuid& uuid) { Q_ASSERT(!uuid.isNull()); - Q_ASSERT(m_customIcons.contains(uuid)); + Q_ASSERT(m_customIconsRaw.contains(uuid)); // Remove hash record only if this is the same uuid - QByteArray hash = hashImage(m_customIcons[uuid]); + QByteArray hash = hashImage(m_customIconsRaw[uuid]); if (m_customIconsHashes.contains(hash) && m_customIconsHashes[hash] == uuid) { m_customIconsHashes.remove(hash); } m_customIcons.remove(uuid); - QPixmapCache::remove(m_customIconCacheKeys.value(uuid)); - m_customIconCacheKeys.remove(uuid); - QPixmapCache::remove(m_customIconScaledCacheKeys.value(uuid)); - m_customIconScaledCacheKeys.remove(uuid); + m_customIconsRaw.remove(uuid); m_customIconsOrder.removeAll(uuid); - Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count()); + Q_ASSERT(m_customIconsRaw.count() == m_customIconsOrder.count()); emit metadataModified(); } @@ -450,9 +418,9 @@ QUuid Metadata::findCustomIcon(const QImage& candidate) void Metadata::copyCustomIcons(const QSet& iconList, const Metadata* otherMetadata) { for (const QUuid& uuid : iconList) { - Q_ASSERT(otherMetadata->containsCustomIcon(uuid)); + Q_ASSERT(otherMetadata->hasCustomIcon(uuid)); - if (!containsCustomIcon(uuid) && otherMetadata->containsCustomIcon(uuid)) { + if (!hasCustomIcon(uuid) && otherMetadata->hasCustomIcon(uuid)) { addCustomIcon(uuid, otherMetadata->customIcon(uuid)); } } diff --git a/src/core/Metadata.h b/src/core/Metadata.h index 0bf59147..c61bfacb 100644 --- a/src/core/Metadata.h +++ b/src/core/Metadata.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -28,6 +29,7 @@ #include #include "core/CustomData.h" +#include "core/Global.h" class Database; class Group; @@ -82,13 +84,11 @@ public: bool protectUrl() const; bool protectNotes() const; QImage customIcon(const QUuid& uuid) const; - QPixmap customIconPixmap(const QUuid& uuid) const; - QPixmap customIconScaledPixmap(const QUuid& uuid, const QSize& size = {16, 16}) const; - bool containsCustomIcon(const QUuid& uuid) const; - QHash customIcons() const; + bool hasCustomIcon(const QUuid& uuid) const; + QPixmap customIconPixmap(const QUuid& uuid, IconSize size = IconSize::Default) const; + QHash customIconsPixmaps(IconSize size = IconSize::Default) const; QList customIconsOrder() const; bool recycleBinEnabled() const; - QHash customIconsScaledPixmaps(const QSize& size = {16, 16}) const; Group* recycleBin(); const Group* recycleBin() const; QDateTime recycleBinChanged() const; @@ -122,8 +122,7 @@ public: void setProtectPassword(bool value); void setProtectUrl(bool value); void setProtectNotes(bool value); - void addCustomIcon(const QUuid& uuid, const QImage& icon); - void addCustomIconScaled(const QUuid& uuid, const QImage& icon); + void addCustomIcon(const QUuid& uuid, const QImage& image); void removeCustomIcon(const QUuid& uuid); void copyCustomIcons(const QSet& iconList, const Metadata* otherMetadata); QUuid findCustomIcon(const QImage& candidate); @@ -161,9 +160,8 @@ private: MetadataData m_data; - QHash m_customIcons; - mutable QHash m_customIconCacheKeys; - mutable QHash m_customIconScaledCacheKeys; + QHash m_customIcons; + QHash m_customIconsRaw; QList m_customIconsOrder; QHash m_customIconsHashes; diff --git a/src/fdosecrets/widgets/SettingsModels.cpp b/src/fdosecrets/widgets/SettingsModels.cpp index 3337ad8c..1382f1f0 100644 --- a/src/fdosecrets/widgets/SettingsModels.cpp +++ b/src/fdosecrets/widgets/SettingsModels.cpp @@ -147,8 +147,7 @@ namespace FdoSecrets case Qt::DisplayRole: return group->name(); case Qt::DecorationRole: - return group->isExpired() ? databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex) - : group->iconScaledPixmap(); + return group->iconPixmap(); case Qt::FontRole: if (group->isExpired()) { QFont font; diff --git a/src/format/HtmlExporter.cpp b/src/format/HtmlExporter.cpp index cd3654e3..812af786 100644 --- a/src/format/HtmlExporter.cpp +++ b/src/format/HtmlExporter.cpp @@ -21,6 +21,7 @@ #include #include "core/Database.h" +#include "core/Global.h" #include "core/Group.h" #include "core/Metadata.h" @@ -142,7 +143,7 @@ bool HtmlExporter::writeGroup(QIODevice& device, const Group& group, QString pat // Header line auto header = QString("

"); - header.append(PixmapToHTML(group.iconScaledPixmap())); + header.append(PixmapToHTML(group.iconPixmap(IconSize::Medium))); header.append(" "); header.append(path); header.append("

\n"); @@ -166,7 +167,7 @@ bool HtmlExporter::writeGroup(QIODevice& device, const Group& group, QString pat auto item = QString("

"); // Begin formatting this item into HTML - item.append(PixmapToHTML(entry->iconScaledPixmap())); + item.append(PixmapToHTML(entry->iconPixmap(IconSize::Medium))); item.append(" "); item.append(entry->title().toHtmlEscaped()); item.append("

\n" diff --git a/src/format/KdbxXmlReader.cpp b/src/format/KdbxXmlReader.cpp index f4109a4d..4ab5c9d0 100644 --- a/src/format/KdbxXmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -368,7 +368,7 @@ void KdbxXmlReader::parseIcon() if (uuidSet && iconSet) { // Check for duplicate UUID (corruption) - if (m_meta->containsCustomIcon(uuid)) { + if (m_meta->hasCustomIcon(uuid)) { uuid = QUuid::createUuid(); } m_meta->addCustomIcon(uuid, icon); @@ -513,9 +513,9 @@ Group* KdbxXmlReader::parseGroup() raiseError(tr("Invalid group icon number")); } iconId = 0; - } else if (iconId >= DatabaseIcons::IconCount) { + } else if (iconId >= databaseIcons()->count()) { qWarning("KdbxXmlReader::parseGroup: icon id \"%d\" not supported", iconId); - iconId = DatabaseIcons::IconCount - 1; + iconId = databaseIcons()->count() - 1; } group->setIcon(iconId); diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index c9a0c031..9ffb80ae 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -132,7 +132,7 @@ void EditWidgetIcons::load(const QUuid& currentUuid, m_currentUuid = currentUuid; setUrl(url); - m_customIconModel->setIcons(database->metadata()->customIconsScaledPixmaps({24, 24}), + m_customIconModel->setIcons(database->metadata()->customIconsPixmaps(IconSize::Default), database->metadata()->customIconsOrder()); QUuid iconUuid = iconStruct.uuid; @@ -294,7 +294,7 @@ bool EditWidgetIcons::addCustomIcon(const QImage& icon) if (uuid.isNull()) { uuid = QUuid::createUuid(); m_db->metadata()->addCustomIcon(uuid, scaledicon); - m_customIconModel->setIcons(m_db->metadata()->customIconsScaledPixmaps({24, 24}), + m_customIconModel->setIcons(m_db->metadata()->customIconsPixmaps(IconSize::Default), m_db->metadata()->customIconsOrder()); added = true; } @@ -378,7 +378,7 @@ void EditWidgetIcons::removeCustomIcon() // Remove the icon from the database m_db->metadata()->removeCustomIcon(iconUuid); - m_customIconModel->setIcons(m_db->metadata()->customIconsScaledPixmaps({24, 24}), + m_customIconModel->setIcons(m_db->metadata()->customIconsPixmaps(IconSize::Default), m_db->metadata()->customIconsOrder()); // Reset the current icon view diff --git a/src/gui/EntryPreviewWidget.cpp b/src/gui/EntryPreviewWidget.cpp index 06152c55..9332bb2d 100644 --- a/src/gui/EntryPreviewWidget.cpp +++ b/src/gui/EntryPreviewWidget.cpp @@ -162,7 +162,7 @@ void EntryPreviewWidget::updateEntryHeaderLine() Q_ASSERT(m_currentEntry); const QString title = m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->title()); m_ui->entryTitleLabel->setRawText(hierarchy(m_currentEntry->group(), title)); - m_ui->entryIcon->setPixmap(preparePixmap(m_currentEntry->iconPixmap(), 16)); + m_ui->entryIcon->setPixmap(m_currentEntry->iconPixmap(IconSize::Large)); } void EntryPreviewWidget::updateEntryTotp() @@ -315,7 +315,7 @@ void EntryPreviewWidget::updateGroupHeaderLine() { Q_ASSERT(m_currentGroup); m_ui->groupTitleLabel->setRawText(hierarchy(m_currentGroup, {})); - m_ui->groupIcon->setPixmap(preparePixmap(m_currentGroup->iconPixmap(), 32)); + m_ui->groupIcon->setPixmap(m_currentGroup->iconPixmap(IconSize::Large)); } void EntryPreviewWidget::updateGroupGeneralTab() @@ -399,14 +399,6 @@ void EntryPreviewWidget::setTabEnabled(QTabWidget* tabWidget, QWidget* widget, b tabWidget->setTabEnabled(tabIndex, enabled); } -QPixmap EntryPreviewWidget::preparePixmap(const QPixmap& pixmap, int size) -{ - if (pixmap.width() > size || pixmap.height() > size) { - return pixmap.scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - } - return pixmap; -} - QString EntryPreviewWidget::hierarchy(const Group* group, const QString& title) { const QString separator("] > ["); diff --git a/src/gui/EntryPreviewWidget.h b/src/gui/EntryPreviewWidget.h index e1a7aff3..17bd62eb 100644 --- a/src/gui/EntryPreviewWidget.h +++ b/src/gui/EntryPreviewWidget.h @@ -72,7 +72,6 @@ private: void removeTab(QTabWidget* tabWidget, QWidget* widget); void setTabEnabled(QTabWidget* tabWidget, QWidget* widget, bool enabled); - static QPixmap preparePixmap(const QPixmap& pixmap, int size); static QString hierarchy(const Group* group, const QString& title); const QScopedPointer m_ui; diff --git a/src/gui/IconModels.cpp b/src/gui/IconModels.cpp index 09808926..3bdd9a5e 100644 --- a/src/gui/IconModels.cpp +++ b/src/gui/IconModels.cpp @@ -29,7 +29,7 @@ DefaultIconModel::DefaultIconModel(QObject* parent) int DefaultIconModel::rowCount(const QModelIndex& parent) const { if (!parent.isValid()) { - return DatabaseIcons::IconCount; + return databaseIcons()->count(); } else { return 0; } @@ -41,10 +41,10 @@ QVariant DefaultIconModel::data(const QModelIndex& index, int role) const return QVariant(); } - Q_ASSERT(index.row() < DatabaseIcons::IconCount); + Q_ASSERT(index.row() < databaseIcons()->count()); if (role == Qt::DecorationRole) { - return databaseIcons()->iconPixmap(index.row()); + return databaseIcons()->icon(index.row(), IconSize::Medium); } return QVariant(); diff --git a/src/gui/entry/AutoTypeMatchModel.cpp b/src/gui/entry/AutoTypeMatchModel.cpp index 4148ccc6..ac2d0f87 100644 --- a/src/gui/entry/AutoTypeMatchModel.cpp +++ b/src/gui/entry/AutoTypeMatchModel.cpp @@ -118,15 +118,11 @@ QVariant AutoTypeMatchModel::data(const QModelIndex& index, int role) const switch (index.column()) { case ParentGroup: if (match.entry->group()) { - return match.entry->group()->iconScaledPixmap(); + return match.entry->group()->iconPixmap(); } break; case Title: - if (match.entry->isExpired()) { - return databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex); - } else { - return match.entry->iconScaledPixmap(); - } + return match.entry->iconPixmap(); } } else if (role == Qt::FontRole) { QFont font; diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 8274968b..330a9cd6 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -1103,7 +1103,7 @@ void EditEntryWidget::cancel() return; } - if (!m_entry->iconUuid().isNull() && !m_db->metadata()->containsCustomIcon(m_entry->iconUuid())) { + if (!m_entry->iconUuid().isNull() && !m_db->metadata()->hasCustomIcon(m_entry->iconUuid())) { m_entry->setIcon(Entry::DefaultIconNumber); } diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index e6311f6b..6438f8ed 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -271,14 +271,11 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const switch (index.column()) { case ParentGroup: if (entry->group()) { - return entry->group()->iconScaledPixmap(); + return entry->group()->iconPixmap(); } break; case Title: - if (entry->isExpired()) { - return databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex); - } - return entry->iconScaledPixmap(); + return entry->iconPixmap(); case Paperclip: if (!entry->attachments()->isEmpty()) { return resources()->icon("paperclip"); diff --git a/src/gui/group/EditGroupWidget.cpp b/src/gui/group/EditGroupWidget.cpp index f77ae92d..b77e4986 100644 --- a/src/gui/group/EditGroupWidget.cpp +++ b/src/gui/group/EditGroupWidget.cpp @@ -236,7 +236,7 @@ void EditGroupWidget::apply() void EditGroupWidget::cancel() { - if (!m_group->iconUuid().isNull() && !m_db->metadata()->containsCustomIcon(m_group->iconUuid())) { + if (!m_group->iconUuid().isNull() && !m_db->metadata()->hasCustomIcon(m_group->iconUuid())) { m_group->setIcon(Entry::DefaultIconNumber); } diff --git a/src/gui/group/GroupModel.cpp b/src/gui/group/GroupModel.cpp index a9b61315..beba1377 100644 --- a/src/gui/group/GroupModel.cpp +++ b/src/gui/group/GroupModel.cpp @@ -130,12 +130,7 @@ QVariant GroupModel::data(const QModelIndex& index, int role) const #endif return nameTemplate.arg(group->name()); } else if (role == Qt::DecorationRole) { - QPixmap pixmap = group->isExpired() ? databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex) - : group->iconScaledPixmap(); -#if defined(WITH_XC_KEESHARE) - pixmap = KeeShare::indicatorBadge(group, pixmap); -#endif - return pixmap; + return group->iconPixmap(); } else if (role == Qt::FontRole) { QFont font; if (group->isExpired()) { @@ -304,7 +299,7 @@ bool GroupModel::dropMimeData(const QMimeData* data, Database* targetDb = parentGroup->database(); QUuid customIcon = entry->iconUuid(); - if (sourceDb != targetDb && !customIcon.isNull() && !targetDb->metadata()->containsCustomIcon(customIcon)) { + if (sourceDb != targetDb && !customIcon.isNull() && !targetDb->metadata()->hasCustomIcon(customIcon)) { targetDb->metadata()->addCustomIcon(customIcon, sourceDb->metadata()->customIcon(customIcon)); } diff --git a/src/keeshare/KeeShare.cpp b/src/keeshare/KeeShare.cpp index beff3d95..31136a5c 100644 --- a/src/keeshare/KeeShare.cpp +++ b/src/keeshare/KeeShare.cpp @@ -190,15 +190,11 @@ QPixmap KeeShare::indicatorBadge(const Group* group, QPixmap pixmap) if (!isShared(group)) { return pixmap; } - const QPixmap badge = isEnabled(group) ? databaseIcons()->iconPixmap(DatabaseIcons::SharedIconIndex) - : databaseIcons()->iconPixmap(DatabaseIcons::UnsharedIconIndex); - QImage canvas = pixmap.toImage(); - const QRectF target(canvas.width() * 0.4, canvas.height() * 0.4, canvas.width() * 0.6, canvas.height() * 0.6); - QPainter painter(&canvas); - painter.setCompositionMode(QPainter::CompositionMode_SourceOver); - painter.drawPixmap(target, badge, badge.rect()); - pixmap.convertFromImage(canvas); - return pixmap; + + if (isEnabled(group)) { + return databaseIcons()->applyBadge(pixmap, DatabaseIcons::Badges::ShareActive); + } + return databaseIcons()->applyBadge(pixmap, DatabaseIcons::Badges::ShareInactive); } QString KeeShare::referenceTypeLabel(const KeeShareSettings::Reference& reference) diff --git a/src/keeshare/ShareExport.cpp b/src/keeshare/ShareExport.cpp index c17c5052..1f7180d0 100644 --- a/src/keeshare/ShareExport.cpp +++ b/src/keeshare/ShareExport.cpp @@ -77,7 +77,7 @@ namespace targetEntry->setGroup(targetRoot); targetEntry->setUpdateTimeinfo(updateTimeinfo); const auto iconUuid = targetEntry->iconUuid(); - if (!iconUuid.isNull() && !targetMetadata->containsCustomIcon(iconUuid)) { + if (!iconUuid.isNull() && !targetMetadata->hasCustomIcon(iconUuid)) { targetMetadata->addCustomIcon(iconUuid, sourceEntry->icon()); } } diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp index 26cb0dfe..5df4b9ed 100644 --- a/tests/TestEntryModel.cpp +++ b/tests/TestEntryModel.cpp @@ -230,7 +230,7 @@ void TestEntryModel::testDefaultIconModel() DefaultIconModel* model = new DefaultIconModel(this); ModelTest* modelTest = new ModelTest(model, this); - QCOMPARE(model->rowCount(), DatabaseIcons::IconCount); + QCOMPARE(model->rowCount(), databaseIcons()->count()); delete modelTest; delete model; diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index a9acb3dc..28a9f7ec 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -336,12 +336,12 @@ void TestGroup::testCopyCustomIcon() QScopedPointer dbTarget(new Database()); group->setParent(dbTarget->rootGroup()); - QVERIFY(dbTarget->metadata()->containsCustomIcon(groupIconUuid)); + QVERIFY(dbTarget->metadata()->hasCustomIcon(groupIconUuid)); QCOMPARE(dbTarget->metadata()->customIcon(groupIconUuid), groupIcon); QCOMPARE(group->icon(), groupIcon); entry->setGroup(dbTarget->rootGroup()); - QVERIFY(dbTarget->metadata()->containsCustomIcon(entryIconUuid)); + QVERIFY(dbTarget->metadata()->hasCustomIcon(entryIconUuid)); QCOMPARE(dbTarget->metadata()->customIcon(entryIconUuid), entryIcon); QCOMPARE(entry->icon(), entryIcon); } @@ -462,11 +462,11 @@ void TestGroup::testCopyCustomIcons() Metadata* metaTarget = dbTarget->metadata(); - QCOMPARE(metaTarget->customIcons().size(), 4); - QVERIFY(metaTarget->containsCustomIcon(group1Icon)); - QVERIFY(metaTarget->containsCustomIcon(group2Icon)); - QVERIFY(metaTarget->containsCustomIcon(entry1IconOld)); - QVERIFY(metaTarget->containsCustomIcon(entry1IconNew)); + QCOMPARE(metaTarget->customIconsOrder().size(), 4); + QVERIFY(metaTarget->hasCustomIcon(group1Icon)); + QVERIFY(metaTarget->hasCustomIcon(group2Icon)); + QVERIFY(metaTarget->hasCustomIcon(entry1IconOld)); + QVERIFY(metaTarget->hasCustomIcon(entry1IconNew)); QCOMPARE(metaTarget->customIcon(group1Icon).pixel(0, 0), qRgb(1, 2, 3)); QCOMPARE(metaTarget->customIcon(group2Icon).pixel(0, 0), qRgb(4, 5, 6)); diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp index 30f744e2..cf0aa414 100644 --- a/tests/TestKeePass1Reader.cpp +++ b/tests/TestKeePass1Reader.cpp @@ -112,7 +112,7 @@ void TestKeePass1Reader::testMasterKey() void TestKeePass1Reader::testCustomIcons() { - QCOMPARE(m_db->metadata()->customIcons().size(), 1); + QCOMPARE(m_db->metadata()->customIconsOrder().size(), 1); Entry* entry = m_db->rootGroup()->children().at(1)->entries().at(0); diff --git a/tests/TestKeePass2Format.cpp b/tests/TestKeePass2Format.cpp index df414f5c..f58d0a88 100644 --- a/tests/TestKeePass2Format.cpp +++ b/tests/TestKeePass2Format.cpp @@ -110,9 +110,9 @@ void TestKeePass2Format::testXmlMetadata() void TestKeePass2Format::testXmlCustomIcons() { - QCOMPARE(m_xmlDb->metadata()->customIcons().size(), 1); + QCOMPARE(m_xmlDb->metadata()->customIconsOrder().size(), 1); QUuid uuid = QUuid::fromRfc4122(QByteArray::fromBase64("++vyI+daLk6omox4a6kQGA==")); - QVERIFY(m_xmlDb->metadata()->customIcons().contains(uuid)); + QVERIFY(m_xmlDb->metadata()->hasCustomIcon(uuid)); QImage icon = m_xmlDb->metadata()->customIcon(uuid); QCOMPARE(icon.width(), 16); QCOMPARE(icon.height(), 16); diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp index 4f96d3e6..7c9c3cc6 100644 --- a/tests/TestMerge.cpp +++ b/tests/TestMerge.cpp @@ -1117,14 +1117,14 @@ void TestMerge::testMergeCustomIcons() dbSource->metadata()->addCustomIcon(customIconId, customIcon); // Sanity check. - QVERIFY(dbSource->metadata()->containsCustomIcon(customIconId)); + QVERIFY(dbSource->metadata()->hasCustomIcon(customIconId)); m_clock->advanceSecond(1); Merger merger(dbSource.data(), dbDestination.data()); merger.merge(); - QVERIFY(dbDestination->metadata()->containsCustomIcon(customIconId)); + QVERIFY(dbDestination->metadata()->hasCustomIcon(customIconId)); } /** @@ -1143,16 +1143,16 @@ void TestMerge::testMergeDuplicateCustomIcons() dbSource->metadata()->addCustomIcon(customIconId, customIcon); dbDestination->metadata()->addCustomIcon(customIconId, customIcon); // Sanity check. - QVERIFY(dbSource->metadata()->containsCustomIcon(customIconId)); - QVERIFY(dbDestination->metadata()->containsCustomIcon(customIconId)); + QVERIFY(dbSource->metadata()->hasCustomIcon(customIconId)); + QVERIFY(dbDestination->metadata()->hasCustomIcon(customIconId)); m_clock->advanceSecond(1); Merger merger(dbSource.data(), dbDestination.data()); merger.merge(); - QVERIFY(dbDestination->metadata()->containsCustomIcon(customIconId)); - QCOMPARE(dbDestination->metadata()->customIcons().count(), 1); + QVERIFY(dbDestination->metadata()->hasCustomIcon(customIconId)); + QCOMPARE(dbDestination->metadata()->customIconsOrder().count(), 1); } void TestMerge::testMetadata() diff --git a/tests/gui/TestGuiPixmaps.cpp b/tests/gui/TestGuiPixmaps.cpp index c5754ba8..a6644f54 100644 --- a/tests/gui/TestGuiPixmaps.cpp +++ b/tests/gui/TestGuiPixmaps.cpp @@ -28,117 +28,55 @@ void TestGuiPixmaps::initTestCase() void TestGuiPixmaps::testDatabaseIcons() { - QImage image; - QPixmap pixmap; - QPixmap pixmapCached; - - image = databaseIcons()->icon(0); - pixmap = databaseIcons()->iconPixmap(0); - compareImages(pixmap, image); // check if the cache works correctly - pixmapCached = databaseIcons()->iconPixmap(0); - compareImages(pixmapCached, image); - QCOMPARE(pixmapCached.cacheKey(), pixmap.cacheKey()); - - pixmap = databaseIcons()->iconPixmap(1); - image = databaseIcons()->icon(1); - compareImages(pixmap, image); - pixmapCached = databaseIcons()->iconPixmap(1); - compareImages(pixmapCached, image); + auto pixmap = databaseIcons()->icon(0); + auto pixmapCached = databaseIcons()->icon(0); QCOMPARE(pixmapCached.cacheKey(), pixmap.cacheKey()); } void TestGuiPixmaps::testEntryIcons() { - Database* db = new Database(); + QScopedPointer db(new Database()); Entry* entry = new Entry(); entry->setGroup(db->rootGroup()); - QImage icon; - QImage image; - QPixmap pixmap; - QPixmap pixmapCached1; - QPixmap pixmapCached2; - - icon = databaseIcons()->icon(10); + // Test setting standard icon entry->setIcon(10); - image = entry->icon(); - pixmap = entry->iconPixmap(); - QCOMPARE(image, icon); - compareImages(pixmap, icon); - pixmapCached1 = entry->iconPixmap(); - pixmapCached2 = databaseIcons()->iconPixmap(10); - compareImages(pixmapCached1, icon); - compareImages(pixmapCached2, icon); - QCOMPARE(pixmapCached1.cacheKey(), pixmap.cacheKey()); - QCOMPARE(pixmapCached2.cacheKey(), pixmap.cacheKey()); + auto pixmap = entry->iconPixmap(); + QCOMPARE(pixmap.cacheKey(), databaseIcons()->icon(10).cacheKey()); + // Test setting custom icon QUuid iconUuid = QUuid::createUuid(); - icon = QImage(2, 1, QImage::Format_RGB32); + QImage icon(2, 1, QImage::Format_RGB32); icon.setPixel(0, 0, qRgb(0, 0, 0)); icon.setPixel(1, 0, qRgb(0, 0, 50)); db->metadata()->addCustomIcon(iconUuid, icon); + entry->setIcon(iconUuid); - - image = entry->icon(); pixmap = entry->iconPixmap(); - - QCOMPARE(image, icon); - compareImages(pixmap, icon); - pixmapCached1 = entry->iconPixmap(); - compareImages(pixmapCached1, icon); - QCOMPARE(pixmapCached1.cacheKey(), pixmap.cacheKey()); - - delete db; + QCOMPARE(pixmap.cacheKey(), db->metadata()->customIconPixmap(iconUuid).cacheKey()); } void TestGuiPixmaps::testGroupIcons() { - Database* db = new Database(); + QScopedPointer db(new Database()); Group* group = db->rootGroup(); - QImage icon; - QImage image; - QPixmap pixmap; - QPixmap pixmapCached1; - QPixmap pixmapCached2; - - icon = databaseIcons()->icon(10); + // Test setting standard icon group->setIcon(10); - image = group->icon(); - pixmap = group->iconPixmap(); - QCOMPARE(image, icon); - compareImages(pixmap, icon); - pixmapCached1 = group->iconPixmap(); - pixmapCached2 = databaseIcons()->iconPixmap(10); - compareImages(pixmapCached1, icon); - compareImages(pixmapCached2, icon); - QCOMPARE(pixmapCached1.cacheKey(), pixmap.cacheKey()); - QCOMPARE(pixmapCached2.cacheKey(), pixmap.cacheKey()); + auto pixmap = group->iconPixmap(); + QCOMPARE(pixmap.cacheKey(), databaseIcons()->icon(10).cacheKey()); + // Test setting custom icon QUuid iconUuid = QUuid::createUuid(); - icon = QImage(2, 1, QImage::Format_RGB32); + QImage icon(2, 1, QImage::Format_RGB32); icon.setPixel(0, 0, qRgb(0, 0, 0)); icon.setPixel(1, 0, qRgb(0, 0, 50)); db->metadata()->addCustomIcon(iconUuid, icon); + group->setIcon(iconUuid); - - image = group->icon(); pixmap = group->iconPixmap(); - - QCOMPARE(image, icon); - compareImages(pixmap, icon); - pixmapCached1 = group->iconPixmap(); - compareImages(pixmapCached1, icon); - QCOMPARE(pixmapCached1.cacheKey(), pixmap.cacheKey()); - - delete db; -} - -void TestGuiPixmaps::compareImages(const QPixmap& pixmap, const QImage& image) -{ - QCOMPARE(pixmap.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied), - image.convertToFormat(QImage::Format_ARGB32_Premultiplied)); + QCOMPARE(pixmap.cacheKey(), db->metadata()->customIconPixmap(iconUuid).cacheKey()); } QTEST_MAIN(TestGuiPixmaps) diff --git a/tests/gui/TestGuiPixmaps.h b/tests/gui/TestGuiPixmaps.h index 6e649c0f..da55643a 100644 --- a/tests/gui/TestGuiPixmaps.h +++ b/tests/gui/TestGuiPixmaps.h @@ -31,9 +31,6 @@ private slots: void testDatabaseIcons(); void testEntryIcons(); void testGroupIcons(); - -private: - void compareImages(const QPixmap& pixmap, const QImage& image); }; #endif // KEEPASSX_TESTGUIPIXMAPS_H diff --git a/utils/makeicons.sh b/utils/makeappicons.sh similarity index 100% rename from utils/makeicons.sh rename to utils/makeappicons.sh diff --git a/utils/makedbicons.sh b/utils/makedbicons.sh new file mode 100644 index 00000000..2e49b911 --- /dev/null +++ b/utils/makedbicons.sh @@ -0,0 +1,123 @@ +#!/bin/bash +# Assemble database icons from the icons8 collection +# by Wolfram Rösler 2020-04-30 + +NC='\033[0m' +RED='\033[0;31m' +YELLOW='\033[0;33m' + +# Check parameters +if [[ $# != 1 ]];then + echo "Usage: $0 ICONS8" + echo "ICONS8 is the directory containing the Icons8 flat-color-icons repository" + echo "(git clone https://github.com/icons8/flat-color-icons)". + exit +fi + +# Check source directory +SRCDIR="$1" +if [ ! -d "$SRCDIR" ];then + echo -e "${RED}icons8 directory doesn't exist: ${SRCDIR}${NC}" + exit 1 +fi + +# Check destination directory +DSTDIR=share/icons/database +if [ ! -d "$DSTDIR" ];then + echo -e "${RED}Please invoke this script from the KeePassXC source root directory.${NC}" + exit 1 +fi + +# Copy one icon from the icons8 collection. +# +# Usage: copy I8NAME Cnn +# I8NAME is the file name (without extender and without +# the "icon8-" prefix) in the icons8 directory. +# Cnn is C plus the number of the database icon. +# +# Example: copy key C00 +copy() { + # The source file is: + SRC="${SRCDIR}/svg/${1}.svg" + if [ ! -f "$SRC" ];then + echo -e "${RED}Cannot find source icon for ${2} (${SRC})${NC}" + return + fi + + # Copy the source file to the destination, keeping + # the source file's extension + DST="$DSTDIR/${2}.svg" + cp $SRC $DST + echo "Copied icon for ${1} to ${DST}" +} + +# Now do the actual work +#copy key C00_Password # Derivative work from key +copy globe C01_Package_Network +copy high_priority C02_MessageBox_Warning +copy data_protection C03_Server # No exact match +copy survey C04_Klipper +copy businessman C05_Edu_Languages +copy services C06_KCMDF +#copy notepad C07_Kate # Provided by paomedia/small-n-flat +copy external C08_Socket +copy business_contact C09_Identity +copy address_book C10_Kontact +copy old_time_camera C11_Camera +copy entering_heaven_alive C12_IRKickFlash # No exact match +#copy keys-holder C13_KGPG_Key3 # Derivative work from key +copy crystal_oscillator C14_Laptop_Power +copy video_projector C15_Scanner +copy bookmark C16_Mozilla_Firebird +#copy cd C17_CDROM_Unmount # Provided by paomedia/small-n-flat +#copy monitor C18_Display # Provided by paomedia/small-n-flat +#copy feedback C19_Mail_Generic # Derivative work from feedback +copy settings C20_Misc +copy inspection C21_KOrganizer +copy file C22_ASCII +copy template C23_Icons +copy flash_on C24_Connect_Established +copy safe C25_Folder_Mail # No exact match +#copy save C26_FileSave # Provided by paomedia/small-n-flat +#copy cloud-storage C27_NFS_Unmount # Provided by paomedia/small-n-flat +copy film_reel C28_QuickTime +#copy C29_KGPG_Term # Derivative work from command_line and key +#copy command_line C30_Konsole # Derivative work from command_line +copy print C31_FilePrint +copy org_unit C32_FSView +copy cloth C33_Run +copy support C34_Configure +#copy vpn C35_KRFB # Derivative work from paomedia/small-n-flat +#copy archive-folder C36_Ark # Derivative work from folder +#copy percentage C37_KPercentage # Original work +#copy windows-client C38_Samba_Unmount # Derivative work from paomedia/small-n-flat +copy clock C39_History +copy search C40_Mail_Find +copy landscape C41_VectorGfx +copy electronics C42_KCMMemory +copy empty_trash C43_EditTrash +#copy C44_KNotes # Provided by paomedia/small-n-flat +#copy C45_Cancel # Original work +#copy C46_Help # Original work +copy package C47_KPackage +copy folder C48_Folder +copy opened_folder C49_Folder_Blue_Open +copy data_encryption C50_Folder_Tar +#copy unlock C51_Decrypted # Provided by paomedia/small-n-flat +#copy lock C52_Encrypted # Provided by paomedia/small-n-flat +#copy C53_Apply # Original work +#copy pencil C54_Signature # Provided by paomedia/small-n-flat +copy image_file C55_Thumbnail +copy contacts C56_KAddressBook +copy data_sheet C57_View_Text +copy podium_with_speaker C58_KPGP # No exact match +#copy hammer C59_Package_Development # Provided by paomedia/small-n-flat +copy home C60_KFM_Home +#copy C61_Services # Original work +copy linux C62_Tux +copy android_os C63_Feather +#copy C64_Apple # Derivative work created from simple-icons apple.svg +copy wikipedia C65_W +#copy currency_exchange C66_Money # Provided by paomedia/small-n-flat +copy diploma_1 C67_Certificate +copy smartphone_tablet C68_Blackberry